2026-09-29 · 原文发布日
n8n模板:带记忆的WhatsApp客服机器人
这个n8n工作流接收Meta WhatsApp的webhook事件,过滤送达已读回执后只处理真实消息,从Google Sheets按手机号加载最近N轮对话记录并写入新消息,再决定走哪条回复路径:用户要求转人工时停止机器人回复并经Gmail通知同事、无文本内容时回复暂不支持该类型、其余情况由OpenAI基于配置的知识库和聊天记录生成简短回答,经Meta Graph API发回并记录日志。人工接管是“粘性”的,该联系人之后不再由机器人应答。搭建需配置Meta应用、Sheets会话表和转人工关键词。
原文要点
Thomas Abraham在n8n发布的免费模板:接收Meta WhatsApp的POST webhook,过滤送达/已读回执后只处理真实消息,从Google Sheets按手机号加载最近N轮对话并写入新消息,再分三条路径:命中转人工关键词时停止机器人并经Gmail发一封通知、无文本时回复暂不支持该类型、其余由OpenAI仅用配置知识库和聊天记录生成简短回复,经Meta Graph API发回并写日志。人工接管是粘性的,该联系人之后不再由机器人应答。
这次做成什么
按模板结构手工搭建一个WhatsApp客服机器人:webhook收消息→Sheets存历史→三路分支回复→Graph API回发,并用一条测试webhook数据演练转人工的粘性逻辑。
准备什么
- 一个可公网访问的n8n实例(生产webhook URL供Meta回调)
- Meta开发者账号、已配置WhatsApp Business应用和测试号码
- Google Sheets凭据和一张Conversations表
- OpenAI API凭据与Gmail OAuth2凭据
具体怎么做
建会话表与Meta凭据
在Google Sheets建名为Conversations的工作表,表头依次为Timestamp、Phone、Name、Direction、Message、Status。在n8n新建HTTP Header Auth凭据,Name填Authorization,Value填Bearer加空格再加Meta访问令牌,后续所有Graph API请求共用。
接收并过滤webhook
用Webhook节点(POST)接收Meta事件,在Code节点解析出手机号、消息文本和消息类型;用IF节点过滤:只有存在真实消息文本或媒体类型的事件才继续,送达、已读回执直接丢弃(可返回200空响应)。
读写对话历史
用Google Sheets节点按Phone筛选该号码的历史行,在Code节点取最近N轮(如10轮)拼成对话数组;同时追加一行新消息,Direction填in,Status先填bot。
三路分支
IF节点判断:消息文本命中转人工关键词(如"人工""客服")→走人工分支:把该号码Status改为human,经Gmail给同事发一封含消息和近期历史的通知,之后不再自动回复;消息无文本→回复"暂不支持此消息类型";其余→交给AI Agent,System Prompt限定只能使用知识库文本和对话历史回答。
回发与粘性拦截
所有回复经HTTP Request调Meta Graph API的消息端点(用phone_number_id,配置项中填写)发回,并追加Direction为out的日志行。在每次处理前先查Sheets:若该Phone已有Status为human的行,直接跳过机器人逻辑,实现粘性人工接管。
可直接复制的材料
机器人回复生成提示词(独立撰写)
本站独立撰写,粘贴到AI Agent节点,{{}}处用n8n表达式引用变量;知识库文本需自行填写。
你是{{店铺名}}的WhatsApp客服助手。规则:
1. 只能使用下面知识库中的信息回答,知识库没有的内容就回复"这个问题我帮您转给同事确认",不要编造价格、时效或政策。
2. 回答简短口语化,最多三句话,适合手机阅读。
3. 结合对话历史保持上下文,不要重复问候。
4. 如果用户明确要求找人工,只回复"好的,已为您转接人工客服,请稍候"。
知识库:
{{知识库文本}}
对话历史:
{{最近N轮对话}}
用户最新消息:
{{消息文本}}粘性状态与分支的字段映射
本站整理的配置示意;phone_number_id与令牌需在Meta后台获取,切勿提交真实令牌到公开仓库。
{
"sheets": {
"spreadsheet": "Conversations表",
"columns": {
"Timestamp": "ISO时间,如2026-10-01T09:30:00Z",
"Phone": "E.164格式手机号,如8613800138000",
"Name": "WhatsApp显示名,可为空",
"Direction": "in=用户发来, out=机器人/人工发出",
"Message": "消息纯文本",
"Status": "bot=机器人应答中, human=人工接管(粘性)"
}
},
"handoffKeywords": ["人工", "转人工", "客服", "human"],
"historyTurns": 10,
"metaConfig": {
"phoneNumberId": "替换为你的Meta phone_number_id",
"credential": "HTTP Header Auth: Authorization Bearer <token>"
}
}测试webhook数据
按Meta webhook结构合成的测试负载,可POST到n8n测试URL演练全流程,号码为虚构。
{
"entry": [{
"changes": [{
"value": {
"metadata": {"phone_number_id": "1234567890"},
"contacts": [{"profile": {"name": "测试用户"}, "wa_id": "8613800138000"}],
"messages": [{"from": "8613800138000", "id": "wamid.TEST001", "timestamp": "1759200000", "type": "text", "text": {"body": "你们支持七天无理由退货吗"}}]
}
}]
}]
}输入与输出示例
本站虚构演示,未实际调用Meta/OpenAI;回复文案取决于你填写的知识库。
输入
测试号码8613800138000先发送"你们支持七天无理由退货吗",机器人应答;随后发送"我要找人工客服"。对应输出
第一条:查Sheets无human记录→走OpenAI分支→回复"亲,我们支持七天无理由退货,商品需保持完好,退回运费由我们承担"。第二条:命中关键词"人工"→追加Status=human行→Gmail向同事发出通知,机器人回复"好的,已为您转接人工客服,请稍候"。之后该号码再发"在吗",因查到human记录,工作流直接跳过,不再自动回复。做完检查这些
- POST送达回执类事件时工作流不产生任何回复和日志行
- Conversations表中每条收发消息各有一行且Direction正确
- 发送含"人工"的消息后,Gmail收到一封含近期历史的通知且该号码Status为human
- 同一号码再次发消息时机器人保持沉默,验证粘性接管生效
容易卡住的地方
- Meta webhook需要先通过验证订阅,本地无公网地址的n8n无法直接接收,需隧道或云端部署
- Meta测试号码只能给已添加的测试收件人发消息,上线前需完成应用审核
- OpenAI令牌和Meta令牌都是长期敏感凭据,泄露会导致盗用,应放n8n凭据而非写死在节点里
- Sheets按手机号匹配时注意国际格式统一,带不带+号会导致历史查不到
本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。
- 原文标题
- Run a WhatsApp support agent with memory using OpenAI, Google Sheets and Gmail
- 原作者
- Thomas Abraham
- 原始发布日期
- 2026-09-29T11:00:30.300Z
- 来源
- https://n8n.io/workflows/20147