OpenClaw QQBot 与微信插件架构对比分析
摘要
OpenClaw 作为一个开源 AI Agent 框架,其插件生态中最引人注目的是两款腾讯官方出品的 IM 通道插件——QQBot 和微信。它们分别对接 QQ 开放平台和微信 iLink Bot 协议,代表了两种截然不同的插件开发范式:"胖插件" 与 "瘦插件"。本报告从通信协议、消息链路、并发模型、媒体处理、鉴权机制等维度进行深度对比,揭示两者的架构差异及其对插件开发者的启发。
1. 插件基本信息
1.1 QQBot 官方版
- 包名:
@tencent-connect/openclaw-qqbot - 开发团队: 腾讯 tencent-connect 团队
- 开源地址: github.com/tencent-connect/openclaw-qqbot
- 定位: QQ 开放平台官方 Bot 接入插件
1.2 微信版
- 包名:
@tencent-weixin/openclaw-weixin - 版本: v1.0.2
- 开发团队: 腾讯官方,5 位 @tencent.com maintainer
- 定位: 微信 iLink Bot 协议接入插件,处于早期阶段
1.3 社区版 QQBot(Jay 在用)
- 包名:
@sliverp/qqbot - 版本: v1.5.3
- 开发者: 个人开发者 sliverp
- 特点: 社区维护,功能更丰富(内置 Skill、热更新等)
2. 通信协议对比
两个插件在底层通信协议上的选择,直接决定了后续架构的走向。
2.1 QQBot:WebSocket 长连接
QQBot 基于 QQ 开放平台官方 Bot API,采用 WebSocket 长连接推送模式:
- 鉴权方式: AppID + AppSecret,走 OAuth2 流程获取 access_token
- 连接建立: 通过 REST API 获取 WebSocket gateway URL,建立持久连接
- 消息推送: 平台实时推送事件(消息、交互等),零延迟
- 心跳机制: 定期发送心跳包维持连接
2.2 微信:iLink Bot HTTP 长轮询
微信插件采用了一种全新的 iLink Bot 协议(/ilink/bot/* HTTP 端点):
- 鉴权方式: 扫码登录 + session token + pairing 模式
- 消息获取: HTTP 长轮询(
getUpdates(lastSeq)),每次轮询最长 35 秒超时 - 协议特点: 类似 Telegram Bot API 的 long polling 模式,但增加了 AES 加密层
- 身份: 使用真人微信号,非独立 Bot 账号
> 关键区别: WebSocket 是服务端主动推送,消息到达即时;HTTP 长轮询是客户端定期询问,理论上最长有 35 秒延迟(实际通常秒级)。这一选择直接影响了两个插件的并发模型设计。
3. 消息收发链路深度拆解
3.1 QQBot 消息链路(WebSocket 推送)
用户发消息 → QQ开放平台 → WebSocket 推送
↓
gateway.ts 解析事件
↓
enqueueMessage() 按用户排队
(10用户并发,单用户串行,队列上限20条)
↓
handleMessage()
├── sendC2CInputNotify("正在输入")
├── 处理附件
│ ├── 图片: 直接 HTTP 下载
│ ├── 语音: SILK → WAV → STT 转文字
│ └── 文件: HTTP 下载
└── parseFaceTags() 表情解析
↓
resolveAgentRoute() 路由选择
↓
组装 ctxPayload
├── Body: 给 UI 展示
├── BodyForAgent: 给 AI 看(注入 ~2KB 使用指南)
└── 包含 <qqimg>/<qqvoice> 等标签规则
↓
dispatchReplyWithBufferedBlockDispatcher()
→ AI 生成回复 → deliver()
↓
deliver() 回复处理
├── 解析 <qqimg>/<qqvoice>/<qqvideo>/<qqfile> 标签
├── 构建有序发送队列
├── 图片: 上传本地图床 → QQ 平台来拉取
├── 语音: TTS 合成 → SILK 编码
└── 文本: 直接发送
↓
限流: 同消息 1h 内最多 4 次回复
超过则降级为主动消息
链路特点:
1. 自建消息队列:10 个用户并发处理,单用户内消息严格串行,队列上限 20 条。这是一套完整的背压控制系统。
2. 丰富的附件处理管线:语音走完整的 SILK→WAV→STT 转写流程,图片直接下载,文件有大小限制处理。
3. 大量上下文注入:给 AI 的 payload 中注入约 2KB 的使用指南,教 AI 如何使用 等自定义标签输出富媒体内容。
4. 自定义标签系统:AI 回复中可以嵌入 等标签,deliver 阶段解析后转为对应的 QQ 消息格式。
5. 本地图床:为了让 QQ 平台拉取图片,插件自建了一个 HTTP 文件服务器,将图片暴露为公网 URL。
3.2 微信消息链路(HTTP 长轮询)
用户发消息 → iLink Bot 服务端存入队列
↓
monitor.ts 长轮询 getUpdates(lastSeq)
(35秒超时,有消息立即返回)
↓
processOneMessage()
├── 检查 slash command(/debug 等)
└── 媒体下载
├── CDN 下载 + AES-128-ECB 解密
├── 优先级: IMAGE > VIDEO > FILE > VOICE
└── 支持引用消息中的媒体
↓
weixinMessageToMsgContext() 标准化
(不注入使用指南,极简 ctx)
↓
pairing 鉴权
├── 框架 allowFrom 配置
└── 扫码自动加入白名单
↓
resolveAgentRoute()
→ recordInboundSession()
→ sendTyping(5s keepalive 续期)
↓
createReplyDispatcherWithTyping()
→ AI 生成回复 → deliver()
↓
deliver() 回复处理
├── markdownToPlainText() 格式转换
├── 有媒体: downloadRemoteImageToTemp()
│ → AES-128-ECB 加密 → CDN 上传
│ → sendWeixinMediaFile()
└── 纯文本: sendMessageWeixin()
↓
[debug 模式] 追加全链路耗时报告
链路特点:
1. 框架标准化:尽可能利用 OpenClaw 框架的 dispatcher、typing、media pipeline 能力,不重新造轮子。
2. AES 加密传输:所有媒体文件通过 AES-128-ECB 加密后上传到腾讯 CDN,下载时也需解密。这是 iLink Bot 协议的安全层。
3. 极简 AI 上下文:不像 QQBot 注入大量使用指南,微信版直接使用标准 ctx,AI 回复也走框架标准的 mediaUrl pipeline。
4. Typing 保活:发送 sendTyping 后每 5 秒续期一次,直到回复完成。相比 QQBot 一次性的 sendC2CInputNotify,用户体验更平滑。
5. Debug 模式:内置 /debug 命令,开启后每条消息都会追加全链路耗时报告,方便开发调试。
4. 关键差异对照表
| 环节 | QQBot | 微信 |
|---|---|---|
| **收消息** | WebSocket 推送(实时) | HTTP 长轮询(最长 35s 延迟) |
| **并发控制** | 自建消息队列(10 用户并发,单用户串行) | 轮询循环顺序处理 |
| **附件传输** | HTTP 直接下载/上传(明文) | CDN + AES-128-ECB 加密/解密 |
| **AI 上下文** | 注入大量使用指南(~2KB) | 极简标准 ctx |
| **回复解析** | 自定义标签系统 → 有序队列 | 框架标准 mediaUrl pipeline |
| **鉴权** | allowFrom 列表 / `*` 全放行 | pairing 模式(扫码自动加入) |
| **Bot 身份** | 独立 Bot 账号 | 真人微信号身份 |
| **媒体上传** | 本地图床 HTTP serve → QQ 来拉 | AES 加密 → 腾讯 CDN push |
| **输入状态** | sendC2CInputNotify(一次性) | sendTyping + 5s keepalive |
| **代码规模** | gateway.ts 2369 行("胖插件") | process-message.ts 481 行("瘦插件") |
5. 架构风格分析:"胖插件" vs "瘦插件"
5.1 QQBot = "胖插件"
QQBot 插件的核心文件 gateway.ts 长达 2369 行,几乎是一个独立的微服务。它自建了以下组件:
- 消息队列系统:完整的背压控制、并发限制、队列溢出处理
- 本地图床服务器:HTTP 文件服务,暴露公网端口供 QQ 平台拉取图片
- 语音处理管线:SILK 编解码 → WAV 转换 → STT 语音识别 → TTS 语音合成
- 自定义标签系统:
、、、等标签的解析和渲染 - 表情解析器:
parseFaceTags()将 QQ 表情标签转为文本描述
优势: 功能极其丰富,覆盖了 QQ 平台几乎所有能力,用户体验打磨到位。
劣势: 代码量大、维护成本高、与框架耦合度低(很多能力重新实现而非复用框架)。
5.2 微信 = "瘦插件"
微信插件的核心文件 process-message.ts 仅 481 行,精简到只做必要的事:
- 消息标准化:将微信消息格式转为 OpenClaw 标准 MsgContext
- 媒体加解密:AES-128-ECB 加密/解密(iLink Bot 协议要求)
- 框架复用:dispatcher、typing、media pipeline 全部使用框架能力
优势: 代码简洁、易于理解和维护、与框架高度对齐。
劣势: 功能相对基础,刚起步阶段,很多高级特性尚未实现。
5.3 代码量对比的启示
| 指标 | QQBot | 微信 | 倍数 |
|---|---|---|---|
| 核心文件行数 | 2369 | 481 | **4.9x** |
| 自建组件数 | 5+ | 1 | - |
| 框架 API 复用率 | 低 | 高 | - |
这并不是说哪种风格更好。"胖插件"是功能驱动的结果——QQBot 已经迭代到 v1.5.3,积累了大量实战需求(如热更新、诊断、多 Bot 支持);"瘦插件"是新项目的合理起点——微信版 v1.0.2 刚起步,优先做好核心链路。
6. 独有功能对比
6.1 QQBot 独有功能
| 功能 | 说明 |
|---|---|
| `/bot-upgrade` 热更新 | 运行中直接更新插件版本,无需重启 |
| `/bot-ping` 诊断 | 快速检查 Bot 连接状态 |
| 引用消息 REFIDX 解析 | 将引用消息解析为带索引的上下文 |
| 多 Bot 支持 | 单实例同时运行多个 QQ Bot |
| 内置 Skill | cron 定时提醒、media 收发等 |
| 表情解析 | QQ 特有表情标签转文本 |
6.2 微信独有功能
| 功能 | 说明 |
|---|---|
| 扫码即登 | 零门槛接入,无需申请 Bot 账号 |
| 真人身份 | 以真实微信号身份发送消息 |
| CDN 加密传输 | AES-128-ECB 端到端加密媒体 |
| Session Guard | 掉线自动恢复连接 |
| `/debug` 全链路耗时 | 开发调试利器,追踪每个环节耗时 |
| 引用消息媒体 | 支持下载引用消息中的图片/文件 |
7. iLink Bot 协议:腾讯的新尝试
微信插件采用的 iLink Bot 协议值得单独讨论。这是腾讯在探索 IM + AI 结合方式上的新尝试:
7.1 协议特征
- HTTP 端点:
/ilink/bot/*路径下的 REST API - 长轮询模式: 类似 Telegram Bot API 的
getUpdates - AES 加密层: 所有媒体文件传输经过 AES-128-ECB 加密
- Session 管理: 扫码登录后维持 session token,支持掉线恢复
7.2 与 QQ 开放平台的对比
| 维度 | QQ 开放平台 | iLink Bot |
|---|---|---|
| 接入门槛 | 需申请 Bot 账号、审核 | 扫码即用 |
| 协议 | WebSocket(现代) | HTTP 长轮询(经典) |
| 身份 | 独立 Bot | 真人号 |
| 加密 | 平台内部处理 | 显式 AES 加密 |
| 成熟度 | 成熟、文档完善 | 早期、快速迭代中 |
iLink Bot 协议的出现,意味着腾讯正在为微信生态提供一种轻量级的 AI Bot 接入方案——不需要企业资质、不需要审核流程,扫码就能让微信号变成 AI 助手。
8. 对 OpenClaw 插件开发者的启发
8.1 两种开发范式
这两套插件清晰地展示了 OpenClaw 插件开发的两种范式:
范式一:"胖插件"(QQBot 风格)
- 自建核心组件,减少对框架的依赖
- 适合:需要深度定制、平台特性丰富、长期维护的场景
- 代价:代码量大、维护成本高
- 典型场景:QQ/Discord 等功能丰富的 IM 平台
范式二:"瘦插件"(微信风格)
- 最大化复用框架能力,只做协议适配
- 适合:快速接入、平台 API 简单、希望与框架保持对齐
- 代价:功能可能受限于框架能力
- 典型场景:新平台接入、MVP 阶段、API 简洁的平台
8.2 实践建议
1. 新插件建议从"瘦"开始:先用框架标准能力跑通核心链路,再根据需求逐步"增胖"。
2. 并发控制是必选项:QQBot 的消息队列设计值得参考——10 用户并发、单用户串行、队列上限 20 条,这组参数经过实战验证。
3. 媒体处理是最大复杂度来源:无论哪种风格,图片/语音/文件的收发都是代码量最大的部分。尽量复用框架能力。
4. 输入状态提升体验:微信的 5s keepalive typing 比 QQBot 的一次性通知体验更好,值得借鉴。
5. 内置调试工具:微信的 /debug 全链路耗时报告是个好实践,建议所有插件都内置类似机制。
9. 总结
| 维度 | QQBot(胖插件) | 微信(瘦插件) |
|---|---|---|
| **设计哲学** | 功能驱动,自建一切 | 框架驱动,极简适配 |
| **成熟度** | 成熟(v1.5.3) | 早期(v1.0.2) |
| **代码复杂度** | 高(2369 行核心文件) | 低(481 行核心文件) |
| **框架耦合度** | 低 | 高 |
| **功能丰富度** | 丰富 | 基础 |
| **维护成本** | 高 | 低 |
| **适用场景** | 深度定制、长期运营 | 快速接入、MVP 验证 |
两种风格没有绝对优劣——QQBot 的"胖"是功能迭代的必然结果,微信的"瘦"是新项目的合理选择。对于 OpenClaw 生态来说,两者的共存恰恰证明了框架的灵活性:既能支撑重量级的深度定制,也能容纳轻量级的快速接入。
参考链接
- QQBot 官方版源码:
- OpenClaw 框架:
- QQ 开放平台文档:
- npm @tencent-weixin/openclaw-weixin:
- npm @sliverp/qqbot: