返回
把微信接进 AI 助手:ClawBot/iLink 桥接实践
4 分钟

把微信接进 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。

收信流程

  1. 长轮询拿到新消息;
  2. 过滤:只保留绑定用户的文本消息;
  3. 先发一个「正在输入」,让对方知道消息已收到;
  4. 把内容 POST 给 AI 助手的 webhook;
  5. 助手处理完,调用回信脚本发回微信。
node reply.mjs --to '<用户ID>' --token '<context_token>' --text '回复内容'

保活与故障处理

云电脑上没有 systemd,也没有 cron,所以保活分两层:一个脚本检查轮询进程是否存活,一个定时任务定期调用这个脚本。

需要注意的是不要启动两份轮询。手动重启和保活检测同时发生时,可能出现两个进程同时收信、重复回复的情况。保活脚本要先确认没有正在运行的进程,再决定是否拉起。

凭证过期时接口会返回错误码 -14,这时只能重新扫码绑定;二维码大约 5 分钟有效。

测试

桥接程序用 Node 自带的 node --test 写了单元测试,覆盖请求头生成、文本提取、允许名单和发信请求体,测试不访问真实网络。