文章摘要
还在为重复回答客户问题而头疼?想要一个不知疲倦的数字员工?今天教你用两个免费工具——n8n和飞书,零代码搭建专属智能客服! 无论你是创业老板还是运营小白,这篇教程都能让你轻松上手,彻底告别重复劳动! 开始前,我们需要准备: 准备好了?开始”造”机器人! 在”凭证与基础信息”页面,记下: 这两个是连接n8n的”钥匙”,务必保存好! 在”应用功能” → “机器人”中启用,然后在”权限管理”开通: 在”事件订阅”页面,先留着”请求地址配置”空白,等下一步生成URL后再填。
登录n8n,开始搭建核心流程:接收消息 → 智能处理 → 回复消息 步骤1:创建Webhook节点 步骤2:配置Webhook节点 步骤3:获取Webhook URL 步骤4:在飞书后台配置 步骤5:验证连接 网络访问配置: 添加HTTP Request节点: 注意:替换为真实的APP_ID和APP_SECRET,Token有效期2小时。
准备工作:3样东西搞定
第一步:创建飞书”数字员工”
1. 创建飞书应用
2. 获取关键信息
3. 开通机器人权限
4. 配置事件订阅
第二步:搭建n8n智能大脑
1. 添加Webhook节点(接收飞书消息)
/feishu-bot
)
https://yourdomain.com/webhook-test/uuid
)
ngrok http 5678
2. 添加Token获取节点
HTTP Request
节点,连接到Webhook
节点https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal
{
"app_id": "你的APP_ID",
"app_secret": "你的APP_SECRET"
}
添加Code节点: 添加HTTP Request节点: 重要提示: 成功!你的智能客服已经上线了! Q: 机器人不回复怎么办? Q: 如何让机器人更智能? Q: 能处理图片消息吗? Q: 免费版有限制吗?
3. 添加智能问答节点
Code
节点,连接到Token获取节点Run Once for All Items
(对所有项目运行一次)// FAQ知识库 - 使用关键词匹配提高准确率
const faq = [
{
keywords: ["工作时间", "上班时间", "营业时间", "几点上班", "几点开门", "工作日", "上班", "营业"],
answer: "周一至周五,9:00-18:00"
},
{
keywords: ["联系方式", "电话", "客服", "联系", "咨询", "怎么联系", "联系电话"],
answer: "客服电话:400-123-4567"
},
{
keywords: ["产品价格", "价格", "多少钱", "费用", "收费", "报价", "成本"],
answer: "请访问官网查看最新价格"
},
{
keywords: ["技术支持", "技术", "支持", "帮助", "问题", "故障", "bug", "技术问题"],
answer: "请发送邮件至 tech@company.com"
},
{
keywords: ["退换货", "退货", "换货", "退款", "返回", "不满意", "退", "换"],
answer: "支持7天无理由退换货,详情请查看用户协议"
}
];
// 获取输入数据 - 明确数据来源
// 从Token节点获取access_token
const tokenData = $input.first().json;
// 从Webhook节点获取原始消息数据
const webhookData = $('Webhook').first().json.body;
// 调试信息:打印数据来源和结构
console.log('Token节点数据:', JSON.stringify(tokenData, null, 2));
console.log('Webhook原始数据:', JSON.stringify(webhookData, null, 2));
console.log('事件数据:', JSON.stringify(webhookData.event, null, 2));
// 提取用户问题并匹配回答
// 注意:content可能是JSON字符串,需要先解析
let userQuestion = "";
try {
const content = webhookData.event?.message?.content;
if (typeof content === 'string') {
// 如果content是字符串,尝试解析JSON
const parsedContent = JSON.parse(content);
userQuestion = parsedContent?.text?.trim() || "";
} elseif (content?.text) {
// 如果content已经是对象,直接访问text
userQuestion = content.text.trim() || "";
}
} catch (error) {
console.log('解析content时出错:', error);
userQuestion = "";
}
let reply = "抱歉,暂时无法回答您的问题,正在为您转接人工客服";
// 提取chat_id,尝试多种可能的路径
const chatId = webhookData.event?.message?.chat_id ||
webhookData.event?.message?.message?.chat_id ||
webhookData.event?.chat_id;
console.log('提取的chat_id:', chatId);
console.log('用户问题:', userQuestion);
// 遍历FAQ数组,使用关键词匹配
for (const faqItem of faq) {
// 检查用户问题是否包含任何关键词
const matched = faqItem.keywords.some(keyword =>
userQuestion.toLowerCase().includes(keyword.toLowerCase())
);
if (matched) {
reply = faqItem.answer;
console.log(`匹配到FAQ: ${faqItem.keywords[0]}, 回复: ${reply}`);
break;
}
}
// 验证必要参数
if (!chatId) {
console.error('错误: 无法获取chat_id');
thrownewError('无法获取chat_id,请检查飞书webhook数据结构');
}
if (!tokenData.tenant_access_token) {
console.error('错误: 无法获取access_token');
thrownewError('无法获取access_token,请检查Token获取节点');
}
// 返回处理结果
const result = {
reply: reply,
chatId: chatId,
token: tokenData.tenant_access_token
};
console.log('返回结果:', JSON.stringify(result, null, 2));
return result;
4. 添加回复节点
HTTP Request
节点,连接到Code节点https://open.feishu.cn/open-apis/im/v1/messages?receive_id_type=chat_id
Authorization
Bearer {{ $json.token }}
{
"receive_id": "{{ $json.chatId }}",
"msg_type": "text",
"content": "{"text":"{{ $json.reply }}"}"
}
第三步:上线测试
FAQ 常见问题
A: 检查n8n工作流是否激活,飞书权限是否开通完整。
A: 将Code节点替换为调用ChatGPT或其他AI模型的API。
A: 可以,需要在飞书权限中开通相应的多媒体消息权限。
A: n8n免费版每月有5000次执行限制,一般小团队够用。