@zhin.js/adapter-lark 1.0.55 → 1.0.56

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/lib/bot.js ADDED
@@ -0,0 +1,629 @@
1
+ import axios from "axios";
2
+ import { createHash } from "crypto";
3
+ import { Message, segment, } from "zhin.js";
4
+ export class LarkBot {
5
+ adapter;
6
+ $config;
7
+ $connected;
8
+ router;
9
+ accessToken;
10
+ axiosInstance;
11
+ get logger() {
12
+ return this.adapter.plugin.logger;
13
+ }
14
+ get $id() {
15
+ return this.$config.name;
16
+ }
17
+ constructor(adapter, router, $config) {
18
+ this.adapter = adapter;
19
+ this.$config = $config;
20
+ this.router = router;
21
+ this.$connected = false;
22
+ this.accessToken = { token: '', expires_in: 0, timestamp: 0 };
23
+ // 设置 API 基础 URL
24
+ const baseURL = $config.apiBaseUrl || ($config.isFeishu ?
25
+ 'https://open.feishu.cn/open-apis' :
26
+ 'https://open.larksuite.com/open-apis');
27
+ this.axiosInstance = axios.create({
28
+ baseURL,
29
+ timeout: 30000,
30
+ headers: {
31
+ 'Content-Type': 'application/json; charset=utf-8'
32
+ }
33
+ });
34
+ // 设置请求拦截器,自动添加 access_token
35
+ this.axiosInstance.interceptors.request.use(async (config) => {
36
+ await this.ensureAccessToken();
37
+ config.headers = config.headers;
38
+ config.headers['Authorization'] = `Bearer ${this.accessToken.token}`;
39
+ return config;
40
+ });
41
+ // 设置 webhook 路由
42
+ this.setupWebhookRoute();
43
+ }
44
+ setupWebhookRoute() {
45
+ this.router.post(this.$config.webhookPath, (ctx) => {
46
+ this.handleWebhook(ctx);
47
+ });
48
+ }
49
+ async handleWebhook(ctx) {
50
+ try {
51
+ const body = ctx.request.body;
52
+ const headers = ctx.request.headers;
53
+ // 验证请求(如果配置了验证令牌)
54
+ if (this.$config.verificationToken) {
55
+ const token = headers['x-lark-request-token'];
56
+ if (token !== this.$config.verificationToken) {
57
+ this.logger.warn('Invalid verification token in webhook');
58
+ ctx.status = 403;
59
+ ctx.body = 'Forbidden';
60
+ return;
61
+ }
62
+ }
63
+ // 签名验证(如果配置了加密密钥)
64
+ if (this.$config.encryptKey) {
65
+ const timestamp = headers['x-lark-request-timestamp'];
66
+ const nonce = headers['x-lark-request-nonce'];
67
+ const signature = headers['x-lark-signature'];
68
+ const bodyStr = JSON.stringify(body);
69
+ if (!this.verifySignature(timestamp, nonce, bodyStr, signature)) {
70
+ this.logger.warn('Invalid signature in webhook');
71
+ ctx.status = 403;
72
+ ctx.body = 'Forbidden';
73
+ return;
74
+ }
75
+ }
76
+ const event = body;
77
+ // URL 验证挑战(首次配置 webhook 时)
78
+ if (event.type === 'url_verification') {
79
+ ctx.body = { challenge: event.challenge };
80
+ return;
81
+ }
82
+ // 处理消息事件
83
+ if (event.type === 'event_callback' && event.event) {
84
+ await this.handleEvent(event.event);
85
+ }
86
+ ctx.status = 200;
87
+ ctx.body = { code: 0, msg: 'success' };
88
+ }
89
+ catch (error) {
90
+ this.logger.error('Webhook error:', error);
91
+ ctx.status = 500;
92
+ ctx.body = { code: -1, msg: 'Internal Server Error' };
93
+ }
94
+ }
95
+ verifySignature(timestamp, nonce, body, signature) {
96
+ if (!this.$config.encryptKey)
97
+ return true;
98
+ try {
99
+ const stringToSign = `${timestamp}${nonce}${this.$config.encryptKey}${body}`;
100
+ const calculatedSignature = createHash('sha256').update(stringToSign).digest('hex');
101
+ return calculatedSignature === signature;
102
+ }
103
+ catch (error) {
104
+ this.logger.error('Signature verification error:', error);
105
+ return false;
106
+ }
107
+ }
108
+ async handleEvent(event) {
109
+ // 处理消息事件
110
+ if (event.message) {
111
+ const message = this.$formatMessage(event.message, event);
112
+ this.adapter.emit('message.receive', message);
113
+ this.logger.info(`${this.$config.name} recv ${message.$channel.type}(${message.$channel.id}): ${segment.raw(message.$content)}`);
114
+ }
115
+ }
116
+ // ================================================================================================
117
+ // Token 管理
118
+ // ================================================================================================
119
+ async ensureAccessToken() {
120
+ const now = Date.now();
121
+ // 提前 5 分钟刷新 token
122
+ if (this.accessToken.token && now < (this.accessToken.timestamp + (this.accessToken.expires_in - 300) * 1000)) {
123
+ return;
124
+ }
125
+ await this.refreshAccessToken();
126
+ }
127
+ async refreshAccessToken() {
128
+ try {
129
+ const response = await axios.post(`${this.$config.apiBaseUrl || (this.$config.isFeishu ?
130
+ 'https://open.feishu.cn/open-apis' :
131
+ 'https://open.larksuite.com/open-apis')}/auth/v3/tenant_access_token/internal`, {
132
+ app_id: this.$config.appId,
133
+ app_secret: this.$config.appSecret
134
+ });
135
+ if (response.data.code === 0) {
136
+ this.accessToken = {
137
+ token: response.data.tenant_access_token,
138
+ expires_in: response.data.expire,
139
+ timestamp: Date.now()
140
+ };
141
+ this.logger.debug('Access token refreshed successfully');
142
+ }
143
+ else {
144
+ throw new Error(`Failed to get access token: ${response.data.msg}`);
145
+ }
146
+ }
147
+ catch (error) {
148
+ this.logger.error('Failed to refresh access token:', error);
149
+ throw error;
150
+ }
151
+ }
152
+ // ================================================================================================
153
+ // 消息格式化
154
+ // ================================================================================================
155
+ $formatMessage(msg, event) {
156
+ const content = this.parseMessageContent(msg);
157
+ // 确定聊天类型
158
+ const chatType = msg.chat_id?.startsWith('oc_') ? 'group' : 'private';
159
+ return Message.from(msg, {
160
+ $id: msg.message_id || Date.now().toString(),
161
+ $adapter: 'lark',
162
+ $bot: this.$config.name,
163
+ $sender: {
164
+ id: msg.sender?.sender_id?.open_id || 'unknown',
165
+ name: msg.sender?.sender_id?.user_id || msg.sender?.sender_id?.open_id || 'Unknown User'
166
+ },
167
+ $channel: {
168
+ id: msg.chat_id || 'unknown',
169
+ type: chatType
170
+ },
171
+ $content: content,
172
+ $raw: JSON.stringify(msg),
173
+ $timestamp: msg.create_time ? parseInt(msg.create_time) : Date.now(),
174
+ $recall: async () => {
175
+ await this.$recallMessage(msg.message_id || '');
176
+ },
177
+ $reply: async (content) => {
178
+ return await this.adapter.sendMessage({
179
+ context: 'lark',
180
+ bot: this.$config.name,
181
+ id: msg.chat_id || 'unknown',
182
+ type: chatType,
183
+ content: content
184
+ });
185
+ }
186
+ });
187
+ }
188
+ parseMessageContent(msg) {
189
+ const content = [];
190
+ if (!msg.content || !msg.message_type) {
191
+ return content;
192
+ }
193
+ try {
194
+ const messageContent = JSON.parse(msg.content);
195
+ switch (msg.message_type) {
196
+ case 'text':
197
+ if (messageContent.text) {
198
+ content.push(segment('text', { content: messageContent.text }));
199
+ // 处理 @提及
200
+ if (msg.mentions) {
201
+ for (const mention of msg.mentions) {
202
+ if (mention.key && messageContent.text.includes(mention.key)) {
203
+ content.push(segment('at', {
204
+ id: mention.id?.open_id,
205
+ name: mention.name
206
+ }));
207
+ }
208
+ }
209
+ }
210
+ }
211
+ break;
212
+ case 'image':
213
+ content.push(segment('image', {
214
+ file_key: messageContent.image_key,
215
+ url: `https://open.feishu.cn/open-apis/im/v1/messages/${msg.message_id}/resources/${messageContent.image_key}`
216
+ }));
217
+ break;
218
+ case 'file':
219
+ content.push(segment('file', {
220
+ file_key: messageContent.file_key,
221
+ file_name: messageContent.file_name,
222
+ file_size: messageContent.file_size
223
+ }));
224
+ break;
225
+ case 'audio':
226
+ content.push(segment('audio', {
227
+ file_key: messageContent.file_key,
228
+ duration: messageContent.duration
229
+ }));
230
+ break;
231
+ case 'video':
232
+ content.push(segment('video', {
233
+ file_key: messageContent.file_key,
234
+ duration: messageContent.duration,
235
+ width: messageContent.width,
236
+ height: messageContent.height
237
+ }));
238
+ break;
239
+ case 'sticker':
240
+ content.push(segment('sticker', {
241
+ file_key: messageContent.file_key
242
+ }));
243
+ break;
244
+ case 'rich_text':
245
+ // 富文本消息处理(简化)
246
+ if (messageContent.content) {
247
+ this.parseRichTextContent(messageContent.content, content);
248
+ }
249
+ break;
250
+ case 'post':
251
+ // 卡片消息处理
252
+ content.push(segment('card', messageContent));
253
+ break;
254
+ default:
255
+ content.push(segment('text', { content: `[不支持的消息类型: ${msg.message_type}]` }));
256
+ break;
257
+ }
258
+ }
259
+ catch (error) {
260
+ this.logger.error('Failed to parse message content:', error);
261
+ content.push(segment('text', { content: '[消息解析失败]' }));
262
+ }
263
+ return content;
264
+ }
265
+ parseRichTextContent(richContent, content) {
266
+ // 简化的富文本解析
267
+ if (Array.isArray(richContent)) {
268
+ for (const block of richContent) {
269
+ if (block.tag === 'text' && block.text) {
270
+ content.push(segment('text', { content: block.text }));
271
+ }
272
+ else if (block.tag === 'a' && block.href) {
273
+ content.push(segment('link', {
274
+ url: block.href,
275
+ text: block.text || block.href
276
+ }));
277
+ }
278
+ else if (block.tag === 'at' && block.user_id) {
279
+ content.push(segment('at', {
280
+ id: block.user_id,
281
+ name: block.user_name
282
+ }));
283
+ }
284
+ }
285
+ }
286
+ }
287
+ // ================================================================================================
288
+ // 消息发送
289
+ // ================================================================================================
290
+ async $sendMessage(options) {
291
+ const chatId = options.id;
292
+ const content = this.formatSendContent(options.content);
293
+ try {
294
+ const response = await this.axiosInstance.post('/im/v1/messages', {
295
+ receive_id: chatId,
296
+ receive_id_type: 'chat_id',
297
+ msg_type: content.msg_type,
298
+ content: content.content
299
+ });
300
+ if (response.data.code !== 0) {
301
+ throw new Error(`Failed to send message: ${response.data.msg}`);
302
+ }
303
+ this.logger.debug('Message sent successfully:', response.data.data?.message_id);
304
+ return response.data.data?.message_id || '';
305
+ }
306
+ catch (error) {
307
+ this.logger.error('Failed to send message:', error);
308
+ throw error;
309
+ }
310
+ }
311
+ async $recallMessage(id) {
312
+ await this.axiosInstance.post('/im/v1/messages/recall', {
313
+ message_id: id
314
+ });
315
+ }
316
+ formatSendContent(content) {
317
+ if (typeof content === 'string') {
318
+ return {
319
+ msg_type: 'text',
320
+ content: JSON.stringify({ text: content })
321
+ };
322
+ }
323
+ if (Array.isArray(content)) {
324
+ const textParts = [];
325
+ let hasMedia = false;
326
+ let mediaContent = null;
327
+ for (const item of content) {
328
+ if (typeof item === 'string') {
329
+ textParts.push(item);
330
+ }
331
+ else {
332
+ const segment = item;
333
+ switch (segment.type) {
334
+ case 'text':
335
+ textParts.push(segment.data.content || segment.data.text || '');
336
+ break;
337
+ case 'at':
338
+ textParts.push(`<at user_id="${segment.data.id}">${segment.data.name || segment.data.id}</at>`);
339
+ break;
340
+ case 'image':
341
+ if (!hasMedia) {
342
+ hasMedia = true;
343
+ mediaContent = {
344
+ msg_type: 'image',
345
+ content: JSON.stringify({
346
+ image_key: segment.data.file_key || segment.data.key
347
+ })
348
+ };
349
+ }
350
+ break;
351
+ case 'file':
352
+ if (!hasMedia) {
353
+ hasMedia = true;
354
+ mediaContent = {
355
+ msg_type: 'file',
356
+ content: JSON.stringify({
357
+ file_key: segment.data.file_key || segment.data.key
358
+ })
359
+ };
360
+ }
361
+ break;
362
+ case 'card':
363
+ if (!hasMedia) {
364
+ hasMedia = true;
365
+ mediaContent = {
366
+ msg_type: 'interactive',
367
+ content: JSON.stringify(segment.data)
368
+ };
369
+ }
370
+ break;
371
+ }
372
+ }
373
+ }
374
+ // 优先发送媒体内容
375
+ if (hasMedia && mediaContent) {
376
+ return mediaContent;
377
+ }
378
+ // 否则发送文本内容
379
+ return {
380
+ msg_type: 'text',
381
+ content: JSON.stringify({ text: textParts.join('') })
382
+ };
383
+ }
384
+ return {
385
+ msg_type: 'text',
386
+ content: JSON.stringify({ text: String(content) })
387
+ };
388
+ }
389
+ // ================================================================================================
390
+ // Bot 生命周期
391
+ // ================================================================================================
392
+ async $connect() {
393
+ try {
394
+ // 获取 access token
395
+ await this.refreshAccessToken();
396
+ this.$connected = true;
397
+ this.logger.info(`Lark bot connected: ${this.$config.name}`);
398
+ this.logger.info(`Webhook URL: ${this.$config.webhookPath}`);
399
+ }
400
+ catch (error) {
401
+ this.logger.error('Failed to connect Lark bot:', error);
402
+ throw error;
403
+ }
404
+ }
405
+ async $disconnect() {
406
+ try {
407
+ this.$connected = false;
408
+ this.logger.info('Lark bot disconnected');
409
+ }
410
+ catch (error) {
411
+ this.logger.error('Error disconnecting Lark bot:', error);
412
+ }
413
+ }
414
+ // ================================================================================================
415
+ // 工具方法
416
+ // ================================================================================================
417
+ // 获取用户信息
418
+ async getUserInfo(userId, userIdType = 'open_id') {
419
+ try {
420
+ const response = await this.axiosInstance.get(`/contact/v3/users/${userId}`, {
421
+ params: { user_id_type: userIdType }
422
+ });
423
+ return response.data.data?.user;
424
+ }
425
+ catch (error) {
426
+ this.logger.error('Failed to get user info:', error);
427
+ return null;
428
+ }
429
+ }
430
+ // 获取群聊信息
431
+ async getChatInfo(chatId) {
432
+ try {
433
+ const response = await this.axiosInstance.get(`/im/v1/chats/${chatId}`);
434
+ return response.data.data;
435
+ }
436
+ catch (error) {
437
+ this.logger.error('Failed to get chat info:', error);
438
+ return null;
439
+ }
440
+ }
441
+ // 上传文件
442
+ async uploadFile(filePath, fileType = 'file') {
443
+ try {
444
+ const FormData = require('form-data');
445
+ const fs = require('fs');
446
+ const form = new FormData();
447
+ form.append('file', fs.createReadStream(filePath));
448
+ form.append('file_type', fileType);
449
+ const response = await this.axiosInstance.post('/im/v1/files', form, {
450
+ headers: {
451
+ ...form.getHeaders()
452
+ }
453
+ });
454
+ if (response.data.code === 0) {
455
+ return response.data.data.file_key;
456
+ }
457
+ throw new Error(`Upload failed: ${response.data.msg}`);
458
+ }
459
+ catch (error) {
460
+ this.logger.error('Failed to upload file:', error);
461
+ return null;
462
+ }
463
+ }
464
+ // ==================== 群组管理 API ====================
465
+ /**
466
+ * 创建群聊
467
+ * @param name 群名
468
+ * @param userIds 成员 open_id 列表
469
+ * @param ownerId 群主 open_id
470
+ */
471
+ async createChat(name, userIds, ownerId) {
472
+ try {
473
+ const response = await this.axiosInstance.post('/im/v1/chats', {
474
+ name,
475
+ user_id_list: userIds,
476
+ owner_id: ownerId
477
+ });
478
+ if (response.data.code === 0) {
479
+ this.logger.info(`创建群聊成功: ${response.data.data.chat_id}`);
480
+ return response.data.data.chat_id;
481
+ }
482
+ throw new Error(`Failed to create chat: ${response.data.msg}`);
483
+ }
484
+ catch (error) {
485
+ this.logger.error('Failed to create chat:', error);
486
+ return null;
487
+ }
488
+ }
489
+ /**
490
+ * 更新群信息
491
+ * @param chatId 群聊 ID
492
+ * @param options 更新选项
493
+ */
494
+ async updateChatInfo(chatId, options) {
495
+ try {
496
+ const response = await this.axiosInstance.put(`/im/v1/chats/${chatId}`, options);
497
+ if (response.data.code === 0) {
498
+ this.logger.info(`更新群信息成功: ${chatId}`);
499
+ return true;
500
+ }
501
+ throw new Error(`Failed to update chat: ${response.data.msg}`);
502
+ }
503
+ catch (error) {
504
+ this.logger.error('Failed to update chat:', error);
505
+ return false;
506
+ }
507
+ }
508
+ /**
509
+ * 添加群成员
510
+ * @param chatId 群聊 ID
511
+ * @param userIds 用户 ID 列表
512
+ */
513
+ async addChatMembers(chatId, userIds) {
514
+ try {
515
+ const response = await this.axiosInstance.post(`/im/v1/chats/${chatId}/members`, {
516
+ id_list: userIds
517
+ });
518
+ if (response.data.code === 0) {
519
+ this.logger.info(`添加群成员成功: ${chatId}`);
520
+ return true;
521
+ }
522
+ throw new Error(`Failed to add members: ${response.data.msg}`);
523
+ }
524
+ catch (error) {
525
+ this.logger.error('Failed to add chat members:', error);
526
+ return false;
527
+ }
528
+ }
529
+ /**
530
+ * 移除群成员
531
+ * @param chatId 群聊 ID
532
+ * @param userIds 用户 ID 列表
533
+ */
534
+ async removeChatMembers(chatId, userIds) {
535
+ try {
536
+ const response = await this.axiosInstance.delete(`/im/v1/chats/${chatId}/members`, {
537
+ data: { id_list: userIds }
538
+ });
539
+ if (response.data.code === 0) {
540
+ this.logger.info(`移除群成员成功: ${chatId}`);
541
+ return true;
542
+ }
543
+ throw new Error(`Failed to remove members: ${response.data.msg}`);
544
+ }
545
+ catch (error) {
546
+ this.logger.error('Failed to remove chat members:', error);
547
+ return false;
548
+ }
549
+ }
550
+ /**
551
+ * 获取群成员列表
552
+ * @param chatId 群聊 ID
553
+ */
554
+ async getChatMembers(chatId) {
555
+ try {
556
+ const response = await this.axiosInstance.get(`/im/v1/chats/${chatId}/members`);
557
+ if (response.data.code === 0) {
558
+ return response.data.data.items || [];
559
+ }
560
+ throw new Error(`Failed to get members: ${response.data.msg}`);
561
+ }
562
+ catch (error) {
563
+ this.logger.error('Failed to get chat members:', error);
564
+ return [];
565
+ }
566
+ }
567
+ /**
568
+ * 解散群聊
569
+ * @param chatId 群聊 ID
570
+ */
571
+ async dissolveChat(chatId) {
572
+ try {
573
+ const response = await this.axiosInstance.delete(`/im/v1/chats/${chatId}`);
574
+ if (response.data.code === 0) {
575
+ this.logger.info(`解散群聊成功: ${chatId}`);
576
+ return true;
577
+ }
578
+ throw new Error(`Failed to dissolve chat: ${response.data.msg}`);
579
+ }
580
+ catch (error) {
581
+ this.logger.error('Failed to dissolve chat:', error);
582
+ return false;
583
+ }
584
+ }
585
+ /**
586
+ * 设置群管理员
587
+ * @param chatId 群聊 ID
588
+ * @param userIds 用户 ID 列表
589
+ */
590
+ async setChatManagers(chatId, userIds) {
591
+ try {
592
+ const response = await this.axiosInstance.post(`/im/v1/chats/${chatId}/managers/add_managers`, {
593
+ manager_ids: userIds
594
+ });
595
+ if (response.data.code === 0) {
596
+ this.logger.info(`设置群管理员成功: ${chatId}`);
597
+ return true;
598
+ }
599
+ throw new Error(`Failed to set managers: ${response.data.msg}`);
600
+ }
601
+ catch (error) {
602
+ this.logger.error('Failed to set chat managers:', error);
603
+ return false;
604
+ }
605
+ }
606
+ /**
607
+ * 移除群管理员
608
+ * @param chatId 群聊 ID
609
+ * @param userIds 用户 ID 列表
610
+ */
611
+ async removeChatManagers(chatId, userIds) {
612
+ try {
613
+ const response = await this.axiosInstance.post(`/im/v1/chats/${chatId}/managers/delete_managers`, {
614
+ manager_ids: userIds
615
+ });
616
+ if (response.data.code === 0) {
617
+ this.logger.info(`移除群管理员成功: ${chatId}`);
618
+ return true;
619
+ }
620
+ throw new Error(`Failed to remove managers: ${response.data.msg}`);
621
+ }
622
+ catch (error) {
623
+ this.logger.error('Failed to remove chat managers:', error);
624
+ return false;
625
+ }
626
+ }
627
+ }
628
+ // 定义 Adapter 类
629
+ //# sourceMappingURL=bot.js.map
package/lib/bot.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bot.js","sourceRoot":"","sources":["../src/bot.ts"],"names":[],"mappings":"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"}