微信 Clawbot 与本地 OpenClaw 连接架构详解
一、整体连接架构

二、完整消息交互流程
2.1 入站消息流程(微信 → OpenClaw)
|
步骤 |
发送方 |
接收方 |
说明 |
|
1 |
微信用户 |
微信服务器 |
用户发送文本/图片消息 |
|
2 |
微信服务器 |
iLink API |
消息推送到 iLink Bot 网关 |
|
3 |
OpenClaw |
iLink API |
monitor.ts 发起 GET /getupdates 长轮询 (timeout: 35s) |
|
4 |
iLink API |
OpenClaw |
有新消息时立即返回 msgs 数组 |
|
5 |
OpenClaw |
OpenClaw |
processOneMessage 标准化为 MsgContext,记录 context_token |
|
6 |
OpenClaw |
OpenClaw |
dispatchReply 传递给 AI 核心处理 |
|
7 |
OpenClaw |
OpenClaw |
AI 生成回复内容 |
关键代码位置:
- monitor.ts:monitorWeixinProvider() — 长轮询主循环
- inbound.ts:weixinMessageToMsgContext() — 消息标准化
- process-message.ts:processOneMessage() — 消息处理入口
2.2 出站消息流程(OpenClaw → 微信)
|
步骤 |
发送方 |
接收方 |
说明 |
|
1 |
OpenClaw AI |
send.ts |
AI 生成回复文本/媒体 |
|
2 |
send.ts |
send.ts |
buildSendMessageReq 构建消息体 |
|
3 |
send.ts |
iLink API |
POST /sendmessage,携带 to_user_id 和 context_token |
|
4 |
iLink API |
微信服务器 |
路由到微信服务器 |
|
5 |
微信服务器 |
微信用户 |
用户收到回复消息 |
关键代码位置:
- send.ts:sendMessageWeixin() — 发送文本消息
- send.ts:sendImageMessageWeixin() — 发送图片(需先上传 CDN)
- api/api.ts:sendMessage() — 底层 API 调用
三、核心机制说明
3.1 长轮询 (Long-Poll) 机制
问题:openclaw gateway 监听的是 127.0.0.1:18789(本地),微信服务器无法直接访问。
解决方案:反向拉取模式
// monitor.ts 中的长轮询循环
while (!abortSignal?.aborted) {
const resp = await getUpdates({
baseUrl: // 微信 iLink API 公网地址
token: // Bot Token 认证
get_updates_buf: // 增量同步游标
timeoutMs: 35000, // 长轮询超时 (35 秒)
});
// 服务器会"持有"这个请求,直到:
// 1. 有新消息到达 → 立即返回
// 2. 超时 (35s) → 返回空响应,客户端重试
}
流程说明:
- 本地 monitor.ts 每 35 秒向微信 iLink API 发起一次 getUpdates 请求
- 微信服务器”持有”这个请求,不立即返回
- 当用户发送消息时,微信服务器立即响应,返回消息列表
- 如果没有消息,35 秒后返回空响应,客户端立即重试
本质:不是”推送”,而是”高频拉取 + 服务器延迟响应”
3.2 Context Token 机制(会话追踪)
问题:微信消息是单向的,如何确保回复发给正确的用户?
解决方案:context_token 双向传递
|
方向 |
动作 |
说明 |
|
入站 |
微信发送消息携带 context_token |
每个消息都有唯一的上下文标识 |
|
入站 |
OpenClaw 提取并缓存 token |
setContextToken(accountId, userId, token) |
|
入站 |
持久化到状态文件 |
~/.openclaw/state/openclaw-weixin/accounts/ |
|
出站 |
OpenClaw 从缓存读取 token |
getContextToken(accountId, userId) |
|
出站 |
发送回复时附带相同 token |
确保消息路由到正确的会话 |
代码位置:
- inbound.ts:setContextToken() / getContextToken() — Token 缓存
- send.ts:sendMessageWeixin() — 发送时附带 token
3.3 认证与路由
|
组件 |
地址 |
用途 |
|
iLink API 网关 |
https://api.ilink.weixin.qq.com/ (默认) |
所有 API 请求的目标地址 |
|
openclaw gateway |
127.0.0.1:18789 (本地) |
OpenClaw 内部通信,不直接接收微信消息 |
|
Bot Token |
扫码登录后获得 |
每次 API 请求的 Authorization: Bearer xxx 头 |
重要说明:
微信消息不会直接发送到 127.0.0.1:18789,而是:
- 微信服务器存储消息
- 本地 monitor.ts 主动拉取 (getUpdates)
- 消息在插件内部处理后,通过 OpenClaw 框架传递到 AI
3.4 媒体文件传输(加密 CDN)
图片/视频/文件发送流程:
|
步骤 |
操作 |
说明 |
|
1 |
本地文件 |
/tmp/img.png |
|
2 |
POST 获取上传 URL |
向 getUploadUrl 申请预签名 URL |
|
3 |
PUT 上传文件 |
上传到微信 CDN 存储 |
|
4 |
返回 filekey + aeskey + 下载参数 |
CDN 返回加密文件信息 |
|
5 |
sendMessage 携带 encrypt_query_param |
发送消息引用 CDN 链接 |
关键点:
- 文件在 CDN 上是加密存储的 (AES-128-ECB)
- 下载时需要 encrypt_query_param + aes_key
- 接收方微信客户端自动解密
四、配置与状态管理
4.1 账号数据存储位置
|
文件类型 |
路径 |
用途 |
|
账号凭证 |
~/.openclaw/state/openclaw-weixin/accounts/.json |
存储 token, baseUrl, userId |
|
Context Token 缓存 |
~/.openclaw/state/openclaw-weixin/accounts/.context-tokens.json |
每个用户的会话 token |
|
长轮询同步游标 |
~/.openclaw/state/openclaw-weixin/sync/.getupdates.buf |
增量同步用 |
|
日志文件 |
~/.openclaw/logs/openclaw-weixin/.log |
运行日志 |
4.2 典型配置命令
# 1. 微信扫码登录(获取 token)
openclaw channels login --channel openclaw-weixin
# 2. 启动网关(开始长轮询)
openclaw gateway --port 18789 --verbose
# 3. 查看账号状态
openclaw channels status --channel openclaw-weixin
# 4. 查看日志
tail -f ~/.openclaw/logs/openclaw-weixin/<accountId>.log
五、常见问题排查
|
问题 |
可能原因 |
排查方法 |
|
收不到微信消息 |
长轮询未启动 |
检查 openclaw gateway 是否运行 |
|
消息发送失败 |
context_token 丢失 |
检查 ~/.openclaw/state/openclaw-weixin/accounts/*.context-tokens.json |
|
会话过期 |
Bot Token 失效 |
重新扫码登录,检查日志中的 SESSION_EXPIRED_ERRCODE |
|
媒体上传失败 |
CDN 上传 URL 过期 |
检查网络,重试上传 |
六、总结
核心要点
|
要点 |
说明 |
|
不是推送,是拉取 |
微信不会主动连接本地 gateway,而是本地 monitor.ts 不断长轮询 getUpdates |
|
context_token 是会话关键 |
每次 inbound 消息都携带,outbound 必须原样返回 |
|
gateway 127.0.0.1 只用于内部 |
微信消息不经过这个端口,它在插件内部处理后直接交给 OpenClaw 核心 |
|
媒体文件走加密 CDN |
先上传获取 filekey + aeskey,发送时引用 CDN 链接 |
架构优势
- ✅ OpenClaw自身无需公网 IP / 内网穿透
- ✅ 会话状态持久化(重启不丢失)
- ✅ 增量同步(不重复处理消息)
- ✅ 安全的媒体传输(AES 加密)
更多推荐
所有评论(0)