@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
|
@@ -151,9 +151,16 @@ var logMiddleware = (pathsToLog) => {
|
|
|
151
151
|
next();
|
|
152
152
|
};
|
|
153
153
|
};
|
|
154
|
+
var cleanUserAgent = (userAgent) => {
|
|
155
|
+
return userAgent.replace(/\s+Edg\/[\d\.]+/g, "");
|
|
156
|
+
};
|
|
154
157
|
var fetchData = async (config) => {
|
|
155
158
|
try {
|
|
156
|
-
const
|
|
159
|
+
const cleanedConfig = { ...config };
|
|
160
|
+
if (cleanedConfig.headers && cleanedConfig.headers["User-Agent"]) {
|
|
161
|
+
cleanedConfig.headers["User-Agent"] = cleanUserAgent(cleanedConfig.headers["User-Agent"]);
|
|
162
|
+
}
|
|
163
|
+
const response = await axios(cleanedConfig);
|
|
157
164
|
if (response.status === 429) {
|
|
158
165
|
logger.error("HTTP \u54CD\u5E94\u72B6\u6001\u7801: 429");
|
|
159
166
|
throw new Error("ratelimit triggered, \u89E6\u53D1\u901F\u7387\u9650\u5236\uFF01");
|
|
@@ -169,7 +176,11 @@ var fetchData = async (config) => {
|
|
|
169
176
|
};
|
|
170
177
|
var fetchResponse = async (config) => {
|
|
171
178
|
try {
|
|
172
|
-
|
|
179
|
+
const cleanedConfig = { ...config };
|
|
180
|
+
if (cleanedConfig.headers && cleanedConfig.headers["User-Agent"]) {
|
|
181
|
+
cleanedConfig.headers["User-Agent"] = cleanUserAgent(cleanedConfig.headers["User-Agent"]);
|
|
182
|
+
}
|
|
183
|
+
return await axios(cleanedConfig);
|
|
173
184
|
} catch (error) {
|
|
174
185
|
if (error instanceof AxiosError) {
|
|
175
186
|
throw error;
|
|
@@ -428,7 +439,8 @@ var generateSecChUa = (userAgent) => {
|
|
|
428
439
|
};
|
|
429
440
|
var getDouyinDefaultConfig = (cookie, requestConfig) => {
|
|
430
441
|
var _a;
|
|
431
|
-
|
|
442
|
+
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";
|
|
443
|
+
finalUserAgent = finalUserAgent.replace(/\s+Edg\/[\d\.]+/g, "");
|
|
432
444
|
const defHeaders = {
|
|
433
445
|
Accept: "application/json, text/plain, */*",
|
|
434
446
|
"Accept-Encoding": "gzip, deflate, br, zstd",
|
|
@@ -1213,15 +1225,17 @@ function generate_random_str() {
|
|
|
1213
1225
|
random_str_list = random_str_list.concat(gener_random(Math.random() * 1e4, [1, 5]));
|
|
1214
1226
|
return String.fromCharCode.apply(null, random_str_list);
|
|
1215
1227
|
}
|
|
1228
|
+
var cleanUserAgentForSigning = (userAgent) => {
|
|
1229
|
+
return userAgent.replace(/\s+Edg\/[\d\.]+/g, "");
|
|
1230
|
+
};
|
|
1216
1231
|
var a_bogus_default = (url, user_agent) => {
|
|
1217
|
-
|
|
1232
|
+
const cleanedUserAgent = cleanUserAgentForSigning(user_agent);
|
|
1233
|
+
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");
|
|
1218
1234
|
return result_encrypt(result_str, "s4") + "=";
|
|
1219
1235
|
};
|
|
1220
1236
|
|
|
1221
1237
|
// src/platform/douyin/sign/index.ts
|
|
1222
|
-
var
|
|
1223
|
-
"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"
|
|
1224
|
-
};
|
|
1238
|
+
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";
|
|
1225
1239
|
var douyinSign = class {
|
|
1226
1240
|
/**
|
|
1227
1241
|
* 生成一个指定长度的随机字符串
|
|
@@ -1238,8 +1252,8 @@ var douyinSign = class {
|
|
|
1238
1252
|
* @param url 需要签名的地址
|
|
1239
1253
|
* @returns 对此地址签名后的URL查询参数
|
|
1240
1254
|
*/
|
|
1241
|
-
static AB(url) {
|
|
1242
|
-
return a_bogus_default(url,
|
|
1255
|
+
static AB(url, userAgent) {
|
|
1256
|
+
return a_bogus_default(url, userAgent || defaultUserAgent);
|
|
1243
1257
|
}
|
|
1244
1258
|
/** 生成一个唯一的验证字符串 */
|
|
1245
1259
|
static VerifyFpManager() {
|
|
@@ -1263,73 +1277,417 @@ var douyinSign = class {
|
|
|
1263
1277
|
};
|
|
1264
1278
|
|
|
1265
1279
|
// src/platform/douyin/API.ts
|
|
1280
|
+
var extractBrowserVersion = (userAgent) => {
|
|
1281
|
+
if (!userAgent) return "125.0.0.0";
|
|
1282
|
+
const chromeMatch = userAgent.match(/Chrome\/(\d+\.\d+\.\d+\.\d+)/);
|
|
1283
|
+
if (chromeMatch) {
|
|
1284
|
+
return chromeMatch[1];
|
|
1285
|
+
}
|
|
1286
|
+
const edgeMatch = userAgent.match(/Edg\/(\d+\.\d+\.\d+\.\d+)/);
|
|
1287
|
+
if (edgeMatch) {
|
|
1288
|
+
return edgeMatch[1];
|
|
1289
|
+
}
|
|
1290
|
+
return "125.0.0.0";
|
|
1291
|
+
};
|
|
1292
|
+
var buildQueryString = (params) => {
|
|
1293
|
+
return Object.entries(params).filter(([_, value]) => value !== void 0 && value !== null).map(([key, value]) => `${key}=${encodeURIComponent(value)}`).join("&");
|
|
1294
|
+
};
|
|
1266
1295
|
var fp = douyinSign.VerifyFpManager();
|
|
1267
1296
|
var DouyinAPI = class {
|
|
1297
|
+
browserVersion;
|
|
1298
|
+
/**
|
|
1299
|
+
* 构造函数
|
|
1300
|
+
* @param userAgent - 用户代理字符串,用于提取浏览器版本信息
|
|
1301
|
+
*/
|
|
1302
|
+
constructor(userAgent) {
|
|
1303
|
+
this.browserVersion = extractBrowserVersion(userAgent);
|
|
1304
|
+
}
|
|
1305
|
+
/**
|
|
1306
|
+
* 获取通用的基础参数
|
|
1307
|
+
* @returns 通用基础参数对象
|
|
1308
|
+
*/
|
|
1309
|
+
getBaseParams() {
|
|
1310
|
+
return {
|
|
1311
|
+
device_platform: "webapp",
|
|
1312
|
+
aid: "6383",
|
|
1313
|
+
channel: "channel_pc_web",
|
|
1314
|
+
pc_client_type: "1",
|
|
1315
|
+
cookie_enabled: "true",
|
|
1316
|
+
browser_language: "zh-CN",
|
|
1317
|
+
browser_platform: "Win32",
|
|
1318
|
+
browser_name: "Chrome",
|
|
1319
|
+
browser_version: this.browserVersion,
|
|
1320
|
+
browser_online: "true",
|
|
1321
|
+
engine_name: "Blink",
|
|
1322
|
+
engine_version: this.browserVersion,
|
|
1323
|
+
os_name: "Windows",
|
|
1324
|
+
os_version: "10",
|
|
1325
|
+
cpu_core_num: "16",
|
|
1326
|
+
device_memory: "8",
|
|
1327
|
+
platform: "PC",
|
|
1328
|
+
downlink: "10",
|
|
1329
|
+
effective_type: "4g",
|
|
1330
|
+
msToken: douyinSign.Mstoken(116),
|
|
1331
|
+
verifyFp: fp,
|
|
1332
|
+
fp
|
|
1333
|
+
};
|
|
1334
|
+
}
|
|
1335
|
+
/**
|
|
1336
|
+
* 获取视频或图集数据的接口地址
|
|
1337
|
+
* @param data - 请求参数,包含aweme_id
|
|
1338
|
+
* @returns 完整的接口URL
|
|
1339
|
+
*/
|
|
1268
1340
|
\u89C6\u9891\u6216\u56FE\u96C6(data2) {
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1341
|
+
const baseUrl = "https://www.douyin.com/aweme/v1/web/aweme/detail/";
|
|
1342
|
+
const params = {
|
|
1343
|
+
...this.getBaseParams(),
|
|
1344
|
+
aweme_id: data2.aweme_id,
|
|
1345
|
+
update_version_code: "170400",
|
|
1346
|
+
version_code: "190500",
|
|
1347
|
+
version_name: "19.5.0",
|
|
1348
|
+
screen_width: "2328",
|
|
1349
|
+
screen_height: "1310",
|
|
1350
|
+
round_trip_time: "150",
|
|
1351
|
+
webid: "7351848354471872041"
|
|
1352
|
+
};
|
|
1353
|
+
return `${baseUrl}?${buildQueryString(params)}`;
|
|
1272
1354
|
}
|
|
1355
|
+
/**
|
|
1356
|
+
* 获取评论数据的接口地址
|
|
1357
|
+
* @param data - 请求参数,包含aweme_id、cursor、number等
|
|
1358
|
+
* @returns 完整的接口URL
|
|
1359
|
+
*/
|
|
1273
1360
|
\u8BC4\u8BBA(data2) {
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1361
|
+
const baseUrl = "https://www.douyin.com/aweme/v1/web/comment/list/";
|
|
1362
|
+
const params = {
|
|
1363
|
+
...this.getBaseParams(),
|
|
1364
|
+
aweme_id: data2.aweme_id,
|
|
1365
|
+
cursor: data2.cursor ?? 0,
|
|
1366
|
+
count: data2.number ?? 50,
|
|
1367
|
+
item_type: "0",
|
|
1368
|
+
insert_ids: "",
|
|
1369
|
+
whale_cut_token: "",
|
|
1370
|
+
cut_version: "1",
|
|
1371
|
+
rcFT: "",
|
|
1372
|
+
version_code: "170400",
|
|
1373
|
+
version_name: "17.4.0",
|
|
1374
|
+
screen_width: "1552",
|
|
1375
|
+
screen_height: "970",
|
|
1376
|
+
round_trip_time: "50"
|
|
1377
|
+
};
|
|
1378
|
+
return `${baseUrl}?${buildQueryString(params)}`;
|
|
1277
1379
|
}
|
|
1380
|
+
/**
|
|
1381
|
+
* 获取二级评论数据的接口地址
|
|
1382
|
+
* @param data - 请求参数,包含aweme_id、comment_id等
|
|
1383
|
+
* @returns 完整的接口URL
|
|
1384
|
+
*/
|
|
1278
1385
|
\u4E8C\u7EA7\u8BC4\u8BBA(data2) {
|
|
1279
|
-
|
|
1386
|
+
const baseUrl = "https://www.douyin.com/aweme/v1/web/comment/list/reply/";
|
|
1387
|
+
const params = {
|
|
1388
|
+
device_platform: "webapp",
|
|
1389
|
+
aid: "6383",
|
|
1390
|
+
channel: "channel_pc_web",
|
|
1391
|
+
item_id: data2.aweme_id,
|
|
1392
|
+
comment_id: data2.comment_id,
|
|
1393
|
+
cut_version: "1",
|
|
1394
|
+
cursor: data2.cursor,
|
|
1395
|
+
count: data2.number,
|
|
1396
|
+
item_type: "0",
|
|
1397
|
+
update_version_code: "170400",
|
|
1398
|
+
pc_client_type: "1",
|
|
1399
|
+
pc_libra_divert: "Windows",
|
|
1400
|
+
support_h265: "1",
|
|
1401
|
+
support_dash: "1",
|
|
1402
|
+
version_code: "170400",
|
|
1403
|
+
version_name: "17.4.0",
|
|
1404
|
+
cookie_enabled: "true",
|
|
1405
|
+
screen_width: "1552",
|
|
1406
|
+
screen_height: "970",
|
|
1407
|
+
browser_language: "zh-CN",
|
|
1408
|
+
browser_platform: "Win32",
|
|
1409
|
+
browser_name: "Edge",
|
|
1410
|
+
browser_version: "132.0.0.0",
|
|
1411
|
+
browser_online: "true",
|
|
1412
|
+
engine_name: "Blink",
|
|
1413
|
+
engine_version: "132.0.0.0",
|
|
1414
|
+
os_name: "Windows",
|
|
1415
|
+
os_version: "10",
|
|
1416
|
+
cpu_core_num: "16",
|
|
1417
|
+
device_memory: "8",
|
|
1418
|
+
platform: "PC",
|
|
1419
|
+
downlink: "10",
|
|
1420
|
+
effective_type: "4g",
|
|
1421
|
+
round_trip_time: "50",
|
|
1422
|
+
webid: "7386217876267796006",
|
|
1423
|
+
verifyFp: fp,
|
|
1424
|
+
fp
|
|
1425
|
+
};
|
|
1426
|
+
return `${baseUrl}?${buildQueryString(params)}`;
|
|
1280
1427
|
}
|
|
1428
|
+
/**
|
|
1429
|
+
* 获取动图数据的接口地址
|
|
1430
|
+
* @param data - 请求参数,包含aweme_id
|
|
1431
|
+
* @returns 完整的接口URL
|
|
1432
|
+
*/
|
|
1281
1433
|
\u52A8\u56FE(data2) {
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1434
|
+
const baseUrl = "https://www.iesdouyin.com/web/api/v2/aweme/slidesinfo/";
|
|
1435
|
+
const params = {
|
|
1436
|
+
reflow_source: "reflow_page",
|
|
1437
|
+
web_id: "7326472315356857893",
|
|
1438
|
+
device_id: "7326472315356857893",
|
|
1439
|
+
aweme_ids: `[${data2.aweme_id}]`,
|
|
1440
|
+
request_source: "200",
|
|
1441
|
+
msToken: douyinSign.Mstoken(116),
|
|
1442
|
+
verifyFp: fp,
|
|
1443
|
+
fp
|
|
1444
|
+
};
|
|
1445
|
+
return `${baseUrl}?${buildQueryString(params)}`;
|
|
1285
1446
|
}
|
|
1447
|
+
/**
|
|
1448
|
+
* 获取表情数据的接口地址
|
|
1449
|
+
* @returns 完整的接口URL
|
|
1450
|
+
*/
|
|
1286
1451
|
\u8868\u60C5() {
|
|
1287
1452
|
return "https://www.douyin.com/aweme/v1/web/emoji/list";
|
|
1288
1453
|
}
|
|
1454
|
+
/**
|
|
1455
|
+
* 获取用户主页视频数据的接口地址
|
|
1456
|
+
* @param data - 请求参数,包含sec_uid
|
|
1457
|
+
* @returns 完整的接口URL
|
|
1458
|
+
*/
|
|
1289
1459
|
\u7528\u6237\u4E3B\u9875\u89C6\u9891(data2) {
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1460
|
+
const baseUrl = "https://www.douyin.com/aweme/v1/web/aweme/post/";
|
|
1461
|
+
const params = {
|
|
1462
|
+
...this.getBaseParams(),
|
|
1463
|
+
sec_user_id: data2.sec_uid,
|
|
1464
|
+
max_cursor: "0",
|
|
1465
|
+
locate_query: "false",
|
|
1466
|
+
show_live_replay_strategy: "1",
|
|
1467
|
+
need_time_list: "1",
|
|
1468
|
+
time_list_query: "0",
|
|
1469
|
+
whale_cut_token: "",
|
|
1470
|
+
cut_version: "1",
|
|
1471
|
+
count: "18",
|
|
1472
|
+
publish_video_strategy_type: "2",
|
|
1473
|
+
version_code: "170400",
|
|
1474
|
+
version_name: "17.4.0",
|
|
1475
|
+
screen_width: "1552",
|
|
1476
|
+
screen_height: "970",
|
|
1477
|
+
round_trip_time: "50",
|
|
1478
|
+
webid: "7338423850134226495"
|
|
1479
|
+
};
|
|
1480
|
+
return `${baseUrl}?${buildQueryString(params)}`;
|
|
1293
1481
|
}
|
|
1482
|
+
/**
|
|
1483
|
+
* 获取用户主页信息的接口地址
|
|
1484
|
+
* @param data - 请求参数,包含sec_uid
|
|
1485
|
+
* @returns 完整的接口URL
|
|
1486
|
+
*/
|
|
1294
1487
|
\u7528\u6237\u4E3B\u9875\u4FE1\u606F(data2) {
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1488
|
+
const baseUrl = "https://www.douyin.com/aweme/v1/web/user/profile/other/";
|
|
1489
|
+
const params = {
|
|
1490
|
+
...this.getBaseParams(),
|
|
1491
|
+
publish_video_strategy_type: "2",
|
|
1492
|
+
source: "channel_pc_web",
|
|
1493
|
+
sec_user_id: data2.sec_uid,
|
|
1494
|
+
personal_center_strategy: "1",
|
|
1495
|
+
version_code: "170400",
|
|
1496
|
+
version_name: "17.4.0",
|
|
1497
|
+
screen_width: "1552",
|
|
1498
|
+
screen_height: "970",
|
|
1499
|
+
round_trip_time: "0",
|
|
1500
|
+
webid: "7327957959955580467"
|
|
1501
|
+
};
|
|
1502
|
+
return `${baseUrl}?${buildQueryString(params)}`;
|
|
1298
1503
|
}
|
|
1504
|
+
/**
|
|
1505
|
+
* 获取热点词数据的接口地址
|
|
1506
|
+
* @param data - 请求参数,包含query
|
|
1507
|
+
* @returns 完整的接口URL
|
|
1508
|
+
*/
|
|
1299
1509
|
\u70ED\u70B9\u8BCD(data2) {
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1510
|
+
const baseUrl = "https://www.douyin.com/aweme/v1/web/api/suggest_words/";
|
|
1511
|
+
const params = {
|
|
1512
|
+
...this.getBaseParams(),
|
|
1513
|
+
query: data2.query,
|
|
1514
|
+
business_id: "30088",
|
|
1515
|
+
from_group_id: "7129543174929812767",
|
|
1516
|
+
version_code: "170400",
|
|
1517
|
+
version_name: "17.4.0",
|
|
1518
|
+
screen_width: "1552",
|
|
1519
|
+
screen_height: "970",
|
|
1520
|
+
round_trip_time: "50",
|
|
1521
|
+
webid: "7327957959955580467"
|
|
1522
|
+
};
|
|
1523
|
+
return `${baseUrl}?${buildQueryString(params)}`;
|
|
1303
1524
|
}
|
|
1525
|
+
/**
|
|
1526
|
+
* 获取搜索数据的接口地址
|
|
1527
|
+
* @param data - 请求参数,包含query、number、search_id等
|
|
1528
|
+
* @returns 完整的接口URL
|
|
1529
|
+
*/
|
|
1304
1530
|
\u641C\u7D22(data2) {
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1531
|
+
const baseUrl = "https://www.douyin.com/aweme/v1/web/general/search/single/";
|
|
1532
|
+
const params = {
|
|
1533
|
+
...this.getBaseParams(),
|
|
1534
|
+
search_channel: "aweme_general",
|
|
1535
|
+
sort_type: "0",
|
|
1536
|
+
publish_time: "0",
|
|
1537
|
+
keyword: data2.query,
|
|
1538
|
+
search_source: "normal_search",
|
|
1539
|
+
query_correct_type: "1",
|
|
1540
|
+
is_filter_search: "0",
|
|
1541
|
+
from_group_id: "",
|
|
1542
|
+
offset: "0",
|
|
1543
|
+
version_code: "190600",
|
|
1544
|
+
version_name: "19.6.0",
|
|
1545
|
+
screen_width: "1552",
|
|
1546
|
+
screen_height: "970",
|
|
1547
|
+
round_trip_time: "50",
|
|
1548
|
+
webid: "7338423850134226495",
|
|
1549
|
+
search_id: data2.search_id ?? "",
|
|
1550
|
+
count: data2.number ?? 10
|
|
1551
|
+
};
|
|
1552
|
+
return `${baseUrl}?${buildQueryString(params)}`;
|
|
1308
1553
|
}
|
|
1554
|
+
/**
|
|
1555
|
+
* 获取互动表情数据的接口地址
|
|
1556
|
+
* @returns 完整的接口URL
|
|
1557
|
+
*/
|
|
1309
1558
|
\u4E92\u52A8\u8868\u60C5() {
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1559
|
+
const baseUrl = "https://www.douyin.com/aweme/v1/web/im/strategy/config";
|
|
1560
|
+
const params = {
|
|
1561
|
+
device_platform: "webapp",
|
|
1562
|
+
aid: "1128",
|
|
1563
|
+
channel: "channel_pc_web",
|
|
1564
|
+
publish_video_strategy_type: "2",
|
|
1565
|
+
app_id: "1128",
|
|
1566
|
+
scenes: "[%22interactive_resources%22]",
|
|
1567
|
+
pc_client_type: "1",
|
|
1568
|
+
version_code: "170400",
|
|
1569
|
+
version_name: "17.4.0",
|
|
1570
|
+
cookie_enabled: "true",
|
|
1571
|
+
screen_width: "2328",
|
|
1572
|
+
screen_height: "1310",
|
|
1573
|
+
browser_language: "zh-CN",
|
|
1574
|
+
browser_platform: "Win32",
|
|
1575
|
+
browser_name: "Chrome",
|
|
1576
|
+
browser_version: "126.0.0.0",
|
|
1577
|
+
browser_online: "true",
|
|
1578
|
+
engine_name: "Blink",
|
|
1579
|
+
engine_version: "126.0.0.0",
|
|
1580
|
+
os_name: "Windows",
|
|
1581
|
+
os_version: "10",
|
|
1582
|
+
cpu_core_num: "16",
|
|
1583
|
+
device_memory: "8",
|
|
1584
|
+
platform: "PC",
|
|
1585
|
+
downlink: "1.5",
|
|
1586
|
+
effective_type: "4g",
|
|
1587
|
+
round_trip_time: "350",
|
|
1588
|
+
webid: "7347329698282833447",
|
|
1589
|
+
msToken: douyinSign.Mstoken(116),
|
|
1590
|
+
verifyFp: fp,
|
|
1591
|
+
fp
|
|
1592
|
+
};
|
|
1593
|
+
return `${baseUrl}?${buildQueryString(params)}`;
|
|
1313
1594
|
}
|
|
1595
|
+
/**
|
|
1596
|
+
* 获取背景音乐数据的接口地址
|
|
1597
|
+
* @param data - 请求参数,包含music_id
|
|
1598
|
+
* @returns 完整的接口URL
|
|
1599
|
+
*/
|
|
1314
1600
|
\u80CC\u666F\u97F3\u4E50(data2) {
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1601
|
+
const baseUrl = "https://www.douyin.com/aweme/v1/web/music/detail/";
|
|
1602
|
+
const params = {
|
|
1603
|
+
device_platform: "webapp",
|
|
1604
|
+
aid: "6383",
|
|
1605
|
+
channel: "channel_pc_web",
|
|
1606
|
+
music_id: data2.music_id,
|
|
1607
|
+
scene: "1",
|
|
1608
|
+
pc_client_type: "1",
|
|
1609
|
+
version_code: "170400",
|
|
1610
|
+
version_name: "17.4.0",
|
|
1611
|
+
cookie_enabled: "true",
|
|
1612
|
+
screen_width: "2328",
|
|
1613
|
+
screen_height: "1310",
|
|
1614
|
+
browser_language: "zh-CN",
|
|
1615
|
+
browser_platform: "Win32",
|
|
1616
|
+
browser_name: "Chrome",
|
|
1617
|
+
browser_version: "126.0.0.0",
|
|
1618
|
+
browser_online: "true",
|
|
1619
|
+
engine_name: "Blink",
|
|
1620
|
+
engine_version: "126.0.0.0",
|
|
1621
|
+
os_name: "Windows",
|
|
1622
|
+
os_version: "10",
|
|
1623
|
+
cpu_core_num: "16",
|
|
1624
|
+
device_memory: "8",
|
|
1625
|
+
platform: "PC",
|
|
1626
|
+
downlink: "1.5",
|
|
1627
|
+
effective_type: "4g",
|
|
1628
|
+
round_trip_time: "350",
|
|
1629
|
+
webid: "7347329698282833447",
|
|
1630
|
+
msToken: douyinSign.Mstoken(116),
|
|
1631
|
+
verifyFp: fp,
|
|
1632
|
+
fp
|
|
1633
|
+
};
|
|
1634
|
+
return `${baseUrl}?${buildQueryString(params)}`;
|
|
1318
1635
|
}
|
|
1636
|
+
/**
|
|
1637
|
+
* 获取直播间信息的接口地址
|
|
1638
|
+
* @param data - 请求参数,包含web_rid、room_id
|
|
1639
|
+
* @returns 完整的接口URL
|
|
1640
|
+
*/
|
|
1319
1641
|
\u76F4\u64AD\u95F4\u4FE1\u606F(data2) {
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1642
|
+
const baseUrl = "https://live.douyin.com/webcast/room/web/enter/";
|
|
1643
|
+
const params = {
|
|
1644
|
+
aid: "6383",
|
|
1645
|
+
app_name: "douyin_web",
|
|
1646
|
+
live_id: "1",
|
|
1647
|
+
device_platform: "web",
|
|
1648
|
+
language: "zh-CN",
|
|
1649
|
+
enter_from: "web_share_link",
|
|
1650
|
+
cookie_enabled: "true",
|
|
1651
|
+
screen_width: "2048",
|
|
1652
|
+
screen_height: "1152",
|
|
1653
|
+
browser_language: "zh-CN",
|
|
1654
|
+
browser_platform: "Win32",
|
|
1655
|
+
browser_name: "Chrome",
|
|
1656
|
+
browser_version: "125.0.0.0",
|
|
1657
|
+
web_rid: data2.web_rid,
|
|
1658
|
+
room_id_str: data2.room_id,
|
|
1659
|
+
enter_source: "",
|
|
1660
|
+
is_need_double_stream: "false",
|
|
1661
|
+
insert_task_id: "",
|
|
1662
|
+
live_reason: "",
|
|
1663
|
+
msToken: douyinSign.Mstoken(116),
|
|
1664
|
+
verifyFp: fp,
|
|
1665
|
+
fp
|
|
1666
|
+
};
|
|
1667
|
+
return `${baseUrl}?${buildQueryString(params)}`;
|
|
1323
1668
|
}
|
|
1669
|
+
/**
|
|
1670
|
+
* 获取申请二维码的接口地址
|
|
1671
|
+
* @param data - 请求参数,包含verify_fp
|
|
1672
|
+
* @returns 完整的接口URL
|
|
1673
|
+
*/
|
|
1324
1674
|
\u7533\u8BF7\u4E8C\u7EF4\u7801(data2) {
|
|
1325
|
-
|
|
1675
|
+
const baseUrl = "https://sso.douyin.com/get_qrcode/";
|
|
1676
|
+
const params = {
|
|
1677
|
+
verifyFp: data2.verify_fp,
|
|
1678
|
+
fp: data2.verify_fp
|
|
1679
|
+
};
|
|
1680
|
+
return `${baseUrl}?${buildQueryString(params)}`;
|
|
1326
1681
|
}
|
|
1327
1682
|
};
|
|
1683
|
+
var createDouyinApiUrls = (userAgent) => {
|
|
1684
|
+
return new DouyinAPI(userAgent);
|
|
1685
|
+
};
|
|
1328
1686
|
var douyinApiUrls = new DouyinAPI();
|
|
1329
1687
|
|
|
1330
1688
|
// src/platform/douyin/getdata.ts
|
|
1331
1689
|
var DouyinData = async (data2, cookie, requestConfig) => {
|
|
1332
|
-
var _a, _b, _c, _d;
|
|
1690
|
+
var _a, _b, _c, _d, _e;
|
|
1333
1691
|
const defHeaders = getDouyinDefaultConfig(cookie)["headers"];
|
|
1334
1692
|
const baseRequestConfig = {
|
|
1335
1693
|
method: "GET",
|
|
@@ -1340,20 +1698,22 @@ var DouyinData = async (data2, cookie, requestConfig) => {
|
|
|
1340
1698
|
...(requestConfig == null ? void 0 : requestConfig.headers) || {}
|
|
1341
1699
|
}
|
|
1342
1700
|
};
|
|
1701
|
+
const userAgent = (_a = baseRequestConfig.headers) == null ? void 0 : _a["User-Agent"];
|
|
1702
|
+
const douyinApiUrls3 = createDouyinApiUrls(userAgent);
|
|
1343
1703
|
switch (data2.methodType) {
|
|
1344
1704
|
case "\u805A\u5408\u89E3\u6790":
|
|
1345
1705
|
case "\u89C6\u9891\u4F5C\u54C1\u6570\u636E":
|
|
1346
1706
|
case "\u56FE\u96C6\u4F5C\u54C1\u6570\u636E":
|
|
1347
1707
|
case "\u5408\u8F91\u4F5C\u54C1\u6570\u636E": {
|
|
1348
|
-
const url =
|
|
1708
|
+
const url = douyinApiUrls3.\u89C6\u9891\u6216\u56FE\u96C6({ aweme_id: data2.aweme_id });
|
|
1349
1709
|
const VideoData = await GlobalGetData2(data2.methodType, {
|
|
1350
1710
|
...baseRequestConfig,
|
|
1351
|
-
url: `${url}&a_bogus=${douyinSign.AB(url)}`
|
|
1711
|
+
url: `${url}&a_bogus=${douyinSign.AB(url, userAgent)}`
|
|
1352
1712
|
});
|
|
1353
1713
|
return VideoData;
|
|
1354
1714
|
}
|
|
1355
1715
|
case "\u8BC4\u8BBA\u6570\u636E": {
|
|
1356
|
-
const urlGenerator = (params) =>
|
|
1716
|
+
const urlGenerator = (params) => douyinApiUrls3.\u8BC4\u8BBA(params);
|
|
1357
1717
|
const response = await fetchPaginatedData(
|
|
1358
1718
|
data2.methodType,
|
|
1359
1719
|
urlGenerator,
|
|
@@ -1364,7 +1724,7 @@ var DouyinData = async (data2, cookie, requestConfig) => {
|
|
|
1364
1724
|
return response;
|
|
1365
1725
|
}
|
|
1366
1726
|
case "\u6307\u5B9A\u8BC4\u8BBA\u56DE\u590D\u6570\u636E": {
|
|
1367
|
-
const urlGenerator = (params) =>
|
|
1727
|
+
const urlGenerator = (params) => douyinApiUrls3.\u4E8C\u7EA7\u8BC4\u8BBA(params);
|
|
1368
1728
|
const customConfig = {
|
|
1369
1729
|
...baseRequestConfig,
|
|
1370
1730
|
headers: {
|
|
@@ -1385,7 +1745,7 @@ var DouyinData = async (data2, cookie, requestConfig) => {
|
|
|
1385
1745
|
return response;
|
|
1386
1746
|
}
|
|
1387
1747
|
case "\u7528\u6237\u4E3B\u9875\u6570\u636E": {
|
|
1388
|
-
const url =
|
|
1748
|
+
const url = douyinApiUrls3.\u7528\u6237\u4E3B\u9875\u4FE1\u606F({ sec_uid: data2.sec_uid });
|
|
1389
1749
|
const customConfig = {
|
|
1390
1750
|
...baseRequestConfig,
|
|
1391
1751
|
headers: {
|
|
@@ -1398,12 +1758,12 @@ var DouyinData = async (data2, cookie, requestConfig) => {
|
|
|
1398
1758
|
};
|
|
1399
1759
|
const UserInfoData = await GlobalGetData2(data2.methodType, {
|
|
1400
1760
|
...customConfig,
|
|
1401
|
-
url: `${url}&a_bogus=${douyinSign.AB(url)}`
|
|
1761
|
+
url: `${url}&a_bogus=${douyinSign.AB(url, userAgent)}`
|
|
1402
1762
|
});
|
|
1403
1763
|
return UserInfoData;
|
|
1404
1764
|
}
|
|
1405
1765
|
case "Emoji\u6570\u636E": {
|
|
1406
|
-
const url =
|
|
1766
|
+
const url = douyinApiUrls3.\u8868\u60C5();
|
|
1407
1767
|
const EmojiData = await GlobalGetData2(data2.methodType, {
|
|
1408
1768
|
...baseRequestConfig,
|
|
1409
1769
|
url
|
|
@@ -1411,7 +1771,7 @@ var DouyinData = async (data2, cookie, requestConfig) => {
|
|
|
1411
1771
|
return EmojiData;
|
|
1412
1772
|
}
|
|
1413
1773
|
case "\u7528\u6237\u4E3B\u9875\u89C6\u9891\u5217\u8868\u6570\u636E": {
|
|
1414
|
-
const url =
|
|
1774
|
+
const url = douyinApiUrls3.\u7528\u6237\u4E3B\u9875\u89C6\u9891({ sec_uid: data2.sec_uid });
|
|
1415
1775
|
const customConfig = {
|
|
1416
1776
|
...baseRequestConfig,
|
|
1417
1777
|
headers: {
|
|
@@ -1423,12 +1783,12 @@ var DouyinData = async (data2, cookie, requestConfig) => {
|
|
|
1423
1783
|
};
|
|
1424
1784
|
const UserVideoListData = await GlobalGetData2(data2.methodType, {
|
|
1425
1785
|
...customConfig,
|
|
1426
|
-
url: `${url}&a_bogus=${douyinSign.AB(url)}`
|
|
1786
|
+
url: `${url}&a_bogus=${douyinSign.AB(url, userAgent)}`
|
|
1427
1787
|
});
|
|
1428
1788
|
return UserVideoListData;
|
|
1429
1789
|
}
|
|
1430
1790
|
case "\u70ED\u70B9\u8BCD\u6570\u636E": {
|
|
1431
|
-
const url =
|
|
1791
|
+
const url = douyinApiUrls3.\u70ED\u70B9\u8BCD({ query: data2.query, number: data2.number ?? 10 });
|
|
1432
1792
|
const customConfig = {
|
|
1433
1793
|
...baseRequestConfig,
|
|
1434
1794
|
headers: {
|
|
@@ -1440,7 +1800,7 @@ var DouyinData = async (data2, cookie, requestConfig) => {
|
|
|
1440
1800
|
};
|
|
1441
1801
|
const SuggestWordsData = await GlobalGetData2(data2.methodType, {
|
|
1442
1802
|
...customConfig,
|
|
1443
|
-
url: `${url}&a_bogus=${douyinSign.AB(url)}`
|
|
1803
|
+
url: `${url}&a_bogus=${douyinSign.AB(url, userAgent)}`
|
|
1444
1804
|
});
|
|
1445
1805
|
return SuggestWordsData;
|
|
1446
1806
|
}
|
|
@@ -1460,16 +1820,16 @@ var DouyinData = async (data2, cookie, requestConfig) => {
|
|
|
1460
1820
|
};
|
|
1461
1821
|
while (fetchedSearchList.length < Number(data2.number ?? 10)) {
|
|
1462
1822
|
const requestCount = Math.min(Number(data2.number ?? 50) - fetchedSearchList.length, maxPageSize);
|
|
1463
|
-
const url =
|
|
1823
|
+
const url = douyinApiUrls3.\u641C\u7D22({
|
|
1464
1824
|
query: data2.query,
|
|
1465
1825
|
number: requestCount,
|
|
1466
1826
|
search_id: search_id === "" ? void 0 : search_id
|
|
1467
1827
|
});
|
|
1468
1828
|
const response = await GlobalGetData2(data2.methodType, {
|
|
1469
1829
|
...customConfig,
|
|
1470
|
-
url: `${url}&a_bogus=${douyinSign.AB(url)}`
|
|
1830
|
+
url: `${url}&a_bogus=${douyinSign.AB(url, userAgent)}`
|
|
1471
1831
|
});
|
|
1472
|
-
if (((
|
|
1832
|
+
if (((_b = response.data) == null ? void 0 : _b.length) === 0) {
|
|
1473
1833
|
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);
|
|
1474
1834
|
return false;
|
|
1475
1835
|
}
|
|
@@ -1478,7 +1838,7 @@ var DouyinData = async (data2, cookie, requestConfig) => {
|
|
|
1478
1838
|
}
|
|
1479
1839
|
fetchedSearchList.push(...response.data);
|
|
1480
1840
|
tmpresp = response;
|
|
1481
|
-
search_id = (
|
|
1841
|
+
search_id = (_c = response.log_pb) == null ? void 0 : _c.impr_id;
|
|
1482
1842
|
}
|
|
1483
1843
|
const finalResponse = {
|
|
1484
1844
|
...tmpresp,
|
|
@@ -1487,24 +1847,24 @@ var DouyinData = async (data2, cookie, requestConfig) => {
|
|
|
1487
1847
|
return finalResponse;
|
|
1488
1848
|
}
|
|
1489
1849
|
case "\u52A8\u6001\u8868\u60C5\u6570\u636E": {
|
|
1490
|
-
const url =
|
|
1850
|
+
const url = douyinApiUrls3.\u4E92\u52A8\u8868\u60C5();
|
|
1491
1851
|
const ExpressionPlusData = await GlobalGetData2(data2.methodType, {
|
|
1492
1852
|
...baseRequestConfig,
|
|
1493
|
-
url: `${url}&a_bogus=${douyinSign.AB(url)}`
|
|
1853
|
+
url: `${url}&a_bogus=${douyinSign.AB(url, userAgent)}`
|
|
1494
1854
|
});
|
|
1495
1855
|
return ExpressionPlusData;
|
|
1496
1856
|
}
|
|
1497
1857
|
case "\u97F3\u4E50\u6570\u636E": {
|
|
1498
|
-
const url =
|
|
1858
|
+
const url = douyinApiUrls3.\u80CC\u666F\u97F3\u4E50({ music_id: data2.music_id });
|
|
1499
1859
|
const MusicData = await GlobalGetData2(data2.methodType, {
|
|
1500
1860
|
...baseRequestConfig,
|
|
1501
|
-
url: `${url}&a_bogus=${douyinSign.AB(url)}`
|
|
1861
|
+
url: `${url}&a_bogus=${douyinSign.AB(url, userAgent)}`
|
|
1502
1862
|
});
|
|
1503
1863
|
return MusicData;
|
|
1504
1864
|
}
|
|
1505
1865
|
case "\u76F4\u64AD\u95F4\u4FE1\u606F\u6570\u636E": {
|
|
1506
|
-
let url =
|
|
1507
|
-
const fetchUrl = `${url}&a_bogus=${douyinSign.AB(url)}`;
|
|
1866
|
+
let url = douyinApiUrls3.\u7528\u6237\u4E3B\u9875\u4FE1\u606F({ sec_uid: data2.sec_uid });
|
|
1867
|
+
const fetchUrl = `${url}&a_bogus=${douyinSign.AB(url, userAgent)}`;
|
|
1508
1868
|
const customConfig = {
|
|
1509
1869
|
...baseRequestConfig,
|
|
1510
1870
|
headers: {
|
|
@@ -1518,8 +1878,8 @@ var DouyinData = async (data2, cookie, requestConfig) => {
|
|
|
1518
1878
|
...customConfig,
|
|
1519
1879
|
url: fetchUrl
|
|
1520
1880
|
});
|
|
1521
|
-
if (!((
|
|
1522
|
-
logger.error((((
|
|
1881
|
+
if (!((_d = UserInfoData == null ? void 0 : UserInfoData.user) == null ? void 0 : _d.live_status) || UserInfoData.user.live_status !== 1) {
|
|
1882
|
+
logger.error((((_e = UserInfoData == null ? void 0 : UserInfoData.user) == null ? void 0 : _e.nickname) || "\u7528\u6237") + "\u5F53\u524D\u672A\u5728\u76F4\u64AD");
|
|
1523
1883
|
const Err = {
|
|
1524
1884
|
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')",
|
|
1525
1885
|
requestType: data2.methodType ?? "\u672A\u77E5\u8BF7\u6C42\u7C7B\u578B",
|
|
@@ -1541,7 +1901,7 @@ var DouyinData = async (data2, cookie, requestConfig) => {
|
|
|
1541
1901
|
};
|
|
1542
1902
|
}
|
|
1543
1903
|
const room_data = JSON.parse(UserInfoData.user.room_data);
|
|
1544
|
-
url =
|
|
1904
|
+
url = douyinApiUrls3.\u76F4\u64AD\u95F4\u4FE1\u606F({ room_id: UserInfoData.user.room_id_str, web_rid: room_data.owner.web_rid });
|
|
1545
1905
|
const liveCustomConfig = {
|
|
1546
1906
|
...baseRequestConfig,
|
|
1547
1907
|
headers: {
|
|
@@ -1553,15 +1913,15 @@ var DouyinData = async (data2, cookie, requestConfig) => {
|
|
|
1553
1913
|
};
|
|
1554
1914
|
const LiveRoomData = await GlobalGetData2(data2.methodType, {
|
|
1555
1915
|
...liveCustomConfig,
|
|
1556
|
-
url: `${url}&a_bogus=${douyinSign.AB(url)}`
|
|
1916
|
+
url: `${url}&a_bogus=${douyinSign.AB(url, userAgent)}`
|
|
1557
1917
|
});
|
|
1558
1918
|
return LiveRoomData;
|
|
1559
1919
|
}
|
|
1560
1920
|
case "\u7533\u8BF7\u4E8C\u7EF4\u7801\u6570\u636E": {
|
|
1561
|
-
const url =
|
|
1921
|
+
const url = douyinApiUrls3.\u7533\u8BF7\u4E8C\u7EF4\u7801({ verify_fp: data2.verify_fp });
|
|
1562
1922
|
const LoginQrcodeStatusData = await GlobalGetData2(data2.methodType, {
|
|
1563
1923
|
...baseRequestConfig,
|
|
1564
|
-
url: `${url}&a_bogus=${douyinSign.AB(url)}`
|
|
1924
|
+
url: `${url}&a_bogus=${douyinSign.AB(url, userAgent)}`
|
|
1565
1925
|
});
|
|
1566
1926
|
return LoginQrcodeStatusData;
|
|
1567
1927
|
}
|
|
@@ -1572,9 +1932,11 @@ var DouyinData = async (data2, cookie, requestConfig) => {
|
|
|
1572
1932
|
}
|
|
1573
1933
|
};
|
|
1574
1934
|
var fetchPaginatedData = async (type, apiUrlGenerator, params, maxPageSize, requestConfig) => {
|
|
1935
|
+
var _a;
|
|
1575
1936
|
let cursor = params.cursor ?? 0;
|
|
1576
1937
|
let fetchedData = [];
|
|
1577
1938
|
let tmpresp = {};
|
|
1939
|
+
const userAgent = (_a = requestConfig.headers) == null ? void 0 : _a["User-Agent"];
|
|
1578
1940
|
while (fetchedData.length < Number(params.number ?? maxPageSize)) {
|
|
1579
1941
|
const requestCount = Math.min(Number(params.number ?? maxPageSize) - fetchedData.length, maxPageSize);
|
|
1580
1942
|
const url = apiUrlGenerator({
|
|
@@ -1584,7 +1946,7 @@ var fetchPaginatedData = async (type, apiUrlGenerator, params, maxPageSize, requ
|
|
|
1584
1946
|
});
|
|
1585
1947
|
const response = await GlobalGetData2(type, {
|
|
1586
1948
|
...requestConfig,
|
|
1587
|
-
url: `${url}&a_bogus=${douyinSign.AB(url)}`
|
|
1949
|
+
url: `${url}&a_bogus=${douyinSign.AB(url, userAgent)}`
|
|
1588
1950
|
});
|
|
1589
1951
|
fetchedData.push(...response.comments || response.data || []);
|
|
1590
1952
|
tmpresp = response;
|
|
@@ -2983,9 +3345,6 @@ var createAmagiClient = (options) => {
|
|
|
2983
3345
|
});
|
|
2984
3346
|
return app;
|
|
2985
3347
|
};
|
|
2986
|
-
const startClient = (port = 4567) => {
|
|
2987
|
-
return startServer(port);
|
|
2988
|
-
};
|
|
2989
3348
|
const getDouyinDataWithCookie = async (methodType, options2) => {
|
|
2990
3349
|
return await getDouyinData(methodType, options2, douyinCookie, requestConfig);
|
|
2991
3350
|
};
|
|
@@ -2998,8 +3357,6 @@ var createAmagiClient = (options) => {
|
|
|
2998
3357
|
return {
|
|
2999
3358
|
/** 启动本地HTTP服务 */
|
|
3000
3359
|
startServer,
|
|
3001
|
-
/** @deprecated 此方法已废弃,请使用 startServer 方法代替 */
|
|
3002
|
-
startClient,
|
|
3003
3360
|
getDouyinData: getDouyinDataWithCookie,
|
|
3004
3361
|
getBilibiliData: getBilibiliDataWithCookie,
|
|
3005
3362
|
getKuaishouData: getKuaishouDataWithCookie,
|