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

2026-09-03 · 原文发布日

用Redis给WhatsApp机器人加防抖合并回复

这是付费模板,解决聊天机器人对用户连发消息逐条秒回的问题。WhatsApp新消息触发后,先用Redis按消息ID去重,把同一发件人的文本追加进缓冲区并记录最后时间戳,等待约3秒;期间若有更新消息到达就放弃本次,否则加Redis锁防止并发回复,把缓冲的多条消息合并成一段交给Google Gemini驱动的AI Agent生成一次回复,再释放锁。缓冲TTL、锁时长和等待秒数都可调。

原文要点

这是iamvaar发布的付费n8n模板,处理WhatsApp机器人对连发消息逐条秒回的问题。流程由WhatsApp触发器开始,提取发件人、消息ID、类型、文本和时间戳;非文本消息直接回复提示用户改用文字。文本消息先用Redis按消息ID去重,已处理则停止;再把文本追加到该发件人的Redis缓冲并写入最后消息时间戳,等待3秒;等待后重新读时间戳,若有更新消息到达则放弃本次。确认自己仍是最新消息后,设置30秒的按发件人Redis锁,合并缓冲文本并清空,交给Google Gemini驱动的AI Agent加结构化输出解析器生成回复,发送后释放锁。缓冲与时间戳TTL默认300秒,防抖等待默认3秒,均可调。

这次做成什么

照着搭一个带防抖合并的WhatsApp AI回复流程,本站用可复现的模拟练习替代原付费模板文件,帮你在购买前先跑通防抖逻辑。

准备什么

  • 一个可访问的Redis实例(本地Docker或云Redis均可),以及n8n实例
  • WhatsApp Cloud API测试号凭据,或先用本站模拟触发数据练习
  • Google Gemini API密钥(PaLM凭据),用于AI Agent节点

具体怎么做

  1. 先在本地验证防抖逻辑

    打开Redis CLI,模拟三次写入:执行 SET msg:wamid.001 done EX 300(去重键)、RPUSH buffer:8613800138000 "第一条文字"、SET lastmsg:8613800138000 1710000003 EX 300。再对第二条消息重复追加。这样你能在不接WhatsApp的情况下理解缓冲结构。

  2. 搭触发与去重分支

    在n8n新建工作流,放WhatsApp Trigger节点并绑定Cloud API凭据。接一个IF节点判断消息类型是否为text,非文本走WhatsApp Send回复"请发送文字消息"。文本分支后加Redis节点查 dedup:{{$json.messages[0].id}},命中即Stop。

  3. 缓冲、等待与时间戳复核

    加Redis节点RPUSH缓冲键并SET最后时间戳(TTL 300秒),接Wait节点设3秒。Wait后再读一次时间戳,用IF比较:若Redis里的时间戳大于本条消息时间戳,说明等待期间来了新消息,直接结束本次执行。

  4. 加锁、合并、调用AI、解锁

    用Redis SET lock:{{sender}} 1 NX EX 30实现短锁,失败则结束。读缓冲LRANGE合并成一段文本,DEL缓冲键,接AI Agent节点(Gemini Chat Model,模型名按原模板为models/gemini-3.1-flash-lite,可换你偏好的型号),用结构化输出解析器约束回复,发回WhatsApp后DEL锁键。

可直接复制的材料

模拟练习输入数据(替代真实WhatsApp回调)

本站独立编写的合成Webhook体,字段名按WhatsApp Cloud API常见结构,测试时可粘到n8n手动触发器,from为虚构号码

{
  "messages": [
    {
      "id": "wamid.HBgMTEST001",
      "from": "8613800138000",
      "type": "text",
      "text": { "body": "你好,我想问一下" },
      "timestamp": "1710000000"
    }
  ]
}

Redis防抖关键命令对照

本站按原文描述逻辑整理的命令清单,键名前缀为本站自拟,TTL 300/锁30秒来自原文

SET dedup:wamid.HBgMTEST001 done EX 300
RPUSH buffer:8613800138000 "你好,我想问一下"
SET lastmsg:8613800138000 1710000000 EX 300
SET lock:8613800138000 busy NX EX 30
LRANGE buffer:8613800138000 0 -1
DEL buffer:8613800138000
DEL lock:8613800138000

AI Agent系统提示词(合并消息回复)

本站独立撰写,{{ $json.combinedText }}需替换为你合并节点的输出变量

你是一名WhatsApp客服助手。用户可能在几秒内连发多条消息,我给你的内容已经把同一用户的多条消息按顺序合并,每行一条。请把整段视为一次完整的提问,只回复一次,不要逐条分别回复,不要重复表达同一个意思。语气自然简短,像真人聊天,不超过120字。如果内容不完整(例如话说到一半),礼貌请用户补充。\n合并后的用户消息:\n{{ $json.combinedText }}

输入与输出示例

本站虚构演示,AI回复为示例文案,非实际调用Gemini的结果

输入

同一发件人8613800138000在2秒内连发三条:"你好,我想问一下"、"你们的退货政策"、"支持七天无理由吗",消息ID分别为wamid.T001、T002、T003

对应输出

前两次执行在时间戳复核时发现有更新消息而自动放弃;第三次执行通过复核并加锁,合并文本为"你好,我想问一下\n你们的退货政策\n支持七天无理由吗",AI Agent只回复一次:"你好!我们支持七天无理由退货,商品保持完好即可申请,需要我发你退货流程吗?"随后释放锁,用户全程只收到这一条回复。

做完检查这些

  • 同一发件人3秒内连发3条消息,用户最终只收到1条AI回复,而不是3条
  • 重复投递同一消息ID的Webhook时,第二次执行在去重处直接停止,不产生新回复
  • 执行期间用redis-cli能看到buffer键被写入、回复后被清空,lock键30秒内自动过期
  • 非文本消息(如图片)触发时,用户收到提示发送文字的固定回复

容易卡住的地方

  • 原模板是付费商品,本站只有文字方案与模拟数据,需购买原模板或在n8n中自行重建全部节点
  • Wait 3秒内如果新消息到达但旧执行已先抢到锁,时序可能错乱,锁的NX语义必须配IF分支判断
  • Redis不可达时去重、缓冲、锁全部失效,机器人会退回逐条秒回的状态
  • 原文称防抖等待默认3秒、锁30秒,这是作者设定值,并发量大时需自己压测调整

原文与作者资料 ↗

本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。

原文标题
Debounce and buffer WhatsApp AI replies with Redis and Google Gemini
原作者
iamvaar
原始发布日期
2026-09-03T11:18:38.915Z
来源
https://n8n.io/workflows/19116