
把微信接进 AI 助手:ClawBot/iLink 桥接实践
“零依赖的 Node.js 桥接程序:长轮询收信、转发 webhook、纯文本回信与保活。”
我想在微信里直接给 AI 助手发消息,于是写了一个小小的桥接程序:一边连微信 ClawBot(iLink 协议),一边连 AI 助手的 webhook。全程只用 Node.js 内置模块,没有任何第三方依赖。
整体思路
微信 ClawBot ⇄ 桥接程序(长轮询) ⇄ AI 助手 webhook
- 桥接程序只发出站请求,不开放任何公网端口;
- 收到消息后转给 AI 助手,助手处理完再通过回信脚本发回微信;
- 只处理绑定用户自己的消息,其他人发来的一律忽略。
协议要点
iLink 的接口不多,核心是这几个:
| 用途 | 接口 |
|---|---|
| 获取登录二维码 | GET /ilink/bot/get_bot_qrcode |
| 查询扫码状态 | get_qrcode_status |
| 收消息(长轮询) | POST /ilink/bot/getupdates |
| 发消息 | POST /ilink/bot/sendmessage |
| 「正在输入」状态 | getconfig + sendtyping |
几个容易踩的坑:
getupdates是长轮询,一次大约挂 35 秒,返回里的游标要持久化,否则重启后会重复收到旧消息;sendmessage必须带上收到消息时的context_token,所以绑定后要先在微信里发一句话;- 微信不渲染 Markdown,回复要转成纯文本。
目录结构
wechat-bridge/
├── login.mjs # 扫码登录,保存凭证
├── poll.mjs # 长轮询收信,转发到 webhook
├── reply.mjs # 给 AI 助手调用的回信脚本
├── lib/ # iLink 请求、消息解析、会话存储
└── scripts/
└── ensure-poll.sh # 保活:发现轮询进程没在跑就拉起
凭证文件放在被 .gitignore 忽略的 data/ 目录,权限 600,日志里也不打印 token。
收信流程
- 长轮询拿到新消息;
- 过滤:只保留绑定用户的文本消息;
- 先发一个「正在输入」,让对方知道消息已收到;
- 把内容 POST 给 AI 助手的 webhook;
- 助手处理完,调用回信脚本发回微信。
node reply.mjs --to '<用户ID>' --token '<context_token>' --text '回复内容'
保活与故障处理
云电脑上没有 systemd,也没有 cron,所以保活分两层:一个脚本检查轮询进程是否存活,一个定时任务定期调用这个脚本。
需要注意的是不要启动两份轮询。手动重启和保活检测同时发生时,可能出现两个进程同时收信、重复回复的情况。保活脚本要先确认没有正在运行的进程,再决定是否拉起。
凭证过期时接口会返回错误码 -14,这时只能重新扫码绑定;二维码大约 5 分钟有效。
测试
桥接程序用 Node 自带的 node --test 写了单元测试,覆盖请求头生成、文本提取、允许名单和发信请求体,测试不访问真实网络。
把微信接进 AI 助手:ClawBot/iLink 桥接实践https://pfzhou.xyz/posts/wechat-ilink-bridge
