WeCom-Coze Bridge
企业微信机器人 ↔ 扣子智能体 桥接服务
概述
WeCom-Coze Bridge 是一个纯 Go 后端服务,用于将企业微信智能机器人 的消息转发至扣子(Coze)智能体,并将扣子的回复实时返回给企业微信用户。
支持企业微信智能机器人的两种对接方式:
- 长连接模式(WebSocket) --- 通过 WebSocket 与企业微信保持长连接,实时接收和回复消息
- 回调模式(HTTP) --- 通过企业微信回调 URL 接收消息,使用
response_urlHTTP POST 回复
功能特性
- 🔁 双模式支持:长连接 / 回调模式,灵活适配不同网络环境
- 💬 多轮对话 :基于扣子
conversation_id维持会话上下文 - ⚡ 流式回复:支持企业微信流式消息格式,实时推送回复内容
- 💭 思考中动画 :收到消息后立即显示
<think></think>(企业微信原生渲染为跳动小点),扣子返回后自动更新气泡 - 🔗 自动重连:长连接模式支持指数退避重连(可配置重试次数和延迟)
- 💓 心跳保活 :WebSocket 心跳
ping/pong,间隔可配置 - 🔐 消息加解密:回调模式支持 AES-256-CBC 加解密和 SHA1 签名验证
- 📊 状态查询:内置 HTTP API 提供健康检查和桥接运行状态
技术栈
| 组件 | 技术 |
|---|---|
| 语言 | Go 1.24 |
| WebSocket | gorilla/websocket |
| HTTP | net/http(标准库) |
| 加解密 | crypto/aes + crypto/cipher(AES-256-CBC) |
快速开始
前置条件
- Go 1.24+
- 已发布的扣子智能体(Coze Bot)
- 企业微信机器人(智能机器人类型)
配置
- 复制配置模板并填入真实凭据:
bash
cp config.example.json config.json
- 编辑
config.json,填入必要的配置项:
json
{
"connection_mode": "long_connection",
"port": "5000",
"wecom": {
"bot_id": "your-wecom-bot-id",
"secret": "your-wecom-secret"
},
"coze": {
"workload_api_token": "your-coze-api-token",
"bot_id": "your-coze-bot-id"
}
}
⚠️
config.json包含真实凭据,已被.gitignore排除,不会提交到版本库。
构建与运行
bash
# 本地构建
go build -o wecom2coze .
# 运行
./wecom2coze
跨平台编译(Windows → Linux amd64):
powershell
$env:GOOS="linux"; $env:GOARCH="amd64"; go build -o wecom2coze .
配置文件字段说明
| JSON 路径 | 必填 | 说明 |
|---|---|---|
connection_mode |
是 | 连接模式:callback 或 long_connection |
port |
否 | 服务端口,默认 5000 |
wecom.bot_id |
长连接 | 企业微信机器人 Bot ID |
wecom.secret |
长连接 | 企业微信机器人 Secret |
wecom.callback_token |
回调 | 回调 Token |
wecom.callback_encoding_aes_key |
回调 | 回调 EncodingAESKey(43位) |
coze.workload_api_token |
是 | 扣子 API Token |
coze.bot_id |
是 | 扣子智能体 Bot ID |
coze.api_base_url |
否 | 扣子 API 地址,默认 https://api.coze.cn |
project_domain_default |
否 | 对外域名(回调 URL 生成用) |
bridge.auto_start |
否 | 是否自动启动桥接,默认 false |
bridge.reconnect_max_retries |
否 | 最大重连次数,默认 10 |
bridge.reconnect_base_delay_sec |
否 | 重连基础延迟秒数,默认 2 |
bridge.heartbeat_interval_sec |
否 | 心跳间隔秒数,默认 20 |
bridge.coze_chat_timeout_sec |
否 | 扣子对话超时秒数,默认 120 |
bridge.coze_poll_interval_ms |
否 | 扣子轮询间隔毫秒数,默认 1000 |
HTTP API
| 路径 | 方法 | 说明 |
|---|---|---|
/ |
GET | 根路径,返回服务名称、版本和状态 |
/health |
GET | 健康检查,返回 {"status":"ok","mode":"..."} |
/api/status |
GET | 桥接状态详情(连接状态、消息/错误计数、最后活动时间等) |
/api/wecom/callback |
GET | 企业微信回调 URL 验证 |
/api/wecom/callback |
POST | 企业微信回调消息接收 |
项目结构
├── main.go # 入口:加载配置、启动桥接和 HTTP 服务
├── config.json # 实际配置(含真实凭据,被 .gitignore 排除)
├── config.example.json # 配置模板(占位符,可提交到版本库)
├── .gitignore # 版本忽略规则
├── go.mod # Go 模块定义
├── README.md # 本文件
├── config/
│ └── config.go # 配置加载(从 config.json 读取,支持默认值)
├── types/
│ └── types.go # 类型定义(Config、消息体、流式响应等)
├── wecomcrypto/
│ └── crypto.go # 企业微信消息加解密(AES-256-CBC + SHA1 签名)
├── wecom/
│ └── longconn.go # 长连接 WebSocket 客户端
├── coze/
│ └── bot.go # 扣子智能体 API 客户端(流式对话 /v3/chat)
├── bridge/
│ └── bridge.go # 桥接核心:消息路由、会话管理、流式回复
└── server/
└── server.go # HTTP 服务器(回调/健康检查/状态查询)
架构说明
消息流程
企业微信用户
│
├── [长连接模式] ──→ wss://openws.work.weixin.qq.com
│ │
│ ▼
│ wecom/longconn.go ──→ bridge/bridge.go ──→ coze/bot.go ──→ 扣子 API
│ │ │
│ ◄──────── 流式回复 (WebSocket) ────────────────┘
│
└── [回调模式] ──→ HTTP POST /api/wecom/callback
│
▼
server/server.go ──→ bridge/bridge.go ──→ coze/bot.go ──→ 扣子 API
│ │
◄────── 流式回复 (response_url HTTP POST) ─────┘
思考中动画机制
收到用户消息后,桥接器立即发送 <think></think> 流帧(finish=false),企业微信原生将其渲染为三个跳动的小点。待扣子返回实际回复后,发送 finish=true 的流帧更新同一气泡内容。两种模式下均支持此机制。
部署建议
- 生产环境 :建议使用回调模式,长连接在云端服务器可能不稳定
- 回调 URL :需在企业微信后台配置为
https://{域名}/api/wecom/callback - 回调通信:使用 JSON 格式(智能机器人,非 XML)
- 消息回复 :优先使用
response_urlHTTP POST - 扣子 Bot:必须已发布才能通过 API 调用
- 会话存储:会话映射存储在内存中,服务重启后丢失
开发
编译命令速查
bash
# Windows 本地构建
go build -o wecom2coze .
# Linux amd64 交叉编译
$env:GOOS="linux"; $env:GOARCH="amd64"; go build -o wecom2coze .
# Linux 服务器运行
chmod +x wecom2coze
./wecom2coze
