This repository has been archived on 2026-03-06. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
openclaw-extensions/wecom/README.md
T

361 lines
15 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.
# OpenClaw 企业微信(WeCom)Channel 插件
<p align="center">
<strong>🚀 企业级双模式 AI 助手接入方案</strong>
</p>
<p align="center">
<a href="#功能亮点">功能亮点</a> •
<a href="#模式对比">模式对比</a> •
<a href="#快速开始">快速开始</a> •
<a href="#配置说明">配置说明</a> •
<a href="#联系我">联系我</a>
</p>
---
## 💡 核心价值:为什么选择本插件?
### 🏗 独创架构:Bot + Agent 双模融合
传统的企微插件通常只能在 "只能聊天的机器人 (Bot)" 和 "只能推送的自建应用 (Agent)" 之间二选一。
本插件采用 **双模并行架构**,同时压榨两种模式的极限能力:
* **Bot 通道 (智能体)**:负责 **实时对话**。提供毫秒级流式响应(打字机效果),零延迟交互。
* **Agent 通道 (自建应用)**:负责 **能力兜底**。当需要发送图片/文件、进行全员广播、或 Bot 对话超时(>6分钟)时,无缝切换到 Agent 通道接管。
### 🧩 功能特性全景
#### 1. 🗣 **沉浸式交互 (Immersive Interaction)**
* **原生流式 (Stream)**:基于 HTTP 分块传输,拒绝 "转圈等待",体验如 ChatGPT 网页版般丝滑。
* **交互式卡片 (Card)**:支持 Button/Menu 交互回传,可构建审批、查询等复杂业务流 (Agent模式)。
#### 2. 📎 **全模态支持 (Multi-Modal)**
* **发什么都能看**:支持接收图片、文件 (PDF/Doc/Zip)、语音 (自动转文字)、视频。
* **要什么都能给**:AI 生成的图表、代码文件、语音回复,均可自动上传并推送到企微。
#### 3. 📢 **企业级触达 (Enterprise Reach)**
* **精准广播**:支持向 **部门 (Party)**、**标签 (Tag)** 或 **外部群** 批量推送消息。
* **Cronjob 集成**:通过简单的 JSON 配置实现早报推送、日报提醒、服务器报警。
#### 4. 🛡 **生产级稳定 (Production Ready)**
* **容灾切换**:Bot 模式 6 分钟超时自动熔断,切换 Agent 私信送达,防止长任务回答丢失。
* **Token 自动运维**:内置 AccessToken 守护进程,自动缓存、提前刷新、过期重试。
---
## 📊 模式能力对比
| 能力维度 | 🤖 Bot 模式 | 🧩 Agent 模式 | ✨ **本插件 (双模)** |
|:---|:---|:---|:---|
| **接收消息 (单聊)** | ✅ 文本/图片/语音/文件 | ✅ 文本/图片/语音/视频/位置/链接 | **✅ 全能互补** (覆盖所有类型) |
| **接收消息 (群聊)** | ✅ 文本/引用 | ❌ 不支持 (无回调) | **✅ 文本/引用** |
| **发送消息** | ❌ 仅支持文本/图片/Markdown | ✅ **全格式支持** (文本/图片/视频/文件等) | **✅ 智能路由** (自动切换) |
| **流式响应** | ✅ **支持** (打字机效果) | ❌ 不支持 | **✅ 完美支持** |
| **主动推送** | ❌ 仅被动回复 | ✅ **支持** (指定用户/部门/标签) | **✅ 完整 API** |
---
## 快速开始
### 1. 安装插件
```bash
openclaw plugins install @openclaw/wecom
openclaw plugins enable wecom
```
也可以通过命令行向导快速配置:
```bash
openclaw config --section channels
```
### 2. 配置 Bot 模式(智能体)
```bash
openclaw config set channels.wecom.enabled true
openclaw config set channels.wecom.bot.token "YOUR_BOT_TOKEN"
openclaw config set channels.wecom.bot.encodingAESKey "YOUR_BOT_AES_KEY"
openclaw config set channels.wecom.bot.receiveId ""
openclaw config set channels.wecom.bot.streamPlaceholderContent "正在思考..."
openclaw config set channels.wecom.bot.welcomeText "你好!我是 AI 助手"
# DM 门禁(推荐显式设置 policy)
# - open: 默认放开(所有人可用)
# - disabled: 全部禁用
# - allowlist: 仅 allowFrom 允许的人可用
openclaw config set channels.wecom.bot.dm.policy "open"
# policy=allowlist 时生效(例如只允许某些 userid;"*" 表示允许所有人)
openclaw config set channels.wecom.bot.dm.allowFrom '["*"]'
```
### 3. 配置 Agent 模式(自建应用,可选)
```bash
openclaw config set channels.wecom.enabled true
openclaw config set channels.wecom.agent.corpId "YOUR_CORP_ID"
openclaw config set channels.wecom.agent.corpSecret "YOUR_CORP_SECRET"
openclaw config set channels.wecom.agent.agentId 1000001
openclaw config set channels.wecom.agent.token "YOUR_CALLBACK_TOKEN"
openclaw config set channels.wecom.agent.encodingAESKey "YOUR_CALLBACK_AES_KEY"
openclaw config set channels.wecom.agent.welcomeText "欢迎使用智能助手"
openclaw config set channels.wecom.agent.dm.policy "open"
openclaw config set channels.wecom.agent.dm.allowFrom '["*"]'
```
### 4. 高级网络配置 (公网出口代理)
如果您的服务器使用 **动态 IP** (如家庭宽带、内网穿透) 或 **无公网 IP**,企业微信 API 会因 IP 变动报错 `60020 not allow to access from your ip`。
此时需配置一个**固定 IP 的正向代理** (如 Squid),让插件通过该代理访问企微 API。
```bash
openclaw config set channels.wecom.network.egressProxyUrl "http://proxy.company.local:3128"
```
### 5. 验证
```bash
openclaw gateway restart
openclaw channels status
```
---
## 配置说明
### 完整配置结构
```jsonc
{
"channels": {
"wecom": {
"enabled": true,
// Bot 模式配置(智能体)
"bot": {
"token": "YOUR_BOT_TOKEN",
"encodingAESKey": "YOUR_BOT_AES_KEY",
"receiveId": "", // 可选,用于解密校验
"streamPlaceholderContent": "正在思考...",
"welcomeText": "你好!我是 AI 助手",
"dm": { "allowFrom": [] } // 私聊限制
},
// Agent 模式配置(自建应用)
"agent": {
"corpId": "YOUR_CORP_ID",
"corpSecret": "YOUR_CORP_SECRET",
"agentId": 1000001,
"token": "YOUR_CALLBACK_TOKEN", // 企微后台「设置API接收」
"encodingAESKey": "YOUR_CALLBACK_AES_KEY",
"welcomeText": "欢迎使用智能助手",
"dm": { "allowFrom": [] }
},
// 网络配置(可选)
"network": {
"egressProxyUrl": "http://proxy.company.local:3128"
}
}
}
}
```
### Webhook 路径(固定)
| 模式 | 路径 | 说明 |
|:---|:---|:---|
| Bot | `/wecom/bot` | 智能体回调 |
| Agent | `/wecom/agent` | 自建应用回调 |
### DM 策略
- **不配置 `dm.allowFrom`** → 所有人可用(默认)
- **配置 `dm.allowFrom: ["user1", "user2"]`** → 白名单模式,仅列表内用户可私聊
### 常用指令
| 指令 | 说明 | 示例 |
|:---|:---|:---|
| `/new` | 🆕 开启新会话 (重置上下文) | `/new` 或 `/new GPT-4` |
| `/reset` | 🔄 重置会话 (同 /new) | `/reset` |
---
## 企业微信接入指南
### Bot 模式(智能机器人)
1. 登录 [企业微信管理后台](https://work.weixin.qq.com/wework_admin/frame#/manageTools)
2. 进入「安全与管理」→「管理工具」→「智能机器人」
3. 创建机器人,选择 **API 模式**
4. 填写回调 URL:`https://your-domain.com/wecom/bot`
5. 记录 Token 和 EncodingAESKey
### Agent 模式(自建应用)
1. 登录 [企业微信管理后台](https://work.weixin.qq.com/wework_admin/frame#/apps)
2. 进入「应用管理」→「自建」→ 创建应用
3. 获取 AgentId、CorpId、Secret
4. **重要:** 进入「企业可信IP」→「配置」→ 添加你服务器的 IP 地址
- 如果你使用内网穿透/动态 IP,建议配置 `channels.wecom.network.egressProxyUrl` 走固定出口代理,否则可能出现:`60020 not allow to access from your ip`
5. 在应用详情中设置「接收消息 - 设置API接收」
6. 填写回调 URL:`https://your-domain.com/wecom/agent`
7. 记录回调 Token 和 EncodingAESKey
---
## 高级功能
### A2UI 交互卡片
Agent 输出 `{"template_card": ...}` 时自动渲染为交互卡片:
- ✅ 单聊场景:发送真实交互卡片
- ✅ 按钮点击:触发 `template_card_event` 回调
- ✅ 自动去重:基于 `msgid` 避免重复处理
- ⚠️ 群聊降级:自动转为文本描述
### ⏰ Cronjob 企业级定时推送
本插件深度集成了 OpenClaw 的 Cronjob 调度能力,配合 Agent 强大的广播 API,轻松实现企业级通知服务。
> **核心场景**:早报推送、服务器报警、日报提醒、节日祝福。
#### 1. 目标配置 (Target)
无需遍历用户列表,直接利用 Agent 强大的组织架构触达能力:
| 目标类型 | 格式示例 | 推送范围 | 典型场景 |
|:---|:---|:---|:---|
| **部门 (Party)** | `party:1` (或 `1`) | 📢 **全员广播** | 全员通知、技术部周报 |
| **标签 (Tag)** | `tag:Ops` | 🎯 **精准分组** | 运维报警、管理层汇报 |
| **外部群 (Group)** | `group:wr...` | 💬 **群聊推送** | 项目组群日报 (需由Agent建群) |
| **用户 (User)** | `user:zhangsan` | 👤 **即时私信** | 个人待办提醒 |
#### 2. 配置示例 (`schedule.json`)
只需在工作区根目录创建 `schedule.json` 即可生效:
```json
{
"tasks": [
{
"cron": "0 9 * * 1-5", // 每周一至周五 早上9:00
"action": "reply.send",
"params": {
"channel": "wecom",
"to": "party:1", // 一键发送给根部门所有人!
"text": "🌞 早安!请查收[今日行业简报](https://example.com/daily)。"
}
},
{
"cron": "0 18 * * 5",
"action": "reply.send",
"params": {
"channel": "wecom",
"to": "tag:Ops", // 仅发送给运维组
"text": "🔒 周五封网提醒:请检查服务器状态。"
}
}
]
}
```
---
## 📖 详细行为说明 (Behavior Detail)
### 1. 企业微信群聊交付规则
* **默认 (Bot 回复)**:群聊里 @Bot,默认由 Bot 在群内直接回复(优先文本/图片/Markdown)。
* **例外 (文件兜底)**:如果回复内容包含**非图片文件**(如 PDF/Word/表格/压缩包等),由于企微 Bot 接口不支持,插件会自动:
1. Bot 在群里提示:"由于格式限制,文件将通过私信发送给您"。
2. 无缝切换到 **自建应用 (Agent)** 通道,将文件私信发送给触发者。
* **提示**:若未配置 Agent,Bot 会明确提示“需要管理员配置自建应用通道”。
### 2. 长任务可靠性保障
* **超时熔断**:企业微信限制 Bot 流式回复窗口约为 6 分钟。
* **自动接力**:当对话时长接近此阈值时,Monitor 会自动截断 Bot 流,提示 "剩余内容将私信发送",并立即启动 Agent 通道私信发送完整结果。这彻底解决了长思考任务(如深度推理、代码生成)因超时导致用户收不到结果的问题。
### 3. 主动发送安全机制
* **群发保护**:Agent 主动发送接口不再尝试向普通群 `chatid` (wr/wc...) 发消息(该路径常因权限与归属产生的隐蔽错误)。
* **引导提示**:系统会明确拦截并通过日志提示中文错误:"请使用 Bot 群内交付或改为私信目标(userid/部门/标签)",帮助管理员快速排查配置。
### 4. 管理员友好
* 所有兜底逻辑(Fallback)触发时,如果因配置缺失导致失败,Bot 都会给出清晰的**中文提示**,而不是沉默或报代码错误,极大降低了排查难度。
---
## 🙋 社区问答 (FAQ)
针对社区反馈的高频问题,我们已在 v2.2.4 版本中全部解决:
**Q1: 同时使用 Bot 和 Agent 会导致消息重复吗?**
> **A:** 不会。本插件采用“Bot 优先”策略。用户在哪个通道发消息,就从哪个通道回。只有在 Bot 无法处理(如发文件)时才会智能切换到 Agent 通道作为补充。
**Q2: 使用内网穿透时,企业微信报错 60020 (IP 不白名单) 怎么办?**
> **A:** 新增了 `config.network.egressProxyUrl` 配置。您可以配置一个拥有固定公网 IP 的代理服务器(如 Squid),让插件通过该代理与企微 API 通信,从而绕过动态 IP 限制。
**Q3: 原生 Bot 模式支持图片,为什么 Agent 模式不行?**
> **A:** Agent 模式之前确实存在此短板。但在 v2.2.4 中,我们完整实现了 Agent 端的 XML 媒体解析与 `media_id` 下载逻辑,现在 Agent 模式也能完美看图、听语音了。
**Q4: 群里 @机器人 发送文件失败?**
> **A:** 因为企业微信 Bot 接口本身不支持发送非图片文件。我们的解决方案是:自动检测到文件发送需求后,改为通过 Agent 私信该用户发送文件,并在群里给出 "文件已私信发给您" 的提示。
**Q5: 为什么在 Agent 模式下发送文件(如 PDF、Word)给机器人没有反应?**
> **A:** 这是由于企业微信官方接口限制。自建应用(Agent)的消息回调接口仅支持:文本、图片、语音、视频、位置和链接信息。**不支持**通用文件(File)类型的回调,因此插件无法感知您发送的文件。
**Q6: Cronjob 定时任务怎么发给群?**
> **A:** Cronjob 必须走 Agent 通道(Bot 无法主动发消息)。您只需在配置中指定 `to: "party:1"` (部门) 或 `to: "group:wr123..."` (外部群),即可实现定时推送到群。
**Q7: 为什么发视频给 Bot 没反应?**
> **A:** 官方 Bot 接口**不支持接收视频**。如果您需要处理视频内容,请配置并使用 Agent 模式(Agent 支持接收视频)。
---
---
## 更新日志
### 2026.2.5
- 🛠 **体验优化**:WeCom 媒体(图片/语音/视频/文件)处理的默认大小上限提升到 25MB,减少大文件因超限导致的“下载/保存失败”。
- 📌 **可配置提示**:若仍遇到 Media exceeds ... limit,日志/回复会提示通过 channels.wecom.media.maxBytes 调整上限,并给出可直接执行的 openclaw config set 示例命令。
### 2026.2.4
- 🚀 **架构升级**:实施 "Bot 优先 + Agent 兜底" 策略,兼顾流式体验与长任务稳定性(6分钟切换)。
- ✨ **全模态支持**:Agent 模式完整支持接收图片/语音/视频(文件仅支持发送)。
- ✨ **Cronjob 增强**:支持向部门 (`party:ID`) 和标签 (`tag:ID`) 广播消息。
- 🛠 **Monitor 重构**:统一的消息防抖与流状态管理,提升并发稳定性。
- 🛠 **体验优化**:修复企微重试导致的重复回复(Bot/Agent 均做 `msgid` 去重);优化 Bot 连续多条消息的排队/合并回执,避免“重复同一答案”或“消息失败提示”。
- 🐞 **修复**:Outbound ID 解析逻辑及 API 客户端参数缺失问题。
### 2026.2.3
- 🎉 **重大更新**:新增 Agent 模式(自建应用)支持
- ✨ 双模式并行:Bot + Agent 可同时运行
- ✨ **多模态支持**:Agent 模式支持图片/语音/文件/视频的接收与自动下载
- ✨ AccessToken 自动管理:缓存 + 智能刷新
- ✨ Agent 主动推送:脱离回调限制
- ✨ XML 加解密:完整 Agent 回调支持
- 📁 代码重构:模块化解耦设计
### 2026.1.31
- 文档:补充入模与测试截图说明
- 新增文件支持
- 新增卡片支持
### 2026.1.30
- 项目更名:Clawdbot → OpenClaw