OpenClaw 微信渠道插件接入指南:扫码登录、多账号管理与 ilink 后端 API 协议详解

📅 发布时间:2026/10/10 11:48:59
OpenClaw 微信渠道插件接入指南:扫码登录、多账号管理与 ilink 后端 API 协议详解
人工智能AI 应用AI Agent交互助手MCP Clients本地部署【免费下载链接】CodePilotA multi-model AI agent desktop client — connect any AI provider, extend with MCP skills, control from your phone. Built with Electron Next.js.项目地址https://gitcode.com/gh_mirrors/co0dep/CodePilot点击查看免费下载本指南以 CodePilot 仓库中收录的微信 OpenClaw 渠道插件包tencent-weixin/openclaw-weixin位于 资料/weixin-openclaw-package/package为核心系统讲解如何在 OpenClaw 网关中安装、启用微信渠道完成扫码登录与多账号管理并深入剖析插件与后端网关之间的 HTTP JSON API 协议getUpdates 长轮询、sendMessage、getUploadUrl、getConfig、sendTyping及 CDN 媒体加密上传链路。读完本文你将能够独立完成微信渠道的接入部署并为对接自有后端或二次开发渠道插件奠定协议基础。插件概览基于长轮询的微信渠道实现tencent-weixin/openclaw-weixin是一个 OpenClaw 渠道插件channel plugin插件 ID 为openclaw-weixin。它通过「上游长轮询拉取 下游主动发送」的模型接入微信上游inbound调用getUpdates长轮询接口持续获取微信用户发来的新消息见 src/api/api.ts下游outbound通过sendMessage接口把 AI 回复推送给用户支持文本、图片、视频、文件等媒体见 src/messaging/send.ts。从 src/channel.ts 的插件声明可以看到该渠道支持direct单聊会话类型具备媒体收发能力capabilities.media: true并提供了针对 Agent 的提示词约定发送图片/文件时通过message工具的media字段传入本地绝对路径或 HTTPS 远程 URL而to字段由会话上下文自动推导。在消息下发层面插件默认将模型输出的 Markdown 转换为微信可读的纯文本剥离代码块围栏、移除图片语法、保留链接显示文本、把表格转换为空格分隔的文本行markdownToPlainText并设置了单条文本 4000 字符的分片上限textChunkLimit: 4000。安装插件一键安装与手动安装前提条件需要已安装 OpenClaw 且openclawCLI 命令可用。插件的运行环境要求 Node.js 22见 package.json。一键安装npx -y tencent-weixin/openclaw-weixin-cli install该命令由配套的 CLI 包完成插件安装、启用与初始化的全流程适合大多数场景。手动安装如果一键安装不适用例如网络受限或需要自定义安装路径可以按以下步骤手动操作1. 安装插件openclaw plugins install tencent-weixin/openclaw-weixin从 package.json 的openclaw.install字段可见插件的 npm 包名为tencent-weixin/openclaw-weixin安装默认来源为 npm。2. 启用插件openclaw config set plugins.entries.openclaw-weixin.enabled true3. 扫码登录openclaw channels login --channel openclaw-weixin终端会显示一个二维码用手机微信扫码并在手机上确认授权。确认后登录凭证会自动保存到本地无需额外操作。4. 重启 gatewayopenclaw gateway restart重启后网关会重新加载插件配置与账号数据微信渠道开始生效。注意在 accounts.ts 中triggerWeixinChannelReload是一个 no-op 桩函数配置热加载依赖openclaw gateway restart完成因此重启步骤不可省略。扫码登录的底层实现openclaw channels login命令背后走的是 ilink 协议的两阶段流程实现见 src/auth/login-qr.ts获取二维码向ilink/bot/get_bot_qrcode?bot_type3发起请求拿到qrcode用于轮询状态的标识和qrcode_img_content二维码内容/URL随后用qrcode-terminal在终端渲染二维码长轮询状态每 1 秒轮询一次ilink/bot/get_qrcode_status?qrcodeqrcode状态机依次经历wait等待扫码→scaned已扫码等待确认→confirmed确认成功返回bot_token、ilink_bot_id、baseurl、ilink_user_id→expired二维码过期。几个值得注意的实现细节登录会话ActiveLogin的有效期为 5 分钟ACTIVE_LOGIN_TTL_MS超时后自动清理二维码过期后可自动刷新最多刷新 3 次MAX_QR_REFRESH_COUNT超过上限则放弃本次登录整个等待流程默认超时上限为 480 秒8 分钟登录成功后原始ilink_bot_id形如hexim.bot会被normalizeAccountId规范化为文件系统安全的账号键形如hex-im-bot凭证以{token, baseUrl, userId, savedAt}结构写入状态目录下openclaw-weixin/accounts/{accountId}.json文件权限设为0600见 src/auth/accounts.ts默认网关地址为https://ilinkai.weixin.qq.comDEFAULT_BASE_URLCDN 基址为https://novac2c.cdn.weixin.qq.com/c2cCDN_BASE_URL。添加更多微信账号与多账号上下文隔离添加更多账号openclaw channels login --channel openclaw-weixin每次扫码登录都会创建一个新的账号条目以独立的accountId.json凭证文件形式持久化因此支持多个微信号同时在线。多账号状态下channels.openclaw-weixin.accounts.accountId可作为每个账号的独立配置段。多账号上下文隔离默认情况下所有渠道的 AI 会话共享同一个上下文。如果希望每个微信账号的对话上下文相互隔离执行openclaw config set agents.mode per-channel-per-peer这样每个「微信账号 发消息用户」组合都会拥有独立的 AI 记忆账号之间不会串台。账号相关的配置项插件的配置 schema 由 Zod 定义见 src/config/config-schema.ts可通过openclaw config set设置配置路径类型说明channels.openclaw-weixin.enabledboolean是否启用插件默认启用channels.openclaw-weixin.namestring账号显示名称channels.openclaw-weixin.baseUrlstring后端 API 网关地址默认https://ilinkai.weixin.qq.comchannels.openclaw-weixin.cdnBaseUrlstringCDN 上传/下载基址默认https://novac2c.cdn.weixin.qq.com/c2cchannels.openclaw-weixin.routeTagnumber可选路由标签SKRouteTag用于多路由环境channels.openclaw-weixin.logUploadUrlstring日志上传地址供openclaw openclaw-weixin logs-upload命令使用channels.openclaw-weixin.accounts.id.*object多账号场景下每个账号独立的同名配置段注意token不写入配置文件而是保存在凭证文件中避免泄露。后端 API 协议通用请求头与鉴权插件通过 HTTP JSON API 与后端网关通信。二次开发者若需对接自有后端需要实现以下接口。所有接口均为POST请求和响应均为 JSON。通用请求头Header说明Content-Typeapplication/jsonAuthorizationType固定值ilink_bot_tokenAuthorizationBearer token登录后获取X-WECHAT-UIN随机 uint32 的 base64 编码对照源码 api.ts这些请求头的实际构造逻辑如下X-WECHAT-UIN用crypto.randomBytes(4).readUInt32BE(0)生成随机 uint32转十进制字符串后再做 base64 编码每次请求都会重新生成请求体统一附带base_info对象包含channel_version字段取自插件 package.json 的 version读取失败时降级为unknown若在配置中设置了routeTag请求头还会追加SKRouteTag。接口列表接口路径说明getUpdatesgetupdates长轮询获取新消息sendMessagesendmessage发送消息文本/图片/视频/文件getUploadUrlgetuploadurl获取 CDN 上传预签名 URLgetConfiggetconfig获取账号配置typing ticket 等sendTypingsendtyping发送/取消输入状态指示结合源码可知这些路径的实际端点前缀为ilink/bot/即完整路径为ilink/bot/getupdates、ilink/bot/sendmessage、ilink/bot/getuploadurl、ilink/bot/getconfig、ilink/bot/sendtyping。getUpdates长轮询接口服务端在有新消息或超时后返回。插件侧默认长轮询超时为 35000ms若客户端先超时AbortError插件会返回一个空的ret: 0响应并立即重试这是长轮询的正常行为见 api.ts。请求体{ get_updates_buf: }字段类型说明get_updates_bufstring上次响应返回的同步游标首次请求传空字符串响应体{ ret: 0, msgs: [...], get_updates_buf: 新游标, longpolling_timeout_ms: 35000 }字段类型说明retnumber返回码0 成功errcodenumber?错误码如-14 会话超时errmsgstring?错误描述msgsWeixinMessage[]消息列表结构见下方get_updates_bufstring新的同步游标下次请求时回传longpolling_timeout_msnumber?服务端建议的下次长轮询超时msget_updates_buf游标会被插件持久化到本地文件openclaw-weixin/accounts/{accountId}.sync.json见 src/storage/sync-buf.ts网关重启后从磁盘恢复游标继续拉取避免消息丢失或重复。sendMessage发送一条消息给用户。请求体{ msg: { to_user_id: 目标用户 ID, context_token: 会话上下文令牌, item_list: [ { type: 1, text_item: { text: 你好 } } ] } }从 send.ts 的实现看插件在构建发送请求时还会填充from_user_id空串、client_id形如openclaw-weixin-随机串作为幂等/回执标识、message_type2 BOT与message_state2 FINISH并把服务端下发的context_token原样回传——该令牌是维持多轮会话关联的关键缺失会导致回复无法归属到正确会话。getUploadUrl获取 CDN 上传预签名参数。上传文件前需先调用此接口获取upload_param和thumb_upload_param。请求体{ filekey: 文件标识, media_type: 1, to_user_id: 目标用户 ID, rawsize: 12345, rawfilemd5: 明文 MD5, filesize: 12352, thumb_rawsize: 1024, thumb_rawfilemd5: 缩略图明文 MD5, thumb_filesize: 1040 }字段类型说明media_typenumber1 IMAGE,2 VIDEO,3 FILErawsizenumber原文件明文大小rawfilemd5string原文件明文 MD5filesizenumberAES-128-ECB 加密后的密文大小thumb_rawsizenumber?缩略图明文大小IMAGE/VIDEO 时必填thumb_rawfilemd5string?缩略图明文 MD5IMAGE/VIDEO 时必填thumb_filesizenumber?缩略图密文大小IMAGE/VIDEO 时必填对照 types.ts请求体还支持可选字段no_need_thumb不需要缩略图上传 URL默认 false与aeskey加密 key。media_type枚举在源码中实际还包含4 VOICE。响应体{ upload_param: 原图上传加密参数, thumb_upload_param: 缩略图上传加密参数 }getConfig获取账号配置包括 typing ticket。请求体{ ilink_user_id: 用户 ID, context_token: 可选会话上下文令牌 }响应体{ ret: 0, typing_ticket: base64 编码的 typing ticket }sendTyping发送或取消输入状态指示。请求体{ ilink_user_id: 用户 ID, typing_ticket: 从 getConfig 获取, status: 1 }字段类型说明statusnumber1 正在输入2 取消输入typing_ticket需要先通过getConfig获取并随请求回传用于向微信端呈现「对方正在输入」状态。消息结构WeixinMessage 与 MessageItemWeixinMessage统一消息对象对应 protoWeixinMessage完整字段定义见 src/api/types.ts字段类型说明seqnumber?消息序列号message_idnumber?消息唯一 IDfrom_user_idstring?发送者 IDto_user_idstring?接收者 IDcreate_time_msnumber?创建时间戳mssession_idstring?会话 IDmessage_typenumber?1 USER,2 BOTmessage_statenumber?0 NEW,1 GENERATING,2 FINISHitem_listMessageItem[]?消息内容列表context_tokenstring?会话上下文令牌回复时需回传源码中该结构还包含client_id、group_id、update_time_ms、delete_time_ms等可选字段用于消息去重、群聊归属与消息状态追踪。MessageItem单条消息内容单元字段类型说明typenumber1TEXT,2IMAGE,3VOICE,4FILE,5VIDEOtext_item{ text: string }?文本内容image_itemImageItem?图片含 CDN 引用和 AES 密钥voice_itemVoiceItem?语音SILK 编码file_itemFileItem?文件附件video_itemVideoItem?视频ref_msgRefMessage?引用消息各子结构的关键字段源码 types.tsImageItemmedia原图 CDN 引用、thumb_media缩略图引用、aeskey16 字节 AES-128 密钥的 hex 字符串入站解密优先使用、url、mid_size、thumb_size等尺寸字段VoiceItemencode_type1pcm2adpcm3feature4speex5amr6silk7mp38ogg-speex、sample_rate、playtime语音长度 ms、text语音转文字内容FileItemfile_name、md5、len字节数字符串类型VideoItemvideo_size密文字节数、play_length、video_md5、thumb_media及缩略图尺寸RefMessagemessage_item被引用消息的内容单元与title摘要。CDN 媒体引用 (CDNMedia)所有媒体类型图片/语音/文件/视频通过 CDN 传输使用 AES-128-ECB 加密字段类型说明encrypt_query_paramstring?CDN 下载/上传的加密参数aes_keystring?base64 编码的 AES-128 密钥源码中还包含encrypt_type字段0 只加密 fileid1 打包缩略图/中图等信息。插件在发送媒体消息时统一使用encrypt_type: 1并把 AES 密钥以 base64 编码放进media.aes_key。CDN 上传流程AES-128-ECB 加密与预签名上传完整的媒体发送链路如下计算文件明文大小、MD5以及 AES-128-ECB 加密后的密文大小如需缩略图图片/视频同样计算缩略图的明文和密文参数调用getUploadUrl获取upload_param和thumb_upload_param使用 AES-128-ECB 加密文件内容PUT 上传到 CDN URL缩略图同理加密并上传使用返回的encrypt_query_param构造CDNMedia引用放入MessageItem发送加密实现位于 src/cdn/aes-ecb.ts使用 Node.js 内置crypto.createCipheriv(aes-128-ecb, key, null)即 AES-128 密钥配合 ECB 分组模式填充方式为 PKCS7Node 默认密文大小按 16 字节分块向上取整aesEcbPaddedSize(n) Math.ceil((n 1) / 16) * 16这也是getUploadUrl请求体中filesize密文大小与rawsize明文大小存在差异的原因。发送媒体时插件支持两种来源见 channel.ts本地文件路径含file://与相对路径相对路径基于进程 cwd 解析和远程 HTTPS URL插件先下载到/tmp/openclaw/weixin/media/outbound-temp再上传。下载后的 CDN 引用会封装进ImageItem/VideoItem/FileItem的media字段随sendMessage下发。扩展开发指引与注意事项类型与调用参考完整的类型定义见 src/api/types.tsAPI 调用实现见 src/api/api.ts媒体发送与 CDN 上传见 src/messaging/send.ts、src/cdn 目录错误处理errcode: -14表示会话超时需要重新建立会话长轮询客户端的超时不应视为错误应返回空结果后重试sendMessage等常规 API 默认超时 15 秒getConfig/sendTyping等轻量请求默认超时 10 秒会话令牌纪律context_token是消息归属会话的凭据回复消息必须回传插件在缺失context_token时会拒绝发送防止串会话多账号存储布局账号凭证、同步游标统一存放在 OpenClaw 状态目录的openclaw-weixin/子目录下accounts.json为账号索引、accounts/{id}.json为凭证、accounts/{id}.sync.json为游标并兼容旧版单账号安装的路径回退见 src/storage/sync-buf.ts配置变更生效修改插件配置后需要执行openclaw gateway restart使配置重新加载。通过上述安装、登录、多账号与协议对接能力你可以快速把微信接入 OpenClaw 网关让任意已配置的 AI 模型通过微信渠道与用户对话并在此基础上扩展自有后端或定制媒体处理流程。赞分享人工智能AI 应用AI Agent交互助手MCP Clients本地部署【免费下载链接】CodePilotA multi-model AI agent desktop client — connect any AI provider, extend with MCP skills, control from your phone. Built with Electron Next.js.项目地址https://gitcode.com/gh_mirrors/co0dep/CodePilot点击查看免费下载相关推荐OpenClaw 微信渠道插件openclaw-weixin接入指南二维码登录、多账号隔离与后端 API 协议详解OpenClaw 微信渠道插件openclaw weixin接入指南二维码登录、多账号隔离与后端 API 协议详解 本文以开源仓库 gh_mirrors/人工智能AI 应用AI Agent交互助手MCP Clients本地部署PicoClaw 微信个人号渠道Weixin接入指南基于腾讯 iLink API 的扫码登录、配置与消息收发原理PicoClaw 微信个人号渠道Weixin接入指南基于腾讯 iLink API 的扫码登录、配置与消息收发原理 本篇指南围绕 PicoClaw 的微信个人工智能AI 应用AI Agent交互助手工具调用MCP ClientsAgent 记忆PicoClaw 微信个人号渠道接入指南基于腾讯 iLink API 的扫码登录、配置与消息收发全解析PicoClaw 微信个人号渠道接入指南基于腾讯 iLink API 的扫码登录、配置与消息收发全解析 导读 本文围绕 PicoClaw 项目中 docs/c人工智能AI 应用AI Agent交互助手工具调用MCP ClientsAgent 记忆上一篇如何让旧Mac重获新生OpenCore Legacy Patcher完全指南下一篇CodePilot 的 Markdown 数据层与 Artifact 表现层从文件授权、HTML 沙箱到表现层导出的完整实现解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考