×

注意!页面内容来自https://developer.work.weixin.qq.com/document/path/101463,本站不储存任何内容,为了更好的阅读体验进行在线解析,若有广告出现,请及时反馈。若您觉得侵犯了您的利益,请通知我们进行删除,然后访问 原网页

<>body { margin: 0; -webkit-font-smoothing: antialiased; font-family: system-ui-apple-systemSegoe UIRobotoUbuntuCantarellNoto Sanssans-serifBlinkMacSystemFontHelveticaPingFang SCSCHeitiMicrosoft YaHeisans-serifApple Color EmojiSegoe UI EmojiSegoe UI SymbolNoto Color Emoji; } .ep-root { --ep-layout-biztop-height: 65px; } @media screen and (max-width: 1220px) { .assistant_header { display: none; } .ep-root { --ep-layout-biztop-height: 0px; } } .head_stage { position: fixed; top: 0; left: 0; right: 0; border-bottom: 1px solid var(--ww_base_gray_007); z-index: 50; user-select: none; background: var(--ww_base_white); } .head_cnt { padding: 16px 30px; margin: 0 auto; display: flex; align-items: center; white-space: nowrap; justify-content: space-between; position: relative; } .head_link { position: absolute; left: 0; bottom: 0; top: 0; width: 120px; z-index: 1; } .head_logo { display: block; width: 120px; height: 30px; } .head_title { margin-right: 14px; font-size: 21px; color: #0082EF; text-decoration: none; font-: normal; font-weight: 500; line-height: 100%; letter-spacing: 0.315px; line-height: 34px; position: relative; margin-left: 15px; padding-left: 16px; } .head_title:hover { text-decoration: none; } .head_title::before { content: " "; display: inline-block; position: absolute; left: 0; top: 9px; width: 1px; height: 16px; background-color: #0082f0; } .head_left { display: flex; align-items: center; } .head_right { display: flex; justify-content: flex-end; } .head_cnt_nav { transition: all 0.15s; display: flex; margin: 0 auto; align-items: center; white-space: nowrap; top: 65px; z-index: 60; margin-right: 50px; background: var(--ww_base_white); } .head_cnt_nav .nav_item { font-size: 16px; color: var(--ww_base_gray_100); margin-left: 16px; align-items: center; justify-content: center; display: flex; width: 60px; height: 100%; cursor: pointer; &[active] { position: relative; color: var(--ww_accent_blue); } } .head_cnt_nav .nav_item_active { position: absolute; width: 40px; height: 2px; background: var(--ww_accent_blue); left: 10px; bottom: -14px; } .head_actions { flex: 1; display: flex; align-items: center; justify-content: flex-end; position: relative; } .head_actions .head_actions_icon { margin-right: 16px; cursor: pointer; } .head_login { width: 90px; height: 30px; box-sizing: border-box; font-weight: 400; font-size: 15px; line-height: 30px; text-align: center; color: var(--ww_accent_blue); border: 1px solid var(--ww_accent_blue); border-radius: 2px; cursor: pointer; } .search { height: 34px; margin-right: 16px; position: relative; z-index: 2; } .search .search-placeholder { height: 34px; align-items: center; justify-content: center; display: flex; } .search .search-icon { display: inline-block; background-image: url(https://wwcdn.weixin.qq.com/node/wework/images/202201061753.bd4d6ef977.svg); background-size: 20px 20px; background-position: center center; background-repeat: no-repeat; cursor: pointer; width: 20px; height: 34px; }
企业内部开发
基础
连接微信
办公
会议
会议统计管理
企业内部开发
服务端API
消息接收与发送
智能机器人
智能机器人长连接
智能机器人长连接
最后更新:2026/03/24

目录

  • 概述
  •       通过部署SDK建立长连接
  •       长连接与短连接(Webhook)方式对比
  •       适用场景
  •       整体交互流程
  • 长连接配置说明
  •       开启长连接 API 模式
  •       获取凭证
  • 建立长连接
  •       WebSocket 连接地址
  •       连接数量限制
  •       连接建立流程
  •       订阅请求
  • 接收消息回调
  •       消息推送格式
  •       支持的消息类型
  •       多媒体资源解密
  • 接收事件回调
  •       事件推送格式
  •       支持的事件类型
  •             连接断开事件格式示例
  • 回复消息
  •       回复欢迎语
  •       回复普通消息
  •             流式消息回复机制
  •       更新模板卡片
  • 主动推送消息
  •       请求格式
  •       响应格式
  •       消息类型格式说明
  •             markdown消息
  •             模板卡片消息
  •             文件消息
  •             图片消息
  •             语音消息
  •             视频消息
  • 保持心跳
  •       心跳机制说明
  •       心跳请求
  • 上传临时素材
  •       注意事项
  •       流程图
  •       上传初始化
  •       上传分片
  •       上传结束
  • 概述

    通过部署SDK建立长连接

    语言下载地址
    Node.aibot-node-sdk
    Pythonaibot-python-sdk

    长连接与短连接(Webhook)方式对比

    智能机器人支持两种 API 模式接收消息回调:

    特性Webhook(短连接)WebSocket(长连接)
    连接方式每次回调建立新连接复用已建立的长连接
    延迟较高(每次需建连)低(复用连接)
    实时性一般
    服务端要求需要公网可访问的 URL无需固定的公网 IP
    加解密需要对消息加解密无需加解密
    复杂度较高(需维护心跳)
    可靠性高(无状态)需要心跳保活、断线重连
    适用场景普通回调场景高实时性要求、无固定公网 IP 场景

    适用场景

    推荐使用 WebSocket 长连接方式的场景:

    • 无公网 IP:开发者服务部署在内网环境,无法配置公网可访问的回调 URL
    • 高实时性要求:需要更低的消息延迟
    • 简化开发:无需处理消息加解密逻辑

    整体交互流程

    长连接模式的交互流程如下:

    <>#mermaid-91c905254ea044b689e709e369371e31-1774321874758 {font-family:sans-serif;font-size:16px;fill:#333;}#mermaid-91c905254ea044b689e709e369371e31-1774321874758 .error-icon{fill:#552222;}#mermaid-91c905254ea044b689e709e369371e31-1774321874758 .error-text{fill:#552222;stroke:#552222;}#mermaid-91c905254ea044b689e709e369371e31-1774321874758 .edge-thickness-normal{stroke-width:2px;}#mermaid-91c905254ea044b689e709e369371e31-1774321874758 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-91c905254ea044b689e709e369371e31-1774321874758 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-91c905254ea044b689e709e369371e31-1774321874758 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-91c905254ea044b689e709e369371e31-1774321874758 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-91c905254ea044b689e709e369371e31-1774321874758 .marker{fill:#333333;stroke:#333333;}#mermaid-91c905254ea044b689e709e369371e31-1774321874758 .marker.cross{stroke:#333333;}#mermaid-91c905254ea044b689e709e369371e31-1774321874758 svg{font-family:sans-serif;font-size:16px;}#mermaid-91c905254ea044b689e709e369371e31-1774321874758 .actor{stroke:hsl(259.626168224359.7765363128%87.9019607843%);fill:#ECECFF;}#mermaid-91c905254ea044b689e709e369371e31-1774321874758 text.actor>tspan{fill:black;stroke:none;}#mermaid-91c905254ea044b689e709e369371e31-1774321874758 .actor-line{stroke:grey;}#mermaid-91c905254ea044b689e709e369371e31-1774321874758 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-91c905254ea044b689e709e369371e31-1774321874758 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-91c905254ea044b689e709e369371e31-1774321874758 #arrowhead path{fill:#333;stroke:#333;}#mermaid-91c905254ea044b689e709e369371e31-1774321874758 .sequenceNumber{fill:white;}#mermaid-91c905254ea044b689e709e369371e31-1774321874758 #sequencenumber{fill:#333;}#mermaid-91c905254ea044b689e709e369371e31-1774321874758 #crosshead path{fill:#333;stroke:#333;}#mermaid-91c905254ea044b689e709e369371e31-1774321874758 .messageText{fill:#333;stroke:#333;}#mermaid-91c905254ea044b689e709e369371e31-1774321874758 .labelBox{stroke:hsl(259.626168224359.7765363128%87.9019607843%);fill:#ECECFF;}#mermaid-91c905254ea044b689e709e369371e31-1774321874758 .labelText,#mermaid-91c905254ea044b689e709e369371e31-1774321874758 .labelText>tspan{fill:black;stroke:none;}#mermaid-91c905254ea044b689e709e369371e31-1774321874758 .loopText,#mermaid-91c905254ea044b689e709e369371e31-1774321874758 .loopText>tspan{fill:black;stroke:none;}#mermaid-91c905254ea044b689e709e369371e31-1774321874758 .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.626168224359.7765363128%87.9019607843%);fill:hsl(259.626168224359.7765363128%87.9019607843%);}#mermaid-91c905254ea044b689e709e369371e31-1774321874758 .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-91c905254ea044b689e709e369371e31-1774321874758 .noteText,#mermaid-91c905254ea044b689e709e369371e31-1774321874758 .noteText>tspan{fill:black;stroke:none;}#mermaid-91c905254ea044b689e709e369371e31-1774321874758 .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-91c905254ea044b689e709e369371e31-1774321874758 .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-91c905254ea044b689e709e369371e31-1774321874758 .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-91c905254ea044b689e709e369371e31-1774321874758 .label foreignObject{font-size:90%;overflow:visible;}#mermaid-91c905254ea044b689e709e369371e31-1774321874758 .label{font-family:sans-serif;}#mermaid-91c905254ea044b689e709e369371e31-1774321874758 :root{--mermaid-font-family:sans-serif;}#mermaid-91c905254ea044b689e709e369371e31-1774321874758 :root{--mermaid-alt-font-family:sans-serif;}开发者服务企业微信用户连接建立阶段建立WebSocket连接 (aibot_subscribe)1连接建立成功2进入会话事件进入机器人会话3事件回调 (aibot_event_callback)4回复欢迎语 (aibot_respond_welcome_msg)5展示欢迎消息6消息回调与流式消息@机器人发消息7消息回调 (aibot_msg_callback)8回复流式消息 (aibot_respond_msgfinish=false)9展示流式消息10更新流式内容 (aibot_respond_msgfinish=false)11更新流式消息12loop[开发者主动推送更新]完成流式消息 (aibot_respond_msgfinish=true)13展示最终消息14模板卡片交互点击模板卡片按钮15事件回调 (aibot_event_callback)16更新卡片 (aibot_respond_update_msg)17展示更新后的卡片18主动推送消息(无回调触发)主动推送消息 (aibot_send_msg)19展示推送消息20心跳保活ping21pong22loop[定时心跳]开发者服务企业微信用户

    流程说明:

    1. 连接建立阶段:开发者服务使用 BotID 和 Secret 向企业微信发起 WebSocket 连接请求(aibot_subscribe),连接建立成功后保持长连接状态
    2. 进入会话事件:用户首次进入机器人单聊会话时,企业微信推送事件回调(aibot_event_callback),开发者可回复欢迎语(aibot_respond_welcome_msg)
    3. 消息回调与流式消息:用户在群聊中@机器人或向机器人发送单聊消息时,企业微信推送消息回调(aibot_msg_callback)。与「设置接收消息 URL」模式不同,长连接模式下不再有流式刷新回调,开发者需主动推送流式更新内容,直到设置 finish=true 结束流式消息
    4. 模板卡片交互:用户点击模板卡片按钮时,企业微信推送事件回调(aibot_event_callback),开发者可更新卡片内容(aibot_respond_update_msg)
    5. 主动推送消息:开发者可在没有用户消息触发的情况下,通过 aibot_send_msg 主动向用户或群聊推送消息,适用于定时提醒、异步任务通知、告警推送等场景
    6. 心跳保活:开发者需定期发送心跳(ping)保持连接活跃,建议间隔 30 秒

    长连接配置说明

    开启长连接 API 模式

    在企业微信管理后台,进入智能机器人的配置页面,开启「API 模式」并选择「长连接」方式:

    企业微信截图_4df4a527-66cd-4422-85e2-62ab51f5e0b6.png

    获取凭证

    开启长连接 API 模式后,需要获取以下凭证用于建立连接:

    凭证说明
    BotID智能机器人的唯一标识,用于标识机器人身份
    Secret长连接专用密钥,用于身份校验
    注意
    - Secret 是长连接专用的密钥,与设置接收消息回调地址模式的 Token/EncodingAESKey 不同
    - 请妥善保管 Secret,避免泄露
    - 模式切换影响:API 模式只能选择一种方式(长连接或设置接收消息回调地址),切换到「设置接收消息回调地址」模式会导致现有长连接失效;反之,从「设置接收消息回调地址」切换到「长连接」模式后,原有的回调地址将不再生效

    建立长连接

    WebSocket 连接地址

    wss://openws.work.weixin.qq.com

    连接数量限制

    每个智能机器人同一时间只能保持一个有效的长连接。当同一个机器人发起新的连接请求并完成订阅(aibot_subscribe)时,新连接会踢掉旧连接,旧连接将被服务端主动断开。

    注意
    - 开发者需要在业务层面避免同一机器人建立多个长连接
    - 如果需要实现高可用,建议采用主备切换模式而非同时多连接
    - 旧连接被踢掉时,开发者会收到连接断开事件

    连接建立流程

    建立长连接的完整流程:

    <>#mermaid-6c6676cad73e67b9bbf098558b66e316-1774321874775 {font-family:sans-serif;font-size:16px;fill:#333;}#mermaid-6c6676cad73e67b9bbf098558b66e316-1774321874775 .error-icon{fill:#552222;}#mermaid-6c6676cad73e67b9bbf098558b66e316-1774321874775 .error-text{fill:#552222;stroke:#552222;}#mermaid-6c6676cad73e67b9bbf098558b66e316-1774321874775 .edge-thickness-normal{stroke-width:2px;}#mermaid-6c6676cad73e67b9bbf098558b66e316-1774321874775 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-6c6676cad73e67b9bbf098558b66e316-1774321874775 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-6c6676cad73e67b9bbf098558b66e316-1774321874775 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-6c6676cad73e67b9bbf098558b66e316-1774321874775 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-6c6676cad73e67b9bbf098558b66e316-1774321874775 .marker{fill:#333333;stroke:#333333;}#mermaid-6c6676cad73e67b9bbf098558b66e316-1774321874775 .marker.cross{stroke:#333333;}#mermaid-6c6676cad73e67b9bbf098558b66e316-1774321874775 svg{font-family:sans-serif;font-size:16px;}#mermaid-6c6676cad73e67b9bbf098558b66e316-1774321874775 .actor{stroke:hsl(259.626168224359.7765363128%87.9019607843%);fill:#ECECFF;}#mermaid-6c6676cad73e67b9bbf098558b66e316-1774321874775 text.actor>tspan{fill:black;stroke:none;}#mermaid-6c6676cad73e67b9bbf098558b66e316-1774321874775 .actor-line{stroke:grey;}#mermaid-6c6676cad73e67b9bbf098558b66e316-1774321874775 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-6c6676cad73e67b9bbf098558b66e316-1774321874775 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-6c6676cad73e67b9bbf098558b66e316-1774321874775 #arrowhead path{fill:#333;stroke:#333;}#mermaid-6c6676cad73e67b9bbf098558b66e316-1774321874775 .sequenceNumber{fill:white;}#mermaid-6c6676cad73e67b9bbf098558b66e316-1774321874775 #sequencenumber{fill:#333;}#mermaid-6c6676cad73e67b9bbf098558b66e316-1774321874775 #crosshead path{fill:#333;stroke:#333;}#mermaid-6c6676cad73e67b9bbf098558b66e316-1774321874775 .messageText{fill:#333;stroke:#333;}#mermaid-6c6676cad73e67b9bbf098558b66e316-1774321874775 .labelBox{stroke:hsl(259.626168224359.7765363128%87.9019607843%);fill:#ECECFF;}#mermaid-6c6676cad73e67b9bbf098558b66e316-1774321874775 .labelText,#mermaid-6c6676cad73e67b9bbf098558b66e316-1774321874775 .labelText>tspan{fill:black;stroke:none;}#mermaid-6c6676cad73e67b9bbf098558b66e316-1774321874775 .loopText,#mermaid-6c6676cad73e67b9bbf098558b66e316-1774321874775 .loopText>tspan{fill:black;stroke:none;}#mermaid-6c6676cad73e67b9bbf098558b66e316-1774321874775 .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.626168224359.7765363128%87.9019607843%);fill:hsl(259.626168224359.7765363128%87.9019607843%);}#mermaid-6c6676cad73e67b9bbf098558b66e316-1774321874775 .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-6c6676cad73e67b9bbf098558b66e316-1774321874775 .noteText,#mermaid-6c6676cad73e67b9bbf098558b66e316-1774321874775 .noteText>tspan{fill:black;stroke:none;}#mermaid-6c6676cad73e67b9bbf098558b66e316-1774321874775 .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-6c6676cad73e67b9bbf098558b66e316-1774321874775 .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-6c6676cad73e67b9bbf098558b66e316-1774321874775 .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-6c6676cad73e67b9bbf098558b66e316-1774321874775 .label foreignObject{font-size:90%;overflow:visible;}#mermaid-6c6676cad73e67b9bbf098558b66e316-1774321874775 .label{font-family:sans-serif;}#mermaid-6c6676cad73e67b9bbf098558b66e316-1774321874775 :root{--mermaid-font-family:sans-serif;}#mermaid-6c6676cad73e67b9bbf098558b66e316-1774321874775 :root{--mermaid-alt-font-family:sans-serif;}开发者服务企业微信1. 发起 WebSocket 连接wss://openws.work.weixin.qq.com12. WebSocket 握手成功23. 发送订阅请求 (aibot_subscribe)携带 BotID 和 Secret34. 校验凭证5. 返回订阅结果4连接建立完成,开始接收回调开发者服务企业微信

    订阅请求

    WebSocket 连接建立后,需要发送订阅请求(aibot_subscribe)进行身份校验。

    注意:该请求有频率保护,订阅成功后应避免反复请求,否则可能触发系统限制。

    请求示例:

    {
        "cmd": "aibot_subscribe",
        "headers": {
            "req_id": "REQUEST_ID"
        },
        "body": {
            "bot_id": "BOTID",
            "secret": "SECRET"
        }
    }

    请求字段说明:

    字段类型必填说明
    cmdstring命令类型,固定值 aibot_subscribe
    headers.req_idstring请求唯一标识,由开发者自行生成,用于关联请求和响应
    body.bot_idstring智能机器人的 BotID,获取方法参考配置说明
    body.secretstring长连接专用密钥 Secret,获取方法参考配置说明

    响应示例:

    {
        "headers": {
            "req_id": "REQUEST_ID"
        },
        "errcode": 0,
        "errmsg": "ok"
    }

    响应字段说明:

    字段类型说明
    headers.req_idstring透传请求中的 req_id
    errcodeint错误码,0 表示成功
    errmsgstring错误信息,成功时为 "ok"

    接收消息回调

    用户向智能机器人发送消息时,企业微信会通过长连接推送消息回调(aibot_msg_callback)。

    消息推送格式

    请求示例(文本消息):

    {
        "cmd": "aibot_msg_callback",
        "headers": {
            "req_id": "REQUEST_ID"
        },
        "body": {
            "msgid": "MSGID",
            "aibotid": "AIBOTID",
            "chatid": "CHATID",
            "chattype": "group",
            "from": {
                "userid": "USERID"
            },
            "msgtype": "text",
            "text": {
                "content": "@RobotA hello robot"
            }
        }
    }

    请求字段说明:

    字段类型说明
    cmdstring命令类型,固定值 aibot_msg_callback
    headers.req_idstring请求唯一标识,回复消息时需透传
    body.msgidstring本次回调的唯一性标志,用于事件排重
    body.aibotidstring智能机器人 BotID
    body.chatidstring会话 ID,仅群聊类型时返回
    body.chattypestring会话类型,single 单聊 / group 群聊
    body.from.useridstring消息发送者的 userid
    body.msgtypestring消息类型

    支持的消息类型

    长连接模式支持以下消息类型的回调:

    消息类型msgtype说明
    文本消息text用户发送的文本内容
    图片消息image用户发送的图片,仅支持单聊
    图文混排mixed用户发送的图文混排内容
    语音消息voice用户发送的语音(转为文本),仅支持单聊
    文件消息file用户发送的文件,仅支持单聊
    视频消息video用户发送的视频,仅支持单聊
    说明:各消息类型的 body 结构与设置接收消息回调地址模式一致,详细字段请参考对应链接。

    多媒体资源解密

    长连接模式下,imagefilevideo 结构体中会额外返回解密密钥 aeskey,用于解密下载的资源文件:

    图片结构体示例:

    {
        "image": {
            "url": "URL",
            "aeskey": "AESKEY"
        }
    }

    文件结构体示例:

    {
        "file": {
            "url": "URL",
            "aeskey": "AESKEY"
        }
    }

    视频结构体示例:

    {
        "video": {
            "url": "URL",
            "aeskey": "AESKEY"
        }
    }
    字段类型说明
    urlstring资源下载地址,5 分钟内有效
    aeskeystring解密密钥,每个下载链接的 aeskey 唯一
    注意
    - 每个 URL 对应的 aeskey 都是唯一的,不同于设置接收消息回调地址模式使用统一的 EncodingAESKey
    - 加密方式:AES-256-CBC,数据采用 PKCS#7 填充至 32 字节的倍数
    - IV 初始向量大小为 16 字节,取 aeskey 前 16 字节

    接收事件回调

    用户与智能机器人发生交互时,企业微信会通过长连接推送事件回调(aibot_event_callback)。

    事件推送格式

    请求示例(进入会话事件):

    {
        "cmd": "aibot_event_callback",
        "headers": {
            "req_id": "REQUEST_ID"
        },
        "body": {
            "msgid": "MSGID",
            "create_time": 1700000000,
            "aibotid": "AIBOTID",
            "from": {
                "userid": "USERID"
            },
            "msgtype": "event",
            "event": {
                "eventtype": "enter_chat"
            }
        }
    }

    请求字段说明:

    字段类型说明
    cmdstring命令类型,固定值 aibot_event_callback
    headers.req_idstring请求唯一标识,回复消息时需透传
    body.msgidstring本次回调的唯一性标志,用于事件排重
    body.create_timeint事件产生的时间戳
    body.aibotidstring智能机器人 BotID
    body.chatidstring会话 ID,仅群聊类型时返回
    body.chattypestring会话类型,single 单聊 / group 群聊
    body.from.useridstring事件触发者的 userid
    body.msgtypestring消息类型,事件回调固定为 event
    body.event.eventtypestring事件类型

    支持的事件类型

    长连接模式支持以下事件类型的回调:

    事件类型eventtype说明
    进入会话事件enter_chat用户当天首次进入机器人单聊会话
    模板卡片事件template_card_event用户点击模板卡片按钮
    用户反馈事件feedback_event用户对机器人回复进行反馈
    连接断开事件disconnected_event当有新连接建立时,系统会给旧连接发送该事件并且主动断开旧连接

    连接断开事件格式示例

    {
        "cmd": "aibot_event_callback",
        "headers": {
            "req_id": "REQUEST_ID"
        },
        "body": {
            "msgid": "MSGID",
            "create_time": 1700000000,
            "aibotid": "AIBOTID",
            "msgtype": "event",
            "event": {
                "eventtype": "disconnected_event"
            }
        }
    }

    连接断开事件字段说明:

    字段类型说明
    cmdstring命令类型,固定值 aibot_event_callback
    headers.req_idstring请求唯一标识,回复消息时需透传
    body.msgidstring本次回调的唯一性标志,用于事件排重
    body.create_timeint事件产生的时间戳
    body.aibotidstring智能机器人 BotID
    body.msgtypestring消息类型,事件回调固定为 event
    body.event.eventtypestring此时固定为disconnected_event
    说明:除连接断开事件外,其他各事件类型的 body 结构与设置接收消息回调地址模式一致,详细字段请参考对应链接。

    回复消息

    收到消息回调或事件回调后,开发者可通过长连接主动回复消息。

    回复欢迎语

    收到进入会话事件(enter_chat)后,开发者可使用 aibot_respond_welcome_msg 命令回复欢迎语。

    请求示例(文本欢迎语):

    {
        "cmd": "aibot_respond_welcome_msg",
        "headers": {
            "req_id": "REQUEST_ID"
        },
        "body": {
            "msgtype": "text",
            "text": {
                "content": "您好!我是智能助手,有什么可以帮您的吗?"
            }
        }
    }

    请求字段说明:

    字段类型必填说明
    cmdstring命令类型,固定值 aibot_respond_welcome_msg
    headers.req_idstring透传事件回调中的 req_id
    bodyobject消息内容,详见回复欢迎语

    响应示例:

    {
        "headers": {
            "req_id": "REQUEST_ID"
        },
        "errcode": 0,
        "errmsg": "ok"
    }
    注意
    - 该命令仅适用于进入会话事件,其他事件类型不支持
    - 收到事件回调后需在 5 秒内 发送回复,超时将无法发送欢迎语

    回复普通消息

    收到消息回调(aibot_msg_callback)后,开发者可使用 aibot_respond_msg 命令回复消息。支持流式消息、模板卡片、流式消息和模板卡片组合消息、markdown、文件消息、语音消息、图片消息和视频消息。

    模板卡片、markdown、文件消息、语音消息、图片消息和视频消息的消息格式参考支持的消息类型

    频率限制:收到消息回调后,24 小时内可以往该会话回复消息。 无论是回复还是主动推送消息,总共给某个会话发消息的限制为 30 条/分钟,1000 条/小时。

    流式消息回复机制

    流式消息的发送和刷新通过 stream.id 进行关联:

    • 发送流式消息:首次使用某个 stream.id 回复时,会创建一条新的流式消息
    • 刷新流式消息:继续使用相同的 stream.id 推送时,会更新该流式消息的内容
    • 完成流式消息:设置 finish=true 结束流式消息,消息将不再可更新
    注意:从流式消息发送开始,需在 6 分钟内 完成所有刷新并设置 finish=true,否则消息将自动结束。

    两种模式的流式刷新方式对比:

    模式刷新方式说明
    设置接收消息地址回调轮询企业微信通过轮询回调开发者的接收消息地址来获取流式消息的刷新内容
    长连接主动推送开发者服务主动通过长连接推送流式刷新消息,无需等待回调

    流式消息交互流程:

    <>#mermaid-7a24f1d09f10e003227b75ea4f106689-1774321874779 {font-family:sans-serif;font-size:16px;fill:#333;}#mermaid-7a24f1d09f10e003227b75ea4f106689-1774321874779 .error-icon{fill:#552222;}#mermaid-7a24f1d09f10e003227b75ea4f106689-1774321874779 .error-text{fill:#552222;stroke:#552222;}#mermaid-7a24f1d09f10e003227b75ea4f106689-1774321874779 .edge-thickness-normal{stroke-width:2px;}#mermaid-7a24f1d09f10e003227b75ea4f106689-1774321874779 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-7a24f1d09f10e003227b75ea4f106689-1774321874779 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-7a24f1d09f10e003227b75ea4f106689-1774321874779 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-7a24f1d09f10e003227b75ea4f106689-1774321874779 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-7a24f1d09f10e003227b75ea4f106689-1774321874779 .marker{fill:#333333;stroke:#333333;}#mermaid-7a24f1d09f10e003227b75ea4f106689-1774321874779 .marker.cross{stroke:#333333;}#mermaid-7a24f1d09f10e003227b75ea4f106689-1774321874779 svg{font-family:sans-serif;font-size:16px;}#mermaid-7a24f1d09f10e003227b75ea4f106689-1774321874779 .actor{stroke:hsl(259.626168224359.7765363128%87.9019607843%);fill:#ECECFF;}#mermaid-7a24f1d09f10e003227b75ea4f106689-1774321874779 text.actor>tspan{fill:black;stroke:none;}#mermaid-7a24f1d09f10e003227b75ea4f106689-1774321874779 .actor-line{stroke:grey;}#mermaid-7a24f1d09f10e003227b75ea4f106689-1774321874779 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-7a24f1d09f10e003227b75ea4f106689-1774321874779 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-7a24f1d09f10e003227b75ea4f106689-1774321874779 #arrowhead path{fill:#333;stroke:#333;}#mermaid-7a24f1d09f10e003227b75ea4f106689-1774321874779 .sequenceNumber{fill:white;}#mermaid-7a24f1d09f10e003227b75ea4f106689-1774321874779 #sequencenumber{fill:#333;}#mermaid-7a24f1d09f10e003227b75ea4f106689-1774321874779 #crosshead path{fill:#333;stroke:#333;}#mermaid-7a24f1d09f10e003227b75ea4f106689-1774321874779 .messageText{fill:#333;stroke:#333;}#mermaid-7a24f1d09f10e003227b75ea4f106689-1774321874779 .labelBox{stroke:hsl(259.626168224359.7765363128%87.9019607843%);fill:#ECECFF;}#mermaid-7a24f1d09f10e003227b75ea4f106689-1774321874779 .labelText,#mermaid-7a24f1d09f10e003227b75ea4f106689-1774321874779 .labelText>tspan{fill:black;stroke:none;}#mermaid-7a24f1d09f10e003227b75ea4f106689-1774321874779 .loopText,#mermaid-7a24f1d09f10e003227b75ea4f106689-1774321874779 .loopText>tspan{fill:black;stroke:none;}#mermaid-7a24f1d09f10e003227b75ea4f106689-1774321874779 .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.626168224359.7765363128%87.9019607843%);fill:hsl(259.626168224359.7765363128%87.9019607843%);}#mermaid-7a24f1d09f10e003227b75ea4f106689-1774321874779 .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-7a24f1d09f10e003227b75ea4f106689-1774321874779 .noteText,#mermaid-7a24f1d09f10e003227b75ea4f106689-1774321874779 .noteText>tspan{fill:black;stroke:none;}#mermaid-7a24f1d09f10e003227b75ea4f106689-1774321874779 .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-7a24f1d09f10e003227b75ea4f106689-1774321874779 .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-7a24f1d09f10e003227b75ea4f106689-1774321874779 .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-7a24f1d09f10e003227b75ea4f106689-1774321874779 .label foreignObject{font-size:90%;overflow:visible;}#mermaid-7a24f1d09f10e003227b75ea4f106689-1774321874779 .label{font-family:sans-serif;}#mermaid-7a24f1d09f10e003227b75ea4f106689-1774321874779 :root{--mermaid-font-family:sans-serif;}#mermaid-7a24f1d09f10e003227b75ea4f106689-1774321874779 :root{--mermaid-alt-font-family:sans-serif;}开发者服务企业微信用户@机器人发消息1aibot_msg_callback (req_id=xxx)2生成唯一的 stream.idaibot_respond_msg (req_id=xxx)(stream.id=abcfinish=false)content="正在查询..."3首次使用该 stream.id创建新的流式消息展示流式消息4aibot_respond_msg (req_id=xxx)(stream.id=abcfinish=false)content="广州今日天气:29度..."5继续使用相同 stream.id刷新消息内容更新流式消息6aibot_respond_msg (req_id=xxx)(stream.id=abcfinish=false)content="广州今日天气:29度,多云,降雨概率60%..."7更新流式消息8aibot_respond_msg (req_id=xxx)(stream.id=abcfinish=true)content="广州今日天气:29度,多云,降雨概率60%,建议携带雨具。"9finish=true流式消息结束展示最终消息106分钟超时限制:从首次发送开始计时开发者服务企业微信用户
    说明:在长连接模式下,针对同一次消息回调的所有流式消息回复(包括首次发送和后续刷新),都需要使用回调中相同的 req_idreq_id 用于关联回调请求与响应,stream.id 用于标识同一条流式消息。

    请求示例(流式消息回复):

    {
        "cmd": "aibot_respond_msg",
        "headers": {
            "req_id": "REQUEST_ID"
        },
        "body": {
            "msgtype": "stream",
            "stream": {
                "id": "STREAMID",
                "finish": false,
                "content": "正在为您查询天气信息..."
            }
        }
    }

    请求字段说明:

    字段类型必填说明
    cmdstring命令类型,固定值 aibot_respond_msg
    headers.req_idstring透传消息回调中的 req_id
    bodyobject消息内容,详见回复用户消息中的流式消息和模块卡片消息
    不支持流式消息+模板卡片的组合消息
    注意:目前暂不支持 msg_item 字段。

    响应示例:

    {
        "headers": {
            "req_id": "REQUEST_ID"
        },
        "errcode": 0,
        "errmsg": "ok"
    }

     

    更新模板卡片

    收到模板卡片点击事件(template_card_event)后,开发者可使用 aibot_respond_update_msg 命令更新卡片内容。

    请求示例:

    {
        "cmd": "aibot_respond_update_msg",
        "headers": {
            "req_id": "REQUEST_ID"
        },
        "body": {
            "response_type": "update_template_card",
            "template_card": {
                "card_type": "button_interaction",
                "main_title": {
                    "title": "xx系统告警",
                    "desc": "服务器CPU使用率超过90%"
                },
                "button_list": [
                    {
                        "text": "确认中",
                        "": 1,
                        "key": "confirm"
                    },
                    {
                        "text": "误报",
                        "": 2,
                        "key": "false_alarm"
                    }
                ],
                "task_id": "TASK_ID",
                "feedback": {
                    "id": "FEEDBACKID"
                }
            }
        }
    }

    请求字段说明:

    字段类型必填说明
    cmdstring命令类型,固定值 aibot_respond_update_msg
    headers.req_idstring透传事件回调中的 req_id
    bodyobject消息内容,详见更新模板卡片

    响应示例:

    {
        "headers": {
            "req_id": "REQUEST_ID"
        },
        "errcode": 0,
        "errmsg": "ok"
    }
    注意
    - 该命令仅适用于模板卡片点击事件,其他事件类型不支持
    - 收到事件回调后需在 5 秒内 发送回复,超时将无法更新卡片

    主动推送消息

    在某些场景下,开发者需要在没有用户消息触发的情况下,主动向用户或群聊推送消息。例如:

    • 定时提醒:定时推送日报、周报、待办提醒等
    • 异步任务通知:后台任务完成后主动通知用户结果
    • 告警推送:系统监控告警主动推送给相关人员

    长连接模式支持通过 aibot_send_msg 命令主动推送消息,无需依赖消息回调。特殊的,需要用户在会话中给机器人发消息,后续机器人才能主动推送消息给对应会话中

    频率限制
    无论是回复还是主动推送消息,总共给某个会话发消息的限制为 30 条/分钟,1000 条/小时。

    请求格式

    请求示例(markdown 消息):

    {
        "cmd": "aibot_send_msg",
        "headers": {
            "req_id": "REQUEST_ID"
        },
        "body": {
            "chatid": "CHATID",
            "chat_type": 1,
            "msgtype": "markdown",
            "markdown": {
                "content": "这是一条**主动推送**的消息"
            }
        }
    }

    请求字段说明:

    字段类型必填说明
    cmdstring命令类型,固定值 aibot_send_msg
    headers.req_idstring请求唯一标识,由开发者自行生成,用于关联请求和响应
    body.chatidstring会话 ID,支持单聊和群聊。单聊填用户的 userid,群聊填对应群聊相关回调事件中获取的chatid
    body.chat_typeuint32会话类型,用于指定 chatid 的解析方式。1:单聊(用户 userid);2:群聊;0 或不填:兼容单聊/群聊类型,优先按照群聊会话类型去发送消息,建议开发者设置具体的单聊或者群聊来使用
    body.msgtypestring消息类型,支持 template_card(模板卡片)、markdown
    body.template_cardobject模板卡片内容,msgtype 为 template_card 时必填
    body.markdownobjectmarkdown 消息内容,msgtype 为 markdown 时必填

    响应格式

    响应示例:

    {
        "headers": {
            "req_id": "REQUEST_ID"
        },
        "errcode": 0,
        "errmsg": "ok"
    }

    响应字段说明:

    字段类型说明
    headers.req_idstring透传请求中的 req_id
    errcodeint错误码,0 表示成功
    errmsgstring错误信息,成功时为 "ok"

    消息类型格式说明

    消息类型msgtype说明
    模板卡片template_card模板卡片消息,详见模板卡片
    MarkdownmarkdownMarkdown 格式消息,详见markdown
    文件消息file普通文件消息,详见文件消息
    图片消息image图片消息,详见图片消息
    语音消息voice语音消息,详见语音消息
    视频消息video视频消息,详见视频消息

    markdown消息

    {
        "msgtype": "markdown",
        "markdown": {
            "content": "# 一、标题\n## 二级标题\n### 三级标题\n# 二、字体\n*斜体*\n\n**加粗**\n# 三、列表 \n- 无序列表 1 \n- 无序列表 2\n  - 无序列表 2.1\n  - 无序列表 2.2\n1. 有序列表 1\n2. 有序列表 2\n# 四、引用\n> 一级引用\n>>二级引用\n>>>三级引用\n# 五、链接\n[这是一个链接](https:work.weixin.qq.com\/api\/doc)\n![](https://res.mail.qq.com/node/ww/wwopenmng/images/independent/doc/test_pic_msg1.png)\n# 六、分割线\n\n---\n# 七、代码\n`这是行内代码`\n```\n这是独立代码块\n```\n\n# 八、表格\n| 姓名 | 文化衫尺寸 | 收货地址 |\n| :----- | :----: | -------: |\n| 张三 | S | 广州 |\n| 李四 | L | 深圳 |\n",
            "feedback": {
                "id": "FEEDBACKID"
            }
        }
    }

    参数说明:

    参数类型是否必填说明
    msgtypeString消息类型,此时固定为:markdown
    markdown.contentString消息内容,最长不超过20480个字节,必须是utf8编码。
    markdown.feedback.idString若字段不为空值,回复的消息被用户反馈时候会触发回调事件。有效长度为 256 字节以内,必须是 utf-8 编码。
    content字段支持常见的markdown格式

    模板卡片消息

    {
        "msgtype": "template_card",
        "template_card": {
            "feedback": {
                "id": "FEEDBACKID"
            }
        }
    }

    参数说明:

    参数类型是否必填说明
    msgtypeString消息类型,此时固定为:template_card
    template_cardObject模板卡片结构体,参考模板卡片类型中类型说明
    template_card.feedback.idString若字段不为空值,回复的消息被用户反馈时候会触发回调事件。有效长度为 256 字节以内,必须是 utf-8 编码。

    文件消息

    请求示例:

    {
       "msgtype": "file",
       "file" : {
            "media_id" : "1Yv-zXfHjSjU-7LH-GwtYqDGS-zz6w22KmWAT5COgP7o"
       }
    }

    参数说明:

    参数是否必须说明
    msgtype消息类型,此时固定为:file
    media_id文件id,可以调用上传临时素材接口获取

    图片消息

    请求示例:

    {
        "msgtype":"image",
       "image" : {
            "media_id" : "MEDIA_ID"
       }
    }

    请求参数:

    参数是否必须说明
    msgtype消息类型,此时固定为:image
    media_id图片媒体文件id,可以调用上传临时素材接口获取

    语音消息

    请求示例:

    {
       "msgtype" : "voice",
       "voice" : {
            "media_id" : "MEDIA_ID"
       }
    }

    参数说明:

    参数是否必须说明
    msgtype消息类型,此时固定为:voice
    media_id语音文件id,可以调用上传临时素材接口获取

    视频消息

    请求示例:

    {
      "msgtype": "video",
      "video": {
        "media_id": "MEDIA_ID",
        "title": "Title",
        "description": "Description"
      }
    }

    参数说明:

    参数是否必须说明
    msgtype消息类型,此时固定为:video
    media_id视频媒体文件id,可以调用上传临时素材接口获取
    title视频消息的标题,不超过64个字节,超过会自动截断
    description视频消息的描述,不超过512个字节,超过会自动截断

     

    保持心跳

    连接建立成功后,开发者需定期发送心跳请求(ping)保持连接活跃,防止连接被服务端主动断开。

    心跳机制说明

    • 心跳间隔:建议每 30 秒 发送一次心跳
    • 超时断开:若长时间未收到心跳,服务端会主动断开连接
    • 断线重连:开发者需实现断线检测和自动重连机制

    心跳请求

    请求示例:

    {
        "cmd": "ping",
        "headers": {
            "req_id": "REQUEST_ID"
        }
    }

    请求字段说明:

    字段类型必填说明
    cmdstring命令类型,固定值 ping
    headers.req_idstring请求唯一标识,由开发者自行生成

    响应示例:

    {
        "headers": {
            "req_id": "REQUEST_ID"
        },
        "errcode": 0,
        "errmsg": "ok"
    }

    响应字段说明:

    字段类型说明
    headers.req_idstring透传请求中的 req_id
    errcodeint错误码,0 表示成功
    errmsgstring错误信息,成功时为 "ok"

    上传临时素材


    长连接模式支持通过分片方式上传临时素材。上传流程分为三步:

    1. 初始化上传:获取 upload_id
    2. 逐片上传:按分片发送文件数据
    3. 完成上传:服务端合并分片并返回 media_id

      上传会话有效期为 30 分钟,超时未完成的上传会话将自动清理。单个分片不能超过 512KB(Base64 编码前),最多支持 100 个分片。

    注意事项

    1. 上传会话有效期:初始化后 30 分钟内需完成所有分片上传并调用完成接口,超时后会话自动失效
    2. 分片幂等:同一分片重复上传会被自动忽略,不会报错
    3. 分片顺序:分片可以乱序上传,服务端会按 chunk_index 顺序合并
    4. MD5 校验:建议在初始化时提供文件 MD5,服务端会在合并后校验完整性
    5. 安全校验:每个请求都会校验当前连接的机器人身份,不同机器人无法操作同一个上传会话
    6. 断线重传:如果连接断开后重连,只要上传会话未过期,可以继续上传未完成的分片
    7. 有效期:上传的临时素材有效期为3天
    8. 频率限制:单个智能机器人上传频率不能超过30次/分钟和1000次/小时

    流程图

    enter image description here

    上传初始化


    请求示例:

    {
      "cmd": "aibot_upload_media_init",
      "headers": {
        "req_id": "REQUEST_ID"
      },
      "body": {
        "type": "file",
        "filename": "test.pdf",
        "total_size": 2333,
        "total_chunks": 124,
        "md5": "jgieosgmiesmgienogieisjgoegeo"
      }
    }

    请求字段说明:

    字段类型必填说明
    cmdstring命令类型,固定值 aibot_upload_media_init
    headers.req_idstring请求唯一标识,由开发者自行生成,不超过256字节
    body.typestring文件类型,支持普通文件(file),图片(image),语音(voice)和视频(video)
    body.filenamestring文件名,不超过256字节
    body.total_sizeint文件总大小,最少5个字节。图片文件不超过2MB,语音文件不超过2MB,视频文件不超过10MB,普通文件不超过20MB
    body.total_chunksint分片数量,不超100个分片
    body.md5string文件md5
    图片文件支持png、jpg/jpeg和gif格式;语音文件支持amr格式;视频文件支持mp4格式

     

    响应示例:

    {
      "headers": {
        "req_id": "REQUEST_ID"
      },
      "body": {
        "upload_id": "UPLOADID"
      },
      "errcode": 0,
      "errmsg": "ok"
    }

    响应字段说明:

    字段类型说明
    headers.req_idstring透传请求中的 req_id
    body.upload_idstring本次上传操作的id,用于将所有分片关联起来
    errcodeint错误码,0 表示成功
    errmsgstring错误信息,成功时为 "ok"

    上传分片


    逐片上传文件数据。分片可以乱序上传,重复上传同一分片会被自动忽略(幂等)。

    请求示例:

    {
      "cmd": "aibot_upload_media_chunk",
      "headers": {
        "req_id": "REQUEST_ID"
      },
      "body": {
        "upload_id": "UPLOADID",
        "chunk_index": 1,
        "base64_data": "JGNEIOGJGE"
      }
    }

    请求字段说明:

    字段类型必填说明
    cmdstring命令类型,固定值 aibot_upload_media_chunk
    headers.req_idstring请求唯一标识,由开发者自行生成,不超过256字节
    body.upload_idstring上传id,初始化时由企业微信服务器返回
    body.chunk_indexstring分片的序号,从0开始
    body.base64_datastring分片内容经过base64 encode后的数据


    响应示例:

    {
      "headers": {
        "req_id": "REQUEST_ID"
      },
      "errcode": 0,
      "errmsg": "ok"
    }

    响应字段说明:

    字段类型说明
    headers.req_idstring透传请求中的 req_id
    errcodeint错误码,0 表示成功
    errmsgstring错误信息,成功时为 "ok"

     

    上传结束


    所有分片上传完成后,调用此接口通知服务端合并分片。服务端会校验所有分片是否齐全、文件 MD5 是否匹配,然后返回 media_id

    请求示例:

    {
      "cmd": "aibot_upload_media_finish",
      "headers": {
        "req_id": "REQUEST_ID"
      },
      "body": {
        "upload_id": "UPLOADID"
      }
    }

    请求字段说明:

    字段类型必填说明
    cmdstring命令类型,固定值 aibot_upload_media_finish
    headers.req_idstring请求唯一标识,由开发者自行生成
    body.upload_idstring上传id,初始化时由企业微信服务器返回


    响应示例:

    {
      "headers": {
        "req_id": "REQUEST_ID"
      },
      "body": {
        "type": "file",
        "media_id": "1G6nrLmr5EC3MMb_-zK1dDdzmd0p7cNliYu9V5w7o8K0",
        "created_at": "1380000000"
      },
      "errcode": 0,
      "errmsg": "ok"
    }

    响应字段说明:

    字段类型说明
    headers.req_idstring透传请求中的 req_id
    body.typestring文件类型
    body.media_idstring媒体文件上传后获取的唯一标识,3天内有效
    body.created_atint媒体文件上传时间戳
    errcodeint错误码,0 表示成功
    errmsgstring错误信息,成功时为 "ok"
    上一篇主动回复消息
    下一篇API模式机器人文档使用说明
      本节内容
    服务端API
    基础
    连接微信
    办公
    会议
    会议统计管理
    客户端API
    小程序
    基础
    连接微信
    办公
    JS-SDK
    基础
    连接微信
    办公
    消息推送(原“群机器人”)
    更新日志
    联系我们