@zhin.js/adapter-dingtalk 1.0.39 → 1.0.41

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,532 @@
1
+ /**
2
+ * 钉钉 Bot 实现
3
+ */
4
+ import { Message, segment, } from "zhin.js";
5
+ import { createHmac } from "crypto";
6
+ export class DingTalkBot {
7
+ adapter;
8
+ $config;
9
+ $connected;
10
+ router;
11
+ accessToken;
12
+ baseURL;
13
+ sessionWebhooks = new Map();
14
+ get $id() {
15
+ return this.$config.name;
16
+ }
17
+ get logger() {
18
+ return this.adapter.plugin.logger;
19
+ }
20
+ constructor(adapter, router, $config) {
21
+ this.adapter = adapter;
22
+ this.$config = $config;
23
+ this.router = router;
24
+ this.$connected = false;
25
+ this.accessToken = { token: "", expires_in: 0, timestamp: 0 };
26
+ this.baseURL = $config.apiBaseUrl || "https://oapi.dingtalk.com";
27
+ this.setupWebhookRoute();
28
+ }
29
+ async request(path, options = {}) {
30
+ await this.ensureAccessToken();
31
+ const { method = "GET", params = {}, body } = options;
32
+ const urlParams = new URLSearchParams({
33
+ ...params,
34
+ access_token: this.accessToken.token,
35
+ });
36
+ const url = `${this.baseURL}${path}?${urlParams.toString()}`;
37
+ const fetchOptions = {
38
+ method,
39
+ headers: {
40
+ "Content-Type": "application/json; charset=utf-8",
41
+ },
42
+ };
43
+ if (body && method === "POST") {
44
+ fetchOptions.body = JSON.stringify(body);
45
+ }
46
+ const response = await fetch(url, fetchOptions);
47
+ return await response.json();
48
+ }
49
+ setupWebhookRoute() {
50
+ this.router.post(this.$config.webhookPath, (ctx) => {
51
+ this.handleWebhook(ctx);
52
+ });
53
+ }
54
+ async handleWebhook(ctx) {
55
+ try {
56
+ const body = ctx.request.body;
57
+ const headers = ctx.request.headers;
58
+ const timestamp = headers["timestamp"];
59
+ const sign = headers["sign"];
60
+ if (timestamp && sign) {
61
+ if (!this.verifySignature(timestamp, sign)) {
62
+ this.logger.warn("Invalid signature in webhook");
63
+ ctx.status = 403;
64
+ ctx.body = { code: -1, msg: "Forbidden" };
65
+ return;
66
+ }
67
+ }
68
+ const event = body;
69
+ if (event.msgtype) {
70
+ await this.handleEvent(event);
71
+ }
72
+ ctx.status = 200;
73
+ ctx.body = { code: 0, msg: "success" };
74
+ }
75
+ catch (error) {
76
+ this.logger.error("Webhook error:", error);
77
+ ctx.status = 500;
78
+ ctx.body = { code: -1, msg: "Internal Server Error" };
79
+ }
80
+ }
81
+ verifySignature(timestamp, sign) {
82
+ try {
83
+ const stringToSign = `${timestamp}\n${this.$config.appSecret}`;
84
+ const hmac = createHmac("sha256", this.$config.appSecret);
85
+ hmac.update(stringToSign);
86
+ const calculatedSign = hmac.digest("base64");
87
+ return calculatedSign === sign;
88
+ }
89
+ catch (error) {
90
+ this.logger.error("Signature verification error:", error);
91
+ return false;
92
+ }
93
+ }
94
+ async handleEvent(event) {
95
+ if (event.sessionWebhook && event.conversationId) {
96
+ this.sessionWebhooks.set(event.conversationId, event.sessionWebhook);
97
+ }
98
+ const message = this.$formatMessage(event);
99
+ this.adapter.emit("message.receive", message);
100
+ this.logger.info(`${this.$config.name} recv ${message.$channel.type}(${message.$channel.id}): ${segment.raw(message.$content)}`);
101
+ }
102
+ async ensureAccessToken() {
103
+ const now = Date.now();
104
+ if (this.accessToken.token &&
105
+ now <
106
+ this.accessToken.timestamp +
107
+ (this.accessToken.expires_in - 300) * 1000) {
108
+ return;
109
+ }
110
+ await this.refreshAccessToken();
111
+ }
112
+ async refreshAccessToken() {
113
+ try {
114
+ const baseURL = this.$config.apiBaseUrl || "https://oapi.dingtalk.com";
115
+ const params = new URLSearchParams({
116
+ appkey: this.$config.appKey,
117
+ appsecret: this.$config.appSecret,
118
+ });
119
+ const url = `${baseURL}/gettoken?${params.toString()}`;
120
+ const response = await fetch(url);
121
+ const data = await response.json();
122
+ if (data.errcode === 0) {
123
+ this.accessToken = {
124
+ token: data.access_token,
125
+ expires_in: data.expires_in,
126
+ timestamp: Date.now(),
127
+ };
128
+ this.logger.debug("Access token refreshed successfully");
129
+ }
130
+ else {
131
+ throw new Error(`Failed to get access token: ${data.errmsg}`);
132
+ }
133
+ }
134
+ catch (error) {
135
+ this.logger.error("Failed to refresh access token:", error);
136
+ throw error;
137
+ }
138
+ }
139
+ $formatMessage(msg) {
140
+ const content = this.parseMessageContent(msg);
141
+ const chatType = msg.conversationType === "2" ? "group" : "private";
142
+ return Message.from(msg, {
143
+ $id: msg.msgId || Date.now().toString(),
144
+ $adapter: "dingtalk",
145
+ $bot: this.$config.name,
146
+ $sender: {
147
+ id: msg.senderId || msg.senderStaffId || "unknown",
148
+ name: msg.senderNick || msg.senderId || "Unknown User",
149
+ },
150
+ $channel: {
151
+ id: msg.conversationId || "unknown",
152
+ type: chatType,
153
+ },
154
+ $content: content,
155
+ $raw: JSON.stringify(msg),
156
+ $timestamp: msg.createAt || Date.now(),
157
+ $recall: async () => {
158
+ await this.$recallMessage(msg.msgId || "");
159
+ },
160
+ $reply: async (content) => {
161
+ return await this.adapter.sendMessage({
162
+ context: "dingtalk",
163
+ bot: this.$config.name,
164
+ id: msg.conversationId || msg.senderId || "unknown",
165
+ type: chatType,
166
+ content: content,
167
+ });
168
+ },
169
+ });
170
+ }
171
+ parseMessageContent(msg) {
172
+ const content = [];
173
+ if (!msg.msgtype)
174
+ return content;
175
+ try {
176
+ switch (msg.msgtype) {
177
+ case "text":
178
+ if (msg.text?.content) {
179
+ content.push(segment("text", { content: msg.text.content }));
180
+ if (msg.atUsers && msg.atUsers.length > 0) {
181
+ for (const atUser of msg.atUsers) {
182
+ content.push(segment("at", {
183
+ id: atUser.dingtalkId || atUser.staffId,
184
+ name: atUser.dingtalkId || atUser.staffId,
185
+ }));
186
+ }
187
+ }
188
+ }
189
+ break;
190
+ case "picture":
191
+ if (msg.content) {
192
+ content.push(segment("image", {
193
+ url: msg.content.downloadCode ||
194
+ msg.content.pictureDownloadCode,
195
+ file: msg.content.downloadCode ||
196
+ msg.content.pictureDownloadCode,
197
+ }));
198
+ }
199
+ break;
200
+ case "file":
201
+ if (msg.content) {
202
+ content.push(segment("file", {
203
+ file: msg.content.downloadCode,
204
+ name: msg.content.fileName,
205
+ size: msg.content.fileSize,
206
+ }));
207
+ }
208
+ break;
209
+ case "audio":
210
+ if (msg.content) {
211
+ content.push(segment("audio", {
212
+ file: msg.content.downloadCode,
213
+ duration: msg.content.duration,
214
+ }));
215
+ }
216
+ break;
217
+ case "video":
218
+ if (msg.content) {
219
+ content.push(segment("video", {
220
+ file: msg.content.downloadCode,
221
+ duration: msg.content.duration,
222
+ size: msg.content.videoSize,
223
+ }));
224
+ }
225
+ break;
226
+ case "richText":
227
+ if (msg.content?.richText) {
228
+ for (const item of msg.content.richText) {
229
+ if (item.text) {
230
+ content.push(segment("text", { content: item.text }));
231
+ }
232
+ }
233
+ }
234
+ break;
235
+ case "markdown":
236
+ if (msg.content?.text) {
237
+ content.push(segment("markdown", {
238
+ content: msg.content.text,
239
+ title: msg.content.title,
240
+ }));
241
+ }
242
+ break;
243
+ default:
244
+ content.push(segment("text", {
245
+ content: `[不支持的消息类型: ${msg.msgtype}]`,
246
+ }));
247
+ break;
248
+ }
249
+ }
250
+ catch (error) {
251
+ this.logger.error("Failed to parse message content:", error);
252
+ content.push(segment("text", { content: "[消息解析失败]" }));
253
+ }
254
+ return content;
255
+ }
256
+ async $sendMessage(options) {
257
+ const conversationId = options.id;
258
+ const content = this.formatSendContent(options.content);
259
+ try {
260
+ const sessionWebhook = this.sessionWebhooks.get(conversationId);
261
+ if (sessionWebhook) {
262
+ const response = await fetch(sessionWebhook, {
263
+ method: "POST",
264
+ headers: {
265
+ "Content-Type": "application/json; charset=utf-8",
266
+ },
267
+ body: JSON.stringify(content),
268
+ });
269
+ const data = await response.json();
270
+ if (data.errcode !== 0) {
271
+ throw new Error(`Failed to send message via session webhook: ${data.errmsg}`);
272
+ }
273
+ this.logger.debug("Message sent via session webhook");
274
+ return data.msgId || Date.now().toString();
275
+ }
276
+ const data = await this.request("/robot/send", {
277
+ method: "POST",
278
+ body: {
279
+ ...content,
280
+ robotCode: this.$config.robotCode,
281
+ },
282
+ });
283
+ if (data.errcode !== 0) {
284
+ throw new Error(`Failed to send message: ${data.errmsg}`);
285
+ }
286
+ this.logger.debug("Message sent successfully");
287
+ return data.msgId || Date.now().toString();
288
+ }
289
+ catch (error) {
290
+ this.logger.error("Failed to send message:", error);
291
+ throw error;
292
+ }
293
+ }
294
+ async $recallMessage(id) {
295
+ this.logger.warn("DingTalk robot does not support message recall");
296
+ }
297
+ formatSendContent(content) {
298
+ if (typeof content === "string") {
299
+ return { msgtype: "text", text: { content } };
300
+ }
301
+ if (Array.isArray(content)) {
302
+ const textParts = [];
303
+ const atUserIds = [];
304
+ let hasMedia = false;
305
+ let mediaContent = null;
306
+ for (const item of content) {
307
+ if (typeof item === "string") {
308
+ textParts.push(item);
309
+ }
310
+ else {
311
+ const seg = item;
312
+ switch (seg.type) {
313
+ case "text":
314
+ textParts.push(seg.data.content || seg.data.text || "");
315
+ break;
316
+ case "at":
317
+ const userId = seg.data.id || seg.data.userId;
318
+ if (userId) {
319
+ atUserIds.push(userId);
320
+ textParts.push(`@${seg.data.name || userId} `);
321
+ }
322
+ break;
323
+ case "image":
324
+ if (!hasMedia) {
325
+ hasMedia = true;
326
+ mediaContent = {
327
+ msgtype: "picture",
328
+ picture: {
329
+ picURL: seg.data.url || seg.data.file,
330
+ },
331
+ };
332
+ }
333
+ break;
334
+ case "markdown":
335
+ if (!hasMedia) {
336
+ hasMedia = true;
337
+ mediaContent = {
338
+ msgtype: "markdown",
339
+ markdown: {
340
+ title: seg.data.title || "消息",
341
+ text: seg.data.content || seg.data.text,
342
+ },
343
+ };
344
+ }
345
+ break;
346
+ case "link":
347
+ if (!hasMedia) {
348
+ hasMedia = true;
349
+ mediaContent = {
350
+ msgtype: "link",
351
+ link: {
352
+ title: seg.data.title || "链接",
353
+ text: seg.data.text || seg.data.content || "",
354
+ messageUrl: seg.data.url,
355
+ picUrl: seg.data.picUrl,
356
+ },
357
+ };
358
+ }
359
+ break;
360
+ }
361
+ }
362
+ }
363
+ if (hasMedia && mediaContent)
364
+ return mediaContent;
365
+ const result = {
366
+ msgtype: "text",
367
+ text: { content: textParts.join("") },
368
+ };
369
+ if (atUserIds.length > 0) {
370
+ result.at = { atUserIds, isAtAll: false };
371
+ }
372
+ return result;
373
+ }
374
+ return { msgtype: "text", text: { content: String(content) } };
375
+ }
376
+ async $connect() {
377
+ try {
378
+ await this.refreshAccessToken();
379
+ this.$connected = true;
380
+ this.logger.info(`DingTalk bot connected: ${this.$config.name}`);
381
+ this.logger.info(`Webhook URL: ${this.$config.webhookPath}`);
382
+ }
383
+ catch (error) {
384
+ this.logger.error("Failed to connect DingTalk bot:", error);
385
+ throw error;
386
+ }
387
+ }
388
+ async $disconnect() {
389
+ try {
390
+ this.$connected = false;
391
+ this.logger.info("DingTalk bot disconnected");
392
+ }
393
+ catch (error) {
394
+ this.logger.error("Error disconnecting DingTalk bot:", error);
395
+ }
396
+ }
397
+ async getUserInfo(userId) {
398
+ try {
399
+ const data = await this.request("/topapi/v2/user/get", {
400
+ method: "POST",
401
+ body: { userid: userId },
402
+ });
403
+ if (data.errcode === 0)
404
+ return data.result;
405
+ throw new Error(`Failed to get user info: ${data.errmsg}`);
406
+ }
407
+ catch (error) {
408
+ this.logger.error("Failed to get user info:", error);
409
+ return null;
410
+ }
411
+ }
412
+ async getDepartmentUsers(deptId) {
413
+ try {
414
+ const data = await this.request("/topapi/user/listid", {
415
+ method: "POST",
416
+ body: { dept_id: deptId },
417
+ });
418
+ if (data.errcode === 0)
419
+ return data.result.userid_list || [];
420
+ throw new Error(`Failed to get department users: ${data.errmsg}`);
421
+ }
422
+ catch (error) {
423
+ this.logger.error("Failed to get department users:", error);
424
+ return [];
425
+ }
426
+ }
427
+ async sendWorkNotice(userIdList, content) {
428
+ try {
429
+ const data = await this.request("/topapi/message/corpconversation/asyncsend_v2", {
430
+ method: "POST",
431
+ body: {
432
+ agent_id: this.$config.robotCode,
433
+ userid_list: userIdList.join(","),
434
+ msg: content,
435
+ },
436
+ });
437
+ if (data.errcode === 0) {
438
+ this.logger.debug("Work notice sent successfully");
439
+ return true;
440
+ }
441
+ throw new Error(`Failed to send work notice: ${data.errmsg}`);
442
+ }
443
+ catch (error) {
444
+ this.logger.error("Failed to send work notice:", error);
445
+ return false;
446
+ }
447
+ }
448
+ async getDepartmentList(deptId = 1) {
449
+ try {
450
+ const data = await this.request("/topapi/v2/department/listsub", {
451
+ method: "POST",
452
+ body: { dept_id: deptId },
453
+ });
454
+ if (data.errcode === 0)
455
+ return data.result || [];
456
+ throw new Error(`Failed to get department list: ${data.errmsg}`);
457
+ }
458
+ catch (error) {
459
+ this.logger.error("Failed to get department list:", error);
460
+ return [];
461
+ }
462
+ }
463
+ async getDepartmentInfo(deptId) {
464
+ try {
465
+ const data = await this.request("/topapi/v2/department/get", {
466
+ method: "POST",
467
+ body: { dept_id: deptId },
468
+ });
469
+ if (data.errcode === 0)
470
+ return data.result;
471
+ throw new Error(`Failed to get department info: ${data.errmsg}`);
472
+ }
473
+ catch (error) {
474
+ this.logger.error("Failed to get department info:", error);
475
+ return null;
476
+ }
477
+ }
478
+ async createChat(name, ownerUserId, userIdList) {
479
+ try {
480
+ const data = await this.request("/topapi/chat/create", {
481
+ method: "POST",
482
+ body: {
483
+ name,
484
+ owner: ownerUserId,
485
+ useridlist: userIdList,
486
+ },
487
+ });
488
+ if (data.errcode === 0) {
489
+ this.logger.info(`创建群聊成功: ${data.chatid}`);
490
+ return data.chatid;
491
+ }
492
+ throw new Error(`Failed to create chat: ${data.errmsg}`);
493
+ }
494
+ catch (error) {
495
+ this.logger.error("Failed to create chat:", error);
496
+ return null;
497
+ }
498
+ }
499
+ async getChatInfo(chatId) {
500
+ try {
501
+ const data = await this.request("/topapi/chat/get", {
502
+ method: "POST",
503
+ body: { chatid: chatId },
504
+ });
505
+ if (data.errcode === 0)
506
+ return data.chat_info;
507
+ throw new Error(`Failed to get chat info: ${data.errmsg}`);
508
+ }
509
+ catch (error) {
510
+ this.logger.error("Failed to get chat info:", error);
511
+ return null;
512
+ }
513
+ }
514
+ async updateChat(chatId, options) {
515
+ try {
516
+ const data = await this.request("/topapi/chat/update", {
517
+ method: "POST",
518
+ body: { chatid: chatId, ...options },
519
+ });
520
+ if (data.errcode === 0) {
521
+ this.logger.info(`更新群聊成功: ${chatId}`);
522
+ return true;
523
+ }
524
+ throw new Error(`Failed to update chat: ${data.errmsg}`);
525
+ }
526
+ catch (error) {
527
+ this.logger.error("Failed to update chat:", error);
528
+ return false;
529
+ }
530
+ }
531
+ }
532
+ //# 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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"}
package/lib/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Bot, Adapter, Plugin, Message, SendOptions } from "zhin.js";
1
+ import { DingTalkAdapter } from "./adapter.js";
2
2
  declare module "zhin.js" {
3
3
  namespace Plugin {
4
4
  interface Contexts {
@@ -9,111 +9,7 @@ declare module "zhin.js" {
9
9
  dingtalk: DingTalkAdapter;
10
10
  }
11
11
  }
12
- export interface DingTalkBotConfig {
13
- context: 'dingtalk';
14
- name: string;
15
- appKey: string;
16
- appSecret: string;
17
- webhookPath: string;
18
- robotCode?: string;
19
- apiBaseUrl?: string;
20
- }
21
- export interface DingTalkMessage {
22
- msgtype?: string;
23
- text?: {
24
- content?: string;
25
- };
26
- msgId?: string;
27
- createAt?: number;
28
- conversationType?: string;
29
- conversationId?: string;
30
- senderId?: string;
31
- senderNick?: string;
32
- senderCorpId?: string;
33
- sessionWebhook?: string;
34
- chatbotCorpId?: string;
35
- chatbotUserId?: string;
36
- isAdmin?: boolean;
37
- senderStaffId?: string;
38
- atUsers?: Array<{
39
- dingtalkId?: string;
40
- staffId?: string;
41
- }>;
42
- content?: any;
43
- }
44
- export declare class DingTalkBot implements Bot<DingTalkBotConfig, DingTalkMessage> {
45
- adapter: DingTalkAdapter;
46
- $config: DingTalkBotConfig;
47
- $connected: boolean;
48
- private router;
49
- private accessToken;
50
- private baseURL;
51
- private sessionWebhooks;
52
- get $id(): string;
53
- constructor(adapter: DingTalkAdapter, router: any, $config: DingTalkBotConfig);
54
- private request;
55
- private setupWebhookRoute;
56
- private handleWebhook;
57
- private verifySignature;
58
- private handleEvent;
59
- private ensureAccessToken;
60
- private refreshAccessToken;
61
- $formatMessage(msg: DingTalkMessage): Message<DingTalkMessage>;
62
- private parseMessageContent;
63
- $sendMessage(options: SendOptions): Promise<string>;
64
- $recallMessage(id: string): Promise<void>;
65
- private formatSendContent;
66
- $connect(): Promise<void>;
67
- $disconnect(): Promise<void>;
68
- getUserInfo(userId: string): Promise<any>;
69
- getDepartmentUsers(deptId: number): Promise<any[]>;
70
- sendWorkNotice(userIdList: string[], content: any): Promise<boolean>;
71
- /**
72
- * 获取部门列表
73
- * @param deptId 父部门 ID,默认为根部门 1
74
- */
75
- getDepartmentList(deptId?: number): Promise<any[]>;
76
- /**
77
- * 获取部门详情
78
- * @param deptId 部门 ID
79
- */
80
- getDepartmentInfo(deptId: number): Promise<any>;
81
- /**
82
- * 创建群聊
83
- * @param name 群名
84
- * @param ownerUserId 群主用户 ID
85
- * @param userIdList 成员用户 ID 列表
86
- */
87
- createChat(name: string, ownerUserId: string, userIdList: string[]): Promise<string | null>;
88
- /**
89
- * 获取群聊信息
90
- * @param chatId 群聊 ID
91
- */
92
- getChatInfo(chatId: string): Promise<any>;
93
- /**
94
- * 更新群聊(添加/移除成员等)
95
- * @param chatId 群聊 ID
96
- * @param options 更新选项
97
- */
98
- updateChat(chatId: string, options: {
99
- name?: string;
100
- owner?: string;
101
- add_useridlist?: string[];
102
- del_useridlist?: string[];
103
- }): Promise<boolean>;
104
- }
105
- declare class DingTalkAdapter extends Adapter<DingTalkBot> {
106
- #private;
107
- constructor(plugin: Plugin, router: any);
108
- createBot(config: DingTalkBotConfig): DingTalkBot;
109
- kickMember(botId: string, sceneId: string, userId: string): Promise<boolean>;
110
- setGroupName(botId: string, sceneId: string, name: string): Promise<boolean>;
111
- getGroupInfo(botId: string, sceneId: string): Promise<any>;
112
- start(): Promise<void>;
113
- /**
114
- * 注册钉钉平台特有工具(获取用户信息等)
115
- */
116
- private registerDingTalkPlatformTools;
117
- }
118
- export {};
12
+ export * from "./types.js";
13
+ export { DingTalkBot } from "./bot.js";
14
+ export { DingTalkAdapter } from "./adapter.js";
119
15
  //# sourceMappingURL=index.d.ts.map