@ikenxuan/amagi 4.4.7 → 4.4.9

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.
@@ -78,6 +78,500 @@ var BiLiBiLiAPI = class {
78
78
  }
79
79
  };
80
80
  var bilibiliAPI = new BiLiBiLiAPI();
81
+ var bilibiliApiUrls = new BiLiBiLiAPI();
82
+
83
+ // src/platform/bilibili/qtparam.ts
84
+ async function qtparam(BASEURL, cookie) {
85
+ if (cookie === "") return { QUERY: "&platform=html5", STATUS: "!isLogin" };
86
+ const logininfo = await new Networks({ url: bilibiliAPI.\u767B\u5F55\u57FA\u672C\u4FE1\u606F(), headers: { Cookie: cookie } }).getData();
87
+ const sign = await wbi_sign(BASEURL, cookie);
88
+ const qn = [6, 16, 32, 64, 74, 80, 112, 116, 120, 125, 126, 127];
89
+ let isvip;
90
+ logininfo.data.vipStatus === 1 ? isvip = true : isvip = false;
91
+ if (isvip) {
92
+ return { QUERY: `&fnval=16&fourk=1&${sign}`, STATUS: "isLogin", isvip };
93
+ } else return { QUERY: `&qn=${qn[3]}&fnval=16`, STATUS: "isLogin", isvip };
94
+ }
95
+ var mixinKeyEncTab = [
96
+ 46,
97
+ 47,
98
+ 18,
99
+ 2,
100
+ 53,
101
+ 8,
102
+ 23,
103
+ 32,
104
+ 15,
105
+ 50,
106
+ 10,
107
+ 31,
108
+ 58,
109
+ 3,
110
+ 45,
111
+ 35,
112
+ 27,
113
+ 43,
114
+ 5,
115
+ 49,
116
+ 33,
117
+ 9,
118
+ 42,
119
+ 19,
120
+ 29,
121
+ 28,
122
+ 14,
123
+ 39,
124
+ 12,
125
+ 38,
126
+ 41,
127
+ 13,
128
+ 37,
129
+ 48,
130
+ 7,
131
+ 16,
132
+ 24,
133
+ 55,
134
+ 40,
135
+ 61,
136
+ 26,
137
+ 17,
138
+ 0,
139
+ 1,
140
+ 60,
141
+ 51,
142
+ 30,
143
+ 4,
144
+ 22,
145
+ 25,
146
+ 54,
147
+ 21,
148
+ 56,
149
+ 59,
150
+ 6,
151
+ 63,
152
+ 57,
153
+ 62,
154
+ 11,
155
+ 36,
156
+ 20,
157
+ 34,
158
+ 44,
159
+ 52
160
+ ];
161
+ var getMixinKey = (orig) => mixinKeyEncTab.map((n) => orig[n]).join("").slice(0, 32);
162
+ function encWbi(params, img_key, sub_key) {
163
+ const mixin_key = getMixinKey(img_key + sub_key);
164
+ const curr_time = Math.round(Date.now() / 1e3);
165
+ const chr_filter = /[!'()*]/g;
166
+ Object.assign(params, { wts: curr_time });
167
+ const query = Object.keys(params).sort().map((key) => {
168
+ const value = params[key].toString().replace(chr_filter, "");
169
+ return `${encodeURIComponent(key)}=${encodeURIComponent(value)}`;
170
+ }).join("&");
171
+ const wbi_sign2 = crypto__default.default.createHash("md5").update(query + mixin_key).digest("hex");
172
+ return `&wts=${curr_time}&w_rid=${wbi_sign2}`;
173
+ }
174
+ async function getWbiKeys(cookie) {
175
+ const res = await axios__default.default("https://api.bilibili.com/x/web-interface/nav", {
176
+ headers: {
177
+ Cookie: cookie
178
+ }
179
+ });
180
+ const responseJson = res.data;
181
+ const response = responseJson;
182
+ const {
183
+ data: {
184
+ wbi_img: { img_url, sub_url }
185
+ }
186
+ } = response;
187
+ return {
188
+ img_key: img_url.slice(img_url.lastIndexOf("/") + 1, img_url.lastIndexOf(".")),
189
+ sub_key: sub_url.slice(sub_url.lastIndexOf("/") + 1, sub_url.lastIndexOf("."))
190
+ };
191
+ }
192
+ async function wbi_sign(BASEURL, cookie) {
193
+ const web_keys = await getWbiKeys(cookie);
194
+ const url = new URL(BASEURL);
195
+ const params = {};
196
+ for (const [key, value] of url.searchParams.entries()) {
197
+ params[key] = value;
198
+ }
199
+ const query = encWbi(params, web_keys.img_key, web_keys.sub_key);
200
+ return query;
201
+ }
202
+
203
+ // src/platform/bilibili/sign/bv2av.ts
204
+ var XOR_CODE = 23442827791579n;
205
+ var MASK_CODE = 2251799813685247n;
206
+ var MAX_AID = 1n << 51n;
207
+ var BASE = 58n;
208
+ var data = "FcwAPNKTMug3GV5Lj7EJnHpWsx4tb8haYeviqBz6rkCy12mUSDQX9RdoZf";
209
+ function av2bv(aid) {
210
+ const bytes = ["B", "V", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0"];
211
+ let bvIndex = bytes.length - 1;
212
+ let tmp = (MAX_AID | BigInt(aid)) ^ XOR_CODE;
213
+ while (tmp > 0) {
214
+ bytes[bvIndex] = data[Number(tmp % BigInt(BASE))];
215
+ tmp = tmp / BASE;
216
+ bvIndex -= 1;
217
+ }
218
+ [bytes[3], bytes[9]] = [bytes[9], bytes[3]];
219
+ [bytes[4], bytes[7]] = [bytes[7], bytes[4]];
220
+ return bytes.join("");
221
+ }
222
+ function bv2av(bvid) {
223
+ const bvidArr = Array.from(bvid);
224
+ [bvidArr[3], bvidArr[9]] = [bvidArr[9], bvidArr[3]];
225
+ [bvidArr[4], bvidArr[7]] = [bvidArr[7], bvidArr[4]];
226
+ bvidArr.splice(0, 3);
227
+ const tmp = bvidArr.reduce((pre, bvidChar) => pre * BASE + BigInt(data.indexOf(bvidChar)), 0n);
228
+ return Number(tmp & MASK_CODE ^ XOR_CODE);
229
+ }
230
+
231
+ // src/platform/bilibili/BilibiliApi.ts
232
+ var bilibili = {
233
+ /**
234
+ * 获取单个视频作品数据
235
+ * @param options 请求参数,包含 bvid 和可选的 typeMode
236
+ * @param cookie 有效的用户 Cookie
237
+ * @returns 接口返回的原始数据
238
+ */
239
+ async getVideoInfo(options, cookie) {
240
+ const { typeMode, ...restOptions } = options;
241
+ const data2 = await BilibiliData({ ...restOptions, methodType: "\u5355\u4E2A\u89C6\u9891\u4F5C\u54C1\u6570\u636E" }, cookie);
242
+ return data2;
243
+ },
244
+ /**
245
+ * 获取单个视频下载信息数据
246
+ * @param options 请求参数,包含 avid, cid 和可选的 typeMode
247
+ * @param cookie 有效的用户 Cookie
248
+ * @returns 接口返回的原始数据
249
+ */
250
+ async getVideoStream(options, cookie) {
251
+ const { typeMode, ...restOptions } = options;
252
+ const data2 = await BilibiliData({ ...restOptions, methodType: "\u5355\u4E2A\u89C6\u9891\u4E0B\u8F7D\u4FE1\u606F\u6570\u636E" }, cookie);
253
+ return data2;
254
+ },
255
+ /**
256
+ * 获取评论数据
257
+ * @param options 请求参数,包含 type, oid, 可选的 number, pn 和 typeMode
258
+ * @param cookie 有效的用户 Cookie
259
+ * @returns 接口返回的原始数据
260
+ */
261
+ async getComments(options, cookie) {
262
+ const { typeMode, ...restOptions } = options;
263
+ const data2 = await BilibiliData({ ...restOptions, methodType: "\u8BC4\u8BBA\u6570\u636E" }, cookie);
264
+ return data2;
265
+ },
266
+ /**
267
+ * 获取用户主页数据
268
+ * @param options 请求参数,包含 host_mid 和可选的 typeMode
269
+ * @param cookie 有效的用户 Cookie
270
+ * @returns 接口返回的原始数据
271
+ */
272
+ async getUserProfile(options, cookie) {
273
+ const { typeMode, ...restOptions } = options;
274
+ const data2 = await BilibiliData({ ...restOptions, methodType: "\u7528\u6237\u4E3B\u9875\u6570\u636E" }, cookie);
275
+ return data2;
276
+ },
277
+ /**
278
+ * 获取用户主页动态列表数据
279
+ * @param options 请求参数,包含 host_mid 和可选的 typeMode
280
+ * @param cookie 有效的用户 Cookie
281
+ * @returns 接口返回的原始数据
282
+ */
283
+ async getUserDynamic(options, cookie) {
284
+ const { typeMode, ...restOptions } = options;
285
+ const data2 = await BilibiliData({ ...restOptions, methodType: "\u7528\u6237\u4E3B\u9875\u52A8\u6001\u5217\u8868\u6570\u636E" }, cookie);
286
+ return data2;
287
+ },
288
+ /**
289
+ * 获取 Emoji 数据
290
+ * @param options 可选的请求参数 (主要用于 typeMode)
291
+ * @param cookie 有效的用户 Cookie
292
+ * @returns 接口返回的原始数据
293
+ */
294
+ async getEmojiList(options, cookie) {
295
+ const { typeMode, ...restOptions } = options;
296
+ const data2 = await BilibiliData({ ...restOptions, methodType: "Emoji\u6570\u636E" }, cookie);
297
+ return data2;
298
+ },
299
+ /**
300
+ * 获取番剧基本信息数据
301
+ * @param options 请求参数,包含可选的 season_id, ep_id 和 typeMode
302
+ * @param cookie 有效的用户 Cookie
303
+ * @returns 接口返回的原始数据
304
+ */
305
+ async getBangumiInfo(options, cookie) {
306
+ const { typeMode, ...restOptions } = options;
307
+ const data2 = await BilibiliData({ ...restOptions, methodType: "\u756A\u5267\u57FA\u672C\u4FE1\u606F\u6570\u636E" }, cookie);
308
+ return data2;
309
+ },
310
+ /**
311
+ * 获取番剧下载信息数据
312
+ * @param options 请求参数,包含 cid, ep_id 和可选的 typeMode
313
+ * @param cookie 有效的用户 Cookie
314
+ * @returns 接口返回的原始数据
315
+ */
316
+ async getBangumiStream(options, cookie) {
317
+ const { typeMode, ...restOptions } = options;
318
+ const data2 = await BilibiliData({ ...restOptions, methodType: "\u756A\u5267\u4E0B\u8F7D\u4FE1\u606F\u6570\u636E" }, cookie);
319
+ return data2;
320
+ },
321
+ /**
322
+ * 获取动态详情数据
323
+ * @param options 请求参数,包含 dynamic_id 和可选的 typeMode
324
+ * @param cookie 有效的用户 Cookie
325
+ * @returns 接口返回的原始数据
326
+ */
327
+ async getDynamicInfo(options, cookie) {
328
+ const { typeMode, ...restOptions } = options;
329
+ const data2 = await BilibiliData({ ...restOptions, methodType: "\u52A8\u6001\u8BE6\u60C5\u6570\u636E" }, cookie);
330
+ return data2;
331
+ },
332
+ /**
333
+ * 获取动态卡片数据
334
+ * @param options 请求参数,包含 dynamic_id 和可选的 typeMode
335
+ * @param cookie 有效的用户 Cookie
336
+ * @returns 接口返回的原始数据
337
+ */
338
+ async getDynamicCard(options, cookie) {
339
+ const { typeMode, ...restOptions } = options;
340
+ const data2 = await BilibiliData({ ...restOptions, methodType: "\u52A8\u6001\u5361\u7247\u6570\u636E" }, cookie);
341
+ return data2;
342
+ },
343
+ /**
344
+ * 获取直播间信息
345
+ * @param options 请求参数,包含 room_id 和可选的 typeMode
346
+ * @param cookie 有效的用户 Cookie
347
+ * @returns 接口返回的原始数据
348
+ */
349
+ async getLiveRoomDetail(options, cookie) {
350
+ const { typeMode, ...restOptions } = options;
351
+ const data2 = await BilibiliData({ ...restOptions, methodType: "\u76F4\u64AD\u95F4\u4FE1\u606F" }, cookie);
352
+ return data2;
353
+ },
354
+ /**
355
+ * 获取直播间初始化信息
356
+ * @param options 请求参数,包含 room_id 和可选的 typeMode
357
+ * @param cookie 有效的用户 Cookie
358
+ * @returns 接口返回的原始数据
359
+ */
360
+ async getLiveRoomInitInfo(options, cookie) {
361
+ const { typeMode, ...restOptions } = options;
362
+ const data2 = await BilibiliData({ ...restOptions, methodType: "\u76F4\u64AD\u95F4\u521D\u59CB\u5316\u4FE1\u606F" }, cookie);
363
+ return data2;
364
+ },
365
+ /**
366
+ * 获取登录基本信息
367
+ * @param options 可选的请求参数 (主要用于 typeMode)
368
+ * @param cookie 有效的用户 Cookie
369
+ * @returns 接口返回的原始数据
370
+ */
371
+ async getLoginBasicInfo(options, cookie) {
372
+ const { typeMode, ...restOptions } = options;
373
+ const data2 = await BilibiliData({ ...restOptions, methodType: "\u767B\u5F55\u57FA\u672C\u4FE1\u606F" }, cookie);
374
+ return data2;
375
+ },
376
+ /**
377
+ * 申请登录二维码
378
+ * @param options 可选的请求参数 (主要用于 typeMode)
379
+ * @param cookie 有效的用户 Cookie
380
+ * @returns 接口返回的原始数据
381
+ */
382
+ async getLoginQrcode(options, cookie) {
383
+ const { typeMode, ...restOptions } = options;
384
+ const data2 = await BilibiliData({ ...restOptions, methodType: "\u7533\u8BF7\u4E8C\u7EF4\u7801" }, cookie);
385
+ return data2;
386
+ },
387
+ /**
388
+ * 检查二维码状态
389
+ * @param options 请求参数,包含 qrcode_key 和可选的 typeMode
390
+ * @param cookie 有效的用户 Cookie
391
+ * @returns 接口返回的原始数据
392
+ */
393
+ async checkQrcodeStatus(options, cookie) {
394
+ const { typeMode, ...restOptions } = options;
395
+ const data2 = await BilibiliData({ ...restOptions, methodType: "\u4E8C\u7EF4\u7801\u72B6\u6001" }, cookie);
396
+ return data2;
397
+ },
398
+ /**
399
+ * 获取 UP 主总播放量
400
+ * @param options 请求参数,包含 host_mid 和可选的 typeMode
401
+ * @param cookie 有效的用户 Cookie
402
+ * @returns 接口返回的原始数据
403
+ */
404
+ async getUserTotalPlayCount(options, cookie) {
405
+ const { typeMode, ...restOptions } = options;
406
+ const data2 = await BilibiliData({ ...restOptions, methodType: "\u83B7\u53D6UP\u4E3B\u603B\u64AD\u653E\u91CF" }, cookie);
407
+ return data2;
408
+ },
409
+ /**
410
+ * 将 AV 号转换为 BV 号
411
+ * @param options 请求参数,包含 avid
412
+ * @param cookie 有效的用户 Cookie (此接口通常不需要)
413
+ * @returns 接口返回的原始数据
414
+ */
415
+ async convertAvToBv(options, cookie) {
416
+ const { typeMode, ...restOptions } = options;
417
+ const data2 = await BilibiliData({ ...restOptions, methodType: "AV\u8F6CBV" }, cookie);
418
+ return data2;
419
+ },
420
+ /**
421
+ * 将 BV 号转换为 AV 号
422
+ * @param options 请求参数,包含 bvid
423
+ * @param cookie 有效的用户 Cookie (此接口通常不需要)
424
+ * @returns 接口返回的原始数据
425
+ */
426
+ async convertBvToAv(options, cookie) {
427
+ const { typeMode, ...restOptions } = options;
428
+ const data2 = await BilibiliData({ ...restOptions, methodType: "BV\u8F6CAV" }, cookie);
429
+ return data2;
430
+ }
431
+ };
432
+ var registerBilibiliRoutes = (cookie) => {
433
+ const router = express__default.default.Router();
434
+ router.get("/new_login_qrcode", async (req, res) => {
435
+ const data2 = await BilibiliData({
436
+ methodType: "\u7533\u8BF7\u4E8C\u7EF4\u7801"
437
+ }, req.headers.cookie || cookie);
438
+ res.json(data2);
439
+ });
440
+ router.get("/check_qrcode", async (req, res) => {
441
+ const data2 = await BilibiliData({
442
+ methodType: "\u4E8C\u7EF4\u7801\u72B6\u6001",
443
+ qrcode_key: req.query.qrcode_key
444
+ }, req.headers.cookie || cookie);
445
+ res.json(data2);
446
+ });
447
+ router.get("/login_basic_info", async (req, res) => {
448
+ const data2 = await BilibiliData({
449
+ methodType: "\u767B\u5F55\u57FA\u672C\u4FE1\u606F"
450
+ }, req.headers.cookie || cookie);
451
+ res.json(data2);
452
+ });
453
+ router.get("/fetch_one_video", async (req, res) => {
454
+ const data2 = await BilibiliData({
455
+ methodType: "\u5355\u4E2A\u89C6\u9891\u4F5C\u54C1\u6570\u636E",
456
+ bvid: req.query.bvid
457
+ }, req.headers.cookie || cookie);
458
+ res.json(data2);
459
+ });
460
+ router.get("/fetch_video_playurl", async (req, res) => {
461
+ const data2 = await BilibiliData({
462
+ methodType: "\u5355\u4E2A\u89C6\u9891\u4E0B\u8F7D\u4FE1\u606F\u6570\u636E",
463
+ avid: parseInt(req.query.avid),
464
+ cid: parseInt(req.query.cid)
465
+ }, req.headers.cookie || cookie);
466
+ res.json(data2);
467
+ });
468
+ router.get("/fetch_work_comments", async (req, res) => {
469
+ const data2 = await BilibiliData({
470
+ methodType: "\u8BC4\u8BBA\u6570\u636E",
471
+ oid: Number(req.query.oid),
472
+ number: Number(req.query.number),
473
+ type: Number(req.query.type ?? 1)
474
+ }, req.headers.cookie || cookie);
475
+ res.json(data2);
476
+ });
477
+ router.get("/fetch_work_comments", async (req, res) => {
478
+ const data2 = await BilibiliData({
479
+ methodType: "Emoji\u6570\u636E"
480
+ }, req.headers.cookie || cookie);
481
+ res.json(data2);
482
+ });
483
+ router.get("/fetch_bangumi_video_info", async (req, res) => {
484
+ const data2 = await BilibiliData({
485
+ methodType: "\u756A\u5267\u57FA\u672C\u4FE1\u606F\u6570\u636E",
486
+ ep_id: req.query.ep_id
487
+ }, req.headers.cookie || cookie);
488
+ res.json(data2);
489
+ });
490
+ router.get("/fetch_bangumi_video_playurl", async (req, res) => {
491
+ const data2 = await BilibiliData({
492
+ methodType: "\u756A\u5267\u4E0B\u8F7D\u4FE1\u606F\u6570\u636E",
493
+ cid: parseInt(req.query.cid),
494
+ ep_id: req.query.ep_id
495
+ }, req.headers.cookie || cookie);
496
+ res.json(data2);
497
+ });
498
+ router.get("/fetch_user_dynamic", async (req, res) => {
499
+ const data2 = await BilibiliData({
500
+ methodType: "\u7528\u6237\u4E3B\u9875\u52A8\u6001\u5217\u8868\u6570\u636E",
501
+ host_mid: parseInt(req.query.host_mid)
502
+ }, req.headers.cookie || cookie);
503
+ res.json(data2);
504
+ });
505
+ router.get("/fetch_dynamic_info", async (req, res) => {
506
+ const data2 = await BilibiliData({
507
+ methodType: "\u52A8\u6001\u8BE6\u60C5\u6570\u636E",
508
+ dynamic_id: req.query.dynamic_id
509
+ }, req.headers.cookie || cookie);
510
+ res.json(data2);
511
+ });
512
+ router.get("/fetch_dynamic_card", async (req, res) => {
513
+ const data2 = await BilibiliData({
514
+ methodType: "\u52A8\u6001\u5361\u7247\u6570\u636E",
515
+ dynamic_id: req.query.dynamic_id
516
+ }, req.headers.cookie || cookie);
517
+ res.json(data2);
518
+ });
519
+ router.get("/fetch_user_profile", async (req, res) => {
520
+ const data2 = await BilibiliData({
521
+ methodType: "\u7528\u6237\u4E3B\u9875\u6570\u636E",
522
+ host_mid: parseInt(req.query.host_mid)
523
+ }, req.headers.cookie || cookie);
524
+ res.json(data2);
525
+ });
526
+ router.get("/fetch_live_room_detail", async (req, res) => {
527
+ const data2 = await BilibiliData({
528
+ methodType: "\u76F4\u64AD\u95F4\u4FE1\u606F",
529
+ room_id: req.query.room_id
530
+ }, req.headers.cookie || cookie);
531
+ res.json(data2);
532
+ });
533
+ router.get("/fetch_liveroom_def", async (req, res) => {
534
+ const data2 = await BilibiliData({
535
+ methodType: "\u76F4\u64AD\u95F4\u521D\u59CB\u5316\u4FE1\u606F",
536
+ room_id: req.query.room_id
537
+ }, req.headers.cookie || cookie);
538
+ res.json(data2);
539
+ });
540
+ router.get("/bv_to_av", async (req, res) => {
541
+ const data2 = await BilibiliData({
542
+ methodType: "BV\u8F6CAV",
543
+ bvid: req.query.bvid
544
+ }, req.headers.cookie || cookie);
545
+ res.json(data2);
546
+ });
547
+ router.get("/av_to_bv", async (req, res) => {
548
+ const data2 = await BilibiliData({
549
+ methodType: "AV\u8F6CBV",
550
+ avid: parseInt(req.query.avid)
551
+ }, req.headers.cookie || cookie);
552
+ res.json(data2);
553
+ });
554
+ router.get("/fetch_user_full_view", async (req, res) => {
555
+ const data2 = await BilibiliData({
556
+ methodType: "\u83B7\u53D6UP\u4E3B\u603B\u64AD\u653E\u91CF",
557
+ host_mid: parseInt(req.query.host_mid)
558
+ }, req.headers.cookie || cookie);
559
+ res.json(data2);
560
+ });
561
+ return router;
562
+ };
563
+
564
+ // src/platform/bilibili/index.ts
565
+ var bilibiliUtils = {
566
+ sign: {
567
+ wbi_sign,
568
+ av2bv,
569
+ bv2av
570
+ },
571
+ bilibiliApiUrls,
572
+ getBilibiliData,
573
+ api: bilibili
574
+ };
81
575
 
82
576
  // src/platform/bilibili/getdata.ts
83
577
  var defheaders = {
@@ -187,513 +681,235 @@ var BilibiliData = async (data2, cookie) => {
187
681
  ...tmpresp.data,
188
682
  // 去重
189
683
  replies: Array.from(new Map(fetchedComments.map((item) => [item.rpid, item])).values()).slice(0, Number(data2.number))
190
- }
191
- };
192
- return finalResponse;
193
- }
194
- case "Emoji\u6570\u636E": {
195
- return await GlobalGetData({
196
- url: bilibiliAPI.\u8868\u60C5\u5217\u8868(),
197
- ...data2
198
- });
199
- }
200
- case "\u756A\u5267\u57FA\u672C\u4FE1\u606F\u6570\u636E": {
201
- let id = data2.ep_id ? data2.ep_id : data2.season_id;
202
- if (!id) {
203
- BilibiliValidateData(data2, ["ep_id"]);
204
- return false;
205
- }
206
- const idType = id ? id.startsWith("ep") ? "ep_id" : "season_id" : "ep_id";
207
- const newId = idType === "ep_id" ? id.replace("ep", "") : id.replace("ss", "");
208
- const INFO = await GlobalGetData({
209
- url: bilibiliAPI.\u756A\u5267\u660E\u7EC6({ [idType]: newId }),
210
- headers: headers2,
211
- ...data2
212
- });
213
- return INFO;
214
- }
215
- case "\u756A\u5267\u4E0B\u8F7D\u4FE1\u606F\u6570\u636E": {
216
- BilibiliValidateData(data2, ["cid", "ep_id"]);
217
- const BASEURL = bilibiliAPI.\u756A\u5267\u89C6\u9891\u6D41\u4FE1\u606F({ cid: data2.cid, ep_id: data2.ep_id.replace("ep", "") });
218
- const SIGN = await qtparam(BASEURL, headers2.cookie);
219
- const DATA = await GlobalGetData({
220
- url: bilibiliAPI.\u756A\u5267\u89C6\u9891\u6D41\u4FE1\u606F({ cid: data2.cid, ep_id: data2.ep_id.replace("ep", "") }) + SIGN.QUERY,
221
- headers: headers2,
222
- ...data2
223
- });
224
- return DATA;
225
- }
226
- case "\u7528\u6237\u4E3B\u9875\u52A8\u6001\u5217\u8868\u6570\u636E": {
227
- BilibiliValidateData(data2, ["host_mid"]);
228
- delete headers2.referer;
229
- const { host_mid } = data2;
230
- const result = await GlobalGetData({
231
- url: bilibiliAPI.\u7528\u6237\u7A7A\u95F4\u52A8\u6001({ host_mid }),
232
- headers: headers2,
233
- ...data2
234
- });
235
- return result;
236
- }
237
- case "\u52A8\u6001\u8BE6\u60C5\u6570\u636E": {
238
- BilibiliValidateData(data2, ["dynamic_id"]);
239
- delete headers2.referer;
240
- const dynamicINFO = await GlobalGetData({
241
- url: bilibiliAPI.\u52A8\u6001\u8BE6\u60C5({ dynamic_id: data2.dynamic_id }),
242
- headers: headers2,
243
- ...data2
244
- });
245
- return dynamicINFO;
246
- }
247
- case "\u52A8\u6001\u5361\u7247\u6570\u636E": {
248
- BilibiliValidateData(data2, ["dynamic_id"]);
249
- delete headers2.referer;
250
- const { dynamic_id } = data2;
251
- const dynamicINFO_CARD = await GlobalGetData({
252
- url: bilibiliAPI.\u52A8\u6001\u5361\u7247\u4FE1\u606F({ dynamic_id }),
253
- headers: headers2,
254
- ...data2
255
- });
256
- return dynamicINFO_CARD;
257
- }
258
- case "\u7528\u6237\u4E3B\u9875\u6570\u636E": {
259
- BilibiliValidateData(data2, ["host_mid"]);
260
- const { host_mid } = data2;
261
- const result = await GlobalGetData({
262
- url: bilibiliAPI.\u7528\u6237\u540D\u7247\u4FE1\u606F({ host_mid }),
263
- headers: headers2,
264
- ...data2
265
- });
266
- return result;
267
- }
268
- case "\u76F4\u64AD\u95F4\u4FE1\u606F": {
269
- BilibiliValidateData(data2, ["room_id"]);
270
- const result = await GlobalGetData({
271
- url: bilibiliAPI.\u76F4\u64AD\u95F4\u4FE1\u606F({ room_id: data2.room_id }),
272
- headers: headers2,
273
- ...data2
274
- });
275
- return result;
684
+ }
685
+ };
686
+ return finalResponse;
276
687
  }
277
- case "\u76F4\u64AD\u95F4\u521D\u59CB\u5316\u4FE1\u606F": {
278
- BilibiliValidateData(data2, ["room_id"]);
279
- const result = await GlobalGetData({
280
- url: bilibiliAPI.\u76F4\u64AD\u95F4\u521D\u59CB\u5316\u4FE1\u606F({ room_id: data2.room_id }),
281
- headers: headers2,
688
+ case "Emoji\u6570\u636E": {
689
+ return await GlobalGetData({
690
+ url: bilibiliAPI.\u8868\u60C5\u5217\u8868(),
282
691
  ...data2
283
692
  });
284
- return result;
285
693
  }
286
- case "\u7533\u8BF7\u4E8C\u7EF4\u7801": {
287
- const result = await GlobalGetData({
288
- url: bilibiliAPI.\u7533\u8BF7\u4E8C\u7EF4\u7801(),
694
+ case "\u756A\u5267\u57FA\u672C\u4FE1\u606F\u6570\u636E": {
695
+ let id = data2.ep_id ? data2.ep_id : data2.season_id;
696
+ if (!id) {
697
+ BilibiliValidateData(data2, ["ep_id"]);
698
+ return false;
699
+ }
700
+ const idType = id ? id.startsWith("ep") ? "ep_id" : "season_id" : "ep_id";
701
+ const newId = idType === "ep_id" ? id.replace("ep", "") : id.replace("ss", "");
702
+ const INFO = await GlobalGetData({
703
+ url: bilibiliAPI.\u756A\u5267\u660E\u7EC6({ [idType]: newId }),
289
704
  headers: headers2,
290
705
  ...data2
291
706
  });
292
- return result;
707
+ return INFO;
293
708
  }
294
- case "\u4E8C\u7EF4\u7801\u72B6\u6001": {
295
- BilibiliValidateData(data2, ["qrcode_key"]);
296
- const result = await new Networks({
297
- url: bilibiliAPI.\u4E8C\u7EF4\u7801\u72B6\u6001({ qrcode_key: data2.qrcode_key }),
709
+ case "\u756A\u5267\u4E0B\u8F7D\u4FE1\u606F\u6570\u636E": {
710
+ BilibiliValidateData(data2, ["cid", "ep_id"]);
711
+ const BASEURL = bilibiliAPI.\u756A\u5267\u89C6\u9891\u6D41\u4FE1\u606F({ cid: data2.cid, ep_id: data2.ep_id.replace("ep", "") });
712
+ const SIGN = await qtparam(BASEURL, headers2.cookie);
713
+ const DATA = await GlobalGetData({
714
+ url: bilibiliAPI.\u756A\u5267\u89C6\u9891\u6D41\u4FE1\u606F({ cid: data2.cid, ep_id: data2.ep_id.replace("ep", "") }) + SIGN.QUERY,
298
715
  headers: headers2,
299
716
  ...data2
300
- }).getHeadersAndData();
301
- return result;
717
+ });
718
+ return DATA;
302
719
  }
303
- case "\u767B\u5F55\u57FA\u672C\u4FE1\u606F": {
720
+ case "\u7528\u6237\u4E3B\u9875\u52A8\u6001\u5217\u8868\u6570\u636E": {
721
+ BilibiliValidateData(data2, ["host_mid"]);
722
+ delete headers2.referer;
723
+ const { host_mid } = data2;
304
724
  const result = await GlobalGetData({
305
- url: bilibiliAPI.\u767B\u5F55\u57FA\u672C\u4FE1\u606F(),
725
+ url: bilibiliAPI.\u7528\u6237\u7A7A\u95F4\u52A8\u6001({ host_mid }),
306
726
  headers: headers2,
307
727
  ...data2
308
728
  });
309
729
  return result;
310
730
  }
311
- case "\u83B7\u53D6UP\u4E3B\u603B\u64AD\u653E\u91CF": {
312
- BilibiliValidateData(data2, ["host_mid"]);
313
- const result = await GlobalGetData({
314
- url: bilibiliAPI.\u83B7\u53D6UP\u4E3B\u603B\u64AD\u653E\u91CF({ host_mid: data2.host_mid }),
731
+ case "\u52A8\u6001\u8BE6\u60C5\u6570\u636E": {
732
+ BilibiliValidateData(data2, ["dynamic_id"]);
733
+ delete headers2.referer;
734
+ const dynamicINFO = await GlobalGetData({
735
+ url: bilibiliAPI.\u52A8\u6001\u8BE6\u60C5({ dynamic_id: data2.dynamic_id }),
315
736
  headers: headers2,
316
737
  ...data2
317
738
  });
318
- return result;
319
- }
320
- case "AV\u8F6CBV": {
321
- BilibiliValidateData(data2, ["avid"]);
322
- const result = av2bv(Number(data2.avid.toString().replace(/^av/i, "")));
323
- return {
324
- code: 0,
325
- message: "success",
326
- data: {
327
- bvid: result
328
- }
329
- };
330
- }
331
- case "BV\u8F6CAV": {
332
- BilibiliValidateData(data2, ["bvid"]);
333
- const result = "av" + bv2av(data2.bvid);
334
- return {
335
- code: 0,
336
- message: "success",
337
- data: {
338
- aid: result
339
- }
340
- };
739
+ return dynamicINFO;
341
740
  }
342
- default:
343
- return null;
344
- }
345
- };
346
- var GlobalGetData = async (options) => {
347
- const result = await new Networks(options).getData();
348
- if (result && result.code === 0) {
349
- return result;
350
- } else if (result.code === 12061) {
351
- logger.warn(`\u83B7\u53D6\u54CD\u5E94\u6570\u636E\u5931\u8D25\uFF01
352
- \u8BF7\u6C42\u63A5\u53E3\u7C7B\u578B\uFF1A${options.methodType}
353
- \u8BF7\u6C42URL\uFF1A${options.url}
354
- \u9519\u8BEF\u4EE3\u7801\uFF1A${result.code}\uFF0C
355
- \u542B\u4E49\uFF1A${result.message}`);
356
- return result;
357
- } else {
358
- const errorMessage = errorMap[result.code] || result.message || "\u672A\u77E5\u9519\u8BEF";
359
- logger.warn(`\u83B7\u53D6\u54CD\u5E94\u6570\u636E\u5931\u8D25\uFF01
360
- \u8BF7\u6C42\u63A5\u53E3\u7C7B\u578B\uFF1A${options.methodType}
361
- \u8BF7\u6C42URL\uFF1A${options.url}
362
- \u9519\u8BEF\u4EE3\u7801\uFF1A${result.code}\uFF0C
363
- \u542B\u4E49\uFF1A${errorMessage}`);
364
- return result;
365
- }
366
- };
367
- var errorMap = {
368
- "-1": "\u5E94\u7528\u7A0B\u5E8F\u4E0D\u5B58\u5728\u6216\u5DF2\u88AB\u5C01\u7981",
369
- "-2": "Access Key \u9519\u8BEF",
370
- "-3": "API \u6821\u9A8C\u5BC6\u5319\u9519\u8BEF",
371
- "-4": "\u8C03\u7528\u65B9\u5BF9\u8BE5 Method \u6CA1\u6709\u6743\u9650",
372
- "-101": "\u8D26\u53F7\u672A\u767B\u5F55",
373
- "-102": "\u8D26\u53F7\u88AB\u5C01\u505C",
374
- "-103": "\u79EF\u5206\u4E0D\u8DB3",
375
- "-104": "\u786C\u5E01\u4E0D\u8DB3",
376
- "-105": "\u9A8C\u8BC1\u7801\u9519\u8BEF",
377
- "-106": "\u8D26\u53F7\u975E\u6B63\u5F0F\u4F1A\u5458\u6216\u5728\u9002\u5E94\u671F",
378
- "-107": "\u5E94\u7528\u4E0D\u5B58\u5728\u6216\u8005\u88AB\u5C01\u7981",
379
- "-108": "\u672A\u7ED1\u5B9A\u624B\u673A",
380
- "-110": "\u672A\u7ED1\u5B9A\u624B\u673A",
381
- "-111": "csrf \u6821\u9A8C\u5931\u8D25",
382
- "-112": "\u7CFB\u7EDF\u5347\u7EA7\u4E2D",
383
- "-113": "\u8D26\u53F7\u5C1A\u672A\u5B9E\u540D\u8BA4\u8BC1",
384
- "-114": "\u8BF7\u5148\u7ED1\u5B9A\u624B\u673A",
385
- "-115": "\u8BF7\u5148\u5B8C\u6210\u5B9E\u540D\u8BA4\u8BC1",
386
- "-304": "\u6728\u6709\u6539\u52A8",
387
- "-307": "\u649E\u8F66\u8DF3\u8F6C",
388
- "-352": "\u98CE\u63A7\u6821\u9A8C\u5931\u8D25 (UA \u6216 wbi \u53C2\u6570\u4E0D\u5408\u6CD5)",
389
- "-400": "\u8BF7\u6C42\u9519\u8BEF",
390
- "-401": "\u672A\u8BA4\u8BC1 (\u6216\u975E\u6CD5\u8BF7\u6C42)",
391
- "-403": "\u8BBF\u95EE\u6743\u9650\u4E0D\u8DB3",
392
- "-404": "\u5565\u90FD\u6728\u6709",
393
- "-405": "\u4E0D\u652F\u6301\u8BE5\u65B9\u6CD5",
394
- "-409": "\u51B2\u7A81",
395
- "-412": "\u8BF7\u6C42\u88AB\u62E6\u622A (\u5BA2\u6237\u7AEF ip \u88AB\u670D\u52A1\u7AEF\u98CE\u63A7)",
396
- "-500": "\u670D\u52A1\u5668\u9519\u8BEF",
397
- "-503": "\u8FC7\u8F7D\u4FDD\u62A4,\u670D\u52A1\u6682\u4E0D\u53EF\u7528",
398
- "-504": "\u670D\u52A1\u8C03\u7528\u8D85\u65F6",
399
- "-509": "\u8D85\u51FA\u9650\u5236",
400
- "-616": "\u4E0A\u4F20\u6587\u4EF6\u4E0D\u5B58\u5728",
401
- "-617": "\u4E0A\u4F20\u6587\u4EF6\u592A\u5927",
402
- "-625": "\u767B\u5F55\u5931\u8D25\u6B21\u6570\u592A\u591A",
403
- "-626": "\u7528\u6237\u4E0D\u5B58\u5728",
404
- "-628": "\u5BC6\u7801\u592A\u5F31",
405
- "-629": "\u7528\u6237\u540D\u6216\u5BC6\u7801\u9519\u8BEF",
406
- "-632": "\u64CD\u4F5C\u5BF9\u8C61\u6570\u91CF\u9650\u5236",
407
- "-643": "\u88AB\u9501\u5B9A",
408
- "-650": "\u7528\u6237\u7B49\u7EA7\u592A\u4F4E",
409
- "-652": "\u91CD\u590D\u7684\u7528\u6237",
410
- "-658": "Token \u8FC7\u671F",
411
- "-662": "\u5BC6\u7801\u65F6\u95F4\u6233\u8FC7\u671F",
412
- "-688": "\u5730\u7406\u533A\u57DF\u9650\u5236",
413
- "-689": "\u7248\u6743\u9650\u5236",
414
- "-701": "\u6263\u8282\u64CD\u5931\u8D25",
415
- "-799": "\u8BF7\u6C42\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5",
416
- "-8888": "\u5BF9\u4E0D\u8D77\uFF0C\u670D\u52A1\u5668\u5F00\u5C0F\u5DEE\u4E86~ (\u0CA5\uFE4F\u0CA5)"
417
- };
418
-
419
- // src/platform/bilibili/qtparam.ts
420
- async function qtparam(BASEURL, cookie) {
421
- if (cookie === "") return { QUERY: "&platform=html5", STATUS: "!isLogin" };
422
- const logininfo = await new Networks({ url: bilibiliAPI.\u767B\u5F55\u57FA\u672C\u4FE1\u606F(), headers: { Cookie: cookie } }).getData();
423
- const sign = await wbi_sign(BASEURL, cookie);
424
- const qn = [6, 16, 32, 64, 74, 80, 112, 116, 120, 125, 126, 127];
425
- let isvip;
426
- logininfo.data.vipStatus === 1 ? isvip = true : isvip = false;
427
- if (isvip) {
428
- return { QUERY: `&fnval=16&fourk=1&${sign}`, STATUS: "isLogin", isvip };
429
- } else return { QUERY: `&qn=${qn[3]}&fnval=16`, STATUS: "isLogin", isvip };
430
- }
431
- var mixinKeyEncTab = [
432
- 46,
433
- 47,
434
- 18,
435
- 2,
436
- 53,
437
- 8,
438
- 23,
439
- 32,
440
- 15,
441
- 50,
442
- 10,
443
- 31,
444
- 58,
445
- 3,
446
- 45,
447
- 35,
448
- 27,
449
- 43,
450
- 5,
451
- 49,
452
- 33,
453
- 9,
454
- 42,
455
- 19,
456
- 29,
457
- 28,
458
- 14,
459
- 39,
460
- 12,
461
- 38,
462
- 41,
463
- 13,
464
- 37,
465
- 48,
466
- 7,
467
- 16,
468
- 24,
469
- 55,
470
- 40,
471
- 61,
472
- 26,
473
- 17,
474
- 0,
475
- 1,
476
- 60,
477
- 51,
478
- 30,
479
- 4,
480
- 22,
481
- 25,
482
- 54,
483
- 21,
484
- 56,
485
- 59,
486
- 6,
487
- 63,
488
- 57,
489
- 62,
490
- 11,
491
- 36,
492
- 20,
493
- 34,
494
- 44,
495
- 52
496
- ];
497
- var getMixinKey = (orig) => mixinKeyEncTab.map((n) => orig[n]).join("").slice(0, 32);
498
- function encWbi(params, img_key, sub_key) {
499
- const mixin_key = getMixinKey(img_key + sub_key);
500
- const curr_time = Math.round(Date.now() / 1e3);
501
- const chr_filter = /[!'()*]/g;
502
- Object.assign(params, { wts: curr_time });
503
- const query = Object.keys(params).sort().map((key) => {
504
- const value = params[key].toString().replace(chr_filter, "");
505
- return `${encodeURIComponent(key)}=${encodeURIComponent(value)}`;
506
- }).join("&");
507
- const wbi_sign2 = crypto__default.default.createHash("md5").update(query + mixin_key).digest("hex");
508
- return `&wts=${curr_time}&w_rid=${wbi_sign2}`;
509
- }
510
- async function getWbiKeys(cookie) {
511
- const res = await axios__default.default("https://api.bilibili.com/x/web-interface/nav", {
512
- headers: {
513
- Cookie: cookie
741
+ case "\u52A8\u6001\u5361\u7247\u6570\u636E": {
742
+ BilibiliValidateData(data2, ["dynamic_id"]);
743
+ delete headers2.referer;
744
+ const { dynamic_id } = data2;
745
+ const dynamicINFO_CARD = await GlobalGetData({
746
+ url: bilibiliAPI.\u52A8\u6001\u5361\u7247\u4FE1\u606F({ dynamic_id }),
747
+ headers: headers2,
748
+ ...data2
749
+ });
750
+ return dynamicINFO_CARD;
514
751
  }
515
- });
516
- const responseJson = res.data;
517
- const response = responseJson;
518
- const {
519
- data: {
520
- wbi_img: { img_url, sub_url }
752
+ case "\u7528\u6237\u4E3B\u9875\u6570\u636E": {
753
+ BilibiliValidateData(data2, ["host_mid"]);
754
+ const { host_mid } = data2;
755
+ const result = await GlobalGetData({
756
+ url: bilibiliAPI.\u7528\u6237\u540D\u7247\u4FE1\u606F({ host_mid }),
757
+ headers: headers2,
758
+ ...data2
759
+ });
760
+ return result;
521
761
  }
522
- } = response;
523
- return {
524
- img_key: img_url.slice(img_url.lastIndexOf("/") + 1, img_url.lastIndexOf(".")),
525
- sub_key: sub_url.slice(sub_url.lastIndexOf("/") + 1, sub_url.lastIndexOf("."))
526
- };
527
- }
528
- async function wbi_sign(BASEURL, cookie) {
529
- const web_keys = await getWbiKeys(cookie);
530
- const url = new URL(BASEURL);
531
- const params = {};
532
- for (const [key, value] of url.searchParams.entries()) {
533
- params[key] = value;
762
+ case "\u76F4\u64AD\u95F4\u4FE1\u606F": {
763
+ BilibiliValidateData(data2, ["room_id"]);
764
+ const result = await GlobalGetData({
765
+ url: bilibiliAPI.\u76F4\u64AD\u95F4\u4FE1\u606F({ room_id: data2.room_id }),
766
+ headers: headers2,
767
+ ...data2
768
+ });
769
+ return result;
770
+ }
771
+ case "\u76F4\u64AD\u95F4\u521D\u59CB\u5316\u4FE1\u606F": {
772
+ BilibiliValidateData(data2, ["room_id"]);
773
+ const result = await GlobalGetData({
774
+ url: bilibiliAPI.\u76F4\u64AD\u95F4\u521D\u59CB\u5316\u4FE1\u606F({ room_id: data2.room_id }),
775
+ headers: headers2,
776
+ ...data2
777
+ });
778
+ return result;
779
+ }
780
+ case "\u7533\u8BF7\u4E8C\u7EF4\u7801": {
781
+ const result = await GlobalGetData({
782
+ url: bilibiliAPI.\u7533\u8BF7\u4E8C\u7EF4\u7801(),
783
+ headers: headers2,
784
+ ...data2
785
+ });
786
+ return result;
787
+ }
788
+ case "\u4E8C\u7EF4\u7801\u72B6\u6001": {
789
+ BilibiliValidateData(data2, ["qrcode_key"]);
790
+ const result = await new Networks({
791
+ url: bilibiliAPI.\u4E8C\u7EF4\u7801\u72B6\u6001({ qrcode_key: data2.qrcode_key }),
792
+ headers: headers2,
793
+ ...data2
794
+ }).getHeadersAndData();
795
+ return result;
796
+ }
797
+ case "\u767B\u5F55\u57FA\u672C\u4FE1\u606F": {
798
+ const result = await GlobalGetData({
799
+ url: bilibiliAPI.\u767B\u5F55\u57FA\u672C\u4FE1\u606F(),
800
+ headers: headers2,
801
+ ...data2
802
+ });
803
+ return result;
804
+ }
805
+ case "\u83B7\u53D6UP\u4E3B\u603B\u64AD\u653E\u91CF": {
806
+ BilibiliValidateData(data2, ["host_mid"]);
807
+ const result = await GlobalGetData({
808
+ url: bilibiliAPI.\u83B7\u53D6UP\u4E3B\u603B\u64AD\u653E\u91CF({ host_mid: data2.host_mid }),
809
+ headers: headers2,
810
+ ...data2
811
+ });
812
+ return result;
813
+ }
814
+ case "AV\u8F6CBV": {
815
+ BilibiliValidateData(data2, ["avid"]);
816
+ const result = av2bv(Number(data2.avid.toString().replace(/^av/i, "")));
817
+ return {
818
+ code: 0,
819
+ message: "success",
820
+ data: {
821
+ bvid: result
822
+ }
823
+ };
824
+ }
825
+ case "BV\u8F6CAV": {
826
+ BilibiliValidateData(data2, ["bvid"]);
827
+ const result = "av" + bv2av(data2.bvid);
828
+ return {
829
+ code: 0,
830
+ message: "success",
831
+ data: {
832
+ aid: result
833
+ }
834
+ };
835
+ }
836
+ default:
837
+ logger.warn(`\u672A\u77E5\u7684\u6296\u97F3\u6570\u636E\u63A5\u53E3\uFF1A\u300D${logger.red(data2.methodType)}\u300D`);
838
+ return null;
534
839
  }
535
- const query = encWbi(params, web_keys.img_key, web_keys.sub_key);
536
- return query;
537
- }
538
- var registerBilibiliRoutes = (cookie) => {
539
- const router = express__default.default.Router();
540
- router.get("/new_login_qrcode", async (req, res) => {
541
- const data2 = await BilibiliData({
542
- methodType: "\u7533\u8BF7\u4E8C\u7EF4\u7801"
543
- }, req.headers.cookie || cookie);
544
- res.json(data2);
545
- });
546
- router.get("/check_qrcode", async (req, res) => {
547
- const data2 = await BilibiliData({
548
- methodType: "\u4E8C\u7EF4\u7801\u72B6\u6001",
549
- qrcode_key: req.query.qrcode_key
550
- }, req.headers.cookie || cookie);
551
- res.json(data2);
552
- });
553
- router.get("/login_basic_info", async (req, res) => {
554
- const data2 = await BilibiliData({
555
- methodType: "\u767B\u5F55\u57FA\u672C\u4FE1\u606F"
556
- }, req.headers.cookie || cookie);
557
- res.json(data2);
558
- });
559
- router.get("/fetch_one_video", async (req, res) => {
560
- const data2 = await BilibiliData({
561
- methodType: "\u5355\u4E2A\u89C6\u9891\u4F5C\u54C1\u6570\u636E",
562
- bvid: req.query.bvid
563
- }, req.headers.cookie || cookie);
564
- res.json(data2);
565
- });
566
- router.get("/fetch_video_playurl", async (req, res) => {
567
- const data2 = await BilibiliData({
568
- methodType: "\u5355\u4E2A\u89C6\u9891\u4E0B\u8F7D\u4FE1\u606F\u6570\u636E",
569
- avid: parseInt(req.query.avid),
570
- cid: parseInt(req.query.cid)
571
- }, req.headers.cookie || cookie);
572
- res.json(data2);
573
- });
574
- router.get("/fetch_work_comments", async (req, res) => {
575
- const data2 = await BilibiliData({
576
- methodType: "\u8BC4\u8BBA\u6570\u636E",
577
- oid: Number(req.query.oid),
578
- number: Number(req.query.number),
579
- type: Number(req.query.type ?? 1)
580
- }, req.headers.cookie || cookie);
581
- res.json(data2);
582
- });
583
- router.get("/fetch_work_comments", async (req, res) => {
584
- const data2 = await BilibiliData({
585
- methodType: "Emoji\u6570\u636E"
586
- }, req.headers.cookie || cookie);
587
- res.json(data2);
588
- });
589
- router.get("/fetch_bangumi_video_info", async (req, res) => {
590
- const data2 = await BilibiliData({
591
- methodType: "\u756A\u5267\u57FA\u672C\u4FE1\u606F\u6570\u636E",
592
- ep_id: req.query.ep_id
593
- }, req.headers.cookie || cookie);
594
- res.json(data2);
595
- });
596
- router.get("/fetch_bangumi_video_playurl", async (req, res) => {
597
- const data2 = await BilibiliData({
598
- methodType: "\u756A\u5267\u4E0B\u8F7D\u4FE1\u606F\u6570\u636E",
599
- cid: parseInt(req.query.cid),
600
- ep_id: req.query.ep_id
601
- }, req.headers.cookie || cookie);
602
- res.json(data2);
603
- });
604
- router.get("/fetch_user_dynamic", async (req, res) => {
605
- const data2 = await BilibiliData({
606
- methodType: "\u7528\u6237\u4E3B\u9875\u52A8\u6001\u5217\u8868\u6570\u636E",
607
- host_mid: parseInt(req.query.host_mid)
608
- }, req.headers.cookie || cookie);
609
- res.json(data2);
610
- });
611
- router.get("/fetch_dynamic_info", async (req, res) => {
612
- const data2 = await BilibiliData({
613
- methodType: "\u52A8\u6001\u8BE6\u60C5\u6570\u636E",
614
- dynamic_id: req.query.dynamic_id
615
- }, req.headers.cookie || cookie);
616
- res.json(data2);
617
- });
618
- router.get("/fetch_dynamic_card", async (req, res) => {
619
- const data2 = await BilibiliData({
620
- methodType: "\u52A8\u6001\u5361\u7247\u6570\u636E",
621
- dynamic_id: req.query.dynamic_id
622
- }, req.headers.cookie || cookie);
623
- res.json(data2);
624
- });
625
- router.get("/fetch_user_profile", async (req, res) => {
626
- const data2 = await BilibiliData({
627
- methodType: "\u7528\u6237\u4E3B\u9875\u6570\u636E",
628
- host_mid: parseInt(req.query.host_mid)
629
- }, req.headers.cookie || cookie);
630
- res.json(data2);
631
- });
632
- router.get("/fetch_live_room_detail", async (req, res) => {
633
- const data2 = await BilibiliData({
634
- methodType: "\u76F4\u64AD\u95F4\u4FE1\u606F",
635
- room_id: req.query.room_id
636
- }, req.headers.cookie || cookie);
637
- res.json(data2);
638
- });
639
- router.get("/fetch_liveroom_def", async (req, res) => {
640
- const data2 = await BilibiliData({
641
- methodType: "\u76F4\u64AD\u95F4\u521D\u59CB\u5316\u4FE1\u606F",
642
- room_id: req.query.room_id
643
- }, req.headers.cookie || cookie);
644
- res.json(data2);
645
- });
646
- router.get("/bv_to_av", async (req, res) => {
647
- const data2 = await BilibiliData({
648
- methodType: "BV\u8F6CAV",
649
- bvid: req.query.bvid
650
- }, req.headers.cookie || cookie);
651
- res.json(data2);
652
- });
653
- router.get("/av_to_bv", async (req, res) => {
654
- const data2 = await BilibiliData({
655
- methodType: "AV\u8F6CBV",
656
- avid: parseInt(req.query.avid)
657
- }, req.headers.cookie || cookie);
658
- res.json(data2);
659
- });
660
- router.get("/fetch_user_full_view", async (req, res) => {
661
- const data2 = await BilibiliData({
662
- methodType: "\u83B7\u53D6UP\u4E3B\u603B\u64AD\u653E\u91CF",
663
- host_mid: parseInt(req.query.host_mid)
664
- }, req.headers.cookie || cookie);
665
- res.json(data2);
666
- });
667
- return router;
668
840
  };
669
-
670
- // src/platform/bilibili/sign/bv2av.ts
671
- var XOR_CODE = 23442827791579n;
672
- var MASK_CODE = 2251799813685247n;
673
- var MAX_AID = 1n << 51n;
674
- var BASE = 58n;
675
- var data = "FcwAPNKTMug3GV5Lj7EJnHpWsx4tb8haYeviqBz6rkCy12mUSDQX9RdoZf";
676
- function av2bv(aid) {
677
- const bytes = ["B", "V", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0"];
678
- let bvIndex = bytes.length - 1;
679
- let tmp = (MAX_AID | BigInt(aid)) ^ XOR_CODE;
680
- while (tmp > 0) {
681
- bytes[bvIndex] = data[Number(tmp % BigInt(BASE))];
682
- tmp = tmp / BASE;
683
- bvIndex -= 1;
841
+ var GlobalGetData = async (options) => {
842
+ const result = await new Networks(options).getData();
843
+ if (result && result.code === 0) {
844
+ return result;
845
+ } else if (result.code === 12061) {
846
+ logger.warn(`\u83B7\u53D6\u54CD\u5E94\u6570\u636E\u5931\u8D25\uFF01
847
+ \u8BF7\u6C42\u63A5\u53E3\u7C7B\u578B\uFF1A\u300C${options.methodType}\u300D
848
+ \u8BF7\u6C42URL\uFF1A${options.url}
849
+ \u9519\u8BEF\u4EE3\u7801\uFF1A${result.code}\uFF0C
850
+ \u542B\u4E49\uFF1A${result.message}`);
851
+ return result;
852
+ } else {
853
+ const errorMessage = errorMap[result.code] || result.message || "\u672A\u77E5\u9519\u8BEF";
854
+ logger.warn(`\u83B7\u53D6\u54CD\u5E94\u6570\u636E\u5931\u8D25\uFF01
855
+ \u8BF7\u6C42\u63A5\u53E3\u7C7B\u578B\uFF1A\u300C${options.methodType}\u300D
856
+ \u8BF7\u6C42URL\uFF1A${options.url}
857
+ \u9519\u8BEF\u4EE3\u7801\uFF1A${result.code}\uFF0C
858
+ \u542B\u4E49\uFF1A${errorMessage}`);
859
+ return result;
684
860
  }
685
- [bytes[3], bytes[9]] = [bytes[9], bytes[3]];
686
- [bytes[4], bytes[7]] = [bytes[7], bytes[4]];
687
- return bytes.join("");
688
- }
689
- function bv2av(bvid) {
690
- const bvidArr = Array.from(bvid);
691
- [bvidArr[3], bvidArr[9]] = [bvidArr[9], bvidArr[3]];
692
- [bvidArr[4], bvidArr[7]] = [bvidArr[7], bvidArr[4]];
693
- bvidArr.splice(0, 3);
694
- const tmp = bvidArr.reduce((pre, bvidChar) => pre * BASE + BigInt(data.indexOf(bvidChar)), 0n);
695
- return Number(tmp & MASK_CODE ^ XOR_CODE);
696
- }
861
+ };
862
+ var errorMap = {
863
+ "-1": "\u5E94\u7528\u7A0B\u5E8F\u4E0D\u5B58\u5728\u6216\u5DF2\u88AB\u5C01\u7981",
864
+ "-2": "Access Key \u9519\u8BEF",
865
+ "-3": "API \u6821\u9A8C\u5BC6\u5319\u9519\u8BEF",
866
+ "-4": "\u8C03\u7528\u65B9\u5BF9\u8BE5 Method \u6CA1\u6709\u6743\u9650",
867
+ "-101": "\u8D26\u53F7\u672A\u767B\u5F55",
868
+ "-102": "\u8D26\u53F7\u88AB\u5C01\u505C",
869
+ "-103": "\u79EF\u5206\u4E0D\u8DB3",
870
+ "-104": "\u786C\u5E01\u4E0D\u8DB3",
871
+ "-105": "\u9A8C\u8BC1\u7801\u9519\u8BEF",
872
+ "-106": "\u8D26\u53F7\u975E\u6B63\u5F0F\u4F1A\u5458\u6216\u5728\u9002\u5E94\u671F",
873
+ "-107": "\u5E94\u7528\u4E0D\u5B58\u5728\u6216\u8005\u88AB\u5C01\u7981",
874
+ "-108": "\u672A\u7ED1\u5B9A\u624B\u673A",
875
+ "-110": "\u672A\u7ED1\u5B9A\u624B\u673A",
876
+ "-111": "csrf \u6821\u9A8C\u5931\u8D25",
877
+ "-112": "\u7CFB\u7EDF\u5347\u7EA7\u4E2D",
878
+ "-113": "\u8D26\u53F7\u5C1A\u672A\u5B9E\u540D\u8BA4\u8BC1",
879
+ "-114": "\u8BF7\u5148\u7ED1\u5B9A\u624B\u673A",
880
+ "-115": "\u8BF7\u5148\u5B8C\u6210\u5B9E\u540D\u8BA4\u8BC1",
881
+ "-304": "\u6728\u6709\u6539\u52A8",
882
+ "-307": "\u649E\u8F66\u8DF3\u8F6C",
883
+ "-352": "\u98CE\u63A7\u6821\u9A8C\u5931\u8D25 (UA \u6216 wbi \u53C2\u6570\u4E0D\u5408\u6CD5)",
884
+ "-400": "\u8BF7\u6C42\u9519\u8BEF",
885
+ "-401": "\u672A\u8BA4\u8BC1 (\u6216\u975E\u6CD5\u8BF7\u6C42)",
886
+ "-403": "\u8BBF\u95EE\u6743\u9650\u4E0D\u8DB3",
887
+ "-404": "\u5565\u90FD\u6728\u6709",
888
+ "-405": "\u4E0D\u652F\u6301\u8BE5\u65B9\u6CD5",
889
+ "-409": "\u51B2\u7A81",
890
+ "-412": "\u8BF7\u6C42\u88AB\u62E6\u622A (\u5BA2\u6237\u7AEF ip \u88AB\u670D\u52A1\u7AEF\u98CE\u63A7)",
891
+ "-500": "\u670D\u52A1\u5668\u9519\u8BEF",
892
+ "-503": "\u8FC7\u8F7D\u4FDD\u62A4,\u670D\u52A1\u6682\u4E0D\u53EF\u7528",
893
+ "-504": "\u670D\u52A1\u8C03\u7528\u8D85\u65F6",
894
+ "-509": "\u8D85\u51FA\u9650\u5236",
895
+ "-616": "\u4E0A\u4F20\u6587\u4EF6\u4E0D\u5B58\u5728",
896
+ "-617": "\u4E0A\u4F20\u6587\u4EF6\u592A\u5927",
897
+ "-625": "\u767B\u5F55\u5931\u8D25\u6B21\u6570\u592A\u591A",
898
+ "-626": "\u7528\u6237\u4E0D\u5B58\u5728",
899
+ "-628": "\u5BC6\u7801\u592A\u5F31",
900
+ "-629": "\u7528\u6237\u540D\u6216\u5BC6\u7801\u9519\u8BEF",
901
+ "-632": "\u64CD\u4F5C\u5BF9\u8C61\u6570\u91CF\u9650\u5236",
902
+ "-643": "\u88AB\u9501\u5B9A",
903
+ "-650": "\u7528\u6237\u7B49\u7EA7\u592A\u4F4E",
904
+ "-652": "\u91CD\u590D\u7684\u7528\u6237",
905
+ "-658": "Token \u8FC7\u671F",
906
+ "-662": "\u5BC6\u7801\u65F6\u95F4\u6233\u8FC7\u671F",
907
+ "-688": "\u5730\u7406\u533A\u57DF\u9650\u5236",
908
+ "-689": "\u7248\u6743\u9650\u5236",
909
+ "-701": "\u6263\u8282\u64CD\u5931\u8D25",
910
+ "-799": "\u8BF7\u6C42\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5",
911
+ "-8888": "\u5BF9\u4E0D\u8D77\uFF0C\u670D\u52A1\u5668\u5F00\u5C0F\u5DEE\u4E86~ (\u0CA5\uFE4F\u0CA5)"
912
+ };
697
913
 
698
914
  // src/platform/douyin/sign/a_bogus.ts
699
915
  var SM3 = class {
@@ -1085,70 +1301,339 @@ var douyinSign = class {
1085
1301
  }
1086
1302
  };
1087
1303
 
1088
- // src/platform/douyin/API.ts
1089
- var fp = douyinSign.VerifyFpManager();
1090
- var DouyinAPI = class {
1091
- \u89C6\u9891\u6216\u56FE\u96C6(data2) {
1092
- return `https://www.douyin.com/aweme/v1/web/aweme/detail/?device_platform=webapp&aid=6383&channel=channel_pc_web&aweme_id=${data2.aweme_id}&update_version_code=170400&pc_client_type=1&version_code=190500&version_name=19.5.0&cookie_enabled=true&screen_width=2328&screen_height=1310&browser_language=zh-CN&browser_platform=Win32&browser_name=Chrome&browser_version=125.0.0.0&browser_online=true&engine_name=Blink&engine_version=125.0.0.0&os_name=Windows&os_version=10&cpu_core_num=16&device_memory=8&platform=PC&downlink=10&effective_type=4g&round_trip_time=150&webid=7351848354471872041&msToken=${douyinSign.Mstoken(
1093
- 116
1094
- )}&verifyFp=${fp}&fp=${fp}`;
1095
- }
1096
- \u8BC4\u8BBA(data2) {
1097
- return `https://www.douyin.com/aweme/v1/web/comment/list/?device_platform=webapp&aid=6383&channel=channel_pc_web&aweme_id=${data2.aweme_id}&cursor=${data2.cursor ?? 0}&count=${data2.number ?? 50}&item_type=0&insert_ids=&whale_cut_token=&cut_version=1&rcFT=&pc_client_type=1&version_code=170400&version_name=17.4.0&cookie_enabled=true&screen_width=1552&screen_height=970&browser_language=zh-CN&browser_platform=Win32&browser_name=Chrome&browser_version=125.0.0.0&browser_online=true&engine_name=Blink&engine_version=125.0.0.0&os_name=Windows&os_version=10&cpu_core_num=16&device_memory=8&platform=PC&downlink=10&effective_type=4g&msToken=${douyinSign.Mstoken(
1098
- 116
1099
- )}&verifyFp=${fp}&fp=${fp}`;
1100
- }
1101
- \u4E8C\u7EA7\u8BC4\u8BBA(data2) {
1102
- return `https://www.douyin.com/aweme/v1/web/comment/list/reply/?device_platform=webapp&aid=6383&channel=channel_pc_web&item_id=${data2.aweme_id}&comment_id=${data2.comment_id}&cut_version=1&cursor=${data2.cursor}&count=${data2.number}&item_type=0&update_version_code=170400&pc_client_type=1&pc_libra_divert=Windows&support_h265=1&support_dash=1&version_code=170400&version_name=17.4.0&cookie_enabled=true&screen_width=1552&screen_height=970&browser_language=zh-CN&browser_platform=Win32&browser_name=Edge&browser_version=132.0.0.0&browser_online=true&engine_name=Blink&engine_version=132.0.0.0&os_name=Windows&os_version=10&cpu_core_num=16&device_memory=8&platform=PC&downlink=10&effective_type=4g&round_trip_time=50&webid=7386217876267796006&verifyFp=${fp}&fp=${fp}`;
1103
- }
1104
- \u52A8\u56FE(data2) {
1105
- return `https://www.iesdouyin.com/web/api/v2/aweme/slidesinfo/?reflow_source=reflow_page&web_id=7326472315356857893&device_id=7326472315356857893&aweme_ids=[${data2.aweme_id}]&request_source=200&msToken=${douyinSign.Mstoken(
1106
- 116
1107
- )}&verifyFp=${fp}&fp=${fp}`;
1108
- }
1109
- \u8868\u60C5() {
1110
- return "https://www.douyin.com/aweme/v1/web/emoji/list";
1111
- }
1112
- \u7528\u6237\u4E3B\u9875\u89C6\u9891(data2) {
1113
- return `https://www.douyin.com/aweme/v1/web/aweme/post/?device_platform=webapp&aid=6383&channel=channel_pc_web&sec_user_id=${data2.sec_uid}&max_cursor=0&locate_query=false&show_live_replay_strategy=1&need_time_list=1&time_list_query=0&whale_cut_token=&cut_version=1&count=18&publish_video_strategy_type=2&pc_client_type=1&version_code=170400&version_name=17.4.0&cookie_enabled=true&screen_width=1552&screen_height=970&browser_language=zh-CN&browser_platform=Win32&browser_name=Chrome&browser_version=125.0.0.0&browser_online=true&engine_name=Blink&engine_version=125.0.0.0&os_name=Windows&os_version=10&cpu_core_num=16&device_memory=8&platform=PC&downlink=10&effective_type=4g&round_trip_time=50&webid=7338423850134226495&msToken=${douyinSign.Mstoken(
1114
- 116
1115
- )}&verifyFp=${fp}&fp=${fp}`;
1116
- }
1117
- \u7528\u6237\u4E3B\u9875\u4FE1\u606F(data2) {
1118
- return `https://www.douyin.com/aweme/v1/web/user/profile/other/?device_platform=webapp&aid=6383&channel=channel_pc_web&publish_video_strategy_type=2&source=channel_pc_web&sec_user_id=${data2.sec_uid}&personal_center_strategy=1&pc_client_type=1&version_code=170400&version_name=17.4.0&cookie_enabled=true&screen_width=1552&screen_height=970&browser_language=zh-CN&browser_platform=Win32&browser_name=Chrome&browser_version=125.0.0.0&browser_online=true&engine_name=Blink&engine_version=125.0.0.0&os_name=Windows&os_version=10&cpu_core_num=16&device_memory=8&platform=PC&downlink=10&effective_type=4g&round_trip_time=0&webid=7327957959955580467&msToken=${douyinSign.Mstoken(
1119
- 116
1120
- )}&verifyFp=${fp}&fp=${fp}`;
1121
- }
1122
- \u70ED\u70B9\u8BCD(data2) {
1123
- return `https://www.douyin.com/aweme/v1/web/api/suggest_words/?device_platform=webapp&aid=6383&channel=channel_pc_web&query=${data2.query}&business_id=30088&from_group_id=7129543174929812767&pc_client_type=1&version_code=170400&version_name=17.4.0&cookie_enabled=true&screen_width=1552&screen_height=970&browser_language=zh - CN&browser_platform=Win32&browser_name=Chrome&browser_version=125.0.0.0&browser_online=true&engine_name=Blink&engine_version=125.0.0.0&os_name=Windows&os_version=10&cpu_core_num=16&device_memory=8&platform=PC&downlink=10&effective_type=4g&round_trip_time=50&webid=7327957959955580467&msToken=${douyinSign.Mstoken(
1124
- 116
1125
- )}&verifyFp=${fp}&fp=${fp}`;
1126
- }
1127
- \u641C\u7D22(data2) {
1128
- return `https://www.douyin.com/aweme/v1/web/general/search/single/?device_platform=webapp&aid=6383&channel=channel_pc_web&search_channel=aweme_general&sort_type=0&publish_time=0&keyword=${data2.query}&search_source=normal_search&query_correct_type=1&is_filter_search=0&from_group_id=&offset=0&count=15&pc_client_type=1&version_code=190600&version_name=19.6.0&cookie_enabled=true&screen_width=1552&screen_height=970&browser_language=zh-CN&browser_platform=Win32&browser_name=Chrome&browser_version=125.0.0.0&browser_online=true&engine_name=Blink&engine_version=125.0.0.0&os_name=Windows&os_version=10&cpu_core_num=16&device_memory=8&platform=PC&downlink=10&effective_type=4g&round_trip_time=50&webid=7338423850134226495&msToken=${douyinSign.Mstoken(
1129
- 116
1130
- )}&verifyFp=${fp}&fp=${fp}&search_id=${data2.search_id ?? ""}&count=${data2.number ?? 10}`;
1131
- }
1132
- \u4E92\u52A8\u8868\u60C5() {
1133
- return `https://www.douyin.com/aweme/v1/web/im/strategy/config?device_platform=webapp&aid=1128&channel=channel_pc_web&publish_video_strategy_type=2&app_id=1128&scenes=[%22interactive_resources%22]&pc_client_type=1&version_code=170400&version_name=17.4.0&cookie_enabled=true&screen_width=2328&screen_height=1310&browser_language=zh-CN&browser_platform=Win32&browser_name=Chrome&browser_version=126.0.0.0&browser_online=true&engine_name=Blink&engine_version=126.0.0.0&os_name=Windows&os_version=10&cpu_core_num=16&device_memory=8&platform=PC&downlink=1.5&effective_type=4g&round_trip_time=350&webid=7347329698282833447&msToken=${douyinSign.Mstoken(
1134
- 116
1135
- )}&verifyFp=${fp}&fp=${fp}`;
1136
- }
1137
- \u80CC\u666F\u97F3\u4E50(data2) {
1138
- return `https://www.douyin.com/aweme/v1/web/music/detail/?device_platform=webapp&aid=6383&channel=channel_pc_web&music_id=${data2.music_id}&scene=1&pc_client_type=1&version_code=170400&version_name=17.4.0&cookie_enabled=true&screen_width=2328&screen_height=1310&browser_language=zh-CN&browser_platform=Win32&browser_name=Chrome&browser_version=126.0.0.0&browser_online=true&engine_name=Blink&engine_version=126.0.0.0&os_name=Windows&os_version=10&cpu_core_num=16&device_memory=8&platform=PC&downlink=1.5&effective_type=4g&round_trip_time=350&webid=7347329698282833447&msToken=${douyinSign.Mstoken(
1139
- 116
1140
- )}&verifyFp=${fp}&fp=${fp}`;
1141
- }
1142
- \u76F4\u64AD\u95F4\u4FE1\u606F(data2) {
1143
- return `https://live.douyin.com/webcast/room/web/enter/?aid=6383&app_name=douyin_web&live_id=1&device_platform=web&language=zh-CN&enter_from=web_share_link&cookie_enabled=true&screen_width=2048&screen_height=1152&browser_language=zh-CN&browser_platform=Win32&browser_name=Chrome&browser_version=125.0.0.0&web_rid=${data2.web_rid}&room_id_str=${data2.room_id}&enter_source=&is_need_double_stream=false&insert_task_id=&live_reason=&msToken=${douyinSign.Mstoken(
1144
- 116
1145
- )}&verifyFp=${fp}&fp=${fp}`;
1146
- }
1147
- \u7533\u8BF7\u4E8C\u7EF4\u7801(data2) {
1148
- return `https://sso.douyin.com/get_qrcode/?verifyFp=${data2.verify_fp}&fp=${data2.verify_fp}`;
1149
- }
1304
+ // src/platform/douyin/API.ts
1305
+ var fp = douyinSign.VerifyFpManager();
1306
+ var DouyinAPI = class {
1307
+ \u89C6\u9891\u6216\u56FE\u96C6(data2) {
1308
+ return `https://www.douyin.com/aweme/v1/web/aweme/detail/?device_platform=webapp&aid=6383&channel=channel_pc_web&aweme_id=${data2.aweme_id}&update_version_code=170400&pc_client_type=1&version_code=190500&version_name=19.5.0&cookie_enabled=true&screen_width=2328&screen_height=1310&browser_language=zh-CN&browser_platform=Win32&browser_name=Chrome&browser_version=125.0.0.0&browser_online=true&engine_name=Blink&engine_version=125.0.0.0&os_name=Windows&os_version=10&cpu_core_num=16&device_memory=8&platform=PC&downlink=10&effective_type=4g&round_trip_time=150&webid=7351848354471872041&msToken=${douyinSign.Mstoken(
1309
+ 116
1310
+ )}&verifyFp=${fp}&fp=${fp}`;
1311
+ }
1312
+ \u8BC4\u8BBA(data2) {
1313
+ return `https://www.douyin.com/aweme/v1/web/comment/list/?device_platform=webapp&aid=6383&channel=channel_pc_web&aweme_id=${data2.aweme_id}&cursor=${data2.cursor ?? 0}&count=${data2.number ?? 50}&item_type=0&insert_ids=&whale_cut_token=&cut_version=1&rcFT=&pc_client_type=1&version_code=170400&version_name=17.4.0&cookie_enabled=true&screen_width=1552&screen_height=970&browser_language=zh-CN&browser_platform=Win32&browser_name=Chrome&browser_version=125.0.0.0&browser_online=true&engine_name=Blink&engine_version=125.0.0.0&os_name=Windows&os_version=10&cpu_core_num=16&device_memory=8&platform=PC&downlink=10&effective_type=4g&msToken=${douyinSign.Mstoken(
1314
+ 116
1315
+ )}&verifyFp=${fp}&fp=${fp}`;
1316
+ }
1317
+ \u4E8C\u7EA7\u8BC4\u8BBA(data2) {
1318
+ return `https://www.douyin.com/aweme/v1/web/comment/list/reply/?device_platform=webapp&aid=6383&channel=channel_pc_web&item_id=${data2.aweme_id}&comment_id=${data2.comment_id}&cut_version=1&cursor=${data2.cursor}&count=${data2.number}&item_type=0&update_version_code=170400&pc_client_type=1&pc_libra_divert=Windows&support_h265=1&support_dash=1&version_code=170400&version_name=17.4.0&cookie_enabled=true&screen_width=1552&screen_height=970&browser_language=zh-CN&browser_platform=Win32&browser_name=Edge&browser_version=132.0.0.0&browser_online=true&engine_name=Blink&engine_version=132.0.0.0&os_name=Windows&os_version=10&cpu_core_num=16&device_memory=8&platform=PC&downlink=10&effective_type=4g&round_trip_time=50&webid=7386217876267796006&verifyFp=${fp}&fp=${fp}`;
1319
+ }
1320
+ \u52A8\u56FE(data2) {
1321
+ return `https://www.iesdouyin.com/web/api/v2/aweme/slidesinfo/?reflow_source=reflow_page&web_id=7326472315356857893&device_id=7326472315356857893&aweme_ids=[${data2.aweme_id}]&request_source=200&msToken=${douyinSign.Mstoken(
1322
+ 116
1323
+ )}&verifyFp=${fp}&fp=${fp}`;
1324
+ }
1325
+ \u8868\u60C5() {
1326
+ return "https://www.douyin.com/aweme/v1/web/emoji/list";
1327
+ }
1328
+ \u7528\u6237\u4E3B\u9875\u89C6\u9891(data2) {
1329
+ return `https://www.douyin.com/aweme/v1/web/aweme/post/?device_platform=webapp&aid=6383&channel=channel_pc_web&sec_user_id=${data2.sec_uid}&max_cursor=0&locate_query=false&show_live_replay_strategy=1&need_time_list=1&time_list_query=0&whale_cut_token=&cut_version=1&count=18&publish_video_strategy_type=2&pc_client_type=1&version_code=170400&version_name=17.4.0&cookie_enabled=true&screen_width=1552&screen_height=970&browser_language=zh-CN&browser_platform=Win32&browser_name=Chrome&browser_version=125.0.0.0&browser_online=true&engine_name=Blink&engine_version=125.0.0.0&os_name=Windows&os_version=10&cpu_core_num=16&device_memory=8&platform=PC&downlink=10&effective_type=4g&round_trip_time=50&webid=7338423850134226495&msToken=${douyinSign.Mstoken(
1330
+ 116
1331
+ )}&verifyFp=${fp}&fp=${fp}`;
1332
+ }
1333
+ \u7528\u6237\u4E3B\u9875\u4FE1\u606F(data2) {
1334
+ return `https://www.douyin.com/aweme/v1/web/user/profile/other/?device_platform=webapp&aid=6383&channel=channel_pc_web&publish_video_strategy_type=2&source=channel_pc_web&sec_user_id=${data2.sec_uid}&personal_center_strategy=1&pc_client_type=1&version_code=170400&version_name=17.4.0&cookie_enabled=true&screen_width=1552&screen_height=970&browser_language=zh-CN&browser_platform=Win32&browser_name=Chrome&browser_version=125.0.0.0&browser_online=true&engine_name=Blink&engine_version=125.0.0.0&os_name=Windows&os_version=10&cpu_core_num=16&device_memory=8&platform=PC&downlink=10&effective_type=4g&round_trip_time=0&webid=7327957959955580467&msToken=${douyinSign.Mstoken(
1335
+ 116
1336
+ )}&verifyFp=${fp}&fp=${fp}`;
1337
+ }
1338
+ \u70ED\u70B9\u8BCD(data2) {
1339
+ return `https://www.douyin.com/aweme/v1/web/api/suggest_words/?device_platform=webapp&aid=6383&channel=channel_pc_web&query=${data2.query}&business_id=30088&from_group_id=7129543174929812767&pc_client_type=1&version_code=170400&version_name=17.4.0&cookie_enabled=true&screen_width=1552&screen_height=970&browser_language=zh - CN&browser_platform=Win32&browser_name=Chrome&browser_version=125.0.0.0&browser_online=true&engine_name=Blink&engine_version=125.0.0.0&os_name=Windows&os_version=10&cpu_core_num=16&device_memory=8&platform=PC&downlink=10&effective_type=4g&round_trip_time=50&webid=7327957959955580467&msToken=${douyinSign.Mstoken(
1340
+ 116
1341
+ )}&verifyFp=${fp}&fp=${fp}`;
1342
+ }
1343
+ \u641C\u7D22(data2) {
1344
+ return `https://www.douyin.com/aweme/v1/web/general/search/single/?device_platform=webapp&aid=6383&channel=channel_pc_web&search_channel=aweme_general&sort_type=0&publish_time=0&keyword=${data2.query}&search_source=normal_search&query_correct_type=1&is_filter_search=0&from_group_id=&offset=0&count=15&pc_client_type=1&version_code=190600&version_name=19.6.0&cookie_enabled=true&screen_width=1552&screen_height=970&browser_language=zh-CN&browser_platform=Win32&browser_name=Chrome&browser_version=125.0.0.0&browser_online=true&engine_name=Blink&engine_version=125.0.0.0&os_name=Windows&os_version=10&cpu_core_num=16&device_memory=8&platform=PC&downlink=10&effective_type=4g&round_trip_time=50&webid=7338423850134226495&msToken=${douyinSign.Mstoken(
1345
+ 116
1346
+ )}&verifyFp=${fp}&fp=${fp}&search_id=${data2.search_id ?? ""}&count=${data2.number ?? 10}`;
1347
+ }
1348
+ \u4E92\u52A8\u8868\u60C5() {
1349
+ return `https://www.douyin.com/aweme/v1/web/im/strategy/config?device_platform=webapp&aid=1128&channel=channel_pc_web&publish_video_strategy_type=2&app_id=1128&scenes=[%22interactive_resources%22]&pc_client_type=1&version_code=170400&version_name=17.4.0&cookie_enabled=true&screen_width=2328&screen_height=1310&browser_language=zh-CN&browser_platform=Win32&browser_name=Chrome&browser_version=126.0.0.0&browser_online=true&engine_name=Blink&engine_version=126.0.0.0&os_name=Windows&os_version=10&cpu_core_num=16&device_memory=8&platform=PC&downlink=1.5&effective_type=4g&round_trip_time=350&webid=7347329698282833447&msToken=${douyinSign.Mstoken(
1350
+ 116
1351
+ )}&verifyFp=${fp}&fp=${fp}`;
1352
+ }
1353
+ \u80CC\u666F\u97F3\u4E50(data2) {
1354
+ return `https://www.douyin.com/aweme/v1/web/music/detail/?device_platform=webapp&aid=6383&channel=channel_pc_web&music_id=${data2.music_id}&scene=1&pc_client_type=1&version_code=170400&version_name=17.4.0&cookie_enabled=true&screen_width=2328&screen_height=1310&browser_language=zh-CN&browser_platform=Win32&browser_name=Chrome&browser_version=126.0.0.0&browser_online=true&engine_name=Blink&engine_version=126.0.0.0&os_name=Windows&os_version=10&cpu_core_num=16&device_memory=8&platform=PC&downlink=1.5&effective_type=4g&round_trip_time=350&webid=7347329698282833447&msToken=${douyinSign.Mstoken(
1355
+ 116
1356
+ )}&verifyFp=${fp}&fp=${fp}`;
1357
+ }
1358
+ \u76F4\u64AD\u95F4\u4FE1\u606F(data2) {
1359
+ return `https://live.douyin.com/webcast/room/web/enter/?aid=6383&app_name=douyin_web&live_id=1&device_platform=web&language=zh-CN&enter_from=web_share_link&cookie_enabled=true&screen_width=2048&screen_height=1152&browser_language=zh-CN&browser_platform=Win32&browser_name=Chrome&browser_version=125.0.0.0&web_rid=${data2.web_rid}&room_id_str=${data2.room_id}&enter_source=&is_need_double_stream=false&insert_task_id=&live_reason=&msToken=${douyinSign.Mstoken(
1360
+ 116
1361
+ )}&verifyFp=${fp}&fp=${fp}`;
1362
+ }
1363
+ \u7533\u8BF7\u4E8C\u7EF4\u7801(data2) {
1364
+ return `https://sso.douyin.com/get_qrcode/?verifyFp=${data2.verify_fp}&fp=${data2.verify_fp}`;
1365
+ }
1366
+ };
1367
+ var douyinAPI = new DouyinAPI();
1368
+ var douyinApiUrls = new DouyinAPI();
1369
+
1370
+ // src/platform/douyin/DouyinApi.ts
1371
+ var douyin = {
1372
+ /**
1373
+ * 聚合解析 (视频/图集/合辑)
1374
+ * @param options 请求参数,包含 aweme_id 和可选的 typeMode
1375
+ * @param cookie 有效的用户 Cookie
1376
+ * @returns 接口返回的原始数据
1377
+ */
1378
+ async getWorkInfo(options, cookie) {
1379
+ const { typeMode, ...restOptions } = options;
1380
+ const data2 = await DouyinData({ ...restOptions, methodType: "\u805A\u5408\u89E3\u6790" }, cookie);
1381
+ return data2;
1382
+ },
1383
+ /**
1384
+ * 获取视频作品数据
1385
+ * @param options 请求参数,包含 aweme_id 和可选的 typeMode
1386
+ * @param cookie 有效的用户 Cookie
1387
+ * @returns 接口返回的原始数据
1388
+ */
1389
+ async getVideoWorkInfo(options, cookie) {
1390
+ const { typeMode, ...restOptions } = options;
1391
+ const data2 = await DouyinData({ ...restOptions, methodType: "\u89C6\u9891\u4F5C\u54C1\u6570\u636E" }, cookie);
1392
+ return data2;
1393
+ },
1394
+ /**
1395
+ * 获取图集作品数据
1396
+ * @param options 请求参数,包含 aweme_id 和可选的 typeMode
1397
+ * @param cookie 有效的用户 Cookie
1398
+ * @returns 接口返回的原始数据
1399
+ */
1400
+ async getImageAlbumWorkInfo(options, cookie) {
1401
+ const { typeMode, ...restOptions } = options;
1402
+ const data2 = await DouyinData({ ...restOptions, methodType: "\u56FE\u96C6\u4F5C\u54C1\u6570\u636E" }, cookie);
1403
+ return data2;
1404
+ },
1405
+ /**
1406
+ * 获取合辑作品数据
1407
+ * @param options 请求参数,包含 aweme_id 和可选的 typeMode
1408
+ * @param cookie 有效的用户 Cookie
1409
+ * @returns 接口返回的原始数据
1410
+ */
1411
+ async getSlidesWorkInfo(options, cookie) {
1412
+ const { typeMode, ...restOptions } = options;
1413
+ const data2 = await DouyinData({ ...restOptions, methodType: "\u5408\u8F91\u4F5C\u54C1\u6570\u636E" }, cookie);
1414
+ return data2;
1415
+ },
1416
+ /**
1417
+ * 获取评论数据
1418
+ * @param options 请求参数,包含 aweme_id, 可选的 number, cursor 和 typeMode
1419
+ * @param cookie 有效的用户 Cookie
1420
+ * @returns 接口返回的原始数据
1421
+ */
1422
+ async getComments(options, cookie) {
1423
+ const { typeMode, ...restOptions } = options;
1424
+ const data2 = await DouyinData({ ...restOptions, methodType: "\u8BC4\u8BBA\u6570\u636E" }, cookie);
1425
+ return data2;
1426
+ },
1427
+ /**
1428
+ * 获取指定评论回复数据
1429
+ * @param options 请求参数,包含 aweme_id, comment_id, 可选的 number, cursor 和 typeMode
1430
+ * @param cookie 有效的用户 Cookie
1431
+ * @returns 接口返回的原始数据
1432
+ */
1433
+ async getCommentReplies(options, cookie) {
1434
+ const { typeMode, ...restOptions } = options;
1435
+ const data2 = await DouyinData({ ...restOptions, methodType: "\u6307\u5B9A\u8BC4\u8BBA\u56DE\u590D\u6570\u636E" }, cookie);
1436
+ return data2;
1437
+ },
1438
+ /**
1439
+ * 获取用户主页数据
1440
+ * @param options 请求参数,包含 sec_uid 和可选的 typeMode
1441
+ * @param cookie 有效的用户 Cookie
1442
+ * @returns 接口返回的原始数据
1443
+ */
1444
+ async getUserProfile(options, cookie) {
1445
+ const { typeMode, ...restOptions } = options;
1446
+ const data2 = await DouyinData({ ...restOptions, methodType: "\u7528\u6237\u4E3B\u9875\u6570\u636E" }, cookie);
1447
+ return data2;
1448
+ },
1449
+ /**
1450
+ * 获取 Emoji 数据
1451
+ * @param options 可选的请求参数 (主要用于 typeMode)
1452
+ * @param cookie 可选的用户 Cookie
1453
+ * @returns 接口返回的原始数据
1454
+ */
1455
+ async getEmojiList(options, cookie) {
1456
+ const { typeMode, ...restOptions } = options;
1457
+ const data2 = await DouyinData({ ...restOptions, methodType: "Emoji\u6570\u636E" }, cookie);
1458
+ return data2;
1459
+ },
1460
+ /**
1461
+ * 获取动态表情数据
1462
+ * @param options 可选的请求参数 (主要用于 typeMode)
1463
+ * @param cookie 有效的用户 Cookie
1464
+ * @returns 接口返回的原始数据
1465
+ */
1466
+ async getEmojiProList(options, cookie) {
1467
+ const { typeMode, ...restOptions } = options;
1468
+ const data2 = await DouyinData({ ...restOptions, methodType: "\u52A8\u6001\u8868\u60C5\u6570\u636E" }, cookie);
1469
+ return data2;
1470
+ },
1471
+ /**
1472
+ * 获取用户主页视频列表数据
1473
+ * @param options 请求参数,包含 sec_uid, 可选的 number, max_cursor 和 typeMode
1474
+ * @param cookie 有效的用户 Cookie
1475
+ * @returns 接口返回的原始数据
1476
+ */
1477
+ async getUserVideos(options, cookie) {
1478
+ const { typeMode, ...restOptions } = options;
1479
+ const data2 = await DouyinData({ ...restOptions, methodType: "\u7528\u6237\u4E3B\u9875\u89C6\u9891\u5217\u8868\u6570\u636E" }, cookie);
1480
+ return data2;
1481
+ },
1482
+ /**
1483
+ * 获取音乐数据
1484
+ * @param options 请求参数,包含 music_id 和可选的 typeMode
1485
+ * @param cookie 有效的用户 Cookie
1486
+ * @returns 接口返回的原始数据
1487
+ */
1488
+ async getMusicInfo(options, cookie) {
1489
+ const { typeMode, ...restOptions } = options;
1490
+ const data2 = await DouyinData({ ...restOptions, methodType: "\u97F3\u4E50\u6570\u636E" }, cookie);
1491
+ return data2;
1492
+ },
1493
+ /**
1494
+ * 获取热点词数据
1495
+ * @param options 请求参数,包含 query, 可选的 number 和 typeMode
1496
+ * @param cookie 有效的用户 Cookie
1497
+ * @returns 接口返回的原始数据
1498
+ */
1499
+ async getSuggestWords(options, cookie) {
1500
+ const { typeMode, ...restOptions } = options;
1501
+ const data2 = await DouyinData({ ...restOptions, methodType: "\u70ED\u70B9\u8BCD\u6570\u636E" }, cookie);
1502
+ return data2;
1503
+ },
1504
+ /**
1505
+ * 获取搜索数据
1506
+ * @param options 请求参数,包含 query, 可选的 number, search_id, cursor 和 typeMode
1507
+ * @param cookie 有效的用户 Cookie
1508
+ * @returns 接口返回的原始数据
1509
+ */
1510
+ async search(options, cookie) {
1511
+ const { typeMode, ...restOptions } = options;
1512
+ const data2 = await DouyinData({ ...restOptions, methodType: "\u641C\u7D22\u6570\u636E" }, cookie);
1513
+ return data2;
1514
+ },
1515
+ /**
1516
+ * 获取直播间信息
1517
+ * @param options 请求参数,包含 sec_uid 和可选的 typeMode
1518
+ * @param cookie 有效的用户 Cookie
1519
+ * @returns 接口返回的原始数据
1520
+ */
1521
+ async getLiveRoomInfo(options, cookie) {
1522
+ const { typeMode, ...restOptions } = options;
1523
+ const data2 = await DouyinData({ ...restOptions, methodType: "\u76F4\u64AD\u95F4\u4FE1\u606F\u6570\u636E" }, cookie);
1524
+ return data2;
1525
+ },
1526
+ /**
1527
+ * 申请二维码数据
1528
+ * @param options 请求参数,包含 verify_fp 和可选的 typeMode
1529
+ * @param cookie 有效的用户 Cookie
1530
+ * @returns 接口返回的原始数据 (any)
1531
+ */
1532
+ async getLoginQrcode(options, cookie) {
1533
+ const { typeMode, ...restOptions } = options;
1534
+ const data2 = await DouyinData({ ...restOptions, methodType: "\u7533\u8BF7\u4E8C\u7EF4\u7801\u6570\u636E" }, cookie);
1535
+ return data2;
1536
+ }
1537
+ };
1538
+ var registerDouyinRoutes = (cookie) => {
1539
+ const router = express__default.default.Router();
1540
+ router.get("/fetch_one_work", async (req, res) => {
1541
+ const data2 = await DouyinData({
1542
+ methodType: "\u805A\u5408\u89E3\u6790",
1543
+ aweme_id: req.query.aweme_id
1544
+ }, req.headers.cookie || cookie);
1545
+ res.json(data2);
1546
+ });
1547
+ router.get("/fetch_work_comments", async (req, res) => {
1548
+ const data2 = await DouyinData({
1549
+ methodType: "\u8BC4\u8BBA\u6570\u636E",
1550
+ aweme_id: req.query.aweme_id,
1551
+ number: parseInt(req.query.number ?? "50"),
1552
+ cursor: parseInt(req.query.cursor ?? "0")
1553
+ }, req.headers.cookie || cookie);
1554
+ res.json(data2);
1555
+ });
1556
+ router.get("/fetch_video_comment_replies", async (req, res) => {
1557
+ const data2 = await DouyinData({
1558
+ methodType: "\u6307\u5B9A\u8BC4\u8BBA\u56DE\u590D\u6570\u636E",
1559
+ aweme_id: req.query.aweme_id,
1560
+ comment_id: req.query.comment_id
1561
+ }, req.headers.cookie || cookie);
1562
+ res.json(data2);
1563
+ });
1564
+ router.get("/fetch_user_info", async (req, res) => {
1565
+ const data2 = await DouyinData({
1566
+ methodType: "\u7528\u6237\u4E3B\u9875\u6570\u636E",
1567
+ sec_uid: req.query.sec_uid
1568
+ }, req.headers.cookie || cookie);
1569
+ res.json(data2);
1570
+ });
1571
+ router.get("/fetch_user_post_videos", async (req, res) => {
1572
+ const data2 = await DouyinData({
1573
+ methodType: "\u7528\u6237\u4E3B\u9875\u89C6\u9891\u5217\u8868\u6570\u636E",
1574
+ sec_uid: req.query.sec_uid
1575
+ }, req.headers.cookie || cookie);
1576
+ res.json(data2);
1577
+ });
1578
+ router.get("/fetch_suggest_words", async (req, res) => {
1579
+ const data2 = await DouyinData({
1580
+ methodType: "\u70ED\u70B9\u8BCD\u6570\u636E",
1581
+ query: req.query.query
1582
+ }, req.headers.cookie || cookie);
1583
+ res.json(data2);
1584
+ });
1585
+ router.get("/fetch_search_info", async (req, res) => {
1586
+ const data2 = await DouyinData({
1587
+ methodType: "\u641C\u7D22\u6570\u636E",
1588
+ query: req.query.query,
1589
+ number: parseInt(req.query.number ?? "10"),
1590
+ search_id: req.query.search_id
1591
+ }, req.headers.cookie || cookie);
1592
+ res.json(data2);
1593
+ });
1594
+ router.get("/fetch_emoji_list", async (req, res) => {
1595
+ const data2 = await DouyinData({
1596
+ methodType: "Emoji\u6570\u636E"
1597
+ }, req.headers.cookie || cookie);
1598
+ res.json(data2);
1599
+ });
1600
+ router.get("/fetch_emoji_pro_list", async (req, res) => {
1601
+ const data2 = await DouyinData({
1602
+ methodType: "\u52A8\u6001\u8868\u60C5\u6570\u636E"
1603
+ }, req.headers.cookie || cookie);
1604
+ res.json(data2);
1605
+ });
1606
+ router.get("/fetch_music_work", async (req, res) => {
1607
+ const data2 = await DouyinData({
1608
+ methodType: "\u97F3\u4E50\u6570\u636E",
1609
+ music_id: req.query.music_id
1610
+ }, req.headers.cookie || cookie);
1611
+ res.json(data2);
1612
+ });
1613
+ router.get("/fetch_user_mix_videos", async (req, res) => {
1614
+ const data2 = await DouyinData({
1615
+ methodType: "\u5408\u8F91\u4F5C\u54C1\u6570\u636E",
1616
+ aweme_id: req.query.aweme_id
1617
+ }, req.headers.cookie || cookie);
1618
+ res.json(data2);
1619
+ });
1620
+ router.get("/fetch_user_live_videos", async (req, res) => {
1621
+ const data2 = await DouyinData({
1622
+ methodType: "\u76F4\u64AD\u95F4\u4FE1\u606F\u6570\u636E",
1623
+ sec_uid: req.query.sec_uid
1624
+ }, req.headers.cookie || cookie);
1625
+ res.json(data2);
1626
+ });
1627
+ return router;
1628
+ };
1629
+
1630
+ // src/platform/douyin/index.ts
1631
+ var douyinUtils = {
1632
+ sign: douyinSign,
1633
+ douyinApiUrls,
1634
+ getDouyinData,
1635
+ api: douyin
1150
1636
  };
1151
- var douyinAPI = new DouyinAPI();
1152
1637
 
1153
1638
  // src/platform/douyin/getdata.ts
1154
1639
  var defheaders2 = {
@@ -1269,6 +1754,10 @@ var DouyinData = async (data2, cookie) => {
1269
1754
  },
1270
1755
  ...data2
1271
1756
  });
1757
+ if (response.data.length === 0) {
1758
+ logger.warn("\u83B7\u53D6\u641C\u7D22\u6570\u636E\u5931\u8D25\uFF01\u8BF7\u6C42\u6210\u529F\u4F46\u63A5\u53E3\u8FD4\u56DE\u5185\u5BB9\u4E3A\u7A7A\n\u4F60\u7684\u6296\u97F3ck\u53EF\u80FD\u5DF2\u7ECF\u5931\u6548\uFF01\n\u8BF7\u6C42\u7C7B\u578B\uFF1A" + data2.methodType);
1759
+ return false;
1760
+ }
1272
1761
  if (!response.data) {
1273
1762
  response.data = [];
1274
1763
  }
@@ -1343,6 +1832,9 @@ var DouyinData = async (data2, cookie) => {
1343
1832
  });
1344
1833
  return LoginQrcodeStatusData;
1345
1834
  }
1835
+ default:
1836
+ logger.warn(`\u672A\u77E5\u7684B\u7AD9\u6570\u636E\u63A5\u53E3\uFF1A\u300C${logger.red(data2.methodType)}\u300D`);
1837
+ return null;
1346
1838
  }
1347
1839
  };
1348
1840
  async function fetchPaginatedData(apiUrlGenerator, params, maxPageSize, headers2) {
@@ -1378,102 +1870,14 @@ async function fetchPaginatedData(apiUrlGenerator, params, maxPageSize, headers2
1378
1870
  async function GlobalGetData2(options) {
1379
1871
  const ResponseData = await new Networks(options).getData();
1380
1872
  if (ResponseData === "" || !ResponseData) {
1381
- logger.warn("\u83B7\u53D6\u54CD\u5E94\u6570\u636E\u5931\u8D25\uFF01\u63A5\u53E3\u8FD4\u56DE\u5185\u5BB9\u4E3A\u7A7A\n\u4F60\u7684\u6296\u97F3ck\u53EF\u80FD\u5DF2\u7ECF\u5931\u6548\uFF01\n\u8BF7\u6C42\u7C7B\u578B\uFF1A" + options.methodType + "\n\u8BF7\u6C42URL\uFF1A" + options.url);
1873
+ logger.warn(`\u83B7\u53D6\u54CD\u5E94\u6570\u636E\u5931\u8D25\uFF01\u63A5\u53E3\u8FD4\u56DE\u5185\u5BB9\u4E3A\u7A7A
1874
+ \u4F60\u7684\u6296\u97F3ck\u53EF\u80FD\u5DF2\u7ECF\u5931\u6548\uFF01
1875
+ \u8BF7\u6C42\u7C7B\u578B\uFF1A\u300C${options.methodType}\u300D
1876
+ \u8BF7\u6C42URL\uFF1A options.url`);
1382
1877
  return false;
1383
1878
  }
1384
1879
  return ResponseData;
1385
1880
  }
1386
- var registerDouyinRoutes = (cookie) => {
1387
- const router = express__default.default.Router();
1388
- router.get("/fetch_one_work", async (req, res) => {
1389
- const data2 = await DouyinData({
1390
- methodType: "\u805A\u5408\u89E3\u6790",
1391
- aweme_id: req.query.aweme_id
1392
- }, req.headers.cookie || cookie);
1393
- res.json(data2);
1394
- });
1395
- router.get("/fetch_work_comments", async (req, res) => {
1396
- const data2 = await DouyinData({
1397
- methodType: "\u8BC4\u8BBA\u6570\u636E",
1398
- aweme_id: req.query.aweme_id,
1399
- number: parseInt(req.query.number ?? "50"),
1400
- cursor: parseInt(req.query.cursor ?? "0")
1401
- }, req.headers.cookie || cookie);
1402
- res.json(data2);
1403
- });
1404
- router.get("/fetch_video_comment_replies", async (req, res) => {
1405
- const data2 = await DouyinData({
1406
- methodType: "\u6307\u5B9A\u8BC4\u8BBA\u56DE\u590D\u6570\u636E",
1407
- aweme_id: req.query.aweme_id,
1408
- comment_id: req.query.comment_id
1409
- }, req.headers.cookie || cookie);
1410
- res.json(data2);
1411
- });
1412
- router.get("/fetch_user_info", async (req, res) => {
1413
- const data2 = await DouyinData({
1414
- methodType: "\u7528\u6237\u4E3B\u9875\u6570\u636E",
1415
- sec_uid: req.query.sec_uid
1416
- }, req.headers.cookie || cookie);
1417
- res.json(data2);
1418
- });
1419
- router.get("/fetch_user_post_videos", async (req, res) => {
1420
- const data2 = await DouyinData({
1421
- methodType: "\u7528\u6237\u4E3B\u9875\u89C6\u9891\u5217\u8868\u6570\u636E",
1422
- sec_uid: req.query.sec_uid
1423
- }, req.headers.cookie || cookie);
1424
- res.json(data2);
1425
- });
1426
- router.get("/fetch_suggest_words", async (req, res) => {
1427
- const data2 = await DouyinData({
1428
- methodType: "\u70ED\u70B9\u8BCD\u6570\u636E",
1429
- query: req.query.query
1430
- }, req.headers.cookie || cookie);
1431
- res.json(data2);
1432
- });
1433
- router.get("/fetch_search_info", async (req, res) => {
1434
- const data2 = await DouyinData({
1435
- methodType: "\u641C\u7D22\u6570\u636E",
1436
- query: req.query.query,
1437
- number: parseInt(req.query.number ?? "10"),
1438
- search_id: req.query.search_id
1439
- }, req.headers.cookie || cookie);
1440
- res.json(data2);
1441
- });
1442
- router.get("/fetch_emoji_list", async (req, res) => {
1443
- const data2 = await DouyinData({
1444
- methodType: "Emoji\u6570\u636E"
1445
- }, req.headers.cookie || cookie);
1446
- res.json(data2);
1447
- });
1448
- router.get("/fetch_emoji_pro_list", async (req, res) => {
1449
- const data2 = await DouyinData({
1450
- methodType: "\u52A8\u6001\u8868\u60C5\u6570\u636E"
1451
- }, req.headers.cookie || cookie);
1452
- res.json(data2);
1453
- });
1454
- router.get("/fetch_music_work", async (req, res) => {
1455
- const data2 = await DouyinData({
1456
- methodType: "\u97F3\u4E50\u6570\u636E",
1457
- music_id: req.query.music_id
1458
- }, req.headers.cookie || cookie);
1459
- res.json(data2);
1460
- });
1461
- router.get("/fetch_user_mix_videos", async (req, res) => {
1462
- const data2 = await DouyinData({
1463
- methodType: "\u5408\u8F91\u4F5C\u54C1\u6570\u636E",
1464
- aweme_id: req.query.aweme_id
1465
- }, req.headers.cookie || cookie);
1466
- res.json(data2);
1467
- });
1468
- router.get("/fetch_user_live_videos", async (req, res) => {
1469
- const data2 = await DouyinData({
1470
- methodType: "\u76F4\u64AD\u95F4\u4FE1\u606F\u6570\u636E",
1471
- sec_uid: req.query.sec_uid
1472
- }, req.headers.cookie || cookie);
1473
- res.json(data2);
1474
- });
1475
- return router;
1476
- };
1477
1881
 
1478
1882
  // src/platform/kuaishou/API.ts
1479
1883
  var API = class {
@@ -1523,6 +1927,73 @@ var API = class {
1523
1927
  }
1524
1928
  };
1525
1929
  var KuaishouAPI = new API();
1930
+ var kuaishouAPI = new API();
1931
+ var kuaishouApiUrls = new API();
1932
+ var registerKuaishouRoutes = (cookie) => {
1933
+ const router = express__default.default.Router();
1934
+ router.get("/fetch_one_work", async (req, res) => {
1935
+ const data2 = await KuaishouData({
1936
+ methodType: "\u5355\u4E2A\u89C6\u9891\u4F5C\u54C1\u6570\u636E",
1937
+ photoId: req.query.photoId
1938
+ }, req.headers.cookie || cookie);
1939
+ res.json(data2);
1940
+ });
1941
+ router.get("/fetch_work_comments", async (req, res) => {
1942
+ const data2 = await KuaishouData({
1943
+ methodType: "\u8BC4\u8BBA\u6570\u636E",
1944
+ photoId: req.query.photoId
1945
+ }, req.headers.cookie || cookie);
1946
+ res.json(data2);
1947
+ });
1948
+ router.get("/fetch_emoji_list", async (req, res) => {
1949
+ const data2 = await KuaishouData({
1950
+ methodType: "Emoji\u6570\u636E"
1951
+ }, req.headers.cookie || cookie);
1952
+ res.json(data2);
1953
+ });
1954
+ return router;
1955
+ };
1956
+
1957
+ // src/platform/kuaishou/KuaishouApi.ts
1958
+ var kuaishou = {
1959
+ /**
1960
+ * 获取单个视频作品数据
1961
+ * @param options 请求参数,包含 photoId 和可选的 typeMode
1962
+ * @param cookie 可选的用户 Cookie
1963
+ * @returns 接口返回的原始数据
1964
+ */
1965
+ async getWorkInfo(options, cookie) {
1966
+ const data2 = await KuaishouData({ ...options, methodType: "\u5355\u4E2A\u89C6\u9891\u4F5C\u54C1\u6570\u636E" }, cookie);
1967
+ return data2;
1968
+ },
1969
+ /**
1970
+ * 获取评论数据
1971
+ * @param options 请求参数,包含 photoId 和可选的 typeMode
1972
+ * @param cookie 可选的用户 Cookie
1973
+ * @returns 接口返回的原始数据
1974
+ */
1975
+ async getComments(options, cookie) {
1976
+ const data2 = await KuaishouData({ ...options, methodType: "\u8BC4\u8BBA\u6570\u636E" }, cookie);
1977
+ return data2;
1978
+ },
1979
+ /**
1980
+ * 获取 Emoji 数据
1981
+ * @param options 可选的请求参数 (主要用于 typeMode)
1982
+ * @param cookie 可选的用户 Cookie
1983
+ * @returns 接口返回的原始数据
1984
+ */
1985
+ async getEmojiList(options, cookie) {
1986
+ const data2 = await KuaishouData({ ...options, methodType: "Emoji\u6570\u636E" }, cookie);
1987
+ return data2;
1988
+ }
1989
+ };
1990
+
1991
+ // src/platform/kuaishou/index.ts
1992
+ var kuaishouUtils = {
1993
+ kuaishouApiUrls,
1994
+ getKuaishouData,
1995
+ api: kuaishou
1996
+ };
1526
1997
 
1527
1998
  // src/platform/kuaishou/getdata.ts
1528
1999
  var defheaders3 = {
@@ -1541,7 +2012,7 @@ var KuaishouData = async (data2, cookie) => {
1541
2012
  switch (data2.methodType) {
1542
2013
  case "\u5355\u4E2A\u89C6\u9891\u4F5C\u54C1\u6570\u636E": {
1543
2014
  KusiahouValidateData(data2, ["photoId"]);
1544
- const body = KuaishouAPI.\u5355\u4E2A\u4F5C\u54C1\u4FE1\u606F({ photoId: data2.photoId });
2015
+ const body = kuaishouAPI.\u5355\u4E2A\u4F5C\u54C1\u4FE1\u606F({ photoId: data2.photoId });
1545
2016
  const VideoData = await GlobalGetData3({
1546
2017
  url: body.url,
1547
2018
  method: "POST",
@@ -1553,7 +2024,7 @@ var KuaishouData = async (data2, cookie) => {
1553
2024
  }
1554
2025
  case "\u8BC4\u8BBA\u6570\u636E": {
1555
2026
  KusiahouValidateData(data2, ["photoId"]);
1556
- const body = KuaishouAPI.\u4F5C\u54C1\u8BC4\u8BBA\u4FE1\u606F({ photoId: data2.photoId });
2027
+ const body = kuaishouAPI.\u4F5C\u54C1\u8BC4\u8BBA\u4FE1\u606F({ photoId: data2.photoId });
1557
2028
  const VideoData = await GlobalGetData3({
1558
2029
  url: body.url,
1559
2030
  method: "POST",
@@ -1564,7 +2035,7 @@ var KuaishouData = async (data2, cookie) => {
1564
2035
  return VideoData;
1565
2036
  }
1566
2037
  case "Emoji\u6570\u636E": {
1567
- const body = KuaishouAPI.\u8868\u60C5();
2038
+ const body = kuaishouAPI.\u8868\u60C5();
1568
2039
  const EmojiData = await GlobalGetData3({
1569
2040
  url: body.url,
1570
2041
  method: "POST",
@@ -1574,6 +2045,9 @@ var KuaishouData = async (data2, cookie) => {
1574
2045
  });
1575
2046
  return EmojiData;
1576
2047
  }
2048
+ default:
2049
+ logger.warn(`\u672A\u77E5\u7684\u5FEB\u624B\u6570\u636E\u63A5\u53E3\uFF1A\u300C${logger.red(data2.methodType)}\u300D`);
2050
+ return null;
1577
2051
  }
1578
2052
  };
1579
2053
  async function GlobalGetData3(options) {
@@ -1588,30 +2062,6 @@ async function GlobalGetData3(options) {
1588
2062
  }
1589
2063
  return ResponseData;
1590
2064
  }
1591
- var registerKuaishouRoutes = (cookie) => {
1592
- const router = express__default.default.Router();
1593
- router.get("/fetch_one_work", async (req, res) => {
1594
- const data2 = await KuaishouData({
1595
- methodType: "\u5355\u4E2A\u89C6\u9891\u4F5C\u54C1\u6570\u636E",
1596
- photoId: req.query.photoId
1597
- }, req.headers.cookie || cookie);
1598
- res.json(data2);
1599
- });
1600
- router.get("/fetch_work_comments", async (req, res) => {
1601
- const data2 = await KuaishouData({
1602
- methodType: "\u8BC4\u8BBA\u6570\u636E",
1603
- photoId: req.query.photoId
1604
- }, req.headers.cookie || cookie);
1605
- res.json(data2);
1606
- });
1607
- router.get("/fetch_emoji_list", async (req, res) => {
1608
- const data2 = await KuaishouData({
1609
- methodType: "Emoji\u6570\u636E"
1610
- }, req.headers.cookie || cookie);
1611
- res.json(data2);
1612
- });
1613
- return router;
1614
- };
1615
2065
 
1616
2066
  // src/model/DataFetchers.ts
1617
2067
  async function getDouyinData(type, arg2, arg3) {
@@ -1736,17 +2186,21 @@ var CustomLogger = class {
1736
2186
  }
1737
2187
  };
1738
2188
  var logger = new CustomLogger("default");
1739
- var logMiddleware = (req, res, next) => {
1740
- const startTime = Date.now();
1741
- const url = req.url;
1742
- const method = req.method;
1743
- const clientIP = req.headers["x-forwarded-for"] || req.socket.remoteAddress;
1744
- res.on("finish", () => {
1745
- const responseTime = Date.now() - startTime;
1746
- const statusCode = res.statusCode;
1747
- logger.info(`[${method}] ${url} (Status: ${statusCode}, Time: ${responseTime}ms, Client: ${clientIP})`);
1748
- });
1749
- next();
2189
+ var logMiddleware = (pathsToLog) => {
2190
+ return (req, res, next) => {
2191
+ if (!pathsToLog || pathsToLog.some((path) => req.url.startsWith(path))) {
2192
+ const startTime = Date.now();
2193
+ const url = req.url;
2194
+ const method = req.method;
2195
+ const clientIP = req.headers["x-forwarded-for"] || req.socket.remoteAddress;
2196
+ res.on("finish", () => {
2197
+ const responseTime = Date.now() - startTime;
2198
+ const statusCode = res.statusCode;
2199
+ logger.info(`[${method}] ${url} (Status: ${statusCode}, Time: ${responseTime}ms, Client: ${clientIP})`);
2200
+ });
2201
+ }
2202
+ next();
2203
+ };
1750
2204
  };
1751
2205
  var Networks = class {
1752
2206
  url;
@@ -1908,7 +2362,7 @@ var KusiahouValidateData = (data2, fields, atLeastOne = false) => {
1908
2362
  throw new Error(`\u83B7\u53D6\u300C${data2.methodType}\u300D${logger.red("\u7F3A\u5C11\u53C2\u6570")}: ${missingStr}`);
1909
2363
  }
1910
2364
  };
1911
- var amagi = class {
2365
+ var amagiClient = class {
1912
2366
  douyin;
1913
2367
  bilibili;
1914
2368
  kuaishou;
@@ -1935,17 +2389,17 @@ var amagi = class {
1935
2389
  app.get("/docs", (_req, res) => {
1936
2390
  res.redirect(301, "https://amagi.apifox.cn");
1937
2391
  });
1938
- app.use("/api/kuaishou", registerKuaishouRoutes(this.kuaishou));
2392
+ app.use(logMiddleware(["/api/douyin", "/api/bilibili", "/api/kuaishou"]));
1939
2393
  app.use("/api/douyin", registerDouyinRoutes(this.douyin));
1940
2394
  app.use("/api/bilibili", registerBilibiliRoutes(this.bilibili));
1941
- app.use(logMiddleware);
2395
+ app.use("/api/kuaishou", registerKuaishouRoutes(this.kuaishou));
1942
2396
  app.listen(port, "::", () => {
1943
2397
  logger.mark(`Amagi server listening on ${logger.green(`http://localhost:${port}`)} ${logger.yellow("API docs: https://amagi.apifox.cn ")}`);
1944
2398
  });
1945
2399
  return app;
1946
2400
  }
1947
2401
  /**
1948
- * 获取抖音数据
2402
+ * 快捷获取抖音数据
1949
2403
  * @param type - 请求数据类型
1950
2404
  * @param options - 请求参数,是一个对象
1951
2405
  * @returns 返回接口的原始数据
@@ -1970,7 +2424,7 @@ var amagi = class {
1970
2424
  return await getDouyinData(methodType, this.douyin, fullOptions);
1971
2425
  };
1972
2426
  /**
1973
- * 获取B站数据
2427
+ * 快捷获取B站数据
1974
2428
  * @param type - 请求数据类型
1975
2429
  * @param options - 请求参数,是一个对象
1976
2430
  * @returns 返回接口的原始数据
@@ -1994,7 +2448,7 @@ var amagi = class {
1994
2448
  return await getBilibiliData(methodType, this.bilibili, fullOptions);
1995
2449
  };
1996
2450
  /**
1997
- * 获取快手数据
2451
+ * 快捷获取快手数据
1998
2452
  * @param type - 请求数据类型
1999
2453
  * @param options - 请求参数,是一个对象
2000
2454
  * @returns 返回接口的原始数据
@@ -2020,33 +2474,44 @@ var amagi = class {
2020
2474
  };
2021
2475
 
2022
2476
  // src/index.ts
2023
- var index_default = amagi;
2477
+ var index_default = amagiClient;
2478
+ function amagi(options) {
2479
+ return new amagiClient(options);
2480
+ }
2024
2481
  function Amagi(options) {
2025
- return new amagi(options);
2482
+ return new amagiClient(options);
2026
2483
  }
2027
2484
 
2028
2485
  exports.Amagi = Amagi;
2029
- exports.BilibiliData = BilibiliData;
2030
2486
  exports.BilibiliValidateData = BilibiliValidateData;
2031
- exports.DouyinData = DouyinData;
2032
2487
  exports.DouyinValidateData = DouyinValidateData;
2033
2488
  exports.KuaishouAPI = KuaishouAPI;
2034
- exports.KuaishouData = KuaishouData;
2035
2489
  exports.KusiahouValidateData = KusiahouValidateData;
2036
2490
  exports.Networks = Networks;
2037
2491
  exports.amagi = amagi;
2492
+ exports.amagiClient = amagiClient;
2038
2493
  exports.av2bv = av2bv;
2494
+ exports.bilibili = bilibili;
2039
2495
  exports.bilibiliAPI = bilibiliAPI;
2496
+ exports.bilibiliApiUrls = bilibiliApiUrls;
2497
+ exports.bilibiliUtils = bilibiliUtils;
2040
2498
  exports.bv2av = bv2av;
2041
2499
  exports.default = index_default;
2500
+ exports.douyin = douyin;
2042
2501
  exports.douyinAPI = douyinAPI;
2502
+ exports.douyinApiUrls = douyinApiUrls;
2043
2503
  exports.douyinSign = douyinSign;
2504
+ exports.douyinUtils = douyinUtils;
2044
2505
  exports.fetchBilibiliData = fetchBilibiliData;
2045
2506
  exports.fetchDouyinData = fetchDouyinData;
2046
2507
  exports.fetchKuaishouData = fetchKuaishouData;
2047
2508
  exports.getBilibiliData = getBilibiliData;
2048
2509
  exports.getDouyinData = getDouyinData;
2049
2510
  exports.getKuaishouData = getKuaishouData;
2511
+ exports.kuaishou = kuaishou;
2512
+ exports.kuaishouAPI = kuaishouAPI;
2513
+ exports.kuaishouApiUrls = kuaishouApiUrls;
2514
+ exports.kuaishouUtils = kuaishouUtils;
2050
2515
  exports.logMiddleware = logMiddleware;
2051
2516
  exports.logger = logger;
2052
2517
  exports.qtparam = qtparam;