@ikenxuan/amagi 5.5.1 → 5.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  import { Chalk } from 'chalk';
2
2
  import log4js from 'log4js';
3
3
  import path from 'path';
4
- import { fileURLToPath } from 'url';
4
+ import URL2, { fileURLToPath } from 'url';
5
5
  import fs from 'fs';
6
6
  import axios, { AxiosError } from 'axios';
7
7
  import crypto from 'crypto';
@@ -1316,6 +1316,184 @@ var a_bogus_default = (url, user_agent) => {
1316
1316
  let result_str = generate_random_str() + generate_rc4_bb_str(new URLSearchParams(new URL(url).search).toString(), cleanedUserAgent, "1536|747|1536|834|0|30|0|0|1536|834|1536|864|1525|747|24|24|Win32");
1317
1317
  return result_encrypt(result_str, "s4") + "=";
1318
1318
  };
1319
+ var XBogus = class {
1320
+ charMap;
1321
+ base64Charset;
1322
+ uaKey;
1323
+ defaultUa;
1324
+ params;
1325
+ xb;
1326
+ constructor() {
1327
+ this.charMap = new Array(128).fill(null);
1328
+ for (let i = 48; i <= 57; i++) {
1329
+ this.charMap[i] = i - 48;
1330
+ }
1331
+ for (let i = 65; i <= 70; i++) {
1332
+ this.charMap[i] = i - 55;
1333
+ }
1334
+ for (let i = 97; i <= 102; i++) {
1335
+ this.charMap[i] = i - 87;
1336
+ }
1337
+ this.base64Charset = "Dkdpgh4ZKsQB80/Mfvw36XI1R25-WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe=";
1338
+ this.uaKey = Buffer.from([0, 1, 12]);
1339
+ this.defaultUa = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0";
1340
+ }
1341
+ md5StrToArray(md5Str) {
1342
+ const result = [];
1343
+ if (md5Str.length > 32) {
1344
+ for (const char of md5Str) {
1345
+ result.push(char.charCodeAt(0));
1346
+ }
1347
+ return result;
1348
+ }
1349
+ let idx = 0;
1350
+ while (idx < md5Str.length) {
1351
+ const leftCharCode = md5Str.charCodeAt(idx);
1352
+ const rightCharCode = md5Str.charCodeAt(idx + 1);
1353
+ const left = this.charMap[leftCharCode];
1354
+ const right = this.charMap[rightCharCode];
1355
+ if (left === null || right === null) {
1356
+ throw new Error(`Invalid MD5 character: ${md5Str[idx]}${md5Str[idx + 1]}`);
1357
+ }
1358
+ result.push(left << 4 | right);
1359
+ idx += 2;
1360
+ }
1361
+ return result;
1362
+ }
1363
+ md5(input) {
1364
+ const dataArray = typeof input === "string" ? this.md5StrToArray(input) : input;
1365
+ const dataBuffer = Buffer.from(dataArray);
1366
+ return crypto.createHash("md5").update(dataBuffer).digest("hex");
1367
+ }
1368
+ md5Encrypt(urlPath) {
1369
+ const firstMd5 = this.md5(urlPath);
1370
+ const firstArray = this.md5StrToArray(firstMd5);
1371
+ const secondMd5 = this.md5(firstArray);
1372
+ return this.md5StrToArray(secondMd5);
1373
+ }
1374
+ encodingConversion(...params) {
1375
+ const byteList = [];
1376
+ for (const param of params) {
1377
+ if (typeof param === "number") {
1378
+ byteList.push(Math.floor(param));
1379
+ } else if (typeof param === "string") {
1380
+ for (const char of param) {
1381
+ byteList.push(char.charCodeAt(0));
1382
+ }
1383
+ }
1384
+ }
1385
+ return Buffer.from(byteList).toString("latin1");
1386
+ }
1387
+ encodingConversion2(a, b, c) {
1388
+ return String.fromCharCode(a) + String.fromCharCode(b) + c;
1389
+ }
1390
+ rc4Encrypt(key, data2) {
1391
+ const keyBuffer = typeof key === "string" ? Buffer.from(key, "latin1") : key;
1392
+ const dataBuffer = Buffer.from(data2, "latin1");
1393
+ const S = Array.from({ length: 256 }, (_, i2) => i2);
1394
+ let j = 0;
1395
+ for (let i2 = 0; i2 < 256; i2++) {
1396
+ j = (j + S[i2] + keyBuffer[i2 % keyBuffer.length]) % 256;
1397
+ [S[i2], S[j]] = [S[j], S[i2]];
1398
+ }
1399
+ const encryptedBuffer = Buffer.alloc(dataBuffer.length);
1400
+ let i = 0;
1401
+ j = 0;
1402
+ for (let k = 0; k < dataBuffer.length; k++) {
1403
+ i = (i + 1) % 256;
1404
+ j = (j + S[i]) % 256;
1405
+ [S[i], S[j]] = [S[j], S[i]];
1406
+ const t = (S[i] + S[j]) % 256;
1407
+ encryptedBuffer[k] = dataBuffer[k] ^ S[t];
1408
+ }
1409
+ return encryptedBuffer.toString("latin1");
1410
+ }
1411
+ calculation(a1, a2, a3) {
1412
+ const x1 = (a1 & 255) << 16;
1413
+ const x2 = (a2 & 255) << 8;
1414
+ const x3 = x1 | x2 | a3 & 255;
1415
+ const c1 = this.base64Charset[(x3 & 16760832) >> 18];
1416
+ const c2 = this.base64Charset[(x3 & 258048) >> 12];
1417
+ const c3 = this.base64Charset[(x3 & 4032) >> 6];
1418
+ const c4 = this.base64Charset[x3 & 63];
1419
+ return c1 + c2 + c3 + c4;
1420
+ }
1421
+ /**
1422
+ * 生成X-Bogus签名
1423
+ * @param url 完整的URL地址
1424
+ * @param ua 可选的User-Agent,不提供则使用默认值
1425
+ * @returns 包含完整URL、X-Bogus值和使用的User-Agent的元组
1426
+ */
1427
+ getXBogus(url, ua) {
1428
+ const parsedUrl = new URL2.URL(url);
1429
+ const urlPath = parsedUrl.pathname + parsedUrl.search;
1430
+ const currentUa = ua || this.defaultUa;
1431
+ const rc4EncryptedUa = this.rc4Encrypt(this.uaKey, currentUa);
1432
+ const base64Ua = Buffer.from(rc4EncryptedUa, "latin1").toString("base64");
1433
+ const md5Ua = this.md5(base64Ua);
1434
+ const array1 = this.md5StrToArray(md5Ua);
1435
+ const emptyStrMd5 = "d41d8cd98f00b204e9800998ecf8427e";
1436
+ const array2 = this.md5StrToArray(this.md5(this.md5StrToArray(emptyStrMd5)));
1437
+ const urlEncryptedArray = this.md5Encrypt(urlPath);
1438
+ const timestamp = Math.floor(Date.now() / 1e3);
1439
+ const ct = 536919696;
1440
+ const newArray = [
1441
+ 64,
1442
+ 1,
1443
+ 1,
1444
+ 12,
1445
+ urlEncryptedArray[14],
1446
+ urlEncryptedArray[15],
1447
+ array2[14],
1448
+ array2[15],
1449
+ array1[14],
1450
+ array1[15],
1451
+ timestamp >> 24 & 255,
1452
+ timestamp >> 16 & 255,
1453
+ timestamp >> 8 & 255,
1454
+ timestamp & 255,
1455
+ ct >> 24 & 255,
1456
+ ct >> 16 & 255,
1457
+ ct >> 8 & 255,
1458
+ ct & 255
1459
+ ];
1460
+ let xorResult = newArray[0];
1461
+ for (let i = 1; i < newArray.length; i++) {
1462
+ xorResult ^= newArray[i];
1463
+ }
1464
+ newArray.push(xorResult);
1465
+ const array3 = [];
1466
+ const array4 = [];
1467
+ let idx = 0;
1468
+ while (idx < newArray.length) {
1469
+ array3.push(newArray[idx]);
1470
+ if (idx + 1 < newArray.length) {
1471
+ array4.push(newArray[idx + 1]);
1472
+ }
1473
+ idx += 2;
1474
+ }
1475
+ const mergedArray = [...array3, ...array4];
1476
+ const firstConversion = this.encodingConversion(...mergedArray);
1477
+ const rc4Garbled = this.rc4Encrypt("\xFF", firstConversion);
1478
+ const garbledCode = this.encodingConversion2(2, 255, rc4Garbled);
1479
+ let xb = "";
1480
+ idx = 0;
1481
+ while (idx < garbledCode.length) {
1482
+ if (idx + 2 >= garbledCode.length) break;
1483
+ const a1 = garbledCode.charCodeAt(idx);
1484
+ const a2 = garbledCode.charCodeAt(idx + 1);
1485
+ const a3 = garbledCode.charCodeAt(idx + 2);
1486
+ xb += this.calculation(a1, a2, a3);
1487
+ idx += 3;
1488
+ }
1489
+ const fullUrl = url.includes("?") ? `${url}&X-Bogus=${xb}` : `${url}?X-Bogus=${xb}`;
1490
+ return {
1491
+ fullUrl,
1492
+ xbogus: xb,
1493
+ userAgent: currentUa
1494
+ };
1495
+ }
1496
+ };
1319
1497
 
1320
1498
  // src/platform/douyin/sign/index.ts
1321
1499
  var defaultUserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36";
@@ -1338,6 +1516,15 @@ var douyinSign = class {
1338
1516
  static AB(url, userAgent) {
1339
1517
  return a_bogus_default(url, userAgent || defaultUserAgent);
1340
1518
  }
1519
+ /**
1520
+ * X-Bogus 签名算法
1521
+ * @param url 需要签名的地址
1522
+ * @returns 对此地址签名后的URL查询参数
1523
+ */
1524
+ static XB(url, userAgent) {
1525
+ const xbogusResult = new XBogus().getXBogus(url, userAgent || defaultUserAgent);
1526
+ return xbogusResult.xbogus;
1527
+ }
1341
1528
  /** 生成一个唯一的验证字符串 */
1342
1529
  static VerifyFpManager() {
1343
1530
  const e = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split("");
@@ -1466,7 +1653,7 @@ var DouyinAPI = class {
1466
1653
  * @returns 完整的接口URL
1467
1654
  */
1468
1655
  \u4E8C\u7EA7\u8BC4\u8BBA(data2) {
1469
- const baseUrl = "https://www.douyin.com/aweme/v1/web/comment/list/reply/";
1656
+ const baseUrl = "https://www-hj.douyin.com/aweme/v1/web/comment/list/reply/";
1470
1657
  const params = {
1471
1658
  device_platform: "webapp",
1472
1659
  aid: "6383",
@@ -1490,10 +1677,10 @@ var DouyinAPI = class {
1490
1677
  browser_language: "zh-CN",
1491
1678
  browser_platform: "Win32",
1492
1679
  browser_name: "Edge",
1493
- browser_version: "132.0.0.0",
1680
+ browser_version: this.browserVersion,
1494
1681
  browser_online: "true",
1495
1682
  engine_name: "Blink",
1496
- engine_version: "132.0.0.0",
1683
+ engine_version: this.browserVersion,
1497
1684
  os_name: "Windows",
1498
1685
  os_version: "10",
1499
1686
  cpu_core_num: "16",
@@ -1502,7 +1689,7 @@ var DouyinAPI = class {
1502
1689
  downlink: "10",
1503
1690
  effective_type: "4g",
1504
1691
  round_trip_time: "50",
1505
- webid: "7386217876267796006",
1692
+ webid: "7487210762873685515",
1506
1693
  verifyFp: fp,
1507
1694
  fp
1508
1695
  };
@@ -1806,6 +1993,29 @@ var createDouyinApiUrls = (userAgent) => {
1806
1993
  var douyinApiUrls = new DouyinAPI();
1807
1994
 
1808
1995
  // src/platform/douyin/getdata.ts
1996
+ var getSignature = (url, signType = "a_bogus", userAgent) => {
1997
+ switch (signType) {
1998
+ case "x_bogus":
1999
+ return douyinSign.XB(url, userAgent);
2000
+ case "a_bogus":
2001
+ default:
2002
+ return douyinSign.AB(url, userAgent);
2003
+ }
2004
+ };
2005
+ var getSignParamName = (signType = "a_bogus") => {
2006
+ switch (signType) {
2007
+ case "x_bogus":
2008
+ return "X-Bogus";
2009
+ case "a_bogus":
2010
+ default:
2011
+ return "a_bogus";
2012
+ }
2013
+ };
2014
+ var buildSignedUrl = (url, signType = "a_bogus", userAgent) => {
2015
+ const signature = getSignature(url, signType, userAgent);
2016
+ const paramName = getSignParamName(signType);
2017
+ return `${url}&${paramName}=${signature}`;
2018
+ };
1809
2019
  var DouyinData = async (data2, cookie, requestConfig) => {
1810
2020
  var _a, _b, _c, _d, _e;
1811
2021
  const defHeaders = getDouyinDefaultConfig(cookie)["headers"];
@@ -1819,54 +2029,47 @@ var DouyinData = async (data2, cookie, requestConfig) => {
1819
2029
  }
1820
2030
  };
1821
2031
  const userAgent = (_a = baseRequestConfig.headers) == null ? void 0 : _a["User-Agent"];
1822
- const douyinApiUrls3 = createDouyinApiUrls(userAgent);
2032
+ const douyinApiUrls2 = createDouyinApiUrls(userAgent);
2033
+ const signType = data2.signType || "a_bogus";
1823
2034
  switch (data2.methodType) {
1824
2035
  case "\u6587\u5B57\u4F5C\u54C1\u6570\u636E":
1825
2036
  case "\u805A\u5408\u89E3\u6790":
1826
2037
  case "\u89C6\u9891\u4F5C\u54C1\u6570\u636E":
1827
2038
  case "\u56FE\u96C6\u4F5C\u54C1\u6570\u636E":
1828
2039
  case "\u5408\u8F91\u4F5C\u54C1\u6570\u636E": {
1829
- const url = douyinApiUrls3.\u89C6\u9891\u6216\u56FE\u96C6({ aweme_id: data2.aweme_id });
2040
+ const url = douyinApiUrls2.\u89C6\u9891\u6216\u56FE\u96C6({ aweme_id: data2.aweme_id });
1830
2041
  const VideoData = await GlobalGetData2(data2.methodType, {
1831
2042
  ...baseRequestConfig,
1832
- url: `${url}&a_bogus=${douyinSign.AB(url, userAgent)}`
2043
+ url: buildSignedUrl(url, signType, userAgent)
1833
2044
  });
1834
2045
  return VideoData;
1835
2046
  }
1836
2047
  case "\u8BC4\u8BBA\u6570\u636E": {
1837
- const urlGenerator = (params) => douyinApiUrls3.\u8BC4\u8BBA(params);
2048
+ const urlGenerator = (params) => douyinApiUrls2.\u8BC4\u8BBA(params);
1838
2049
  const response = await fetchPaginatedData(
1839
2050
  data2.methodType,
1840
2051
  urlGenerator,
1841
2052
  data2,
1842
2053
  50,
1843
- baseRequestConfig
2054
+ baseRequestConfig,
2055
+ signType
1844
2056
  );
1845
2057
  return response;
1846
2058
  }
1847
2059
  case "\u6307\u5B9A\u8BC4\u8BBA\u56DE\u590D\u6570\u636E": {
1848
- const urlGenerator = (params) => douyinApiUrls3.\u4E8C\u7EA7\u8BC4\u8BBA(params);
1849
- const customConfig = {
1850
- ...baseRequestConfig,
1851
- headers: {
1852
- ...baseRequestConfig.headers,
1853
- // 只有在外部配置没有referer时才设置内部的referer
1854
- ...(!(requestConfig == null ? void 0 : requestConfig.headers) || !("referer" in requestConfig.headers)) && {
1855
- referer: `https://www.douyin.com/note/${data2.aweme_id}`
1856
- }
1857
- }
1858
- };
2060
+ const urlGenerator = (params) => douyinApiUrls2.\u4E8C\u7EA7\u8BC4\u8BBA(params);
1859
2061
  const response = await fetchPaginatedData(
1860
2062
  data2.methodType,
1861
2063
  urlGenerator,
1862
2064
  data2,
1863
2065
  3,
1864
- customConfig
2066
+ baseRequestConfig,
2067
+ "x_bogus"
1865
2068
  );
1866
2069
  return response;
1867
2070
  }
1868
2071
  case "\u7528\u6237\u4E3B\u9875\u6570\u636E": {
1869
- const url = douyinApiUrls3.\u7528\u6237\u4E3B\u9875\u4FE1\u606F({ sec_uid: data2.sec_uid });
2072
+ const url = douyinApiUrls2.\u7528\u6237\u4E3B\u9875\u4FE1\u606F({ sec_uid: data2.sec_uid });
1870
2073
  const customConfig = {
1871
2074
  ...baseRequestConfig,
1872
2075
  headers: {
@@ -1879,12 +2082,12 @@ var DouyinData = async (data2, cookie, requestConfig) => {
1879
2082
  };
1880
2083
  const UserInfoData = await GlobalGetData2(data2.methodType, {
1881
2084
  ...customConfig,
1882
- url: `${url}&a_bogus=${douyinSign.AB(url, userAgent)}`
2085
+ url: buildSignedUrl(url, signType, userAgent)
1883
2086
  });
1884
2087
  return UserInfoData;
1885
2088
  }
1886
2089
  case "Emoji\u6570\u636E": {
1887
- const url = douyinApiUrls3.\u8868\u60C5();
2090
+ const url = douyinApiUrls2.\u8868\u60C5();
1888
2091
  const EmojiData = await GlobalGetData2(data2.methodType, {
1889
2092
  ...baseRequestConfig,
1890
2093
  url
@@ -1892,7 +2095,7 @@ var DouyinData = async (data2, cookie, requestConfig) => {
1892
2095
  return EmojiData;
1893
2096
  }
1894
2097
  case "\u7528\u6237\u4E3B\u9875\u89C6\u9891\u5217\u8868\u6570\u636E": {
1895
- const url = douyinApiUrls3.\u7528\u6237\u4E3B\u9875\u89C6\u9891({ sec_uid: data2.sec_uid });
2098
+ const url = douyinApiUrls2.\u7528\u6237\u4E3B\u9875\u89C6\u9891({ sec_uid: data2.sec_uid });
1896
2099
  const customConfig = {
1897
2100
  ...baseRequestConfig,
1898
2101
  headers: {
@@ -1904,12 +2107,12 @@ var DouyinData = async (data2, cookie, requestConfig) => {
1904
2107
  };
1905
2108
  const UserVideoListData = await GlobalGetData2(data2.methodType, {
1906
2109
  ...customConfig,
1907
- url: `${url}&a_bogus=${douyinSign.AB(url, userAgent)}`
2110
+ url: buildSignedUrl(url, signType, userAgent)
1908
2111
  });
1909
2112
  return UserVideoListData;
1910
2113
  }
1911
2114
  case "\u70ED\u70B9\u8BCD\u6570\u636E": {
1912
- const url = douyinApiUrls3.\u70ED\u70B9\u8BCD({ query: data2.query, number: data2.number ?? 10 });
2115
+ const url = douyinApiUrls2.\u70ED\u70B9\u8BCD({ query: data2.query, number: data2.number ?? 10 });
1913
2116
  const customConfig = {
1914
2117
  ...baseRequestConfig,
1915
2118
  headers: {
@@ -1921,7 +2124,7 @@ var DouyinData = async (data2, cookie, requestConfig) => {
1921
2124
  };
1922
2125
  const SuggestWordsData = await GlobalGetData2(data2.methodType, {
1923
2126
  ...customConfig,
1924
- url: `${url}&a_bogus=${douyinSign.AB(url, userAgent)}`
2127
+ url: buildSignedUrl(url, signType, userAgent)
1925
2128
  });
1926
2129
  return SuggestWordsData;
1927
2130
  }
@@ -1941,14 +2144,14 @@ var DouyinData = async (data2, cookie, requestConfig) => {
1941
2144
  };
1942
2145
  while (fetchedSearchList.length < Number(data2.number ?? 10)) {
1943
2146
  const requestCount = Math.min(Number(data2.number ?? 50) - fetchedSearchList.length, maxPageSize);
1944
- const url = douyinApiUrls3.\u641C\u7D22({
2147
+ const url = douyinApiUrls2.\u641C\u7D22({
1945
2148
  query: data2.query,
1946
2149
  number: requestCount,
1947
2150
  search_id: search_id === "" ? void 0 : search_id
1948
2151
  });
1949
2152
  const response = await GlobalGetData2(data2.methodType, {
1950
2153
  ...customConfig,
1951
- url: `${url}&a_bogus=${douyinSign.AB(url, userAgent)}`
2154
+ url: buildSignedUrl(url, signType, userAgent)
1952
2155
  });
1953
2156
  if (((_b = response.data) == null ? void 0 : _b.length) === 0) {
1954
2157
  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);
@@ -1968,24 +2171,24 @@ var DouyinData = async (data2, cookie, requestConfig) => {
1968
2171
  return finalResponse;
1969
2172
  }
1970
2173
  case "\u52A8\u6001\u8868\u60C5\u6570\u636E": {
1971
- const url = douyinApiUrls3.\u4E92\u52A8\u8868\u60C5();
2174
+ const url = douyinApiUrls2.\u4E92\u52A8\u8868\u60C5();
1972
2175
  const ExpressionPlusData = await GlobalGetData2(data2.methodType, {
1973
2176
  ...baseRequestConfig,
1974
- url: `${url}&a_bogus=${douyinSign.AB(url, userAgent)}`
2177
+ url: buildSignedUrl(url, signType, userAgent)
1975
2178
  });
1976
2179
  return ExpressionPlusData;
1977
2180
  }
1978
2181
  case "\u97F3\u4E50\u6570\u636E": {
1979
- const url = douyinApiUrls3.\u80CC\u666F\u97F3\u4E50({ music_id: data2.music_id });
2182
+ const url = douyinApiUrls2.\u80CC\u666F\u97F3\u4E50({ music_id: data2.music_id });
1980
2183
  const MusicData = await GlobalGetData2(data2.methodType, {
1981
2184
  ...baseRequestConfig,
1982
- url: `${url}&a_bogus=${douyinSign.AB(url, userAgent)}`
2185
+ url: buildSignedUrl(url, signType, userAgent)
1983
2186
  });
1984
2187
  return MusicData;
1985
2188
  }
1986
2189
  case "\u76F4\u64AD\u95F4\u4FE1\u606F\u6570\u636E": {
1987
- let url = douyinApiUrls3.\u7528\u6237\u4E3B\u9875\u4FE1\u606F({ sec_uid: data2.sec_uid });
1988
- const fetchUrl = `${url}&a_bogus=${douyinSign.AB(url, userAgent)}`;
2190
+ let url = douyinApiUrls2.\u7528\u6237\u4E3B\u9875\u4FE1\u606F({ sec_uid: data2.sec_uid });
2191
+ const fetchUrl = buildSignedUrl(url, signType, userAgent);
1989
2192
  const customConfig = {
1990
2193
  ...baseRequestConfig,
1991
2194
  headers: {
@@ -2022,7 +2225,7 @@ var DouyinData = async (data2, cookie, requestConfig) => {
2022
2225
  };
2023
2226
  }
2024
2227
  const room_data = JSON.parse(UserInfoData.user.room_data);
2025
- url = douyinApiUrls3.\u76F4\u64AD\u95F4\u4FE1\u606F({ room_id: UserInfoData.user.room_id_str, web_rid: room_data.owner.web_rid });
2228
+ url = douyinApiUrls2.\u76F4\u64AD\u95F4\u4FE1\u606F({ room_id: UserInfoData.user.room_id_str, web_rid: room_data.owner.web_rid });
2026
2229
  const liveCustomConfig = {
2027
2230
  ...baseRequestConfig,
2028
2231
  headers: {
@@ -2034,15 +2237,15 @@ var DouyinData = async (data2, cookie, requestConfig) => {
2034
2237
  };
2035
2238
  const LiveRoomData = await GlobalGetData2(data2.methodType, {
2036
2239
  ...liveCustomConfig,
2037
- url: `${url}&a_bogus=${douyinSign.AB(url, userAgent)}`
2240
+ url: buildSignedUrl(url, signType, userAgent)
2038
2241
  });
2039
2242
  return LiveRoomData;
2040
2243
  }
2041
2244
  case "\u7533\u8BF7\u4E8C\u7EF4\u7801\u6570\u636E": {
2042
- const url = douyinApiUrls3.\u7533\u8BF7\u4E8C\u7EF4\u7801({ verify_fp: data2.verify_fp });
2245
+ const url = douyinApiUrls2.\u7533\u8BF7\u4E8C\u7EF4\u7801({ verify_fp: data2.verify_fp });
2043
2246
  const LoginQrcodeStatusData = await GlobalGetData2(data2.methodType, {
2044
2247
  ...baseRequestConfig,
2045
- url: `${url}&a_bogus=${douyinSign.AB(url, userAgent)}`
2248
+ url: buildSignedUrl(url, signType, userAgent)
2046
2249
  });
2047
2250
  return LoginQrcodeStatusData;
2048
2251
  }
@@ -2052,7 +2255,7 @@ var DouyinData = async (data2, cookie, requestConfig) => {
2052
2255
  const endTime = data2.end_time ?? data2.duration;
2053
2256
  const totalDuration = endTime - startTime;
2054
2257
  if (totalDuration <= MAX_SEGMENT_DURATION) {
2055
- const url = douyinApiUrls3.\u5F39\u5E55({
2258
+ const url = douyinApiUrls2.\u5F39\u5E55({
2056
2259
  aweme_id: data2.aweme_id,
2057
2260
  start_time: startTime,
2058
2261
  end_time: endTime,
@@ -2060,7 +2263,7 @@ var DouyinData = async (data2, cookie, requestConfig) => {
2060
2263
  });
2061
2264
  const DanmakuData = await GlobalGetData2(data2.methodType, {
2062
2265
  ...baseRequestConfig,
2063
- url: `${url}&a_bogus=${douyinSign.AB(url, userAgent)}`
2266
+ url: buildSignedUrl(url, signType, userAgent)
2064
2267
  });
2065
2268
  return DanmakuData;
2066
2269
  }
@@ -2073,7 +2276,7 @@ var DouyinData = async (data2, cookie, requestConfig) => {
2073
2276
  }
2074
2277
  logger.debug(`\u5F39\u5E55\u6570\u636E\u9700\u8981\u5206${segments.length}\u6BB5\u83B7\u53D6\uFF0C\u603B\u65F6\u957F\uFF1A${totalDuration}ms`);
2075
2278
  const segmentPromises = segments.map(async (segment, index) => {
2076
- const url = douyinApiUrls3.\u5F39\u5E55({
2279
+ const url = douyinApiUrls2.\u5F39\u5E55({
2077
2280
  aweme_id: data2.aweme_id,
2078
2281
  start_time: segment.start,
2079
2282
  end_time: segment.end,
@@ -2082,7 +2285,7 @@ var DouyinData = async (data2, cookie, requestConfig) => {
2082
2285
  try {
2083
2286
  const segmentData = await GlobalGetData2(`${data2.methodType}-\u6BB5${index + 1}`, {
2084
2287
  ...baseRequestConfig,
2085
- url: `${url}&a_bogus=${douyinSign.AB(url, userAgent)}`
2288
+ url: buildSignedUrl(url, signType, userAgent)
2086
2289
  });
2087
2290
  logger.debug(`\u5F39\u5E55\u7B2C${index + 1}\u6BB5\u83B7\u53D6\u6210\u529F (${segment.start}ms-${segment.end}ms)`);
2088
2291
  return segmentData;
@@ -2130,7 +2333,7 @@ var DouyinData = async (data2, cookie, requestConfig) => {
2130
2333
  }
2131
2334
  }
2132
2335
  };
2133
- var fetchPaginatedData = async (type, apiUrlGenerator, params, maxPageSize, requestConfig) => {
2336
+ var fetchPaginatedData = async (type, apiUrlGenerator, params, maxPageSize, requestConfig, signType = "a_bogus") => {
2134
2337
  var _a;
2135
2338
  let cursor = params.cursor ?? 0;
2136
2339
  let fetchedData = [];
@@ -2145,7 +2348,7 @@ var fetchPaginatedData = async (type, apiUrlGenerator, params, maxPageSize, requ
2145
2348
  });
2146
2349
  const response = await GlobalGetData2(type, {
2147
2350
  ...requestConfig,
2148
- url: `${url}&a_bogus=${douyinSign.AB(url, userAgent)}`
2351
+ url: buildSignedUrl(url, signType, userAgent)
2149
2352
  });
2150
2353
  fetchedData.push(...response.comments || response.data || []);
2151
2354
  tmpresp = response;
@@ -2436,7 +2639,7 @@ var DouyinDanmakuParamsSchema = z.object({
2436
2639
  aweme_id: z.string({ error: "\u89C6\u9891ID\u5FC5\u987B\u662F\u5B57\u7B26\u4E32" }).min(1, { error: "\u89C6\u9891ID\u4E0D\u80FD\u4E3A\u7A7A" }),
2437
2640
  start_time: z.coerce.number({ error: "\u5F00\u59CB\u65F6\u95F4\u5FC5\u987B\u662F\u6570\u5B57" }).int({ error: "\u5F00\u59CB\u65F6\u95F4\u5FC5\u987B\u662F\u6574\u6570" }).min(0, { error: "\u5F00\u59CB\u65F6\u95F4\u4E0D\u80FD\u5C0F\u4E8E0" }).optional(),
2438
2641
  end_time: z.coerce.number({ error: "\u7ED3\u675F\u65F6\u95F4\u5FC5\u987B\u662F\u6570\u5B57" }).int({ error: "\u7ED3\u675F\u65F6\u95F4\u5FC5\u987B\u662F\u6574\u6570" }).min(0, { error: "\u7ED3\u675F\u65F6\u95F4\u4E0D\u80FD\u5C0F\u4E8E0" }).optional(),
2439
- duration: z.number({ error: "\u89C6\u9891\u65F6\u957F\u5FC5\u987B\u662F\u6570\u5B57" }).int({ error: "\u89C6\u9891\u65F6\u957F\u5FC5\u987B\u662F\u6574\u6570" }).min(0, { error: "\u89C6\u9891\u65F6\u957F\u4E0D\u80FD\u5C0F\u4E8E0" })
2642
+ duration: z.coerce.number({ error: "\u89C6\u9891\u65F6\u957F\u5FC5\u987B\u662F\u6570\u5B57" }).int({ error: "\u89C6\u9891\u65F6\u957F\u5FC5\u987B\u662F\u6574\u6570" }).min(0, { error: "\u89C6\u9891\u65F6\u957F\u4E0D\u80FD\u5C0F\u4E8E0" })
2440
2643
  }).refine(
2441
2644
  (data2) => {
2442
2645
  if (data2.end_time !== void 0) {