Webhook 驱动:企业微信消息接收与自动回复

只调 sendText 是单向推送。AI 客服、关键词应答、工单采集都要 收消息 → 处理 → 再发。RPA 连接器在控制台配置 Webhook 后,执行节点收到的好友消息、群消息会 POST 到你的服务,你再调发送接口回复。

和官方「应用回调」不同:这里通常不需要企业侧部署消息加解密服务,但事件结构以平台文档为准,联调时先全量打日志。

方案说明

数据方向

复制代码
用户发企微消息
    ↓
执行节点接收
    ↓
平台 POST Webhook(JSON)
    ↓
你的服务:幂等 → 入队 → 业务逻辑 → sendText 回复

回调服务三原则

  1. 快速 200 --- 几秒内返回;调 LLM、写库放异步 worker。

  2. 幂等 --- 用消息 ID 去重,避免重复回复。

  3. 分类型 --- 文本、图片、群 @ 等分支不同,别写死只处理一种。

测收消息的常见误区

用 sendText 发出去再等同一条回调,往往收不到。应让外部用户或同事给该节点发消息,再看 Webhook 是否触发。

操作步骤

  1. 节点在线,Token 就绪。

  2. 部署公网 HTTPS 的 /webhook/qw;本地用内网穿透。

  3. 控制台保存 Webhook URL,确认验证请求能 200。

  4. 外部号发测试私聊,服务端打印完整 Body。

  5. 写 handler:文本 → 调 sendText 回声。

  6. 外部群测 @ 或关键词;私聊与群聊分支分开。

  7. 生产用 Redis 存已处理消息 ID。

示例代码

python 复制代码
from flask import Flask, request
from threading import Thread
import requests
import os

app = Flask(__name__)
GATEWAY = os.environ["QW_GATEWAY"]
TOKEN = os.environ["QW_API_TOKEN"]
_seen = set()

def send_text(guid, toid, content):
    requests.post(
        f"{GATEWAY}/qw/doApi",
        json={"method": "/msg/sendText", "params": {
            "guid": guid, "toid": toid, "content": content,
        }},
        headers={"X-API-TOKEN": TOKEN, "Content-Type": "application/json"},
        timeout=15,
    )

def handle(event):
    msg_id = event.get("msgId") or event.get("id")
    if msg_id and msg_id in _seen:
        return
    if event.get("msgType") != "text":
        return
    guid = event["guid"]
    sender = event.get("fromId")
    room = event.get("roomId")
    toid = room if room else sender
    text = event.get("content", "")
    send_text(guid, toid, f"已收到:{text}")
    if msg_id:
        _seen.add(msg_id)

@app.post("/webhook/qw")
def webhook():
    event = request.get_json(force=True)
    Thread(target=handle, args=(event,), daemon=True).start()
    return {"code": 0}, 200

注意

  • 群消息回复时,toid 通常是 roomId;发送者 ID 用于识别谁触发。

  • 实例掉线后回调不稳定,先查节点状态。

  • 内存去重重启会丢,生产用 Redis。

  • 日志注意脱敏,控制聊天记录留存周期。

  • 前面有 Nginx 时注意超时和 Body 大小限制。

文档

API 文档 · Webhook · 官网平台

相关推荐
科技绘图8 小时前
快鲸GEO vs 传统AI搜索优化:全链路自动化与高效内容生产在转化闭环上的对比
数据库·人工智能·自动化
上海安当技术9 小时前
固件签名与Secure Boot:安当CAS如何构建汽车固件信任链
网络·汽车·信任链·boot·secure·固件签名·安当cas
M-Robots echo9 小时前
M-CLAW,面向具身智能的机器人任务编排开发框架
机器人·ros·鸿蒙·开源社区·m-robots
上海安当技术9 小时前
诊断接入认证:安当CAS如何堵住汽车网络安全的物理后门
网络·web安全·汽车·access·secure·安当cas·诊断接入认证
ze^010 小时前
【软考信息安全】第2章 网络攻击原理与常用方法
网络·web安全·网络安全
Axis tech10 小时前
无标记点动作捕捉 vs 惯性动作捕捉:专业从业者需要了解这些要点
科技·机器人
这个DBA有点耶10 小时前
数据库一体机架构演进:从硬件堆叠到软硬深度耦合
服务器·网络·数据库·硬件架构·运维开发·database·数据库架构
M-Robots echo11 小时前
王成录:机器人产业下一个十年,拼的是 “系统级智能化” 而非单点算法堆叠
机器人·ros·鸿蒙·开源社区·m-robots·王成录
arbboter11 小时前
【网络工具】NetProxy网络代理用户手册
开发语言·网络·c#·网络代理·网络异常·代理工具
Elastic 中国社区官方博客11 小时前
Elasticsearch:使用 AI Agent 来创建 workflow
大数据·运维·人工智能·elasticsearch·搜索引擎·自动化·全文检索