需监听撤回事件以同步状态:一、Dify+企业微信回调需配置Webhook并解析RevokeMsg.MsgId清除对应记录;二、wxauto通过识别“撤回”系统消息反向定位并标记日志;三、cow中间件启用revoke_filter钩子清除待处理队列。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

如果您在使用 DeepSeek V4 驱动的微信机器人时发现用户撤回消息后系统仍继续响应或状态未同步,则可能是由于未正确监听企业微信或个人微信侧的撤回事件。以下是针对不同接入方式实现撤回消息事件监听的具体操作:
一、通过 Dify + 企业微信回调监听撤回事件
该方法适用于已部署 Dify 并完成企业微信 webhook 接入的场景。Dify 可原生解析企业微信推送的 msg_type = "revoke" 事件,需确保回调地址已注册且权限开启。
1、登录 Dify 管理后台,在「应用设置 → API & Webhook」中确认已配置企业微信回调 URL,并勾选「接收消息」与「接收事件」权限。
2、在企业微信管理后台的「应用管理 → 自建应用 → 功能设置 → 接收消息」中,将 Dify 提供的回调地址填入,并验证服务器配置(Token 和 EncodingAESKey 需与 Dify 中一致)。
3、接收到撤回事件后,Dify 后端需解析 JSON 中的 RevokeMsg.MsgId 字段,该字段对应原始被撤回消息的唯一 ID。
4、调用本地数据库查询语句,定位该 MsgId 对应的上下文记录、自动回复任务或缓存会话状态。
5、执行业务清除逻辑,例如调用 memory.delete_by_msg_id(original_msg_id) 删除记忆节点,并写入审计日志。
二、通过 wxauto 监听 Windows 微信客户端撤回提示
wxauto 无法直接捕获底层撤回协议,但可识别微信 PC 客户端界面中出现的“XXX 撤回了一条消息”系统提示文本。该方案依赖 UI 文本匹配,适用于无企业微信资质的个人号自动化场景。
1、启动 wxauto 实例并绑定已登录的微信 PC 客户端:wx = WeChat()。
2、在监听循环中,调用 wx.GetAllMessage() 或 wx.GetListenMessage() 获取最新消息列表。
3、遍历每条消息,判断其 msg.type == 'system' 且 '撤回了一条消息' in msg.content。
4、提取该系统消息所在聊天窗口名(msg.who)及时间戳(msg.time),反向检索前 N 条非系统消息中时间最接近的一条作为被撤回目标。
5、根据聊天对象与时间范围,从本地消息日志表中标记对应记录为 status = 'revoked',并跳过后续 AI 回复流程。
三、通过 chatgpt-on-wechat(cow)中间件拦截撤回事件
chatgpt-on-wechat v3.x 版本已内置对微信撤回消息的初步识别能力,其消息代理层可在转发至大模型前过滤掉已被撤回的请求,需启用插件式事件钩子机制。
1、确认已安装 cow 的最新 release 版本(≥v3.12.0),并在 config.json 中开启 "enable_revoke_filter": true。
2、在 plugins/revoke_handler.py 中定义钩子函数,监听 on_message_revoke 事件。
3、钩子函数内读取事件携带的 revoke_msg_id,调用 cow 内置的 message_pool.remove_by_id() 清除待处理队列中的对应条目。
4、向日志系统写入结构化记录:{"event": "revoke", "msg_id": revoke_msg_id, "handled": true}。
5、确保 message_pool 使用线程安全容器(如 queue.Queue),避免并发状态下漏删或重复删除。



















