Skip to content

WeChat Bot 集成深度分析

ZCode 的微信 Bot 集成是通过 ilink(iLink AI) 平台实现的长轮询消息通道。


一、Bot 系统架构总览

ZCode 支持 4 种 Bot 提供商

mermaid
graph TB
    subgraph ZCode["ZCode Bot Runtime"]
        BR["BotsRepo<br/>bot-config.json"]
        BS["BotsState<br/>bot-state.v2.json"]
        BMC["BotsModelCacheRepo<br/>bots-model-cache.v2.json"]

        subgraph Runtimes["运行时"]
        WXR["Weixin Long Polling<br/>30s 轮询"]
        TGR["Telegram Long Polling"]
        FSR["Feishu WebSocket"]
        WHR["Webhook"]
        end
    end

    subgraph Providers["外部平台"]
        ILINK["ilinkai.weixin.qq.com<br/>微信 iLink"]
        TG["Telegram API<br/>api.telegram.org"]
        FS["飞书 Feishu<br/>WebSocket"]
        WEB["自定义 Webhook"]
    end

    WXR <-->|"AES-128-ECB"| ILINK
    TGR <-->|"Bot Token"| TG
    FSR <-->|"WebSocket"| FS
    WHR <-->|"HTTP POST"| WEB

    BR --> Runtimes
    BS --> Runtimes
    BMC --> Runtimes

二、WeChat Bot 信令通道

2.1 通道参数

参数说明
平台 URLhttps://ilinkai.weixin.qq.comiLink AI 微信开放平台
API 路径/ilink/botBot 消息接口
协议版本2.0.0iLink 协议版本
消息版本2消息格式版本
附件版本2附件格式版本
加密算法AES-128-ECB附件加密
轮询超时30 秒长轮询等待超时
错误重试3 次最多重试次数
消息队列120 条最大等待消息数

2.2 长轮询 vs 推送

mermaid
sequenceDiagram
    participant User as 微信用户
    participant WeChat as 微信 iLink
    participant Bot as ZCode Bot
    participant AI as ZCode Agent

    Note over Bot,WeChat: 长轮询模式 (ZCode 主动拉取)
    loop 每 30 秒
        Bot->>WeChat: POST /ilink/bot (含 buf 游标)
        WeChat-->>Bot: 200 (无消息时等待 30s)
    end

    User->>WeChat: 发送消息 "帮我写个代码"
    Bot->>WeChat: POST /ilink/bot (长轮询)
    WeChat-->>Bot: {messages: [...], buf: "new_cursor"}

    Bot->>Bot: AES-128-ECB 解密附件
    Bot->>Bot: 解析文本/命令
    Bot->>AI: 调用 Agent 处理
    AI-->>Bot: 回复内容

    Bot->>WeChat: POST /ilink/bot (回复消息)
    WeChat-->>User: 回复 "好的,正在处理..."

三、消息格式详解

3.1 轮询请求

javascript
// 每次轮询检查新消息
POST https://ilinkai.weixin.qq.com/ilink/bot
Headers: {
    "Authorization": "Bearer <weixin_bot_token>"
}

// 请求体
{
    "botId": "bot_xxx_123",             // Bot ID
    "messages": [{
        "id": "msg_001",                // 消息 ID
        "text": "帮我写个 Python 脚本",  // 消息文本
        "from": "weixin_user_abc",      // 发送用户 ID
        "chatId": "chat_group_xyz",     // 群聊/私聊 ID
        "displayName": "张三",           // 用户昵称
        "context_token": "ctx_token",   // 上下文 token
        "attachments": []               // 附件列表
    }],
    "buf": "cursor_abc_123"             // 轮询游标(增量标记)
}

3.2 消息解析

javascript
// source: host/index.js — weixin 消息解析流程
// 文本消息 → 解析为 { botId, text, actor }
{
    botId: "bot_xxx",
    text: "/help",
    actor: {
        provider: "weixin",
        botId: "bot_xxx",
        providerUserId: "weixin_user_abc",
        displayName: "张三",
        chatType: "private" | "group",
        chatId: "chat_group_xyz",
        providerMessageId: "msg_001",
        providerContextToken: "ctx_token"  // 上下文标记
    }
}

3.3 附件格式

javascript
// 附件对象 (图片等)
{
    id: "weixin-1",                    // 附件编号
    kind: "image",                     // 附件类型: image / file
    filename: "weixin-image-1.jpg",    // 文件名
    mimeType: "image/jpeg",            // MIME 类型
    sizeBytes: 102400,                 // 文件大小
    dataBase64: "...base64...",        // 文件数据 (Base64)
    providerMetadata: {
        weixinAesKey: "aes_key_here"   // AES-128-ECB 加密密钥
    }
}

附件使用 AES-128-ECB 加密,解密后的数据是原始文件内容。


四、Bot 配置与状态管理

4.1 持久化文件

文件路径说明
bot-config.json{dataDir}/Bot 实例配置(哪些 Bot、绑定信息)
bot-state.json{dataDir}/运行时状态(v1 格式)
bot-state.v2.json{dataDir}/运行时状态(v2 格式,当前使用)
bots-model-cache.json{dataDir}/Bot 可用模型缓存(v1)
bots-model-cache.v2.json{dataDir}/Bot 模型缓存(v2)

4.2 Bot 配置 Schema

javascript
// Bot 实例配置结构
{
    bots: [{
        id: "bot_xxx",                 // Bot ID
        provider: "weixin",            // 提供商: weixin / telegram / feishu / webhook
        name: "My WeChat Bot",         // Bot 名称
        enabled: true,                 // 是否启用
        credentialRef: "cred:weixin:token",  // 凭据引用
        webhookSecretRef: "cred:weixin:secret", // Webhook 签名密钥
        allowedWorkspaces: ["/path/to/proj"],   // 允许的工作区
        allowedCommands: ["help", "status", "bind"], // 允许的命令
        replyMode: "reply",            // 回复模式
        bindCode: "ABCD1234",          // 绑定码
    }]
}

4.3 Bot 运行时状态

javascript
// BotState 结构 (persisted to bot-state.v2.json)
{
    version: 2,
    bots: {
        "bot_xxx": {
            // 运行时信息(非持久化)
        }
    }
}

五、Bot 运行时管理

5.1 生命周期

mermaid
stateDiagram-v2
    [*] --> Configured: 配置文件存在
    Configured --> Polling: 启用 + token 有效
    Polling --> Error: 网络失败
    Error --> Polling: 3秒后重试
    Polling --> Idle: 用户禁用
    Idle --> Polling: 用户启用
    Polling --> [*]: 删除 Bot

5.2 Bot 运行时状态值

状态含义
polling长轮询运行中
idle已停止
error轮询失败
disabled用户禁用
connectedWebSocket 已连接 (Feishu)

5.3 Bot 发现与启动

javascript
// source: host/index.js — Bot 运行时启动逻辑
// 读取所有 Bot 配置
let config = await botsRepo.readConfig();

// 按提供商分组启动
for (let bot of config.bots) {
    if (bot.provider === "weixin" && bot.enabled && bot.credentialRef) {
        startWeixinPolling(bot);       // 微信长轮询
    } else if (bot.provider === "telegram" && bot.enabled && bot.credentialRef) {
        startTelegramPolling(bot);     // Telegram 轮询
    } else if (bot.provider === "feishu" && bot.enabled) {
        startFeishuWebSocket(bot);     // 飞书 WebSocket
    }
}

六、支持的命令

mermaid
flowchart LR
    subgraph WeChat["微信消息"]
        TEXT[""帮我写代码""]
        CMD["/help"]
        CMD2["/bind ABCD1234"]
        CMD3["/status"]
    end

    subgraph ZCode["ZCode Bot"]
        PARSE["parseBotCommand()"]
        HELP_H["显示帮助信息"]
        BIND_H["绑定工作区"]
        STATUS_H["状态查询"]
        AI_H["AI 处理"]
    end

    TEXT --> PARSE
    CMD --> PARSE
    CMD2 --> PARSE
    CMD3 --> PARSE

    PARSE -->|"help"| HELP_H
    PARSE -->|"bind"| BIND_H
    PARSE -->|"status"| STATUS_H
    PARSE -->|"unknown"| AI_H
命令功能实现
/help显示帮助信息parseBotCommand 解析 → 回复指令列表
/bind <code>绑定工作区生成绑定码 → 关联微信用户到工作区
/status查看当前状态显示工作区、模型、任务信息
自由文本AI 处理直接调 Agent 处理用户请求

七、三种 Bot 提供商对比

特性WeChat (微信)TelegramFeishu (飞书)
通信方式长轮询 (HTTP)长轮询 (HTTP)WebSocket
加密AES-128-ECB
消息拉取客户端主动拉取客户端主动拉取服务端推送
轮询间隔30 秒取决于 offsetN/A (实时推送)
Token 类型iLink Bot TokenBot TokenApp ID + Secret
附件加密文件文件 ID文件 ID

八、关键代码索引

函数位置说明
BotsRepohost/index.jsBot 配置/状态持久化
BotsModelCacheRepohost/index.js模型缓存管理
parseBotCommand()host/index.js命令解析
weixin polling 循环host/index.jswZ() 长轮询主循环
feishu WebSockethost/index.jsl8() WS 连接管理
telegram pollinghost/index.jshZ() 轮询
readWeixinAttachmentItem()host/index.jsRV() 附件解析
findAuthorizedBot()host/index.jsBot 鉴权
createBindCode()host/index.js绑定码生成
BotAssistantReplyBlockshost/index.js回复块生成

基于 GPL-3.0 协议开源