Skip to content

后端 API 协议

返回详细指南 | English

本文档覆盖插件用于扫码登录、生命周期通知、消息和媒体的全部微信后端接口。两个扫码 登录请求始终使用腾讯固定服务;账号登录后 baseurl 指定的后端需要实现生命周期、 消息和媒体接口。

二维码创建和登录后的接口使用 POST;二维码状态轮询使用 GET。所有 API 请求均携带:

Header说明
iLink-App-Id插件应用 ID
iLink-App-ClientVersion编码为无符号整数的插件版本
SKRouteTag可选的配置路由标签

POST 请求还会携带 Content-Type: application/jsonAuthorizationType: ilink_bot_token 和随机 uint32 的 base64 编码 X-WECHAT-UIN。登录后的鉴权请求还会携带 Authorization: Bearer <bot-token>;二维码状态 GET 请求不携带这些 POST 专用请求头。

登录后的 POST 请求体包含 base_info,二维码创建请求则不包含。下方消息示例 为简洁起见将其省略。

json
{
  "base_info": {
    "channel_version": "<插件版本>",
    "bot_agent": "OpenClaw"
  }
}

bot_agent 仅用于观测,其格式和配置方式见 详细指南

接口列表

方法路径说明
POST/ilink/bot/get_bot_qrcode?bot_type=3创建扫码登录会话
GET/ilink/bot/get_qrcode_status?qrcode=<opaque-id>轮询扫码状态;可选传入 verify_code
POST/ilink/bot/msg/notifystart通知后端 channel 已启动
POST/ilink/bot/msg/notifystop通知后端 channel 已停止
POST/ilink/bot/getupdates长轮询获取新消息
POST/ilink/bot/sendmessage发送消息(文本/图片/视频/文件)
POST/ilink/bot/getuploadurl获取 CDN 上传预签名参数
POST/ilink/bot/getconfig获取账号配置(typing ticket 等)
POST/ilink/bot/sendtyping发送或取消输入状态

前两行描述固定的扫码登录服务,不会发送到账号登录后的 baseurl

扫码登录与生命周期

创建扫码会话:

http
POST /ilink/bot/get_bot_qrcode?bot_type=3
Content-Type: application/json
json
{
  "local_token_list": []
}

响应包含不透明的 qrcode 标识,以及用于生成二维码的 URL qrcode_img_content。随后轮询 GET /ilink/bot/get_qrcode_status?qrcode=<opaque-id>,直到进入终止状态。遇到 验证挑战时,可通过 verify_code 查询参数提交验证码。

字段类型说明
statusstringwaitscanedneed_verifycodeverify_code_blockedexpiredscaned_but_redirectbinded_redirectconfirmed
bot_tokenstring?确认后返回的 bot 凭据
ilink_bot_idstring?确认后必需的账号 ID
baseurlstring?账号 API 基础 URL
ilink_user_idstring?扫码用户 ID
redirect_hoststring?scaned_but_redirect 返回的新轮询主机

鉴权完成后,channel 启动时调用 /ilink/bot/msg/notifystart,停止时调用 /ilink/bot/msg/notifystop。两者均接收标准 base_info 请求体,并返回 以下结构:

json
{
  "ret": 0,
  "errmsg": ""
}

二维码标识、验证码、bot token、账号 ID、用户 ID 和 context token 均属敏感 信息,不要在日志或示例中写入真实值。

getUpdates

长轮询接口。服务端在有新消息或超时后返回。

请求体:

json
{
  "get_updates_buf": ""
}
字段类型说明
get_updates_bufstring上次响应返回的同步游标,首次请求传空字符串

响应体:

json
{
  "ret": 0,
  "msgs": [],
  "get_updates_buf": "<新游标>",
  "longpolling_timeout_ms": 35000
}
字段类型说明
retnumber返回码,0 = 成功
errcodenumber?错误码(如 -14 = token 失效)
errmsgstring?错误描述
msgsWeixinMessage[]消息列表(结构见下方)
get_updates_bufstring新的同步游标,下次请求时回传
longpolling_timeout_msnumber?服务端建议的下次长轮询超时(ms)

sendMessage

发送一条消息给用户。

请求体:

json
{
  "msg": {
    "to_user_id": "<目标用户 ID>",
    "context_token": "<会话上下文令牌>",
    "item_list": [
      {
        "type": 1,
        "text_item": { "text": "你好" }
      }
    ]
  }
}

响应体:

json
{
  "ret": 0,
  "errmsg": ""
}

getUploadUrl

获取 CDN 上传预签名参数。上传文件前需先调用此接口获取 upload_paramthumb_upload_param

请求体:

json
{
  "filekey": "<文件标识>",
  "media_type": 1,
  "to_user_id": "<目标用户 ID>",
  "rawsize": 12345,
  "rawfilemd5": "<明文 MD5>",
  "filesize": 12352,
  "no_need_thumb": true,
  "aeskey": "<32 位十六进制 AES 密钥>"
}
字段类型说明
filekeystring本次上传的文件标识
media_typenumber1 = IMAGE、2 = VIDEO、3 = FILE、4 = VOICE
to_user_idstring目标用户 ID
rawsizenumber原文件明文大小
rawfilemd5string原文件明文 MD5
filesizenumberAES-128-ECB 加密后的密文大小
no_need_thumbboolean?设为 true 时不请求缩略图上传参数
aeskeystring?32 位十六进制 AES-128 密钥
thumb_rawsizenumber?请求缩略图时的明文大小
thumb_rawfilemd5string?请求缩略图时的明文 MD5
thumb_filesizenumber?请求缩略图时的密文大小

响应体:

json
{
  "upload_param": "<原图上传加密参数>",
  "upload_full_url": "https://cdn.example.test/upload",
  "thumb_upload_param": "<可选的缩略图上传参数>"
}
字段类型说明
upload_paramstring?用于构造 CDN 上传 URL 的参数
upload_full_urlstring?完整 CDN 上传 URL;优先于 upload_param
thumb_upload_paramstring?可选的缩略图上传参数

getConfig

获取账号配置,包括 typing ticket。

请求体:

json
{
  "ilink_user_id": "<用户 ID>",
  "context_token": "<可选,会话上下文令牌>"
}

响应体:

json
{
  "ret": 0,
  "errmsg": "",
  "typing_ticket": "<base64 编码的 typing ticket>"
}

sendTyping

发送或取消输入状态指示。

请求体:

json
{
  "ilink_user_id": "<用户 ID>",
  "typing_ticket": "<从 getConfig 获取>",
  "status": 1
}
字段类型说明
statusnumber1 = 正在输入,2 = 取消输入

响应体:

json
{
  "ret": 0,
  "errmsg": ""
}

消息结构

WeixinMessage

字段类型说明
seqnumber?消息序列号
message_idnumber?消息唯一 ID
from_user_idstring?发送者 ID
to_user_idstring?接收者 ID
client_idstring?客户端生成的消息 ID
create_time_msnumber?创建时间戳(ms)
update_time_msnumber?更新时间戳(ms)
delete_time_msnumber?删除时间戳(ms)
session_idstring?会话 ID
group_idstring?群组 ID
message_typenumber?1 = USER, 2 = BOT
message_statenumber?0 = NEW, 1 = GENERATING, 2 = FINISH
item_listMessageItem[]?消息内容列表
context_tokenstring?会话上下文令牌,回复时需回传
run_idstring?生成回复对应的 OpenClaw run ID

MessageItem

字段类型说明
typenumber1 TEXT、2 IMAGE、3 VOICE、4 FILE、5 VIDEO、11 TOOL_CALL_START、12 TOOL_CALL_RESULT
create_time_msnumber?条目创建时间戳
update_time_msnumber?条目更新时间戳
is_completedboolean?进度条目是否完成
msg_idstring?条目消息 ID
text_item{ text: string }?文本内容
image_itemImageItem?图片(含 CDN 引用和 AES 密钥)
voice_itemVoiceItem?语音(SILK 编码)
file_itemFileItem?文件附件
video_itemVideoItem?视频
ref_msgRefMessage?引用消息
tool_call_start_item{ tool_name?: string; tool_call_id?: string }?工具调用信息
tool_call_result_item{ tool_name?: string; tool_call_id?: string; status?: string }?工具完成信息

嵌套条目结构

结构字段
RefMessagemessage_item?: MessageItemtitle?: string
ImageItemmedia?: CDNMediathumb_media?: CDNMediaaeskey?: stringurl?: stringmid_size?: numberthumb_size?: numberthumb_height?: numberthumb_width?: numberhd_size?: number
VoiceItemmedia?: CDNMediaencode_type?: numberbits_per_sample?: numbersample_rate?: numberplaytime?: numbertext?: string
FileItemmedia?: CDNMediafile_name?: stringmd5?: stringlen?: string
VideoItemmedia?: CDNMediavideo_size?: numberplay_length?: numbervideo_md5?: stringthumb_media?: CDNMediathumb_size?: numberthumb_height?: numberthumb_width?: number
ToolCallStartItemtool_name?: stringtool_call_id?: string
ToolCallResultItemtool_name?: stringtool_call_id?: stringstatus?: string

CDN 媒体引用 (CDNMedia)

所有媒体类型(图片/语音/文件/视频)通过 CDN 传输,使用 AES-128-ECB 加密:

字段类型说明
encrypt_query_paramstring?CDN 下载/上传的加密参数
aes_keystring?base64 编码的 AES-128 密钥
encrypt_typenumber?加密元数据模式
full_urlstring?后端返回的完整下载 URL

CDN 上传流程

  1. 计算文件明文大小、MD5,以及 AES-128-ECB 加密后的密文大小
  2. 如需缩略图(图片/视频),同样计算缩略图的明文和密文参数
  3. 调用 getUploadUrl 获取 upload_full_urlupload_param(以及可选的 thumb_upload_param
  4. 使用 AES-128-ECB 加密文件内容,以 application/octet-stream 通过 POST 上传到 CDN URL
  5. 需要缩略图时,同理加密并上传
  6. 从 CDN 响应读取 x-encrypted-param,作为 CDNMedia 引用中的 encrypt_query_param
  7. 将引用放入 MessageItem 后发送