@jiexiaoyin/wecom-api 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +228 -0
- package/config.example.json +7 -0
- package/config.js +76 -0
- package/docs/approval-templates.example.json +11 -0
- package/docs/nginx-mirror.md +193 -0
- package/openclaw.plugin.json +15 -0
- package/package.json +34 -0
- package/plugin.cjs +172 -0
- package/plugin.ts +136 -0
- package/skills/wecom-api/SKILL.md +40 -0
- package/skills/wecom-api/index.js +288 -0
- package/skills/wecom-api/openclaw.plugin.json +10 -0
- package/src/callback-helper.js +198 -0
- package/src/config.cjs +286 -0
- package/src/core/permission.js +479 -0
- package/src/crypto.js +130 -0
- package/src/index.js +199 -0
- package/src/modules/addressbook/index.js +413 -0
- package/src/modules/addressbook_cache/index.js +365 -0
- package/src/modules/advanced/index.js +159 -0
- package/src/modules/app/index.js +102 -0
- package/src/modules/approval/index.js +146 -0
- package/src/modules/auth/index.js +103 -0
- package/src/modules/callback/index.js +1180 -0
- package/src/modules/chain/index.js +193 -0
- package/src/modules/checkin/index.js +142 -0
- package/src/modules/checkin_rules/index.js +251 -0
- package/src/modules/contact/index.js +481 -0
- package/src/modules/contact_stats/index.js +349 -0
- package/src/modules/custom/index.js +140 -0
- package/src/modules/customer/index.js +51 -0
- package/src/modules/disk/index.js +245 -0
- package/src/modules/document/index.js +282 -0
- package/src/modules/hr/index.js +93 -0
- package/src/modules/intelligence/index.js +346 -0
- package/src/modules/kf/index.js +74 -0
- package/src/modules/live/index.js +122 -0
- package/src/modules/media/index.js +183 -0
- package/src/modules/meeting/index.js +665 -0
- package/src/modules/message/index.js +402 -0
- package/src/modules/messenger/index.js +208 -0
- package/src/modules/moments/index.js +161 -0
- package/src/modules/msgaudit/index.js +24 -0
- package/src/modules/notify/index.js +81 -0
- package/src/modules/oceanengine/index.js +199 -0
- package/src/modules/openchat/index.js +197 -0
- package/src/modules/phone/index.js +45 -0
- package/src/modules/room/index.js +178 -0
- package/src/modules/schedule/index.js +246 -0
- package/src/modules/school/index.js +199 -0
- package/src/modules/security/index.js +223 -0
- package/src/modules/sensitive/index.js +170 -0
- package/src/modules/thirdparty/index.js +145 -0
- package/src/sdk/index.js +269 -0
- package/src/utils/callback-helper.js +198 -0
- package/test/callback-crypto.test.js +55 -0
- package/test/crypto.test.js +85 -0
- package/test/permission.test.js +115 -0
package/README.md
ADDED
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
# openclaw-wecom-api
|
|
2
|
+
|
|
3
|
+
企业微信 API OpenClaw 插件,为 OpenClaw 提供完整的企业微信 API 调用能力和事件回调处理。
|
|
4
|
+
|
|
5
|
+
## 与其他 OpenClaw 企业微信插件的关系
|
|
6
|
+
|
|
7
|
+
| 插件 | 职责 | 通道 |
|
|
8
|
+
|------|------|------|
|
|
9
|
+
| **其他 Channel 插件**(如 @sunnoy/wecom) | 消息收发(WebSocket 长连接) | `"wecom"` 通道 |
|
|
10
|
+
| **openclaw-wecom-api** | API 调用 + 事件回调 | Skill 方式被 AI 触发 |
|
|
11
|
+
|
|
12
|
+
两者**不冲突**,共用同一套 `corpId`/`corpSecret` 凭证。
|
|
13
|
+
|
|
14
|
+
## 功能特性
|
|
15
|
+
|
|
16
|
+
- **32+ API 模块**:消息、会议、审批、打卡、客户联系、通讯录等
|
|
17
|
+
- **事件回调**:支持客户变更、审批、签到、会议等事件的 HTTP 接收
|
|
18
|
+
- **零额外部署**:继承 OpenClaw HTTP 端口(80/443),无需单独开端口
|
|
19
|
+
- **智能权限控制**:admin / manager / staff 三级数据隔离
|
|
20
|
+
- **回调路径隔离**:与 Channel 插件使用不同路径,互不干扰
|
|
21
|
+
|
|
22
|
+
## HTTP 回调路径
|
|
23
|
+
|
|
24
|
+
| 插件 | 回调路径 |
|
|
25
|
+
|------|---------|
|
|
26
|
+
| @sunnoy/wecom | `/plugins/wecom/agent/default` |
|
|
27
|
+
| openclaw-wecom-api | `/plugins/wecom-api/callback` |
|
|
28
|
+
|
|
29
|
+
## 安装
|
|
30
|
+
|
|
31
|
+
### 方式一:Git 克隆
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
# 克隆到扩展目录
|
|
35
|
+
git clone https://github.com/jiexiaoyin/openclaw-wecom-api.git /root/.openclaw/extensions/wecom-api
|
|
36
|
+
|
|
37
|
+
# 安装依赖
|
|
38
|
+
cd /root/.openclaw/extensions/wecom-api
|
|
39
|
+
npm install
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### 方式二:OpenClaw CLI
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
openclaw plugins install https://github.com/jiexiaoyin/openclaw-wecom-api
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## 配置
|
|
49
|
+
|
|
50
|
+
### 1. 修改 openclaw.json
|
|
51
|
+
|
|
52
|
+
在 `plugins.entries` 中添加插件注册:
|
|
53
|
+
|
|
54
|
+
```json
|
|
55
|
+
{
|
|
56
|
+
"plugins": {
|
|
57
|
+
"entries": {
|
|
58
|
+
"wecom-api": {
|
|
59
|
+
"enabled": true
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### 2. 创建 config.json
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
cd /root/.openclaw/extensions/wecom-api
|
|
70
|
+
cp config.example.json config.json
|
|
71
|
+
# 编辑 config.json 填入你的凭证
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
```json
|
|
75
|
+
{
|
|
76
|
+
"corpId": "你的企业ID",
|
|
77
|
+
"corpSecret": "你的应用Secret",
|
|
78
|
+
"agentId": "你的应用AgentID",
|
|
79
|
+
"token": "回调Token",
|
|
80
|
+
"encodingAESKey": "EncodingAESKey"
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
| 参数 | 说明 | 必填 |
|
|
85
|
+
|------|------|------|
|
|
86
|
+
| corpId | 企业ID | ✅ |
|
|
87
|
+
| corpSecret | 应用Secret | ✅ |
|
|
88
|
+
| agentId | 应用AgentID | ✅ |
|
|
89
|
+
| token | 回调Token | ✅ |
|
|
90
|
+
| encodingAESKey | 回调加密Key | ✅ |
|
|
91
|
+
|
|
92
|
+
### 3. 重启 OpenClaw
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
systemctl --user restart openclaw-gateway
|
|
96
|
+
# 或
|
|
97
|
+
nohup systemctl --user restart openclaw-gateway > /tmp/restart.log 2>&1 &
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### 4. 配置企业微信后台
|
|
101
|
+
|
|
102
|
+
登录 [企业微信管理后台](https://console.work.weixin.qq.com),找到你的自建应用,在「接收消息」设置中:
|
|
103
|
+
|
|
104
|
+
- 填写「URL」:`https://你的域名/plugins/wecom-api/callback`
|
|
105
|
+
- 填写「Token」和「EncodingAESKey」:与 config.json 中一致
|
|
106
|
+
|
|
107
|
+
## 与其他 OpenClaw 企业微信插件共用应用
|
|
108
|
+
|
|
109
|
+
当本插件与其他 OpenClaw 企业微信 Channel 插件(如 @sunnoy/wecom)共用同一个企业微信自建应用时,需要使用 Nginx Mirror 将企业微信的回调同时分发给两个插件:
|
|
110
|
+
|
|
111
|
+
```nginx
|
|
112
|
+
# 企业微信回调入口(其他 Channel 插件的路径,以 @sunnoy/wecom 为例)
|
|
113
|
+
location /plugins/wecom/agent/default {
|
|
114
|
+
mirror /plugins/wecom-api/callback;
|
|
115
|
+
mirror_request_body on;
|
|
116
|
+
proxy_pass http://127.0.0.1:18789;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
# openclaw-wecom-api 的回调路径(mirror 目标)
|
|
120
|
+
location = /plugins/wecom-api/callback {
|
|
121
|
+
internal;
|
|
122
|
+
proxy_pass http://127.0.0.1:18789;
|
|
123
|
+
}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
两者共用同一套凭证(corpId / corpSecret / token / encodingAESKey),各自验证签名、解析消息,互不干扰。
|
|
127
|
+
|
|
128
|
+
## 使用方式
|
|
129
|
+
|
|
130
|
+
插件安装后,OpenClaw 会自动注册 Skill,通过自然语言即可调用:
|
|
131
|
+
|
|
132
|
+
```
|
|
133
|
+
查一下 JieXiaoYin 的客户列表
|
|
134
|
+
发送消息给 张三,内容是测试
|
|
135
|
+
查询昨天的客户统计
|
|
136
|
+
查一下审批列表
|
|
137
|
+
获取通讯录
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### 命令行测试
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
# 测试连接
|
|
144
|
+
/skill wecom-api test_connection
|
|
145
|
+
|
|
146
|
+
# 查看配置状态
|
|
147
|
+
/skill wecom-api status
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
## 支持的 API 模块
|
|
151
|
+
|
|
152
|
+
| 模块 | 说明 |
|
|
153
|
+
|------|------|
|
|
154
|
+
| `addressbook` | 通讯录管理 |
|
|
155
|
+
| `approval` | 审批管理 |
|
|
156
|
+
| `checkin` | 打卡考勤 |
|
|
157
|
+
| `contact` | 客户联系 |
|
|
158
|
+
| `contact_stats` | 客户统计 |
|
|
159
|
+
| `customer` | 客户管理 |
|
|
160
|
+
| `document` | 文档管理 |
|
|
161
|
+
| `meeting` | 会议管理 |
|
|
162
|
+
| `message` | 消息收发 |
|
|
163
|
+
| `schedule` | 日程管理 |
|
|
164
|
+
| `media` | 素材管理 |
|
|
165
|
+
| ... | 更多模块 |
|
|
166
|
+
|
|
167
|
+
## 支持的回调事件
|
|
168
|
+
|
|
169
|
+
- **客户联系**:`add_external_contact`、`del_external_contact`、`change_external_contact` 等
|
|
170
|
+
- **客户群**:`create_chat`、`update_chat`、`dismiss_chat`
|
|
171
|
+
- **审批**:`submit_approval`、`Approval`
|
|
172
|
+
- **打卡**:`checkin`、`report_checkin`
|
|
173
|
+
- **会议**:`meeting_start`、`meeting_end`、`meeting_created` 等
|
|
174
|
+
- **通讯录**:`change_member`、`change_department`、`change_tag`
|
|
175
|
+
|
|
176
|
+
## 文件结构
|
|
177
|
+
|
|
178
|
+
```
|
|
179
|
+
openclaw-wecom-api/
|
|
180
|
+
├── openclaw.plugin.json # 插件清单
|
|
181
|
+
├── plugin.cjs # 插件入口(HTTP 回调注册)
|
|
182
|
+
├── package.json
|
|
183
|
+
│
|
|
184
|
+
├── src/
|
|
185
|
+
│ ├── index.js # WeComPlugin 主类
|
|
186
|
+
│ ├── callback-helper.js # 回调处理工具
|
|
187
|
+
│ ├── crypto.js # 加密/解密
|
|
188
|
+
│ ├── config.js # 配置加载
|
|
189
|
+
│ │
|
|
190
|
+
│ └── modules/ # 32+ API 模块
|
|
191
|
+
│ ├── approval/
|
|
192
|
+
│ ├── contact/
|
|
193
|
+
│ ├── contact_stats/
|
|
194
|
+
│ ├── customer/
|
|
195
|
+
│ ├── message/
|
|
196
|
+
│ ├── meeting/
|
|
197
|
+
│ ├── schedule/
|
|
198
|
+
│ └── ...
|
|
199
|
+
│
|
|
200
|
+
└── skills/
|
|
201
|
+
└── wecom-api/ # Skill 入口(供 AI 调用)
|
|
202
|
+
├── index.js
|
|
203
|
+
└── SKILL.md
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
## 更新
|
|
207
|
+
|
|
208
|
+
```bash
|
|
209
|
+
cd /root/.openclaw/extensions/wecom-api
|
|
210
|
+
git pull
|
|
211
|
+
npm install
|
|
212
|
+
systemctl --user restart openclaw-gateway
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
## 常见问题
|
|
216
|
+
|
|
217
|
+
**Q: 与 @sunnoy/wecom 冲突吗?**
|
|
218
|
+
A: 不冲突。@sunnoy/wecom 负责消息收发,本插件负责 API 调用和事件回调,走不同的 HTTP 路径。
|
|
219
|
+
|
|
220
|
+
**Q: 回调验证失败?**
|
|
221
|
+
A: 确认 Token / EncodingAESKey 与企业微信后台一致,且 URL 能在公网访问。
|
|
222
|
+
|
|
223
|
+
**Q: 如何查询昨天的客户新增数?**
|
|
224
|
+
A: 通过 `contact_stats` 模块查询,配合事件回调可以获取实时数据。
|
|
225
|
+
|
|
226
|
+
## License
|
|
227
|
+
|
|
228
|
+
MIT
|
package/config.js
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 企业微信插件 - 配置加载器
|
|
3
|
+
*
|
|
4
|
+
* 使用方法:
|
|
5
|
+
* 1. 编辑 config.json 填入配置
|
|
6
|
+
* 2. const wecom = require('./config').createWecom();
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
const fs = require('fs');
|
|
10
|
+
const path = require('path');
|
|
11
|
+
|
|
12
|
+
// 读取配置文件
|
|
13
|
+
const configPath = path.join(__dirname, 'config.json');
|
|
14
|
+
let fileConfig = {};
|
|
15
|
+
|
|
16
|
+
if (fs.existsSync(configPath)) {
|
|
17
|
+
try {
|
|
18
|
+
fileConfig = JSON.parse(fs.readFileSync(configPath, 'utf8'));
|
|
19
|
+
} catch (e) {
|
|
20
|
+
console.error('配置文件读取失败:', e.message);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* 创建企业微信插件实例
|
|
26
|
+
* @param {object} overrideConfig 覆盖配置
|
|
27
|
+
* @returns {WeComPlugin}
|
|
28
|
+
*/
|
|
29
|
+
function createWecom(overrideConfig = {}) {
|
|
30
|
+
const WeComPlugin = require('./src/index');
|
|
31
|
+
|
|
32
|
+
// 合并配置:文件配置 < 环境变量 < 代码传入
|
|
33
|
+
const config = {
|
|
34
|
+
...fileConfig,
|
|
35
|
+
...overrideConfig,
|
|
36
|
+
// 环境变量优先
|
|
37
|
+
corpId: process.env.WECOM_CORP_ID || fileConfig.corpId || overrideConfig.corpId,
|
|
38
|
+
corpSecret: process.env.WECOM_CORP_SECRET || fileConfig.corpSecret || overrideConfig.corpSecret,
|
|
39
|
+
agentId: process.env.WECOM_AGENT_ID || fileConfig.agentId || overrideConfig.agentId,
|
|
40
|
+
token: process.env.WECOM_TOKEN || fileConfig.token || overrideConfig.token,
|
|
41
|
+
encodingAESKey: process.env.WECOM_ENCODING_AES_KEY || fileConfig.encodingAESKey || overrideConfig.encodingAESKey,
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
// 验证必填配置
|
|
45
|
+
if (!config.corpId || config.corpId === 'YOUR_CORP_ID') {
|
|
46
|
+
throw new Error('请先在 config.json 中配置 corpId(企业ID)');
|
|
47
|
+
}
|
|
48
|
+
if (!config.corpSecret || config.corpSecret === 'YOUR_CORP_SECRET') {
|
|
49
|
+
throw new Error('请先在 config.json 中配置 corpSecret(应用Secret)');
|
|
50
|
+
}
|
|
51
|
+
if (!config.agentId || config.agentId === 'YOUR_AGENT_ID') {
|
|
52
|
+
throw new Error('请先在 config.json 中配置 agentId(应用AgentID)');
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return new WeComPlugin(config);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* 获取配置(完整版,供插件使用)
|
|
60
|
+
*/
|
|
61
|
+
function getConfig() {
|
|
62
|
+
return {
|
|
63
|
+
...fileConfig,
|
|
64
|
+
corpId: process.env.WECOM_CORP_ID || fileConfig.corpId,
|
|
65
|
+
corpSecret: process.env.WECOM_CORP_SECRET || fileConfig.corpSecret,
|
|
66
|
+
agentId: process.env.WECOM_AGENT_ID || fileConfig.agentId,
|
|
67
|
+
token: process.env.WECOM_TOKEN || fileConfig.token,
|
|
68
|
+
encodingAESKey: process.env.WECOM_ENCODING_AES_KEY || fileConfig.encodingAESKey,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
module.exports = {
|
|
73
|
+
createWecom,
|
|
74
|
+
getConfig,
|
|
75
|
+
config: fileConfig
|
|
76
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_meta": {
|
|
3
|
+
"description": "企业微信审批模板ID配置示例",
|
|
4
|
+
"usage": "调用审批相关 API 时,必须通过 template_id 查询审批单号、审批单详情等",
|
|
5
|
+
"note": "template_id 获取方式:企业微信后台 → 应用管理 → 审批 → 查看模板ID",
|
|
6
|
+
"important": "实际使用时需要替换为真实的 template_id"
|
|
7
|
+
},
|
|
8
|
+
"分组名称": [
|
|
9
|
+
{ "name": "模板名称", "template_id": "替换为真实的 template_id" }
|
|
10
|
+
]
|
|
11
|
+
}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
# Nginx Mirror 企业微信多插件分发方案
|
|
2
|
+
|
|
3
|
+
适用于企业微信自建应用只能配置一个回调 URL,但需要多个 OpenClaw 插件同时接收消息的场景。
|
|
4
|
+
|
|
5
|
+
## ✨ 适用场景
|
|
6
|
+
|
|
7
|
+
- 1 个企业微信自建应用
|
|
8
|
+
- 仅 1 个回调地址
|
|
9
|
+
- 需同时分发给多个插件
|
|
10
|
+
- 无需新建应用、无需重复配置
|
|
11
|
+
|
|
12
|
+
## 🌍 环境兼容
|
|
13
|
+
|
|
14
|
+
- 物理机 / 虚拟机
|
|
15
|
+
- Docker / 1Panel / 宝塔面板(容器环境自动适配)
|
|
16
|
+
|
|
17
|
+
## 🚀 核心说明
|
|
18
|
+
|
|
19
|
+
### 1. 主回调地址
|
|
20
|
+
|
|
21
|
+
示例(@YanHaidao/wecom 默认):
|
|
22
|
+
```
|
|
23
|
+
/plugins/wecom/agent/default
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
使用者可根据自己使用的插件修改。
|
|
27
|
+
|
|
28
|
+
### 2. 容器环境特别说明
|
|
29
|
+
|
|
30
|
+
如果你的 Nginx 运行在 1Panel / Docker / 宝塔面板容器中:
|
|
31
|
+
|
|
32
|
+
```nginx
|
|
33
|
+
# 容器内 127.0.0.1 指向自身,无法访问宿主机
|
|
34
|
+
# 正确写法:
|
|
35
|
+
proxy_pass http://host.docker.internal:18789$request_uri;
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
非容器环境(物理机):
|
|
39
|
+
```nginx
|
|
40
|
+
proxy_pass http://127.0.0.1:18789$request_uri;
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### 3. 扩展插件
|
|
44
|
+
|
|
45
|
+
复制以下结构即可添加新插件:
|
|
46
|
+
|
|
47
|
+
```nginx
|
|
48
|
+
# 在主回调 location 中添加:
|
|
49
|
+
mirror /mirror/your-plugin;
|
|
50
|
+
|
|
51
|
+
# 添加新的 mirror location:
|
|
52
|
+
location /mirror/your-plugin {
|
|
53
|
+
internal;
|
|
54
|
+
proxy_pass http://host.docker.internal:18789/plugins/your-plugin/callback;
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## ⚠️ 重要安全提示
|
|
59
|
+
|
|
60
|
+
- 企业微信加密消息只能解密一次
|
|
61
|
+
- 主插件负责解密,其他插件建议兼容明文模式
|
|
62
|
+
- 所有镜像路由均使用 `internal`,外部无法访问
|
|
63
|
+
|
|
64
|
+
## 📋 完整 Nginx 配置
|
|
65
|
+
|
|
66
|
+
```nginx
|
|
67
|
+
# ================================================================
|
|
68
|
+
# 【通用模板】Nginx Mirror - 企业微信单回调 → 多插件分发
|
|
69
|
+
# 适用:OpenClaw 生态 / 企业微信自建应用 / 单回调多插件场景
|
|
70
|
+
# 兼容:物理机 / 虚拟机 / Docker / 1Panel / 宝塔面板
|
|
71
|
+
# 说明:无任何隐私信息,安全可开源
|
|
72
|
+
# ================================================================
|
|
73
|
+
|
|
74
|
+
server {
|
|
75
|
+
listen 80;
|
|
76
|
+
listen 443 ssl;
|
|
77
|
+
server_name your-domain.com; # 【必填】修改为你的域名
|
|
78
|
+
index index.html;
|
|
79
|
+
|
|
80
|
+
# 日志路径
|
|
81
|
+
access_log /path/to/access.log main;
|
|
82
|
+
error_log /path/to/error.log;
|
|
83
|
+
|
|
84
|
+
# ------------------------------
|
|
85
|
+
# 通用安全规则
|
|
86
|
+
# ------------------------------
|
|
87
|
+
location ~ ^/(\.user\.ini|\.htaccess|\.git|\.env|\.svn|\.project|LICENSE|README\.md) {
|
|
88
|
+
return 404;
|
|
89
|
+
}
|
|
90
|
+
location ^~ /.well-known/acme-challenge {
|
|
91
|
+
allow all;
|
|
92
|
+
root /usr/share/nginx/html;
|
|
93
|
+
}
|
|
94
|
+
if ($uri ~ "^/\.well-known/.*\.(php|jsp|py|js|css|lua|ts|go|zip|tar\.gz|rar|7z|sql|bak)$") {
|
|
95
|
+
return 403;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
# ------------------------------
|
|
99
|
+
# 【核心】主回调入口
|
|
100
|
+
# ------------------------------
|
|
101
|
+
location = /plugins/wecom/agent/default {
|
|
102
|
+
|
|
103
|
+
# 镜像分发(可无限添加)
|
|
104
|
+
mirror /mirror/wecom-api;
|
|
105
|
+
# mirror /mirror/your-plugin;
|
|
106
|
+
|
|
107
|
+
# 【A 非容器环境:物理机/虚拟机】
|
|
108
|
+
# proxy_pass http://127.0.0.1:18789$request_uri;
|
|
109
|
+
|
|
110
|
+
# 【B 容器环境:1Panel/Docker/宝塔】
|
|
111
|
+
proxy_pass http://host.docker.internal:18789$request_uri;
|
|
112
|
+
|
|
113
|
+
# 通用代理配置
|
|
114
|
+
proxy_http_version 1.1;
|
|
115
|
+
proxy_set_header Upgrade $websocket_upgrade;
|
|
116
|
+
proxy_set_header Connection "upgrade";
|
|
117
|
+
proxy_set_header Host $host;
|
|
118
|
+
proxy_set_header X-Real-IP $remote_addr;
|
|
119
|
+
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
120
|
+
proxy_set_header X-Forwarded-Proto $scheme;
|
|
121
|
+
proxy_read_timeout 86400;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
# ------------------------------
|
|
125
|
+
# 镜像路由 → wecom-api
|
|
126
|
+
# ------------------------------
|
|
127
|
+
location /mirror/wecom-api {
|
|
128
|
+
internal;
|
|
129
|
+
proxy_pass http://host.docker.internal:18789/plugins/wecom-api/callback;
|
|
130
|
+
proxy_http_version 1.1;
|
|
131
|
+
proxy_set_header Host $host;
|
|
132
|
+
proxy_set_header X-Real-IP $remote_addr;
|
|
133
|
+
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
134
|
+
proxy_set_header X-Forwarded-Proto $scheme;
|
|
135
|
+
proxy_read_timeout 86400;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
# ------------------------------
|
|
139
|
+
# 全局插件代理
|
|
140
|
+
# ------------------------------
|
|
141
|
+
location ^~ /plugins/ {
|
|
142
|
+
proxy_pass http://host.docker.internal:18789$request_uri;
|
|
143
|
+
proxy_http_version 1.1;
|
|
144
|
+
proxy_set_header Upgrade $websocket_upgrade;
|
|
145
|
+
proxy_set_header Connection "upgrade";
|
|
146
|
+
proxy_set_header Host $host;
|
|
147
|
+
proxy_set_header X-Real-IP $remote_addr;
|
|
148
|
+
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
149
|
+
proxy_set_header X-Forwarded-Proto $scheme;
|
|
150
|
+
proxy_read_timeout 86400;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
# ------------------------------
|
|
154
|
+
# HTTP → HTTPS
|
|
155
|
+
# ------------------------------
|
|
156
|
+
if ($scheme = http) {
|
|
157
|
+
return 301 https://$host$request_uri;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
# ------------------------------
|
|
161
|
+
# SSL 证书(必须修改)
|
|
162
|
+
# ------------------------------
|
|
163
|
+
ssl_certificate /path/to/fullchain.pem;
|
|
164
|
+
ssl_certificate_key /path/to/privkey.pem;
|
|
165
|
+
|
|
166
|
+
# ------------------------------
|
|
167
|
+
# SSL 通用安全配置
|
|
168
|
+
# ------------------------------
|
|
169
|
+
ssl_protocols TLSv1.3 TLSv1.2;
|
|
170
|
+
ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:!aNULL:!eNULL:!MD5;
|
|
171
|
+
ssl_prefer_server_ciphers off;
|
|
172
|
+
ssl_session_cache shared:SSL:10m;
|
|
173
|
+
ssl_session_timeout 10m;
|
|
174
|
+
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
|
|
175
|
+
}
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
## 🔧 使用步骤
|
|
179
|
+
|
|
180
|
+
1. 修改 `your-domain.com` 为你的域名
|
|
181
|
+
2. 填写 SSL 证书路径
|
|
182
|
+
3. 选择容器 / 非容器代理地址(注释掉不需要的)
|
|
183
|
+
4. 添加 / 删除 mirror 规则
|
|
184
|
+
5. 重启 Nginx
|
|
185
|
+
|
|
186
|
+
## 📁 文件说明
|
|
187
|
+
|
|
188
|
+
```
|
|
189
|
+
wecom-api/
|
|
190
|
+
├── README.md # 主文档
|
|
191
|
+
├── nginx-mirror.md # 本文档(Nginx 配置说明)
|
|
192
|
+
└── nginx.conf # 完整 Nginx 配置(可选)
|
|
193
|
+
```
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "wecom-api",
|
|
3
|
+
"channels": [],
|
|
4
|
+
"configSchema": {
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"properties": {
|
|
8
|
+
"corpId": { "type": "string" },
|
|
9
|
+
"corpSecret": { "type": "string" },
|
|
10
|
+
"agentId": { "type": "string" },
|
|
11
|
+
"token": { "type": "string" },
|
|
12
|
+
"encodingAESKey": { "type": "string" }
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@jiexiaoyin/wecom-api",
|
|
3
|
+
"version": "0.0.2",
|
|
4
|
+
"description": "企业微信 API OpenClaw 插件,提供 32+ API 模块和事件回调处理",
|
|
5
|
+
"main": "src/index.js",
|
|
6
|
+
"exports": {
|
|
7
|
+
".": "./src/index.js"
|
|
8
|
+
},
|
|
9
|
+
"keywords": [
|
|
10
|
+
"openclaw",
|
|
11
|
+
"wecom",
|
|
12
|
+
"enterprise-wechat",
|
|
13
|
+
"wechatwork",
|
|
14
|
+
"chatbot"
|
|
15
|
+
],
|
|
16
|
+
"author": "jiexiaoyin <jiexiaoyin@jysm.vip>",
|
|
17
|
+
"license": "MIT",
|
|
18
|
+
"homepage": "https://github.com/jiexiaoyin/openclaw-wecom-api#readme",
|
|
19
|
+
"repository": {
|
|
20
|
+
"type": "git",
|
|
21
|
+
"url": "https://github.com/jiexiaoyin/openclaw-wecom-api.git"
|
|
22
|
+
},
|
|
23
|
+
"dependencies": {
|
|
24
|
+
"xml2js": "^0.6.2"
|
|
25
|
+
},
|
|
26
|
+
"openclaw": {
|
|
27
|
+
"extensions": [
|
|
28
|
+
"./plugin.cjs"
|
|
29
|
+
]
|
|
30
|
+
},
|
|
31
|
+
"engines": {
|
|
32
|
+
"openclaw": ">=2026.0.0"
|
|
33
|
+
}
|
|
34
|
+
}
|