@jiexiaoyin/wecom-api 0.0.4 → 0.0.6

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.
@@ -0,0 +1,24 @@
1
+ name: Publish to npm
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - 'v*'
7
+
8
+ jobs:
9
+ publish:
10
+ runs-on: ubuntu-latest
11
+ permissions:
12
+ contents: read
13
+ steps:
14
+ - uses: actions/checkout@v4
15
+ - uses: actions/setup-node@v4
16
+ with:
17
+ node-version: '20'
18
+ registry-url: 'https://registry.npmjs.org'
19
+ - name: Install dependencies
20
+ run: npm ci
21
+ - name: Publish to npm
22
+ run: npm publish --access public
23
+ env:
24
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
package/README.md CHANGED
@@ -28,23 +28,26 @@
28
28
 
29
29
  ## 安装
30
30
 
31
- ### 方式一:Git 克隆
31
+ ### 方式一:npm 安装(推荐)
32
32
 
33
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
34
+ openclaw plugins install @jiexiaoyin/wecom-api
40
35
  ```
41
36
 
42
- ### 方式二:OpenClaw CLI
37
+ ### 方式二:OpenClaw CLI(Git 克隆)
43
38
 
44
39
  ```bash
45
40
  openclaw plugins install https://github.com/jiexiaoyin/openclaw-wecom-api
46
41
  ```
47
42
 
43
+ ### 方式三:手动克隆
44
+
45
+ ```bash
46
+ git clone https://github.com/jiexiaoyin/openclaw-wecom-api.git /root/.openclaw/extensions/wecom-api
47
+ cd /root/.openclaw/extensions/wecom-api
48
+ npm install
49
+ ```
50
+
48
51
  ## 配置
49
52
 
50
53
  ### 1. 修改 openclaw.json
@@ -65,6 +68,8 @@ openclaw plugins install https://github.com/jiexiaoyin/openclaw-wecom-api
65
68
 
66
69
  ### 2. 创建 config.json
67
70
 
71
+ npm 安装方式会自动注册插件到 `openclaw.json`,但需要手动创建配置:
72
+
68
73
  ```bash
69
74
  cd /root/.openclaw/extensions/wecom-api
70
75
  cp config.example.json config.json
@@ -206,6 +211,11 @@ openclaw-wecom-api/
206
211
  ## 更新
207
212
 
208
213
  ```bash
214
+ # npm 安装方式
215
+ openclaw plugins update @jiexiaoyin/wecom-api
216
+ systemctl --user restart openclaw-gateway
217
+
218
+ # 或手动更新
209
219
  cd /root/.openclaw/extensions/wecom-api
210
220
  git pull
211
221
  npm install
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jiexiaoyin/wecom-api",
3
- "version": "0.0.4",
3
+ "version": "0.0.6",
4
4
  "description": "企业微信 API OpenClaw 插件,提供 32+ API 模块和事件回调处理",
5
5
  "main": "src/index.js",
6
6
  "exports": {
@@ -1,40 +1,164 @@
1
- ---
2
- name: wecom-api
3
- description: |
4
- 企业微信 API 工具库。激活当用户提到企业微信 API、wecom-api,或需要调用企业微信 API 时。
5
- 同时支持交互式配置:说"配置企业微信"或"设置wecom-api"来启动配置向导。
6
- ---
1
+ # WeCom API Skill
7
2
 
8
- # WeCom Tool
3
+ 企业微信 API 调用技能,支持消息发送、客户管理、审批、会议、打卡、通讯录、素材等操作。
9
4
 
10
- 企业微信 API 封装,提供 30+ 个模块的接口调用能力。
5
+ ## 触发方式
11
6
 
12
- ## 交互式配置
7
+ 当用户提到企业微信相关操作时自动触发,如"发送消息"、"查询客户"、"创建会议"等。
13
8
 
14
- 当用户说"配置企业微信"、"设置wecom"或"wecom配置"时,触发配置向导:
9
+ ## 参数说明
15
10
 
16
- ```
17
- 配置企业微信
18
- ```
11
+ 所有参数通过自然语言传递,支持以下字段:
19
12
 
20
- 配置向导会引导用户输入:
21
- 1. 企业ID (corpId)
22
- 2. 应用Secret (corpSecret)
23
- 3. 应用AgentID (agentId)
24
- 4. 回调Token(可选)
25
- 5. 回调EncodingAESKey(可选)
13
+ | 参数 | 类型 | 说明 |
14
+ |------|------|------|
15
+ | userId / toUser | string | 用户ID或手机号/邮箱 |
16
+ | externalUserId | string | 外部联系人ID |
17
+ | agentId | string | 应用AgentID |
18
+ | content / text | string | 消息内容 |
19
+ | startTime / endTime | number | 时间戳(毫秒) |
20
+ | startDate / endDate | string | 日期(YYYY-MM-DD) |
21
+ | departmentId | number | 部门ID,默认1 |
22
+ | filePath | string | 文件路径 |
23
+ | chatId | string | 群ID |
26
24
 
27
- 配置完成后会自动保存到 config.json。
25
+ ## 支持的动作
28
26
 
29
- ## 使用示例
27
+ ### 💬 消息发送
30
28
 
31
- ```
32
- # 测试连接
33
- /skill wecom-api test_connection
29
+ | 动作 | 说明 |
30
+ |------|------|
31
+ | `send_message` | 发送文本消息(兼容旧名) |
32
+ | `send_text` | 发送文本消息 |
33
+ | `send_text_card` | 发送文本卡片 |
34
+ | `send_markdown` | 发送 Markdown 消息 |
35
+ | `send_template_card` | 发送模板卡片 |
36
+ | `send_image` | 发送图片消息 |
37
+ | `send_file` | 发送文件消息 |
38
+ | `send_video` | 发送视频消息 |
39
+ | `send_news` | 发送图文消息 |
40
+
41
+ ### 👥 客户联系
42
+
43
+ | 动作 | 说明 |
44
+ |------|------|
45
+ | `get_customer_list` | 获取客户列表 |
46
+ | `get_customer_detail` | 获取客户详情 |
47
+ | `get_external_user_info` | 获取外部联系人信息 |
48
+ | `batch_get_customers` | 批量获取客户详情 |
49
+ | `update_customer_remark` | 更新客户备注 |
50
+ | `get_corp_tags` | 获取企业标签 |
51
+ | `add_corp_tag` | 添加企业标签 |
52
+ | `update_corp_tag` | 更新标签 |
53
+ | `get_groupchat_list` | 获取客户群列表 |
54
+ | `get_groupchat` | 获取客户群详情 |
55
+
56
+ ### 📊 客户统计
57
+
58
+ | 动作 | 说明 |
59
+ |------|------|
60
+ | `get_user_client_stat` | 员工客户统计数据 |
61
+ | `get_all_user_client_stat` | 全量员工客户统计 |
62
+ | `get_user_client_detail` | 员工客户明细 |
63
+ | `get_group_chat_stat` | 客户群统计 |
64
+ | `get_user_lost_stat` | 客户流失统计 |
65
+
66
+ ### 📋 审批
67
+
68
+ | 动作 | 说明 |
69
+ |------|------|
70
+ | `get_approval_list` | 获取审批列表 |
71
+ | `get_approval_detail` | 获取审批详情 |
72
+ | `get_template_detail` | 获取审批模板详情 |
73
+ | `submit_approval` | 提交审批 |
74
+ | `get_leave_config` | 获取假期配置 |
75
+ | `get_leave_balance` | 获取假期余额 |
76
+ | `create_template` | 创建审批模板 |
77
+ | `update_template` | 更新审批模板 |
78
+
79
+ ### 📅 会议
80
+
81
+ | 动作 | 说明 |
82
+ |------|------|
83
+ | `create_meeting` | 创建会议 |
84
+ | `get_meeting_list` | 获取会议列表 |
85
+ | `get_meeting_detail` | 获取会议详情 |
86
+ | `cancel_meeting` | 取消会议 |
87
+ | `invite_meeting` | 邀请成员参会 |
88
+
89
+ ### 🏢 通讯录
90
+
91
+ | 动作 | 说明 |
92
+ |------|------|
93
+ | `get_user_list` | 获取部门成员 |
94
+ | `get_department_users_detail` | 获取部门成员详情 |
95
+ | `get_department_list` | 获取部门列表 |
96
+ | `get_user` | 获取用户详情 |
97
+ | `get_user_by_mobile` | 手机号查用户 |
98
+ | `get_user_by_email` | 邮箱查用户 |
99
+ | `create_user` | 创建成员 |
100
+ | `update_user` | 更新成员信息 |
101
+ | `delete_user` | 删除成员 |
34
102
 
35
- # 发送消息
36
- /skill wecom-api send_message --userId user001 --content "Hello"
103
+ ### ⏰ 打卡
37
104
 
38
- # 获取客户列表
39
- /skill wecom-api get_customer_list --userId user001
105
+ | 动作 | 说明 |
106
+ |------|------|
107
+ | `get_checkin_records` | 获取打卡记录 |
108
+ | `get_checkin_rules` | 获取打卡规则 |
109
+
110
+ ### 📆 日程
111
+
112
+ | 动作 | 说明 |
113
+ |------|------|
114
+ | `create_calendar` | 创建日历 |
115
+ | `get_calendar` | 获取日历详情 |
116
+ | `create_event` | 创建日程事件 |
117
+ | `update_event` | 更新日程事件 |
118
+ | `delete_event` | 删除日程 |
119
+ | `add_event_attendees` | 添加参与者 |
120
+
121
+ ### 📁 素材
122
+
123
+ | 动作 | 说明 |
124
+ |------|------|
125
+ | `upload_image` | 上传图片 |
126
+ | `upload_media` | 上传媒体文件 |
127
+ | `get_media` | 下载媒体文件 |
128
+ | `get_high_definition_voice` | 获取高清语音 |
129
+
130
+ ### 📱 应用
131
+
132
+ | 动作 | 说明 |
133
+ |------|------|
134
+ | `get_agent_list` | 获取应用列表 |
135
+ | `get_agent` | 获取应用详情 |
136
+ | `set_agent` | 设置应用 |
137
+
138
+ ### 🔧 工具
139
+
140
+ | 动作 | 说明 |
141
+ |------|------|
142
+ | `get_token` | 获取 AccessToken |
143
+ | `get_callback_ip` | 获取回调IP |
144
+
145
+ ### ⚙️ 配置
146
+
147
+ | 动作 | 说明 |
148
+ |------|------|
149
+ | `status` / `show_config` | 查看当前配置 |
150
+ | `test_connection` | 测试连接 |
151
+
152
+ ## 使用示例
153
+
154
+ ```
155
+ 发送消息给张三,内容是测试
156
+ 查一下张三的客户列表
157
+ 查询昨天的打卡记录
158
+ 创建一个会议,主题是周会,时间是明天下午2点
159
+ 查一下客户统计,从3月1日到3月7日
160
+ 上传图片到素材库
161
+ 获取审批列表,3月1日到3月7日
162
+ 给李四添加客户备注
163
+ 查一下客户群列表
40
164
  ```
@@ -230,24 +230,132 @@ async function executeAction(action, params) {
230
230
  const wecom = getWecom();
231
231
  const args = { ...params };
232
232
  delete args.action;
233
-
233
+
234
234
  try {
235
235
  switch (action) {
236
+
237
+ // ========== 消息发送 ==========
236
238
  case 'send_message':
237
239
  return await wecom.message.sendText(args.userId, args.content, args.agentId);
238
-
240
+
241
+ case 'send_text':
242
+ return await wecom.message.sendText(args.toUser, args.content, args.agentId);
243
+
244
+ case 'send_text_card':
245
+ return await wecom.message.sendTextCard(args.toUser, args.title, args.content, args.agentId);
246
+
247
+ case 'send_markdown':
248
+ return await wecom.message.sendMarkdown(args.toUser, args.content, args.agentId);
249
+
250
+ case 'send_template_card':
251
+ return await wecom.message.sendTemplateCard(args.toUser, args.templateCard, args.agentId);
252
+
253
+ case 'send_image':
254
+ return await wecom.message.sendImage(args.toUser, args.mediaId, args.agentId);
255
+
256
+ case 'send_file':
257
+ return await wecom.message.sendFile(args.toUser, args.mediaId, args.agentId);
258
+
259
+ case 'send_video':
260
+ return await wecom.message.sendVideo(args.toUser, args.mediaId, args.agentId);
261
+
262
+ case 'send_news':
263
+ return await wecom.message.sendNews(args.toUser, args.articles, args.agentId);
264
+
265
+ // ========== 客户联系 ==========
239
266
  case 'get_customer_list':
240
- return await wecom.contact.getCustomerList(args.userId);
241
-
267
+ return await wecom.contact.getCustomerList(args.userId, args.cursor);
268
+
242
269
  case 'get_customer_detail':
243
270
  return await wecom.contact.getCustomerDetail(args.userId, args.externalUserId);
244
-
271
+
272
+ case 'get_external_user_info':
273
+ return await wecom.contact.getExternalUserInfo(args.userId);
274
+
275
+ case 'batch_get_customers':
276
+ return await wecom.contact.batchGetCustomers(args.userId, args.externalUserIds);
277
+
278
+ case 'update_customer_remark':
279
+ return await wecom.contact.updateCustomerRemark(args.userId, args.externalUserId, {
280
+ remark: args.remark,
281
+ description: args.description,
282
+ tagIds: args.tagIds
283
+ });
284
+
285
+ case 'get_corp_tags':
286
+ return await wecom.contact.getCorpTags();
287
+
288
+ case 'add_corp_tag':
289
+ return await wecom.contact.addCorpTag(args.groupId, args.tagName, args.groupName);
290
+
291
+ case 'update_corp_tag':
292
+ return await wecom.contact.updateCorpTag(args.tagId, args.tagName);
293
+
294
+ case 'get_groupchat_list':
295
+ return await wecom.contact.getGroupChatList(args.statusFilter, args.creatorUserid, args.limit, args.cursor);
296
+
297
+ case 'get_groupchat':
298
+ return await wecom.contact.getGroupChat(args.chatId);
299
+
300
+ // ========== 客户管理(独立模块) ==========
301
+ case 'get_all_customers':
302
+ return await wecom.customer.getCustomerList(args.userid);
303
+
304
+ case 'get_all_customer_detail':
305
+ return await wecom.customer.getCustomerDetail(args.externalUserId);
306
+
307
+ case 'batch_get_customers_by_user':
308
+ return await wecom.customer.batchGetByUser(args.userids);
309
+
310
+ case 'mark_customer_tag':
311
+ return await wecom.customer.markTag(args.externalUserId, args.tagIds, args.userid, args.operation);
312
+
313
+ // ========== 客户统计 ==========
314
+ case 'get_user_client_stat':
315
+ return await wecom.contact_stats.getUserClientStat(args.userId, args.startDate, args.endDate);
316
+
317
+ case 'get_all_user_client_stat':
318
+ return await wecom.contact_stats.getAllUserClientStat(args.startDate, args.endDate);
319
+
320
+ case 'get_user_client_detail':
321
+ return await wecom.contact_stats.getUserClientDetail(args.userId, args.startDate, args.endDate);
322
+
323
+ case 'get_group_chat_stat':
324
+ return await wecom.contact_stats.getGroupChatStat(args.startDate, args.endDate, args.userId, args.departmentId);
325
+
326
+ case 'get_user_lost_stat':
327
+ return await wecom.contact_stats.getUserLostStat(args.startDate, args.endDate, args.userId);
328
+
329
+ // ========== 审批 ==========
245
330
  case 'get_approval_list':
246
- return await wecom.approval.getApprovalIds(args.startTime, args.endTime);
247
-
331
+ return await wecom.approval.getApprovalIds(args.startTime, args.endTime, args.cursor, args.size);
332
+
248
333
  case 'get_approval_detail':
249
334
  return await wecom.approval.getApprovalDetail(args.spNo);
250
-
335
+
336
+ case 'get_template_detail':
337
+ return await wecom.approval.getTemplateDetail(args.templateId);
338
+
339
+ case 'submit_approval':
340
+ return await wecom.approval.submitApproval({
341
+ templateId: args.templateId,
342
+ callerUserid: args.userId,
343
+ ...args.approvalData
344
+ });
345
+
346
+ case 'get_leave_config':
347
+ return await wecom.approval.getLeaveConfig();
348
+
349
+ case 'get_leave_balance':
350
+ return await wecom.approval.getLeaveBalance(args.userId);
351
+
352
+ case 'create_template':
353
+ return await wecom.approval.createTemplate(args.templateData);
354
+
355
+ case 'update_template':
356
+ return await wecom.approval.updateTemplate(args.templateId, args.templateData);
357
+
358
+ // ========== 会议 ==========
251
359
  case 'create_meeting':
252
360
  return await wecom.meeting.createMeeting({
253
361
  topic: args.topic,
@@ -255,28 +363,125 @@ async function executeAction(action, params) {
255
363
  endTime: args.endTime,
256
364
  organizers: [args.userId]
257
365
  });
258
-
366
+
367
+ case 'get_meeting_list':
368
+ return await wecom.meeting.getMeetingList(args.userId, args.startTime, args.endTime, args.cursor);
369
+
370
+ case 'get_meeting_detail':
371
+ return await wecom.meeting.getMeetingDetail(args.meetingId);
372
+
373
+ case 'cancel_meeting':
374
+ return await wecom.meeting.cancelMeeting(args.meetingId, args.userId);
375
+
376
+ case 'invite_meeting':
377
+ return await wecom.meeting.inviteMeeting(args.meetingId, args.userIds);
378
+
379
+ // ========== 通讯录 ==========
259
380
  case 'get_user_list':
260
381
  return await wecom.addressbook.getDepartmentUsers(args.departmentId || 1, args.fetchChild || false);
261
-
382
+
383
+ case 'get_department_users_detail':
384
+ return await wecom.addressbook.getDepartmentUsersDetail(args.departmentId || 1, args.fetchChild || false);
385
+
262
386
  case 'get_department_list':
263
387
  return await wecom.addressbook.getDepartmentList(args.departmentId);
264
-
388
+
389
+ case 'get_user':
390
+ return await wecom.addressbook.getUser(args.userId);
391
+
392
+ case 'get_user_by_mobile':
393
+ return await wecom.addressbook.getUserIdByMobile(args.mobile);
394
+
395
+ case 'get_user_by_email':
396
+ return await wecom.addressbook.getUserIdByEmail(args.email);
397
+
398
+ case 'create_user':
399
+ return await wecom.addressbook.createUser(args.userData);
400
+
401
+ case 'update_user':
402
+ return await wecom.addressbook.updateUser(args.userData);
403
+
404
+ case 'delete_user':
405
+ return await wecom.addressbook.deleteUser(args.userId);
406
+
407
+ // ========== 打卡 ==========
265
408
  case 'get_checkin_records':
266
409
  return await wecom.checkin.getCheckInRecords(args.startTime, args.endTime, args.userId);
267
-
268
- case 'get_corp_tags':
269
- return await wecom.contact.getCorpTags();
270
-
271
- case 'get_groupchat_list':
272
- return await wecom.contact.getGroupChatList(args.cursor, args.size);
273
-
410
+
411
+ case 'get_checkin_rules':
412
+ return await wecom.checkin.getCheckInRules(args.groupId);
413
+
414
+ // ========== 日程 ==========
415
+ case 'create_calendar':
416
+ return await wecom.schedule.createCalendar({
417
+ title: args.title,
418
+ color: args.color,
419
+ description: args.description,
420
+ shares: args.shares || []
421
+ });
422
+
423
+ case 'get_calendar':
424
+ return await wecom.schedule.getCalendar(args.calendarId);
425
+
426
+ case 'create_event':
427
+ return await wecom.schedule.createEvent({
428
+ calendarId: args.calendarId,
429
+ title: args.title,
430
+ startTime: args.startTime,
431
+ endTime: args.endTime,
432
+ attendees: args.attendees || [],
433
+ description: args.description,
434
+ location: args.location,
435
+ reminders: args.reminders
436
+ });
437
+
438
+ case 'update_event':
439
+ return await wecom.schedule.updateEvent(args.scheduleId, {
440
+ title: args.title,
441
+ startTime: args.startTime,
442
+ endTime: args.endTime,
443
+ attendees: args.attendees,
444
+ description: args.description,
445
+ location: args.location
446
+ });
447
+
448
+ case 'delete_event':
449
+ return await wecom.schedule.deleteEvent(args.scheduleId);
450
+
451
+ case 'add_event_attendees':
452
+ return await wecom.schedule.addEventAttendees(args.scheduleId, args.attendees);
453
+
454
+ // ========== 素材 ==========
455
+ case 'upload_image':
456
+ return await wecom.media.uploadImage(args.filePath);
457
+
458
+ case 'upload_media':
459
+ return await wecom.media.uploadMedia(args.filePath, args.type);
460
+
461
+ case 'get_media':
462
+ return await wecom.media.getMedia(args.mediaId, args.savePath);
463
+
464
+ case 'get_high_definition_voice':
465
+ return await wecom.media.getHighDefinitionVoice(args.mediaId, args.savePath);
466
+
467
+ // ========== 应用 ==========
274
468
  case 'get_agent_list':
275
469
  return await wecom.app.getAgentList();
276
-
470
+
471
+ case 'get_agent':
472
+ return await wecom.app.getAgent(args.agentId);
473
+
474
+ case 'set_agent':
475
+ return await wecom.app.setAgent(args.agentData);
476
+
477
+ // ========== 工具 ==========
277
478
  case 'get_token':
278
- return await wecom.approval.getAccessToken();
279
-
479
+ return await wecom.auth.getAccessToken();
480
+
481
+ case 'get_callback_ip':
482
+ return await wecom.auth.getCallbackIP();
483
+
484
+ // ========== 未知 ==========
280
485
  default:
281
486
  return { message: `未知的操作: ${action}` };
282
487
  }