AI PLAY玩法更新持续收录
← 回到更新流

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凭据

具体怎么做

  1. 建会话表与Meta凭据

    在Google Sheets建名为Conversations的工作表,表头依次为Timestamp、Phone、Name、Direction、Message、Status。在n8n新建HTTP Header Auth凭据,Name填Authorization,Value填Bearer加空格再加Meta访问令牌,后续所有Graph API请求共用。

  2. 接收并过滤webhook

    用Webhook节点(POST)接收Meta事件,在Code节点解析出手机号、消息文本和消息类型;用IF节点过滤:只有存在真实消息文本或媒体类型的事件才继续,送达、已读回执直接丢弃(可返回200空响应)。

  3. 读写对话历史

    用Google Sheets节点按Phone筛选该号码的历史行,在Code节点取最近N轮(如10轮)拼成对话数组;同时追加一行新消息,Direction填in,Status先填bot。

  4. 三路分支

    IF节点判断:消息文本命中转人工关键词(如"人工""客服")→走人工分支:把该号码Status改为human,经Gmail给同事发一封含消息和近期历史的通知,之后不再自动回复;消息无文本→回复"暂不支持此消息类型";其余→交给AI Agent,System Prompt限定只能使用知识库文本和对话历史回答。

  5. 回发与粘性拦截

    所有回复经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