Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
264 changes: 264 additions & 0 deletions WECOM_INTEGRATION.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,264 @@
# 企业微信智能机器人集成完成

## 概述

已成功为 ZenOps 项目集成企业微信智能机器人功能,与现有的钉钉和飞书机器人保持一致的架构设计。

## 实现内容

### 1. 核心文件

#### 新增文件

- **`internal/wecom/crypt.go`** - 企业微信消息加密解密工具
- 实现 WXBizMsgCrypt 算法
- 支持 AES-256-CBC 加密
- 支持消息签名验证
- PKCS7 填充/去填充

- **`internal/wecom/client.go`** - 企业微信AI机器人客户端
- URL 验证功能
- 消息解密
- 流式响应生成

- **`internal/wecom/handler.go`** - 消息处理器
- 文本消息处理
- 流式轮询请求处理
- LLM 集成
- 对话状态管理
- 消息缓存和清理

- **`docs/wecom-bot-setup.md`** - 详细的配置指南

#### 修改文件

- **`internal/config/config.go`** - 添加企业微信配置结构
```go
type WecomConfig struct {
Enabled bool `mapstructure:"enabled"`
Token string `mapstructure:"token"`
EncodingAESKey string `mapstructure:"encoding_aes_key"`
}
```

- **`internal/server/http.go`** - 集成企业微信路由
- GET `/api/wecom/callback` - URL 验证
- POST `/api/wecom/callback` - 消息回调

- **`config.example.yaml`** - 添加企业微信配置示例

### 2. 架构设计

```
用户消息
企业微信服务器
↓ (加密消息)
ZenOps HTTP Server
MessageHandler
AIBotClient (解密)
LLM 处理
流式响应
AIBotClient (加密)
企业微信服务器
用户收到回复
```

### 3. 关键特性

1. **消息加密安全**
- AES-256-CBC 加密算法
- SHA1 签名验证
- 支持 URL 验证和消息回调

2. **流式响应**
- 支持企业微信的流式消息协议
- 异步消息处理
- 对话状态管理

3. **LLM 集成**
- 自动调用 LLM 进行智能问答
- 支持工具调用(MCP)
- 流式输出 AI 响应

4. **状态管理**
- 消息 ID 缓存映射
- 对话状态维护
- 自动清理过期状态

### 4. 配置说明

在 `config.yaml` 中添加:

```yaml
# 企业微信配置
wecom:
enabled: true
token: "YOUR_WECOM_BOT_TOKEN"
encoding_aes_key: "YOUR_ENCODING_AES_KEY" # 43位字符

# 必须启用 LLM
llm:
enabled: true
model: "DeepSeek-V3"
api_key: "YOUR_API_KEY"
base_url: "https://api.deepseek.com"

# HTTP 服务必须启用
server:
http:
enabled: true
port: 8080
```

### 5. API 接口

#### URL 验证 (GET)
```
GET /api/wecom/callback?msg_signature=xxx&timestamp=xxx&nonce=xxx&echostr=xxx
```

#### 消息回调 (POST)
```
POST /api/wecom/callback?msg_signature=xxx&timestamp=xxx&nonce=xxx
Content-Type: application/json

{
"encrypt": "..."
}
```

### 6. 消息处理流程

#### 文本消息 (msgtype=text)
1. 接收用户消息
2. 生成对话 ID
3. 创建对话状态
4. 异步调用 LLM 处理
5. 返回初始响应 "正在思考..."

#### 流式轮询 (msgtype=stream)
1. 根据消息 ID 查找对话状态
2. 返回当前生成的内容
3. 如果完成,清理状态并添加结束标记

### 7. 代码示例

#### 初始化 Handler
```go
handler, err := wecom.NewMessageHandler(cfg, mcpServer)
if err != nil {
log.Fatal(err)
}
```

#### 处理消息
```go
response, err := handler.HandleTextMessage(ctx, userReq)
if err != nil {
log.Error(err)
}
```

### 8. 测试清单

- [x] 代码编译通过
- [ ] URL 验证测试
- [ ] 消息加密解密测试
- [ ] 文本消息处理测试
- [ ] 流式响应测试
- [ ] LLM 集成测试
- [ ] 端到端集成测试

### 9. 与钉钉/飞书的对比

| 功能 | 钉钉 | 飞书 | 企业微信 |
|------|------|------|----------|
| 连接方式 | Stream SDK | WebSocket | HTTP 回调 |
| 消息加密 | 选配 | 不需要 | 必须 |
| 流式响应 | AI卡片 | 卡片更新 | 流式协议 |
| 配置复杂度 | 中 | 低 | 高 |
| 安全性 | 高 | 中 | 很高 |

### 10. 下一步工作

1. **功能增强**
- [ ] 支持群聊模式
- [ ] 添加富文本消息支持
- [ ] 支持图片消息

2. **性能优化**
- [ ] 连接池优化
- [ ] 缓存策略优化
- [ ] 并发处理优化

3. **测试完善**
- [ ] 单元测试
- [ ] 集成测试
- [ ] 压力测试

4. **文档完善**
- [ ] API 文档
- [ ] 部署文档
- [ ] 故障排查指南

## 使用方法

### 1. 配置企业微信后台

1. 登录企业微信管理后台
2. 创建智能助手应用
3. 获取 Token 和 EncodingAESKey
4. 配置回调地址: `http://120.26.168.217:8080/api/wecom/callback`

### 2. 修改配置文件

编辑 `config.yaml`,启用企业微信和 LLM:

```yaml
wecom:
enabled: true
token: "your_token"
encoding_aes_key: "your_aes_key"

llm:
enabled: true
model: "DeepSeek-V3"
api_key: "your_api_key"
```

### 3. 启动服务

```bash
./zenops serve
```

### 4. 验证配置

在企业微信后台保存配置,如果成功会提示 "配置成功"。

### 5. 开始使用

在企业微信中找到智能助手,发送消息即可与机器人对话。

## 参考资料

- [企业微信智能助手开发文档](https://developer.work.weixin.qq.com/document/path/100719)
- [消息加密解密说明](https://developer.work.weixin.qq.com/document/path/90968)
- [PandaWiki 企微机器人实现](https://github.com/chaitin/panda-wiki)

## 贡献者

- 实现基于 PandaWiki 项目的企微机器人参考
- 加密算法参考企业微信官方 Python SDK

## 许可证

与 ZenOps 项目保持一致。
3 changes: 3 additions & 0 deletions cmd/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,9 @@ var runCmd = &cobra.Command{
// 创建 HTTP 服务器 (使用 Gin)
httpServer := server.NewHTTPGinServer(cfg)

// 设置 MCP Server (用于企业微信等需要 MCP 的功能)
httpServer.SetMCPServer(mcpServer)

// 启动 HTTP 服务器(阻塞式)
if err := httpServer.Start(); err != nil {
errCh <- fmt.Errorf("http server error: %w", err)
Expand Down
11 changes: 8 additions & 3 deletions config.example.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -39,23 +39,28 @@ cicd:
# 钉钉配置
dingtalk:
enabled: true

# 钉钉应用凭证
app_key: "YOUR_DINGTALK_APP_KEY"
app_secret: "YOUR_DINGTALK_APP_SECRET"
agent_id: "YOUR_AGENT_ID"

# 流式卡片配置
card_template_id: "" # AI 流式卡片模板 ID(可选,需要在钉钉开放平台创建)

# 飞书配置
feishu:
enabled: false # 是否启用飞书机器人

# 飞书应用凭证
app_id: "cli_xxxxxxxxxxxxxxxx" # 飞书应用的 App ID
app_secret: "xxxxxxxxxxxxxxxxxxxxx" # 飞书应用的 App Secret

# 企业微信配置
wecom:
enabled: false # 是否启用企业微信AI机器人
# 企业微信AI机器人凭证
# 在企业微信管理后台 > 应用管理 > 智能助手 中创建并获取
token: "YOUR_WECOM_BOT_TOKEN" # 企业微信AI机器人Token
encoding_aes_key: "YOUR_ENCODING_AES_KEY" # 消息加密密钥(43位字符)

# LLM 大模型配置
llm:
enabled: true
Expand Down
Loading
Loading