微信(WeChat)渠道

📎 引用文件

本文引用的文件 - weixin.py - wecom.py - base.py - utils.py - registry.py - test_channels_runtime.py

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能与限制
  8. 故障排除指南
  9. 结论
  10. 附录:配置与接口速查

简介

本章节面向 Vibe-Trading 的“微信渠道”集成,覆盖两类场景: - 个人微信(Weixin):通过 HTTP 长轮询与 iLink API 收发消息,支持二维码登录、会话上下文管理、媒体下载与 AES 解密、文本/图片/语音/视频发送。 - 企业微信(WeCom):基于 WebSocket 长连接与 SDK,无需公网 Webhook,支持文本、图片、语音、文件、混合消息收发与流式回复。

文档将详细说明服务器配置、消息加解密、接口调用、用户身份识别与会话管理、消息路由、安全传输、常见问题排查等。

项目结构

微信相关能力集中在 channels 层,提供统一抽象与具体实现: - 基础抽象:BaseChannel 定义统一的启动、停止、发送、权限校验、入站消息转发等接口。 - 个人微信:WeixinChannel 使用 HTTP 长轮询与 iLink API,负责登录、消息拉取、媒体下载解密、出站发送。 - 企业微信:WecomChannel 使用 WebSocket 长连接与 SDK,负责事件接收、媒体下载、出站发送与流式回复。 - 工具与路径:utils 提供媒体目录、运行时目录、URL 安全校验等通用能力。 - 注册表:registry 声明各渠道可用性与安装提示。

graph TB subgraph "通道层" Base["BaseChannel<br/>统一抽象"] WX["WeixinChannel<br/>个人微信(HTTP长轮询)"] WC["WecomChannel<br/>企业微信(WebSocket)"] end subgraph "基础设施" Bus["MessageBus<br/>消息总线"] Utils["utils<br/>媒体目录/URL校验"] Reg["registry<br/>渠道注册/可用性"] end Base --> Bus WX --> Base WC --> Base WX --> Utils WC --> Utils WX -.-> Reg WC -.-> Reg

图表来源 - base.py:22-238 - weixin.py:121-169 - wecom.py:54-101 - utils.py:16-32 - registry.py:33-63

章节来源 - base.py:22-238 - weixin.py:121-169 - wecom.py:54-101 - utils.py:16-32 - registry.py:33-63

核心组件

章节来源 - weixin.py:121-169 - weixin.py:327-416 - weixin.py:538-593 - weixin.py:598-831 - weixin.py:837-928 - weixin.py:1088-1222 - weixin.py:1287-1474 - weixin.py:1477-1587 - wecom.py:73-148 - wecom.py:217-355 - wecom.py:356-490 - wecom.py:492-555 - base.py:22-238 - utils.py:16-32 - utils.py:53-89

架构总览

个人微信与企业微信两条通道均遵循统一抽象,接入消息总线,完成入站与出站的消息流转。

sequenceDiagram participant WX as "WeixinChannel" participant API as "iLink API" participant BUS as "MessageBus" participant WC as "WecomChannel" participant SDK as "WeCom SDK" Note over WX,API : 个人微信:HTTP 长轮询 WX->>API : POST /ilink/bot/getupdates API-->>WX : {msgs, get_updates_buf} WX->>BUS : publish_inbound(InboundMessage) Note over WC,SDK : 企业微信:WebSocket 事件 SDK-->>WC : message.text/image/voice/file/mixed WC->>BUS : publish_inbound(InboundMessage) Note over WX,BUS : 出站 BUS-->>WX : OutboundMessage WX->>API : POST /ilink/bot/sendmessage (文本/媒体) Note over WC,BUS : 出站 BUS-->>WC : OutboundMessage WC->>SDK : reply_stream/send_message (文本/媒体)

图表来源 - weixin.py:538-593 - weixin.py:1088-1222 - wecom.py:102-148 - wecom.py:492-555 - base.py:179-227

详细组件分析

个人微信(WeixinChannel)

flowchart TD Start(["收到入站消息"]) --> Parse["解析 item_list"] Parse --> Text{"是否文本?"} Text -- 是 --> BuildText["构建内容(含引用)"] Text -- 否 --> Media{"是否媒体?"} Media -- 是 --> Download["下载并解密媒体"] Media -- 否 --> Fallback["检查引用中的媒体"] Download --> AppendMedia["追加媒体路径"] Fallback --> AppendMedia BuildText --> Forward["_handle_message -> MessageBus"] AppendMedia --> Forward Forward --> End(["结束"])

图表来源 - weixin.py:598-831 - weixin.py:837-928

sequenceDiagram participant WX as "WeixinChannel" participant API as "iLink API" participant CDN as "CDN" participant BUS as "MessageBus" WX->>API : POST /ilink/bot/getuploadurl (media_type, filekey, aeskey...) API-->>WX : upload_full_url 或 upload_param WX->>CDN : POST 加密数据 (AES-128-ECB + PKCS7) CDN-->>WX : 响应头 x-encrypted-param WX->>API : POST /ilink/bot/sendmessage (item_list 包含媒体) API-->>WX : ret/errcode Note over WX,BUS : 文本分片发送与打字状态保活

图表来源 - weixin.py:1325-1474 - weixin.py:1088-1222

章节来源 - weixin.py:327-416 - weixin.py:538-593 - weixin.py:598-831 - weixin.py:837-928 - weixin.py:1088-1222 - weixin.py:1287-1474 - weixin.py:1477-1587

企业微信(WecomChannel)

sequenceDiagram participant SDK as "WeCom SDK" participant WC as "WecomChannel" participant BUS as "MessageBus" SDK-->>WC : message.text/image/voice/file/mixed WC->>WC : 解析 body/extract sender/chat WC->>WC : 下载并解密媒体(如需) WC->>BUS : publish_inbound(InboundMessage) BUS-->>WC : OutboundMessage alt 有 frame(会话中) WC->>SDK : reply_stream(content, finish=...) else 无 frame(主动推送) WC->>SDK : send_message(markdown) end

图表来源 - wecom.py:102-148 - wecom.py:217-355 - wecom.py:492-555

章节来源 - wecom.py:73-148 - wecom.py:217-355 - wecom.py:356-490 - wecom.py:492-555

基础通道与工具

章节来源 - base.py:22-238 - utils.py:16-32 - utils.py:53-89 - utils.py:97-180

依赖关系分析

graph LR Reg["registry<br/>安装提示/可用性"] --> WX["weixin"] Reg --> WC["wecom"] Test["test_channels_runtime<br/>渠道集合断言"] --> Reg

图表来源 - registry.py:33-63 - test_channels_runtime.py:86-107

章节来源 - registry.py:33-63 - test_channels_runtime.py:86-107

性能与限制

章节来源 - weixin.py:538-593 - weixin.py:1088-1222 - wecom.py:356-490 - utils.py:97-180

故障排除指南

章节来源 - weixin.py:538-593 - weixin.py:837-928 - weixin.py:1088-1222 - wecom.py:356-490

结论

Vibe-Trading 的微信渠道提供了完整的双通道支持:个人微信通过 iLink HTTP 长轮询与企业微信通过 WebSocket 长连接,分别适配不同部署与安全需求。两者均实现了严格的权限控制、会话上下文管理、媒体下载与加密、出站发送与流式回复,并通过统一抽象接入消息总线,便于扩展与维护。

附录:配置与接口速查

章节来源 - weixin.py:121-169 - weixin.py:327-416 - weixin.py:538-593 - weixin.py:1088-1222 - weixin.py:1287-1474 - wecom.py:54-101 - wecom.py:102-148 - wecom.py:398-490 - wecom.py:492-555