OpenClaw QQBot 与微信插件架构对比分析

摘要

OpenClaw 作为一个开源 AI Agent 框架,其插件生态中最引人注目的是两款腾讯官方出品的 IM 通道插件——QQBot 和微信。它们分别对接 QQ 开放平台和微信 iLink Bot 协议,代表了两种截然不同的插件开发范式:"胖插件""瘦插件"。本报告从通信协议、消息链路、并发模型、媒体处理、鉴权机制等维度进行深度对比,揭示两者的架构差异及其对插件开发者的启发。

1. 插件基本信息

1.1 QQBot 官方版

1.2 微信版

1.3 社区版 QQBot(Jay 在用)

2. 通信协议对比

两个插件在底层通信协议上的选择,直接决定了后续架构的走向。

2.1 QQBot:WebSocket 长连接

QQBot 基于 QQ 开放平台官方 Bot API,采用 WebSocket 长连接推送模式:

2.2 微信:iLink Bot HTTP 长轮询

微信插件采用了一种全新的 iLink Bot 协议/ilink/bot/* HTTP 端点):

> 关键区别: 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 行,几乎是一个独立的微服务。它自建了以下组件:

优势: 功能极其丰富,覆盖了 QQ 平台几乎所有能力,用户体验打磨到位。

劣势: 代码量大、维护成本高、与框架耦合度低(很多能力重新实现而非复用框架)。

5.2 微信 = "瘦插件"

微信插件的核心文件 process-message.ts481 行,精简到只做必要的事:

优势: 代码简洁、易于理解和维护、与框架高度对齐。

劣势: 功能相对基础,刚起步阶段,很多高级特性尚未实现。

5.3 代码量对比的启示

指标QQBot微信倍数
核心文件行数2369481**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
内置 Skillcron 定时提醒、media 收发等
表情解析QQ 特有表情标签转文本

6.2 微信独有功能

功能说明
扫码即登零门槛接入,无需申请 Bot 账号
真人身份以真实微信号身份发送消息
CDN 加密传输AES-128-ECB 端到端加密媒体
Session Guard掉线自动恢复连接
`/debug` 全链路耗时开发调试利器,追踪每个环节耗时
引用消息媒体支持下载引用消息中的图片/文件

7. iLink Bot 协议:腾讯的新尝试

微信插件采用的 iLink Bot 协议值得单独讨论。这是腾讯在探索 IM + AI 结合方式上的新尝试:

7.1 协议特征

7.2 与 QQ 开放平台的对比

维度QQ 开放平台iLink Bot
接入门槛需申请 Bot 账号、审核扫码即用
协议WebSocket(现代)HTTP 长轮询(经典)
身份独立 Bot真人号
加密平台内部处理显式 AES 加密
成熟度成熟、文档完善早期、快速迭代中

iLink Bot 协议的出现,意味着腾讯正在为微信生态提供一种轻量级的 AI Bot 接入方案——不需要企业资质、不需要审核流程,扫码就能让微信号变成 AI 助手。

8. 对 OpenClaw 插件开发者的启发

8.1 两种开发范式

这两套插件清晰地展示了 OpenClaw 插件开发的两种范式:

范式一:"胖插件"(QQBot 风格)

范式二:"瘦插件"(微信风格)

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 生态来说,两者的共存恰恰证明了框架的灵活性:既能支撑重量级的深度定制,也能容纳轻量级的快速接入

参考链接