@yanhaidao/wecom 2.3.150 → 2.3.180

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.
Files changed (43) hide show
  1. package/README.md +238 -385
  2. package/SKILLS_CAL.md +895 -0
  3. package/SKILLS_DOC.md +2136 -0
  4. package/changelog/v2.3.16.md +11 -0
  5. package/changelog/v2.3.18.md +22 -0
  6. package/index.ts +39 -3
  7. package/package.json +2 -3
  8. package/src/agent/handler.event-filter.test.ts +11 -0
  9. package/src/agent/handler.ts +732 -643
  10. package/src/app/account-runtime.ts +46 -20
  11. package/src/app/index.ts +19 -1
  12. package/src/capability/calendar/SKILLS_CHECKLIST.md +251 -0
  13. package/src/capability/calendar/client.ts +815 -0
  14. package/src/capability/calendar/index.ts +3 -0
  15. package/src/capability/calendar/schema.ts +417 -0
  16. package/src/capability/calendar/tool.ts +417 -0
  17. package/src/capability/calendar/types.ts +309 -0
  18. package/src/capability/doc/client.ts +567 -62
  19. package/src/capability/doc/schema.ts +419 -318
  20. package/src/capability/doc/tool.ts +1510 -1178
  21. package/src/capability/doc/types.ts +130 -14
  22. package/src/capability/mcp/index.ts +10 -0
  23. package/src/capability/mcp/schema.ts +107 -0
  24. package/src/capability/mcp/tool.ts +170 -0
  25. package/src/capability/mcp/transport.ts +394 -0
  26. package/src/channel.ts +70 -28
  27. package/src/config/schema.ts +71 -102
  28. package/src/outbound.test.ts +91 -14
  29. package/src/outbound.ts +143 -30
  30. package/src/runtime/reply-orchestrator.test.ts +35 -2
  31. package/src/runtime/reply-orchestrator.ts +14 -2
  32. package/src/runtime/session-manager.ts +20 -6
  33. package/src/runtime/source-registry.ts +165 -0
  34. package/src/target.ts +7 -4
  35. package/src/transport/bot-ws/inbound.test.ts +46 -0
  36. package/src/transport/bot-ws/inbound.ts +23 -5
  37. package/src/transport/bot-ws/media.ts +269 -0
  38. package/src/transport/bot-ws/reply.test.ts +85 -17
  39. package/src/transport/bot-ws/reply.ts +109 -21
  40. package/src/transport/bot-ws/sdk-adapter.test.ts +64 -1
  41. package/src/transport/bot-ws/sdk-adapter.ts +88 -12
  42. package/.claude/settings.local.json +0 -11
  43. package/docs/update-content-fix.md +0 -135
package/SKILLS_CAL.md ADDED
@@ -0,0 +1,895 @@
1
+ # OpenClaw 企业微信日历能力技能清单
2
+
3
+ > 本清单列出所有企业微信日历相关的 MCP Tools,按功能模块分类,方便 OpenClaw 直接调用。
4
+ >
5
+ > **官方文档**: https://developer.work.weixin.qq.com/document/path/93329
6
+ > **实现版本**: v2.3.16
7
+ > **更新日期**: 2026-03-18
8
+
9
+ ---
10
+
11
+ ## 一、日历管理 (Calendar Management)
12
+
13
+ ### 1.1 创建日历
14
+
15
+ ```json
16
+ {
17
+ "name": "wecom_calendar",
18
+ "action": "calendar_create",
19
+ "description": "在企业内创建一个日历,用于日程管理和共享",
20
+ "parameters": {
21
+ "summary": "必填:string,日历标题,1-128 字符",
22
+ "color": "必填:string,RGB 颜色编码 16 进制表示,如 \"#0000FF\" 或 \"0000FF\"",
23
+ "description": "可选:string,日历描述,0-512 字符",
24
+ "admins": "可选:string[],日历管理员 userid 列表,最多 3 人",
25
+ "set_as_default": "可选:integer(0|1),是否设为默认日历,0-否,1-是(默认 0,第三方应用不支持)",
26
+ "shares": "可选:object[],日历通知范围成员列表,最多 2000 人",
27
+ "shares[].userid": "必填:string,日历通知范围成员的 id",
28
+ "shares[].permission": "可选:integer(1|3),权限(不填默认为可查看),1-可查看,3-仅查看闲忙状态",
29
+ "is_public": "可选:integer(0|1),是否公共日历,0-否,1-是(默认 0)",
30
+ "public_range": "可选:object,公开范围(仅当是公共日历时有效)",
31
+ "public_range.userids": "可选:string[],公开的成员列表范围,最多 1000 个成员",
32
+ "public_range.partyids": "可选:integer[],公开的部门列表范围,最多 100 个部门",
33
+ "is_corp_calendar": "可选:integer(0|1),是否全员日历,0-否,1-是(默认 0)"
34
+ },
35
+ "returns": {
36
+ "errcode": "integer,错误码(0 表示成功)",
37
+ "errmsg": "string,错误码描述",
38
+ "cal_id": "string,日历 ID",
39
+ "fail_result": "可选:object,无效的输入内容",
40
+ "fail_result.shares[]": "可选:object[],无效的日历通知范围成员列表",
41
+ "fail_result.shares[].errcode": "integer,错误码",
42
+ "fail_result.shares[].errmsg": "string,错误码说明",
43
+ "fail_result.shares[].userid": "string,日历通知范围成员的 id"
44
+ }
45
+ }
46
+ ```
47
+
48
+ **使用示例**:
49
+ ```json
50
+ {
51
+ "name": "wecom_calendar",
52
+ "action": "calendar_create",
53
+ "parameters": {
54
+ "summary": "技术部项目日历",
55
+ "color": "#4A90E2",
56
+ "description": "技术部项目进度和会议安排",
57
+ "admins": ["zhangsan", "lisi"],
58
+ "shares": [
59
+ {"userid": "wangwu", "permission": 1},
60
+ {"userid": "zhaoliu", "permission": 3}
61
+ ],
62
+ "is_public": 1,
63
+ "public_range": {
64
+ "userids": ["zhangsan", "lisi", "wangwu"],
65
+ "partyids": [12345]
66
+ }
67
+ }
68
+ }
69
+ ```
70
+
71
+ **注意事项**:
72
+ - 全员日历(`is_corp_calendar=1`)必须同时满足:
73
+ - `is_public=1`(全员日历也是公共日历的一种)
74
+ - 必须指定 `public_range`(不能为空)
75
+ - 不支持指定颜色、默认日历、只读权限
76
+ - 每个企业最多创建 20 个全员日历
77
+ - 每人最多创建或订阅 100 个公共日历
78
+ - `is_public` 和 `is_corp_calendar` 属性不可更新
79
+
80
+ ---
81
+
82
+ ### 1.2 更新日历
83
+
84
+ ```json
85
+ {
86
+ "name": "wecom_calendar",
87
+ "action": "calendar_update",
88
+ "description": "修改指定日历的信息(覆盖式更新,不是增量式)",
89
+ "parameters": {
90
+ "cal_id": "必填:string,日历 ID",
91
+ "summary": "必填:string,日历标题,1-128 字符",
92
+ "color": "必填:string,RGB 颜色编码 16 进制表示",
93
+ "description": "可选:string,日历描述,0-512 字符",
94
+ "admins": "可选:string[],日历管理员 userid 列表,最多 3 人",
95
+ "shares": "可选:object[],日历通知范围成员列表,最多 2000 人",
96
+ "shares[].userid": "必填:string,成员 id",
97
+ "shares[].permission": "可选:integer(1|3),权限(不填默认为可查看)",
98
+ "public_range": "可选:object,公开范围(仅当是公共日历时有效)",
99
+ "public_range.userids": "可选:string[],公开的成员列表,最多 1000 个",
100
+ "public_range.partyids": "可选:integer[],公开的部门列表,最多 100 个",
101
+ "skip_public_range": "可选:integer(0|1),是否不更新可订阅范围,0-否(默认),1-是"
102
+ },
103
+ "returns": {
104
+ "errcode": "integer,错误码",
105
+ "errmsg": "string,错误码描述",
106
+ "fail_result": "可选:object,无效的输入内容"
107
+ }
108
+ }
109
+ ```
110
+
111
+ **使用示例**:
112
+ ```json
113
+ {
114
+ "name": "wecom_calendar",
115
+ "action": "calendar_update",
116
+ "parameters": {
117
+ "cal_id": "wcjgewCwAAqeJcPI1d8Pwbjt7nttzAAA",
118
+ "summary": "技术部项目日历(更新)",
119
+ "color": "#FF5733",
120
+ "description": "更新后的描述",
121
+ "admins": ["zhangsan", "lisi", "wangwu"],
122
+ "shares": [
123
+ {"userid": "zhaoliu", "permission": 1}
124
+ ],
125
+ "skip_public_range": 1
126
+ }
127
+ }
128
+ ```
129
+
130
+ **注意事项**:
131
+ - 更新操作是**覆盖式**,不是增量式
132
+ - `is_public`、`is_corp_calendar` 属性不可更新
133
+ - `skip_public_range=0`(默认)会更新可订阅范围,`=1` 则不更新
134
+
135
+ ---
136
+
137
+ ### 1.3 获取日历详情
138
+
139
+ ```json
140
+ {
141
+ "name": "wecom_calendar",
142
+ "action": "calendar_get",
143
+ "description": "获取应用在企业内创建的日历信息",
144
+ "parameters": {
145
+ "cal_id_list": "必填:string[],日历 ID 列表,调用创建日历接口后获得,一次最多 1000 条"
146
+ },
147
+ "returns": {
148
+ "errcode": "integer,错误码",
149
+ "errmsg": "string,错误码描述",
150
+ "calendar_list": "object[],日历列表",
151
+ "calendar_list[].cal_id": "string,日历 ID",
152
+ "calendar_list[].admins": "string[],日历的管理员 userid 列表",
153
+ "calendar_list[].summary": "string,日历标题(1-128 字符)",
154
+ "calendar_list[].color": "string,日历颜色(RGB 16 进制)",
155
+ "calendar_list[].description": "string,日历描述(0-512 字符)",
156
+ "calendar_list[].shares": "object[],日历通知范围成员列表",
157
+ "calendar_list[].shares[].userid": "string,成员 id",
158
+ "calendar_list[].shares[].permission": "integer,权限(1-可查看,3-仅查看闲忙状态)",
159
+ "calendar_list[].is_public": "integer,是否公共日历(0-否,1-是)",
160
+ "calendar_list[].public_range": "object,公开范围",
161
+ "calendar_list[].public_range.userids": "string[],公开的成员列表",
162
+ "calendar_list[].public_range.partyids": "integer[],公开的部门列表",
163
+ "calendar_list[].is_corp_calendar": "integer,是否全员日历(0-否,1-是)"
164
+ }
165
+ }
166
+ ```
167
+
168
+ **使用示例**:
169
+ ```json
170
+ {
171
+ "name": "wecom_calendar",
172
+ "action": "calendar_get",
173
+ "parameters": {
174
+ "cal_id_list": [
175
+ "wcjgewCwAAqeJcPI1d8Pwbjt7nttzAAA",
176
+ "wcjgewCwAAqeJcPI1d8Pwbjt7nttzBBB"
177
+ ]
178
+ }
179
+ }
180
+ ```
181
+
182
+ ---
183
+
184
+ ### 1.4 删除日历
185
+
186
+ ```json
187
+ {
188
+ "name": "wecom_calendar",
189
+ "action": "calendar_delete",
190
+ "description": "删除指定日历",
191
+ "parameters": {
192
+ "cal_id": "必填:string,日历 ID"
193
+ },
194
+ "returns": {
195
+ "errcode": "integer,错误码",
196
+ "errmsg": "string,错误码描述"
197
+ }
198
+ }
199
+ ```
200
+
201
+ **使用示例**:
202
+ ```json
203
+ {
204
+ "name": "wecom_calendar",
205
+ "action": "calendar_delete",
206
+ "parameters": {
207
+ "cal_id": "wcjgewCwAAqeJcPI1d8Pwbjt7nttzAAA"
208
+ }
209
+ }
210
+ ```
211
+
212
+ ---
213
+
214
+ ## 二、日程管理 (Schedule Management)
215
+
216
+ ### 2.1 创建日程
217
+
218
+ ```json
219
+ {
220
+ "name": "wecom_calendar",
221
+ "action": "schedule_create",
222
+ "description": "在日历中创建一个日程",
223
+ "parameters": {
224
+ "start_time": "必填:integer,日程开始时间,Unix 时间戳(秒)",
225
+ "end_time": "必填:integer,日程结束时间,Unix 时间戳(秒)",
226
+ "is_whole_day": "可选:integer(0|1),是否全天日程,0-否(默认),1-是",
227
+ "summary": "可选:string,日程标题,0-128 字符(不填默认显示为\"新建事件\")",
228
+ "description": "可选:string,日程描述,不多于 1000 字符",
229
+ "location": "可选:string,日程地址,不多于 128 字符",
230
+ "attendees": "可选:object[],日程参与者列表,最多 1000 人",
231
+ "attendees[].userid": "必填:string,日程参与者 ID,不多于 64 字节",
232
+ "admins": "可选:string[],日程管理员 userid 列表,最多 3 人(管理员必须在共享成员列表中)",
233
+ "reminders": "可选:object,提醒相关信息",
234
+ "reminders.is_remind": "可选:integer(0|1),是否需要提醒,0-否(默认),1-是",
235
+ "reminders.is_repeat": "可选:integer(0|1),是否重复日程,0-否(默认),1-是",
236
+ "reminders.remind_before_event_secs": "可选:integer,日程开始前多少秒提醒(当 is_remind=1 时有效),仅支持:0(事件开始时),300(5 分钟),900(15 分钟),3600(1 小时),86400(1 天)",
237
+ "reminders.remind_time_diffs": "可选:integer[],提醒时间与日程开始时间的差值数组(当 is_remind=1 时有效),优先于 remind_before_event_secs,仅支持:0,-300,-900,-3600,-86400,32400(全天日程当天 09:00),-172800(全天日程前 2 天),-604800(全天日程前 1 周)",
238
+ "reminders.repeat_type": "可选:integer,重复类型(当 is_repeat=1 时有效),0-每日,1-每周,2-每月,5-每年,7-工作日",
239
+ "reminders.repeat_until": "可选:integer,重复结束时刻,Unix 时间戳(当 is_repeat=1 时有效,不填或 0 表示一直重复)",
240
+ "reminders.is_custom_repeat": "可选:integer(0|1),是否自定义重复(当 is_repeat=1 时有效),0-否(默认,系统自动计算),1-是(配合 repeat_day_of_week/repeat_day_of_month 使用)",
241
+ "reminders.repeat_interval": "可选:integer,重复间隔(仅当 is_custom_repeat=1 时有效),随 repeat_type 不同含义不同(如 repeat_type=1 每周时,3 表示每 3 周)",
242
+ "reminders.repeat_day_of_week": "可选:integer[],每周周几重复(仅当 is_custom_repeat=1 且 repeat_type=1 时有效),取值 1-7(周一至周日)",
243
+ "reminders.repeat_day_of_month": "可选:integer[],每月哪几天重复(仅当 is_custom_repeat=1 且 repeat_type=2 时有效),取值 1-31",
244
+ "reminders.timezone": "可选:integer,时区,UTC 偏移量(-12 到 +12),默认 +8(北京时间东八区)",
245
+ "cal_id": "可选:string,日程所属日历 ID(第三方应用必须指定),不多于 64 字节"
246
+ },
247
+ "returns": {
248
+ "errcode": "integer,错误码",
249
+ "errmsg": "string,错误码描述",
250
+ "schedule_id": "string,日程 ID"
251
+ }
252
+ }
253
+ ```
254
+
255
+ **使用示例** - 创建单次日程:
256
+ ```json
257
+ {
258
+ "name": "wecom_calendar",
259
+ "action": "schedule_create",
260
+ "parameters": {
261
+ "start_time": 1710835200,
262
+ "end_time": 1710838800,
263
+ "summary": "项目评审会议",
264
+ "description": "Q1 项目进度评审",
265
+ "location": "10 楼 1005 会议室",
266
+ "attendees": [
267
+ {"userid": "zhangsan"},
268
+ {"userid": "lisi"}
269
+ ],
270
+ "cal_id": "wcjgewCwAAqeJcPI1d8Pwbjt7nttzAAA",
271
+ "reminders": {
272
+ "is_remind": 1,
273
+ "remind_time_diffs": [-3600, -300],
274
+ "timezone": 8
275
+ }
276
+ }
277
+ }
278
+ ```
279
+
280
+ **使用示例** - 创建重复日程(每周三例会):
281
+ ```json
282
+ {
283
+ "name": "wecom_calendar",
284
+ "action": "schedule_create",
285
+ "parameters": {
286
+ "start_time": 1710835200,
287
+ "end_time": 1710838800,
288
+ "summary": "每周三例会",
289
+ "reminders": {
290
+ "is_remind": 1,
291
+ "remind_before_event_secs": 3600,
292
+ "is_repeat": 1,
293
+ "is_custom_repeat": 1,
294
+ "repeat_type": 1,
295
+ "repeat_interval": 1,
296
+ "repeat_day_of_week": [3],
297
+ "repeat_until": 1735689600,
298
+ "timezone": 8
299
+ }
300
+ }
301
+ }
302
+ ```
303
+
304
+ **注意事项**:
305
+ - `end_time` 必须大于 `start_time`
306
+ - `remind_time_diffs` 与 `remind_before_event_secs` 仅一个字段会生效,当 `remind_time_diffs` 有传值且列表不为空时,优先以 `remind_time_diffs` 为准
307
+ - 第三方应用必须指定 `cal_id`
308
+ - 管理员必须在共享成员(attendees)的列表中
309
+
310
+ ---
311
+
312
+ ### 2.2 更新日程
313
+
314
+ ```json
315
+ {
316
+ "name": "wecom_calendar",
317
+ "action": "schedule_update",
318
+ "description": "在日历中更新指定的日程(覆盖式更新,不是增量式)",
319
+ "parameters": {
320
+ "schedule_id": "必填:string,日程 ID(创建日程时返回的 ID)",
321
+ "start_time": "必填:integer,日程开始时间,Unix 时间戳",
322
+ "end_time": "必填:integer,日程结束时间,Unix 时间戳",
323
+ "is_whole_day": "可选:integer(0|1),是否全天日程,0-否,1-是",
324
+ "summary": "可选:string,日程标题,0-128 字符",
325
+ "description": "可选:string,日程描述,不多于 1000 字符",
326
+ "location": "可选:string,日程地址,不多于 128 字符",
327
+ "attendees": "可选:object[],日程参与者列表,最多 1000 人",
328
+ "attendees[].userid": "必填:string,参与者 ID",
329
+ "admins": "可选:string[],日程管理员,最多 3 人",
330
+ "reminders": "可选:object,提醒相关信息(参数同 schedule_create)",
331
+ "skip_attendees": "可选:integer(0|1),是否不更新参与人,0-否(默认),1-是",
332
+ "op_mode": "可选:integer,操作模式(是重复日程时有效),0-默认全部修改,1-仅修改此日程,2-修改将来的所有日程",
333
+ "op_start_time": "可选:integer,操作起始时间,Unix 时间戳(仅当 op_mode=1 或 2 时有效,必须是重复日程的某一次开始时间)"
334
+ },
335
+ "returns": {
336
+ "errcode": "integer,错误码",
337
+ "errmsg": "string,错误码描述",
338
+ "schedule_id": "string,日程 ID(修改重复日程时,如果不是修改全部周期,会返回新日程的 ID)"
339
+ }
340
+ }
341
+ ```
342
+
343
+ **使用示例** - 修改全部周期:
344
+ ```json
345
+ {
346
+ "name": "wecom_calendar",
347
+ "action": "schedule_update",
348
+ "parameters": {
349
+ "schedule_id": "17c7d2bd9f20d652840f72f59e796AAA",
350
+ "start_time": 1710842400,
351
+ "end_time": 1710846000,
352
+ "summary": "项目评审会议(时间变更)",
353
+ "location": "10 楼 1006 会议室",
354
+ "op_mode": 0
355
+ }
356
+ }
357
+ ```
358
+
359
+ **使用示例** - 仅修改单次(临时调整):
360
+ ```json
361
+ {
362
+ "name": "wecom_calendar",
363
+ "action": "schedule_update",
364
+ "parameters": {
365
+ "schedule_id": "17c7d2bd9f20d652840f72f59e796AAA",
366
+ "op_mode": 1,
367
+ "op_start_time": 1710835200,
368
+ "start_time": 1710842400,
369
+ "end_time": 1710846000,
370
+ "summary": "项目评审会议(临时调整)",
371
+ "location": "10 楼 1006 会议室"
372
+ }
373
+ }
374
+ ```
375
+
376
+ **注意事项**:
377
+ - 更新操作是**覆盖式**,不是增量式
378
+ - 不可更新创建者和日程所属日历 ID
379
+ - 已预约会议室的日程无法通过此接口更新(跟会议室关联的字段包括:start_time, end_time, is_whole_day, is_repeat, repeat_type, repeat_until, is_custom_repeat, repeat_interval, repeat_day_of_week, repeat_day_of_month, timezone)
380
+ - `op_mode=1` 时,分裂出的新日程只能是单次日程,不支持指定为重复日程(`is_repeat` 不能为 1)
381
+ - 如果 `op_mode` 是 1 或 2,`start_time` 和 `end_time` 必须是 `op_start_time` 当天或之后的时间
382
+
383
+ ---
384
+
385
+ ### 2.3 新增日程参与者
386
+
387
+ ```json
388
+ {
389
+ "name": "wecom_calendar",
390
+ "action": "schedule_add_attendees",
391
+ "description": "在日历中增量式添加日程参与者",
392
+ "parameters": {
393
+ "schedule_id": "必填:string,日程 ID",
394
+ "attendees": "必填:object[],日程参与者列表,累计最多 1000 人",
395
+ "attendees[].userid": "必填:string,日程参与者 ID,不多于 64 字节"
396
+ },
397
+ "returns": {
398
+ "errcode": "integer,错误码",
399
+ "errmsg": "string,错误码描述"
400
+ }
401
+ }
402
+ ```
403
+
404
+ **使用示例**:
405
+ ```json
406
+ {
407
+ "name": "wecom_calendar",
408
+ "action": "schedule_add_attendees",
409
+ "parameters": {
410
+ "schedule_id": "17c7d2bd9f20d652840f72f59e796AAA",
411
+ "attendees": [
412
+ {"userid": "wangwu"},
413
+ {"userid": "zhaoliu"}
414
+ ]
415
+ }
416
+ }
417
+ ```
418
+
419
+ ---
420
+
421
+ ### 2.4 删除日程参与者
422
+
423
+ ```json
424
+ {
425
+ "name": "wecom_calendar",
426
+ "action": "schedule_del_attendees",
427
+ "description": "在日历中增量式删除日程参与者",
428
+ "parameters": {
429
+ "schedule_id": "必填:string,日程 ID",
430
+ "attendees": "必填:object[],日程参与者列表,最多 1000 人",
431
+ "attendees[].userid": "必填:string,日程参与者 ID"
432
+ },
433
+ "returns": {
434
+ "errcode": "integer,错误码",
435
+ "errmsg": "string,错误码描述"
436
+ }
437
+ }
438
+ ```
439
+
440
+ **使用示例**:
441
+ ```json
442
+ {
443
+ "name": "wecom_calendar",
444
+ "action": "schedule_del_attendees",
445
+ "parameters": {
446
+ "schedule_id": "17c7d2bd9f20d652840f72f59e796AAA",
447
+ "attendees": [
448
+ {"userid": "zhaoliu"}
449
+ ]
450
+ }
451
+ }
452
+ ```
453
+
454
+ ---
455
+
456
+ ### 2.5 获取日历下的日程列表
457
+
458
+ ```json
459
+ {
460
+ "name": "wecom_calendar",
461
+ "action": "schedule_get_by_calendar",
462
+ "description": "获取指定日历下的日程列表(仅可获取应用自己创建的日历下的日程)",
463
+ "parameters": {
464
+ "cal_id": "必填:string,日历 ID",
465
+ "offset": "可选:integer,分页偏移量,默认 0",
466
+ "limit": "可选:integer,分页大小,默认 500,取值范围 1-1000"
467
+ },
468
+ "returns": {
469
+ "errcode": "integer,错误码",
470
+ "errmsg": "string,错误码描述",
471
+ "schedule_list": "object[],日程列表",
472
+ "schedule_list[].schedule_id": "string,日程 ID",
473
+ "schedule_list[].sequence": "integer,日程编号(自增数字)",
474
+ "schedule_list[].admins": "string[],管理员 userid 列表",
475
+ "schedule_list[].attendees": "object[],参与者列表",
476
+ "schedule_list[].attendees[].userid": "string,参与者 ID",
477
+ "schedule_list[].attendees[].response_status": "integer,响应状态(0-未处理,1-待定,2-全部接受,3-仅接受一次,4-拒绝)",
478
+ "schedule_list[].summary": "string,日程标题",
479
+ "schedule_list[].description": "string,日程描述",
480
+ "schedule_list[].reminders": "object,提醒信息",
481
+ "schedule_list[].location": "string,日程地址",
482
+ "schedule_list[].start_time": "integer,开始时间",
483
+ "schedule_list[].end_time": "integer,结束时间",
484
+ "schedule_list[].status": "integer,日程状态(0-正常,1-已取消)",
485
+ "schedule_list[].cal_id": "string,所属日历 ID"
486
+ }
487
+ }
488
+ ```
489
+
490
+ **使用示例**:
491
+ ```json
492
+ {
493
+ "name": "wecom_calendar",
494
+ "action": "schedule_get_by_calendar",
495
+ "parameters": {
496
+ "cal_id": "wcjgewCwAAqeJcPI1d8Pwbjt7nttzAAA",
497
+ "offset": 0,
498
+ "limit": 100
499
+ }
500
+ }
501
+ ```
502
+
503
+ **分页说明**:
504
+ - 当 `schedule_list` 为空时,表示 offset 过大,应终止获取
505
+ - 若有新增日程,可在此基础上继续增量获取
506
+
507
+ ---
508
+
509
+ ### 2.6 获取日程详情
510
+
511
+ ```json
512
+ {
513
+ "name": "wecom_calendar",
514
+ "action": "schedule_get",
515
+ "description": "获取指定日程的详细信息",
516
+ "parameters": {
517
+ "schedule_id_list": "必填:string[],日程 ID 列表,一次最多 1000 条"
518
+ },
519
+ "returns": {
520
+ "errcode": "integer,错误码",
521
+ "errmsg": "string,错误码描述",
522
+ "schedule_list": "object[],日程列表",
523
+ "schedule_list[].schedule_id": "string,日程 ID",
524
+ "schedule_list[].admins": "string[],管理员 userid 列表",
525
+ "schedule_list[].attendees": "object[],参与者列表",
526
+ "schedule_list[].attendees[].userid": "string,参与者 ID",
527
+ "schedule_list[].attendees[].response_status": "integer,响应状态",
528
+ "schedule_list[].summary": "string,日程标题",
529
+ "schedule_list[].description": "string,日程描述",
530
+ "schedule_list[].reminders": "object,提醒信息(含 exclude_time_list)",
531
+ "schedule_list[].reminders.exclude_time_list": "可选:object[],重复日程不包含的日期列表",
532
+ "schedule_list[].reminders.exclude_time_list[].start_time": "integer,不包含的日期时间戳",
533
+ "schedule_list[].location": "string,日程地址",
534
+ "schedule_list[].start_time": "integer,开始时间",
535
+ "schedule_list[].end_time": "integer,结束时间",
536
+ "schedule_list[].status": "integer,日程状态(0-正常,1-已取消)",
537
+ "schedule_list[].is_whole_day": "integer,是否全天日程",
538
+ "schedule_list[].cal_id": "string,所属日历 ID",
539
+ "meeting_code": "可选:string,会议码",
540
+ "meeting_link": "可选:string,会议链接"
541
+ }
542
+ }
543
+ ```
544
+
545
+ **使用示例**:
546
+ ```json
547
+ {
548
+ "name": "wecom_calendar",
549
+ "action": "schedule_get",
550
+ "parameters": {
551
+ "schedule_id_list": [
552
+ "17c7d2bd9f20d652840f72f59e796AAA",
553
+ "17c7d2bd9f20d652840f72f59e796BBB"
554
+ ]
555
+ }
556
+ }
557
+ ```
558
+
559
+ **注意事项**:
560
+ - 被取消的日程(`status=1`)也可以拉取详情,调用者需要检查 `status`
561
+
562
+ ---
563
+
564
+ ### 2.7 取消日程
565
+
566
+ ```json
567
+ {
568
+ "name": "wecom_calendar",
569
+ "action": "schedule_delete",
570
+ "description": "取消指定的日程",
571
+ "parameters": {
572
+ "schedule_id": "必填:string,日程 ID",
573
+ "op_mode": "可选:integer,操作模式(是重复日程时有效),0-默认删除所有日程,1-仅删除此日程,2-删除本次及后续日程",
574
+ "op_start_time": "可选:integer,操作起始时间,Unix 时间戳(仅当 op_mode=1 或 2 时有效,必须是重复日程的某一次开始时间)"
575
+ },
576
+ "returns": {
577
+ "errcode": "integer,错误码",
578
+ "errmsg": "string,错误码描述"
579
+ }
580
+ }
581
+ ```
582
+
583
+ **使用示例** - 删除所有周期:
584
+ ```json
585
+ {
586
+ "name": "wecom_calendar",
587
+ "action": "schedule_delete",
588
+ "parameters": {
589
+ "schedule_id": "17c7d2bd9f20d652840f72f59e796AAA",
590
+ "op_mode": 0
591
+ }
592
+ }
593
+ ```
594
+
595
+ **使用示例** - 仅删除单次:
596
+ ```json
597
+ {
598
+ "name": "wecom_calendar",
599
+ "action": "schedule_delete",
600
+ "parameters": {
601
+ "schedule_id": "17c7d2bd9f20d652840f72f59e796AAA",
602
+ "op_mode": 1,
603
+ "op_start_time": 1710835200
604
+ }
605
+ }
606
+ ```
607
+
608
+ ---
609
+
610
+ ### 2.8 日程回执
611
+
612
+ ```json
613
+ {
614
+ "name": "wecom_calendar",
615
+ "action": "schedule_respond",
616
+ "description": "更新日程参与人的回执状态",
617
+ "parameters": {
618
+ "schedule_id": "必填:string,日程 ID",
619
+ "op_mode": "可选:integer,操作模式(是重复日程时有效),0-默认全部修改,1-仅修改此日程,2-修改将来的所有日程",
620
+ "op_start_time": "可选:integer,操作起始时间,Unix 时间戳(仅当 op_mode=1 或 2 时有效)",
621
+ "attendee": "必填:string,日程参与者 userid",
622
+ "response_status": "必填:integer,日程参与者的接受状态,1-待定,2-接受,4-拒绝"
623
+ },
624
+ "returns": {
625
+ "errcode": "integer,错误码",
626
+ "errmsg": "string,错误码描述"
627
+ }
628
+ }
629
+ ```
630
+
631
+ **使用示例**:
632
+ ```json
633
+ {
634
+ "name": "wecom_calendar",
635
+ "action": "schedule_respond",
636
+ "parameters": {
637
+ "schedule_id": "17c7d2bd9f20d652840f72f59e796AAA",
638
+ "attendee": "zhangsan",
639
+ "response_status": 2
640
+ }
641
+ }
642
+ ```
643
+
644
+ ---
645
+
646
+ ### 2.9 同步日程
647
+
648
+ ```json
649
+ {
650
+ "name": "wecom_calendar",
651
+ "action": "schedule_sync",
652
+ "description": "同步日历下的日程(支持增量同步)",
653
+ "parameters": {
654
+ "cal_id": "必填:string,日历 ID",
655
+ "cursor": "可选:string,分页游标(首次不填)",
656
+ "limit": "可选:integer,分页大小,取值范围 1-1000"
657
+ },
658
+ "returns": {
659
+ "errcode": "integer,错误码",
660
+ "errmsg": "string,错误码描述",
661
+ "schedule_list": "object[],日程列表",
662
+ "next_cursor": "string,下次同步的游标(为空表示无更多)"
663
+ }
664
+ }
665
+ ```
666
+
667
+ **使用示例**:
668
+ ```json
669
+ {
670
+ "name": "wecom_calendar",
671
+ "action": "schedule_sync",
672
+ "parameters": {
673
+ "cal_id": "wcjgewCwAAqeJcPI1d8Pwbjt7nttzAAA",
674
+ "limit": 100
675
+ }
676
+ }
677
+ ```
678
+
679
+ ---
680
+
681
+ ## 三、默认日历本管理 (System Calendar Management)
682
+
683
+ ### 3.1 获取默认日历本 ID
684
+
685
+ ```json
686
+ {
687
+ "name": "wecom_calendar",
688
+ "action": "schedule_get_system_calid",
689
+ "description": "获取指定成员的默认日历本 ID(系统初始生成的\"xx 的日历\")",
690
+ "parameters": {
691
+ "userid": "必填:string,指定成员的 userid"
692
+ },
693
+ "returns": {
694
+ "errcode": "integer,错误码",
695
+ "errmsg": "string,错误码描述",
696
+ "cal_id": "string,默认日历本 ID"
697
+ }
698
+ }
699
+ ```
700
+
701
+ **使用示例**:
702
+ ```json
703
+ {
704
+ "name": "wecom_calendar",
705
+ "action": "schedule_get_system_calid",
706
+ "parameters": {
707
+ "userid": "zhangsan"
708
+ }
709
+ }
710
+ ```
711
+
712
+ **注意事项**:
713
+ - 此处「默认日历本」特指系统为用户初始生成的日历本"xx 的日历"
714
+ - 用户在客户端日程设置中修改「默认日历」不会影响此接口
715
+
716
+ ---
717
+
718
+ ### 3.2 在默认日历本创建日程
719
+
720
+ ```json
721
+ {
722
+ "name": "wecom_calendar",
723
+ "action": "schedule_create_in_system",
724
+ "description": "在用户默认日历本中创建日程(组织者显示为传入的 userid)",
725
+ "parameters": {
726
+ "organizer": "必填:string,日程的创建者 userid",
727
+ "start_time": "必填:integer,日程开始时间,Unix 时间戳",
728
+ "end_time": "必填:integer,日程结束时间,Unix 时间戳",
729
+ "is_whole_day": "可选:integer(0|1),是否全天日程,0-否,1-是",
730
+ "summary": "可选:string,日程标题,0-128 字符",
731
+ "description": "可选:string,日程描述,不多于 1000 字符",
732
+ "location": "可选:string,日程地址,不多于 128 字符",
733
+ "attendees": "可选:object[],日程参与者列表,最多 1000 人",
734
+ "attendees[].userid": "必填:string,参与者 ID",
735
+ "reminders": "可选:object,提醒相关信息(参数同 schedule_create)"
736
+ },
737
+ "returns": {
738
+ "errcode": "integer,错误码",
739
+ "errmsg": "string,错误码描述",
740
+ "schedule_id": "string,日程 ID"
741
+ }
742
+ }
743
+ ```
744
+
745
+ **使用示例**:
746
+ ```json
747
+ {
748
+ "name": "wecom_calendar",
749
+ "action": "schedule_create_in_system",
750
+ "parameters": {
751
+ "organizer": "zhangsan",
752
+ "start_time": 1710835200,
753
+ "end_time": 1710838800,
754
+ "summary": "个人待办事项",
755
+ "attendees": [
756
+ {"userid": "lisi"}
757
+ ],
758
+ "reminders": {
759
+ "is_remind": 1,
760
+ "remind_time_diffs": [-3600]
761
+ }
762
+ }
763
+ }
764
+ ```
765
+
766
+ **注意事项**:
767
+ - 此接口创建的日程,组织者将以接口传入的"创建者 userid"身份展示,而非应用身份
768
+ - 不可更新创建者
769
+
770
+ ---
771
+
772
+ ## 四、快速参考 (Quick Reference)
773
+
774
+ ### 4.1 接口限制
775
+
776
+ | 限制项 | 限制值 |
777
+ |--------|--------|
778
+ | 日历管理员数量 | 最多 3 人 |
779
+ | 日历通知范围成员 | 最多 2000 人 |
780
+ | 公开成员列表 | 最多 1000 个 |
781
+ | 公开部门列表 | 最多 100 个 |
782
+ | 日程参与者 | 最多 1000 人 |
783
+ | 日程标题长度 | 0-128 字符 |
784
+ | 日程描述长度 | 0-1000 字符 |
785
+ | 日程地址长度 | 0-128 字符 |
786
+ | 日历标题长度 | 1-128 字符 |
787
+ | 日历描述长度 | 0-512 字符 |
788
+ | 一次获取日历数量 | 最多 1000 个 |
789
+ | 一次获取日程数量 | 最多 1000 个 |
790
+ | 每个企业公共日历 | 3 万个 |
791
+ | 每个应用日历本 | 1 万个 |
792
+ | 每人共享日历 | 100 个 |
793
+ | 每应用每天创建日程 | 2 万个 |
794
+ | 全员日历 | 20 个 |
795
+
796
+ ### 4.2 枚举值对照表
797
+
798
+ #### 权限类型 (`permission`)
799
+ | 值 | 说明 |
800
+ |----|------|
801
+ | 1 | 可查看 |
802
+ | 3 | 仅查看闲忙状态 |
803
+
804
+ #### 提醒时间 (`remind_before_event_secs`)
805
+ | 值 | 说明 |
806
+ |----|------|
807
+ | 0 | 事件开始时 |
808
+ | 300 | 事件开始前 5 分钟 |
809
+ | 900 | 事件开始前 15 分钟 |
810
+ | 3600 | 事件开始前 1 小时 |
811
+ | 86400 | 事件开始前 1 天 |
812
+
813
+ #### 提醒时间差值 (`remind_time_diffs`)
814
+ | 值 | 说明 |
815
+ |----|------|
816
+ | 0 | 事件开始时 |
817
+ | -300 | 事件开始前 5 分钟 |
818
+ | -900 | 事件开始前 15 分钟 |
819
+ | -3600 | 事件开始前 1 小时 |
820
+ | -86400 | 事件开始前 1 天 |
821
+ | 32400 | 事件开始当天 09:00(仅全天日程) |
822
+ | -172800 | 事件开始前 2 天(仅全天日程) |
823
+ | -604800 | 事件开始前 1 周(仅全天日程) |
824
+
825
+ #### 重复类型 (`repeat_type`)
826
+ | 值 | 说明 |
827
+ |----|------|
828
+ | 0 | 每日 |
829
+ | 1 | 每周 |
830
+ | 2 | 每月 |
831
+ | 5 | 每年 |
832
+ | 7 | 工作日 |
833
+
834
+ #### 操作模式 (`op_mode`)
835
+ | 值 | 说明 |
836
+ |----|------|
837
+ | 0 | 全部修改/删除(默认) |
838
+ | 1 | 仅修改/删除此日程 |
839
+ | 2 | 修改/删除将来的所有日程 |
840
+
841
+ #### 响应状态 (`response_status`)
842
+ | 值 | 说明 |
843
+ |----|------|
844
+ | 0 | 未处理 |
845
+ | 1 | 待定 |
846
+ | 2 | 全部接受 |
847
+ | 3 | 仅接受一次 |
848
+ | 4 | 拒绝 |
849
+
850
+ #### 日程状态 (`status`)
851
+ | 值 | 说明 |
852
+ |----|------|
853
+ | 0 | 正常 |
854
+ | 1 | 已取消 |
855
+
856
+ ---
857
+
858
+ ## 五、错误处理 (Error Handling)
859
+
860
+ ### 常见错误码
861
+
862
+ | errcode | 说明 | 处理方式 |
863
+ |---------|------|----------|
864
+ | 0 | 成功 | - |
865
+ | 40001 | 凭证无效/成员不存在 | 检查 access_token 或 userid |
866
+ | 40003 | 参数类型错误 | 检查参数格式 |
867
+ | 40066 | 参数不合法 | 检查参数值范围 |
868
+ | 41013 | 日程 ID 无效 | 检查 schedule_id |
869
+ | 41015 | 日历 ID 无效 | 检查 cal_id |
870
+ | 41020 | 参与者数量超限 | 减少 attendees |
871
+ | 41021 | 日程时间冲突 | 调整时间 |
872
+ | 90482 | op_start_time 无效 | 检查是否为重复日程的某次开始时间 |
873
+ | 90484 | 重复日程模式错误 | op_mode=1 时不能设置 is_repeat=1 |
874
+ | 90485 | 非重复日程不能指定 op_mode | 移除 op_mode 参数 |
875
+
876
+ ---
877
+
878
+ ## 六、回调事件 (Callback Events)
879
+
880
+ 应用创建日历和日程后,以下事件会推送到配置的回调 URL:
881
+
882
+ | 事件类型 | 说明 | 回调数据 |
883
+ |----------|------|----------|
884
+ | `delete_calendar` | 删除日历 | CalId |
885
+ | `modify_calendar` | 修改日历 | CalId |
886
+ | `modify_schedule` | 修改日程 | CalId, ScheduleId |
887
+ | `delete_schedule` | 删除日程 | CalId, ScheduleId |
888
+ | `respond_schedule` | 日程回执 | CalId, ScheduleId, FromUserName |
889
+ | `add_schedule` | 添加日程 | CalId, ScheduleId |
890
+
891
+ ---
892
+
893
+ **文档版本**: 2026-03-18
894
+ **适用版本**: OpenClaw WeChat Plugin v2.3.16+
895
+ **官方文档**: 企业微信开放平台 - 日历 API