自己搭一个微信自动回复机器人:Webhook+回查的工程闭环
·
自动回复是微信机器人最基础也最高频的需求。看似简单的"收到消息→回一句",真正上生产要解决三个工程问题:重复回复、回调阻塞、状态丢失。下面用Webhook+异步处理的架构给出完整闭环。
参考API文档
WTAPI框架开发文档weiti.apifox.cn 为准。
一、闭环的四个环节
- 接收:Webhook收到消息回调
- 去重:判断这条消息是否已处理过
- 匹配:根据关键词或规则生成回复内容
- 回复:调用发送接口回消息
二、Webhook回调处理
回调接口必须快,不能在里面做耗时操作。只做三件事:验签、落库、投递队列。
from flask import Flask, request
import redis
app = Flask(__name__)
r = redis.Redis()
@app.route("/webhook", methods=["POST"])
def webhook():
data = request.json
msg_id = data.get("msgId") # 消息唯一ID,字段以官方文档为准
# 1. 幂等去重:已处理过的消息直接返回成功
if r.get(f"processed:{msg_id}"):
return {"code": "1000"}
# 2. 落本地消息表(伪代码,实际写数据库)
# save_message(data)
# 3. 投递到消息队列,异步处理
r.lpush("msg_queue", str(data))
# 4. 标记为已接收
r.setex(f"received:{msg_id}", 3600, "1")
return {"code": "1000"}
三、异步消费与回复
Worker从队列取消息,做匹配和回复:
import json
import requests
BASE = "https://wx.chuapi.com"
HEADERS = {
"X-finder-TOKEN": "<token>",
"Authorization": "Bearer <bearer>",
"Content-Type": "application/json",
}
KEYWORDS = {
"你好": "你好呀,有什么可以帮你?",
"价格": "请查看官网了解最新价格",
"帮助": "回复1查订单,回复2转人工",
}
def process_message():
while True:
_, raw = r.brpop("msg_queue")
data = json.loads(raw)
msg_id = data["msgId"]
content = data.get("content", "").strip()
from_wxid = data.get("fromWxid")
instance_id = data.get("instanceId")
# 幂等:处理完成后标记
if r.get(f"done:{msg_id}"):
continue
reply = KEYWORDS.get(content)
if reply:
requests.post(
f"{BASE}/finder/v2/api/postText",
headers=HEADERS,
json={
"appId": "<appId>",
"instanceId": instance_id,
"toWxid": from_wxid,
"content": reply,
},
timeout=10,
)
r.setex(f"done:{msg_id}", 86400, "1")
四、幂等的三层防线
重复回复是自动回复机器人最常见的bug。三层防线确保同一条消息只回一次:
- 回调入口去重:
received:{msg_id}防止回调重投导致重复入队 - 消费端去重:
done:{msg_id}防止消息重复消费 - 发送端幂等键:给每次发送加唯一键,防止发送接口重试导致重发
五、匹配策略的演进
关键词匹配是最基础的,后续可以演进为:
- 正则匹配:处理"查订单123"这类带参数的指令
- 意图分类:用NLP模型识别用户意图
- LLM对话:接入大模型做开放式对话(如ChatGPT、文心一言、自研NLP)
无论哪种匹配策略,都要包在统一的回复函数里,业务代码不用关心匹配实现。
六、异常兜底
匹配不到关键词时,给一个兜底回复(如"没听懂,回复帮助查看指令"),不要静默不回——用户会以为机器人坏了。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)