@zhin.js/adapter-wecom 0.0.1

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,586 @@
1
+ /**
2
+ * 企业微信 Endpoint 实现
3
+ */
4
+ import { formatCompact, Message, segment } from 'zhin.js';
5
+ import { registerFetchRoute } from '@zhin.js/host-router/router';
6
+ import { createHash, createDecipheriv } from 'node:crypto';
7
+ import { normalizeWecomSenderForPermit } from './platform-permit.js';
8
+ export class WecomEndpoint {
9
+ adapter;
10
+ $config;
11
+ $connected;
12
+ router;
13
+ accessToken;
14
+ baseURL;
15
+ aesKey;
16
+ corpId;
17
+ #refreshPromise = null;
18
+ get $id() {
19
+ return this.$config.name;
20
+ }
21
+ get logger() {
22
+ return this.adapter.plugin.logger;
23
+ }
24
+ constructor(adapter, router, $config) {
25
+ this.adapter = adapter;
26
+ this.$config = $config;
27
+ this.router = router;
28
+ this.$connected = false;
29
+ this.accessToken = { access_token: '', expires_in: 0, timestamp: 0 };
30
+ this.baseURL = $config.apiBaseUrl || 'https://qyapi.weixin.qq.com';
31
+ this.corpId = $config.corpId;
32
+ this.aesKey = Buffer.from($config.encodingAESKey + '=', 'base64');
33
+ if (this.aesKey.length !== 32) {
34
+ throw new Error(`encodingAESKey must produce a 32-byte key, got ${this.aesKey.length} bytes`);
35
+ }
36
+ this.setupWebhookRoute();
37
+ }
38
+ // ── HTTP helpers ──
39
+ async request(path, options = {}) {
40
+ await this.ensureAccessToken();
41
+ const { method = 'GET', params = {}, body } = options;
42
+ const urlParams = new URLSearchParams({
43
+ ...params,
44
+ access_token: this.accessToken.access_token,
45
+ });
46
+ const url = `${this.baseURL}${path}?${urlParams.toString()}`;
47
+ const fetchOptions = {
48
+ method,
49
+ headers: { 'Content-Type': 'application/json; charset=utf-8' },
50
+ };
51
+ if (body && method === 'POST') {
52
+ fetchOptions.body = JSON.stringify(body);
53
+ }
54
+ const response = await fetch(url, fetchOptions);
55
+ if (!response.ok) {
56
+ const text = await response.text().catch(() => '');
57
+ throw new Error(`WeCom API error ${response.status}: ${text}`);
58
+ }
59
+ return await response.json();
60
+ }
61
+ // ── Webhook route ──
62
+ setupWebhookRoute() {
63
+ const webhookPath = this.$config.webhookPath || '/wecom/callback';
64
+ registerFetchRoute(this.router, 'GET', webhookPath, (ctx) => {
65
+ void this.handleVerification(ctx);
66
+ });
67
+ registerFetchRoute(this.router, 'POST', webhookPath, (ctx) => {
68
+ void this.handleWebhook(ctx);
69
+ });
70
+ }
71
+ // ── URL 验证(企业微信首次配置回调 URL 时的 GET 请求)──
72
+ handleVerification(ctx) {
73
+ try {
74
+ const { msg_signature, timestamp, nonce, echostr } = ctx.query;
75
+ if (!msg_signature || !timestamp || !nonce || !echostr) {
76
+ ctx.status = 400;
77
+ ctx.body = 'Missing required query parameters';
78
+ return;
79
+ }
80
+ if (!this.verifySignature(msg_signature, timestamp, nonce, echostr)) {
81
+ this.logger.warn(formatCompact({ op: 'verify', ok: false, error: 'invalid signature' }));
82
+ ctx.status = 403;
83
+ ctx.body = 'Forbidden';
84
+ return;
85
+ }
86
+ // 解密 echostr 并返回明文
87
+ const decrypted = this.decryptMessage(echostr);
88
+ ctx.status = 200;
89
+ ctx.body = decrypted;
90
+ }
91
+ catch (error) {
92
+ this.logger.error('URL verification error:', error);
93
+ ctx.status = 500;
94
+ ctx.body = 'Internal Server Error';
95
+ }
96
+ }
97
+ // ── 消息回调处理 ──
98
+ async handleWebhook(ctx) {
99
+ try {
100
+ const query = ctx.query;
101
+ const msgSignature = query.msg_signature;
102
+ const timestamp = query.timestamp;
103
+ const nonce = query.nonce;
104
+ // 解析 XML body
105
+ const rawBody = typeof ctx.request.body === 'string'
106
+ ? ctx.request.body
107
+ : String(ctx.request.body || '');
108
+ // 从 XML 中提取 Encrypt 字段
109
+ const encryptMatch = rawBody.match(/<Encrypt><!\[CDATA\[(.+?)\]\]><\/Encrypt>/);
110
+ if (!encryptMatch) {
111
+ this.logger.warn(formatCompact({ op: 'webhook', ok: false, error: 'no Encrypt field' }));
112
+ ctx.status = 200;
113
+ ctx.body = 'success';
114
+ return;
115
+ }
116
+ const encrypted = encryptMatch[1];
117
+ // 验证签名
118
+ if (!this.verifySignature(msgSignature, timestamp, nonce, encrypted)) {
119
+ this.logger.warn(formatCompact({ op: 'webhook', ok: false, error: 'invalid signature' }));
120
+ ctx.status = 403;
121
+ ctx.body = 'Forbidden';
122
+ return;
123
+ }
124
+ // 解密消息
125
+ const decryptedXml = this.decryptMessage(encrypted);
126
+ const message = this.parseXmlMessage(decryptedXml);
127
+ if (message) {
128
+ await this.handleMessage(message);
129
+ }
130
+ ctx.status = 200;
131
+ ctx.body = 'success';
132
+ }
133
+ catch (error) {
134
+ this.logger.error('Webhook error:', error);
135
+ ctx.status = 200;
136
+ ctx.body = 'success';
137
+ }
138
+ }
139
+ // ── 签名验证(SHA1 排序拼接)──
140
+ verifySignature(signature, timestamp, nonce, encrypt) {
141
+ try {
142
+ const arr = [this.$config.token, timestamp, nonce, encrypt].sort();
143
+ const str = arr.join('');
144
+ const hash = createHash('sha1').update(str).digest('hex');
145
+ return hash === signature;
146
+ }
147
+ catch (error) {
148
+ this.logger.error('Signature verification error:', error);
149
+ return false;
150
+ }
151
+ }
152
+ // ── AES-CBC 解密 ──
153
+ decryptMessage(encrypted) {
154
+ const buf = Buffer.from(encrypted, 'base64');
155
+ const iv = this.aesKey.subarray(0, 16);
156
+ const decipher = createDecipheriv('aes-256-cbc', this.aesKey, iv);
157
+ decipher.setAutoPadding(false);
158
+ const decrypted = Buffer.concat([decipher.update(buf), decipher.final()]);
159
+ // PKCS7 unpad
160
+ const pad = decrypted[decrypted.length - 1];
161
+ const content = decrypted.subarray(0, decrypted.length - pad);
162
+ // 提取: 16 字节随机数 + 4 字节消息长度 + 消息体 + corpId
163
+ const msgLen = content.readUInt32BE(16);
164
+ const msg = content.subarray(20, 20 + msgLen).toString('utf8');
165
+ const extractedCorpId = content.subarray(20 + msgLen).toString('utf8');
166
+ if (extractedCorpId !== this.corpId) {
167
+ this.logger.warn(formatCompact({ op: 'decrypt', ok: false, error: 'corpId mismatch' }));
168
+ }
169
+ return msg;
170
+ }
171
+ // ── XML 解析(简易,无外部依赖)──
172
+ parseXmlMessage(xml) {
173
+ try {
174
+ const get = (tag) => {
175
+ const m = xml.match(new RegExp(`<${tag}><!\\[CDATA\\[(.+?)\\]\\]><\\/${tag}>`))
176
+ || xml.match(new RegExp(`<${tag}>(.+?)<\\/${tag}>`));
177
+ return m ? m[1] : undefined;
178
+ };
179
+ const msgType = get('MsgType');
180
+ if (!msgType)
181
+ return null;
182
+ const msg = {
183
+ ToUserName: get('ToUserName') || '',
184
+ FromUserName: get('FromUserName') || '',
185
+ CreateTime: Number(get('CreateTime') || Date.now()),
186
+ MsgType: msgType,
187
+ MsgId: get('MsgId'),
188
+ AgentID: get('AgentID'),
189
+ };
190
+ switch (msgType) {
191
+ case 'text':
192
+ msg.Content = get('Content');
193
+ break;
194
+ case 'image':
195
+ msg.PicUrl = get('PicUrl');
196
+ msg.MediaId = get('MediaId');
197
+ break;
198
+ case 'voice':
199
+ msg.MediaId = get('MediaId');
200
+ msg.Format = get('Format');
201
+ msg.Recognition = get('Recognition');
202
+ break;
203
+ case 'video':
204
+ case 'shortvideo':
205
+ msg.MediaId = get('MediaId');
206
+ msg.ThumbMediaId = get('ThumbMediaId');
207
+ break;
208
+ case 'location':
209
+ msg.Location_X = get('Location_X');
210
+ msg.Location_Y = get('Location_Y');
211
+ msg.Scale = get('Scale');
212
+ msg.Label = get('Label');
213
+ break;
214
+ case 'link':
215
+ msg.Title = get('Title');
216
+ msg.Description = get('Description');
217
+ msg.Url = get('Url');
218
+ break;
219
+ case 'event':
220
+ msg.Event = get('Event');
221
+ msg.EventKey = get('EventKey');
222
+ break;
223
+ }
224
+ return msg;
225
+ }
226
+ catch (error) {
227
+ this.logger.error('Failed to parse XML message:', error);
228
+ return null;
229
+ }
230
+ }
231
+ // ── 消息处理 ──
232
+ async handleMessage(msg) {
233
+ const formatted = this.$formatMessage(msg);
234
+ this.adapter.emit('message.receive', formatted);
235
+ this.logger.debug(formatCompact({
236
+ op: 'recv',
237
+ endpoint: this.$config.name,
238
+ channel: formatted.$channel.type,
239
+ id: formatted.$channel.id,
240
+ len: segment.raw(formatted.$content).length,
241
+ }));
242
+ }
243
+ // ── Access Token 管理 ──
244
+ async ensureAccessToken() {
245
+ const now = Date.now();
246
+ if (this.accessToken.access_token &&
247
+ now < this.accessToken.timestamp + (this.accessToken.expires_in - 300) * 1000) {
248
+ return;
249
+ }
250
+ if (this.#refreshPromise) {
251
+ await this.#refreshPromise;
252
+ return;
253
+ }
254
+ this.#refreshPromise = this.refreshAccessToken()
255
+ .then(() => this.accessToken.access_token)
256
+ .finally(() => { this.#refreshPromise = null; });
257
+ await this.#refreshPromise;
258
+ }
259
+ async refreshAccessToken() {
260
+ try {
261
+ const url = `${this.baseURL}/cgi-bin/gettoken?corpid=${this.corpId}&corpsecret=${this.$config.agentSecret}`;
262
+ const response = await fetch(url);
263
+ const data = await response.json();
264
+ if (data.errcode === 0) {
265
+ this.accessToken = {
266
+ access_token: data.access_token,
267
+ expires_in: data.expires_in,
268
+ timestamp: Date.now(),
269
+ };
270
+ this.logger.debug('Access token refreshed successfully');
271
+ }
272
+ else {
273
+ throw new Error(`Failed to get access token: ${data.errmsg} (${data.errcode})`);
274
+ }
275
+ }
276
+ catch (error) {
277
+ this.logger.error('Failed to refresh access token:', error);
278
+ throw error;
279
+ }
280
+ }
281
+ // ── $formatMessage ──
282
+ $formatMessage(msg) {
283
+ const content = this.parseMessageContent(msg);
284
+ // 企业微信中群消息与私聊消息的判断:
285
+ // 群消息 FromUserName 以 @chatroom 结尾
286
+ const chatType = msg.FromUserName.endsWith('@chatroom') ? 'group' : 'private';
287
+ // TODO: v1: look up group admin status via WeCom API
288
+ const permit = normalizeWecomSenderForPermit({ isAdmin: false, isOwner: false });
289
+ return Message.from(msg, {
290
+ $id: msg.MsgId || Date.now().toString(),
291
+ $adapter: 'wecom',
292
+ $endpoint: this.$config.name,
293
+ $sender: {
294
+ id: msg.FromUserName,
295
+ name: msg.FromUserName,
296
+ role: permit.role,
297
+ permissions: permit.permissions,
298
+ },
299
+ $channel: {
300
+ id: chatType === 'group' ? msg.FromUserName : msg.FromUserName,
301
+ type: chatType,
302
+ },
303
+ $content: content,
304
+ $raw: JSON.stringify(msg),
305
+ $timestamp: (msg.CreateTime || Math.floor(Date.now() / 1000)) * 1000,
306
+ $recall: async () => {
307
+ await this.$recallMessage(msg.MsgId || '');
308
+ },
309
+ $reply: async (content) => {
310
+ return await this.adapter.sendMessage({
311
+ context: 'wecom',
312
+ endpoint: this.$config.name,
313
+ id: msg.FromUserName,
314
+ type: chatType,
315
+ content: content,
316
+ });
317
+ },
318
+ });
319
+ }
320
+ parseMessageContent(msg) {
321
+ const content = [];
322
+ if (!msg.MsgType)
323
+ return content;
324
+ try {
325
+ switch (msg.MsgType) {
326
+ case 'text':
327
+ if (msg.Content) {
328
+ content.push(segment('text', { content: msg.Content }));
329
+ }
330
+ break;
331
+ case 'image':
332
+ if (msg.MediaId) {
333
+ content.push(segment('image', {
334
+ file: msg.MediaId,
335
+ url: msg.PicUrl || '',
336
+ }));
337
+ }
338
+ break;
339
+ case 'voice':
340
+ if (msg.MediaId) {
341
+ content.push(segment('audio', {
342
+ file: msg.MediaId,
343
+ }));
344
+ // 语音识别结果
345
+ if (msg.Recognition) {
346
+ content.push(segment('text', { content: msg.Recognition }));
347
+ }
348
+ }
349
+ break;
350
+ case 'video':
351
+ case 'shortvideo':
352
+ if (msg.MediaId) {
353
+ content.push(segment('video', {
354
+ file: msg.MediaId,
355
+ }));
356
+ }
357
+ break;
358
+ case 'location':
359
+ content.push(segment('text', {
360
+ content: `[位置] ${msg.Label || ''} (${msg.Location_X}, ${msg.Location_Y})`,
361
+ }));
362
+ break;
363
+ case 'link':
364
+ content.push(segment('link', {
365
+ title: msg.Title || '',
366
+ content: msg.Description || '',
367
+ url: msg.Url || '',
368
+ }));
369
+ break;
370
+ case 'event':
371
+ content.push(segment('text', {
372
+ content: `[事件] ${msg.Event || ''} ${msg.EventKey || ''}`,
373
+ }));
374
+ break;
375
+ default:
376
+ content.push(segment('text', {
377
+ content: `[不支持的消息类型: ${msg.MsgType}]`,
378
+ }));
379
+ break;
380
+ }
381
+ }
382
+ catch (error) {
383
+ this.logger.error('Failed to parse message content:', error);
384
+ content.push(segment('text', { content: '[消息解析失败]' }));
385
+ }
386
+ return content;
387
+ }
388
+ // ── $sendMessage ──
389
+ async $sendMessage(options) {
390
+ const targetId = options.id;
391
+ const content = this.formatSendContent(options.content);
392
+ try {
393
+ const body = {
394
+ touser: targetId,
395
+ msgtype: content.msgtype,
396
+ agentid: this.$config.agentSecret,
397
+ [content.msgtype]: content.data,
398
+ };
399
+ // 群消息使用 chatid
400
+ if (targetId.endsWith('@chatroom')) {
401
+ delete body.touser;
402
+ body.chatid = targetId;
403
+ }
404
+ const data = await this.request('/cgi-bin/message/send', {
405
+ method: 'POST',
406
+ body,
407
+ });
408
+ if (data.errcode !== 0) {
409
+ throw new Error(`Failed to send message: ${data.errmsg} (${data.errcode})`);
410
+ }
411
+ this.logger.debug(formatCompact({ op: 'send', endpoint: this.$config.name, to: targetId }));
412
+ return data.msgid || Date.now().toString();
413
+ }
414
+ catch (error) {
415
+ this.logger.error('Failed to send message:', error);
416
+ throw error;
417
+ }
418
+ }
419
+ // ── $recallMessage (企业微信不支持机器人撤回) ──
420
+ async $recallMessage(_id) {
421
+ this.logger.warn(formatCompact({ op: 'recall', ok: false, error: 'not supported by wecom' }));
422
+ }
423
+ // ── 发送内容格式化 ──
424
+ formatSendContent(content) {
425
+ if (typeof content === 'string') {
426
+ return { msgtype: 'text', data: { content } };
427
+ }
428
+ if (Array.isArray(content)) {
429
+ const textParts = [];
430
+ let hasMedia = false;
431
+ let mediaType = '';
432
+ let mediaData = null;
433
+ let droppedMediaCount = 0;
434
+ for (const item of content) {
435
+ if (typeof item === 'string') {
436
+ textParts.push(item);
437
+ continue;
438
+ }
439
+ const seg = item;
440
+ switch (seg.type) {
441
+ case 'text':
442
+ textParts.push(seg.data.content || seg.data.text || '');
443
+ break;
444
+ case 'at':
445
+ // 企业微信 @ 格式: <@userid>
446
+ const userId = seg.data.id || seg.data.userId;
447
+ if (userId)
448
+ textParts.push(`<@${userId}>`);
449
+ break;
450
+ case 'image':
451
+ if (!hasMedia) {
452
+ hasMedia = true;
453
+ mediaType = 'image';
454
+ mediaData = { media_id: seg.data.file || seg.data.url };
455
+ }
456
+ else {
457
+ droppedMediaCount++;
458
+ }
459
+ break;
460
+ case 'markdown':
461
+ if (!hasMedia) {
462
+ hasMedia = true;
463
+ mediaType = 'markdown';
464
+ mediaData = { content: seg.data.content || seg.data.text };
465
+ }
466
+ else {
467
+ droppedMediaCount++;
468
+ }
469
+ break;
470
+ case 'link':
471
+ if (!hasMedia) {
472
+ hasMedia = true;
473
+ mediaType = 'news';
474
+ mediaData = {
475
+ articles: [{
476
+ title: seg.data.title || '链接',
477
+ description: seg.data.text || seg.data.content || '',
478
+ url: seg.data.url,
479
+ picurl: seg.data.picUrl,
480
+ }],
481
+ };
482
+ }
483
+ else {
484
+ droppedMediaCount++;
485
+ }
486
+ break;
487
+ }
488
+ }
489
+ if (droppedMediaCount > 0) {
490
+ this.logger.warn(formatCompact({
491
+ op: 'formatSend',
492
+ droppedMedia: droppedMediaCount,
493
+ note: 'WeCom API only supports one media segment per message',
494
+ }));
495
+ }
496
+ if (hasMedia && mediaData) {
497
+ return { msgtype: mediaType, data: mediaData };
498
+ }
499
+ return { msgtype: 'text', data: { content: textParts.join('') } };
500
+ }
501
+ return { msgtype: 'text', data: { content: String(content) } };
502
+ }
503
+ // ── 生命周期 ──
504
+ async $connect() {
505
+ try {
506
+ await this.refreshAccessToken();
507
+ this.$connected = true;
508
+ this.logger.info(formatCompact({ op: 'connect', endpoint: this.$config.name }));
509
+ this.logger.info(formatCompact({ op: 'webhook', path: this.$config.webhookPath || '/wecom/callback' }));
510
+ }
511
+ catch (error) {
512
+ this.logger.error('Failed to connect WeCom bot:', error);
513
+ throw error;
514
+ }
515
+ }
516
+ async $disconnect() {
517
+ this.$connected = false;
518
+ this.logger.info(formatCompact({ op: 'disconnect', endpoint: this.$config.name }));
519
+ }
520
+ // ── 企业微信特有 API ──
521
+ async getUserInfo(userId) {
522
+ try {
523
+ const data = await this.request('/cgi-bin/user/get', {
524
+ params: { userid: userId },
525
+ });
526
+ if (data.errcode === 0)
527
+ return data;
528
+ throw new Error(`Failed to get user info: ${data.errmsg}`);
529
+ }
530
+ catch (error) {
531
+ this.logger.error('Failed to get user info:', error);
532
+ return null;
533
+ }
534
+ }
535
+ async getDepartmentUsers(deptId) {
536
+ try {
537
+ const data = await this.request('/cgi-bin/user/simplelist', {
538
+ params: { department_id: deptId },
539
+ });
540
+ if (data.errcode === 0)
541
+ return data.userlist || [];
542
+ throw new Error(`Failed to get department users: ${data.errmsg}`);
543
+ }
544
+ catch (error) {
545
+ this.logger.error('Failed to get department users:', error);
546
+ return [];
547
+ }
548
+ }
549
+ async getDepartmentList(deptId = 1) {
550
+ try {
551
+ const data = await this.request('/cgi-bin/department/list', {
552
+ params: { id: deptId },
553
+ });
554
+ if (data.errcode === 0)
555
+ return data.department || [];
556
+ throw new Error(`Failed to get department list: ${data.errmsg}`);
557
+ }
558
+ catch (error) {
559
+ this.logger.error('Failed to get department list:', error);
560
+ return [];
561
+ }
562
+ }
563
+ async sendTextMessage(userId, content) {
564
+ try {
565
+ const data = await this.request('/cgi-bin/message/send', {
566
+ method: 'POST',
567
+ body: {
568
+ touser: userId,
569
+ msgtype: 'text',
570
+ agentid: this.$config.agentSecret,
571
+ text: { content },
572
+ },
573
+ });
574
+ if (data.errcode === 0) {
575
+ this.logger.debug('Text message sent successfully');
576
+ return true;
577
+ }
578
+ throw new Error(`Failed to send text message: ${data.errmsg}`);
579
+ }
580
+ catch (error) {
581
+ this.logger.error('Failed to send text message:', error);
582
+ return false;
583
+ }
584
+ }
585
+ }
586
+ //# sourceMappingURL=endpoint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"endpoint.js","sourceRoot":"","sources":["../src/endpoint.ts"],"names":[],"mappings":"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"}
package/lib/index.d.ts ADDED
@@ -0,0 +1,15 @@
1
+ import { WecomAdapter } from './adapter.js';
2
+ declare module 'zhin.js' {
3
+ namespace Plugin {
4
+ interface Contexts {
5
+ router: import('@zhin.js/host-router').Router;
6
+ }
7
+ }
8
+ interface Adapters {
9
+ wecom: WecomAdapter;
10
+ }
11
+ }
12
+ export * from './types.js';
13
+ export { WecomEndpoint } from './endpoint.js';
14
+ export { WecomAdapter } from './adapter.js';
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAM5C,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAU,MAAM,CAAC;QACf,UAAU,QAAQ;YAChB,MAAM,EAAE,OAAO,sBAAsB,EAAE,MAAM,CAAC;SAC/C;KACF;IACD,UAAU,QAAQ;QAChB,KAAK,EAAE,YAAY,CAAC;KACrB;CACF;AAED,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC"}