字
字节笔记本
2026年5月1日
微信 ClawBot:首个官方个人号 Bot API iLink 协议拆解与实战
API中转
¥120
2026 年,腾讯终于为微信个人号提供了官方合法的 Bot API —— iLink(智联)协议。这是微信个人号机器人开发从"猫鼠游戏"走向正规化的历史性一步。
十年等待,一朝开放
微信个人号的机器人开发历程堪称一部"猫鼠游戏"史:
| 时期 | 方案 | 原理 | 结局 |
|---|---|---|---|
| 2015-2017 | itchat / wxpy | 微信 Web 协议 | 2017 年微信封禁 Web 端登录 |
| 2017-2019 | Xposed Hook | Android 端 hook 微信进程 | 2019 年大规模封杀 |
| 2019-2025 | iPad 协议 | 模拟 iPad 端微信 | 灰色地带,服务商被起诉 |
| 2019-至今 | PC Hook(WeChatFerry 等) | 注入 PC 端微信进程 | 逆向注入,随时封号 |
| 2026 | iLink(官方) | 纯 HTTP/JSON 协议 | 官方合法,稳定可用 |
iLink 协议全景
iLink 是一套纯 HTTP/JSON 协议,接入域名 ilinkai.weixin.qq.com,不需要 WebSocket。
核心 API 端点
| 端点 | 方法 | 用途 | 超时 |
|---|---|---|---|
/ilink/bot/get_bot_qrcode | GET | 获取登录二维码 | - |
/ilink/bot/get_qrcode_status | GET | 轮询扫码状态 | 35s |
/ilink/bot/getupdates | POST | 长轮询收消息 | 35s |
/ilink/bot/sendmessage | POST | 发送消息 | 15s |
/ilink/bot/getconfig | POST | 获取 bot 配置 | 10s |
/ilink/bot/sendtyping | POST | 发送"正在输入"状态 | 10s |
/ilink/bot/getuploadurl | POST | 获取 CDN 预签名上传地址 | 15s |
鉴权机制
- 扫码登录获取
bot_token - 每个请求带
Authorization: Bearer {token} X-WECHAT-UIN:每次请求随机生成 uint32 → base64,防重放攻击
消息机制
- 长轮询(35s hold)+ 游标推进,类似 Telegram Bot API
- 回复必须带
context_token,关联到正确的对话窗口 - 不能主动推送,必须由用户先发消息触发
与 OpenClaw 的集成
@tencent-weixin/openclaw-weixin 是微信渠道的官方 Channel Plugin,基于 iLink 协议做了大量增强:
| 能力 | 说明 |
|---|---|
| Session Guard | 检测到错误码 -14(会话过期)时,自动暂停该账号 60 分钟 |
| Config Cache | typing_ticket 按用户缓存 24 小时,失败时指数退避重试 |
| Markdown → 纯文本 | AI 返回的 markdown 自动转为微信友好的纯文本 |
| SILK 语音转码 | 使用 silk-wasm 将微信 SILK 音频解码为 WAV |
| CDN 媒体加解密 | AES-128-ECB 加密上传、下载解密 |
| 引用消息识别 | 读取 ref_msg 字段,格式化为 [引用: xxx] |
| Pairing 配对 | 扫码用户自动注册到 allowFrom 授权列表 |
| Debug 全链路追踪 | 发送 /toggle-debug 开启耗时分解报告 |
iLink 提供协议,OpenClaw 提供框架,SDK 在两者之间做桥接和增强。但 iLink 协议本身是独立的 HTTP/JSON API,完全可以脱离 OpenClaw 直接调用。
独立 Bot 实战
以下是用 Node.js 直接调用 iLink 协议构建微信机器人的核心代码:
扫码登录
javascript
const ILINK_BASE = "https://ilinkai.weixin.qq.com";
async function login() {
const qrRes = await fetch(
`${ILINK_BASE}/ilink/bot/get_bot_qrcode?bot_type=3`,
{ headers: makeHeaders() }
);
const qrData = await qrRes.json();
const qrcodeUrl = qrData.qrcode_img_content;
const qrcodeKey = qrData.qrcode;
qrterm.generate(qrcodeUrl, { small: true });
while (true) {
await sleep(2000);
const statusRes = await fetch(
`${ILINK_BASE}/ilink/bot/get_qrcode_status?qrcode=${qrcodeKey}`,
{ headers: makeHeaders() }
);
const statusData = await statusRes.json();
if (statusData.bot_token) {
return {
bot_token: statusData.bot_token,
baseurl: statusData.baseurl || ILINK_BASE,
};
}
}
}长轮询收消息
javascript
async function pollLoop(tokenData, onMessage) {
let cursor = "";
while (true) {
try {
const data = await apiPost(
tokenData.baseurl,
"ilink/bot/getupdates",
{ get_updates_buf: cursor, base_info: { channel_version: "1.0.2" } },
tokenData.bot_token,
40_000
);
if (data.get_updates_buf) cursor = data.get_updates_buf;
for (const msg of (data.msgs || [])) {
if (msg.message_type === 2) continue; // 跳过 bot 自己的消息
const text = msg.item_list
?.filter(i => i.type === 1 && i.text_item)
.map(i => i.text_item.text)
.join("");
await onMessage(msg, text);
}
} catch (err) {
if (err.name === "AbortError") continue;
await sleep(3000);
}
}
}发送回复 + typing 状态
javascript
async function sendText(baseUrl, token, to, contextToken, text) {
return apiPost(baseUrl, "ilink/bot/sendmessage", {
msg: {
from_user_id: "",
to_user_id: to,
client_id: `demo-${crypto.randomUUID()}`,
message_type: 2, // BOT 发送
message_state: 2, // FINISH
context_token: contextToken,
item_list: [{ type: 1, text_item: { text } }],
},
base_info: { channel_version: "1.0.2" },
}, token);
}能力边界与展望
当前能力
- 文本、图片、语音、文件、视频的收发
- "正在输入" typing 状态
- 引用消息识别(只读)
- 语音消息自动转文字
当前限制
- 不能主动推送消息 — 必须用户先发消息
- 不能发送引用消息 —
ref_msg是只读字段 - 媒体需自行加解密 — CDN 文件使用 AES-128-ECB
- 腾讯保留管控权 — 可随时限速、拦截、终止服务
应用场景
- AI 助手 — 接入 Claude / GPT,在微信里直接和 AI 对话
- 客服机器人 — 自动回复常见问题
- 告警通知 — 当用户主动询问时返回系统状态
- 工作流自动化 — 通过微信发指令触发自动化任务
与历史方案的根本区别
这不是又一个"破解微信协议"的项目。iLink 是腾讯主动设计并开放的:有专用域名、有正式服务条款、有明确的能力边界。开发者不再需要在"功能"和"安全"之间做取舍。
微信个人号生态的 AI 化,可能才刚刚开始。
分享: