Calcifer Calcifer 2
Linux

企业微信长连接来了!一套代码生成三平台智能助手,内网也能跑

2026/03/19 00:01 3 次阅读 王梓
打赏
✸ ✸ ✸

🚀 企业微信长连接来了!

一套代码生成三平台智能助手,内网也能跑

📝 干货满满,建议先收藏再看!

🔥 重磅更新

企业微信 5.0.7 版本(2025年3月更新)正式支持智能机器人 API 模式长连接

这是企业微信近3年来最大规模的更新之一,开发者终于可以无需公网IP、无需域名,直接通过 WebSocket 长连接接入智能机器人!

无需公网IP —— 内网环境也能接入
无需域名备案 —— 省去繁琐配置流程
低延迟响应 —— 消息实时推送,毫秒级到达
流式消息 —— 支持 AI 流式输出,体验更佳

🎉 官方 SDK 支持

企业微信官方提供了两种语言的 SDK,开发者可以快速接入:

Node.js Python 其他语言
aibot-node-sdk aibot-python-sdk 自行实现 WebSocket

创建机器人时选择 "API模式""使用长连接",即可获取 Bot ID 和 Secret!

🏢 真实场景

你是一家 SaaS 服务商,为客户提供智能客服/运维助手服务:

  • 客户 A 用飞书,需要接入飞书机器人
  • 客户 B 用钉钉,需要接入钉钉机器人
  • 客户 C 用企业微信,需要接入企业微信机器人

每个客户都要一套独立的机器人?
🤯 维护成本爆炸?代码重复率 80%?

💡 本文教你用一套核心代码 + 多适配器,优雅搞定多平台接入!

🎯 一、企业微信智能机器人:长连接 vs Webhook

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

📊 两种模式对比 🔗 Webhook 模式 企业微信 开发者服务器 回复 ❌ 需要公网IP ❌ 需要加解密 ❌ 延迟较高 ⚡ 长连接模式 开发者服务器 WebSocket 企业微信 推送 用户 ✅ 无需公网IP ✅ 无需加解密 ✅ 低延迟 📋 详细对比(官方文档) 特性 Webhook 长连接 推荐场景 连接方式 每次建新连接 复用长连接 高实时性 服务端要求 需公网URL 无需公网IP 内网环境 加解密 需要处理 无需处理 简化开发

1.1 为什么选择长连接模式?

对于智能助手场景,长连接模式有明显优势:

  • 🚀 低延迟:复用已建立的长连接,消息实时推送
  • 🔒 更安全:无需暴露公网地址,避免被攻击风险
  • 🛠 更简单:无需处理消息加解密,开发效率提升
  • 📊 更实时:支持流式消息,用户体验更好

1.2 适用场景

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

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

🏗 二、多渠道架构设计

我们的目标是:一套核心代码,支持飞书、钉钉、企业微信三个平台

🏗 多渠道架构设计 📱 IM 平台层 飞书 钉钉 企业微信 🔌 适配器层 (im-adapter-service) 飞书适配器 lark-sdk 钉钉适配器 dingtalk-sdk 企业微信适配器 aibot-python-sdk 统一消息处理 handle_message() 🧠 后端服务层 (ai-assistant-service) 智能分析 日志查询 根因定位 LLM分析 💾 数据层 日志存储 关系数据库 缓存 知识库

2.1 核心设计理念

整个架构遵循"关注点分离"原则:

  • 适配器层:只负责消息收发,不包含业务逻辑
  • 后端服务层:处理所有业务逻辑,与IM平台无关
  • 数据层:存储日志、配置、知识库等

2.2 两个项目的关系

项目 定位 适用场景
chatbot-service 全功能单体应用 开发测试、功能迭代
im-adapter-service 轻量级适配器 生产环境、Kubernetes部署

🔌 三、企业微信长连接实现

🔌 WebSocket 连接流程(官方文档) 开发者服务 1. 建立 WebSocket 连接 wss://openws.work.weixin.qq.com 3. 发送订阅请求 aibot_subscribe 5. 发送心跳 ping (建议30秒) 7. 接收消息回调 aibot_msg_callback 9. 回复消息 aibot_respond_msg 企业微信 2. WebSocket 握手成功 4. 校验凭证,返回结果 6. 心跳响应 pong 8. 推送消息 展示消息给用户 用户 进入机器人会话 @机器人 发消息 收到回复 流式消息展示

3.1 核心代码实现

使用官方 Python SDK 实现企业微信长连接:

# 安装官方 SDK
# pip install aibot-python-sdk

from aibot import AIBot, AIBotOptions

class WeComAdapter:
    def __init__(self, bot_id: str, secret: str, message_handler):
        self.bot = AIBot(AIBotOptions(
            bot_id=bot_id,
            secret=secret,
        ))
        self.message_handler = message_handler
        self._register_handlers()
    
    def _register_handlers(self):
        @self.bot.on("authenticated")
        def on_authenticated():
            logger.info("[WeCom] 认证成功")
        
        @self.bot.on("message.text")
        async def on_text_message(frame):
            await self._handle_text_message(frame)
    
    async def _handle_text_message(self, frame):
        body = frame.get("body", {})
        text_content = body.get("text", {}).get("content", "")
        req_id = frame.get("headers", {}).get("req_id")
        
        response = await self.message_handler(text_content)
        
        await self.bot.respond_msg(req_id, {
            "msgtype": "stream",
            "stream": {
                "id": generate_stream_id(),
                "finish": True,
                "content": response
            }
        })
    
    async def start(self):
        await self.bot.start()

3.2 流式消息机制

流式消息通过 stream.id 进行关联,实现类似 ChatGPT 的打字效果:

📝 流式消息流程

  1. 发送流式消息:首次使用某个 stream.id,创建新的流式消息
  2. 刷新流式消息:继续使用相同的 stream.id,更新消息内容
  3. 完成流式消息:设置 finish=true,消息不再可更新

⚠️ 注意:从首次发送开始,需在 6分钟内 完成所有刷新并设置 finish=true,否则消息将自动结束。

3.3 支持的消息类型

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

消息类型 msgtype 说明
文本消息 text 用户发送的文本内容
图片消息 image 用户发送的图片,仅支持单聊
语音消息 voice 用户发送的语音(转为文本),仅支持单聊
文件消息 file 用户发送的文件,仅支持单聊
视频消息 video 用户发送的视频,仅支持单聊
图文混排 mixed 用户发送的图文混排内容

🚀 四、Kubernetes 部署架构

生产环境采用 单Pod多容器 架构:

🚀 Kubernetes 部署架构 📦 Pod: im-adapter-service 💬 dingtalk-service mode=dingtalk app_key=xxx app_secret=xxx CPU: 200m-500m MEM: 256Mi-512Mi 🏢 wecom-service mode=wecom bot_id=xxx bot_secret=xxx CPU: 200m-500m MEM: 256Mi-512Mi 🐳 共享镜像 im-adapter-service :latest 包含: • app.py • wecom_adapter.py • aibot-python-sdk

4.1 部署优势

  • 📦 镜像复用:一个镜像支持多个平台,减少维护成本
  • ⚖️ 独立扩展:每个容器可独立扩缩容
  • 🔒 故障隔离:一个平台出问题不影响其他平台
  • 📊 资源控制:每个容器有独立的资源限制

4.2 重要注意事项

⚠️ 连接数量限制:每个智能机器人同一时间只能保持一个有效的长连接

当同一个机器人发起新的连接请求时,新连接会踢掉旧连接。如果需要实现高可用,建议采用主备切换模式而非同时多连接。

4.3 频率限制

  • 收到消息回调后,24小时内可以往该会话回复消息
  • 给某个会话发消息的限制:30条/分钟1000条/小时
  • 心跳间隔:建议每 30秒 发送一次

📊 五、数据流详解

一条消息的完整旅程:

📊 消息处理数据流 1 用户发送消息 2 IM平台推送 3 适配器接收 4 消息去重 5 调用后端API 6 LLM分析 7 返回结果 📝 各步骤详解 1. 用户发送消息 用户在飞书/钉钉/企业微信中发送消息 2. IM平台推送 IM平台通过WebSocket推送消息到适配器 3. 适配器接收 适配器解析消息,提取文本内容 4. 消息去重 基于消息ID去重,防止重复处理 5-6. LLM分析 调用大模型进行智能分析 7. 返回结果 流式消息返回给用户

🎉 六、总结

通过本文,我们实现了:

  • 企业微信长连接:无需公网IP,低延迟,更安全
  • 多渠道统一:一套代码支持飞书、钉钉、企业微信
  • Kubernetes部署:单Pod多容器,独立扩展
  • 流式消息:更好的用户体验

🎯 核心收益

开发效率

↑ 50%

消息延迟

↓ 70%

维护成本

↓ 60%

一套代码,三个平台,无限可能

📚 参考链接

💬 有问题?欢迎在评论区留言讨论!

如果这篇文章对你有帮助,别忘了点赞收藏哦!

✸ ✸ ✸

📜 版权声明

本文作者:王梓 | 原文链接:https://www.bthlt.com/note/369846729-Linux企业微信长连接来了!一套代码生成三平台智能助手,内网也能跑

出处:葫芦的运维日志 | 转载请注明出处并保留原文链接

📜 留言板

留言提交后需管理员审核通过才会显示