@ikenxuan/amagi 5.0.0 → 5.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/default/cjs/index.cjs +433 -76
- package/dist/default/esm/index.mjs +432 -75
- package/dist/default/index.d.ts +76 -4
- package/package.json +1 -1
|
@@ -27,7 +27,7 @@ var express__default = /*#__PURE__*/_interopDefault(express);
|
|
|
27
27
|
* GPL-3.0 Licensed
|
|
28
28
|
*/
|
|
29
29
|
|
|
30
|
-
// node_modules/.pnpm/tsup@8.5.0_@swc+core@1.
|
|
30
|
+
// node_modules/.pnpm/tsup@8.5.0_@swc+core@1.13.3_tsx@4.20.3_typescript@5.9.2/node_modules/tsup/assets/cjs_shims.js
|
|
31
31
|
var getImportMetaUrl = () => typeof document === "undefined" ? new URL(`file:${__filename}`).href : document.currentScript && document.currentScript.src || new URL("main.js", document.baseURI).href;
|
|
32
32
|
var importMetaUrl = /* @__PURE__ */ getImportMetaUrl();
|
|
33
33
|
var getPackageLogsPath = () => {
|
|
@@ -167,9 +167,16 @@ var logMiddleware = (pathsToLog) => {
|
|
|
167
167
|
next();
|
|
168
168
|
};
|
|
169
169
|
};
|
|
170
|
+
var cleanUserAgent = (userAgent) => {
|
|
171
|
+
return userAgent.replace(/\s+Edg\/[\d\.]+/g, "");
|
|
172
|
+
};
|
|
170
173
|
var fetchData = async (config) => {
|
|
171
174
|
try {
|
|
172
|
-
const
|
|
175
|
+
const cleanedConfig = { ...config };
|
|
176
|
+
if (cleanedConfig.headers && cleanedConfig.headers["User-Agent"]) {
|
|
177
|
+
cleanedConfig.headers["User-Agent"] = cleanUserAgent(cleanedConfig.headers["User-Agent"]);
|
|
178
|
+
}
|
|
179
|
+
const response = await axios__default.default(cleanedConfig);
|
|
173
180
|
if (response.status === 429) {
|
|
174
181
|
logger.error("HTTP \u54CD\u5E94\u72B6\u6001\u7801: 429");
|
|
175
182
|
throw new Error("ratelimit triggered, \u89E6\u53D1\u901F\u7387\u9650\u5236\uFF01");
|
|
@@ -185,7 +192,11 @@ var fetchData = async (config) => {
|
|
|
185
192
|
};
|
|
186
193
|
var fetchResponse = async (config) => {
|
|
187
194
|
try {
|
|
188
|
-
|
|
195
|
+
const cleanedConfig = { ...config };
|
|
196
|
+
if (cleanedConfig.headers && cleanedConfig.headers["User-Agent"]) {
|
|
197
|
+
cleanedConfig.headers["User-Agent"] = cleanUserAgent(cleanedConfig.headers["User-Agent"]);
|
|
198
|
+
}
|
|
199
|
+
return await axios__default.default(cleanedConfig);
|
|
189
200
|
} catch (error) {
|
|
190
201
|
if (error instanceof axios.AxiosError) {
|
|
191
202
|
throw error;
|
|
@@ -444,7 +455,8 @@ var generateSecChUa = (userAgent) => {
|
|
|
444
455
|
};
|
|
445
456
|
var getDouyinDefaultConfig = (cookie, requestConfig) => {
|
|
446
457
|
var _a;
|
|
447
|
-
|
|
458
|
+
let finalUserAgent = ((_a = void 0 ) == null ? void 0 : _a["User-Agent"]) || "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36";
|
|
459
|
+
finalUserAgent = finalUserAgent.replace(/\s+Edg\/[\d\.]+/g, "");
|
|
448
460
|
const defHeaders = {
|
|
449
461
|
Accept: "application/json, text/plain, */*",
|
|
450
462
|
"Accept-Encoding": "gzip, deflate, br, zstd",
|
|
@@ -1229,15 +1241,17 @@ function generate_random_str() {
|
|
|
1229
1241
|
random_str_list = random_str_list.concat(gener_random(Math.random() * 1e4, [1, 5]));
|
|
1230
1242
|
return String.fromCharCode.apply(null, random_str_list);
|
|
1231
1243
|
}
|
|
1244
|
+
var cleanUserAgentForSigning = (userAgent) => {
|
|
1245
|
+
return userAgent.replace(/\s+Edg\/[\d\.]+/g, "");
|
|
1246
|
+
};
|
|
1232
1247
|
var a_bogus_default = (url, user_agent) => {
|
|
1233
|
-
|
|
1248
|
+
const cleanedUserAgent = cleanUserAgentForSigning(user_agent);
|
|
1249
|
+
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");
|
|
1234
1250
|
return result_encrypt(result_str, "s4") + "=";
|
|
1235
1251
|
};
|
|
1236
1252
|
|
|
1237
1253
|
// src/platform/douyin/sign/index.ts
|
|
1238
|
-
var
|
|
1239
|
-
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
|
|
1240
|
-
};
|
|
1254
|
+
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";
|
|
1241
1255
|
var douyinSign = class {
|
|
1242
1256
|
/**
|
|
1243
1257
|
* 生成一个指定长度的随机字符串
|
|
@@ -1254,8 +1268,8 @@ var douyinSign = class {
|
|
|
1254
1268
|
* @param url 需要签名的地址
|
|
1255
1269
|
* @returns 对此地址签名后的URL查询参数
|
|
1256
1270
|
*/
|
|
1257
|
-
static AB(url) {
|
|
1258
|
-
return a_bogus_default(url,
|
|
1271
|
+
static AB(url, userAgent) {
|
|
1272
|
+
return a_bogus_default(url, userAgent || defaultUserAgent);
|
|
1259
1273
|
}
|
|
1260
1274
|
/** 生成一个唯一的验证字符串 */
|
|
1261
1275
|
static VerifyFpManager() {
|
|
@@ -1279,73 +1293,417 @@ var douyinSign = class {
|
|
|
1279
1293
|
};
|
|
1280
1294
|
|
|
1281
1295
|
// src/platform/douyin/API.ts
|
|
1296
|
+
var extractBrowserVersion = (userAgent) => {
|
|
1297
|
+
if (!userAgent) return "125.0.0.0";
|
|
1298
|
+
const chromeMatch = userAgent.match(/Chrome\/(\d+\.\d+\.\d+\.\d+)/);
|
|
1299
|
+
if (chromeMatch) {
|
|
1300
|
+
return chromeMatch[1];
|
|
1301
|
+
}
|
|
1302
|
+
const edgeMatch = userAgent.match(/Edg\/(\d+\.\d+\.\d+\.\d+)/);
|
|
1303
|
+
if (edgeMatch) {
|
|
1304
|
+
return edgeMatch[1];
|
|
1305
|
+
}
|
|
1306
|
+
return "125.0.0.0";
|
|
1307
|
+
};
|
|
1308
|
+
var buildQueryString = (params) => {
|
|
1309
|
+
return Object.entries(params).filter(([_, value]) => value !== void 0 && value !== null).map(([key, value]) => `${key}=${encodeURIComponent(value)}`).join("&");
|
|
1310
|
+
};
|
|
1282
1311
|
var fp = douyinSign.VerifyFpManager();
|
|
1283
1312
|
var DouyinAPI = class {
|
|
1313
|
+
browserVersion;
|
|
1314
|
+
/**
|
|
1315
|
+
* 构造函数
|
|
1316
|
+
* @param userAgent - 用户代理字符串,用于提取浏览器版本信息
|
|
1317
|
+
*/
|
|
1318
|
+
constructor(userAgent) {
|
|
1319
|
+
this.browserVersion = extractBrowserVersion(userAgent);
|
|
1320
|
+
}
|
|
1321
|
+
/**
|
|
1322
|
+
* 获取通用的基础参数
|
|
1323
|
+
* @returns 通用基础参数对象
|
|
1324
|
+
*/
|
|
1325
|
+
getBaseParams() {
|
|
1326
|
+
return {
|
|
1327
|
+
device_platform: "webapp",
|
|
1328
|
+
aid: "6383",
|
|
1329
|
+
channel: "channel_pc_web",
|
|
1330
|
+
pc_client_type: "1",
|
|
1331
|
+
cookie_enabled: "true",
|
|
1332
|
+
browser_language: "zh-CN",
|
|
1333
|
+
browser_platform: "Win32",
|
|
1334
|
+
browser_name: "Chrome",
|
|
1335
|
+
browser_version: this.browserVersion,
|
|
1336
|
+
browser_online: "true",
|
|
1337
|
+
engine_name: "Blink",
|
|
1338
|
+
engine_version: this.browserVersion,
|
|
1339
|
+
os_name: "Windows",
|
|
1340
|
+
os_version: "10",
|
|
1341
|
+
cpu_core_num: "16",
|
|
1342
|
+
device_memory: "8",
|
|
1343
|
+
platform: "PC",
|
|
1344
|
+
downlink: "10",
|
|
1345
|
+
effective_type: "4g",
|
|
1346
|
+
msToken: douyinSign.Mstoken(116),
|
|
1347
|
+
verifyFp: fp,
|
|
1348
|
+
fp
|
|
1349
|
+
};
|
|
1350
|
+
}
|
|
1351
|
+
/**
|
|
1352
|
+
* 获取视频或图集数据的接口地址
|
|
1353
|
+
* @param data - 请求参数,包含aweme_id
|
|
1354
|
+
* @returns 完整的接口URL
|
|
1355
|
+
*/
|
|
1284
1356
|
\u89C6\u9891\u6216\u56FE\u96C6(data2) {
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1357
|
+
const baseUrl = "https://www.douyin.com/aweme/v1/web/aweme/detail/";
|
|
1358
|
+
const params = {
|
|
1359
|
+
...this.getBaseParams(),
|
|
1360
|
+
aweme_id: data2.aweme_id,
|
|
1361
|
+
update_version_code: "170400",
|
|
1362
|
+
version_code: "190500",
|
|
1363
|
+
version_name: "19.5.0",
|
|
1364
|
+
screen_width: "2328",
|
|
1365
|
+
screen_height: "1310",
|
|
1366
|
+
round_trip_time: "150",
|
|
1367
|
+
webid: "7351848354471872041"
|
|
1368
|
+
};
|
|
1369
|
+
return `${baseUrl}?${buildQueryString(params)}`;
|
|
1288
1370
|
}
|
|
1371
|
+
/**
|
|
1372
|
+
* 获取评论数据的接口地址
|
|
1373
|
+
* @param data - 请求参数,包含aweme_id、cursor、number等
|
|
1374
|
+
* @returns 完整的接口URL
|
|
1375
|
+
*/
|
|
1289
1376
|
\u8BC4\u8BBA(data2) {
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1377
|
+
const baseUrl = "https://www.douyin.com/aweme/v1/web/comment/list/";
|
|
1378
|
+
const params = {
|
|
1379
|
+
...this.getBaseParams(),
|
|
1380
|
+
aweme_id: data2.aweme_id,
|
|
1381
|
+
cursor: data2.cursor ?? 0,
|
|
1382
|
+
count: data2.number ?? 50,
|
|
1383
|
+
item_type: "0",
|
|
1384
|
+
insert_ids: "",
|
|
1385
|
+
whale_cut_token: "",
|
|
1386
|
+
cut_version: "1",
|
|
1387
|
+
rcFT: "",
|
|
1388
|
+
version_code: "170400",
|
|
1389
|
+
version_name: "17.4.0",
|
|
1390
|
+
screen_width: "1552",
|
|
1391
|
+
screen_height: "970",
|
|
1392
|
+
round_trip_time: "50"
|
|
1393
|
+
};
|
|
1394
|
+
return `${baseUrl}?${buildQueryString(params)}`;
|
|
1293
1395
|
}
|
|
1396
|
+
/**
|
|
1397
|
+
* 获取二级评论数据的接口地址
|
|
1398
|
+
* @param data - 请求参数,包含aweme_id、comment_id等
|
|
1399
|
+
* @returns 完整的接口URL
|
|
1400
|
+
*/
|
|
1294
1401
|
\u4E8C\u7EA7\u8BC4\u8BBA(data2) {
|
|
1295
|
-
|
|
1402
|
+
const baseUrl = "https://www.douyin.com/aweme/v1/web/comment/list/reply/";
|
|
1403
|
+
const params = {
|
|
1404
|
+
device_platform: "webapp",
|
|
1405
|
+
aid: "6383",
|
|
1406
|
+
channel: "channel_pc_web",
|
|
1407
|
+
item_id: data2.aweme_id,
|
|
1408
|
+
comment_id: data2.comment_id,
|
|
1409
|
+
cut_version: "1",
|
|
1410
|
+
cursor: data2.cursor,
|
|
1411
|
+
count: data2.number,
|
|
1412
|
+
item_type: "0",
|
|
1413
|
+
update_version_code: "170400",
|
|
1414
|
+
pc_client_type: "1",
|
|
1415
|
+
pc_libra_divert: "Windows",
|
|
1416
|
+
support_h265: "1",
|
|
1417
|
+
support_dash: "1",
|
|
1418
|
+
version_code: "170400",
|
|
1419
|
+
version_name: "17.4.0",
|
|
1420
|
+
cookie_enabled: "true",
|
|
1421
|
+
screen_width: "1552",
|
|
1422
|
+
screen_height: "970",
|
|
1423
|
+
browser_language: "zh-CN",
|
|
1424
|
+
browser_platform: "Win32",
|
|
1425
|
+
browser_name: "Edge",
|
|
1426
|
+
browser_version: "132.0.0.0",
|
|
1427
|
+
browser_online: "true",
|
|
1428
|
+
engine_name: "Blink",
|
|
1429
|
+
engine_version: "132.0.0.0",
|
|
1430
|
+
os_name: "Windows",
|
|
1431
|
+
os_version: "10",
|
|
1432
|
+
cpu_core_num: "16",
|
|
1433
|
+
device_memory: "8",
|
|
1434
|
+
platform: "PC",
|
|
1435
|
+
downlink: "10",
|
|
1436
|
+
effective_type: "4g",
|
|
1437
|
+
round_trip_time: "50",
|
|
1438
|
+
webid: "7386217876267796006",
|
|
1439
|
+
verifyFp: fp,
|
|
1440
|
+
fp
|
|
1441
|
+
};
|
|
1442
|
+
return `${baseUrl}?${buildQueryString(params)}`;
|
|
1296
1443
|
}
|
|
1444
|
+
/**
|
|
1445
|
+
* 获取动图数据的接口地址
|
|
1446
|
+
* @param data - 请求参数,包含aweme_id
|
|
1447
|
+
* @returns 完整的接口URL
|
|
1448
|
+
*/
|
|
1297
1449
|
\u52A8\u56FE(data2) {
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1450
|
+
const baseUrl = "https://www.iesdouyin.com/web/api/v2/aweme/slidesinfo/";
|
|
1451
|
+
const params = {
|
|
1452
|
+
reflow_source: "reflow_page",
|
|
1453
|
+
web_id: "7326472315356857893",
|
|
1454
|
+
device_id: "7326472315356857893",
|
|
1455
|
+
aweme_ids: `[${data2.aweme_id}]`,
|
|
1456
|
+
request_source: "200",
|
|
1457
|
+
msToken: douyinSign.Mstoken(116),
|
|
1458
|
+
verifyFp: fp,
|
|
1459
|
+
fp
|
|
1460
|
+
};
|
|
1461
|
+
return `${baseUrl}?${buildQueryString(params)}`;
|
|
1301
1462
|
}
|
|
1463
|
+
/**
|
|
1464
|
+
* 获取表情数据的接口地址
|
|
1465
|
+
* @returns 完整的接口URL
|
|
1466
|
+
*/
|
|
1302
1467
|
\u8868\u60C5() {
|
|
1303
1468
|
return "https://www.douyin.com/aweme/v1/web/emoji/list";
|
|
1304
1469
|
}
|
|
1470
|
+
/**
|
|
1471
|
+
* 获取用户主页视频数据的接口地址
|
|
1472
|
+
* @param data - 请求参数,包含sec_uid
|
|
1473
|
+
* @returns 完整的接口URL
|
|
1474
|
+
*/
|
|
1305
1475
|
\u7528\u6237\u4E3B\u9875\u89C6\u9891(data2) {
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1476
|
+
const baseUrl = "https://www.douyin.com/aweme/v1/web/aweme/post/";
|
|
1477
|
+
const params = {
|
|
1478
|
+
...this.getBaseParams(),
|
|
1479
|
+
sec_user_id: data2.sec_uid,
|
|
1480
|
+
max_cursor: "0",
|
|
1481
|
+
locate_query: "false",
|
|
1482
|
+
show_live_replay_strategy: "1",
|
|
1483
|
+
need_time_list: "1",
|
|
1484
|
+
time_list_query: "0",
|
|
1485
|
+
whale_cut_token: "",
|
|
1486
|
+
cut_version: "1",
|
|
1487
|
+
count: "18",
|
|
1488
|
+
publish_video_strategy_type: "2",
|
|
1489
|
+
version_code: "170400",
|
|
1490
|
+
version_name: "17.4.0",
|
|
1491
|
+
screen_width: "1552",
|
|
1492
|
+
screen_height: "970",
|
|
1493
|
+
round_trip_time: "50",
|
|
1494
|
+
webid: "7338423850134226495"
|
|
1495
|
+
};
|
|
1496
|
+
return `${baseUrl}?${buildQueryString(params)}`;
|
|
1309
1497
|
}
|
|
1498
|
+
/**
|
|
1499
|
+
* 获取用户主页信息的接口地址
|
|
1500
|
+
* @param data - 请求参数,包含sec_uid
|
|
1501
|
+
* @returns 完整的接口URL
|
|
1502
|
+
*/
|
|
1310
1503
|
\u7528\u6237\u4E3B\u9875\u4FE1\u606F(data2) {
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1504
|
+
const baseUrl = "https://www.douyin.com/aweme/v1/web/user/profile/other/";
|
|
1505
|
+
const params = {
|
|
1506
|
+
...this.getBaseParams(),
|
|
1507
|
+
publish_video_strategy_type: "2",
|
|
1508
|
+
source: "channel_pc_web",
|
|
1509
|
+
sec_user_id: data2.sec_uid,
|
|
1510
|
+
personal_center_strategy: "1",
|
|
1511
|
+
version_code: "170400",
|
|
1512
|
+
version_name: "17.4.0",
|
|
1513
|
+
screen_width: "1552",
|
|
1514
|
+
screen_height: "970",
|
|
1515
|
+
round_trip_time: "0",
|
|
1516
|
+
webid: "7327957959955580467"
|
|
1517
|
+
};
|
|
1518
|
+
return `${baseUrl}?${buildQueryString(params)}`;
|
|
1314
1519
|
}
|
|
1520
|
+
/**
|
|
1521
|
+
* 获取热点词数据的接口地址
|
|
1522
|
+
* @param data - 请求参数,包含query
|
|
1523
|
+
* @returns 完整的接口URL
|
|
1524
|
+
*/
|
|
1315
1525
|
\u70ED\u70B9\u8BCD(data2) {
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1526
|
+
const baseUrl = "https://www.douyin.com/aweme/v1/web/api/suggest_words/";
|
|
1527
|
+
const params = {
|
|
1528
|
+
...this.getBaseParams(),
|
|
1529
|
+
query: data2.query,
|
|
1530
|
+
business_id: "30088",
|
|
1531
|
+
from_group_id: "7129543174929812767",
|
|
1532
|
+
version_code: "170400",
|
|
1533
|
+
version_name: "17.4.0",
|
|
1534
|
+
screen_width: "1552",
|
|
1535
|
+
screen_height: "970",
|
|
1536
|
+
round_trip_time: "50",
|
|
1537
|
+
webid: "7327957959955580467"
|
|
1538
|
+
};
|
|
1539
|
+
return `${baseUrl}?${buildQueryString(params)}`;
|
|
1319
1540
|
}
|
|
1541
|
+
/**
|
|
1542
|
+
* 获取搜索数据的接口地址
|
|
1543
|
+
* @param data - 请求参数,包含query、number、search_id等
|
|
1544
|
+
* @returns 完整的接口URL
|
|
1545
|
+
*/
|
|
1320
1546
|
\u641C\u7D22(data2) {
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1547
|
+
const baseUrl = "https://www.douyin.com/aweme/v1/web/general/search/single/";
|
|
1548
|
+
const params = {
|
|
1549
|
+
...this.getBaseParams(),
|
|
1550
|
+
search_channel: "aweme_general",
|
|
1551
|
+
sort_type: "0",
|
|
1552
|
+
publish_time: "0",
|
|
1553
|
+
keyword: data2.query,
|
|
1554
|
+
search_source: "normal_search",
|
|
1555
|
+
query_correct_type: "1",
|
|
1556
|
+
is_filter_search: "0",
|
|
1557
|
+
from_group_id: "",
|
|
1558
|
+
offset: "0",
|
|
1559
|
+
version_code: "190600",
|
|
1560
|
+
version_name: "19.6.0",
|
|
1561
|
+
screen_width: "1552",
|
|
1562
|
+
screen_height: "970",
|
|
1563
|
+
round_trip_time: "50",
|
|
1564
|
+
webid: "7338423850134226495",
|
|
1565
|
+
search_id: data2.search_id ?? "",
|
|
1566
|
+
count: data2.number ?? 10
|
|
1567
|
+
};
|
|
1568
|
+
return `${baseUrl}?${buildQueryString(params)}`;
|
|
1324
1569
|
}
|
|
1570
|
+
/**
|
|
1571
|
+
* 获取互动表情数据的接口地址
|
|
1572
|
+
* @returns 完整的接口URL
|
|
1573
|
+
*/
|
|
1325
1574
|
\u4E92\u52A8\u8868\u60C5() {
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1575
|
+
const baseUrl = "https://www.douyin.com/aweme/v1/web/im/strategy/config";
|
|
1576
|
+
const params = {
|
|
1577
|
+
device_platform: "webapp",
|
|
1578
|
+
aid: "1128",
|
|
1579
|
+
channel: "channel_pc_web",
|
|
1580
|
+
publish_video_strategy_type: "2",
|
|
1581
|
+
app_id: "1128",
|
|
1582
|
+
scenes: "[%22interactive_resources%22]",
|
|
1583
|
+
pc_client_type: "1",
|
|
1584
|
+
version_code: "170400",
|
|
1585
|
+
version_name: "17.4.0",
|
|
1586
|
+
cookie_enabled: "true",
|
|
1587
|
+
screen_width: "2328",
|
|
1588
|
+
screen_height: "1310",
|
|
1589
|
+
browser_language: "zh-CN",
|
|
1590
|
+
browser_platform: "Win32",
|
|
1591
|
+
browser_name: "Chrome",
|
|
1592
|
+
browser_version: "126.0.0.0",
|
|
1593
|
+
browser_online: "true",
|
|
1594
|
+
engine_name: "Blink",
|
|
1595
|
+
engine_version: "126.0.0.0",
|
|
1596
|
+
os_name: "Windows",
|
|
1597
|
+
os_version: "10",
|
|
1598
|
+
cpu_core_num: "16",
|
|
1599
|
+
device_memory: "8",
|
|
1600
|
+
platform: "PC",
|
|
1601
|
+
downlink: "1.5",
|
|
1602
|
+
effective_type: "4g",
|
|
1603
|
+
round_trip_time: "350",
|
|
1604
|
+
webid: "7347329698282833447",
|
|
1605
|
+
msToken: douyinSign.Mstoken(116),
|
|
1606
|
+
verifyFp: fp,
|
|
1607
|
+
fp
|
|
1608
|
+
};
|
|
1609
|
+
return `${baseUrl}?${buildQueryString(params)}`;
|
|
1329
1610
|
}
|
|
1611
|
+
/**
|
|
1612
|
+
* 获取背景音乐数据的接口地址
|
|
1613
|
+
* @param data - 请求参数,包含music_id
|
|
1614
|
+
* @returns 完整的接口URL
|
|
1615
|
+
*/
|
|
1330
1616
|
\u80CC\u666F\u97F3\u4E50(data2) {
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1617
|
+
const baseUrl = "https://www.douyin.com/aweme/v1/web/music/detail/";
|
|
1618
|
+
const params = {
|
|
1619
|
+
device_platform: "webapp",
|
|
1620
|
+
aid: "6383",
|
|
1621
|
+
channel: "channel_pc_web",
|
|
1622
|
+
music_id: data2.music_id,
|
|
1623
|
+
scene: "1",
|
|
1624
|
+
pc_client_type: "1",
|
|
1625
|
+
version_code: "170400",
|
|
1626
|
+
version_name: "17.4.0",
|
|
1627
|
+
cookie_enabled: "true",
|
|
1628
|
+
screen_width: "2328",
|
|
1629
|
+
screen_height: "1310",
|
|
1630
|
+
browser_language: "zh-CN",
|
|
1631
|
+
browser_platform: "Win32",
|
|
1632
|
+
browser_name: "Chrome",
|
|
1633
|
+
browser_version: "126.0.0.0",
|
|
1634
|
+
browser_online: "true",
|
|
1635
|
+
engine_name: "Blink",
|
|
1636
|
+
engine_version: "126.0.0.0",
|
|
1637
|
+
os_name: "Windows",
|
|
1638
|
+
os_version: "10",
|
|
1639
|
+
cpu_core_num: "16",
|
|
1640
|
+
device_memory: "8",
|
|
1641
|
+
platform: "PC",
|
|
1642
|
+
downlink: "1.5",
|
|
1643
|
+
effective_type: "4g",
|
|
1644
|
+
round_trip_time: "350",
|
|
1645
|
+
webid: "7347329698282833447",
|
|
1646
|
+
msToken: douyinSign.Mstoken(116),
|
|
1647
|
+
verifyFp: fp,
|
|
1648
|
+
fp
|
|
1649
|
+
};
|
|
1650
|
+
return `${baseUrl}?${buildQueryString(params)}`;
|
|
1334
1651
|
}
|
|
1652
|
+
/**
|
|
1653
|
+
* 获取直播间信息的接口地址
|
|
1654
|
+
* @param data - 请求参数,包含web_rid、room_id
|
|
1655
|
+
* @returns 完整的接口URL
|
|
1656
|
+
*/
|
|
1335
1657
|
\u76F4\u64AD\u95F4\u4FE1\u606F(data2) {
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1658
|
+
const baseUrl = "https://live.douyin.com/webcast/room/web/enter/";
|
|
1659
|
+
const params = {
|
|
1660
|
+
aid: "6383",
|
|
1661
|
+
app_name: "douyin_web",
|
|
1662
|
+
live_id: "1",
|
|
1663
|
+
device_platform: "web",
|
|
1664
|
+
language: "zh-CN",
|
|
1665
|
+
enter_from: "web_share_link",
|
|
1666
|
+
cookie_enabled: "true",
|
|
1667
|
+
screen_width: "2048",
|
|
1668
|
+
screen_height: "1152",
|
|
1669
|
+
browser_language: "zh-CN",
|
|
1670
|
+
browser_platform: "Win32",
|
|
1671
|
+
browser_name: "Chrome",
|
|
1672
|
+
browser_version: "125.0.0.0",
|
|
1673
|
+
web_rid: data2.web_rid,
|
|
1674
|
+
room_id_str: data2.room_id,
|
|
1675
|
+
enter_source: "",
|
|
1676
|
+
is_need_double_stream: "false",
|
|
1677
|
+
insert_task_id: "",
|
|
1678
|
+
live_reason: "",
|
|
1679
|
+
msToken: douyinSign.Mstoken(116),
|
|
1680
|
+
verifyFp: fp,
|
|
1681
|
+
fp
|
|
1682
|
+
};
|
|
1683
|
+
return `${baseUrl}?${buildQueryString(params)}`;
|
|
1339
1684
|
}
|
|
1685
|
+
/**
|
|
1686
|
+
* 获取申请二维码的接口地址
|
|
1687
|
+
* @param data - 请求参数,包含verify_fp
|
|
1688
|
+
* @returns 完整的接口URL
|
|
1689
|
+
*/
|
|
1340
1690
|
\u7533\u8BF7\u4E8C\u7EF4\u7801(data2) {
|
|
1341
|
-
|
|
1691
|
+
const baseUrl = "https://sso.douyin.com/get_qrcode/";
|
|
1692
|
+
const params = {
|
|
1693
|
+
verifyFp: data2.verify_fp,
|
|
1694
|
+
fp: data2.verify_fp
|
|
1695
|
+
};
|
|
1696
|
+
return `${baseUrl}?${buildQueryString(params)}`;
|
|
1342
1697
|
}
|
|
1343
1698
|
};
|
|
1699
|
+
var createDouyinApiUrls = (userAgent) => {
|
|
1700
|
+
return new DouyinAPI(userAgent);
|
|
1701
|
+
};
|
|
1344
1702
|
var douyinApiUrls = new DouyinAPI();
|
|
1345
1703
|
|
|
1346
1704
|
// src/platform/douyin/getdata.ts
|
|
1347
1705
|
var DouyinData = async (data2, cookie, requestConfig) => {
|
|
1348
|
-
var _a, _b, _c, _d;
|
|
1706
|
+
var _a, _b, _c, _d, _e;
|
|
1349
1707
|
const defHeaders = getDouyinDefaultConfig(cookie)["headers"];
|
|
1350
1708
|
const baseRequestConfig = {
|
|
1351
1709
|
method: "GET",
|
|
@@ -1356,20 +1714,22 @@ var DouyinData = async (data2, cookie, requestConfig) => {
|
|
|
1356
1714
|
...(requestConfig == null ? void 0 : requestConfig.headers) || {}
|
|
1357
1715
|
}
|
|
1358
1716
|
};
|
|
1717
|
+
const userAgent = (_a = baseRequestConfig.headers) == null ? void 0 : _a["User-Agent"];
|
|
1718
|
+
const douyinApiUrls3 = createDouyinApiUrls(userAgent);
|
|
1359
1719
|
switch (data2.methodType) {
|
|
1360
1720
|
case "\u805A\u5408\u89E3\u6790":
|
|
1361
1721
|
case "\u89C6\u9891\u4F5C\u54C1\u6570\u636E":
|
|
1362
1722
|
case "\u56FE\u96C6\u4F5C\u54C1\u6570\u636E":
|
|
1363
1723
|
case "\u5408\u8F91\u4F5C\u54C1\u6570\u636E": {
|
|
1364
|
-
const url =
|
|
1724
|
+
const url = douyinApiUrls3.\u89C6\u9891\u6216\u56FE\u96C6({ aweme_id: data2.aweme_id });
|
|
1365
1725
|
const VideoData = await GlobalGetData2(data2.methodType, {
|
|
1366
1726
|
...baseRequestConfig,
|
|
1367
|
-
url: `${url}&a_bogus=${douyinSign.AB(url)}`
|
|
1727
|
+
url: `${url}&a_bogus=${douyinSign.AB(url, userAgent)}`
|
|
1368
1728
|
});
|
|
1369
1729
|
return VideoData;
|
|
1370
1730
|
}
|
|
1371
1731
|
case "\u8BC4\u8BBA\u6570\u636E": {
|
|
1372
|
-
const urlGenerator = (params) =>
|
|
1732
|
+
const urlGenerator = (params) => douyinApiUrls3.\u8BC4\u8BBA(params);
|
|
1373
1733
|
const response = await fetchPaginatedData(
|
|
1374
1734
|
data2.methodType,
|
|
1375
1735
|
urlGenerator,
|
|
@@ -1380,7 +1740,7 @@ var DouyinData = async (data2, cookie, requestConfig) => {
|
|
|
1380
1740
|
return response;
|
|
1381
1741
|
}
|
|
1382
1742
|
case "\u6307\u5B9A\u8BC4\u8BBA\u56DE\u590D\u6570\u636E": {
|
|
1383
|
-
const urlGenerator = (params) =>
|
|
1743
|
+
const urlGenerator = (params) => douyinApiUrls3.\u4E8C\u7EA7\u8BC4\u8BBA(params);
|
|
1384
1744
|
const customConfig = {
|
|
1385
1745
|
...baseRequestConfig,
|
|
1386
1746
|
headers: {
|
|
@@ -1401,7 +1761,7 @@ var DouyinData = async (data2, cookie, requestConfig) => {
|
|
|
1401
1761
|
return response;
|
|
1402
1762
|
}
|
|
1403
1763
|
case "\u7528\u6237\u4E3B\u9875\u6570\u636E": {
|
|
1404
|
-
const url =
|
|
1764
|
+
const url = douyinApiUrls3.\u7528\u6237\u4E3B\u9875\u4FE1\u606F({ sec_uid: data2.sec_uid });
|
|
1405
1765
|
const customConfig = {
|
|
1406
1766
|
...baseRequestConfig,
|
|
1407
1767
|
headers: {
|
|
@@ -1414,12 +1774,12 @@ var DouyinData = async (data2, cookie, requestConfig) => {
|
|
|
1414
1774
|
};
|
|
1415
1775
|
const UserInfoData = await GlobalGetData2(data2.methodType, {
|
|
1416
1776
|
...customConfig,
|
|
1417
|
-
url: `${url}&a_bogus=${douyinSign.AB(url)}`
|
|
1777
|
+
url: `${url}&a_bogus=${douyinSign.AB(url, userAgent)}`
|
|
1418
1778
|
});
|
|
1419
1779
|
return UserInfoData;
|
|
1420
1780
|
}
|
|
1421
1781
|
case "Emoji\u6570\u636E": {
|
|
1422
|
-
const url =
|
|
1782
|
+
const url = douyinApiUrls3.\u8868\u60C5();
|
|
1423
1783
|
const EmojiData = await GlobalGetData2(data2.methodType, {
|
|
1424
1784
|
...baseRequestConfig,
|
|
1425
1785
|
url
|
|
@@ -1427,7 +1787,7 @@ var DouyinData = async (data2, cookie, requestConfig) => {
|
|
|
1427
1787
|
return EmojiData;
|
|
1428
1788
|
}
|
|
1429
1789
|
case "\u7528\u6237\u4E3B\u9875\u89C6\u9891\u5217\u8868\u6570\u636E": {
|
|
1430
|
-
const url =
|
|
1790
|
+
const url = douyinApiUrls3.\u7528\u6237\u4E3B\u9875\u89C6\u9891({ sec_uid: data2.sec_uid });
|
|
1431
1791
|
const customConfig = {
|
|
1432
1792
|
...baseRequestConfig,
|
|
1433
1793
|
headers: {
|
|
@@ -1439,12 +1799,12 @@ var DouyinData = async (data2, cookie, requestConfig) => {
|
|
|
1439
1799
|
};
|
|
1440
1800
|
const UserVideoListData = await GlobalGetData2(data2.methodType, {
|
|
1441
1801
|
...customConfig,
|
|
1442
|
-
url: `${url}&a_bogus=${douyinSign.AB(url)}`
|
|
1802
|
+
url: `${url}&a_bogus=${douyinSign.AB(url, userAgent)}`
|
|
1443
1803
|
});
|
|
1444
1804
|
return UserVideoListData;
|
|
1445
1805
|
}
|
|
1446
1806
|
case "\u70ED\u70B9\u8BCD\u6570\u636E": {
|
|
1447
|
-
const url =
|
|
1807
|
+
const url = douyinApiUrls3.\u70ED\u70B9\u8BCD({ query: data2.query, number: data2.number ?? 10 });
|
|
1448
1808
|
const customConfig = {
|
|
1449
1809
|
...baseRequestConfig,
|
|
1450
1810
|
headers: {
|
|
@@ -1456,7 +1816,7 @@ var DouyinData = async (data2, cookie, requestConfig) => {
|
|
|
1456
1816
|
};
|
|
1457
1817
|
const SuggestWordsData = await GlobalGetData2(data2.methodType, {
|
|
1458
1818
|
...customConfig,
|
|
1459
|
-
url: `${url}&a_bogus=${douyinSign.AB(url)}`
|
|
1819
|
+
url: `${url}&a_bogus=${douyinSign.AB(url, userAgent)}`
|
|
1460
1820
|
});
|
|
1461
1821
|
return SuggestWordsData;
|
|
1462
1822
|
}
|
|
@@ -1476,16 +1836,16 @@ var DouyinData = async (data2, cookie, requestConfig) => {
|
|
|
1476
1836
|
};
|
|
1477
1837
|
while (fetchedSearchList.length < Number(data2.number ?? 10)) {
|
|
1478
1838
|
const requestCount = Math.min(Number(data2.number ?? 50) - fetchedSearchList.length, maxPageSize);
|
|
1479
|
-
const url =
|
|
1839
|
+
const url = douyinApiUrls3.\u641C\u7D22({
|
|
1480
1840
|
query: data2.query,
|
|
1481
1841
|
number: requestCount,
|
|
1482
1842
|
search_id: search_id === "" ? void 0 : search_id
|
|
1483
1843
|
});
|
|
1484
1844
|
const response = await GlobalGetData2(data2.methodType, {
|
|
1485
1845
|
...customConfig,
|
|
1486
|
-
url: `${url}&a_bogus=${douyinSign.AB(url)}`
|
|
1846
|
+
url: `${url}&a_bogus=${douyinSign.AB(url, userAgent)}`
|
|
1487
1847
|
});
|
|
1488
|
-
if (((
|
|
1848
|
+
if (((_b = response.data) == null ? void 0 : _b.length) === 0) {
|
|
1489
1849
|
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);
|
|
1490
1850
|
return false;
|
|
1491
1851
|
}
|
|
@@ -1494,7 +1854,7 @@ var DouyinData = async (data2, cookie, requestConfig) => {
|
|
|
1494
1854
|
}
|
|
1495
1855
|
fetchedSearchList.push(...response.data);
|
|
1496
1856
|
tmpresp = response;
|
|
1497
|
-
search_id = (
|
|
1857
|
+
search_id = (_c = response.log_pb) == null ? void 0 : _c.impr_id;
|
|
1498
1858
|
}
|
|
1499
1859
|
const finalResponse = {
|
|
1500
1860
|
...tmpresp,
|
|
@@ -1503,24 +1863,24 @@ var DouyinData = async (data2, cookie, requestConfig) => {
|
|
|
1503
1863
|
return finalResponse;
|
|
1504
1864
|
}
|
|
1505
1865
|
case "\u52A8\u6001\u8868\u60C5\u6570\u636E": {
|
|
1506
|
-
const url =
|
|
1866
|
+
const url = douyinApiUrls3.\u4E92\u52A8\u8868\u60C5();
|
|
1507
1867
|
const ExpressionPlusData = await GlobalGetData2(data2.methodType, {
|
|
1508
1868
|
...baseRequestConfig,
|
|
1509
|
-
url: `${url}&a_bogus=${douyinSign.AB(url)}`
|
|
1869
|
+
url: `${url}&a_bogus=${douyinSign.AB(url, userAgent)}`
|
|
1510
1870
|
});
|
|
1511
1871
|
return ExpressionPlusData;
|
|
1512
1872
|
}
|
|
1513
1873
|
case "\u97F3\u4E50\u6570\u636E": {
|
|
1514
|
-
const url =
|
|
1874
|
+
const url = douyinApiUrls3.\u80CC\u666F\u97F3\u4E50({ music_id: data2.music_id });
|
|
1515
1875
|
const MusicData = await GlobalGetData2(data2.methodType, {
|
|
1516
1876
|
...baseRequestConfig,
|
|
1517
|
-
url: `${url}&a_bogus=${douyinSign.AB(url)}`
|
|
1877
|
+
url: `${url}&a_bogus=${douyinSign.AB(url, userAgent)}`
|
|
1518
1878
|
});
|
|
1519
1879
|
return MusicData;
|
|
1520
1880
|
}
|
|
1521
1881
|
case "\u76F4\u64AD\u95F4\u4FE1\u606F\u6570\u636E": {
|
|
1522
|
-
let url =
|
|
1523
|
-
const fetchUrl = `${url}&a_bogus=${douyinSign.AB(url)}`;
|
|
1882
|
+
let url = douyinApiUrls3.\u7528\u6237\u4E3B\u9875\u4FE1\u606F({ sec_uid: data2.sec_uid });
|
|
1883
|
+
const fetchUrl = `${url}&a_bogus=${douyinSign.AB(url, userAgent)}`;
|
|
1524
1884
|
const customConfig = {
|
|
1525
1885
|
...baseRequestConfig,
|
|
1526
1886
|
headers: {
|
|
@@ -1534,8 +1894,8 @@ var DouyinData = async (data2, cookie, requestConfig) => {
|
|
|
1534
1894
|
...customConfig,
|
|
1535
1895
|
url: fetchUrl
|
|
1536
1896
|
});
|
|
1537
|
-
if (!((
|
|
1538
|
-
logger.error((((
|
|
1897
|
+
if (!((_d = UserInfoData == null ? void 0 : UserInfoData.user) == null ? void 0 : _d.live_status) || UserInfoData.user.live_status !== 1) {
|
|
1898
|
+
logger.error((((_e = UserInfoData == null ? void 0 : UserInfoData.user) == null ? void 0 : _e.nickname) || "\u7528\u6237") + "\u5F53\u524D\u672A\u5728\u76F4\u64AD");
|
|
1539
1899
|
const Err = {
|
|
1540
1900
|
errorDescription: "\u68C0\u67E5\u5931\u8D25\uFF01\u8BE5\u7528\u6237\u5F53\u524D\u672A\u5728\u76F4\u64AD\uFF01 TypeError: Cannot read properties of undefined (reading 'live_status')",
|
|
1541
1901
|
requestType: data2.methodType ?? "\u672A\u77E5\u8BF7\u6C42\u7C7B\u578B",
|
|
@@ -1557,7 +1917,7 @@ var DouyinData = async (data2, cookie, requestConfig) => {
|
|
|
1557
1917
|
};
|
|
1558
1918
|
}
|
|
1559
1919
|
const room_data = JSON.parse(UserInfoData.user.room_data);
|
|
1560
|
-
url =
|
|
1920
|
+
url = douyinApiUrls3.\u76F4\u64AD\u95F4\u4FE1\u606F({ room_id: UserInfoData.user.room_id_str, web_rid: room_data.owner.web_rid });
|
|
1561
1921
|
const liveCustomConfig = {
|
|
1562
1922
|
...baseRequestConfig,
|
|
1563
1923
|
headers: {
|
|
@@ -1569,15 +1929,15 @@ var DouyinData = async (data2, cookie, requestConfig) => {
|
|
|
1569
1929
|
};
|
|
1570
1930
|
const LiveRoomData = await GlobalGetData2(data2.methodType, {
|
|
1571
1931
|
...liveCustomConfig,
|
|
1572
|
-
url: `${url}&a_bogus=${douyinSign.AB(url)}`
|
|
1932
|
+
url: `${url}&a_bogus=${douyinSign.AB(url, userAgent)}`
|
|
1573
1933
|
});
|
|
1574
1934
|
return LiveRoomData;
|
|
1575
1935
|
}
|
|
1576
1936
|
case "\u7533\u8BF7\u4E8C\u7EF4\u7801\u6570\u636E": {
|
|
1577
|
-
const url =
|
|
1937
|
+
const url = douyinApiUrls3.\u7533\u8BF7\u4E8C\u7EF4\u7801({ verify_fp: data2.verify_fp });
|
|
1578
1938
|
const LoginQrcodeStatusData = await GlobalGetData2(data2.methodType, {
|
|
1579
1939
|
...baseRequestConfig,
|
|
1580
|
-
url: `${url}&a_bogus=${douyinSign.AB(url)}`
|
|
1940
|
+
url: `${url}&a_bogus=${douyinSign.AB(url, userAgent)}`
|
|
1581
1941
|
});
|
|
1582
1942
|
return LoginQrcodeStatusData;
|
|
1583
1943
|
}
|
|
@@ -1588,9 +1948,11 @@ var DouyinData = async (data2, cookie, requestConfig) => {
|
|
|
1588
1948
|
}
|
|
1589
1949
|
};
|
|
1590
1950
|
var fetchPaginatedData = async (type, apiUrlGenerator, params, maxPageSize, requestConfig) => {
|
|
1951
|
+
var _a;
|
|
1591
1952
|
let cursor = params.cursor ?? 0;
|
|
1592
1953
|
let fetchedData = [];
|
|
1593
1954
|
let tmpresp = {};
|
|
1955
|
+
const userAgent = (_a = requestConfig.headers) == null ? void 0 : _a["User-Agent"];
|
|
1594
1956
|
while (fetchedData.length < Number(params.number ?? maxPageSize)) {
|
|
1595
1957
|
const requestCount = Math.min(Number(params.number ?? maxPageSize) - fetchedData.length, maxPageSize);
|
|
1596
1958
|
const url = apiUrlGenerator({
|
|
@@ -1600,7 +1962,7 @@ var fetchPaginatedData = async (type, apiUrlGenerator, params, maxPageSize, requ
|
|
|
1600
1962
|
});
|
|
1601
1963
|
const response = await GlobalGetData2(type, {
|
|
1602
1964
|
...requestConfig,
|
|
1603
|
-
url: `${url}&a_bogus=${douyinSign.AB(url)}`
|
|
1965
|
+
url: `${url}&a_bogus=${douyinSign.AB(url, userAgent)}`
|
|
1604
1966
|
});
|
|
1605
1967
|
fetchedData.push(...response.comments || response.data || []);
|
|
1606
1968
|
tmpresp = response;
|
|
@@ -2999,9 +3361,6 @@ var createAmagiClient = (options) => {
|
|
|
2999
3361
|
});
|
|
3000
3362
|
return app;
|
|
3001
3363
|
};
|
|
3002
|
-
const startClient = (port = 4567) => {
|
|
3003
|
-
return startServer(port);
|
|
3004
|
-
};
|
|
3005
3364
|
const getDouyinDataWithCookie = async (methodType, options2) => {
|
|
3006
3365
|
return await getDouyinData(methodType, options2, douyinCookie, requestConfig);
|
|
3007
3366
|
};
|
|
@@ -3014,8 +3373,6 @@ var createAmagiClient = (options) => {
|
|
|
3014
3373
|
return {
|
|
3015
3374
|
/** 启动本地HTTP服务 */
|
|
3016
3375
|
startServer,
|
|
3017
|
-
/** @deprecated 此方法已废弃,请使用 startServer 方法代替 */
|
|
3018
|
-
startClient,
|
|
3019
3376
|
getDouyinData: getDouyinDataWithCookie,
|
|
3020
3377
|
getBilibiliData: getBilibiliDataWithCookie,
|
|
3021
3378
|
getKuaishouData: getKuaishouDataWithCookie,
|