自动回复是微信机器人最基础也最高频的需求。看似简单的"收到消息→回一句",真正上生产要解决三个工程问题:重复回复、回调阻塞、状态丢失。下面用Webhook+异步处理的架构给出完整闭环。

参考API文档
WTAPI框架开发文档weiti.apifox.cn 为准。

一、闭环的四个环节

  1. 接收:Webhook收到消息回调
  2. 去重:判断这条消息是否已处理过
  3. 匹配:根据关键词或规则生成回复内容
  4. 回复:调用发送接口回消息

二、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。三层防线确保同一条消息只回一次:

  1. 回调入口去重:received:{msg_id} 防止回调重投导致重复入队
  2. 消费端去重:done:{msg_id} 防止消息重复消费
  3. 发送端幂等键:给每次发送加唯一键,防止发送接口重试导致重发

五、匹配策略的演进

关键词匹配是最基础的,后续可以演进为:

  • 正则匹配:处理"查订单123"这类带参数的指令
  • 意图分类:用NLP模型识别用户意图
  • LLM对话:接入大模型做开放式对话(如ChatGPT、文心一言、自研NLP)

无论哪种匹配策略,都要包在统一的回复函数里,业务代码不用关心匹配实现。

六、异常兜底

匹配不到关键词时,给一个兜底回复(如"没听懂,回复帮助查看指令"),不要静默不回——用户会以为机器人坏了。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐