Files
cc-connect/docs/wecom.md
T
2026-06-02 23:14:41 +08:00

447 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 企业微信 (WeChat Work) 接入指南
本文档介绍如何将 **cc-connect** 接入企业微信,让你可以通过企业微信(甚至个人微信)远程调用 Claude Code。
> 💡 **特色功能**:配置完成后,**个人微信用户也可以直接对话** —— 只需在企业微信管理后台关联微信插件即可。
企业微信支持两种接入模式:
| 模式 | 优势 | 要求 |
|------|------|------|
| **WebSocket 长连接**(推荐) | 无需公网 URL、无需消息加解密、无需 IP 白名单,支持图片接收与图片回传 | 创建「智能机器人」 |
| **Webhook 回调** | 兼容企业微信自建应用回调模式 | 公网 URL + 可信 IP |
---
## 模式一:WebSocket 长连接(推荐)
企业微信「智能机器人」支持 WebSocket 长连接模式,cc-connect 主动连接企业微信服务器,无需公网 URL、无需消息加解密、无需 IP 白名单,配置最简单。
### 前置要求
- 企业微信管理员权限
- 一台可运行 cc-connect 的服务器(**无需公网 IP**)
- Claude Code 已安装并配置完成
### 第一步:创建智能机器人
1. 登录 [企业微信管理后台](https://work.weixin.qq.com/wework_admin/frame)
2. 进入 **应用管理****智能机器人****创建智能机器人**
3. 填写机器人信息(名称、头像等)
4. 创建完成后,记录以下凭证:
```
BotID: xxxxxxxxxxxxxxxx
Secret: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```
> ⚠️ Secret 只会显示一次,请立即保存!
### 第二步:配置 cc-connect
将凭证配置到 `config.toml` 中:
```toml
[[projects]]
name = "my-project"
[projects.agent]
type = "claudecode"
[projects.agent.options]
work_dir = "/path/to/your/project"
mode = "default"
[[projects.platforms]]
type = "wecom"
[projects.platforms.options]
mode = "websocket"
bot_id = "your-bot-id"
bot_secret = "your-bot-secret"
allow_from = "*"
```
#### 配置项说明
| 配置项 | 必填 | 说明 |
|--------|------|------|
| `mode` | ✅ | 必须为 `"websocket"` |
| `bot_id` | ✅ | 智能机器人 BotID |
| `bot_secret` | ✅ | 智能机器人 Secret |
| `allow_from` | ❌ | 允许的用户 ID(默认 `"*"` 允许所有) |
### 第三步:启动并验证
```bash
cc-connect
```
你应该看到类似日志:
```
level=INFO msg="wecom-ws: connecting" endpoint=wss://openws.work.weixin.qq.com
level=INFO msg="wecom-ws: subscribed successfully" bot_id=your-bot-id
```
在企业微信中找到你的机器人,发送一条消息测试即可。
### 技术细节
- **连接地址**`wss://openws.work.weixin.qq.com`
- **认证方式**:连接后发送 `aibot_subscribe`bot_id + secret
- **心跳**:每 30 秒发送 `ping`
- **自动重连**:连接断开后指数退避重连(1s → 2s → 4s → ... → 30s max
- **图片回传**:通过 `aibot_upload_media_*` 上传临时素材,再用 `aibot_send_msg` 发送图片
- **限制**:同一机器人仅支持 1 个长连接;30 条/分钟、1000 条/小时
---
## 模式二:Webhook 回调
> 💡 推荐优先使用上方的 WebSocket 长连接模式。只有在你已有企业微信自建应用回调部署、或需要兼容旧配置时,再使用 Webhook 回调模式。
### 前置要求
- 企业微信管理员权限
- 一台可运行 cc-connect 的服务器
- **公网可访问的 URL**(用于接收企业微信回调)
- Claude Code 已安装并配置完成
---
## 第一步:创建企业微信自建应用
### 1.1 进入管理后台
登录 [企业微信管理后台](https://work.weixin.qq.com/wework_admin/frame)。
### 1.2 创建应用
1. 进入 **应用管理****自建****创建应用**
2. 填写应用信息:
| 字段 | 填写建议 |
|------|---------|
| 应用名称 | `cc-connect` |
| 应用Logo | 上传一个喜欢的图标 |
| 可见范围 | 选择需要使用的部门/成员 |
### 1.3 记录凭证
创建完成后,记录以下信息:
```
AgentId: 1000002
Secret: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```
> ⚠️ Secret 只会显示一次,请立即保存!
---
## 第二步:获取企业 ID
1. 在管理后台首页,点击 **我的企业**
2. 在页面底部找到 **企业ID (CorpId)**
3. 复制保存
```
CorpId: wwxxxxxxxxxxxxxx
```
---
## 第三步:配置接收消息
### 3.1 进入消息配置
进入你创建的应用 → **接收消息****设置API接收**
### 3.2 填写配置
| 字段 | 填写内容 |
|------|---------|
| **URL** | `https://你的公网域名/wecom/callback`(见第四步) |
| **Token** | 自定义一个随机字符串 |
| **EncodingAESKey** | 点击「随机获取」生成(43 个字符) |
> ⚠️ **暂时不要点保存!** 需要先启动 cc-connect 再回来保存(因为保存时企业微信会立即验证回调 URL)。
### 3.3 记录配置
把 Token 和 EncodingAESKey 记下来,后面配置 config.toml 要用。
---
## 第四步:配置公网访问
企业微信需要能够访问你的回调 URL。推荐方案:
### 方案 Acloudflared tunnel(推荐,免费)
```bash
# 安装
# macOS: brew install cloudflared
# Linux: 参考 https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/
# 快速启动(会生成一个临时公网 URL)
cloudflared tunnel --url http://localhost:8081
```
启动后会输出类似 `https://xxx-xxx.trycloudflare.com`,将其作为回调 URL 的域名。
### 方案 B:ngrok(开发测试用)
```bash
ngrok http 8081
```
### 方案 C:有公网 IP 的服务器 + Nginx
```nginx
server {
listen 443 ssl;
server_name your-domain.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location /wecom/callback {
proxy_pass http://127.0.0.1:8081;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
```
---
## 第五步:配置企业可信 IP
企业微信要求调用 API 的服务器 IP 在白名单中。
### 5.1 查询服务器出口 IP
```bash
curl -s https://ifconfig.me
```
> 如果你的出口 IP 是动态的(如家用宽带),可以使用 VPS 正向代理方案,见后文「动态 IP 场景」。
### 5.2 添加到白名单
1. 进入 **应用管理** → 选择你的应用
2. 滚动到底部,找到 **企业可信IP**
3. 点击 **配置**,添加你的出口 IP
---
## 第六步:配置 cc-connect
将凭证配置到 `config.toml` 中:
```toml
[[projects]]
name = "my-project"
[projects.agent]
type = "claudecode"
[projects.agent.options]
work_dir = "/path/to/your/project"
mode = "default"
[[projects.platforms]]
type = "wecom"
[projects.platforms.options]
corp_id = "wwxxxxxxxxxxxxxx"
corp_secret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
agent_id = "1000002"
callback_token = "你在第三步设置的Token"
callback_aes_key = "你在第三步获取的EncodingAESKey"
port = "8081"
callback_path = "/wecom/callback"
api_base_url = "https://qyapi.weixin.qq.com"
enable_markdown = false
```
### 配置项说明
| 配置项 | 必填 | 说明 |
|--------|------|------|
| `corp_id` | ✅ | 企业 ID |
| `corp_secret` | ✅ | 应用 Secret |
| `agent_id` | ✅ | 应用 AgentId |
| `callback_token` | ✅ | 回调 Token |
| `callback_aes_key` | ✅ | 回调 EncodingAESKey43字符) |
| `port` | ❌ | Webhook 监听端口(默认 `8081` |
| `callback_path` | ❌ | Webhook 路径(默认 `/wecom/callback` |
| `api_base_url` | ❌ | 企业微信 API 基础地址(默认 `https://qyapi.weixin.qq.com` |
| `enable_markdown` | ❌ | 是否发送 Markdown 消息(默认 `false` |
| `proxy` | ❌ | HTTP 正向代理地址(动态 IP 场景使用) |
### 关于 enable_markdown
- `false`(默认):发送纯文本消息,**企业微信应用和个人微信都能正常显示**
- `true`:发送 Markdown 格式消息,**仅企业微信应用内可渲染**,个人微信会显示「暂不支持的消息类型」
> 💡 如果你的用户主要通过个人微信使用,建议保持 `false`。
---
## 第七步:启动并验证
### 7.1 启动 cc-connect
```bash
cc-connect
# 或指定配置文件
cc-connect -config /path/to/config.toml
```
你应该看到类似日志:
```
level=INFO msg="platform started" project=my-project platform=wecom
level=INFO msg="cc-connect is running" projects=1
level=INFO msg="wecom: webhook server listening" port=8081 path=/wecom/callback
```
### 7.2 确保公网隧道在运行
```bash
# 确认 cloudflared / ngrok 正在运行并转发到 8081 端口
cloudflared tunnel --url http://localhost:8081
```
### 7.3 回到企业微信保存回调配置
1. 回到企业微信管理后台 → 你的应用 → 接收消息
2. 确认 URL 填写正确(cloudflared 生成的公网 URL + `/wecom/callback`
3. 点击 **保存**
4. 如果验证通过,配置完成!
---
## 第八步:关联个人微信(可选)
如果希望**个人微信**也能直接与 AI 对话:
1. 登录企业微信管理后台
2. 进入 **我的企业****微信插件**
3. 用个人微信扫描页面上的二维码
4. 关联后,个人微信中会出现企业微信的应用入口
> 💡 关联后,个人微信用户可以直接发送消息给应用,无需安装企业微信。
---
## 动态 IP 场景
如果你的服务器没有固定公网 IP(如家用宽带),企业微信可信 IP 白名单无法使用动态 IP。解决方案:
### 使用 VPS 正向代理
1. 在一台有固定公网 IP 的 VPS 上安装 tinyproxy
```bash
# Ubuntu/Debian
apt install tinyproxy
# 编辑配置:允许你的机器访问
vim /etc/tinyproxy/tinyproxy.conf
# 添加: Allow your-home-ip
systemctl restart tinyproxy
```
2. 在 cc-connect 配置中添加 proxy
```toml
[projects.platforms.options]
# ... 其他配置 ...
proxy = "http://vps-ip:8888"
```
3. 将 VPS 的公网 IP 添加到企业可信 IP 白名单
这样 cc-connect 调用企业微信 API 时会通过 VPS 代理,出口 IP 固定为 VPS 的 IP。
---
## 架构图
```
┌─────────────────────────────────────────────────────────────┐
│ 企业微信 / 个人微信 │
│ 服务器 │
│ │ │
│ 加密 XML 回调 │
└────────────────────────┼─────────────────────────────────────┘
│ HTTPS (需要公网 URL)
┌─────────────────────────────────────────────────────────────┐
│ 你的服务器 │
│ │
│ cloudflared ──→ cc-connect ──→ Claude Code CLI │
│ / ngrok │ │
│ │ (可选) proxy │
│ ▼ │
│ 企业微信 API ──→ VPS 正向代理 │
│ │
└─────────────────────────────────────────────────────────────┘
```
---
## 常见问题
### Q: 回调验证失败?
1. 确认 cc-connect 已启动且 webhook server 在监听
2. 确认公网隧道(cloudflared/ngrok)正在运行
3. 检查 URL 是否能公网访问:`curl https://你的域名/wecom/callback`
4. 检查 Token 和 EncodingAESKey 是否与管理后台一致
### Q: 消息发不出去?
1. 检查日志是否有 `get access_token failed` 错误
2. 确认出口 IP 在企业可信 IP 白名单中
3. 如果使用代理,确认代理服务正常运行
### Q: 报错 `60020` (not allow to access from your ip)
日志中会提示实际的出口 IP,将该 IP 添加到企业可信 IP 白名单。
### Q: 个人微信显示「暂不支持的消息类型」?
`enable_markdown` 设为 `false`(默认值),改为发送纯文本消息。
### Q: 动态 IP 导致发送失败?
参考上文「动态 IP 场景」,使用 VPS 正向代理。
---
## 参考链接
- [企业微信管理后台](https://work.weixin.qq.com/wework_admin/frame)
- [企业微信开发文档](https://developer.work.weixin.qq.com/document/)
- [消息加解密说明](https://developer.work.weixin.qq.com/document/path/90307)
- [Cloudflare Tunnel 文档](https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/)
---
## 下一步
- [接入飞书](./feishu.md)
- [接入钉钉](./dingtalk.md)
- [接入微博](./weibo.md)
- [接入 Telegram](./telegram.md)
- [接入 Slack](./slack.md)
- [接入 Discord](./discord.md)
- [返回首页](../README.md)