@ikenxuan/amagi 5.6.3 → 5.7.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.
- package/dist/chunk-CUT6urMc.cjs +30 -0
- package/dist/default/index.cjs +4725 -0
- package/dist/default/index.d.cts +22053 -0
- package/dist/default/index.d.ts +18436 -17498
- package/dist/default/index.js +4622 -0
- package/dist/exports/axios.cjs +4 -15
- package/dist/exports/axios.d.ts +2 -2
- package/dist/exports/axios.js +5 -2
- package/dist/exports/chalk.cjs +5 -8
- package/dist/exports/chalk.d.ts +1 -1
- package/dist/exports/chalk.js +3 -1
- package/dist/exports/express.cjs +4 -10
- package/dist/exports/express.d.ts +1 -1
- package/dist/exports/express.js +3 -1
- package/dist/exports/log4js.cjs +4 -15
- package/dist/exports/log4js.d.ts +2 -2
- package/dist/exports/log4js.js +5 -2
- package/package.json +9 -6
- package/dist/default/cjs/index.cjs +0 -4750
- package/dist/default/esm/index.mjs +0 -4646
|
@@ -1,4750 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
-
|
|
5
|
-
var chalk = require('chalk');
|
|
6
|
-
var log4js = require('log4js');
|
|
7
|
-
var path = require('path');
|
|
8
|
-
var URL2 = require('url');
|
|
9
|
-
var fs = require('fs');
|
|
10
|
-
var axios = require('axios');
|
|
11
|
-
var crypto = require('crypto');
|
|
12
|
-
var zod = require('zod');
|
|
13
|
-
var xhshowTs = require('@ikenxuan/xhshow-ts');
|
|
14
|
-
var express = require('express');
|
|
15
|
-
|
|
16
|
-
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
17
|
-
|
|
18
|
-
var log4js__default = /*#__PURE__*/_interopDefault(log4js);
|
|
19
|
-
var path__default = /*#__PURE__*/_interopDefault(path);
|
|
20
|
-
var URL2__default = /*#__PURE__*/_interopDefault(URL2);
|
|
21
|
-
var fs__default = /*#__PURE__*/_interopDefault(fs);
|
|
22
|
-
var axios__default = /*#__PURE__*/_interopDefault(axios);
|
|
23
|
-
var crypto__default = /*#__PURE__*/_interopDefault(crypto);
|
|
24
|
-
var express__default = /*#__PURE__*/_interopDefault(express);
|
|
25
|
-
|
|
26
|
-
/*!
|
|
27
|
-
* @ikenxuan/amagi
|
|
28
|
-
* Copyright(c) 2023 ikenxuan
|
|
29
|
-
* GPL-3.0 Licensed
|
|
30
|
-
*/
|
|
31
|
-
|
|
32
|
-
// node_modules/.pnpm/tsup@8.5.0_@swc+core@1.13.20_tsx@4.20.6_typescript@5.8.3_yaml@2.8.1/node_modules/tsup/assets/cjs_shims.js
|
|
33
|
-
var getImportMetaUrl = () => typeof document === "undefined" ? new URL(`file:${__filename}`).href : document.currentScript && document.currentScript.src || new URL("main.js", document.baseURI).href;
|
|
34
|
-
var importMetaUrl = /* @__PURE__ */ getImportMetaUrl();
|
|
35
|
-
var getPackageLogsPath = () => {
|
|
36
|
-
const currentFileUrl = importMetaUrl;
|
|
37
|
-
const currentFilePath = URL2.fileURLToPath(currentFileUrl);
|
|
38
|
-
const currentDir = path__default.default.dirname(currentFilePath);
|
|
39
|
-
let packageRoot = currentDir;
|
|
40
|
-
while (packageRoot !== path__default.default.dirname(packageRoot)) {
|
|
41
|
-
if (fs__default.default.existsSync(path__default.default.join(packageRoot, "package.json"))) {
|
|
42
|
-
break;
|
|
43
|
-
}
|
|
44
|
-
packageRoot = path__default.default.dirname(packageRoot);
|
|
45
|
-
}
|
|
46
|
-
return path__default.default.join(packageRoot, "logs");
|
|
47
|
-
};
|
|
48
|
-
var logsPath = getPackageLogsPath();
|
|
49
|
-
var getLogLevel = () => {
|
|
50
|
-
const logLevel = process.env.LOG_LEVEL || "info";
|
|
51
|
-
return logLevel;
|
|
52
|
-
};
|
|
53
|
-
var currentLogLevel = getLogLevel();
|
|
54
|
-
log4js__default.default.configure({
|
|
55
|
-
appenders: {
|
|
56
|
-
console: {
|
|
57
|
-
type: "stdout",
|
|
58
|
-
layout: {
|
|
59
|
-
type: "pattern",
|
|
60
|
-
pattern: "%[[amagi][%d{hh:mm:ss.SSS}][%4.4p]%] %m"
|
|
61
|
-
}
|
|
62
|
-
},
|
|
63
|
-
command: {
|
|
64
|
-
type: "dateFile",
|
|
65
|
-
filename: path__default.default.join(logsPath, "application", "command"),
|
|
66
|
-
pattern: "yyyy-MM-dd.log",
|
|
67
|
-
numBackups: 15,
|
|
68
|
-
alwaysIncludePattern: true,
|
|
69
|
-
layout: {
|
|
70
|
-
type: "pattern",
|
|
71
|
-
pattern: "[%d{hh:mm:ss.SSS}][%4.4p] %m"
|
|
72
|
-
}
|
|
73
|
-
},
|
|
74
|
-
httpConsole: {
|
|
75
|
-
type: "stdout",
|
|
76
|
-
layout: {
|
|
77
|
-
type: "pattern",
|
|
78
|
-
pattern: "%[[amagi][%d{hh:mm:ss.SSS}][HTTP]%] %m"
|
|
79
|
-
}
|
|
80
|
-
},
|
|
81
|
-
httpRequest: {
|
|
82
|
-
type: "dateFile",
|
|
83
|
-
filename: path__default.default.join(logsPath, "http", "requests"),
|
|
84
|
-
pattern: "yyyy-MM-dd.log",
|
|
85
|
-
numBackups: 30,
|
|
86
|
-
alwaysIncludePattern: true,
|
|
87
|
-
layout: {
|
|
88
|
-
type: "pattern",
|
|
89
|
-
pattern: "[%d{hh:mm:ss.SSS}][%4.4p] %m"
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
},
|
|
93
|
-
categories: {
|
|
94
|
-
default: { appenders: ["console", "command"], level: currentLogLevel },
|
|
95
|
-
http: { appenders: ["httpConsole", "httpRequest"], level: "debug" }
|
|
96
|
-
},
|
|
97
|
-
pm2: true
|
|
98
|
-
});
|
|
99
|
-
var CustomLogger = class {
|
|
100
|
-
logger;
|
|
101
|
-
chalk;
|
|
102
|
-
red;
|
|
103
|
-
green;
|
|
104
|
-
yellow;
|
|
105
|
-
blue;
|
|
106
|
-
magenta;
|
|
107
|
-
cyan;
|
|
108
|
-
white;
|
|
109
|
-
gray;
|
|
110
|
-
constructor(name) {
|
|
111
|
-
this.logger = log4js__default.default.getLogger(name);
|
|
112
|
-
this.chalk = new chalk.Chalk();
|
|
113
|
-
this.red = this.chalk.red;
|
|
114
|
-
this.green = this.chalk.green;
|
|
115
|
-
this.yellow = this.chalk.yellow;
|
|
116
|
-
this.blue = this.chalk.blue;
|
|
117
|
-
this.magenta = this.chalk.magenta;
|
|
118
|
-
this.cyan = this.chalk.cyan;
|
|
119
|
-
this.white = this.chalk.white;
|
|
120
|
-
this.gray = this.chalk.gray;
|
|
121
|
-
}
|
|
122
|
-
// 代理 log4js.Logger 的方法
|
|
123
|
-
info(message, ...args) {
|
|
124
|
-
this.logger.info(message, ...args);
|
|
125
|
-
}
|
|
126
|
-
warn(message, ...args) {
|
|
127
|
-
this.logger.warn(message, ...args);
|
|
128
|
-
}
|
|
129
|
-
error(message, ...args) {
|
|
130
|
-
this.logger.error(message, ...args);
|
|
131
|
-
}
|
|
132
|
-
mark(message, ...args) {
|
|
133
|
-
this.logger.mark(message, ...args);
|
|
134
|
-
}
|
|
135
|
-
debug(message, ...args) {
|
|
136
|
-
this.logger.debug(message, ...args);
|
|
137
|
-
}
|
|
138
|
-
};
|
|
139
|
-
var logger = new CustomLogger("default");
|
|
140
|
-
var httpLogger = new CustomLogger("http");
|
|
141
|
-
var logMiddleware = (pathsToLog) => {
|
|
142
|
-
return (req, res, next) => {
|
|
143
|
-
if (!pathsToLog || pathsToLog.some((path2) => req.url.startsWith(path2))) {
|
|
144
|
-
const startTime = Date.now();
|
|
145
|
-
const url = req.url;
|
|
146
|
-
const method = req.method;
|
|
147
|
-
const clientIP = req.headers["x-forwarded-for"] || req.socket.remoteAddress;
|
|
148
|
-
const referer = req.headers["referer"] || req.headers["referrer"] || "-";
|
|
149
|
-
const contentType = req.headers["content-type"] || "-";
|
|
150
|
-
const requestSize = req.headers["content-length"] || "0";
|
|
151
|
-
const protocol = req.protocol;
|
|
152
|
-
const httpVersion = req.httpVersion;
|
|
153
|
-
res.on("finish", () => {
|
|
154
|
-
const responseTime = Date.now() - startTime;
|
|
155
|
-
const statusCode = res.statusCode;
|
|
156
|
-
const responseSize = res.get("content-length") || "0";
|
|
157
|
-
const logData = {
|
|
158
|
-
method,
|
|
159
|
-
url,
|
|
160
|
-
statusCode,
|
|
161
|
-
responseTime: `${responseTime}ms`,
|
|
162
|
-
clientIP,
|
|
163
|
-
referer,
|
|
164
|
-
contentType,
|
|
165
|
-
requestSize: `${requestSize}B`,
|
|
166
|
-
responseSize: `${responseSize}B`,
|
|
167
|
-
protocol,
|
|
168
|
-
httpVersion,
|
|
169
|
-
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
170
|
-
};
|
|
171
|
-
httpLogger.debug(JSON.stringify(logData));
|
|
172
|
-
});
|
|
173
|
-
}
|
|
174
|
-
next();
|
|
175
|
-
};
|
|
176
|
-
};
|
|
177
|
-
var cleanUserAgent = (userAgent) => {
|
|
178
|
-
return userAgent.replace(/\s+Edg\/[\d\.]+/g, "");
|
|
179
|
-
};
|
|
180
|
-
var fetchData = async (config) => {
|
|
181
|
-
try {
|
|
182
|
-
const cleanedConfig = { ...config };
|
|
183
|
-
if (cleanedConfig.headers && cleanedConfig.headers["User-Agent"]) {
|
|
184
|
-
cleanedConfig.headers["User-Agent"] = cleanUserAgent(cleanedConfig.headers["User-Agent"]);
|
|
185
|
-
}
|
|
186
|
-
const response = await axios__default.default({ ...cleanedConfig, validateStatus: () => true });
|
|
187
|
-
return response.data;
|
|
188
|
-
} catch (error) {
|
|
189
|
-
if (error instanceof axios.AxiosError) {
|
|
190
|
-
logger.error("\u7F51\u7EDC\u8BF7\u6C42\u5931\u8D25:", error.message);
|
|
191
|
-
throw error;
|
|
192
|
-
}
|
|
193
|
-
throw error;
|
|
194
|
-
}
|
|
195
|
-
};
|
|
196
|
-
var normalizeHeaders = (headers) => {
|
|
197
|
-
if (headers && typeof headers.toJSON === "function") {
|
|
198
|
-
return headers.toJSON();
|
|
199
|
-
}
|
|
200
|
-
return headers || {};
|
|
201
|
-
};
|
|
202
|
-
var fetchResponse = async (config) => {
|
|
203
|
-
try {
|
|
204
|
-
const cleanedConfig = { ...config };
|
|
205
|
-
if (cleanedConfig.headers && cleanedConfig.headers["User-Agent"]) {
|
|
206
|
-
cleanedConfig.headers["User-Agent"] = cleanUserAgent(cleanedConfig.headers["User-Agent"]);
|
|
207
|
-
}
|
|
208
|
-
return await axios__default.default({ ...cleanedConfig, validateStatus: () => true });
|
|
209
|
-
} catch (error) {
|
|
210
|
-
if (error instanceof axios.AxiosError) {
|
|
211
|
-
throw error;
|
|
212
|
-
}
|
|
213
|
-
throw new Error("\u7F51\u7EDC\u8BF7\u6C42\u5931\u8D25");
|
|
214
|
-
}
|
|
215
|
-
};
|
|
216
|
-
var getHeadersAndData = async (config) => {
|
|
217
|
-
try {
|
|
218
|
-
const response = await fetchResponse(config);
|
|
219
|
-
return {
|
|
220
|
-
headers: normalizeHeaders(response.headers),
|
|
221
|
-
data: response.data
|
|
222
|
-
};
|
|
223
|
-
} catch (error) {
|
|
224
|
-
logger.error("\u83B7\u53D6\u54CD\u5E94\u5934\u548C\u6570\u636E\u5931\u8D25:", error);
|
|
225
|
-
return {
|
|
226
|
-
headers: {},
|
|
227
|
-
data: {}
|
|
228
|
-
};
|
|
229
|
-
}
|
|
230
|
-
};
|
|
231
|
-
|
|
232
|
-
// src/platform/bilibili/qtparam.ts
|
|
233
|
-
var qtparam = async (BASEURL, cookie) => {
|
|
234
|
-
if (cookie === "") return { QUERY: "&platform=html5", STATUS: "!isLogin" };
|
|
235
|
-
const logininfo = await fetchData({ url: bilibiliApiUrls.\u767B\u5F55\u57FA\u672C\u4FE1\u606F(), headers: { Cookie: cookie } });
|
|
236
|
-
const sign = await wbi_sign(BASEURL, cookie);
|
|
237
|
-
const qn = [6, 16, 32, 64, 74, 80, 112, 116, 120, 125, 126, 127];
|
|
238
|
-
let isvip;
|
|
239
|
-
logininfo.data.vipStatus === 1 ? isvip = true : isvip = false;
|
|
240
|
-
if (isvip) {
|
|
241
|
-
const fnval = 4048;
|
|
242
|
-
return {
|
|
243
|
-
QUERY: `&fnval=${fnval}&fourk=1&${sign}`,
|
|
244
|
-
STATUS: "isLogin",
|
|
245
|
-
isvip
|
|
246
|
-
};
|
|
247
|
-
} else {
|
|
248
|
-
return {
|
|
249
|
-
QUERY: `&qn=${qn[3]}&fnval=16&${sign}`,
|
|
250
|
-
STATUS: "isLogin",
|
|
251
|
-
isvip
|
|
252
|
-
};
|
|
253
|
-
}
|
|
254
|
-
};
|
|
255
|
-
|
|
256
|
-
// src/platform/bilibili/sign/bv2av.ts
|
|
257
|
-
var XOR_CODE = 23442827791579n;
|
|
258
|
-
var MASK_CODE = 2251799813685247n;
|
|
259
|
-
var MAX_AID = 1n << 51n;
|
|
260
|
-
var BASE = 58n;
|
|
261
|
-
var data = "FcwAPNKTMug3GV5Lj7EJnHpWsx4tb8haYeviqBz6rkCy12mUSDQX9RdoZf";
|
|
262
|
-
var av2bv = (aid) => {
|
|
263
|
-
const bytes = ["B", "V", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0"];
|
|
264
|
-
let bvIndex = bytes.length - 1;
|
|
265
|
-
let tmp = (MAX_AID | BigInt(aid)) ^ XOR_CODE;
|
|
266
|
-
while (tmp > 0) {
|
|
267
|
-
bytes[bvIndex] = data[Number(tmp % BigInt(BASE))];
|
|
268
|
-
tmp = tmp / BASE;
|
|
269
|
-
bvIndex -= 1;
|
|
270
|
-
}
|
|
271
|
-
[bytes[3], bytes[9]] = [bytes[9], bytes[3]];
|
|
272
|
-
[bytes[4], bytes[7]] = [bytes[7], bytes[4]];
|
|
273
|
-
return bytes.join("");
|
|
274
|
-
};
|
|
275
|
-
var bv2av = (bvid) => {
|
|
276
|
-
const bvidArr = Array.from(bvid);
|
|
277
|
-
[bvidArr[3], bvidArr[9]] = [bvidArr[9], bvidArr[3]];
|
|
278
|
-
[bvidArr[4], bvidArr[7]] = [bvidArr[7], bvidArr[4]];
|
|
279
|
-
bvidArr.splice(0, 3);
|
|
280
|
-
const tmp = bvidArr.reduce((pre, bvidChar) => pre * BASE + BigInt(data.indexOf(bvidChar)), 0n);
|
|
281
|
-
return Number(tmp & MASK_CODE ^ XOR_CODE);
|
|
282
|
-
};
|
|
283
|
-
|
|
284
|
-
// src/platform/bilibili/API.ts
|
|
285
|
-
var BiLiBiLiAPI = class {
|
|
286
|
-
\u767B\u5F55\u57FA\u672C\u4FE1\u606F() {
|
|
287
|
-
return "https://api.bilibili.com/x/web-interface/nav";
|
|
288
|
-
}
|
|
289
|
-
\u89C6\u9891\u8BE6\u7EC6\u4FE1\u606F(data2) {
|
|
290
|
-
return `https://api.bilibili.com/x/web-interface/view?bvid=${data2.bvid}`;
|
|
291
|
-
}
|
|
292
|
-
\u89C6\u9891\u6D41\u4FE1\u606F(data2) {
|
|
293
|
-
return `https://api.bilibili.com/x/player/playurl?avid=${data2.avid}&cid=${data2.cid}`;
|
|
294
|
-
}
|
|
295
|
-
/** 评论区类型,type参数详见 [评论区类型代码](https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/docs/comment/readme.md#评论区类型代码) */
|
|
296
|
-
\u8BC4\u8BBA\u533A\u660E\u7EC6(data2) {
|
|
297
|
-
const params = new URLSearchParams({
|
|
298
|
-
oid: data2.oid.toString(),
|
|
299
|
-
type: data2.type.toString(),
|
|
300
|
-
mode: (data2.mode ?? 3).toString(),
|
|
301
|
-
plat: "1",
|
|
302
|
-
seek_rpid: "",
|
|
303
|
-
web_location: "1315875"
|
|
304
|
-
});
|
|
305
|
-
if (data2.pagination_str) {
|
|
306
|
-
params.append("pagination_str", JSON.stringify({ offset: data2.pagination_str }));
|
|
307
|
-
} else {
|
|
308
|
-
params.append("pagination_str", JSON.stringify({ offset: "" }));
|
|
309
|
-
}
|
|
310
|
-
return `https://api.bilibili.com/x/v2/reply/wbi/main?${params.toString()}`;
|
|
311
|
-
}
|
|
312
|
-
\u8BC4\u8BBA\u533A\u72B6\u6001(data2) {
|
|
313
|
-
return `https://api.bilibili.com/x/v2/reply/subject/description?type=${data2.type}&oid=${data2.oid}`;
|
|
314
|
-
}
|
|
315
|
-
\u8868\u60C5\u5217\u8868() {
|
|
316
|
-
return "https://api.bilibili.com/x/emote/user/panel/web?business=reply&web_location=0.0";
|
|
317
|
-
}
|
|
318
|
-
\u756A\u5267\u660E\u7EC6(data2) {
|
|
319
|
-
if (data2.ep_id) {
|
|
320
|
-
return `https://api.bilibili.com/pgc/view/web/season?ep_id=${data2.ep_id}`;
|
|
321
|
-
} else if (data2.season_id) {
|
|
322
|
-
return `https://api.bilibili.com/pgc/view/web/season?season_id=${data2.season_id}`;
|
|
323
|
-
} else {
|
|
324
|
-
throw new Error("\u62DF\u9020\u63A5\u53E3\u5730\u5740\u51FA\u9519\uFF0C\u7F3A\u5C11 ep_id \u6216 season_id \u53C2\u6570");
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
\u756A\u5267\u89C6\u9891\u6D41\u4FE1\u606F(data2) {
|
|
328
|
-
return `https://api.bilibili.com/pgc/player/web/playurl?cid=${data2.cid}&ep_id=${data2.ep_id}`;
|
|
329
|
-
}
|
|
330
|
-
\u7528\u6237\u7A7A\u95F4\u52A8\u6001(data2) {
|
|
331
|
-
return `https://api.bilibili.com/x/polymer/web-dynamic/v1/feed/space?host_mid=${data2.host_mid}&features=itemOpusStyle,listOnlyfans,opusBigCover,onlyfansVote,forwardListHidden,decorationCard,commentsNewVersion,onlyfansAssetsV2,ugcDelete,onlyfansQaCard`;
|
|
332
|
-
}
|
|
333
|
-
\u52A8\u6001\u8BE6\u60C5(data2) {
|
|
334
|
-
return `https://api.bilibili.com/x/polymer/web-dynamic/v1/detail?id=${data2.dynamic_id}&features=itemOpusStyle,opusBigCover,onlyfansVote,endFooterHidden,decorationCard,onlyfansAssetsV2,ugcDelete,onlyfansQaCard,editable,opusPrivateVisible,avatarAutoTheme`;
|
|
335
|
-
}
|
|
336
|
-
\u52A8\u6001\u5361\u7247\u4FE1\u606F(data2) {
|
|
337
|
-
return `https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/get_dynamic_detail?dynamic_id=${data2.dynamic_id}`;
|
|
338
|
-
}
|
|
339
|
-
\u7528\u6237\u540D\u7247\u4FE1\u606F(data2) {
|
|
340
|
-
return `https://api.bilibili.com/x/web-interface/card?mid=${data2.host_mid}&photo=true`;
|
|
341
|
-
}
|
|
342
|
-
\u76F4\u64AD\u95F4\u4FE1\u606F(data2) {
|
|
343
|
-
return `https://api.live.bilibili.com/room/v1/Room/get_info?room_id=${data2.room_id}`;
|
|
344
|
-
}
|
|
345
|
-
\u76F4\u64AD\u95F4\u521D\u59CB\u5316\u4FE1\u606F(data2) {
|
|
346
|
-
return `https://api.live.bilibili.com/room/v1/Room/room_init?id=${data2.room_id}`;
|
|
347
|
-
}
|
|
348
|
-
\u7533\u8BF7\u4E8C\u7EF4\u7801() {
|
|
349
|
-
return "https://passport.bilibili.com/x/passport-login/web/qrcode/generate";
|
|
350
|
-
}
|
|
351
|
-
\u4E8C\u7EF4\u7801\u72B6\u6001(data2) {
|
|
352
|
-
return `https://passport.bilibili.com/x/passport-login/web/qrcode/poll?qrcode_key=${data2.qrcode_key}`;
|
|
353
|
-
}
|
|
354
|
-
\u83B7\u53D6UP\u4E3B\u603B\u64AD\u653E\u91CF(data2) {
|
|
355
|
-
return `https://api.bilibili.com/x/space/upstat?mid=${data2.host_mid}`;
|
|
356
|
-
}
|
|
357
|
-
};
|
|
358
|
-
var bilibiliApiUrls = new BiLiBiLiAPI();
|
|
359
|
-
|
|
360
|
-
// src/types/NetworksConfigType.ts
|
|
361
|
-
var kuaishouAPIErrorCode = /* @__PURE__ */ ((kuaishouAPIErrorCode2) => {
|
|
362
|
-
kuaishouAPIErrorCode2["COOKIE"] = "INVALID_COOKIE";
|
|
363
|
-
kuaishouAPIErrorCode2["UNKNOWN"] = "UNKNOWN_ERROR" /* UNKNOWN */;
|
|
364
|
-
return kuaishouAPIErrorCode2;
|
|
365
|
-
})(kuaishouAPIErrorCode || {});
|
|
366
|
-
var xiaohongshuAPIErrorCode = /* @__PURE__ */ ((xiaohongshuAPIErrorCode2) => {
|
|
367
|
-
xiaohongshuAPIErrorCode2["COOKIE"] = "INVALID_COOKIE";
|
|
368
|
-
xiaohongshuAPIErrorCode2["UNKNOWN"] = "UNKNOWN_ERROR" /* UNKNOWN */;
|
|
369
|
-
xiaohongshuAPIErrorCode2[xiaohongshuAPIErrorCode2["ILLEGAL_REQUEST"] = 500] = "ILLEGAL_REQUEST";
|
|
370
|
-
xiaohongshuAPIErrorCode2[xiaohongshuAPIErrorCode2["ACCOUNT_ABNORMAL"] = 300011] = "ACCOUNT_ABNORMAL";
|
|
371
|
-
xiaohongshuAPIErrorCode2[xiaohongshuAPIErrorCode2["NETWORK_ERROR"] = 300012] = "NETWORK_ERROR";
|
|
372
|
-
xiaohongshuAPIErrorCode2[xiaohongshuAPIErrorCode2["FREQUENCY_ERROR"] = 300013] = "FREQUENCY_ERROR";
|
|
373
|
-
xiaohongshuAPIErrorCode2[xiaohongshuAPIErrorCode2["BROWSER_ERROR"] = 300015] = "BROWSER_ERROR";
|
|
374
|
-
return xiaohongshuAPIErrorCode2;
|
|
375
|
-
})(xiaohongshuAPIErrorCode || {});
|
|
376
|
-
var mixinKeyEncTab = [
|
|
377
|
-
46,
|
|
378
|
-
47,
|
|
379
|
-
18,
|
|
380
|
-
2,
|
|
381
|
-
53,
|
|
382
|
-
8,
|
|
383
|
-
23,
|
|
384
|
-
32,
|
|
385
|
-
15,
|
|
386
|
-
50,
|
|
387
|
-
10,
|
|
388
|
-
31,
|
|
389
|
-
58,
|
|
390
|
-
3,
|
|
391
|
-
45,
|
|
392
|
-
35,
|
|
393
|
-
27,
|
|
394
|
-
43,
|
|
395
|
-
5,
|
|
396
|
-
49,
|
|
397
|
-
33,
|
|
398
|
-
9,
|
|
399
|
-
42,
|
|
400
|
-
19,
|
|
401
|
-
29,
|
|
402
|
-
28,
|
|
403
|
-
14,
|
|
404
|
-
39,
|
|
405
|
-
12,
|
|
406
|
-
38,
|
|
407
|
-
41,
|
|
408
|
-
13,
|
|
409
|
-
37,
|
|
410
|
-
48,
|
|
411
|
-
7,
|
|
412
|
-
16,
|
|
413
|
-
24,
|
|
414
|
-
55,
|
|
415
|
-
40,
|
|
416
|
-
61,
|
|
417
|
-
26,
|
|
418
|
-
17,
|
|
419
|
-
0,
|
|
420
|
-
1,
|
|
421
|
-
60,
|
|
422
|
-
51,
|
|
423
|
-
30,
|
|
424
|
-
4,
|
|
425
|
-
22,
|
|
426
|
-
25,
|
|
427
|
-
54,
|
|
428
|
-
21,
|
|
429
|
-
56,
|
|
430
|
-
59,
|
|
431
|
-
6,
|
|
432
|
-
63,
|
|
433
|
-
57,
|
|
434
|
-
62,
|
|
435
|
-
11,
|
|
436
|
-
36,
|
|
437
|
-
20,
|
|
438
|
-
34,
|
|
439
|
-
44,
|
|
440
|
-
52
|
|
441
|
-
];
|
|
442
|
-
var getMixinKey = (orig) => mixinKeyEncTab.map((n) => orig[n]).join("").slice(0, 32);
|
|
443
|
-
var encWbi = (params, img_key, sub_key) => {
|
|
444
|
-
const mixin_key = getMixinKey(img_key + sub_key);
|
|
445
|
-
const curr_time = Math.round(Date.now() / 1e3);
|
|
446
|
-
const chr_filter = /[!'()*]/g;
|
|
447
|
-
Object.assign(params, { wts: curr_time });
|
|
448
|
-
const query = Object.keys(params).sort().map((key) => {
|
|
449
|
-
const value = params[key].toString().replace(chr_filter, "");
|
|
450
|
-
return `${encodeURIComponent(key)}=${encodeURIComponent(value)}`;
|
|
451
|
-
}).join("&");
|
|
452
|
-
const wbi_sign2 = crypto__default.default.createHash("md5").update(query + mixin_key).digest("hex");
|
|
453
|
-
return `&wts=${curr_time}&w_rid=${wbi_sign2}`;
|
|
454
|
-
};
|
|
455
|
-
var getWbiKeys = async (cookie) => {
|
|
456
|
-
const res = await axios__default.default("https://api.bilibili.com/x/web-interface/nav", {
|
|
457
|
-
headers: {
|
|
458
|
-
Cookie: cookie
|
|
459
|
-
}
|
|
460
|
-
});
|
|
461
|
-
const response = res.data;
|
|
462
|
-
const {
|
|
463
|
-
data: {
|
|
464
|
-
wbi_img: { img_url, sub_url }
|
|
465
|
-
}
|
|
466
|
-
} = response;
|
|
467
|
-
return {
|
|
468
|
-
img_key: img_url.slice(img_url.lastIndexOf("/") + 1, img_url.lastIndexOf(".")),
|
|
469
|
-
sub_key: sub_url.slice(sub_url.lastIndexOf("/") + 1, sub_url.lastIndexOf("."))
|
|
470
|
-
};
|
|
471
|
-
};
|
|
472
|
-
var wbi_sign = async (BASEURL, cookie) => {
|
|
473
|
-
const web_keys = await getWbiKeys(cookie);
|
|
474
|
-
const url = new URL(BASEURL);
|
|
475
|
-
const params = {};
|
|
476
|
-
for (const [key, value] of url.searchParams.entries()) {
|
|
477
|
-
params[key] = value;
|
|
478
|
-
}
|
|
479
|
-
const query = encWbi(params, web_keys.img_key, web_keys.sub_key);
|
|
480
|
-
return query;
|
|
481
|
-
};
|
|
482
|
-
|
|
483
|
-
// src/platform/defaultConfigs.ts
|
|
484
|
-
var generateSecChUa = (userAgent) => {
|
|
485
|
-
const chromeMatch = userAgent.match(/Chrome\/(\d+)/);
|
|
486
|
-
const chromeVersion = chromeMatch ? chromeMatch[1] : "125";
|
|
487
|
-
return `"Not)A;Brand";v="8", "Chromium";v="${chromeVersion}", "Google Chrome";v="${chromeVersion}"`;
|
|
488
|
-
};
|
|
489
|
-
var getDouyinDefaultConfig = (cookie, requestConfig) => {
|
|
490
|
-
var _a;
|
|
491
|
-
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";
|
|
492
|
-
finalUserAgent = finalUserAgent.replace(/\s+Edg\/[\d\.]+/g, "");
|
|
493
|
-
const defHeaders = {
|
|
494
|
-
Accept: "application/json, text/plain, */*",
|
|
495
|
-
"Accept-Encoding": "gzip, deflate, br, zstd",
|
|
496
|
-
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
|
|
497
|
-
Cookie: cookie ? cookie.replace(/\s+/g, "") : "",
|
|
498
|
-
Priority: "u=1, i",
|
|
499
|
-
Referer: "https://www.douyin.com/",
|
|
500
|
-
"Sec-Ch-Ua": generateSecChUa(finalUserAgent),
|
|
501
|
-
"Sec-Ch-Ua-Mobile": "?0",
|
|
502
|
-
"Sec-Ch-Ua-Platform": '"Windows"',
|
|
503
|
-
"Sec-Fetch-Dest": "empty",
|
|
504
|
-
"Sec-Fetch-Mode": "cors",
|
|
505
|
-
"Sec-Fetch-Site": "same-origin",
|
|
506
|
-
"User-Agent": finalUserAgent
|
|
507
|
-
};
|
|
508
|
-
return {
|
|
509
|
-
method: "GET",
|
|
510
|
-
timeout: 1e4,
|
|
511
|
-
...requestConfig,
|
|
512
|
-
headers: {
|
|
513
|
-
...defHeaders,
|
|
514
|
-
...{}
|
|
515
|
-
}
|
|
516
|
-
};
|
|
517
|
-
};
|
|
518
|
-
var getBilibiliDefaultConfig = (cookie, requestConfig) => {
|
|
519
|
-
const defHeaders = {
|
|
520
|
-
Accept: "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
|
|
521
|
-
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
|
|
522
|
-
"Cache-Control": "max-age=0",
|
|
523
|
-
Priority: "u=0, i",
|
|
524
|
-
"Sec-Ch-Ua": '"Microsoft Edge";v="131", "Chromium";v="131", "Not_A Brand";v="24"',
|
|
525
|
-
"Sec-Ch-Ua-Mobile": "?0",
|
|
526
|
-
"Sec-Ch-Ua-Platform": '"Windows"',
|
|
527
|
-
"Sec-Fetch-Dest": "document",
|
|
528
|
-
"Sec-Fetch-Mode": "navigate",
|
|
529
|
-
"Sec-Fetch-Site": "none",
|
|
530
|
-
"Sec-Fetch-User": "?1",
|
|
531
|
-
"Upgrade-Insecure-Requests": "1",
|
|
532
|
-
Referer: "https://www.bilibili.com/",
|
|
533
|
-
Cookie: cookie ? cookie.replace(/\s+/g, "") : ""
|
|
534
|
-
};
|
|
535
|
-
return {
|
|
536
|
-
method: "GET",
|
|
537
|
-
timeout: 1e4,
|
|
538
|
-
...requestConfig,
|
|
539
|
-
headers: {
|
|
540
|
-
...defHeaders,
|
|
541
|
-
...{}
|
|
542
|
-
}
|
|
543
|
-
};
|
|
544
|
-
};
|
|
545
|
-
var getKuaishouDefaultConfig = (cookie, requestConfig) => {
|
|
546
|
-
const defHeaders = {
|
|
547
|
-
Referer: "https://www.kuaishou.com/new-reco",
|
|
548
|
-
Origin: "https://www.kuaishou.com",
|
|
549
|
-
Accept: "application/json, text/plain, */*",
|
|
550
|
-
"Accept-Encoding": "gzip, deflate, br, zstd",
|
|
551
|
-
"Content-Type": "application/json",
|
|
552
|
-
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
|
|
553
|
-
Priority: "u=0, i",
|
|
554
|
-
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0",
|
|
555
|
-
Cookie: cookie ? cookie.replace(/\s+/g, "") : ""
|
|
556
|
-
};
|
|
557
|
-
return {
|
|
558
|
-
method: "POST",
|
|
559
|
-
timeout: 1e4,
|
|
560
|
-
...requestConfig,
|
|
561
|
-
headers: {
|
|
562
|
-
...defHeaders,
|
|
563
|
-
...{}
|
|
564
|
-
}
|
|
565
|
-
};
|
|
566
|
-
};
|
|
567
|
-
var getXiaohongshuDefaultConfig = (cookie) => {
|
|
568
|
-
return {
|
|
569
|
-
headers: {
|
|
570
|
-
"accept": "application/json, text/plain, */*",
|
|
571
|
-
"accept-language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
|
|
572
|
-
"cache-control": "no-cache",
|
|
573
|
-
"content-type": "application/json;charset=UTF-8",
|
|
574
|
-
"pragma": "no-cache",
|
|
575
|
-
"priority": "u=1, i",
|
|
576
|
-
"referer": "https://www.xiaohongshu.com/",
|
|
577
|
-
"sec-ch-ua": '"Microsoft Edge";v="141", "Not?A_Brand";v="8", "Chromium";v="141"',
|
|
578
|
-
"sec-ch-ua-mobile": "?0",
|
|
579
|
-
"sec-ch-ua-platform": '"Windows"',
|
|
580
|
-
"sec-fetch-dest": "empty",
|
|
581
|
-
"sec-fetch-mode": "cors",
|
|
582
|
-
"sec-fetch-site": "same-site",
|
|
583
|
-
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0",
|
|
584
|
-
"cookie": cookie || ""
|
|
585
|
-
}
|
|
586
|
-
};
|
|
587
|
-
};
|
|
588
|
-
|
|
589
|
-
// src/platform/bilibili/getdata.ts
|
|
590
|
-
var fetchBilibili = async (data2, cookie, requestConfig) => {
|
|
591
|
-
var _a, _b, _c, _d, _e, _f;
|
|
592
|
-
const defHeaders = getBilibiliDefaultConfig(cookie)["headers"];
|
|
593
|
-
const baseRequestConfig = {
|
|
594
|
-
method: "GET",
|
|
595
|
-
timeout: 1e4,
|
|
596
|
-
...requestConfig,
|
|
597
|
-
headers: {
|
|
598
|
-
...defHeaders,
|
|
599
|
-
...{}
|
|
600
|
-
}
|
|
601
|
-
};
|
|
602
|
-
switch (data2.methodType) {
|
|
603
|
-
case "\u5355\u4E2A\u89C6\u9891\u4F5C\u54C1\u6570\u636E": {
|
|
604
|
-
const INFODATA = await GlobalGetData(data2.methodType, {
|
|
605
|
-
...baseRequestConfig,
|
|
606
|
-
url: bilibiliApiUrls.\u89C6\u9891\u8BE6\u7EC6\u4FE1\u606F({ bvid: data2.bvid })
|
|
607
|
-
});
|
|
608
|
-
return INFODATA;
|
|
609
|
-
}
|
|
610
|
-
case "\u5355\u4E2A\u89C6\u9891\u4E0B\u8F7D\u4FE1\u606F\u6570\u636E": {
|
|
611
|
-
const BASEURL = bilibiliApiUrls.\u89C6\u9891\u6D41\u4FE1\u606F({ avid: data2.avid, cid: data2.cid });
|
|
612
|
-
const SIGN = await qtparam(BASEURL, (_a = baseRequestConfig.headers) == null ? void 0 : _a.Cookie);
|
|
613
|
-
const DATA = await GlobalGetData(data2.methodType, {
|
|
614
|
-
...baseRequestConfig,
|
|
615
|
-
url: bilibiliApiUrls.\u89C6\u9891\u6D41\u4FE1\u606F({ avid: data2.avid, cid: data2.cid }) + SIGN.QUERY
|
|
616
|
-
});
|
|
617
|
-
return DATA;
|
|
618
|
-
}
|
|
619
|
-
case "\u8BC4\u8BBA\u6570\u636E": {
|
|
620
|
-
let { oid, number, type, mode, pagination_str, plat, seek_rpid, web_location } = data2;
|
|
621
|
-
let fetchedComments = [];
|
|
622
|
-
const maxRequestCount = 100;
|
|
623
|
-
let requestCount = 0;
|
|
624
|
-
let tmpresp;
|
|
625
|
-
let nextPaginationStr = pagination_str;
|
|
626
|
-
let isEnd = false;
|
|
627
|
-
const checkStatusUrl = bilibiliApiUrls.\u8BC4\u8BBA\u533A\u72B6\u6001({ oid, type });
|
|
628
|
-
const checkStatusRes = await GlobalGetData(data2.methodType, {
|
|
629
|
-
...baseRequestConfig,
|
|
630
|
-
url: checkStatusUrl
|
|
631
|
-
});
|
|
632
|
-
if (checkStatusRes.data === null) {
|
|
633
|
-
logger.error("\u8BC4\u8BBA\u533A\u672A\u5F00\u653E");
|
|
634
|
-
return {
|
|
635
|
-
code: 404,
|
|
636
|
-
message: "\u8BC4\u8BBA\u533A\u672A\u5F00\u653E",
|
|
637
|
-
data: null
|
|
638
|
-
};
|
|
639
|
-
}
|
|
640
|
-
while (fetchedComments.length < Number(number ?? 20) && requestCount < maxRequestCount && !isEnd) {
|
|
641
|
-
const baseUrl = bilibiliApiUrls.\u8BC4\u8BBA\u533A\u660E\u7EC6({
|
|
642
|
-
type,
|
|
643
|
-
oid,
|
|
644
|
-
mode: mode ?? 3,
|
|
645
|
-
pagination_str: nextPaginationStr,
|
|
646
|
-
plat: plat ?? 1,
|
|
647
|
-
seek_rpid,
|
|
648
|
-
web_location: web_location ?? "1315875"
|
|
649
|
-
});
|
|
650
|
-
const wbiSignQuery = await wbi_sign(baseUrl, (_b = baseRequestConfig.headers) == null ? void 0 : _b.cookie);
|
|
651
|
-
const finalUrl = baseUrl + wbiSignQuery;
|
|
652
|
-
const response = await GlobalGetData(data2.methodType, {
|
|
653
|
-
...baseRequestConfig,
|
|
654
|
-
url: finalUrl
|
|
655
|
-
});
|
|
656
|
-
tmpresp = response;
|
|
657
|
-
const currentComments = ((_c = response.data) == null ? void 0 : _c.replies) || [];
|
|
658
|
-
fetchedComments.push(...currentComments);
|
|
659
|
-
if ((_d = response.data) == null ? void 0 : _d.cursor) {
|
|
660
|
-
nextPaginationStr = (_e = response.data.cursor.pagination_reply) == null ? void 0 : _e.next_offset;
|
|
661
|
-
isEnd = response.data.cursor.is_end;
|
|
662
|
-
} else {
|
|
663
|
-
isEnd = true;
|
|
664
|
-
}
|
|
665
|
-
requestCount++;
|
|
666
|
-
if (isEnd || currentComments.length === 0 || !nextPaginationStr) {
|
|
667
|
-
logger.info("\u5DF2\u5230\u8FBE\u8BC4\u8BBA\u672B\u5C3E\u6216\u65E0\u66F4\u591A\u8BC4\u8BBA");
|
|
668
|
-
break;
|
|
669
|
-
}
|
|
670
|
-
}
|
|
671
|
-
const finalResponse = {
|
|
672
|
-
...tmpresp,
|
|
673
|
-
data: {
|
|
674
|
-
...tmpresp.data,
|
|
675
|
-
// 去重并限制数量
|
|
676
|
-
replies: Array.from(new Map(fetchedComments.map((item) => [item.rpid, item])).values()).slice(0, Number(data2.number || 20))
|
|
677
|
-
}
|
|
678
|
-
};
|
|
679
|
-
return finalResponse;
|
|
680
|
-
}
|
|
681
|
-
case "Emoji\u6570\u636E": {
|
|
682
|
-
return await GlobalGetData(data2.methodType, {
|
|
683
|
-
...baseRequestConfig,
|
|
684
|
-
url: bilibiliApiUrls.\u8868\u60C5\u5217\u8868()
|
|
685
|
-
});
|
|
686
|
-
}
|
|
687
|
-
case "\u756A\u5267\u57FA\u672C\u4FE1\u606F\u6570\u636E": {
|
|
688
|
-
let id = data2.ep_id ? data2.ep_id : data2.season_id;
|
|
689
|
-
if (!id) {
|
|
690
|
-
return false;
|
|
691
|
-
}
|
|
692
|
-
const idType = id ? id.startsWith("ep") ? "ep_id" : "season_id" : "ep_id";
|
|
693
|
-
const newId = idType === "ep_id" ? id.replace("ep", "") : id.replace("ss", "");
|
|
694
|
-
const INFO = await GlobalGetData(data2.methodType, {
|
|
695
|
-
...baseRequestConfig,
|
|
696
|
-
url: bilibiliApiUrls.\u756A\u5267\u660E\u7EC6({ [idType]: newId })
|
|
697
|
-
});
|
|
698
|
-
return INFO;
|
|
699
|
-
}
|
|
700
|
-
case "\u756A\u5267\u4E0B\u8F7D\u4FE1\u606F\u6570\u636E": {
|
|
701
|
-
const BASEURL = bilibiliApiUrls.\u756A\u5267\u89C6\u9891\u6D41\u4FE1\u606F({ cid: data2.cid, ep_id: data2.ep_id.replace("ep", "") });
|
|
702
|
-
const SIGN = await qtparam(BASEURL, (_f = baseRequestConfig.headers) == null ? void 0 : _f.cookie);
|
|
703
|
-
const DATA = await GlobalGetData(data2.methodType, {
|
|
704
|
-
...baseRequestConfig,
|
|
705
|
-
url: bilibiliApiUrls.\u756A\u5267\u89C6\u9891\u6D41\u4FE1\u606F({ cid: data2.cid, ep_id: data2.ep_id.replace("ep", "") }) + SIGN.QUERY
|
|
706
|
-
});
|
|
707
|
-
return DATA;
|
|
708
|
-
}
|
|
709
|
-
case "\u7528\u6237\u4E3B\u9875\u52A8\u6001\u5217\u8868\u6570\u636E": {
|
|
710
|
-
const customConfig = {
|
|
711
|
-
...baseRequestConfig,
|
|
712
|
-
headers: {
|
|
713
|
-
...baseRequestConfig.headers,
|
|
714
|
-
// 只有在外部配置没有referer时才删除内部的referer
|
|
715
|
-
...{
|
|
716
|
-
referer: void 0
|
|
717
|
-
}
|
|
718
|
-
}
|
|
719
|
-
};
|
|
720
|
-
const { host_mid } = data2;
|
|
721
|
-
const result = await GlobalGetData(data2.methodType, {
|
|
722
|
-
...customConfig,
|
|
723
|
-
url: bilibiliApiUrls.\u7528\u6237\u7A7A\u95F4\u52A8\u6001({ host_mid })
|
|
724
|
-
});
|
|
725
|
-
return result;
|
|
726
|
-
}
|
|
727
|
-
case "\u52A8\u6001\u8BE6\u60C5\u6570\u636E": {
|
|
728
|
-
const customConfig = {
|
|
729
|
-
...baseRequestConfig,
|
|
730
|
-
headers: {
|
|
731
|
-
...baseRequestConfig.headers,
|
|
732
|
-
// 只有在外部配置没有referer时才删除内部的referer
|
|
733
|
-
...{
|
|
734
|
-
referer: void 0
|
|
735
|
-
}
|
|
736
|
-
}
|
|
737
|
-
};
|
|
738
|
-
const dynamicINFO = await GlobalGetData(data2.methodType, {
|
|
739
|
-
...customConfig,
|
|
740
|
-
url: bilibiliApiUrls.\u52A8\u6001\u8BE6\u60C5({ dynamic_id: data2.dynamic_id })
|
|
741
|
-
});
|
|
742
|
-
return dynamicINFO;
|
|
743
|
-
}
|
|
744
|
-
case "\u52A8\u6001\u5361\u7247\u6570\u636E": {
|
|
745
|
-
const customConfig = {
|
|
746
|
-
...baseRequestConfig,
|
|
747
|
-
headers: {
|
|
748
|
-
...baseRequestConfig.headers,
|
|
749
|
-
// 只有在外部配置没有referer时才删除内部的referer
|
|
750
|
-
...{
|
|
751
|
-
referer: void 0
|
|
752
|
-
}
|
|
753
|
-
}
|
|
754
|
-
};
|
|
755
|
-
const { dynamic_id } = data2;
|
|
756
|
-
const dynamicINFO_CARD = await GlobalGetData(data2.methodType, {
|
|
757
|
-
...customConfig,
|
|
758
|
-
url: bilibiliApiUrls.\u52A8\u6001\u5361\u7247\u4FE1\u606F({ dynamic_id })
|
|
759
|
-
});
|
|
760
|
-
return dynamicINFO_CARD;
|
|
761
|
-
}
|
|
762
|
-
case "\u7528\u6237\u4E3B\u9875\u6570\u636E": {
|
|
763
|
-
const { host_mid } = data2;
|
|
764
|
-
const result = await GlobalGetData(data2.methodType, {
|
|
765
|
-
...baseRequestConfig,
|
|
766
|
-
url: bilibiliApiUrls.\u7528\u6237\u540D\u7247\u4FE1\u606F({ host_mid })
|
|
767
|
-
});
|
|
768
|
-
return result;
|
|
769
|
-
}
|
|
770
|
-
case "\u76F4\u64AD\u95F4\u4FE1\u606F": {
|
|
771
|
-
const result = await GlobalGetData(data2.methodType, {
|
|
772
|
-
...baseRequestConfig,
|
|
773
|
-
url: bilibiliApiUrls.\u76F4\u64AD\u95F4\u4FE1\u606F({ room_id: data2.room_id })
|
|
774
|
-
});
|
|
775
|
-
return result;
|
|
776
|
-
}
|
|
777
|
-
case "\u76F4\u64AD\u95F4\u521D\u59CB\u5316\u4FE1\u606F": {
|
|
778
|
-
const result = await GlobalGetData(data2.methodType, {
|
|
779
|
-
...baseRequestConfig,
|
|
780
|
-
url: bilibiliApiUrls.\u76F4\u64AD\u95F4\u521D\u59CB\u5316\u4FE1\u606F({ room_id: data2.room_id })
|
|
781
|
-
});
|
|
782
|
-
return result;
|
|
783
|
-
}
|
|
784
|
-
case "\u7533\u8BF7\u4E8C\u7EF4\u7801": {
|
|
785
|
-
const result = await GlobalGetData(data2.methodType, {
|
|
786
|
-
...baseRequestConfig,
|
|
787
|
-
url: bilibiliApiUrls.\u7533\u8BF7\u4E8C\u7EF4\u7801()
|
|
788
|
-
});
|
|
789
|
-
return result;
|
|
790
|
-
}
|
|
791
|
-
case "\u4E8C\u7EF4\u7801\u72B6\u6001": {
|
|
792
|
-
try {
|
|
793
|
-
const result = await getHeadersAndData({
|
|
794
|
-
...baseRequestConfig,
|
|
795
|
-
url: bilibiliApiUrls.\u4E8C\u7EF4\u7801\u72B6\u6001({ qrcode_key: data2.qrcode_key })
|
|
796
|
-
});
|
|
797
|
-
if (result.data.code !== 0) {
|
|
798
|
-
const errorMessage = bilibiliErrorCodeMap[String(result.data.code)] || result.data.message || "\u672A\u77E5\u9519\u8BEF";
|
|
799
|
-
const Err = {
|
|
800
|
-
errorDescription: `\u83B7\u53D6\u54CD\u5E94\u6570\u636E\u5931\u8D25\uFF01\u539F\u56E0\uFF1A${errorMessage}\uFF01`,
|
|
801
|
-
requestType: data2.methodType,
|
|
802
|
-
requestUrl: bilibiliApiUrls.\u4E8C\u7EF4\u7801\u72B6\u6001({ qrcode_key: data2.qrcode_key })
|
|
803
|
-
};
|
|
804
|
-
return {
|
|
805
|
-
code: result.data.code,
|
|
806
|
-
data: result.data,
|
|
807
|
-
amagiError: Err
|
|
808
|
-
};
|
|
809
|
-
}
|
|
810
|
-
return {
|
|
811
|
-
code: 0,
|
|
812
|
-
data: {
|
|
813
|
-
data: result.data.data,
|
|
814
|
-
headers: result.headers
|
|
815
|
-
},
|
|
816
|
-
message: "0"
|
|
817
|
-
};
|
|
818
|
-
} catch (error) {
|
|
819
|
-
if (error && typeof error === "object") {
|
|
820
|
-
return error;
|
|
821
|
-
}
|
|
822
|
-
return {
|
|
823
|
-
code: "UNKNOWN_ERROR" /* UNKNOWN */,
|
|
824
|
-
data: error.data,
|
|
825
|
-
amagiError: {
|
|
826
|
-
errorDescription: "\u672A\u77E5\u9519\u8BEF",
|
|
827
|
-
requestType: data2.methodType,
|
|
828
|
-
requestUrl: bilibiliApiUrls.\u4E8C\u7EF4\u7801\u72B6\u6001({ qrcode_key: data2.qrcode_key })
|
|
829
|
-
}
|
|
830
|
-
};
|
|
831
|
-
}
|
|
832
|
-
}
|
|
833
|
-
case "\u767B\u5F55\u57FA\u672C\u4FE1\u606F": {
|
|
834
|
-
const result = await GlobalGetData(data2.methodType, {
|
|
835
|
-
...baseRequestConfig,
|
|
836
|
-
url: bilibiliApiUrls.\u767B\u5F55\u57FA\u672C\u4FE1\u606F()
|
|
837
|
-
});
|
|
838
|
-
return result;
|
|
839
|
-
}
|
|
840
|
-
case "\u83B7\u53D6UP\u4E3B\u603B\u64AD\u653E\u91CF": {
|
|
841
|
-
const result = await GlobalGetData(data2.methodType, {
|
|
842
|
-
...baseRequestConfig,
|
|
843
|
-
url: bilibiliApiUrls.\u83B7\u53D6UP\u4E3B\u603B\u64AD\u653E\u91CF({ host_mid: data2.host_mid })
|
|
844
|
-
});
|
|
845
|
-
return result;
|
|
846
|
-
}
|
|
847
|
-
case "AV\u8F6CBV": {
|
|
848
|
-
const result = av2bv(Number(data2.avid.toString().replace(/^av/i, "")));
|
|
849
|
-
return {
|
|
850
|
-
code: 0,
|
|
851
|
-
message: "success",
|
|
852
|
-
data: {
|
|
853
|
-
bvid: result
|
|
854
|
-
}
|
|
855
|
-
};
|
|
856
|
-
}
|
|
857
|
-
case "BV\u8F6CAV": {
|
|
858
|
-
const result = "av" + bv2av(data2.bvid);
|
|
859
|
-
return {
|
|
860
|
-
code: 0,
|
|
861
|
-
message: "success",
|
|
862
|
-
data: {
|
|
863
|
-
aid: result
|
|
864
|
-
}
|
|
865
|
-
};
|
|
866
|
-
}
|
|
867
|
-
default:
|
|
868
|
-
logger.warn(`\u672A\u77E5\u7684B\u7AD9\u6570\u636E\u63A5\u53E3\uFF1A\u300C${logger.red(data2.methodType)}\u300D`);
|
|
869
|
-
return null;
|
|
870
|
-
}
|
|
871
|
-
};
|
|
872
|
-
var GlobalGetData = async (type, options) => {
|
|
873
|
-
let warningMessage = "";
|
|
874
|
-
try {
|
|
875
|
-
const result = await fetchData(options);
|
|
876
|
-
if (!result || result === "") {
|
|
877
|
-
const Err = {
|
|
878
|
-
errorDescription: "\u83B7\u53D6\u54CD\u5E94\u6570\u636E\u5931\u8D25\uFF01\u63A5\u53E3\u8FD4\u56DE\u5185\u5BB9\u4E3A\u7A7A\uFF0C\u4F60\u7684B\u7AD9ck\u53EF\u80FD\u5DF2\u7ECF\u5931\u6548\uFF01",
|
|
879
|
-
requestType: type ?? "\u672A\u77E5\u8BF7\u6C42\u7C7B\u578B",
|
|
880
|
-
requestUrl: options.url
|
|
881
|
-
};
|
|
882
|
-
warningMessage = `
|
|
883
|
-
\u83B7\u53D6\u54CD\u5E94\u6570\u636E\u5931\u8D25\uFF01\u539F\u56E0\uFF1A${logger.yellow("\u63A5\u53E3\u8FD4\u56DE\u5185\u5BB9\u4E3A\u7A7A\uFF0C\u4F60\u7684B\u7AD9ck\u53EF\u80FD\u5DF2\u7ECF\u5931\u6548\uFF01")}
|
|
884
|
-
\u8BF7\u6C42\u7C7B\u578B\uFF1A\u300C${type}\u300D
|
|
885
|
-
\u8BF7\u6C42URL\uFF1A${options.url}
|
|
886
|
-
`;
|
|
887
|
-
logger.warn(warningMessage);
|
|
888
|
-
throw {
|
|
889
|
-
code: "-352" /* RISK_CONTROL_FAILED */,
|
|
890
|
-
data: result,
|
|
891
|
-
amagiError: Err
|
|
892
|
-
};
|
|
893
|
-
}
|
|
894
|
-
if (result.code !== 0) {
|
|
895
|
-
const errorMessage = bilibiliErrorCodeMap[result.code] || result.message || "\u672A\u77E5\u9519\u8BEF";
|
|
896
|
-
const Err = {
|
|
897
|
-
errorDescription: `\u83B7\u53D6\u54CD\u5E94\u6570\u636E\u5931\u8D25\uFF01\u539F\u56E0\uFF1A${errorMessage}\uFF01`,
|
|
898
|
-
requestType: type ?? "\u672A\u77E5\u8BF7\u6C42\u7C7B\u578B",
|
|
899
|
-
requestUrl: options.url
|
|
900
|
-
};
|
|
901
|
-
warningMessage = `
|
|
902
|
-
\u83B7\u53D6\u54CD\u5E94\u6570\u636E\u5931\u8D25\uFF01\u539F\u56E0\uFF1A${logger.yellow(errorMessage)}
|
|
903
|
-
\u9519\u8BEF\u4EE3\u7801\uFF1A${result.code}
|
|
904
|
-
\u8BF7\u6C42\u7C7B\u578B\uFF1A\u300C${type}\u300D
|
|
905
|
-
\u8BF7\u6C42URL\uFF1A${options.url}
|
|
906
|
-
`;
|
|
907
|
-
logger.warn(warningMessage);
|
|
908
|
-
throw {
|
|
909
|
-
code: result.code,
|
|
910
|
-
data: result,
|
|
911
|
-
amagiError: Err
|
|
912
|
-
};
|
|
913
|
-
}
|
|
914
|
-
return result;
|
|
915
|
-
} catch (error) {
|
|
916
|
-
if (error && typeof error === "object") {
|
|
917
|
-
const err = error;
|
|
918
|
-
return { ...err, amagiMessage: warningMessage };
|
|
919
|
-
}
|
|
920
|
-
return {
|
|
921
|
-
code: "UNKNOWN_ERROR" /* UNKNOWN */,
|
|
922
|
-
data: error.data,
|
|
923
|
-
amagiError: {
|
|
924
|
-
errorDescription: "\u672A\u77E5\u9519\u8BEF",
|
|
925
|
-
requestType: type,
|
|
926
|
-
requestUrl: options.url
|
|
927
|
-
},
|
|
928
|
-
amagiMessage: warningMessage
|
|
929
|
-
};
|
|
930
|
-
}
|
|
931
|
-
};
|
|
932
|
-
var bilibiliErrorCodeMap = {
|
|
933
|
-
"-1": "\u5E94\u7528\u7A0B\u5E8F\u4E0D\u5B58\u5728\u6216\u5DF2\u88AB\u5C01\u7981",
|
|
934
|
-
"-2": "Access Key \u9519\u8BEF",
|
|
935
|
-
"-3": "API \u6821\u9A8C\u5BC6\u5319\u9519\u8BEF",
|
|
936
|
-
"-4": "\u8C03\u7528\u65B9\u5BF9\u8BE5 Method \u6CA1\u6709\u6743\u9650",
|
|
937
|
-
"-101": "\u8D26\u53F7\u672A\u767B\u5F55",
|
|
938
|
-
"-102": "\u8D26\u53F7\u88AB\u5C01\u505C",
|
|
939
|
-
"-103": "\u79EF\u5206\u4E0D\u8DB3",
|
|
940
|
-
"-104": "\u786C\u5E01\u4E0D\u8DB3",
|
|
941
|
-
"-105": "\u9A8C\u8BC1\u7801\u9519\u8BEF",
|
|
942
|
-
"-106": "\u8D26\u53F7\u975E\u6B63\u5F0F\u4F1A\u5458\u6216\u5728\u9002\u5E94\u671F",
|
|
943
|
-
"-107": "\u5E94\u7528\u4E0D\u5B58\u5728\u6216\u8005\u88AB\u5C01\u7981",
|
|
944
|
-
"-108": "\u672A\u7ED1\u5B9A\u624B\u673A",
|
|
945
|
-
"-110": "\u672A\u7ED1\u5B9A\u624B\u673A",
|
|
946
|
-
"-111": "csrf \u6821\u9A8C\u5931\u8D25",
|
|
947
|
-
"-112": "\u7CFB\u7EDF\u5347\u7EA7\u4E2D",
|
|
948
|
-
"-113": "\u8D26\u53F7\u5C1A\u672A\u5B9E\u540D\u8BA4\u8BC1",
|
|
949
|
-
"-114": "\u8BF7\u5148\u7ED1\u5B9A\u624B\u673A",
|
|
950
|
-
"-115": "\u8BF7\u5148\u5B8C\u6210\u5B9E\u540D\u8BA4\u8BC1",
|
|
951
|
-
"-304": "\u6728\u6709\u6539\u52A8",
|
|
952
|
-
"-307": "\u649E\u8F66\u8DF3\u8F6C",
|
|
953
|
-
"-352": "\u98CE\u63A7\u6821\u9A8C\u5931\u8D25 (UA \u6216 wbi \u53C2\u6570\u4E0D\u5408\u6CD5)",
|
|
954
|
-
"-400": "\u8BF7\u6C42\u9519\u8BEF",
|
|
955
|
-
"-401": "\u672A\u8BA4\u8BC1 (\u6216\u975E\u6CD5\u8BF7\u6C42)",
|
|
956
|
-
"-403": "\u8BBF\u95EE\u6743\u9650\u4E0D\u8DB3",
|
|
957
|
-
"-404": "\u5565\u90FD\u6728\u6709",
|
|
958
|
-
"-405": "\u4E0D\u652F\u6301\u8BE5\u65B9\u6CD5",
|
|
959
|
-
"-409": "\u51B2\u7A81",
|
|
960
|
-
"-412": "\u8BF7\u6C42\u88AB\u62E6\u622A (\u5BA2\u6237\u7AEF ip \u88AB\u670D\u52A1\u7AEF\u98CE\u63A7)",
|
|
961
|
-
"-500": "\u670D\u52A1\u5668\u9519\u8BEF",
|
|
962
|
-
"-503": "\u8FC7\u8F7D\u4FDD\u62A4,\u670D\u52A1\u6682\u4E0D\u53EF\u7528",
|
|
963
|
-
"-504": "\u670D\u52A1\u8C03\u7528\u8D85\u65F6",
|
|
964
|
-
"-509": "\u8D85\u51FA\u9650\u5236",
|
|
965
|
-
"-616": "\u4E0A\u4F20\u6587\u4EF6\u4E0D\u5B58\u5728",
|
|
966
|
-
"-617": "\u4E0A\u4F20\u6587\u4EF6\u592A\u5927",
|
|
967
|
-
"-625": "\u767B\u5F55\u5931\u8D25\u6B21\u6570\u592A\u591A",
|
|
968
|
-
"-626": "\u7528\u6237\u4E0D\u5B58\u5728",
|
|
969
|
-
"-628": "\u5BC6\u7801\u592A\u5F31",
|
|
970
|
-
"-629": "\u7528\u6237\u540D\u6216\u5BC6\u7801\u9519\u8BEF",
|
|
971
|
-
"-632": "\u64CD\u4F5C\u5BF9\u8C61\u6570\u91CF\u9650\u5236",
|
|
972
|
-
"-643": "\u88AB\u9501\u5B9A",
|
|
973
|
-
"-650": "\u7528\u6237\u7B49\u7EA7\u592A\u4F4E",
|
|
974
|
-
"-652": "\u91CD\u590D\u7684\u7528\u6237",
|
|
975
|
-
"-658": "Token \u8FC7\u671F",
|
|
976
|
-
"-662": "\u5BC6\u7801\u65F6\u95F4\u6233\u8FC7\u671F",
|
|
977
|
-
"-688": "\u5730\u7406\u533A\u57DF\u9650\u5236",
|
|
978
|
-
"-689": "\u7248\u6743\u9650\u5236",
|
|
979
|
-
"-701": "\u6263\u8282\u64CD\u5931\u8D25",
|
|
980
|
-
"-799": "\u8BF7\u6C42\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5",
|
|
981
|
-
"-8888": "\u5BF9\u4E0D\u8D77\uFF0C\u670D\u52A1\u5668\u5F00\u5C0F\u5DEE\u4E86~ (\u0CA5\uFE4F\u0CA5)"
|
|
982
|
-
};
|
|
983
|
-
|
|
984
|
-
// src/platform/douyin/sign/a_bogus.ts
|
|
985
|
-
var SM3 = class {
|
|
986
|
-
reg;
|
|
987
|
-
chunk;
|
|
988
|
-
size;
|
|
989
|
-
constructor() {
|
|
990
|
-
this.reg = [];
|
|
991
|
-
this.chunk = [];
|
|
992
|
-
this.size = 0;
|
|
993
|
-
this.reset();
|
|
994
|
-
}
|
|
995
|
-
reset() {
|
|
996
|
-
this.reg[0] = 1937774191;
|
|
997
|
-
this.reg[1] = 1226093241;
|
|
998
|
-
this.reg[2] = 388252375;
|
|
999
|
-
this.reg[3] = 3666478592;
|
|
1000
|
-
this.reg[4] = 2842636476;
|
|
1001
|
-
this.reg[5] = 372324522;
|
|
1002
|
-
this.reg[6] = 3817729613;
|
|
1003
|
-
this.reg[7] = 2969243214;
|
|
1004
|
-
this.chunk = [];
|
|
1005
|
-
this.size = 0;
|
|
1006
|
-
}
|
|
1007
|
-
write(e) {
|
|
1008
|
-
const a = typeof e === "string" ? this.stringToBytes(e) : e;
|
|
1009
|
-
this.size += a.length;
|
|
1010
|
-
let f = 64 - this.chunk.length;
|
|
1011
|
-
if (a.length < f) {
|
|
1012
|
-
this.chunk = this.chunk.concat(a);
|
|
1013
|
-
} else {
|
|
1014
|
-
this.chunk = this.chunk.concat(a.slice(0, f));
|
|
1015
|
-
while (this.chunk.length >= 64) {
|
|
1016
|
-
this._compress(this.chunk);
|
|
1017
|
-
f < a.length ? this.chunk = a.slice(f, Math.min(f + 64, a.length)) : this.chunk = [];
|
|
1018
|
-
f += 64;
|
|
1019
|
-
}
|
|
1020
|
-
}
|
|
1021
|
-
}
|
|
1022
|
-
sum(e, t) {
|
|
1023
|
-
if (e) {
|
|
1024
|
-
this.reset();
|
|
1025
|
-
this.write(e);
|
|
1026
|
-
}
|
|
1027
|
-
this._fill();
|
|
1028
|
-
for (let f = 0; f < this.chunk.length; f += 64) {
|
|
1029
|
-
this._compress(this.chunk.slice(f, f + 64));
|
|
1030
|
-
}
|
|
1031
|
-
let i = null;
|
|
1032
|
-
if (t === "hex") {
|
|
1033
|
-
i = "";
|
|
1034
|
-
for (let f = 0; f < 8; f++) {
|
|
1035
|
-
i += this.padHex(this.reg[f].toString(16), 8);
|
|
1036
|
-
}
|
|
1037
|
-
} else {
|
|
1038
|
-
i = new Array(32);
|
|
1039
|
-
for (let f = 0; f < 8; f++) {
|
|
1040
|
-
let c = this.reg[f];
|
|
1041
|
-
i[4 * f + 3] = (255 & c) >>> 0;
|
|
1042
|
-
c >>>= 8;
|
|
1043
|
-
i[4 * f + 2] = (255 & c) >>> 0;
|
|
1044
|
-
c >>>= 8;
|
|
1045
|
-
i[4 * f + 1] = (255 & c) >>> 0;
|
|
1046
|
-
c >>>= 8;
|
|
1047
|
-
i[4 * f] = (255 & c) >>> 0;
|
|
1048
|
-
}
|
|
1049
|
-
}
|
|
1050
|
-
this.reset();
|
|
1051
|
-
return i;
|
|
1052
|
-
}
|
|
1053
|
-
_compress(t) {
|
|
1054
|
-
if (t.length < 64) {
|
|
1055
|
-
console.error("compress error: not enough data");
|
|
1056
|
-
} else {
|
|
1057
|
-
for (var f = ((e) => {
|
|
1058
|
-
for (var r = new Array(132), t2 = 0; t2 < 16; t2++) {
|
|
1059
|
-
r[t2] = e[4 * t2] << 24, r[t2] |= e[4 * t2 + 1] << 16, r[t2] |= e[4 * t2 + 2] << 8, r[t2] |= e[4 * t2 + 3], r[t2] >>>= 0;
|
|
1060
|
-
}
|
|
1061
|
-
for (var n = 16; n < 68; n++) {
|
|
1062
|
-
let a = r[n - 16] ^ r[n - 9] ^ this.le(r[n - 3], 15);
|
|
1063
|
-
a = a ^ this.le(a, 15) ^ this.le(a, 23), r[n] = (a ^ this.le(r[n - 13], 7) ^ r[n - 6]) >>> 0;
|
|
1064
|
-
}
|
|
1065
|
-
for (n = 0; n < 64; n++) r[n + 68] = (r[n] ^ r[n + 4]) >>> 0;
|
|
1066
|
-
return r;
|
|
1067
|
-
})(t), i = this.reg.slice(0), c = 0; c < 64; c++) {
|
|
1068
|
-
let o = this.le(i[0], 12) + i[4] + this.le(this.de(c), c);
|
|
1069
|
-
const s = ((o = this.le(o = (4294967295 & o) >>> 0, 7)) ^ this.le(i[0], 12)) >>> 0;
|
|
1070
|
-
let u = this.pe(c, i[0], i[1], i[2]);
|
|
1071
|
-
u = (4294967295 & (u = u + i[3] + s + f[c + 68])) >>> 0;
|
|
1072
|
-
let b = this.he(c, i[4], i[5], i[6]);
|
|
1073
|
-
b = (4294967295 & (b = b + i[7] + o + f[c])) >>> 0, i[3] = i[2], i[2] = this.le(i[1], 9), i[1] = i[0], i[0] = u, i[7] = i[6], i[6] = this.le(i[5], 19), i[5] = i[4], i[4] = (b ^ this.le(b, 9) ^ this.le(b, 17)) >>> 0;
|
|
1074
|
-
}
|
|
1075
|
-
for (let l = 0; l < 8; l++) this.reg[l] = (this.reg[l] ^ i[l]) >>> 0;
|
|
1076
|
-
}
|
|
1077
|
-
}
|
|
1078
|
-
_fill() {
|
|
1079
|
-
let a = 8 * this.size;
|
|
1080
|
-
let f = this.chunk.push(128) % 64;
|
|
1081
|
-
while (64 - f < 8) {
|
|
1082
|
-
f -= 64;
|
|
1083
|
-
}
|
|
1084
|
-
while (f < 56) {
|
|
1085
|
-
this.chunk.push(0);
|
|
1086
|
-
f++;
|
|
1087
|
-
}
|
|
1088
|
-
for (let i = 0; i < 4; i++) {
|
|
1089
|
-
const c = Math.floor(a / 4294967296);
|
|
1090
|
-
this.chunk.push(c >>> 8 * (3 - i) & 255);
|
|
1091
|
-
}
|
|
1092
|
-
for (let i = 0; i < 4; i++) {
|
|
1093
|
-
this.chunk.push(a >>> 8 * (3 - i) & 255);
|
|
1094
|
-
}
|
|
1095
|
-
}
|
|
1096
|
-
de(e) {
|
|
1097
|
-
return e >= 0 && e < 16 ? 2043430169 : e >= 16 && e < 64 ? 2055708042 : (console.error("invalid j for constant Tj"), 0);
|
|
1098
|
-
}
|
|
1099
|
-
pe(e, r, t, n) {
|
|
1100
|
-
return e >= 0 && e < 16 ? (r ^ t ^ n) >>> 0 : e >= 16 && e < 64 ? (r & t | r & n | t & n) >>> 0 : (console.error("invalid j for bool function FF"), 0);
|
|
1101
|
-
}
|
|
1102
|
-
he(e, r, t, n) {
|
|
1103
|
-
return e >= 0 && e < 16 ? (r ^ t ^ n) >>> 0 : e >= 16 && e < 64 ? (r & t | ~r & n) >>> 0 : (console.error("invalid j for bool function GG"), 0);
|
|
1104
|
-
}
|
|
1105
|
-
le(e, r) {
|
|
1106
|
-
return (e << (r %= 32) | e >>> 32 - r) >>> 0;
|
|
1107
|
-
}
|
|
1108
|
-
stringToBytes(str) {
|
|
1109
|
-
const n = encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, (_, r) => String.fromCharCode(parseInt(r, 16)));
|
|
1110
|
-
const a = new Array(n.length);
|
|
1111
|
-
for (let i = 0; i < n.length; i++) {
|
|
1112
|
-
a[i] = n.charCodeAt(i);
|
|
1113
|
-
}
|
|
1114
|
-
return a;
|
|
1115
|
-
}
|
|
1116
|
-
padHex(num, size) {
|
|
1117
|
-
return num.padStart(size, "0");
|
|
1118
|
-
}
|
|
1119
|
-
};
|
|
1120
|
-
function rc4_encrypt(plaintext, key) {
|
|
1121
|
-
const s = [];
|
|
1122
|
-
for (var i = 0; i < 256; i++) {
|
|
1123
|
-
s[i] = i;
|
|
1124
|
-
}
|
|
1125
|
-
var j = 0;
|
|
1126
|
-
for (var i = 0; i < 256; i++) {
|
|
1127
|
-
j = (j + s[i] + key.charCodeAt(i % key.length)) % 256;
|
|
1128
|
-
var temp = s[i];
|
|
1129
|
-
s[i] = s[j];
|
|
1130
|
-
s[j] = temp;
|
|
1131
|
-
}
|
|
1132
|
-
var i = 0;
|
|
1133
|
-
var j = 0;
|
|
1134
|
-
const cipher = [];
|
|
1135
|
-
for (let k = 0; k < plaintext.length; k++) {
|
|
1136
|
-
i = (i + 1) % 256;
|
|
1137
|
-
j = (j + s[i]) % 256;
|
|
1138
|
-
var temp = s[i];
|
|
1139
|
-
s[i] = s[j];
|
|
1140
|
-
s[j] = temp;
|
|
1141
|
-
const t = (s[i] + s[j]) % 256;
|
|
1142
|
-
cipher.push(String.fromCharCode(s[t] ^ plaintext.charCodeAt(k)));
|
|
1143
|
-
}
|
|
1144
|
-
return cipher.join("");
|
|
1145
|
-
}
|
|
1146
|
-
function result_encrypt(long_str, num) {
|
|
1147
|
-
const s_obj = {
|
|
1148
|
-
s0: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
|
|
1149
|
-
s1: "Dkdpgh4ZKsQB80/Mfvw36XI1R25+WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe=",
|
|
1150
|
-
s2: "Dkdpgh4ZKsQB80/Mfvw36XI1R25-WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe=",
|
|
1151
|
-
s3: "ckdp1h4ZKsUB80/Mfvw36XIgR25+WQAlEi7NLboqYTOPuzmFjJnryx9HVGDaStCe",
|
|
1152
|
-
s4: "Dkdpgh2ZmsQB80/MfvV36XI1R45-WUAlEixNLwoqYTOPuzKFjJnry79HbGcaStCe"
|
|
1153
|
-
};
|
|
1154
|
-
const constant = {
|
|
1155
|
-
0: 16515072,
|
|
1156
|
-
1: 258048,
|
|
1157
|
-
2: 4032,
|
|
1158
|
-
str: s_obj[num]
|
|
1159
|
-
};
|
|
1160
|
-
let result = "";
|
|
1161
|
-
let lound = 0;
|
|
1162
|
-
let long_int = get_long_int(lound, long_str);
|
|
1163
|
-
for (let i = 0; i < long_str.length / 3 * 4; i++) {
|
|
1164
|
-
if (Math.floor(i / 4) !== lound) {
|
|
1165
|
-
lound += 1;
|
|
1166
|
-
long_int = get_long_int(lound, long_str);
|
|
1167
|
-
}
|
|
1168
|
-
let key = i % 4;
|
|
1169
|
-
let temp_int;
|
|
1170
|
-
switch (key) {
|
|
1171
|
-
case 0:
|
|
1172
|
-
temp_int = (long_int & constant["0"]) >> 18;
|
|
1173
|
-
result += constant["str"].charAt(temp_int);
|
|
1174
|
-
break;
|
|
1175
|
-
case 1:
|
|
1176
|
-
temp_int = (long_int & constant["1"]) >> 12;
|
|
1177
|
-
result += constant["str"].charAt(temp_int);
|
|
1178
|
-
break;
|
|
1179
|
-
case 2:
|
|
1180
|
-
temp_int = (long_int & constant["2"]) >> 6;
|
|
1181
|
-
result += constant["str"].charAt(temp_int);
|
|
1182
|
-
break;
|
|
1183
|
-
case 3:
|
|
1184
|
-
temp_int = long_int & 63;
|
|
1185
|
-
result += constant["str"].charAt(temp_int);
|
|
1186
|
-
break;
|
|
1187
|
-
}
|
|
1188
|
-
}
|
|
1189
|
-
return result;
|
|
1190
|
-
}
|
|
1191
|
-
function get_long_int(round, long_str) {
|
|
1192
|
-
round = round * 3;
|
|
1193
|
-
return long_str.charCodeAt(round) << 16 | long_str.charCodeAt(round + 1) << 8 | long_str.charCodeAt(round + 2);
|
|
1194
|
-
}
|
|
1195
|
-
function gener_random(random, option) {
|
|
1196
|
-
return [
|
|
1197
|
-
random & 255 & 170 | option[0] & 85,
|
|
1198
|
-
// 163
|
|
1199
|
-
random & 255 & 85 | option[0] & 170,
|
|
1200
|
-
// 87
|
|
1201
|
-
random >> 8 & 255 & 170 | option[1] & 85,
|
|
1202
|
-
// 37
|
|
1203
|
-
random >> 8 & 255 & 85 | option[1] & 170
|
|
1204
|
-
// 41
|
|
1205
|
-
];
|
|
1206
|
-
}
|
|
1207
|
-
function generate_rc4_bb_str(url_search_params, user_agent, window_env_str, suffix = "cus", Arguments = [0, 1, 14]) {
|
|
1208
|
-
let sm3 = new SM3();
|
|
1209
|
-
let start_time = Date.now();
|
|
1210
|
-
const url_search_params_list = sm3.sum(sm3.sum(url_search_params + suffix));
|
|
1211
|
-
const cus = sm3.sum(sm3.sum(suffix));
|
|
1212
|
-
const ua = sm3.sum(result_encrypt(rc4_encrypt(user_agent, String.fromCharCode.apply(null, [390625e-8, 1, 14])), "s3"));
|
|
1213
|
-
const end_time = Date.now();
|
|
1214
|
-
let b = {
|
|
1215
|
-
8: 3,
|
|
1216
|
-
// 固定
|
|
1217
|
-
10: end_time,
|
|
1218
|
-
// 3次加密结束时间
|
|
1219
|
-
15: {
|
|
1220
|
-
aid: 6383,
|
|
1221
|
-
pageId: 6241},
|
|
1222
|
-
16: start_time,
|
|
1223
|
-
// 3次加密开始时间
|
|
1224
|
-
18: 44};
|
|
1225
|
-
b[20] = b[16] >> 24 & 255;
|
|
1226
|
-
b[21] = b[16] >> 16 & 255;
|
|
1227
|
-
b[22] = b[16] >> 8 & 255;
|
|
1228
|
-
b[23] = b[16] & 255;
|
|
1229
|
-
b[24] = b[16] / 256 / 256 / 256 / 256 >> 0;
|
|
1230
|
-
b[25] = b[16] / 256 / 256 / 256 / 256 / 256 >> 0;
|
|
1231
|
-
b[26] = Arguments[0] >> 24 & 255;
|
|
1232
|
-
b[27] = Arguments[0] >> 16 & 255;
|
|
1233
|
-
b[28] = Arguments[0] >> 8 & 255;
|
|
1234
|
-
b[29] = Arguments[0] & 255;
|
|
1235
|
-
b[30] = Arguments[1] / 256 & 255;
|
|
1236
|
-
b[31] = Arguments[1] % 256 & 255;
|
|
1237
|
-
b[32] = Arguments[1] >> 24 & 255;
|
|
1238
|
-
b[33] = Arguments[1] >> 16 & 255;
|
|
1239
|
-
b[34] = Arguments[2] >> 24 & 255;
|
|
1240
|
-
b[35] = Arguments[2] >> 16 & 255;
|
|
1241
|
-
b[36] = Arguments[2] >> 8 & 255;
|
|
1242
|
-
b[37] = Arguments[2] & 255;
|
|
1243
|
-
b[38] = url_search_params_list[21];
|
|
1244
|
-
b[39] = url_search_params_list[22];
|
|
1245
|
-
b[40] = cus[21];
|
|
1246
|
-
b[41] = cus[22];
|
|
1247
|
-
b[42] = ua[23];
|
|
1248
|
-
b[43] = ua[24];
|
|
1249
|
-
b[44] = b[10] >> 24 & 255;
|
|
1250
|
-
b[45] = b[10] >> 16 & 255;
|
|
1251
|
-
b[46] = b[10] >> 8 & 255;
|
|
1252
|
-
b[47] = b[10] & 255;
|
|
1253
|
-
b[48] = b[8];
|
|
1254
|
-
b[49] = b[10] / 256 / 256 / 256 / 256 >> 0;
|
|
1255
|
-
b[50] = b[10] / 256 / 256 / 256 / 256 / 256 >> 0;
|
|
1256
|
-
b[51] = b[15].pageId;
|
|
1257
|
-
b[52] = b[15].pageId >> 24 & 255;
|
|
1258
|
-
b[53] = b[15].pageId >> 16 & 255;
|
|
1259
|
-
b[54] = b[15].pageId >> 8 & 255;
|
|
1260
|
-
b[55] = b[15].pageId & 255;
|
|
1261
|
-
b[56] = b[15].aid;
|
|
1262
|
-
b[57] = b[15].aid & 255;
|
|
1263
|
-
b[58] = b[15].aid >> 8 & 255;
|
|
1264
|
-
b[59] = b[15].aid >> 16 & 255;
|
|
1265
|
-
b[60] = b[15].aid >> 24 & 255;
|
|
1266
|
-
const window_env_list = [];
|
|
1267
|
-
for (let index = 0; index < window_env_str.length; index++) {
|
|
1268
|
-
window_env_list.push(window_env_str.charCodeAt(index));
|
|
1269
|
-
}
|
|
1270
|
-
b[64] = window_env_list.length;
|
|
1271
|
-
b[65] = b[64] & 255;
|
|
1272
|
-
b[66] = b[64] >> 8 & 255;
|
|
1273
|
-
b[69] = [].length;
|
|
1274
|
-
b[70] = b[69] & 255;
|
|
1275
|
-
b[71] = b[69] >> 8 & 255;
|
|
1276
|
-
b[72] = b[18] ^ b[20] ^ b[26] ^ b[30] ^ b[38] ^ b[40] ^ b[42] ^ b[21] ^ b[27] ^ b[31] ^ b[35] ^ b[39] ^ b[41] ^ b[43] ^ b[22] ^ b[28] ^ b[32] ^ b[36] ^ b[23] ^ b[29] ^ b[33] ^ b[37] ^ b[44] ^ b[45] ^ b[46] ^ b[47] ^ b[48] ^ b[49] ^ b[50] ^ b[24] ^ b[25] ^ b[52] ^ b[53] ^ b[54] ^ b[55] ^ b[57] ^ b[58] ^ b[59] ^ b[60] ^ b[65] ^ b[66] ^ b[70] ^ b[71];
|
|
1277
|
-
let bb = [
|
|
1278
|
-
b[18],
|
|
1279
|
-
b[20],
|
|
1280
|
-
b[52],
|
|
1281
|
-
b[26],
|
|
1282
|
-
b[30],
|
|
1283
|
-
b[34],
|
|
1284
|
-
b[58],
|
|
1285
|
-
b[38],
|
|
1286
|
-
b[40],
|
|
1287
|
-
b[53],
|
|
1288
|
-
b[42],
|
|
1289
|
-
b[21],
|
|
1290
|
-
b[27],
|
|
1291
|
-
b[54],
|
|
1292
|
-
b[55],
|
|
1293
|
-
b[31],
|
|
1294
|
-
b[35],
|
|
1295
|
-
b[57],
|
|
1296
|
-
b[39],
|
|
1297
|
-
b[41],
|
|
1298
|
-
b[43],
|
|
1299
|
-
b[22],
|
|
1300
|
-
b[28],
|
|
1301
|
-
b[32],
|
|
1302
|
-
b[60],
|
|
1303
|
-
b[36],
|
|
1304
|
-
b[23],
|
|
1305
|
-
b[29],
|
|
1306
|
-
b[33],
|
|
1307
|
-
b[37],
|
|
1308
|
-
b[44],
|
|
1309
|
-
b[45],
|
|
1310
|
-
b[59],
|
|
1311
|
-
b[46],
|
|
1312
|
-
b[47],
|
|
1313
|
-
b[48],
|
|
1314
|
-
b[49],
|
|
1315
|
-
b[50],
|
|
1316
|
-
b[24],
|
|
1317
|
-
b[25],
|
|
1318
|
-
b[65],
|
|
1319
|
-
b[66],
|
|
1320
|
-
b[70],
|
|
1321
|
-
b[71]
|
|
1322
|
-
];
|
|
1323
|
-
bb = bb.concat(window_env_list).concat(b[72]);
|
|
1324
|
-
return rc4_encrypt(String.fromCharCode.apply(null, bb), String.fromCharCode.apply(null, [121]));
|
|
1325
|
-
}
|
|
1326
|
-
function generate_random_str() {
|
|
1327
|
-
let random_str_list = [];
|
|
1328
|
-
random_str_list = random_str_list.concat(gener_random(Math.random() * 1e4, [3, 45]));
|
|
1329
|
-
random_str_list = random_str_list.concat(gener_random(Math.random() * 1e4, [1, 0]));
|
|
1330
|
-
random_str_list = random_str_list.concat(gener_random(Math.random() * 1e4, [1, 5]));
|
|
1331
|
-
return String.fromCharCode.apply(null, random_str_list);
|
|
1332
|
-
}
|
|
1333
|
-
var cleanUserAgentForSigning = (userAgent) => {
|
|
1334
|
-
return userAgent.replace(/\s+Edg\/[\d\.]+/g, "");
|
|
1335
|
-
};
|
|
1336
|
-
var a_bogus_default = (url, user_agent) => {
|
|
1337
|
-
const cleanedUserAgent = cleanUserAgentForSigning(user_agent);
|
|
1338
|
-
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");
|
|
1339
|
-
return result_encrypt(result_str, "s4") + "=";
|
|
1340
|
-
};
|
|
1341
|
-
var XBogus = class {
|
|
1342
|
-
charMap;
|
|
1343
|
-
base64Charset;
|
|
1344
|
-
uaKey;
|
|
1345
|
-
defaultUa;
|
|
1346
|
-
params;
|
|
1347
|
-
xb;
|
|
1348
|
-
constructor() {
|
|
1349
|
-
this.charMap = new Array(128).fill(null);
|
|
1350
|
-
for (let i = 48; i <= 57; i++) {
|
|
1351
|
-
this.charMap[i] = i - 48;
|
|
1352
|
-
}
|
|
1353
|
-
for (let i = 65; i <= 70; i++) {
|
|
1354
|
-
this.charMap[i] = i - 55;
|
|
1355
|
-
}
|
|
1356
|
-
for (let i = 97; i <= 102; i++) {
|
|
1357
|
-
this.charMap[i] = i - 87;
|
|
1358
|
-
}
|
|
1359
|
-
this.base64Charset = "Dkdpgh4ZKsQB80/Mfvw36XI1R25-WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe=";
|
|
1360
|
-
this.uaKey = Buffer.from([0, 1, 12]);
|
|
1361
|
-
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";
|
|
1362
|
-
}
|
|
1363
|
-
md5StrToArray(md5Str) {
|
|
1364
|
-
const result = [];
|
|
1365
|
-
if (md5Str.length > 32) {
|
|
1366
|
-
for (const char of md5Str) {
|
|
1367
|
-
result.push(char.charCodeAt(0));
|
|
1368
|
-
}
|
|
1369
|
-
return result;
|
|
1370
|
-
}
|
|
1371
|
-
let idx = 0;
|
|
1372
|
-
while (idx < md5Str.length) {
|
|
1373
|
-
const leftCharCode = md5Str.charCodeAt(idx);
|
|
1374
|
-
const rightCharCode = md5Str.charCodeAt(idx + 1);
|
|
1375
|
-
const left = this.charMap[leftCharCode];
|
|
1376
|
-
const right = this.charMap[rightCharCode];
|
|
1377
|
-
if (left === null || right === null) {
|
|
1378
|
-
throw new Error(`Invalid MD5 character: ${md5Str[idx]}${md5Str[idx + 1]}`);
|
|
1379
|
-
}
|
|
1380
|
-
result.push(left << 4 | right);
|
|
1381
|
-
idx += 2;
|
|
1382
|
-
}
|
|
1383
|
-
return result;
|
|
1384
|
-
}
|
|
1385
|
-
md5(input) {
|
|
1386
|
-
const dataArray = typeof input === "string" ? this.md5StrToArray(input) : input;
|
|
1387
|
-
const dataBuffer = Buffer.from(dataArray);
|
|
1388
|
-
return crypto__default.default.createHash("md5").update(dataBuffer).digest("hex");
|
|
1389
|
-
}
|
|
1390
|
-
md5Encrypt(urlPath) {
|
|
1391
|
-
const firstMd5 = this.md5(urlPath);
|
|
1392
|
-
const firstArray = this.md5StrToArray(firstMd5);
|
|
1393
|
-
const secondMd5 = this.md5(firstArray);
|
|
1394
|
-
return this.md5StrToArray(secondMd5);
|
|
1395
|
-
}
|
|
1396
|
-
encodingConversion(...params) {
|
|
1397
|
-
const byteList = [];
|
|
1398
|
-
for (const param of params) {
|
|
1399
|
-
if (typeof param === "number") {
|
|
1400
|
-
byteList.push(Math.floor(param));
|
|
1401
|
-
} else if (typeof param === "string") {
|
|
1402
|
-
for (const char of param) {
|
|
1403
|
-
byteList.push(char.charCodeAt(0));
|
|
1404
|
-
}
|
|
1405
|
-
}
|
|
1406
|
-
}
|
|
1407
|
-
return Buffer.from(byteList).toString("latin1");
|
|
1408
|
-
}
|
|
1409
|
-
encodingConversion2(a, b, c) {
|
|
1410
|
-
return String.fromCharCode(a) + String.fromCharCode(b) + c;
|
|
1411
|
-
}
|
|
1412
|
-
rc4Encrypt(key, data2) {
|
|
1413
|
-
const keyBuffer = typeof key === "string" ? Buffer.from(key, "latin1") : key;
|
|
1414
|
-
const dataBuffer = Buffer.from(data2, "latin1");
|
|
1415
|
-
const S = Array.from({ length: 256 }, (_, i2) => i2);
|
|
1416
|
-
let j = 0;
|
|
1417
|
-
for (let i2 = 0; i2 < 256; i2++) {
|
|
1418
|
-
j = (j + S[i2] + keyBuffer[i2 % keyBuffer.length]) % 256;
|
|
1419
|
-
[S[i2], S[j]] = [S[j], S[i2]];
|
|
1420
|
-
}
|
|
1421
|
-
const encryptedBuffer = Buffer.alloc(dataBuffer.length);
|
|
1422
|
-
let i = 0;
|
|
1423
|
-
j = 0;
|
|
1424
|
-
for (let k = 0; k < dataBuffer.length; k++) {
|
|
1425
|
-
i = (i + 1) % 256;
|
|
1426
|
-
j = (j + S[i]) % 256;
|
|
1427
|
-
[S[i], S[j]] = [S[j], S[i]];
|
|
1428
|
-
const t = (S[i] + S[j]) % 256;
|
|
1429
|
-
encryptedBuffer[k] = dataBuffer[k] ^ S[t];
|
|
1430
|
-
}
|
|
1431
|
-
return encryptedBuffer.toString("latin1");
|
|
1432
|
-
}
|
|
1433
|
-
calculation(a1, a2, a3) {
|
|
1434
|
-
const x1 = (a1 & 255) << 16;
|
|
1435
|
-
const x2 = (a2 & 255) << 8;
|
|
1436
|
-
const x3 = x1 | x2 | a3 & 255;
|
|
1437
|
-
const c1 = this.base64Charset[(x3 & 16760832) >> 18];
|
|
1438
|
-
const c2 = this.base64Charset[(x3 & 258048) >> 12];
|
|
1439
|
-
const c3 = this.base64Charset[(x3 & 4032) >> 6];
|
|
1440
|
-
const c4 = this.base64Charset[x3 & 63];
|
|
1441
|
-
return c1 + c2 + c3 + c4;
|
|
1442
|
-
}
|
|
1443
|
-
/**
|
|
1444
|
-
* 生成X-Bogus签名
|
|
1445
|
-
* @param url 完整的URL地址
|
|
1446
|
-
* @param ua 可选的User-Agent,不提供则使用默认值
|
|
1447
|
-
* @returns 包含完整URL、X-Bogus值和使用的User-Agent的元组
|
|
1448
|
-
*/
|
|
1449
|
-
getXBogus(url, ua) {
|
|
1450
|
-
const parsedUrl = new URL2__default.default.URL(url);
|
|
1451
|
-
const urlPath = parsedUrl.pathname + parsedUrl.search;
|
|
1452
|
-
const currentUa = ua || this.defaultUa;
|
|
1453
|
-
const rc4EncryptedUa = this.rc4Encrypt(this.uaKey, currentUa);
|
|
1454
|
-
const base64Ua = Buffer.from(rc4EncryptedUa, "latin1").toString("base64");
|
|
1455
|
-
const md5Ua = this.md5(base64Ua);
|
|
1456
|
-
const array1 = this.md5StrToArray(md5Ua);
|
|
1457
|
-
const emptyStrMd5 = "d41d8cd98f00b204e9800998ecf8427e";
|
|
1458
|
-
const array2 = this.md5StrToArray(this.md5(this.md5StrToArray(emptyStrMd5)));
|
|
1459
|
-
const urlEncryptedArray = this.md5Encrypt(urlPath);
|
|
1460
|
-
const timestamp = Math.floor(Date.now() / 1e3);
|
|
1461
|
-
const ct = 536919696;
|
|
1462
|
-
const newArray = [
|
|
1463
|
-
64,
|
|
1464
|
-
1,
|
|
1465
|
-
1,
|
|
1466
|
-
12,
|
|
1467
|
-
urlEncryptedArray[14],
|
|
1468
|
-
urlEncryptedArray[15],
|
|
1469
|
-
array2[14],
|
|
1470
|
-
array2[15],
|
|
1471
|
-
array1[14],
|
|
1472
|
-
array1[15],
|
|
1473
|
-
timestamp >> 24 & 255,
|
|
1474
|
-
timestamp >> 16 & 255,
|
|
1475
|
-
timestamp >> 8 & 255,
|
|
1476
|
-
timestamp & 255,
|
|
1477
|
-
ct >> 24 & 255,
|
|
1478
|
-
ct >> 16 & 255,
|
|
1479
|
-
ct >> 8 & 255,
|
|
1480
|
-
ct & 255
|
|
1481
|
-
];
|
|
1482
|
-
let xorResult = newArray[0];
|
|
1483
|
-
for (let i = 1; i < newArray.length; i++) {
|
|
1484
|
-
xorResult ^= newArray[i];
|
|
1485
|
-
}
|
|
1486
|
-
newArray.push(xorResult);
|
|
1487
|
-
const array3 = [];
|
|
1488
|
-
const array4 = [];
|
|
1489
|
-
let idx = 0;
|
|
1490
|
-
while (idx < newArray.length) {
|
|
1491
|
-
array3.push(newArray[idx]);
|
|
1492
|
-
if (idx + 1 < newArray.length) {
|
|
1493
|
-
array4.push(newArray[idx + 1]);
|
|
1494
|
-
}
|
|
1495
|
-
idx += 2;
|
|
1496
|
-
}
|
|
1497
|
-
const mergedArray = [...array3, ...array4];
|
|
1498
|
-
const firstConversion = this.encodingConversion(...mergedArray);
|
|
1499
|
-
const rc4Garbled = this.rc4Encrypt("\xFF", firstConversion);
|
|
1500
|
-
const garbledCode = this.encodingConversion2(2, 255, rc4Garbled);
|
|
1501
|
-
let xb = "";
|
|
1502
|
-
idx = 0;
|
|
1503
|
-
while (idx < garbledCode.length) {
|
|
1504
|
-
if (idx + 2 >= garbledCode.length) break;
|
|
1505
|
-
const a1 = garbledCode.charCodeAt(idx);
|
|
1506
|
-
const a2 = garbledCode.charCodeAt(idx + 1);
|
|
1507
|
-
const a3 = garbledCode.charCodeAt(idx + 2);
|
|
1508
|
-
xb += this.calculation(a1, a2, a3);
|
|
1509
|
-
idx += 3;
|
|
1510
|
-
}
|
|
1511
|
-
const fullUrl = url.includes("?") ? `${url}&X-Bogus=${xb}` : `${url}?X-Bogus=${xb}`;
|
|
1512
|
-
return {
|
|
1513
|
-
fullUrl,
|
|
1514
|
-
xbogus: xb,
|
|
1515
|
-
userAgent: currentUa
|
|
1516
|
-
};
|
|
1517
|
-
}
|
|
1518
|
-
};
|
|
1519
|
-
|
|
1520
|
-
// src/platform/douyin/sign/index.ts
|
|
1521
|
-
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";
|
|
1522
|
-
var douyinSign = class {
|
|
1523
|
-
/**
|
|
1524
|
-
* 生成一个指定长度的随机字符串
|
|
1525
|
-
* @param length 字符串长度,默认为116
|
|
1526
|
-
* @returns
|
|
1527
|
-
*/
|
|
1528
|
-
static Mstoken(length) {
|
|
1529
|
-
const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
|
1530
|
-
const randomBytes = crypto__default.default.randomBytes(length ?? 116);
|
|
1531
|
-
return Array.from(randomBytes, (byte) => characters[byte % characters.length]).join("");
|
|
1532
|
-
}
|
|
1533
|
-
/**
|
|
1534
|
-
* a_bogus 签名算法
|
|
1535
|
-
* @param url 需要签名的地址
|
|
1536
|
-
* @returns 对此地址签名后的URL查询参数
|
|
1537
|
-
*/
|
|
1538
|
-
static AB(url, userAgent) {
|
|
1539
|
-
return a_bogus_default(url, userAgent || defaultUserAgent);
|
|
1540
|
-
}
|
|
1541
|
-
/**
|
|
1542
|
-
* X-Bogus 签名算法
|
|
1543
|
-
* @param url 需要签名的地址
|
|
1544
|
-
* @returns 对此地址签名后的URL查询参数
|
|
1545
|
-
*/
|
|
1546
|
-
static XB(url, userAgent) {
|
|
1547
|
-
const xbogusResult = new XBogus().getXBogus(url, userAgent || defaultUserAgent);
|
|
1548
|
-
return xbogusResult.xbogus;
|
|
1549
|
-
}
|
|
1550
|
-
/** 生成一个唯一的验证字符串 */
|
|
1551
|
-
static VerifyFpManager() {
|
|
1552
|
-
const e = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split("");
|
|
1553
|
-
const t = e.length;
|
|
1554
|
-
const n = (/* @__PURE__ */ new Date()).getTime().toString(36);
|
|
1555
|
-
const r = [];
|
|
1556
|
-
r[8] = "_";
|
|
1557
|
-
r[13] = "_";
|
|
1558
|
-
r[18] = "_";
|
|
1559
|
-
r[23] = "_";
|
|
1560
|
-
r[14] = "4";
|
|
1561
|
-
for (let o, i = 0; i < 36; i++) {
|
|
1562
|
-
if (!r[i]) {
|
|
1563
|
-
o = 0 | Math.random() * t;
|
|
1564
|
-
r[i] = e[i === 19 ? 3 & o | 8 : o];
|
|
1565
|
-
}
|
|
1566
|
-
}
|
|
1567
|
-
return "verify_" + n + "_" + r.join("");
|
|
1568
|
-
}
|
|
1569
|
-
};
|
|
1570
|
-
|
|
1571
|
-
// src/platform/douyin/API.ts
|
|
1572
|
-
var extractBrowserVersion = (userAgent) => {
|
|
1573
|
-
if (!userAgent) return "125.0.0.0";
|
|
1574
|
-
const chromeMatch = userAgent.match(/Chrome\/(\d+\.\d+\.\d+\.\d+)/);
|
|
1575
|
-
if (chromeMatch) {
|
|
1576
|
-
return chromeMatch[1];
|
|
1577
|
-
}
|
|
1578
|
-
const edgeMatch = userAgent.match(/Edg\/(\d+\.\d+\.\d+\.\d+)/);
|
|
1579
|
-
if (edgeMatch) {
|
|
1580
|
-
return edgeMatch[1];
|
|
1581
|
-
}
|
|
1582
|
-
return "125.0.0.0";
|
|
1583
|
-
};
|
|
1584
|
-
var buildQueryString = (params) => {
|
|
1585
|
-
return Object.entries(params).filter(([_, value]) => value !== void 0 && value !== null).map(([key, value]) => `${key}=${encodeURIComponent(value)}`).join("&");
|
|
1586
|
-
};
|
|
1587
|
-
var fp = douyinSign.VerifyFpManager();
|
|
1588
|
-
var DouyinAPI = class {
|
|
1589
|
-
browserVersion;
|
|
1590
|
-
/**
|
|
1591
|
-
* 构造函数
|
|
1592
|
-
* @param userAgent - 用户代理字符串,用于提取浏览器版本信息
|
|
1593
|
-
*/
|
|
1594
|
-
constructor(userAgent) {
|
|
1595
|
-
this.browserVersion = extractBrowserVersion(userAgent);
|
|
1596
|
-
}
|
|
1597
|
-
/**
|
|
1598
|
-
* 获取通用的基础参数
|
|
1599
|
-
* @returns 通用基础参数对象
|
|
1600
|
-
*/
|
|
1601
|
-
getBaseParams() {
|
|
1602
|
-
return {
|
|
1603
|
-
device_platform: "webapp",
|
|
1604
|
-
aid: "6383",
|
|
1605
|
-
channel: "channel_pc_web",
|
|
1606
|
-
pc_client_type: "1",
|
|
1607
|
-
cookie_enabled: "true",
|
|
1608
|
-
browser_language: "zh-CN",
|
|
1609
|
-
browser_platform: "Win32",
|
|
1610
|
-
browser_name: "Chrome",
|
|
1611
|
-
browser_version: this.browserVersion,
|
|
1612
|
-
browser_online: "true",
|
|
1613
|
-
engine_name: "Blink",
|
|
1614
|
-
engine_version: this.browserVersion,
|
|
1615
|
-
os_name: "Windows",
|
|
1616
|
-
os_version: "10",
|
|
1617
|
-
cpu_core_num: "16",
|
|
1618
|
-
device_memory: "8",
|
|
1619
|
-
platform: "PC",
|
|
1620
|
-
downlink: "10",
|
|
1621
|
-
effective_type: "4g",
|
|
1622
|
-
msToken: douyinSign.Mstoken(116),
|
|
1623
|
-
verifyFp: fp,
|
|
1624
|
-
fp
|
|
1625
|
-
};
|
|
1626
|
-
}
|
|
1627
|
-
/**
|
|
1628
|
-
* 获取视频或图集数据的接口地址
|
|
1629
|
-
* @param data - 请求参数,包含aweme_id
|
|
1630
|
-
* @returns 完整的接口URL
|
|
1631
|
-
*/
|
|
1632
|
-
\u89C6\u9891\u6216\u56FE\u96C6(data2) {
|
|
1633
|
-
const baseUrl = "https://www.douyin.com/aweme/v1/web/aweme/detail/";
|
|
1634
|
-
const params = {
|
|
1635
|
-
...this.getBaseParams(),
|
|
1636
|
-
aweme_id: data2.aweme_id,
|
|
1637
|
-
update_version_code: "170400",
|
|
1638
|
-
version_code: "190500",
|
|
1639
|
-
version_name: "19.5.0",
|
|
1640
|
-
screen_width: "2328",
|
|
1641
|
-
screen_height: "1310",
|
|
1642
|
-
round_trip_time: "150",
|
|
1643
|
-
webid: "7351848354471872041"
|
|
1644
|
-
};
|
|
1645
|
-
return `${baseUrl}?${buildQueryString(params)}`;
|
|
1646
|
-
}
|
|
1647
|
-
/**
|
|
1648
|
-
* 获取评论数据的接口地址
|
|
1649
|
-
* @param data - 请求参数,包含aweme_id、cursor、number等
|
|
1650
|
-
* @returns 完整的接口URL
|
|
1651
|
-
*/
|
|
1652
|
-
\u8BC4\u8BBA(data2) {
|
|
1653
|
-
const baseUrl = "https://www.douyin.com/aweme/v1/web/comment/list/";
|
|
1654
|
-
const params = {
|
|
1655
|
-
...this.getBaseParams(),
|
|
1656
|
-
aweme_id: data2.aweme_id,
|
|
1657
|
-
cursor: data2.cursor ?? 0,
|
|
1658
|
-
count: data2.number ?? 50,
|
|
1659
|
-
item_type: "0",
|
|
1660
|
-
insert_ids: "",
|
|
1661
|
-
whale_cut_token: "",
|
|
1662
|
-
cut_version: "1",
|
|
1663
|
-
rcFT: "",
|
|
1664
|
-
version_code: "170400",
|
|
1665
|
-
version_name: "17.4.0",
|
|
1666
|
-
screen_width: "1552",
|
|
1667
|
-
screen_height: "970",
|
|
1668
|
-
round_trip_time: "50"
|
|
1669
|
-
};
|
|
1670
|
-
return `${baseUrl}?${buildQueryString(params)}`;
|
|
1671
|
-
}
|
|
1672
|
-
/**
|
|
1673
|
-
* 获取二级评论数据的接口地址
|
|
1674
|
-
* @param data - 请求参数,包含aweme_id、comment_id等
|
|
1675
|
-
* @returns 完整的接口URL
|
|
1676
|
-
*/
|
|
1677
|
-
\u4E8C\u7EA7\u8BC4\u8BBA(data2) {
|
|
1678
|
-
const baseUrl = "https://www-hj.douyin.com/aweme/v1/web/comment/list/reply/";
|
|
1679
|
-
const params = {
|
|
1680
|
-
device_platform: "webapp",
|
|
1681
|
-
aid: "6383",
|
|
1682
|
-
channel: "channel_pc_web",
|
|
1683
|
-
item_id: data2.aweme_id,
|
|
1684
|
-
comment_id: data2.comment_id,
|
|
1685
|
-
cut_version: "1",
|
|
1686
|
-
cursor: data2.cursor,
|
|
1687
|
-
count: data2.number,
|
|
1688
|
-
item_type: "0",
|
|
1689
|
-
update_version_code: "170400",
|
|
1690
|
-
pc_client_type: "1",
|
|
1691
|
-
pc_libra_divert: "Windows",
|
|
1692
|
-
support_h265: "1",
|
|
1693
|
-
support_dash: "1",
|
|
1694
|
-
version_code: "170400",
|
|
1695
|
-
version_name: "17.4.0",
|
|
1696
|
-
cookie_enabled: "true",
|
|
1697
|
-
screen_width: "1552",
|
|
1698
|
-
screen_height: "970",
|
|
1699
|
-
browser_language: "zh-CN",
|
|
1700
|
-
browser_platform: "Win32",
|
|
1701
|
-
browser_name: "Edge",
|
|
1702
|
-
browser_version: this.browserVersion,
|
|
1703
|
-
browser_online: "true",
|
|
1704
|
-
engine_name: "Blink",
|
|
1705
|
-
engine_version: this.browserVersion,
|
|
1706
|
-
os_name: "Windows",
|
|
1707
|
-
os_version: "10",
|
|
1708
|
-
cpu_core_num: "16",
|
|
1709
|
-
device_memory: "8",
|
|
1710
|
-
platform: "PC",
|
|
1711
|
-
downlink: "10",
|
|
1712
|
-
effective_type: "4g",
|
|
1713
|
-
round_trip_time: "50",
|
|
1714
|
-
webid: "7487210762873685515",
|
|
1715
|
-
verifyFp: fp,
|
|
1716
|
-
fp
|
|
1717
|
-
};
|
|
1718
|
-
return `${baseUrl}?${buildQueryString(params)}`;
|
|
1719
|
-
}
|
|
1720
|
-
/**
|
|
1721
|
-
* 获取动图数据的接口地址
|
|
1722
|
-
* @param data - 请求参数,包含aweme_id
|
|
1723
|
-
* @returns 完整的接口URL
|
|
1724
|
-
*/
|
|
1725
|
-
\u52A8\u56FE(data2) {
|
|
1726
|
-
const baseUrl = "https://www.iesdouyin.com/web/api/v2/aweme/slidesinfo/";
|
|
1727
|
-
const params = {
|
|
1728
|
-
reflow_source: "reflow_page",
|
|
1729
|
-
web_id: "7326472315356857893",
|
|
1730
|
-
device_id: "7326472315356857893",
|
|
1731
|
-
aweme_ids: `[${data2.aweme_id}]`,
|
|
1732
|
-
request_source: "200",
|
|
1733
|
-
msToken: douyinSign.Mstoken(116),
|
|
1734
|
-
verifyFp: fp,
|
|
1735
|
-
fp
|
|
1736
|
-
};
|
|
1737
|
-
return `${baseUrl}?${buildQueryString(params)}`;
|
|
1738
|
-
}
|
|
1739
|
-
/**
|
|
1740
|
-
* 获取表情数据的接口地址
|
|
1741
|
-
* @returns 完整的接口URL
|
|
1742
|
-
*/
|
|
1743
|
-
\u8868\u60C5() {
|
|
1744
|
-
return "https://www.douyin.com/aweme/v1/web/emoji/list";
|
|
1745
|
-
}
|
|
1746
|
-
/**
|
|
1747
|
-
* 获取用户主页视频数据的接口地址
|
|
1748
|
-
* @param data - 请求参数,包含sec_uid
|
|
1749
|
-
* @returns 完整的接口URL
|
|
1750
|
-
*/
|
|
1751
|
-
\u7528\u6237\u4E3B\u9875\u89C6\u9891(data2) {
|
|
1752
|
-
const baseUrl = "https://www.douyin.com/aweme/v1/web/aweme/post/";
|
|
1753
|
-
const params = {
|
|
1754
|
-
...this.getBaseParams(),
|
|
1755
|
-
sec_user_id: data2.sec_uid,
|
|
1756
|
-
max_cursor: "0",
|
|
1757
|
-
locate_query: "false",
|
|
1758
|
-
show_live_replay_strategy: "1",
|
|
1759
|
-
need_time_list: "1",
|
|
1760
|
-
time_list_query: "0",
|
|
1761
|
-
whale_cut_token: "",
|
|
1762
|
-
cut_version: "1",
|
|
1763
|
-
count: "18",
|
|
1764
|
-
publish_video_strategy_type: "2",
|
|
1765
|
-
version_code: "170400",
|
|
1766
|
-
version_name: "17.4.0",
|
|
1767
|
-
screen_width: "1552",
|
|
1768
|
-
screen_height: "970",
|
|
1769
|
-
round_trip_time: "50",
|
|
1770
|
-
webid: "7338423850134226495"
|
|
1771
|
-
};
|
|
1772
|
-
return `${baseUrl}?${buildQueryString(params)}`;
|
|
1773
|
-
}
|
|
1774
|
-
/**
|
|
1775
|
-
* 获取用户主页信息的接口地址
|
|
1776
|
-
* @param data - 请求参数,包含sec_uid
|
|
1777
|
-
* @returns 完整的接口URL
|
|
1778
|
-
*/
|
|
1779
|
-
\u7528\u6237\u4E3B\u9875\u4FE1\u606F(data2) {
|
|
1780
|
-
const baseUrl = "https://www.douyin.com/aweme/v1/web/user/profile/other/";
|
|
1781
|
-
const params = {
|
|
1782
|
-
...this.getBaseParams(),
|
|
1783
|
-
publish_video_strategy_type: "2",
|
|
1784
|
-
source: "channel_pc_web",
|
|
1785
|
-
sec_user_id: data2.sec_uid,
|
|
1786
|
-
personal_center_strategy: "1",
|
|
1787
|
-
version_code: "170400",
|
|
1788
|
-
version_name: "17.4.0",
|
|
1789
|
-
screen_width: "1552",
|
|
1790
|
-
screen_height: "970",
|
|
1791
|
-
round_trip_time: "0",
|
|
1792
|
-
webid: "7327957959955580467"
|
|
1793
|
-
};
|
|
1794
|
-
return `${baseUrl}?${buildQueryString(params)}`;
|
|
1795
|
-
}
|
|
1796
|
-
/**
|
|
1797
|
-
* 获取热点词数据的接口地址
|
|
1798
|
-
* @param data - 请求参数,包含query
|
|
1799
|
-
* @returns 完整的接口URL
|
|
1800
|
-
*/
|
|
1801
|
-
\u70ED\u70B9\u8BCD(data2) {
|
|
1802
|
-
const baseUrl = "https://www.douyin.com/aweme/v1/web/api/suggest_words/";
|
|
1803
|
-
const params = {
|
|
1804
|
-
...this.getBaseParams(),
|
|
1805
|
-
query: data2.query,
|
|
1806
|
-
business_id: "30088",
|
|
1807
|
-
from_group_id: "7129543174929812767",
|
|
1808
|
-
version_code: "170400",
|
|
1809
|
-
version_name: "17.4.0",
|
|
1810
|
-
screen_width: "1552",
|
|
1811
|
-
screen_height: "970",
|
|
1812
|
-
round_trip_time: "50",
|
|
1813
|
-
webid: "7327957959955580467"
|
|
1814
|
-
};
|
|
1815
|
-
return `${baseUrl}?${buildQueryString(params)}`;
|
|
1816
|
-
}
|
|
1817
|
-
/**
|
|
1818
|
-
* 获取搜索数据的接口地址
|
|
1819
|
-
* @param data - 请求参数,包含query、number、search_id等
|
|
1820
|
-
* @returns 完整的接口URL
|
|
1821
|
-
*/
|
|
1822
|
-
\u641C\u7D22(data2) {
|
|
1823
|
-
const baseUrl = "https://www.douyin.com/aweme/v1/web/general/search/single/";
|
|
1824
|
-
const params = {
|
|
1825
|
-
...this.getBaseParams(),
|
|
1826
|
-
search_channel: "aweme_general",
|
|
1827
|
-
sort_type: "0",
|
|
1828
|
-
publish_time: "0",
|
|
1829
|
-
keyword: data2.query,
|
|
1830
|
-
search_source: "normal_search",
|
|
1831
|
-
query_correct_type: "1",
|
|
1832
|
-
is_filter_search: "0",
|
|
1833
|
-
from_group_id: "",
|
|
1834
|
-
offset: "0",
|
|
1835
|
-
version_code: "190600",
|
|
1836
|
-
version_name: "19.6.0",
|
|
1837
|
-
screen_width: "1552",
|
|
1838
|
-
screen_height: "970",
|
|
1839
|
-
round_trip_time: "50",
|
|
1840
|
-
webid: "7338423850134226495",
|
|
1841
|
-
search_id: data2.search_id ?? "",
|
|
1842
|
-
count: data2.number ?? 10
|
|
1843
|
-
};
|
|
1844
|
-
return `${baseUrl}?${buildQueryString(params)}`;
|
|
1845
|
-
}
|
|
1846
|
-
/**
|
|
1847
|
-
* 获取互动表情数据的接口地址
|
|
1848
|
-
* @returns 完整的接口URL
|
|
1849
|
-
*/
|
|
1850
|
-
\u4E92\u52A8\u8868\u60C5() {
|
|
1851
|
-
const baseUrl = "https://www.douyin.com/aweme/v1/web/im/strategy/config";
|
|
1852
|
-
const params = {
|
|
1853
|
-
device_platform: "webapp",
|
|
1854
|
-
aid: "1128",
|
|
1855
|
-
channel: "channel_pc_web",
|
|
1856
|
-
publish_video_strategy_type: "2",
|
|
1857
|
-
app_id: "1128",
|
|
1858
|
-
scenes: "[%22interactive_resources%22]",
|
|
1859
|
-
pc_client_type: "1",
|
|
1860
|
-
version_code: "170400",
|
|
1861
|
-
version_name: "17.4.0",
|
|
1862
|
-
cookie_enabled: "true",
|
|
1863
|
-
screen_width: "2328",
|
|
1864
|
-
screen_height: "1310",
|
|
1865
|
-
browser_language: "zh-CN",
|
|
1866
|
-
browser_platform: "Win32",
|
|
1867
|
-
browser_name: "Chrome",
|
|
1868
|
-
browser_version: "126.0.0.0",
|
|
1869
|
-
browser_online: "true",
|
|
1870
|
-
engine_name: "Blink",
|
|
1871
|
-
engine_version: "126.0.0.0",
|
|
1872
|
-
os_name: "Windows",
|
|
1873
|
-
os_version: "10",
|
|
1874
|
-
cpu_core_num: "16",
|
|
1875
|
-
device_memory: "8",
|
|
1876
|
-
platform: "PC",
|
|
1877
|
-
downlink: "1.5",
|
|
1878
|
-
effective_type: "4g",
|
|
1879
|
-
round_trip_time: "350",
|
|
1880
|
-
webid: "7347329698282833447",
|
|
1881
|
-
msToken: douyinSign.Mstoken(116),
|
|
1882
|
-
verifyFp: fp,
|
|
1883
|
-
fp
|
|
1884
|
-
};
|
|
1885
|
-
return `${baseUrl}?${buildQueryString(params)}`;
|
|
1886
|
-
}
|
|
1887
|
-
/**
|
|
1888
|
-
* 获取背景音乐数据的接口地址
|
|
1889
|
-
* @param data - 请求参数,包含music_id
|
|
1890
|
-
* @returns 完整的接口URL
|
|
1891
|
-
*/
|
|
1892
|
-
\u80CC\u666F\u97F3\u4E50(data2) {
|
|
1893
|
-
const baseUrl = "https://www.douyin.com/aweme/v1/web/music/detail/";
|
|
1894
|
-
const params = {
|
|
1895
|
-
device_platform: "webapp",
|
|
1896
|
-
aid: "6383",
|
|
1897
|
-
channel: "channel_pc_web",
|
|
1898
|
-
music_id: data2.music_id,
|
|
1899
|
-
scene: "1",
|
|
1900
|
-
pc_client_type: "1",
|
|
1901
|
-
version_code: "170400",
|
|
1902
|
-
version_name: "17.4.0",
|
|
1903
|
-
cookie_enabled: "true",
|
|
1904
|
-
screen_width: "2328",
|
|
1905
|
-
screen_height: "1310",
|
|
1906
|
-
browser_language: "zh-CN",
|
|
1907
|
-
browser_platform: "Win32",
|
|
1908
|
-
browser_name: "Chrome",
|
|
1909
|
-
browser_version: "126.0.0.0",
|
|
1910
|
-
browser_online: "true",
|
|
1911
|
-
engine_name: "Blink",
|
|
1912
|
-
engine_version: "126.0.0.0",
|
|
1913
|
-
os_name: "Windows",
|
|
1914
|
-
os_version: "10",
|
|
1915
|
-
cpu_core_num: "16",
|
|
1916
|
-
device_memory: "8",
|
|
1917
|
-
platform: "PC",
|
|
1918
|
-
downlink: "1.5",
|
|
1919
|
-
effective_type: "4g",
|
|
1920
|
-
round_trip_time: "350",
|
|
1921
|
-
webid: "7347329698282833447",
|
|
1922
|
-
msToken: douyinSign.Mstoken(116),
|
|
1923
|
-
verifyFp: fp,
|
|
1924
|
-
fp
|
|
1925
|
-
};
|
|
1926
|
-
return `${baseUrl}?${buildQueryString(params)}`;
|
|
1927
|
-
}
|
|
1928
|
-
/**
|
|
1929
|
-
* 获取直播间信息的接口地址
|
|
1930
|
-
* @param data - 请求参数,包含web_rid、room_id
|
|
1931
|
-
* @returns 完整的接口URL
|
|
1932
|
-
*/
|
|
1933
|
-
\u76F4\u64AD\u95F4\u4FE1\u606F(data2) {
|
|
1934
|
-
const baseUrl = "https://live.douyin.com/webcast/room/web/enter/";
|
|
1935
|
-
const params = {
|
|
1936
|
-
aid: "6383",
|
|
1937
|
-
app_name: "douyin_web",
|
|
1938
|
-
live_id: "1",
|
|
1939
|
-
device_platform: "web",
|
|
1940
|
-
language: "zh-CN",
|
|
1941
|
-
enter_from: "web_share_link",
|
|
1942
|
-
cookie_enabled: "true",
|
|
1943
|
-
screen_width: "2048",
|
|
1944
|
-
screen_height: "1152",
|
|
1945
|
-
browser_language: "zh-CN",
|
|
1946
|
-
browser_platform: "Win32",
|
|
1947
|
-
browser_name: "Chrome",
|
|
1948
|
-
browser_version: "125.0.0.0",
|
|
1949
|
-
web_rid: data2.web_rid,
|
|
1950
|
-
room_id_str: data2.room_id,
|
|
1951
|
-
enter_source: "",
|
|
1952
|
-
is_need_double_stream: "false",
|
|
1953
|
-
insert_task_id: "",
|
|
1954
|
-
live_reason: "",
|
|
1955
|
-
msToken: douyinSign.Mstoken(116),
|
|
1956
|
-
verifyFp: fp,
|
|
1957
|
-
fp
|
|
1958
|
-
};
|
|
1959
|
-
return `${baseUrl}?${buildQueryString(params)}`;
|
|
1960
|
-
}
|
|
1961
|
-
/**
|
|
1962
|
-
* 获取申请二维码的接口地址
|
|
1963
|
-
* @param data - 请求参数,包含verify_fp
|
|
1964
|
-
* @returns 完整的接口URL
|
|
1965
|
-
*/
|
|
1966
|
-
\u7533\u8BF7\u4E8C\u7EF4\u7801(data2) {
|
|
1967
|
-
const baseUrl = "https://sso.douyin.com/get_qrcode/";
|
|
1968
|
-
const params = {
|
|
1969
|
-
verifyFp: data2.verify_fp,
|
|
1970
|
-
fp: data2.verify_fp
|
|
1971
|
-
};
|
|
1972
|
-
return `${baseUrl}?${buildQueryString(params)}`;
|
|
1973
|
-
}
|
|
1974
|
-
/**
|
|
1975
|
-
* 获取弹幕数据的接口地址
|
|
1976
|
-
* @param data - 请求参数,包含group_id、item_id等
|
|
1977
|
-
* @returns 完整的接口URL
|
|
1978
|
-
*/
|
|
1979
|
-
\u5F39\u5E55(data2) {
|
|
1980
|
-
const baseUrl = "https://www-hj.douyin.com/aweme/v1/web/danmaku/get_v2/";
|
|
1981
|
-
const params = {
|
|
1982
|
-
...this.getBaseParams(),
|
|
1983
|
-
app_name: "aweme",
|
|
1984
|
-
format: "json",
|
|
1985
|
-
group_id: data2.aweme_id,
|
|
1986
|
-
item_id: data2.aweme_id,
|
|
1987
|
-
start_time: data2.start_time ?? "0",
|
|
1988
|
-
end_time: data2.end_time ?? "32000",
|
|
1989
|
-
duration: data2.duration,
|
|
1990
|
-
update_version_code: "170400",
|
|
1991
|
-
pc_libra_divert: "Windows",
|
|
1992
|
-
support_h265: "1",
|
|
1993
|
-
support_dash: "1",
|
|
1994
|
-
version_code: "170400",
|
|
1995
|
-
version_name: "17.4.0",
|
|
1996
|
-
screen_width: "2328",
|
|
1997
|
-
screen_height: "1310",
|
|
1998
|
-
browser_name: "Edge",
|
|
1999
|
-
browser_version: "140.0.0.0",
|
|
2000
|
-
engine_name: "Blink",
|
|
2001
|
-
engine_version: "140.0.0.0",
|
|
2002
|
-
downlink: "1.55",
|
|
2003
|
-
round_trip_time: "200",
|
|
2004
|
-
webid: "7487210762873685515",
|
|
2005
|
-
msToken: douyinSign.Mstoken(116),
|
|
2006
|
-
verifyFp: fp,
|
|
2007
|
-
fp
|
|
2008
|
-
};
|
|
2009
|
-
return `${baseUrl}?${buildQueryString(params)}`;
|
|
2010
|
-
}
|
|
2011
|
-
};
|
|
2012
|
-
var createDouyinApiUrls = (userAgent) => {
|
|
2013
|
-
return new DouyinAPI(userAgent);
|
|
2014
|
-
};
|
|
2015
|
-
var douyinApiUrls = new DouyinAPI();
|
|
2016
|
-
|
|
2017
|
-
// src/platform/douyin/getdata.ts
|
|
2018
|
-
var getSignature = (url, signType = "a_bogus", userAgent) => {
|
|
2019
|
-
switch (signType) {
|
|
2020
|
-
case "x_bogus":
|
|
2021
|
-
return douyinSign.XB(url, userAgent);
|
|
2022
|
-
case "a_bogus":
|
|
2023
|
-
default:
|
|
2024
|
-
return douyinSign.AB(url, userAgent);
|
|
2025
|
-
}
|
|
2026
|
-
};
|
|
2027
|
-
var getSignParamName = (signType = "a_bogus") => {
|
|
2028
|
-
switch (signType) {
|
|
2029
|
-
case "x_bogus":
|
|
2030
|
-
return "X-Bogus";
|
|
2031
|
-
case "a_bogus":
|
|
2032
|
-
default:
|
|
2033
|
-
return "a_bogus";
|
|
2034
|
-
}
|
|
2035
|
-
};
|
|
2036
|
-
var buildSignedUrl = (url, signType = "a_bogus", userAgent) => {
|
|
2037
|
-
const signature = getSignature(url, signType, userAgent);
|
|
2038
|
-
const paramName = getSignParamName(signType);
|
|
2039
|
-
return `${url}&${paramName}=${signature}`;
|
|
2040
|
-
};
|
|
2041
|
-
var DouyinData = async (data2, cookie, requestConfig) => {
|
|
2042
|
-
var _a, _b, _c, _d, _e;
|
|
2043
|
-
const defHeaders = getDouyinDefaultConfig(cookie)["headers"];
|
|
2044
|
-
const baseRequestConfig = {
|
|
2045
|
-
method: "GET",
|
|
2046
|
-
timeout: 1e4,
|
|
2047
|
-
...requestConfig,
|
|
2048
|
-
headers: {
|
|
2049
|
-
...defHeaders,
|
|
2050
|
-
...(requestConfig == null ? void 0 : requestConfig.headers) || {}
|
|
2051
|
-
}
|
|
2052
|
-
};
|
|
2053
|
-
const userAgent = (_a = baseRequestConfig.headers) == null ? void 0 : _a["User-Agent"];
|
|
2054
|
-
const douyinApiUrls2 = createDouyinApiUrls(userAgent);
|
|
2055
|
-
const signType = data2.signType || "a_bogus";
|
|
2056
|
-
switch (data2.methodType) {
|
|
2057
|
-
case "\u6587\u5B57\u4F5C\u54C1\u6570\u636E":
|
|
2058
|
-
case "\u805A\u5408\u89E3\u6790":
|
|
2059
|
-
case "\u89C6\u9891\u4F5C\u54C1\u6570\u636E":
|
|
2060
|
-
case "\u56FE\u96C6\u4F5C\u54C1\u6570\u636E":
|
|
2061
|
-
case "\u5408\u8F91\u4F5C\u54C1\u6570\u636E": {
|
|
2062
|
-
const url = douyinApiUrls2.\u89C6\u9891\u6216\u56FE\u96C6({ aweme_id: data2.aweme_id });
|
|
2063
|
-
const VideoData = await GlobalGetData2(data2.methodType, {
|
|
2064
|
-
...baseRequestConfig,
|
|
2065
|
-
url: buildSignedUrl(url, signType, userAgent)
|
|
2066
|
-
});
|
|
2067
|
-
return VideoData;
|
|
2068
|
-
}
|
|
2069
|
-
case "\u8BC4\u8BBA\u6570\u636E": {
|
|
2070
|
-
const urlGenerator = (params) => douyinApiUrls2.\u8BC4\u8BBA(params);
|
|
2071
|
-
const response = await fetchPaginatedData(
|
|
2072
|
-
data2.methodType,
|
|
2073
|
-
urlGenerator,
|
|
2074
|
-
data2,
|
|
2075
|
-
50,
|
|
2076
|
-
baseRequestConfig,
|
|
2077
|
-
signType
|
|
2078
|
-
);
|
|
2079
|
-
return response;
|
|
2080
|
-
}
|
|
2081
|
-
case "\u6307\u5B9A\u8BC4\u8BBA\u56DE\u590D\u6570\u636E": {
|
|
2082
|
-
const urlGenerator = (params) => douyinApiUrls2.\u4E8C\u7EA7\u8BC4\u8BBA(params);
|
|
2083
|
-
const response = await fetchPaginatedData(
|
|
2084
|
-
data2.methodType,
|
|
2085
|
-
urlGenerator,
|
|
2086
|
-
data2,
|
|
2087
|
-
3,
|
|
2088
|
-
baseRequestConfig,
|
|
2089
|
-
"x_bogus"
|
|
2090
|
-
);
|
|
2091
|
-
return response;
|
|
2092
|
-
}
|
|
2093
|
-
case "\u7528\u6237\u4E3B\u9875\u6570\u636E": {
|
|
2094
|
-
const url = douyinApiUrls2.\u7528\u6237\u4E3B\u9875\u4FE1\u606F({ sec_uid: data2.sec_uid });
|
|
2095
|
-
const customConfig = {
|
|
2096
|
-
...baseRequestConfig,
|
|
2097
|
-
headers: {
|
|
2098
|
-
...baseRequestConfig.headers,
|
|
2099
|
-
// 只有在外部配置没有Referer时才设置内部的Referer
|
|
2100
|
-
...(!(requestConfig == null ? void 0 : requestConfig.headers) || !("Referer" in requestConfig.headers)) && {
|
|
2101
|
-
Referer: `https://www.douyin.com/user/${data2.sec_uid}`
|
|
2102
|
-
}
|
|
2103
|
-
}
|
|
2104
|
-
};
|
|
2105
|
-
const UserInfoData = await GlobalGetData2(data2.methodType, {
|
|
2106
|
-
...customConfig,
|
|
2107
|
-
url: buildSignedUrl(url, signType, userAgent)
|
|
2108
|
-
});
|
|
2109
|
-
return UserInfoData;
|
|
2110
|
-
}
|
|
2111
|
-
case "Emoji\u6570\u636E": {
|
|
2112
|
-
const url = douyinApiUrls2.\u8868\u60C5();
|
|
2113
|
-
const EmojiData = await GlobalGetData2(data2.methodType, {
|
|
2114
|
-
...baseRequestConfig,
|
|
2115
|
-
url
|
|
2116
|
-
});
|
|
2117
|
-
return EmojiData;
|
|
2118
|
-
}
|
|
2119
|
-
case "\u7528\u6237\u4E3B\u9875\u89C6\u9891\u5217\u8868\u6570\u636E": {
|
|
2120
|
-
const url = douyinApiUrls2.\u7528\u6237\u4E3B\u9875\u89C6\u9891({ sec_uid: data2.sec_uid });
|
|
2121
|
-
const customConfig = {
|
|
2122
|
-
...baseRequestConfig,
|
|
2123
|
-
headers: {
|
|
2124
|
-
...baseRequestConfig.headers,
|
|
2125
|
-
...(!(requestConfig == null ? void 0 : requestConfig.headers) || !("Referer" in requestConfig.headers)) && {
|
|
2126
|
-
Referer: `https://www.douyin.com/user/${data2.sec_uid}`
|
|
2127
|
-
}
|
|
2128
|
-
}
|
|
2129
|
-
};
|
|
2130
|
-
const UserVideoListData = await GlobalGetData2(data2.methodType, {
|
|
2131
|
-
...customConfig,
|
|
2132
|
-
url: buildSignedUrl(url, signType, userAgent)
|
|
2133
|
-
});
|
|
2134
|
-
return UserVideoListData;
|
|
2135
|
-
}
|
|
2136
|
-
case "\u70ED\u70B9\u8BCD\u6570\u636E": {
|
|
2137
|
-
const url = douyinApiUrls2.\u70ED\u70B9\u8BCD({ query: data2.query, number: data2.number ?? 10 });
|
|
2138
|
-
const customConfig = {
|
|
2139
|
-
...baseRequestConfig,
|
|
2140
|
-
headers: {
|
|
2141
|
-
...baseRequestConfig.headers,
|
|
2142
|
-
...(!(requestConfig == null ? void 0 : requestConfig.headers) || !("Referer" in requestConfig.headers)) && {
|
|
2143
|
-
Referer: `https://www.douyin.com/search/${encodeURIComponent(String(data2.query))}`
|
|
2144
|
-
}
|
|
2145
|
-
}
|
|
2146
|
-
};
|
|
2147
|
-
const SuggestWordsData = await GlobalGetData2(data2.methodType, {
|
|
2148
|
-
...customConfig,
|
|
2149
|
-
url: buildSignedUrl(url, signType, userAgent)
|
|
2150
|
-
});
|
|
2151
|
-
return SuggestWordsData;
|
|
2152
|
-
}
|
|
2153
|
-
case "\u641C\u7D22\u6570\u636E": {
|
|
2154
|
-
let search_id = "";
|
|
2155
|
-
const maxPageSize = 15;
|
|
2156
|
-
let fetchedSearchList = [];
|
|
2157
|
-
let tmpresp = {};
|
|
2158
|
-
const customConfig = {
|
|
2159
|
-
...baseRequestConfig,
|
|
2160
|
-
headers: {
|
|
2161
|
-
...baseRequestConfig.headers,
|
|
2162
|
-
...(!(requestConfig == null ? void 0 : requestConfig.headers) || !("Referer" in requestConfig.headers)) && {
|
|
2163
|
-
Referer: `https://www.douyin.com/search/${encodeURIComponent(String(data2.query))}`
|
|
2164
|
-
}
|
|
2165
|
-
}
|
|
2166
|
-
};
|
|
2167
|
-
while (fetchedSearchList.length < Number(data2.number ?? 10)) {
|
|
2168
|
-
const requestCount = Math.min(Number(data2.number ?? 50) - fetchedSearchList.length, maxPageSize);
|
|
2169
|
-
const url = douyinApiUrls2.\u641C\u7D22({
|
|
2170
|
-
query: data2.query,
|
|
2171
|
-
number: requestCount,
|
|
2172
|
-
search_id: search_id === "" ? void 0 : search_id
|
|
2173
|
-
});
|
|
2174
|
-
const response = await GlobalGetData2(data2.methodType, {
|
|
2175
|
-
...customConfig,
|
|
2176
|
-
url: buildSignedUrl(url, signType, userAgent)
|
|
2177
|
-
});
|
|
2178
|
-
if (((_b = response.data) == null ? void 0 : _b.length) === 0) {
|
|
2179
|
-
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);
|
|
2180
|
-
return false;
|
|
2181
|
-
}
|
|
2182
|
-
if (!response.data) {
|
|
2183
|
-
response.data = [];
|
|
2184
|
-
}
|
|
2185
|
-
fetchedSearchList.push(...response.data);
|
|
2186
|
-
tmpresp = response;
|
|
2187
|
-
search_id = (_c = response.log_pb) == null ? void 0 : _c.impr_id;
|
|
2188
|
-
}
|
|
2189
|
-
const finalResponse = {
|
|
2190
|
-
...tmpresp,
|
|
2191
|
-
data: data2.number === 0 ? [] : fetchedSearchList.slice(0, Number(data2.number ?? 10))
|
|
2192
|
-
};
|
|
2193
|
-
return finalResponse;
|
|
2194
|
-
}
|
|
2195
|
-
case "\u52A8\u6001\u8868\u60C5\u6570\u636E": {
|
|
2196
|
-
const url = douyinApiUrls2.\u4E92\u52A8\u8868\u60C5();
|
|
2197
|
-
const ExpressionPlusData = await GlobalGetData2(data2.methodType, {
|
|
2198
|
-
...baseRequestConfig,
|
|
2199
|
-
url: buildSignedUrl(url, signType, userAgent)
|
|
2200
|
-
});
|
|
2201
|
-
return ExpressionPlusData;
|
|
2202
|
-
}
|
|
2203
|
-
case "\u97F3\u4E50\u6570\u636E": {
|
|
2204
|
-
const url = douyinApiUrls2.\u80CC\u666F\u97F3\u4E50({ music_id: data2.music_id });
|
|
2205
|
-
const MusicData = await GlobalGetData2(data2.methodType, {
|
|
2206
|
-
...baseRequestConfig,
|
|
2207
|
-
url: buildSignedUrl(url, signType, userAgent)
|
|
2208
|
-
});
|
|
2209
|
-
return MusicData;
|
|
2210
|
-
}
|
|
2211
|
-
case "\u76F4\u64AD\u95F4\u4FE1\u606F\u6570\u636E": {
|
|
2212
|
-
let url = douyinApiUrls2.\u7528\u6237\u4E3B\u9875\u4FE1\u606F({ sec_uid: data2.sec_uid });
|
|
2213
|
-
const fetchUrl = buildSignedUrl(url, signType, userAgent);
|
|
2214
|
-
const customConfig = {
|
|
2215
|
-
...baseRequestConfig,
|
|
2216
|
-
headers: {
|
|
2217
|
-
...baseRequestConfig.headers,
|
|
2218
|
-
...(!(requestConfig == null ? void 0 : requestConfig.headers) || !("Referer" in requestConfig.headers)) && {
|
|
2219
|
-
Referer: `https://www.douyin.com/user/${data2.sec_uid}`
|
|
2220
|
-
}
|
|
2221
|
-
}
|
|
2222
|
-
};
|
|
2223
|
-
const UserInfoData = await GlobalGetData2(data2.methodType, {
|
|
2224
|
-
...customConfig,
|
|
2225
|
-
url: fetchUrl
|
|
2226
|
-
});
|
|
2227
|
-
if (!((_d = UserInfoData == null ? void 0 : UserInfoData.user) == null ? void 0 : _d.live_status) || UserInfoData.user.live_status !== 1) {
|
|
2228
|
-
logger.error((((_e = UserInfoData == null ? void 0 : UserInfoData.user) == null ? void 0 : _e.nickname) || "\u7528\u6237") + "\u5F53\u524D\u672A\u5728\u76F4\u64AD");
|
|
2229
|
-
const Err = {
|
|
2230
|
-
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')",
|
|
2231
|
-
requestType: data2.methodType ?? "\u672A\u77E5\u8BF7\u6C42\u7C7B\u578B",
|
|
2232
|
-
requestUrl: fetchUrl
|
|
2233
|
-
};
|
|
2234
|
-
return {
|
|
2235
|
-
code: "USER_NOT_LIVE" /* NOT_LIVE */,
|
|
2236
|
-
data: UserInfoData,
|
|
2237
|
-
amagiError: Err,
|
|
2238
|
-
amagiMessage: Err.errorDescription
|
|
2239
|
-
};
|
|
2240
|
-
}
|
|
2241
|
-
if (!UserInfoData.user.room_data) {
|
|
2242
|
-
logger.error("\u672A\u83B7\u53D6\u5230\u76F4\u64AD\u95F4\u4FE1\u606F\uFF01");
|
|
2243
|
-
return {
|
|
2244
|
-
code: 500,
|
|
2245
|
-
message: "\u672A\u83B7\u53D6\u5230\u76F4\u64AD\u95F4\u4FE1\u606F\uFF01",
|
|
2246
|
-
data: null
|
|
2247
|
-
};
|
|
2248
|
-
}
|
|
2249
|
-
const room_data = JSON.parse(UserInfoData.user.room_data);
|
|
2250
|
-
url = douyinApiUrls2.\u76F4\u64AD\u95F4\u4FE1\u606F({ room_id: UserInfoData.user.room_id_str, web_rid: room_data.owner.web_rid });
|
|
2251
|
-
const liveCustomConfig = {
|
|
2252
|
-
...baseRequestConfig,
|
|
2253
|
-
headers: {
|
|
2254
|
-
...baseRequestConfig.headers,
|
|
2255
|
-
...(!(requestConfig == null ? void 0 : requestConfig.headers) || !("Referer" in requestConfig.headers)) && {
|
|
2256
|
-
Referer: `https://live.douyin.com/${room_data.owner.web_rid}`
|
|
2257
|
-
}
|
|
2258
|
-
}
|
|
2259
|
-
};
|
|
2260
|
-
const LiveRoomData = await GlobalGetData2(data2.methodType, {
|
|
2261
|
-
...liveCustomConfig,
|
|
2262
|
-
url: buildSignedUrl(url, signType, userAgent)
|
|
2263
|
-
});
|
|
2264
|
-
return LiveRoomData;
|
|
2265
|
-
}
|
|
2266
|
-
case "\u7533\u8BF7\u4E8C\u7EF4\u7801\u6570\u636E": {
|
|
2267
|
-
const url = douyinApiUrls2.\u7533\u8BF7\u4E8C\u7EF4\u7801({ verify_fp: data2.verify_fp });
|
|
2268
|
-
const LoginQrcodeStatusData = await GlobalGetData2(data2.methodType, {
|
|
2269
|
-
...baseRequestConfig,
|
|
2270
|
-
url: buildSignedUrl(url, signType, userAgent)
|
|
2271
|
-
});
|
|
2272
|
-
return LoginQrcodeStatusData;
|
|
2273
|
-
}
|
|
2274
|
-
case "\u5F39\u5E55\u6570\u636E": {
|
|
2275
|
-
const MAX_SEGMENT_DURATION = 32e3;
|
|
2276
|
-
const startTime = data2.start_time ?? 0;
|
|
2277
|
-
const endTime = data2.end_time ?? data2.duration;
|
|
2278
|
-
const totalDuration = endTime - startTime;
|
|
2279
|
-
if (totalDuration <= MAX_SEGMENT_DURATION) {
|
|
2280
|
-
const url = douyinApiUrls2.\u5F39\u5E55({
|
|
2281
|
-
aweme_id: data2.aweme_id,
|
|
2282
|
-
start_time: startTime,
|
|
2283
|
-
end_time: endTime,
|
|
2284
|
-
duration: data2.duration
|
|
2285
|
-
});
|
|
2286
|
-
const DanmakuData = await GlobalGetData2(data2.methodType, {
|
|
2287
|
-
...baseRequestConfig,
|
|
2288
|
-
url: buildSignedUrl(url, signType, userAgent)
|
|
2289
|
-
});
|
|
2290
|
-
return DanmakuData;
|
|
2291
|
-
}
|
|
2292
|
-
const segments = [];
|
|
2293
|
-
let currentStart = startTime;
|
|
2294
|
-
while (currentStart < endTime) {
|
|
2295
|
-
const currentEnd = Math.min(currentStart + MAX_SEGMENT_DURATION, endTime);
|
|
2296
|
-
segments.push({ start: currentStart, end: currentEnd });
|
|
2297
|
-
currentStart = currentEnd;
|
|
2298
|
-
}
|
|
2299
|
-
logger.debug(`\u5F39\u5E55\u6570\u636E\u9700\u8981\u5206${segments.length}\u6BB5\u83B7\u53D6\uFF0C\u603B\u65F6\u957F\uFF1A${totalDuration}ms`);
|
|
2300
|
-
const segmentPromises = segments.map(async (segment, index) => {
|
|
2301
|
-
const url = douyinApiUrls2.\u5F39\u5E55({
|
|
2302
|
-
aweme_id: data2.aweme_id,
|
|
2303
|
-
start_time: segment.start,
|
|
2304
|
-
end_time: segment.end,
|
|
2305
|
-
duration: data2.duration
|
|
2306
|
-
});
|
|
2307
|
-
try {
|
|
2308
|
-
const segmentData = await GlobalGetData2(`${data2.methodType}-\u6BB5${index + 1}`, {
|
|
2309
|
-
...baseRequestConfig,
|
|
2310
|
-
url: buildSignedUrl(url, signType, userAgent)
|
|
2311
|
-
});
|
|
2312
|
-
logger.debug(`\u5F39\u5E55\u7B2C${index + 1}\u6BB5\u83B7\u53D6\u6210\u529F (${segment.start}ms-${segment.end}ms)`);
|
|
2313
|
-
return segmentData;
|
|
2314
|
-
} catch (error) {
|
|
2315
|
-
logger.debug(`\u5F39\u5E55\u7B2C${index + 1}\u6BB5\u83B7\u53D6\u5931\u8D25 (${segment.start}ms-${segment.end}ms):`, error);
|
|
2316
|
-
return null;
|
|
2317
|
-
}
|
|
2318
|
-
});
|
|
2319
|
-
const segmentResults = await Promise.all(segmentPromises);
|
|
2320
|
-
const mergedDanmakuList = [];
|
|
2321
|
-
let totalCount = 0;
|
|
2322
|
-
let finalStartTime = startTime;
|
|
2323
|
-
let finalEndTime = endTime;
|
|
2324
|
-
let finalExtra = null;
|
|
2325
|
-
let finalLogPb = null;
|
|
2326
|
-
let finalStatusCode = 0;
|
|
2327
|
-
segmentResults.forEach((segmentData, index) => {
|
|
2328
|
-
if (segmentData && segmentData.danmaku_list) {
|
|
2329
|
-
mergedDanmakuList.push(...segmentData.danmaku_list);
|
|
2330
|
-
totalCount += segmentData.total || 0;
|
|
2331
|
-
if (index === 0) {
|
|
2332
|
-
finalExtra = segmentData.extra;
|
|
2333
|
-
finalLogPb = segmentData.log_pb;
|
|
2334
|
-
finalStatusCode = segmentData.status_code;
|
|
2335
|
-
}
|
|
2336
|
-
}
|
|
2337
|
-
});
|
|
2338
|
-
mergedDanmakuList.sort((a, b) => (a.offset_time || 0) - (b.offset_time || 0));
|
|
2339
|
-
const finalDanmakuData = {
|
|
2340
|
-
danmaku_list: mergedDanmakuList,
|
|
2341
|
-
start_time: finalStartTime,
|
|
2342
|
-
end_time: finalEndTime,
|
|
2343
|
-
total: mergedDanmakuList.length,
|
|
2344
|
-
// 使用实际合并后的数量
|
|
2345
|
-
status_code: finalStatusCode,
|
|
2346
|
-
extra: finalExtra,
|
|
2347
|
-
log_pb: finalLogPb
|
|
2348
|
-
};
|
|
2349
|
-
logger.debug(`\u5F39\u5E55\u6570\u636E\u5408\u5E76\u5B8C\u6210\uFF0C\u5171\u83B7\u53D6${mergedDanmakuList.length}\u6761\u5F39\u5E55`);
|
|
2350
|
-
return finalDanmakuData;
|
|
2351
|
-
}
|
|
2352
|
-
default: {
|
|
2353
|
-
logger.warn(`\u672A\u77E5\u7684\u6296\u97F3\u6570\u636E\u63A5\u53E3\uFF1A\u300C${logger.red(data2.methodType)}\u300D`);
|
|
2354
|
-
return null;
|
|
2355
|
-
}
|
|
2356
|
-
}
|
|
2357
|
-
};
|
|
2358
|
-
var fetchPaginatedData = async (type, apiUrlGenerator, params, maxPageSize, requestConfig, signType = "a_bogus") => {
|
|
2359
|
-
var _a;
|
|
2360
|
-
let cursor = params.cursor ?? 0;
|
|
2361
|
-
let fetchedData = [];
|
|
2362
|
-
let tmpresp = {};
|
|
2363
|
-
const userAgent = (_a = requestConfig.headers) == null ? void 0 : _a["User-Agent"];
|
|
2364
|
-
while (fetchedData.length < Number(params.number ?? maxPageSize)) {
|
|
2365
|
-
const requestCount = Math.min(Number(params.number ?? maxPageSize) - fetchedData.length, maxPageSize);
|
|
2366
|
-
const url = apiUrlGenerator({
|
|
2367
|
-
...params,
|
|
2368
|
-
number: requestCount,
|
|
2369
|
-
cursor
|
|
2370
|
-
});
|
|
2371
|
-
const response = await GlobalGetData2(type, {
|
|
2372
|
-
...requestConfig,
|
|
2373
|
-
url: buildSignedUrl(url, signType, userAgent)
|
|
2374
|
-
});
|
|
2375
|
-
fetchedData.push(...response.comments || response.data || []);
|
|
2376
|
-
tmpresp = response;
|
|
2377
|
-
if ((response.comments || response.data || []).length < requestCount) {
|
|
2378
|
-
break;
|
|
2379
|
-
}
|
|
2380
|
-
cursor = response.cursor;
|
|
2381
|
-
}
|
|
2382
|
-
const finalResponse = {
|
|
2383
|
-
...tmpresp,
|
|
2384
|
-
comments: params.number === 0 ? [] : fetchedData.slice(0, Number(params.number ?? maxPageSize)),
|
|
2385
|
-
cursor: params.number === 0 ? 0 : fetchedData.length
|
|
2386
|
-
};
|
|
2387
|
-
return finalResponse;
|
|
2388
|
-
};
|
|
2389
|
-
var GlobalGetData2 = async (type, config) => {
|
|
2390
|
-
let warningMessage = "";
|
|
2391
|
-
try {
|
|
2392
|
-
const result = await fetchData(config);
|
|
2393
|
-
if (!result || result === "") {
|
|
2394
|
-
const Err = {
|
|
2395
|
-
errorDescription: "\u83B7\u53D6\u54CD\u5E94\u6570\u636E\u5931\u8D25\uFF01\u63A5\u53E3\u8FD4\u56DE\u5185\u5BB9\u4E3A\u7A7A\uFF0C\u4F60\u7684\u6296\u97F3ck\u53EF\u80FD\u5DF2\u7ECF\u5931\u6548\uFF01",
|
|
2396
|
-
requestType: type ?? "\u672A\u77E5\u8BF7\u6C42\u7C7B\u578B",
|
|
2397
|
-
requestUrl: config.url
|
|
2398
|
-
};
|
|
2399
|
-
warningMessage = `
|
|
2400
|
-
\u83B7\u53D6\u54CD\u5E94\u6570\u636E\u5931\u8D25\uFF01\u539F\u56E0\uFF1A${logger.yellow("\u63A5\u53E3\u8FD4\u56DE\u5185\u5BB9\u4E3A\u7A7A\uFF0C\u4F60\u7684\u6296\u97F3ck\u53EF\u80FD\u5DF2\u7ECF\u5931\u6548\uFF01")}
|
|
2401
|
-
\u8BF7\u6C42\u7C7B\u578B\uFF1A\u300C${type}\u300D
|
|
2402
|
-
\u8BF7\u6C42URL\uFF1A${config.url}
|
|
2403
|
-
`;
|
|
2404
|
-
logger.warn(warningMessage);
|
|
2405
|
-
throw {
|
|
2406
|
-
code: "INVALID_COOKIE" /* COOKIE */,
|
|
2407
|
-
data: result,
|
|
2408
|
-
amagiError: Err
|
|
2409
|
-
};
|
|
2410
|
-
}
|
|
2411
|
-
if (result.filter_detail && result.filter_detail.filter_reason) {
|
|
2412
|
-
const filterReason = result.filter_detail.filter_reason;
|
|
2413
|
-
const Err = {
|
|
2414
|
-
errorDescription: `\u83B7\u53D6\u54CD\u5E94\u6570\u636E\u5931\u8D25\uFF01\u539F\u56E0\uFF1A${filterReason}\uFF01`,
|
|
2415
|
-
requestType: type ?? "\u672A\u77E5\u8BF7\u6C42\u7C7B\u578B",
|
|
2416
|
-
requestUrl: config.url
|
|
2417
|
-
};
|
|
2418
|
-
warningMessage = `
|
|
2419
|
-
\u83B7\u53D6\u54CD\u5E94\u6570\u636E\u5931\u8D25\uFF01\u539F\u56E0\uFF1A${logger.yellow(filterReason)}
|
|
2420
|
-
\u8BF7\u6C42\u7C7B\u578B\uFF1A\u300C${type}\u300D
|
|
2421
|
-
\u8BF7\u6C42URL\uFF1A${config.url}
|
|
2422
|
-
`;
|
|
2423
|
-
logger.warn(warningMessage);
|
|
2424
|
-
throw {
|
|
2425
|
-
code: "CONTENT_FILTERED" /* FILTER */,
|
|
2426
|
-
data: result,
|
|
2427
|
-
amagiError: Err
|
|
2428
|
-
};
|
|
2429
|
-
}
|
|
2430
|
-
return result;
|
|
2431
|
-
} catch (error) {
|
|
2432
|
-
if (error && typeof error === "object") {
|
|
2433
|
-
const err = error;
|
|
2434
|
-
return { ...err, amagiMessage: warningMessage };
|
|
2435
|
-
}
|
|
2436
|
-
return {
|
|
2437
|
-
code: "UNKNOWN_ERROR" /* UNKNOWN */,
|
|
2438
|
-
data: null,
|
|
2439
|
-
amagiError: {
|
|
2440
|
-
errorDescription: "\u672A\u77E5\u9519\u8BEF",
|
|
2441
|
-
requestType: type,
|
|
2442
|
-
requestUrl: config.url
|
|
2443
|
-
},
|
|
2444
|
-
amagiMessage: warningMessage
|
|
2445
|
-
};
|
|
2446
|
-
}
|
|
2447
|
-
};
|
|
2448
|
-
|
|
2449
|
-
// src/platform/kuaishou/API.ts
|
|
2450
|
-
var API = class {
|
|
2451
|
-
\u5355\u4E2A\u4F5C\u54C1\u4FE1\u606F(data2) {
|
|
2452
|
-
return {
|
|
2453
|
-
/** 接口类型 */
|
|
2454
|
-
type: "visionVideoDetail",
|
|
2455
|
-
/** 请求url */
|
|
2456
|
-
url: "https://www.kuaishou.com/graphql",
|
|
2457
|
-
/** 请求参数 */
|
|
2458
|
-
body: {
|
|
2459
|
-
/** 接口类型 */
|
|
2460
|
-
operationName: "visionVideoDetail",
|
|
2461
|
-
variables: {
|
|
2462
|
-
/** 作品ID */
|
|
2463
|
-
photoId: data2.photoId,
|
|
2464
|
-
page: "detail"
|
|
2465
|
-
},
|
|
2466
|
-
query: "query visionVideoDetail($photoId: String, $type: String, $page: String, $webPageArea: String) {\n visionVideoDetail(photoId: $photoId, type: $type, page: $page, webPageArea: $webPageArea) {\n status\n type\n author {\n id\n name\n following\n headerUrl\n __typename\n }\n photo {\n id\n duration\n caption\n likeCount\n realLikeCount\n coverUrl\n photoUrl\n liked\n timestamp\n expTag\n llsid\n viewCount\n videoRatio\n stereoType\n musicBlocked\n manifest {\n mediaType\n businessType\n version\n adaptationSet {\n id\n duration\n representation {\n id\n defaultSelect\n backupUrl\n codecs\n url\n height\n width\n avgBitrate\n maxBitrate\n m3u8Slice\n qualityType\n qualityLabel\n frameRate\n featureP2sp\n hidden\n disableAdaptive\n __typename\n }\n __typename\n }\n __typename\n }\n manifestH265\n photoH265Url\n coronaCropManifest\n coronaCropManifestH265\n croppedPhotoH265Url\n croppedPhotoUrl\n videoResource\n __typename\n }\n tags {\n type\n name\n __typename\n }\n commentLimit {\n canAddComment\n __typename\n }\n llsid\n danmakuSwitch\n __typename\n }\n}\n"
|
|
2467
|
-
}
|
|
2468
|
-
};
|
|
2469
|
-
}
|
|
2470
|
-
\u4F5C\u54C1\u8BC4\u8BBA\u4FE1\u606F(data2) {
|
|
2471
|
-
return {
|
|
2472
|
-
type: "commentListQuery",
|
|
2473
|
-
url: "https://www.kuaishou.com/graphql",
|
|
2474
|
-
body: {
|
|
2475
|
-
operationName: "commentListQuery",
|
|
2476
|
-
variables: {
|
|
2477
|
-
photoId: data2.photoId,
|
|
2478
|
-
pcursor: ""
|
|
2479
|
-
},
|
|
2480
|
-
query: "query commentListQuery($photoId: String, $pcursor: String) {\n visionCommentList(photoId: $photoId, pcursor: $pcursor) {\n commentCount\n pcursor\n rootComments {\n commentId\n authorId\n authorName\n content\n headurl\n timestamp\n likedCount\n realLikedCount\n liked\n status\n authorLiked\n subCommentCount\n subCommentsPcursor\n subComments {\n commentId\n authorId\n authorName\n content\n headurl\n timestamp\n likedCount\n realLikedCount\n liked\n status\n authorLiked\n replyToUserName\n replyTo\n __typename\n }\n __typename\n }\n __typename\n }\n}\n"
|
|
2481
|
-
}
|
|
2482
|
-
};
|
|
2483
|
-
}
|
|
2484
|
-
\u8868\u60C5() {
|
|
2485
|
-
return {
|
|
2486
|
-
type: "visionBaseEmoticons",
|
|
2487
|
-
url: "https://www.kuaishou.com/graphql",
|
|
2488
|
-
body: {
|
|
2489
|
-
operationName: "visionBaseEmoticons",
|
|
2490
|
-
variables: {},
|
|
2491
|
-
query: "query visionBaseEmoticons {\n visionBaseEmoticons {\n iconUrls\n __typename\n }\n}\n"
|
|
2492
|
-
}
|
|
2493
|
-
};
|
|
2494
|
-
}
|
|
2495
|
-
};
|
|
2496
|
-
var kuaishouApiUrls = new API();
|
|
2497
|
-
|
|
2498
|
-
// src/platform/kuaishou/getdata.ts
|
|
2499
|
-
var KuaishouData = async (data2, cookie, requestConfig) => {
|
|
2500
|
-
const defHeaders = getKuaishouDefaultConfig(cookie)["headers"];
|
|
2501
|
-
const baseRequestConfig = {
|
|
2502
|
-
method: "POST",
|
|
2503
|
-
timeout: 1e4,
|
|
2504
|
-
...requestConfig,
|
|
2505
|
-
headers: {
|
|
2506
|
-
...defHeaders,
|
|
2507
|
-
...{}
|
|
2508
|
-
}
|
|
2509
|
-
};
|
|
2510
|
-
switch (data2.methodType) {
|
|
2511
|
-
case "\u5355\u4E2A\u89C6\u9891\u4F5C\u54C1\u6570\u636E": {
|
|
2512
|
-
const body = kuaishouApiUrls.\u5355\u4E2A\u4F5C\u54C1\u4FE1\u606F({ photoId: data2.photoId });
|
|
2513
|
-
const VideoData = await GlobalGetData3(data2.methodType, {
|
|
2514
|
-
...baseRequestConfig,
|
|
2515
|
-
url: body.url,
|
|
2516
|
-
data: body.body
|
|
2517
|
-
});
|
|
2518
|
-
return VideoData;
|
|
2519
|
-
}
|
|
2520
|
-
case "\u8BC4\u8BBA\u6570\u636E": {
|
|
2521
|
-
const body = kuaishouApiUrls.\u4F5C\u54C1\u8BC4\u8BBA\u4FE1\u606F({ photoId: data2.photoId });
|
|
2522
|
-
const VideoData = await GlobalGetData3(data2.methodType, {
|
|
2523
|
-
...baseRequestConfig,
|
|
2524
|
-
url: body.url,
|
|
2525
|
-
data: body.body
|
|
2526
|
-
});
|
|
2527
|
-
return VideoData;
|
|
2528
|
-
}
|
|
2529
|
-
case "Emoji\u6570\u636E": {
|
|
2530
|
-
const body = kuaishouApiUrls.\u8868\u60C5();
|
|
2531
|
-
const EmojiData = await GlobalGetData3(data2.methodType, {
|
|
2532
|
-
...baseRequestConfig,
|
|
2533
|
-
url: body.url,
|
|
2534
|
-
data: body.body
|
|
2535
|
-
});
|
|
2536
|
-
return EmojiData;
|
|
2537
|
-
}
|
|
2538
|
-
default:
|
|
2539
|
-
logger.warn(`\u672A\u77E5\u7684\u5FEB\u624B\u6570\u636E\u63A5\u53E3\uFF1A\u300C${logger.red(data2.methodType)}\u300D`);
|
|
2540
|
-
return null;
|
|
2541
|
-
}
|
|
2542
|
-
};
|
|
2543
|
-
var GlobalGetData3 = async (type, options) => {
|
|
2544
|
-
let warningMessage = "";
|
|
2545
|
-
try {
|
|
2546
|
-
const result = await fetchData(options);
|
|
2547
|
-
if (result === "" || !result || result.result === 2) {
|
|
2548
|
-
const Err = {
|
|
2549
|
-
errorDescription: `\u83B7\u53D6\u54CD\u5E94\u6570\u636E\u5931\u8D25\uFF01\u63A5\u53E3\u8FD4\u56DE\u5185\u5BB9\u4E3A\u7A7A\uFF01`,
|
|
2550
|
-
requestType: type ?? "\u672A\u77E5\u8BF7\u6C42\u7C7B\u578B",
|
|
2551
|
-
requestUrl: options.url,
|
|
2552
|
-
requestBody: JSON.stringify(options.data)
|
|
2553
|
-
};
|
|
2554
|
-
warningMessage = `
|
|
2555
|
-
\u83B7\u53D6\u54CD\u5E94\u6570\u636E\u5931\u8D25\uFF01\u539F\u56E0\uFF1A${logger.yellow("\u63A5\u53E3\u8FD4\u56DE\u5185\u5BB9\u4E3A\u7A7A\uFF0C\u4F60\u7684\u5FEB\u624Bck\u53EF\u80FD\u5DF2\u7ECF\u5931\u6548\uFF01")}
|
|
2556
|
-
\u8BF7\u6C42\u7C7B\u578B\uFF1A\u300C${type}\u300D
|
|
2557
|
-
\u8BF7\u6C42URL\uFF1A${options.url}
|
|
2558
|
-
\u8BF7\u6C42\u53C2\u6570\uFF1A${JSON.stringify(options.data, null, 2)}
|
|
2559
|
-
`;
|
|
2560
|
-
logger.warn(warningMessage);
|
|
2561
|
-
throw {
|
|
2562
|
-
code: "INVALID_COOKIE" /* COOKIE */,
|
|
2563
|
-
data: result,
|
|
2564
|
-
amagiError: Err
|
|
2565
|
-
};
|
|
2566
|
-
}
|
|
2567
|
-
return result;
|
|
2568
|
-
} catch (error) {
|
|
2569
|
-
if (error && typeof error === "object") {
|
|
2570
|
-
const err = error;
|
|
2571
|
-
return { ...err, amagiMessage: warningMessage };
|
|
2572
|
-
}
|
|
2573
|
-
return {
|
|
2574
|
-
code: "UNKNOWN_ERROR" /* UNKNOWN */,
|
|
2575
|
-
data: null,
|
|
2576
|
-
amagiError: {
|
|
2577
|
-
errorDescription: "\u672A\u77E5\u9519\u8BEF",
|
|
2578
|
-
requestType: type,
|
|
2579
|
-
requestUrl: options.url
|
|
2580
|
-
},
|
|
2581
|
-
amagiMessage: warningMessage
|
|
2582
|
-
};
|
|
2583
|
-
}
|
|
2584
|
-
};
|
|
2585
|
-
function smartNumber(errorMessage, minValue = 1, isInteger = false) {
|
|
2586
|
-
if (isInteger) {
|
|
2587
|
-
return zod.z.coerce.number({ error: errorMessage }).int({ error: `${errorMessage.replace("\u4E0D\u80FD\u4E3A\u7A7A", "")}\u5FC5\u987B\u662F\u6574\u6570\uFF0C\u4E0D\u80FD\u5305\u542B\u5C0F\u6570` }).min(minValue, { error: `${errorMessage.replace("\u4E0D\u80FD\u4E3A\u7A7A", "")}\u5FC5\u987B\u5927\u4E8E\u7B49\u4E8E${minValue}` });
|
|
2588
|
-
} else {
|
|
2589
|
-
return zod.z.coerce.number({ error: errorMessage }).min(minValue, { error: `${errorMessage.replace("\u4E0D\u80FD\u4E3A\u7A7A", "")}\u5FC5\u987B\u5927\u4E8E\u7B49\u4E8E${minValue}` });
|
|
2590
|
-
}
|
|
2591
|
-
}
|
|
2592
|
-
var smartPositiveInteger = (errorMessage) => {
|
|
2593
|
-
return smartNumber(errorMessage, 1, true);
|
|
2594
|
-
};
|
|
2595
|
-
var extractCreatorInfoFromHtml = (html) => {
|
|
2596
|
-
var _a;
|
|
2597
|
-
const match = html.match(/<script>window\.__INITIAL_STATE__=(.+)<\/script>/m);
|
|
2598
|
-
if (!match) {
|
|
2599
|
-
return null;
|
|
2600
|
-
}
|
|
2601
|
-
try {
|
|
2602
|
-
const jsonStr = match[1].replace(/:undefined/g, ":null");
|
|
2603
|
-
const info = JSON.parse(jsonStr);
|
|
2604
|
-
return ((_a = info == null ? void 0 : info.user) == null ? void 0 : _a.userPageData) || null;
|
|
2605
|
-
} catch (error) {
|
|
2606
|
-
console.error("\u89E3\u6790\u7528\u6237\u4FE1\u606F\u5931\u8D25:", error);
|
|
2607
|
-
return null;
|
|
2608
|
-
}
|
|
2609
|
-
};
|
|
2610
|
-
|
|
2611
|
-
// src/validation/douyin.ts
|
|
2612
|
-
var DouyinWorkParamsSchema = zod.z.object({
|
|
2613
|
-
methodType: zod.z.enum(["\u6587\u5B57\u4F5C\u54C1\u6570\u636E", "\u89C6\u9891\u4F5C\u54C1\u6570\u636E", "\u56FE\u96C6\u4F5C\u54C1\u6570\u636E", "\u5408\u8F91\u4F5C\u54C1\u6570\u636E", "\u805A\u5408\u89E3\u6790"], {
|
|
2614
|
-
error: "\u65B9\u6CD5\u7C7B\u578B\u5FC5\u987B\u662F\u6307\u5B9A\u7684\u679A\u4E3E\u503C\u4E4B\u4E00"
|
|
2615
|
-
}),
|
|
2616
|
-
aweme_id: zod.z.string({ error: "\u89C6\u9891ID\u5FC5\u987B\u662F\u5B57\u7B26\u4E32" }).min(1, { error: "\u89C6\u9891ID\u4E0D\u80FD\u4E3A\u7A7A" })
|
|
2617
|
-
});
|
|
2618
|
-
var DouyinCommentParamsSchema = zod.z.object({
|
|
2619
|
-
methodType: zod.z.literal("\u8BC4\u8BBA\u6570\u636E", { error: '\u65B9\u6CD5\u7C7B\u578B\u5FC5\u987B\u662F"\u8BC4\u8BBA\u6570\u636E"' }),
|
|
2620
|
-
aweme_id: zod.z.string({ error: "\u89C6\u9891ID\u5FC5\u987B\u662F\u5B57\u7B26\u4E32" }).min(1, { error: "\u89C6\u9891ID\u4E0D\u80FD\u4E3A\u7A7A" }),
|
|
2621
|
-
number: smartPositiveInteger("\u8BC4\u8BBA\u6570\u91CF\u5FC5\u987B\u662F\u6B63\u6574\u6570").optional().default(50),
|
|
2622
|
-
cursor: zod.z.coerce.number({ error: "\u6E38\u6807\u5FC5\u987B\u662F\u6570\u5B57" }).int({ error: "\u6E38\u6807\u5FC5\u987B\u662F\u6574\u6570" }).min(0, { error: "\u6E38\u6807\u4E0D\u80FD\u5C0F\u4E8E0" }).default(0).optional()
|
|
2623
|
-
});
|
|
2624
|
-
var DouyinSearchParamsSchema = zod.z.object({
|
|
2625
|
-
methodType: zod.z.enum(["\u70ED\u70B9\u8BCD\u6570\u636E", "\u641C\u7D22\u6570\u636E"], {
|
|
2626
|
-
error: '\u65B9\u6CD5\u7C7B\u578B\u5FC5\u987B\u662F"\u70ED\u70B9\u8BCD\u6570\u636E"\u6216"\u641C\u7D22\u6570\u636E"'
|
|
2627
|
-
}),
|
|
2628
|
-
query: zod.z.string({ error: "\u641C\u7D22\u8BCD\u5FC5\u987B\u662F\u5B57\u7B26\u4E32" }).min(1, { error: "\u641C\u7D22\u8BCD\u4E0D\u80FD\u4E3A\u7A7A" }),
|
|
2629
|
-
number: smartPositiveInteger("\u641C\u7D22\u6570\u91CF\u5FC5\u987B\u662F\u6B63\u6574\u6570").optional().default(10),
|
|
2630
|
-
search_id: zod.z.string({ error: "\u641C\u7D22ID\u5FC5\u987B\u662F\u5B57\u7B26\u4E32" }).optional()
|
|
2631
|
-
});
|
|
2632
|
-
var DouyinCommentReplyParamsSchema = zod.z.object({
|
|
2633
|
-
methodType: zod.z.literal("\u6307\u5B9A\u8BC4\u8BBA\u56DE\u590D\u6570\u636E", { error: '\u65B9\u6CD5\u7C7B\u578B\u5FC5\u987B\u662F"\u6307\u5B9A\u8BC4\u8BBA\u56DE\u590D\u6570\u636E"' }),
|
|
2634
|
-
aweme_id: zod.z.string({ error: "\u89C6\u9891ID\u5FC5\u987B\u662F\u5B57\u7B26\u4E32" }).min(1, { error: "\u89C6\u9891ID\u4E0D\u80FD\u4E3A\u7A7A" }),
|
|
2635
|
-
comment_id: zod.z.string({ error: "\u8BC4\u8BBAID\u5FC5\u987B\u662F\u5B57\u7B26\u4E32" }).min(1, { error: "\u8BC4\u8BBAID\u4E0D\u80FD\u4E3A\u7A7A" }),
|
|
2636
|
-
number: smartPositiveInteger("\u8BC4\u8BBA\u6570\u91CF\u5FC5\u987B\u662F\u6B63\u6574\u6570").optional().default(5),
|
|
2637
|
-
cursor: zod.z.coerce.number({ error: "\u6E38\u6807\u5FC5\u987B\u662F\u6570\u5B57" }).int({ error: "\u6E38\u6807\u5FC5\u987B\u662F\u6574\u6570" }).min(0, { error: "\u6E38\u6807\u4E0D\u80FD\u5C0F\u4E8E0" }).default(0).optional()
|
|
2638
|
-
});
|
|
2639
|
-
var DouyinUserParamsSchema = zod.z.object({
|
|
2640
|
-
methodType: zod.z.enum(["\u7528\u6237\u4E3B\u9875\u6570\u636E", "\u7528\u6237\u4E3B\u9875\u89C6\u9891\u5217\u8868\u6570\u636E", "\u76F4\u64AD\u95F4\u4FE1\u606F\u6570\u636E"], {
|
|
2641
|
-
error: "\u65B9\u6CD5\u7C7B\u578B\u5FC5\u987B\u662F\u6307\u5B9A\u7684\u679A\u4E3E\u503C\u4E4B\u4E00"
|
|
2642
|
-
}),
|
|
2643
|
-
sec_uid: zod.z.string({ error: "\u7528\u6237ID\u5FC5\u987B\u662F\u5B57\u7B26\u4E32" }).min(1, { error: "\u7528\u6237ID\u4E0D\u80FD\u4E3A\u7A7A" })
|
|
2644
|
-
});
|
|
2645
|
-
var DouyinMusicParamsSchema = zod.z.object({
|
|
2646
|
-
methodType: zod.z.literal("\u97F3\u4E50\u6570\u636E", { error: '\u65B9\u6CD5\u7C7B\u578B\u5FC5\u987B\u662F"\u97F3\u4E50\u6570\u636E"' }),
|
|
2647
|
-
music_id: zod.z.string({ error: "\u97F3\u4E50ID\u5FC5\u987B\u662F\u5B57\u7B26\u4E32" }).min(1, { error: "\u97F3\u4E50ID\u4E0D\u80FD\u4E3A\u7A7A" })
|
|
2648
|
-
});
|
|
2649
|
-
var DouyinQrcodeParamsSchema = zod.z.object({
|
|
2650
|
-
methodType: zod.z.literal("\u7533\u8BF7\u4E8C\u7EF4\u7801\u6570\u636E", { error: '\u65B9\u6CD5\u7C7B\u578B\u5FC5\u987B\u662F"\u7533\u8BF7\u4E8C\u7EF4\u7801\u6570\u636E"' }),
|
|
2651
|
-
verify_fp: zod.z.string({ error: "fp\u6307\u7EB9\u5FC5\u987B\u662F\u5B57\u7B26\u4E32" }).min(1, { error: "fp\u6307\u7EB9\u4E0D\u80FD\u4E3A\u7A7A" })
|
|
2652
|
-
});
|
|
2653
|
-
var DouyinEmojiListParamsSchema = zod.z.object({
|
|
2654
|
-
methodType: zod.z.literal("Emoji\u6570\u636E", { error: '\u65B9\u6CD5\u7C7B\u578B\u5FC5\u987B\u662F"Emoji\u6570\u636E"' })
|
|
2655
|
-
});
|
|
2656
|
-
var DouyinEmojiProParamsSchema = zod.z.object({
|
|
2657
|
-
methodType: zod.z.literal("\u52A8\u6001\u8868\u60C5\u6570\u636E", { error: '\u65B9\u6CD5\u7C7B\u578B\u5FC5\u987B\u662F"\u52A8\u6001\u8868\u60C5\u6570\u636E"' })
|
|
2658
|
-
});
|
|
2659
|
-
var DouyinDanmakuParamsSchema = zod.z.object({
|
|
2660
|
-
methodType: zod.z.literal("\u5F39\u5E55\u6570\u636E", { error: '\u65B9\u6CD5\u7C7B\u578B\u5FC5\u987B\u662F"\u5F39\u5E55\u6570\u636E"' }),
|
|
2661
|
-
aweme_id: zod.z.string({ error: "\u89C6\u9891ID\u5FC5\u987B\u662F\u5B57\u7B26\u4E32" }).min(1, { error: "\u89C6\u9891ID\u4E0D\u80FD\u4E3A\u7A7A" }),
|
|
2662
|
-
start_time: zod.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(),
|
|
2663
|
-
end_time: zod.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(),
|
|
2664
|
-
duration: zod.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" })
|
|
2665
|
-
}).refine(
|
|
2666
|
-
(data2) => {
|
|
2667
|
-
if (data2.end_time !== void 0) {
|
|
2668
|
-
return data2.end_time <= data2.duration;
|
|
2669
|
-
}
|
|
2670
|
-
return true;
|
|
2671
|
-
},
|
|
2672
|
-
{
|
|
2673
|
-
error: "\u83B7\u53D6\u5F39\u5E55\u533A\u95F4\u7684\u7ED3\u675F\u65F6\u95F4\u4E0D\u80FD\u8D85\u8FC7\u89C6\u9891\u603B\u65F6\u957F",
|
|
2674
|
-
path: ["end_time"]
|
|
2675
|
-
}
|
|
2676
|
-
).refine(
|
|
2677
|
-
(data2) => {
|
|
2678
|
-
if (data2.start_time !== void 0 && data2.end_time !== void 0) {
|
|
2679
|
-
return data2.start_time < data2.end_time;
|
|
2680
|
-
}
|
|
2681
|
-
return true;
|
|
2682
|
-
},
|
|
2683
|
-
{
|
|
2684
|
-
error: "\u83B7\u53D6\u5F39\u5E55\u533A\u95F4\u7684\u5F00\u59CB\u65F6\u95F4\u5FC5\u987B\u5C0F\u4E8E\u7ED3\u675F\u65F6\u95F4",
|
|
2685
|
-
path: ["start_time"]
|
|
2686
|
-
}
|
|
2687
|
-
);
|
|
2688
|
-
var DouyinValidationSchemas2 = {
|
|
2689
|
-
"\u6587\u5B57\u4F5C\u54C1\u6570\u636E": DouyinWorkParamsSchema,
|
|
2690
|
-
"\u805A\u5408\u89E3\u6790": DouyinWorkParamsSchema,
|
|
2691
|
-
"\u89C6\u9891\u4F5C\u54C1\u6570\u636E": DouyinWorkParamsSchema,
|
|
2692
|
-
"\u56FE\u96C6\u4F5C\u54C1\u6570\u636E": DouyinWorkParamsSchema,
|
|
2693
|
-
"\u5408\u8F91\u4F5C\u54C1\u6570\u636E": DouyinWorkParamsSchema,
|
|
2694
|
-
"\u8BC4\u8BBA\u6570\u636E": DouyinCommentParamsSchema,
|
|
2695
|
-
"\u7528\u6237\u4E3B\u9875\u6570\u636E": DouyinUserParamsSchema,
|
|
2696
|
-
"\u7528\u6237\u4E3B\u9875\u89C6\u9891\u5217\u8868\u6570\u636E": DouyinUserParamsSchema,
|
|
2697
|
-
"\u70ED\u70B9\u8BCD\u6570\u636E": DouyinSearchParamsSchema,
|
|
2698
|
-
"\u641C\u7D22\u6570\u636E": DouyinSearchParamsSchema,
|
|
2699
|
-
"\u97F3\u4E50\u6570\u636E": DouyinMusicParamsSchema,
|
|
2700
|
-
"\u76F4\u64AD\u95F4\u4FE1\u606F\u6570\u636E": DouyinUserParamsSchema,
|
|
2701
|
-
"\u7533\u8BF7\u4E8C\u7EF4\u7801\u6570\u636E": DouyinQrcodeParamsSchema,
|
|
2702
|
-
"Emoji\u6570\u636E": DouyinEmojiListParamsSchema,
|
|
2703
|
-
"\u52A8\u6001\u8868\u60C5\u6570\u636E": DouyinEmojiProParamsSchema,
|
|
2704
|
-
"\u6307\u5B9A\u8BC4\u8BBA\u56DE\u590D\u6570\u636E": DouyinCommentReplyParamsSchema,
|
|
2705
|
-
"\u5F39\u5E55\u6570\u636E": DouyinDanmakuParamsSchema
|
|
2706
|
-
};
|
|
2707
|
-
var BilibiliVideoParamsSchema = zod.z.object({
|
|
2708
|
-
methodType: zod.z.literal("\u5355\u4E2A\u89C6\u9891\u4F5C\u54C1\u6570\u636E", { error: '\u65B9\u6CD5\u7C7B\u578B\u5FC5\u987B\u662F"\u5355\u4E2A\u89C6\u9891\u4F5C\u54C1\u6570\u636E"' }),
|
|
2709
|
-
bvid: zod.z.string({ error: "BVID\u5FC5\u987B\u662F\u5B57\u7B26\u4E32" }).min(1, { error: "BVID\u4E0D\u80FD\u4E3A\u7A7A" })
|
|
2710
|
-
});
|
|
2711
|
-
var BilibiliVideoDownloadParamsSchema = zod.z.object({
|
|
2712
|
-
methodType: zod.z.literal("\u5355\u4E2A\u89C6\u9891\u4E0B\u8F7D\u4FE1\u606F\u6570\u636E", { error: '\u65B9\u6CD5\u7C7B\u578B\u5FC5\u987B\u662F"\u5355\u4E2A\u89C6\u9891\u4E0B\u8F7D\u4FE1\u606F\u6570\u636E"' }),
|
|
2713
|
-
avid: smartNumber("AVID\u4E0D\u80FD\u4E3A\u7A7A", 1, true),
|
|
2714
|
-
cid: smartNumber("CID\u4E0D\u80FD\u4E3A\u7A7A", 1, true)
|
|
2715
|
-
});
|
|
2716
|
-
var BilibiliCommentParamsSchema = zod.z.object({
|
|
2717
|
-
methodType: zod.z.literal("\u8BC4\u8BBA\u6570\u636E", { error: '\u65B9\u6CD5\u7C7B\u578B\u5FC5\u987B\u662F"\u8BC4\u8BBA\u6570\u636E"' }),
|
|
2718
|
-
oid: zod.z.string({ error: "OID\u5FC5\u987B\u662F\u5B57\u7B26\u4E32" }).min(1, { error: "OID\u4E0D\u80FD\u4E3A\u7A7A" }),
|
|
2719
|
-
type: smartNumber("\u8BC4\u8BBA\u7C7B\u578B\u4E0D\u80FD\u4E3A\u7A7A", 1, true).refine(
|
|
2720
|
-
(val) => [1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 33].includes(val),
|
|
2721
|
-
{ error: "\u65E0\u6548\u7684\u8BC4\u8BBA\u533A\u7C7B\u578B" }
|
|
2722
|
-
),
|
|
2723
|
-
number: zod.z.coerce.number({ error: "\u8BC4\u8BBA\u6570\u91CF\u5FC5\u987B\u662F\u6570\u5B57" }).int({ error: "\u8BC4\u8BBA\u6570\u91CF\u5FC5\u987B\u662F\u6574\u6570" }).positive({ error: "\u8BC4\u8BBA\u6570\u91CF\u5FC5\u987B\u662F\u6B63\u6570" }).default(20).optional(),
|
|
2724
|
-
pn: zod.z.coerce.number({ error: "\u9875\u7801\u5FC5\u987B\u662F\u6570\u5B57" }).int({ error: "\u9875\u7801\u5FC5\u987B\u662F\u6574\u6570" }).positive({ error: "\u9875\u7801\u5FC5\u987B\u662F\u6B63\u6570" }).default(1).optional()
|
|
2725
|
-
});
|
|
2726
|
-
var BilibiliUserParamsSchema = zod.z.object({
|
|
2727
|
-
methodType: zod.z.enum(["\u7528\u6237\u4E3B\u9875\u6570\u636E", "\u7528\u6237\u4E3B\u9875\u52A8\u6001\u5217\u8868\u6570\u636E", "\u83B7\u53D6UP\u4E3B\u603B\u64AD\u653E\u91CF"], {
|
|
2728
|
-
error: "\u65B9\u6CD5\u7C7B\u578B\u5FC5\u987B\u662F\u6307\u5B9A\u7684\u679A\u4E3E\u503C\u4E4B\u4E00"
|
|
2729
|
-
}),
|
|
2730
|
-
host_mid: smartNumber("UP\u4E3BUID\u4E0D\u80FD\u4E3A\u7A7A", 1, true)
|
|
2731
|
-
});
|
|
2732
|
-
var BilibiliEmojiParamsSchema = zod.z.object({
|
|
2733
|
-
methodType: zod.z.literal("Emoji\u6570\u636E", { error: '\u65B9\u6CD5\u7C7B\u578B\u5FC5\u987B\u662F"Emoji\u6570\u636E"' })
|
|
2734
|
-
});
|
|
2735
|
-
var BilibiliBangumiInfoParamsSchema = zod.z.object({
|
|
2736
|
-
methodType: zod.z.literal("\u756A\u5267\u57FA\u672C\u4FE1\u606F\u6570\u636E", { error: '\u65B9\u6CD5\u7C7B\u578B\u5FC5\u987B\u662F"\u756A\u5267\u57FA\u672C\u4FE1\u606F\u6570\u636E"' }),
|
|
2737
|
-
ep_id: zod.z.string({ error: "\u756A\u5267EP ID\u5FC5\u987B\u662F\u5B57\u7B26\u4E32" }).min(1, { error: "\u756A\u5267EP ID\u4E0D\u80FD\u4E3A\u7A7A" }).optional(),
|
|
2738
|
-
season_id: zod.z.string({ error: "\u756A\u5267\u5B63\u5EA6ID\u5FC5\u987B\u662F\u5B57\u7B26\u4E32" }).optional()
|
|
2739
|
-
}).refine(
|
|
2740
|
-
(data2) => data2.ep_id || data2.season_id,
|
|
2741
|
-
{
|
|
2742
|
-
error: "ep_id \u548C season_id \u81F3\u5C11\u9700\u8981\u63D0\u4F9B\u4E00\u4E2A",
|
|
2743
|
-
path: ["ep_id"]
|
|
2744
|
-
}
|
|
2745
|
-
);
|
|
2746
|
-
var BilibiliBangumiStreamParamsSchema = zod.z.object({
|
|
2747
|
-
methodType: zod.z.literal("\u756A\u5267\u4E0B\u8F7D\u4FE1\u606F\u6570\u636E", { error: '\u65B9\u6CD5\u7C7B\u578B\u5FC5\u987B\u662F"\u756A\u5267\u4E0B\u8F7D\u4FE1\u606F\u6570\u636E"' }),
|
|
2748
|
-
cid: smartNumber("CID\u4E0D\u80FD\u4E3A\u7A7A", 1, true),
|
|
2749
|
-
ep_id: zod.z.string({ error: "\u756A\u5267EP ID\u5FC5\u987B\u662F\u5B57\u7B26\u4E32" }).min(1, { error: "\u756A\u5267EP ID\u4E0D\u80FD\u4E3A\u7A7A" })
|
|
2750
|
-
});
|
|
2751
|
-
var BilibiliDynamicParamsSchema = zod.z.object({
|
|
2752
|
-
methodType: zod.z.enum(["\u52A8\u6001\u8BE6\u60C5\u6570\u636E", "\u52A8\u6001\u5361\u7247\u6570\u636E"], {
|
|
2753
|
-
error: '\u65B9\u6CD5\u7C7B\u578B\u5FC5\u987B\u662F"\u52A8\u6001\u8BE6\u60C5\u6570\u636E"\u6216"\u52A8\u6001\u5361\u7247\u6570\u636E"'
|
|
2754
|
-
}),
|
|
2755
|
-
dynamic_id: zod.z.string({ error: "\u52A8\u6001ID\u5FC5\u987B\u662F\u5B57\u7B26\u4E32" }).min(1, { error: "\u52A8\u6001ID\u4E0D\u80FD\u4E3A\u7A7A" })
|
|
2756
|
-
});
|
|
2757
|
-
var BilibiliLiveParamsSchema = zod.z.object({
|
|
2758
|
-
methodType: zod.z.enum(["\u76F4\u64AD\u95F4\u4FE1\u606F", "\u76F4\u64AD\u95F4\u521D\u59CB\u5316\u4FE1\u606F"], {
|
|
2759
|
-
error: '\u65B9\u6CD5\u7C7B\u578B\u5FC5\u987B\u662F"\u76F4\u64AD\u95F4\u4FE1\u606F"\u6216"\u76F4\u64AD\u95F4\u521D\u59CB\u5316\u4FE1\u606F"'
|
|
2760
|
-
}),
|
|
2761
|
-
room_id: zod.z.string({ error: "\u76F4\u64AD\u95F4ID\u5FC5\u987B\u662F\u5B57\u7B26\u4E32" }).min(1, { error: "\u76F4\u64AD\u95F4ID\u4E0D\u80FD\u4E3A\u7A7A" })
|
|
2762
|
-
});
|
|
2763
|
-
var BilibiliLoginParamsSchema = zod.z.object({
|
|
2764
|
-
methodType: zod.z.literal("\u767B\u5F55\u57FA\u672C\u4FE1\u606F", { error: '\u65B9\u6CD5\u7C7B\u578B\u5FC5\u987B\u662F"\u767B\u5F55\u57FA\u672C\u4FE1\u606F"' })
|
|
2765
|
-
});
|
|
2766
|
-
var BilibiliQrcodeParamsSchema = zod.z.object({
|
|
2767
|
-
methodType: zod.z.literal("\u7533\u8BF7\u4E8C\u7EF4\u7801", { error: '\u65B9\u6CD5\u7C7B\u578B\u5FC5\u987B\u662F"\u7533\u8BF7\u4E8C\u7EF4\u7801"' })
|
|
2768
|
-
});
|
|
2769
|
-
var BilibiliQrcodeStatusParamsSchema = zod.z.object({
|
|
2770
|
-
methodType: zod.z.literal("\u4E8C\u7EF4\u7801\u72B6\u6001", { error: '\u65B9\u6CD5\u7C7B\u578B\u5FC5\u987B\u662F"\u4E8C\u7EF4\u7801\u72B6\u6001"' }),
|
|
2771
|
-
qrcode_key: zod.z.string({ error: "\u4E8C\u7EF4\u7801key\u5FC5\u987B\u662F\u5B57\u7B26\u4E32" }).min(1, { error: "\u4E8C\u7EF4\u7801key\u4E0D\u80FD\u4E3A\u7A7A" })
|
|
2772
|
-
});
|
|
2773
|
-
var BilibiliAv2BvParamsSchema = zod.z.object({
|
|
2774
|
-
methodType: zod.z.literal("AV\u8F6CBV", { error: '\u65B9\u6CD5\u7C7B\u578B\u5FC5\u987B\u662F"AV\u8F6CBV"' }),
|
|
2775
|
-
avid: zod.z.coerce.number({ error: "AVID\u5FC5\u987B\u662F\u6570\u5B57" }).int({ error: "AVID\u5FC5\u987B\u662F\u6574\u6570" }).positive({ error: "AVID\u5FC5\u987B\u662F\u6B63\u6570" })
|
|
2776
|
-
});
|
|
2777
|
-
var BilibiliBv2AvParamsSchema = zod.z.object({
|
|
2778
|
-
methodType: zod.z.literal("BV\u8F6CAV", { error: '\u65B9\u6CD5\u7C7B\u578B\u5FC5\u987B\u662F"BV\u8F6CAV"' }),
|
|
2779
|
-
bvid: zod.z.string({ error: "BVID\u5FC5\u987B\u662F\u5B57\u7B26\u4E32" }).min(1, { error: "BVID\u4E0D\u80FD\u4E3A\u7A7A" })
|
|
2780
|
-
});
|
|
2781
|
-
var BilibiliValidationSchemas2 = {
|
|
2782
|
-
"\u5355\u4E2A\u89C6\u9891\u4F5C\u54C1\u6570\u636E": BilibiliVideoParamsSchema,
|
|
2783
|
-
"\u5355\u4E2A\u89C6\u9891\u4E0B\u8F7D\u4FE1\u606F\u6570\u636E": BilibiliVideoDownloadParamsSchema,
|
|
2784
|
-
"\u8BC4\u8BBA\u6570\u636E": BilibiliCommentParamsSchema,
|
|
2785
|
-
"\u7528\u6237\u4E3B\u9875\u6570\u636E": BilibiliUserParamsSchema,
|
|
2786
|
-
"\u7528\u6237\u4E3B\u9875\u52A8\u6001\u5217\u8868\u6570\u636E": BilibiliUserParamsSchema,
|
|
2787
|
-
"Emoji\u6570\u636E": BilibiliEmojiParamsSchema,
|
|
2788
|
-
"\u756A\u5267\u57FA\u672C\u4FE1\u606F\u6570\u636E": BilibiliBangumiInfoParamsSchema,
|
|
2789
|
-
"\u756A\u5267\u4E0B\u8F7D\u4FE1\u606F\u6570\u636E": BilibiliBangumiStreamParamsSchema,
|
|
2790
|
-
"\u52A8\u6001\u8BE6\u60C5\u6570\u636E": BilibiliDynamicParamsSchema,
|
|
2791
|
-
"\u52A8\u6001\u5361\u7247\u6570\u636E": BilibiliDynamicParamsSchema,
|
|
2792
|
-
"\u76F4\u64AD\u95F4\u4FE1\u606F": BilibiliLiveParamsSchema,
|
|
2793
|
-
"\u76F4\u64AD\u95F4\u521D\u59CB\u5316\u4FE1\u606F": BilibiliLiveParamsSchema,
|
|
2794
|
-
"\u767B\u5F55\u57FA\u672C\u4FE1\u606F": BilibiliLoginParamsSchema,
|
|
2795
|
-
"\u7533\u8BF7\u4E8C\u7EF4\u7801": BilibiliQrcodeParamsSchema,
|
|
2796
|
-
"\u4E8C\u7EF4\u7801\u72B6\u6001": BilibiliQrcodeStatusParamsSchema,
|
|
2797
|
-
"\u83B7\u53D6UP\u4E3B\u603B\u64AD\u653E\u91CF": BilibiliUserParamsSchema,
|
|
2798
|
-
"AV\u8F6CBV": BilibiliAv2BvParamsSchema,
|
|
2799
|
-
"BV\u8F6CAV": BilibiliBv2AvParamsSchema
|
|
2800
|
-
};
|
|
2801
|
-
var KuaishouVideoParamsSchema = zod.z.object({
|
|
2802
|
-
methodType: zod.z.literal("\u5355\u4E2A\u89C6\u9891\u4F5C\u54C1\u6570\u636E", { error: '\u65B9\u6CD5\u7C7B\u578B\u5FC5\u987B\u662F"\u5355\u4E2A\u89C6\u9891\u4F5C\u54C1\u6570\u636E"' }),
|
|
2803
|
-
photoId: zod.z.string({ error: "\u89C6\u9891ID\u5FC5\u987B\u662F\u5B57\u7B26\u4E32" }).min(1, { error: "\u89C6\u9891ID\u4E0D\u80FD\u4E3A\u7A7A" })
|
|
2804
|
-
});
|
|
2805
|
-
var KuaishouCommentParamsSchema = zod.z.object({
|
|
2806
|
-
methodType: zod.z.literal("\u8BC4\u8BBA\u6570\u636E", { error: '\u65B9\u6CD5\u7C7B\u578B\u5FC5\u987B\u662F"\u8BC4\u8BBA\u6570\u636E"' }),
|
|
2807
|
-
photoId: zod.z.string({ error: "\u89C6\u9891ID\u5FC5\u987B\u662F\u5B57\u7B26\u4E32" }).min(1, { error: "\u89C6\u9891ID\u4E0D\u80FD\u4E3A\u7A7A" })
|
|
2808
|
-
});
|
|
2809
|
-
var KuaishouEmojiParamsSchema = zod.z.object({
|
|
2810
|
-
methodType: zod.z.literal("Emoji\u6570\u636E", { error: '\u65B9\u6CD5\u7C7B\u578B\u5FC5\u987B\u662F"Emoji\u6570\u636E"' })
|
|
2811
|
-
});
|
|
2812
|
-
var KuaishouValidationSchemas2 = {
|
|
2813
|
-
"\u5355\u4E2A\u89C6\u9891\u4F5C\u54C1\u6570\u636E": KuaishouVideoParamsSchema,
|
|
2814
|
-
"\u8BC4\u8BBA\u6570\u636E": KuaishouCommentParamsSchema,
|
|
2815
|
-
"Emoji\u6570\u636E": KuaishouEmojiParamsSchema
|
|
2816
|
-
};
|
|
2817
|
-
var xiaohongshuSign = class {
|
|
2818
|
-
static client = new xhshowTs.Xhshow();
|
|
2819
|
-
/**
|
|
2820
|
-
* 生成GET请求的X-S签名
|
|
2821
|
-
* @param path - API路径
|
|
2822
|
-
* @param a1Cookie - a1 cookie值
|
|
2823
|
-
* @param clientType - 客户端类型,默认为 'xhs-pc-web'
|
|
2824
|
-
* @param params - 查询参数对象
|
|
2825
|
-
* @returns X-S签名
|
|
2826
|
-
*/
|
|
2827
|
-
static generateXSGet(path2, a1Cookie, clientType = "xhs-pc-web", params = {}) {
|
|
2828
|
-
return this.client.signXsGet(path2, a1Cookie, clientType, params);
|
|
2829
|
-
}
|
|
2830
|
-
/**
|
|
2831
|
-
* 生成POST请求的X-S签名
|
|
2832
|
-
* @param path - API路径
|
|
2833
|
-
* @param a1Cookie - a1 cookie值
|
|
2834
|
-
* @param clientType - 客户端类型,默认为 'xhs-pc-web'
|
|
2835
|
-
* @param body - 请求体对象
|
|
2836
|
-
* @returns X-S签名
|
|
2837
|
-
*/
|
|
2838
|
-
static generateXSPost(path2, a1Cookie, clientType = "xhs-pc-web", body = {}) {
|
|
2839
|
-
return this.client.signXsPost(path2, a1Cookie, clientType, body);
|
|
2840
|
-
}
|
|
2841
|
-
/**
|
|
2842
|
-
* 生成X-S签名(兼容旧接口)
|
|
2843
|
-
* @param url - 请求URL
|
|
2844
|
-
* @param body - 请求体
|
|
2845
|
-
* @param userAgent - User-Agent(暂未使用)
|
|
2846
|
-
* @param method - 请求方法,默认为 'POST'
|
|
2847
|
-
* @param a1Cookie - a1 cookie值
|
|
2848
|
-
* @returns X-S签名
|
|
2849
|
-
*/
|
|
2850
|
-
static generateXS(url, body, userAgent, method = "POST", a1Cookie = "") {
|
|
2851
|
-
try {
|
|
2852
|
-
const urlObj = new URL(url);
|
|
2853
|
-
const path2 = urlObj.pathname + urlObj.search;
|
|
2854
|
-
if (method.toUpperCase() === "GET") {
|
|
2855
|
-
const params = typeof body === "object" ? body : {};
|
|
2856
|
-
return this.generateXSGet(path2, a1Cookie, "xhs-pc-web", params);
|
|
2857
|
-
} else {
|
|
2858
|
-
const requestBody = typeof body === "object" ? body : {};
|
|
2859
|
-
return this.generateXSPost(path2, a1Cookie, "xhs-pc-web", requestBody);
|
|
2860
|
-
}
|
|
2861
|
-
} catch (error) {
|
|
2862
|
-
console.error("\u751F\u6210X-S\u7B7E\u540D\u5931\u8D25:", error);
|
|
2863
|
-
throw new Error(`\u7B7E\u540D\u751F\u6210\u5931\u8D25: ${error}`);
|
|
2864
|
-
}
|
|
2865
|
-
}
|
|
2866
|
-
/**
|
|
2867
|
-
* 生成X-S-Common参数
|
|
2868
|
-
* @param length - 长度
|
|
2869
|
-
* @returns Base64编码的随机字符串
|
|
2870
|
-
*/
|
|
2871
|
-
static generateXSCommon(length = 945) {
|
|
2872
|
-
return crypto__default.default.randomBytes(length).toString("base64").replace(/=+$/, "");
|
|
2873
|
-
}
|
|
2874
|
-
/**
|
|
2875
|
-
* 生成X-T时间戳
|
|
2876
|
-
* @returns 当前时间戳字符串
|
|
2877
|
-
*/
|
|
2878
|
-
static generateXT() {
|
|
2879
|
-
return Date.now().toString();
|
|
2880
|
-
}
|
|
2881
|
-
/**
|
|
2882
|
-
* 生成X-B3-Traceid
|
|
2883
|
-
* @returns 16位随机字符串
|
|
2884
|
-
*/
|
|
2885
|
-
static generateXB3Traceid() {
|
|
2886
|
-
return Array.from({ length: 16 }, () => "abcdef0123456789"[Math.floor(Math.random() * 16)]).join("");
|
|
2887
|
-
}
|
|
2888
|
-
/**
|
|
2889
|
-
* 从cookie字符串中提取a1值
|
|
2890
|
-
* @param cookieString - 完整的cookie字符串
|
|
2891
|
-
* @returns a1 cookie值
|
|
2892
|
-
*/
|
|
2893
|
-
static extractA1FromCookie(cookieString) {
|
|
2894
|
-
const match = cookieString.match(/a1=([^;]+)/);
|
|
2895
|
-
return match ? match[1] : "";
|
|
2896
|
-
}
|
|
2897
|
-
/**
|
|
2898
|
-
* 生成搜索ID
|
|
2899
|
-
* @returns 搜索ID字符串
|
|
2900
|
-
*/
|
|
2901
|
-
static getSearchId = () => (BigInt(Date.now()) << 64n) + BigInt(Math.floor(Math.random() * 2147483646)).toString(36);
|
|
2902
|
-
};
|
|
2903
|
-
|
|
2904
|
-
// src/platform/xiaohongshu/API.ts
|
|
2905
|
-
var SearchSortType = /* @__PURE__ */ ((SearchSortType2) => {
|
|
2906
|
-
SearchSortType2["GENERAL"] = "general";
|
|
2907
|
-
SearchSortType2["MOST_POPULAR"] = "popularity_descending";
|
|
2908
|
-
SearchSortType2["LATEST"] = "time_descending";
|
|
2909
|
-
return SearchSortType2;
|
|
2910
|
-
})(SearchSortType || {});
|
|
2911
|
-
var SearchNoteType = /* @__PURE__ */ ((SearchNoteType2) => {
|
|
2912
|
-
SearchNoteType2[SearchNoteType2["ALL"] = 0] = "ALL";
|
|
2913
|
-
SearchNoteType2[SearchNoteType2["VIDEO"] = 1] = "VIDEO";
|
|
2914
|
-
SearchNoteType2[SearchNoteType2["IMAGE"] = 2] = "IMAGE";
|
|
2915
|
-
return SearchNoteType2;
|
|
2916
|
-
})(SearchNoteType || {});
|
|
2917
|
-
var buildQueryString2 = (params) => {
|
|
2918
|
-
return Object.entries(params).filter(([_, value]) => value !== void 0 && value !== null).map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`).join("&");
|
|
2919
|
-
};
|
|
2920
|
-
var xiaohongshuApiUrls = {
|
|
2921
|
-
/**
|
|
2922
|
-
* 获取首页推荐数据的接口地址
|
|
2923
|
-
* @param data - 请求参数
|
|
2924
|
-
* @returns 完整的接口URL
|
|
2925
|
-
*/
|
|
2926
|
-
\u9996\u9875\u63A8\u8350\u6570\u636E(data2 = {}) {
|
|
2927
|
-
return {
|
|
2928
|
-
apiPath: "/api/sns/web/v1/homefeed",
|
|
2929
|
-
Url: "https://edith.xiaohongshu.com/api/sns/web/v1/homefeed",
|
|
2930
|
-
Body: {
|
|
2931
|
-
cursor_score: data2.cursor_score || "1.7599348899670024E9",
|
|
2932
|
-
num: data2.num || 33,
|
|
2933
|
-
refresh_type: data2.refresh_type || 3,
|
|
2934
|
-
note_index: data2.note_index || 33,
|
|
2935
|
-
category: data2.category || "homefeed_recommend",
|
|
2936
|
-
search_key: data2.search_key || "",
|
|
2937
|
-
image_formats: ["jpg", "webp", "avif"]
|
|
2938
|
-
}
|
|
2939
|
-
};
|
|
2940
|
-
},
|
|
2941
|
-
/**
|
|
2942
|
-
* 获取单个笔记数据的接口地址
|
|
2943
|
-
* @param data - 请求参数
|
|
2944
|
-
* @returns 完整的接口URL
|
|
2945
|
-
*/
|
|
2946
|
-
\u5355\u4E2A\u7B14\u8BB0\u6570\u636E(data2) {
|
|
2947
|
-
return {
|
|
2948
|
-
apiPath: "/api/sns/web/v1/feed",
|
|
2949
|
-
Url: "https://edith.xiaohongshu.com/api/sns/web/v1/feed",
|
|
2950
|
-
Body: {
|
|
2951
|
-
source_note_id: data2.note_id,
|
|
2952
|
-
image_formats: ["jpg", "webp", "avif"],
|
|
2953
|
-
extra: {
|
|
2954
|
-
need_body_topic: "1"
|
|
2955
|
-
},
|
|
2956
|
-
xsec_source: "pc_feed",
|
|
2957
|
-
xsec_token: data2.xsec_token
|
|
2958
|
-
}
|
|
2959
|
-
};
|
|
2960
|
-
},
|
|
2961
|
-
/**
|
|
2962
|
-
* 获取评论数据的接口地址
|
|
2963
|
-
* @param data - 请求参数
|
|
2964
|
-
* @returns 完整的接口URL
|
|
2965
|
-
*/
|
|
2966
|
-
\u8BC4\u8BBA\u6570\u636E(data2) {
|
|
2967
|
-
const baseUrl = "https://edith.xiaohongshu.com/api/sns/web/v2/comment/page";
|
|
2968
|
-
const params = {
|
|
2969
|
-
note_id: data2.note_id,
|
|
2970
|
-
cursor: data2.cursor || "",
|
|
2971
|
-
image_formats: ["jpg", "webp", "avif"].join(","),
|
|
2972
|
-
xsec_token: data2.xsec_token
|
|
2973
|
-
};
|
|
2974
|
-
return {
|
|
2975
|
-
apiPath: "/api/sns/web/v2/comment/page",
|
|
2976
|
-
Url: `${baseUrl}?${buildQueryString2(params)}`
|
|
2977
|
-
};
|
|
2978
|
-
},
|
|
2979
|
-
/**
|
|
2980
|
-
* 获取用户数据的接口地址
|
|
2981
|
-
* @param data - 请求参数
|
|
2982
|
-
* @returns 完整的接口URL
|
|
2983
|
-
*/
|
|
2984
|
-
\u7528\u6237\u6570\u636E(data2) {
|
|
2985
|
-
return {
|
|
2986
|
-
apiPath: "/api/sns/web/v1/user/otherinfo",
|
|
2987
|
-
Url: `https://www.xiaohongshu.com/user/profile/${data2.user_id}`
|
|
2988
|
-
};
|
|
2989
|
-
},
|
|
2990
|
-
/**
|
|
2991
|
-
* 获取用户笔记数据的接口地址
|
|
2992
|
-
* @param data - 请求参数
|
|
2993
|
-
* @returns 完整的接口URL
|
|
2994
|
-
*/
|
|
2995
|
-
\u7528\u6237\u7B14\u8BB0\u6570\u636E(data2) {
|
|
2996
|
-
const baseUrl = "https://edith.xiaohongshu.com/api/sns/web/v1/user_posted";
|
|
2997
|
-
const params = {
|
|
2998
|
-
user_id: data2.user_id,
|
|
2999
|
-
cursor: data2.cursor || "",
|
|
3000
|
-
num: data2.num || 30,
|
|
3001
|
-
image_formats: ["jpg", "webp", "avif"].join(","),
|
|
3002
|
-
xsec_source: "pc_feed"
|
|
3003
|
-
};
|
|
3004
|
-
return {
|
|
3005
|
-
apiPath: "/api/sns/web/v1/user_posted",
|
|
3006
|
-
Url: `${baseUrl}?${buildQueryString2(params)}`
|
|
3007
|
-
};
|
|
3008
|
-
},
|
|
3009
|
-
/**
|
|
3010
|
-
* 获取笔记表情列表的接口地址
|
|
3011
|
-
* @param data - 请求参数
|
|
3012
|
-
* @returns 完整的接口URL
|
|
3013
|
-
*/
|
|
3014
|
-
\u8868\u60C5\u5217\u8868(data2) {
|
|
3015
|
-
return {
|
|
3016
|
-
apiPath: "/api/im/redmoji/detail",
|
|
3017
|
-
Url: "https://edith.xiaohongshu.com/api/im/redmoji/detail"
|
|
3018
|
-
};
|
|
3019
|
-
},
|
|
3020
|
-
/**
|
|
3021
|
-
* 搜索笔记的接口地址
|
|
3022
|
-
* @param data - 请求参数
|
|
3023
|
-
* @returns 完整的接口URL
|
|
3024
|
-
*/
|
|
3025
|
-
\u641C\u7D22\u7B14\u8BB0(data2) {
|
|
3026
|
-
return {
|
|
3027
|
-
apiPath: "/api/sns/web/v1/search/notes",
|
|
3028
|
-
Body: {
|
|
3029
|
-
keyword: data2.keyword,
|
|
3030
|
-
page: data2.page || 1,
|
|
3031
|
-
page_size: data2.page_size || 20,
|
|
3032
|
-
sort: "general" /* GENERAL */,
|
|
3033
|
-
note_type: 0 /* ALL */,
|
|
3034
|
-
search_id: xiaohongshuSign.getSearchId(),
|
|
3035
|
-
image_formats: ["jpg", "webp", "avif"]
|
|
3036
|
-
},
|
|
3037
|
-
Url: "https://edith.xiaohongshu.com/api/sns/web/v1/search/notes"
|
|
3038
|
-
};
|
|
3039
|
-
}
|
|
3040
|
-
};
|
|
3041
|
-
var createXiaohongshuApiUrls = () => {
|
|
3042
|
-
return xiaohongshuApiUrls;
|
|
3043
|
-
};
|
|
3044
|
-
var SearchSortTypeValues = Object.values(SearchSortType).filter((v) => typeof v === "string");
|
|
3045
|
-
var SearchNoteTypeValues = Object.values(SearchNoteType).filter((v) => typeof v === "string");
|
|
3046
|
-
var HomeFeedParamsSchema = zod.z.object({
|
|
3047
|
-
methodType: zod.z.literal("\u9996\u9875\u63A8\u8350\u6570\u636E", { error: '\u65B9\u6CD5\u7C7B\u578B\u5FC5\u987B\u662F"\u9996\u9875\u63A8\u8350\u6570\u636E"' }),
|
|
3048
|
-
cursor_score: zod.z.string({ error: "cursor_score\u5FC5\u987B\u662F\u5B57\u7B26\u4E32" }).optional(),
|
|
3049
|
-
num: zod.z.number({ error: "\u6570\u91CF\u5FC5\u987B\u662F\u6570\u5B57" }).min(1, { error: "\u6570\u91CF\u4E0D\u80FD\u5C0F\u4E8E1" }).max(100, { error: "\u6570\u91CF\u4E0D\u80FD\u5927\u4E8E100" }).optional(),
|
|
3050
|
-
refresh_type: zod.z.number({ error: "refresh_type\u5FC5\u987B\u662F\u6570\u5B57" }).optional(),
|
|
3051
|
-
note_index: zod.z.number({ error: "note_index\u5FC5\u987B\u662F\u6570\u5B57" }).optional(),
|
|
3052
|
-
category: zod.z.string({ error: "category\u5FC5\u987B\u662F\u5B57\u7B26\u4E32" }).optional(),
|
|
3053
|
-
search_key: zod.z.string({ error: "search_key\u5FC5\u987B\u662F\u5B57\u7B26\u4E32" }).optional()
|
|
3054
|
-
});
|
|
3055
|
-
var NoteParamsSchema = zod.z.object({
|
|
3056
|
-
methodType: zod.z.literal("\u5355\u4E2A\u7B14\u8BB0\u6570\u636E", { error: '\u65B9\u6CD5\u7C7B\u578B\u5FC5\u987B\u662F"\u5355\u4E2A\u7B14\u8BB0\u6570\u636E"' }),
|
|
3057
|
-
note_id: zod.z.string({ error: "note_id\u5FC5\u987B\u662F\u5B57\u7B26\u4E32" }),
|
|
3058
|
-
xsec_token: zod.z.string({ error: "xsec_token\u5FC5\u987B\u662F\u5B57\u7B26\u4E32" })
|
|
3059
|
-
});
|
|
3060
|
-
var CommentParamsSchema = zod.z.object({
|
|
3061
|
-
methodType: zod.z.literal("\u8BC4\u8BBA\u6570\u636E", { error: '\u65B9\u6CD5\u7C7B\u578B\u5FC5\u987B\u662F"\u8BC4\u8BBA\u6570\u636E"' }),
|
|
3062
|
-
note_id: zod.z.string({ error: "note_id\u5FC5\u987B\u662F\u5B57\u7B26\u4E32" }),
|
|
3063
|
-
cursor: zod.z.string({ error: "cursor\u5FC5\u987B\u662F\u5B57\u7B26\u4E32" }).optional(),
|
|
3064
|
-
xsec_token: zod.z.string({ error: "xsec_token\u5FC5\u987B\u662F\u5B57\u7B26\u4E32" })
|
|
3065
|
-
});
|
|
3066
|
-
var UserParamsSchema = zod.z.object({
|
|
3067
|
-
methodType: zod.z.literal("\u7528\u6237\u6570\u636E", { error: '\u65B9\u6CD5\u7C7B\u578B\u5FC5\u987B\u662F"\u7528\u6237\u6570\u636E"' }),
|
|
3068
|
-
user_id: zod.z.string({ error: "user_id\u5FC5\u987B\u662F\u5B57\u7B26\u4E32" })
|
|
3069
|
-
});
|
|
3070
|
-
var UserNoteParamsSchema = zod.z.object({
|
|
3071
|
-
methodType: zod.z.literal("\u7528\u6237\u7B14\u8BB0\u6570\u636E", { error: '\u65B9\u6CD5\u7C7B\u578B\u5FC5\u987B\u662F"\u7528\u6237\u7B14\u8BB0\u6570\u636E"' }),
|
|
3072
|
-
user_id: zod.z.string({ error: "user_id\u5FC5\u987B\u662F\u5B57\u7B26\u4E32" }),
|
|
3073
|
-
cursor: zod.z.string({ error: "cursor\u5FC5\u987B\u662F\u5B57\u7B26\u4E32" }).optional(),
|
|
3074
|
-
num: zod.z.number({ error: "\u6570\u91CF\u5FC5\u987B\u662F\u6570\u5B57" }).min(1, { error: "\u6570\u91CF\u4E0D\u80FD\u5C0F\u4E8E1" }).max(100, { error: "\u6570\u91CF\u4E0D\u80FD\u5927\u4E8E100" }).optional()
|
|
3075
|
-
});
|
|
3076
|
-
var EmojiListParamsSchema = zod.z.object({
|
|
3077
|
-
methodType: zod.z.literal("\u8868\u60C5\u5217\u8868", { error: '\u65B9\u6CD5\u7C7B\u578B\u5FC5\u987B\u662F"\u8868\u60C5\u5217\u8868"' })
|
|
3078
|
-
});
|
|
3079
|
-
var SearchNoteParamsSchema = zod.z.object({
|
|
3080
|
-
methodType: zod.z.literal("\u641C\u7D22\u7B14\u8BB0", { error: '\u65B9\u6CD5\u7C7B\u578B\u5FC5\u987B\u662F"\u641C\u7D22\u7B14\u8BB0"' }),
|
|
3081
|
-
keyword: zod.z.string({ error: "keyword\u5FC5\u987B\u662F\u5B57\u7B26\u4E32" }),
|
|
3082
|
-
page: zod.z.number({ error: "page\u5FC5\u987B\u662F\u6570\u5B57" }).min(1, { error: "page\u4E0D\u80FD\u5C0F\u4E8E1" }).optional(),
|
|
3083
|
-
page_size: zod.z.number({ error: "page_size\u5FC5\u987B\u662F\u6570\u5B57" }).min(1, { error: "page_size\u4E0D\u80FD\u5C0F\u4E8E1" }).max(100, { error: "page_size\u4E0D\u80FD\u5927\u4E8E100" }).optional(),
|
|
3084
|
-
sort: zod.z.enum(SearchSortTypeValues, { error: "\u6392\u5E8F\u7C7B\u578B\u4E0D\u5408\u6CD5" }).optional(),
|
|
3085
|
-
note_type: zod.z.enum(SearchNoteTypeValues, { error: "\u7B14\u8BB0\u7C7B\u578B\u4E0D\u5408\u6CD5" }).optional()
|
|
3086
|
-
});
|
|
3087
|
-
var XiaohongshuValidationSchemas = {
|
|
3088
|
-
\u9996\u9875\u63A8\u8350\u6570\u636E: HomeFeedParamsSchema,
|
|
3089
|
-
\u5355\u4E2A\u7B14\u8BB0\u6570\u636E: NoteParamsSchema,
|
|
3090
|
-
\u8BC4\u8BBA\u6570\u636E: CommentParamsSchema,
|
|
3091
|
-
\u7528\u6237\u6570\u636E: UserParamsSchema,
|
|
3092
|
-
\u7528\u6237\u7B14\u8BB0\u6570\u636E: UserNoteParamsSchema,
|
|
3093
|
-
\u8868\u60C5\u5217\u8868: EmojiListParamsSchema,
|
|
3094
|
-
\u641C\u7D22\u7B14\u8BB0: SearchNoteParamsSchema
|
|
3095
|
-
};
|
|
3096
|
-
var validateXiaohongshuParams = (methodType, params) => {
|
|
3097
|
-
const schema = XiaohongshuValidationSchemas[methodType];
|
|
3098
|
-
const validated = schema.parse(
|
|
3099
|
-
typeof params === "object" && params !== null ? { methodType, ...params } : { methodType, params }
|
|
3100
|
-
);
|
|
3101
|
-
return validated;
|
|
3102
|
-
};
|
|
3103
|
-
|
|
3104
|
-
// src/validation/index.ts
|
|
3105
|
-
var validateDouyinParams = (methodType, params) => {
|
|
3106
|
-
const schema = DouyinValidationSchemas2[methodType];
|
|
3107
|
-
const validated = schema.parse(
|
|
3108
|
-
typeof params === "object" && params !== null ? { methodType, ...params } : { methodType, params }
|
|
3109
|
-
);
|
|
3110
|
-
return validated;
|
|
3111
|
-
};
|
|
3112
|
-
var validateBilibiliParams = (methodType, params) => {
|
|
3113
|
-
const schema = BilibiliValidationSchemas2[methodType];
|
|
3114
|
-
const validated = schema.parse(
|
|
3115
|
-
typeof params === "object" && params !== null ? { methodType, ...params } : { methodType, params }
|
|
3116
|
-
);
|
|
3117
|
-
return validated;
|
|
3118
|
-
};
|
|
3119
|
-
var validateKuaishouParams = (methodType, params) => {
|
|
3120
|
-
const schema = KuaishouValidationSchemas2[methodType];
|
|
3121
|
-
const validated = schema.parse(
|
|
3122
|
-
typeof params === "object" && params !== null ? { methodType, ...params } : { methodType, params }
|
|
3123
|
-
);
|
|
3124
|
-
return validated;
|
|
3125
|
-
};
|
|
3126
|
-
var createSuccessResponse = (data2, message, code = 200) => {
|
|
3127
|
-
return {
|
|
3128
|
-
success: true,
|
|
3129
|
-
data: data2,
|
|
3130
|
-
message,
|
|
3131
|
-
code,
|
|
3132
|
-
error: void 0
|
|
3133
|
-
};
|
|
3134
|
-
};
|
|
3135
|
-
var createErrorResponse = (error, message, code = 500) => {
|
|
3136
|
-
return {
|
|
3137
|
-
success: false,
|
|
3138
|
-
error,
|
|
3139
|
-
message,
|
|
3140
|
-
code,
|
|
3141
|
-
data: void 0
|
|
3142
|
-
};
|
|
3143
|
-
};
|
|
3144
|
-
|
|
3145
|
-
// src/platform/xiaohongshu/getdata.ts
|
|
3146
|
-
var XiaohongshuData = async (data2, cookie, requestConfig) => {
|
|
3147
|
-
const defHeaders = getXiaohongshuDefaultConfig(cookie)["headers"];
|
|
3148
|
-
const baseRequestConfig = {
|
|
3149
|
-
method: "POST",
|
|
3150
|
-
timeout: 1e4,
|
|
3151
|
-
...requestConfig,
|
|
3152
|
-
headers: {
|
|
3153
|
-
...defHeaders,
|
|
3154
|
-
...{}
|
|
3155
|
-
}
|
|
3156
|
-
};
|
|
3157
|
-
const xiaohongshuApiUrls2 = createXiaohongshuApiUrls();
|
|
3158
|
-
switch (data2.methodType) {
|
|
3159
|
-
case "\u9996\u9875\u63A8\u8350\u6570\u636E": {
|
|
3160
|
-
const homeFeedData = await GlobalGetData4(data2.methodType, {
|
|
3161
|
-
...baseRequestConfig,
|
|
3162
|
-
url: xiaohongshuApiUrls2.\u9996\u9875\u63A8\u8350\u6570\u636E(data2).Url,
|
|
3163
|
-
data: JSON.stringify(xiaohongshuApiUrls2.\u9996\u9875\u63A8\u8350\u6570\u636E(data2).Body),
|
|
3164
|
-
headers: {
|
|
3165
|
-
...baseRequestConfig.headers,
|
|
3166
|
-
"x-s": xiaohongshuSign.generateXSPost(
|
|
3167
|
-
xiaohongshuApiUrls2.\u9996\u9875\u63A8\u8350\u6570\u636E(data2).apiPath,
|
|
3168
|
-
xiaohongshuSign.extractA1FromCookie(cookie || ""),
|
|
3169
|
-
"xhs-pc-web",
|
|
3170
|
-
xiaohongshuApiUrls2.\u9996\u9875\u63A8\u8350\u6570\u636E(data2).Body
|
|
3171
|
-
),
|
|
3172
|
-
"x-s-common": xiaohongshuSign.generateXSCommon(),
|
|
3173
|
-
"x-t": xiaohongshuSign.generateXT()
|
|
3174
|
-
}
|
|
3175
|
-
});
|
|
3176
|
-
return homeFeedData;
|
|
3177
|
-
}
|
|
3178
|
-
case "\u5355\u4E2A\u7B14\u8BB0\u6570\u636E": {
|
|
3179
|
-
const noteData = await GlobalGetData4(data2.methodType, {
|
|
3180
|
-
...baseRequestConfig,
|
|
3181
|
-
url: xiaohongshuApiUrls2.\u5355\u4E2A\u7B14\u8BB0\u6570\u636E(data2).Url,
|
|
3182
|
-
data: xiaohongshuApiUrls2.\u5355\u4E2A\u7B14\u8BB0\u6570\u636E(data2).Body,
|
|
3183
|
-
headers: {
|
|
3184
|
-
...baseRequestConfig.headers,
|
|
3185
|
-
"x-s": xiaohongshuSign.generateXSPost(
|
|
3186
|
-
xiaohongshuApiUrls2.\u5355\u4E2A\u7B14\u8BB0\u6570\u636E(data2).apiPath,
|
|
3187
|
-
xiaohongshuSign.extractA1FromCookie(cookie || ""),
|
|
3188
|
-
"xhs-pc-web",
|
|
3189
|
-
xiaohongshuApiUrls2.\u5355\u4E2A\u7B14\u8BB0\u6570\u636E(data2).Body
|
|
3190
|
-
),
|
|
3191
|
-
"x-s-common": xiaohongshuSign.generateXSCommon(),
|
|
3192
|
-
"x-t": xiaohongshuSign.generateXT()
|
|
3193
|
-
}
|
|
3194
|
-
});
|
|
3195
|
-
return noteData;
|
|
3196
|
-
}
|
|
3197
|
-
case "\u8BC4\u8BBA\u6570\u636E": {
|
|
3198
|
-
const baseRequestConfig2 = {
|
|
3199
|
-
method: "GET",
|
|
3200
|
-
timeout: 1e4,
|
|
3201
|
-
...requestConfig,
|
|
3202
|
-
headers: {
|
|
3203
|
-
...defHeaders,
|
|
3204
|
-
...{}
|
|
3205
|
-
}
|
|
3206
|
-
};
|
|
3207
|
-
const commentData = await GlobalGetData4(data2.methodType, {
|
|
3208
|
-
...baseRequestConfig2,
|
|
3209
|
-
url: xiaohongshuApiUrls2.\u8BC4\u8BBA\u6570\u636E(data2).Url,
|
|
3210
|
-
headers: {
|
|
3211
|
-
...baseRequestConfig2.headers,
|
|
3212
|
-
"x-s": xiaohongshuSign.generateXSGet(
|
|
3213
|
-
xiaohongshuApiUrls2.\u8BC4\u8BBA\u6570\u636E(data2).apiPath,
|
|
3214
|
-
xiaohongshuSign.extractA1FromCookie(cookie || ""),
|
|
3215
|
-
"xhs-pc-web"
|
|
3216
|
-
),
|
|
3217
|
-
"x-s-common": xiaohongshuSign.generateXSCommon(),
|
|
3218
|
-
"x-t": xiaohongshuSign.generateXT()
|
|
3219
|
-
}
|
|
3220
|
-
});
|
|
3221
|
-
return commentData;
|
|
3222
|
-
}
|
|
3223
|
-
case "\u7528\u6237\u6570\u636E": {
|
|
3224
|
-
const baseRequestConfig2 = {
|
|
3225
|
-
method: "GET",
|
|
3226
|
-
timeout: 1e4,
|
|
3227
|
-
...requestConfig,
|
|
3228
|
-
headers: {
|
|
3229
|
-
...defHeaders,
|
|
3230
|
-
...{}
|
|
3231
|
-
}
|
|
3232
|
-
};
|
|
3233
|
-
const userData = await GlobalGetData4(data2.methodType, {
|
|
3234
|
-
...baseRequestConfig2,
|
|
3235
|
-
url: xiaohongshuApiUrls2.\u7528\u6237\u6570\u636E(data2).Url,
|
|
3236
|
-
headers: {
|
|
3237
|
-
...baseRequestConfig2.headers,
|
|
3238
|
-
"x-s": xiaohongshuSign.generateXSGet(
|
|
3239
|
-
xiaohongshuApiUrls2.\u7528\u6237\u6570\u636E(data2).apiPath,
|
|
3240
|
-
xiaohongshuSign.extractA1FromCookie(cookie || ""),
|
|
3241
|
-
"xhs-pc-web"
|
|
3242
|
-
),
|
|
3243
|
-
"x-s-common": xiaohongshuSign.generateXSCommon(),
|
|
3244
|
-
"x-t": xiaohongshuSign.generateXT()
|
|
3245
|
-
}
|
|
3246
|
-
});
|
|
3247
|
-
const pageData = extractCreatorInfoFromHtml(userData);
|
|
3248
|
-
return {
|
|
3249
|
-
code: 0,
|
|
3250
|
-
data: pageData,
|
|
3251
|
-
msg: "\u6210\u529F"
|
|
3252
|
-
};
|
|
3253
|
-
}
|
|
3254
|
-
case "\u7528\u6237\u7B14\u8BB0\u6570\u636E": {
|
|
3255
|
-
const userNoteData = await GlobalGetData4(data2.methodType, {
|
|
3256
|
-
...baseRequestConfig,
|
|
3257
|
-
method: "GET",
|
|
3258
|
-
url: xiaohongshuApiUrls2.\u7528\u6237\u7B14\u8BB0\u6570\u636E(data2).Url,
|
|
3259
|
-
headers: {
|
|
3260
|
-
...baseRequestConfig.headers,
|
|
3261
|
-
"x-b3-traceid": xiaohongshuSign.generateXB3Traceid(),
|
|
3262
|
-
"x-s": xiaohongshuSign.generateXSGet(
|
|
3263
|
-
xiaohongshuApiUrls2.\u7528\u6237\u7B14\u8BB0\u6570\u636E(data2).apiPath,
|
|
3264
|
-
xiaohongshuSign.extractA1FromCookie(cookie || ""),
|
|
3265
|
-
"xhs-pc-web"
|
|
3266
|
-
),
|
|
3267
|
-
"x-s-common": xiaohongshuSign.generateXSCommon(),
|
|
3268
|
-
"x-t": xiaohongshuSign.generateXT()
|
|
3269
|
-
}
|
|
3270
|
-
});
|
|
3271
|
-
return userNoteData;
|
|
3272
|
-
}
|
|
3273
|
-
case "\u8868\u60C5\u5217\u8868": {
|
|
3274
|
-
const baseRequestConfig2 = {
|
|
3275
|
-
method: "GET",
|
|
3276
|
-
timeout: 1e4,
|
|
3277
|
-
...requestConfig,
|
|
3278
|
-
headers: {
|
|
3279
|
-
...defHeaders,
|
|
3280
|
-
...{}
|
|
3281
|
-
}
|
|
3282
|
-
};
|
|
3283
|
-
const emojiListData = await GlobalGetData4(data2.methodType, {
|
|
3284
|
-
...baseRequestConfig2,
|
|
3285
|
-
url: xiaohongshuApiUrls2.\u8868\u60C5\u5217\u8868(data2).Url,
|
|
3286
|
-
headers: {
|
|
3287
|
-
...baseRequestConfig2.headers,
|
|
3288
|
-
"x-s": xiaohongshuSign.generateXSGet(
|
|
3289
|
-
xiaohongshuApiUrls2.\u8868\u60C5\u5217\u8868(data2).apiPath,
|
|
3290
|
-
xiaohongshuSign.extractA1FromCookie(cookie || ""),
|
|
3291
|
-
"xhs-pc-web"
|
|
3292
|
-
),
|
|
3293
|
-
"x-s-common": xiaohongshuSign.generateXSCommon(),
|
|
3294
|
-
"x-t": xiaohongshuSign.generateXT()
|
|
3295
|
-
}
|
|
3296
|
-
});
|
|
3297
|
-
return emojiListData;
|
|
3298
|
-
}
|
|
3299
|
-
case "\u641C\u7D22\u7B14\u8BB0": {
|
|
3300
|
-
const searchNoteData = await GlobalGetData4(data2.methodType, {
|
|
3301
|
-
...baseRequestConfig,
|
|
3302
|
-
url: xiaohongshuApiUrls2.\u641C\u7D22\u7B14\u8BB0(data2).Url,
|
|
3303
|
-
data: xiaohongshuApiUrls2.\u641C\u7D22\u7B14\u8BB0(data2).Body,
|
|
3304
|
-
headers: {
|
|
3305
|
-
...baseRequestConfig.headers,
|
|
3306
|
-
"x-s": xiaohongshuSign.generateXSPost(
|
|
3307
|
-
xiaohongshuApiUrls2.\u641C\u7D22\u7B14\u8BB0(data2).apiPath,
|
|
3308
|
-
xiaohongshuSign.extractA1FromCookie(cookie || ""),
|
|
3309
|
-
"xhs-pc-web"
|
|
3310
|
-
),
|
|
3311
|
-
"x-s-common": xiaohongshuSign.generateXSCommon(),
|
|
3312
|
-
"x-t": xiaohongshuSign.generateXT()
|
|
3313
|
-
}
|
|
3314
|
-
});
|
|
3315
|
-
return searchNoteData;
|
|
3316
|
-
}
|
|
3317
|
-
default:
|
|
3318
|
-
throw new Error(`\u672A\u77E5\u7684\u5C0F\u7EA2\u4E66\u6570\u636E\u63A5\u53E3: \u300C${logger.red(data2.methodType)}\u300D`);
|
|
3319
|
-
}
|
|
3320
|
-
};
|
|
3321
|
-
var GlobalGetData4 = async (methodType, config) => {
|
|
3322
|
-
var _a;
|
|
3323
|
-
try {
|
|
3324
|
-
const response = await fetchData(config);
|
|
3325
|
-
if (typeof response === "string" && response.includes("<html>")) {
|
|
3326
|
-
return response;
|
|
3327
|
-
}
|
|
3328
|
-
if (response.code !== 0) {
|
|
3329
|
-
throw new Error(`API\u8BF7\u6C42\u5931\u8D25: ${((_a = response.data) == null ? void 0 : _a.msg) || response.msg || "\u672A\u77E5\u9519\u8BEF"}, code: ${response.code}`);
|
|
3330
|
-
}
|
|
3331
|
-
return response;
|
|
3332
|
-
} catch (error) {
|
|
3333
|
-
logger.error(`\u5C0F\u7EA2\u4E66API\u8BF7\u6C42\u5931\u8D25 [${methodType}]:`, error.message);
|
|
3334
|
-
const errorDetail = {
|
|
3335
|
-
errorDescription: error.message || "\u672A\u77E5\u9519\u8BEF",
|
|
3336
|
-
requestType: methodType,
|
|
3337
|
-
requestUrl: config.url || ""
|
|
3338
|
-
};
|
|
3339
|
-
return {
|
|
3340
|
-
code: 500,
|
|
3341
|
-
message: "error",
|
|
3342
|
-
data: null,
|
|
3343
|
-
amagiError: errorDetail,
|
|
3344
|
-
amagiMessage: `\u5C0F\u7EA2\u4E66API\u8BF7\u6C42\u5931\u8D25: ${error.message}`
|
|
3345
|
-
};
|
|
3346
|
-
}
|
|
3347
|
-
};
|
|
3348
|
-
|
|
3349
|
-
// src/model/DataFetchers.ts
|
|
3350
|
-
async function getDouyinData(methodType, optionsOrCookie, cookieOrOptions, requestConfig) {
|
|
3351
|
-
try {
|
|
3352
|
-
let options;
|
|
3353
|
-
let cookie;
|
|
3354
|
-
let config;
|
|
3355
|
-
if (typeof optionsOrCookie === "string") {
|
|
3356
|
-
cookie = optionsOrCookie;
|
|
3357
|
-
options = cookieOrOptions;
|
|
3358
|
-
config = requestConfig;
|
|
3359
|
-
} else {
|
|
3360
|
-
options = optionsOrCookie;
|
|
3361
|
-
cookie = cookieOrOptions;
|
|
3362
|
-
config = requestConfig;
|
|
3363
|
-
}
|
|
3364
|
-
const { typeMode: _, ...validationOptions } = options || {};
|
|
3365
|
-
const validatedParams = validateDouyinParams(methodType, validationOptions);
|
|
3366
|
-
const apiParams = {
|
|
3367
|
-
...validatedParams
|
|
3368
|
-
};
|
|
3369
|
-
const rawData = await DouyinData(apiParams, cookie, config);
|
|
3370
|
-
if (rawData.data === "" || rawData.status_code !== 0) {
|
|
3371
|
-
return createErrorResponse(rawData.amagiError, rawData.status_msg || "\u6296\u97F3\u6570\u636E\u83B7\u53D6\u5931\u8D25");
|
|
3372
|
-
}
|
|
3373
|
-
return createSuccessResponse(rawData, "\u83B7\u53D6\u6210\u529F", 200);
|
|
3374
|
-
} catch (error) {
|
|
3375
|
-
const errorMessage = error instanceof Error ? error.message : "\u672A\u77E5\u9519\u8BEF";
|
|
3376
|
-
throw new Error(`\u6296\u97F3\u6570\u636E\u83B7\u53D6\u5931\u8D25: ${errorMessage}`);
|
|
3377
|
-
}
|
|
3378
|
-
}
|
|
3379
|
-
async function getBilibiliData(methodType, optionsOrCookie, cookieOrOptions, requestConfig) {
|
|
3380
|
-
try {
|
|
3381
|
-
let options;
|
|
3382
|
-
let cookie;
|
|
3383
|
-
if (typeof optionsOrCookie === "string") {
|
|
3384
|
-
cookie = optionsOrCookie;
|
|
3385
|
-
options = cookieOrOptions;
|
|
3386
|
-
} else {
|
|
3387
|
-
options = optionsOrCookie;
|
|
3388
|
-
cookie = cookieOrOptions;
|
|
3389
|
-
}
|
|
3390
|
-
const { typeMode: _, ...validationOptions } = options || {};
|
|
3391
|
-
const validatedParams = validateBilibiliParams(methodType, validationOptions);
|
|
3392
|
-
const apiParams = {
|
|
3393
|
-
...validatedParams
|
|
3394
|
-
};
|
|
3395
|
-
const rawData = await fetchBilibili(apiParams, cookie);
|
|
3396
|
-
if (rawData.code !== 0) {
|
|
3397
|
-
return createErrorResponse(rawData.amagiError, "B\u7AD9\u6570\u636E\u83B7\u53D6\u5931\u8D25");
|
|
3398
|
-
}
|
|
3399
|
-
return createSuccessResponse(rawData, "\u83B7\u53D6\u6210\u529F", 200);
|
|
3400
|
-
} catch (error) {
|
|
3401
|
-
const errorMessage = error instanceof Error ? error.message : "\u672A\u77E5\u9519\u8BEF";
|
|
3402
|
-
throw new Error(`B\u7AD9\u6570\u636E\u83B7\u53D6\u5931\u8D25: ${errorMessage}`);
|
|
3403
|
-
}
|
|
3404
|
-
}
|
|
3405
|
-
async function getKuaishouData(methodType, optionsOrCookie, cookieOrOptions, requestConfig) {
|
|
3406
|
-
try {
|
|
3407
|
-
let options;
|
|
3408
|
-
let cookie;
|
|
3409
|
-
if (typeof optionsOrCookie === "string") {
|
|
3410
|
-
cookie = optionsOrCookie;
|
|
3411
|
-
options = cookieOrOptions;
|
|
3412
|
-
} else {
|
|
3413
|
-
options = optionsOrCookie;
|
|
3414
|
-
cookie = cookieOrOptions;
|
|
3415
|
-
}
|
|
3416
|
-
const { typeMode: _, ...validationOptions } = options || {};
|
|
3417
|
-
const validatedParams = validateKuaishouParams(methodType, validationOptions);
|
|
3418
|
-
const apiParams = {
|
|
3419
|
-
...validatedParams
|
|
3420
|
-
};
|
|
3421
|
-
const rawData = await KuaishouData(apiParams, cookie);
|
|
3422
|
-
if (rawData.code && Object.values(kuaishouAPIErrorCode).includes(rawData.code)) {
|
|
3423
|
-
return createErrorResponse(rawData.amagiError, "\u5FEB\u624B\u6570\u636E\u83B7\u53D6\u5931\u8D25");
|
|
3424
|
-
}
|
|
3425
|
-
return createSuccessResponse(rawData, "\u83B7\u53D6\u6210\u529F", 200);
|
|
3426
|
-
} catch (error) {
|
|
3427
|
-
const errorMessage = error instanceof Error ? error.message : "\u672A\u77E5\u9519\u8BEF";
|
|
3428
|
-
throw new Error(`\u5FEB\u624B\u6570\u636E\u83B7\u53D6\u5931\u8D25: ${errorMessage}`);
|
|
3429
|
-
}
|
|
3430
|
-
}
|
|
3431
|
-
async function getXiaohongshuData(methodType, optionsOrCookie, cookieOrOptions, requestConfig) {
|
|
3432
|
-
try {
|
|
3433
|
-
let options;
|
|
3434
|
-
let cookie;
|
|
3435
|
-
if (typeof optionsOrCookie === "string") {
|
|
3436
|
-
cookie = optionsOrCookie;
|
|
3437
|
-
options = cookieOrOptions;
|
|
3438
|
-
} else {
|
|
3439
|
-
options = optionsOrCookie;
|
|
3440
|
-
cookie = cookieOrOptions;
|
|
3441
|
-
}
|
|
3442
|
-
const { typeMode: _, ...validationOptions } = options || {};
|
|
3443
|
-
const validatedParams = validateXiaohongshuParams(methodType, validationOptions);
|
|
3444
|
-
const apiParams = {
|
|
3445
|
-
...validatedParams
|
|
3446
|
-
};
|
|
3447
|
-
const rawData = await XiaohongshuData(apiParams, cookie);
|
|
3448
|
-
if (rawData.code && Object.values(xiaohongshuAPIErrorCode).includes(rawData.code)) {
|
|
3449
|
-
return createErrorResponse(rawData.amagiError, "\u5C0F\u7EA2\u4E66\u6570\u636E\u83B7\u53D6\u5931\u8D25");
|
|
3450
|
-
}
|
|
3451
|
-
return createSuccessResponse(rawData, "\u83B7\u53D6\u6210\u529F", 200);
|
|
3452
|
-
} catch (error) {
|
|
3453
|
-
const errorMessage = error instanceof Error ? error.message : "\u672A\u77E5\u9519\u8BEF";
|
|
3454
|
-
throw new Error(`\u5C0F\u7EA2\u4E66\u6570\u636E\u83B7\u53D6\u5931\u8D25: ${errorMessage}`);
|
|
3455
|
-
}
|
|
3456
|
-
}
|
|
3457
|
-
|
|
3458
|
-
// src/platform/bilibili/BilibiliApi.ts
|
|
3459
|
-
var createBilibiliApiMethod = (methodType) => {
|
|
3460
|
-
return async (options, cookie) => {
|
|
3461
|
-
return await getBilibiliData(methodType, options, cookie);
|
|
3462
|
-
};
|
|
3463
|
-
};
|
|
3464
|
-
var createBoundBilibiliApiMethod = (methodType, cookie) => {
|
|
3465
|
-
return async (options) => {
|
|
3466
|
-
return await getBilibiliData(methodType, options, cookie);
|
|
3467
|
-
};
|
|
3468
|
-
};
|
|
3469
|
-
var bilibili = {
|
|
3470
|
-
/**
|
|
3471
|
-
* 获取单个视频作品数据
|
|
3472
|
-
* @param options 请求参数,包含 bvid 和可选的 typeMode
|
|
3473
|
-
* @param cookie 有效的用户 Cookie
|
|
3474
|
-
* @returns 统一格式的API响应
|
|
3475
|
-
*/
|
|
3476
|
-
getVideoInfo: createBilibiliApiMethod("\u5355\u4E2A\u89C6\u9891\u4F5C\u54C1\u6570\u636E"),
|
|
3477
|
-
/**
|
|
3478
|
-
* 获取单个视频下载信息数据
|
|
3479
|
-
* @param options 请求参数,包含 avid, cid 和可选的 typeMode
|
|
3480
|
-
* @param cookie 有效的用户 Cookie
|
|
3481
|
-
* @returns 统一格式的API响应
|
|
3482
|
-
*/
|
|
3483
|
-
getVideoStream: createBilibiliApiMethod("\u5355\u4E2A\u89C6\u9891\u4E0B\u8F7D\u4FE1\u606F\u6570\u636E"),
|
|
3484
|
-
/**
|
|
3485
|
-
* 获取评论数据
|
|
3486
|
-
* @param options 请求参数,包含 type, oid, 可选的 number, pn 和 typeMode
|
|
3487
|
-
* @param cookie 有效的用户 Cookie
|
|
3488
|
-
* @returns 统一格式的API响应
|
|
3489
|
-
*/
|
|
3490
|
-
getComments: createBilibiliApiMethod("\u8BC4\u8BBA\u6570\u636E"),
|
|
3491
|
-
/**
|
|
3492
|
-
* 获取用户主页数据
|
|
3493
|
-
* @param options 请求参数,包含 host_mid 和可选的 typeMode
|
|
3494
|
-
* @param cookie 有效的用户 Cookie
|
|
3495
|
-
* @returns 统一格式的API响应
|
|
3496
|
-
*/
|
|
3497
|
-
getUserProfile: createBilibiliApiMethod("\u7528\u6237\u4E3B\u9875\u6570\u636E"),
|
|
3498
|
-
/**
|
|
3499
|
-
* 获取用户主页动态列表数据
|
|
3500
|
-
* @param options 请求参数,包含 host_mid 和可选的 typeMode
|
|
3501
|
-
* @param cookie 有效的用户 Cookie
|
|
3502
|
-
* @returns 统一格式的API响应
|
|
3503
|
-
*/
|
|
3504
|
-
getUserDynamic: createBilibiliApiMethod("\u7528\u6237\u4E3B\u9875\u52A8\u6001\u5217\u8868\u6570\u636E"),
|
|
3505
|
-
/**
|
|
3506
|
-
* 获取 Emoji 数据
|
|
3507
|
-
* @param options 可选的请求参数 (主要用于 typeMode)
|
|
3508
|
-
* @param cookie 有效的用户 Cookie
|
|
3509
|
-
* @returns 统一格式的API响应
|
|
3510
|
-
*/
|
|
3511
|
-
getEmojiList: createBilibiliApiMethod("Emoji\u6570\u636E"),
|
|
3512
|
-
/**
|
|
3513
|
-
* 获取番剧基本信息数据
|
|
3514
|
-
* @param options 请求参数,包含可选的 season_id, ep_id 和 typeMode
|
|
3515
|
-
* @param cookie 有效的用户 Cookie
|
|
3516
|
-
* @returns 统一格式的API响应
|
|
3517
|
-
*/
|
|
3518
|
-
getBangumiInfo: createBilibiliApiMethod("\u756A\u5267\u57FA\u672C\u4FE1\u606F\u6570\u636E"),
|
|
3519
|
-
/**
|
|
3520
|
-
* 获取番剧下载信息数据
|
|
3521
|
-
* @param options 请求参数,包含 cid, ep_id 和可选的 typeMode
|
|
3522
|
-
* @param cookie 有效的用户 Cookie
|
|
3523
|
-
* @returns 统一格式的API响应
|
|
3524
|
-
*/
|
|
3525
|
-
getBangumiStream: createBilibiliApiMethod("\u756A\u5267\u4E0B\u8F7D\u4FE1\u606F\u6570\u636E"),
|
|
3526
|
-
/**
|
|
3527
|
-
* 获取动态详情数据
|
|
3528
|
-
* @param options 请求参数,包含 dynamic_id 和可选的 typeMode
|
|
3529
|
-
* @param cookie 有效的用户 Cookie
|
|
3530
|
-
* @returns 统一格式的API响应
|
|
3531
|
-
*/
|
|
3532
|
-
getDynamicInfo: createBilibiliApiMethod("\u52A8\u6001\u8BE6\u60C5\u6570\u636E"),
|
|
3533
|
-
/**
|
|
3534
|
-
* 获取动态卡片数据
|
|
3535
|
-
* @param options 请求参数,包含 dynamic_id 和可选的 typeMode
|
|
3536
|
-
* @param cookie 有效的用户 Cookie
|
|
3537
|
-
* @returns 统一格式的API响应
|
|
3538
|
-
*/
|
|
3539
|
-
getDynamicCard: createBilibiliApiMethod("\u52A8\u6001\u5361\u7247\u6570\u636E"),
|
|
3540
|
-
/**
|
|
3541
|
-
* 获取直播间信息
|
|
3542
|
-
* @param options 请求参数,包含 room_id 和可选的 typeMode
|
|
3543
|
-
* @param cookie 有效的用户 Cookie
|
|
3544
|
-
* @returns 统一格式的API响应
|
|
3545
|
-
*/
|
|
3546
|
-
getLiveRoomDetail: createBilibiliApiMethod("\u76F4\u64AD\u95F4\u4FE1\u606F"),
|
|
3547
|
-
/**
|
|
3548
|
-
* 获取直播间初始化信息
|
|
3549
|
-
* @param options 请求参数,包含 room_id 和可选的 typeMode
|
|
3550
|
-
* @param cookie 有效的用户 Cookie
|
|
3551
|
-
* @returns 统一格式的API响应
|
|
3552
|
-
*/
|
|
3553
|
-
getLiveRoomInitInfo: createBilibiliApiMethod("\u76F4\u64AD\u95F4\u521D\u59CB\u5316\u4FE1\u606F"),
|
|
3554
|
-
/**
|
|
3555
|
-
* 获取登录基本信息
|
|
3556
|
-
* @param options 可选的请求参数 (主要用于 typeMode)
|
|
3557
|
-
* @param cookie 有效的用户 Cookie
|
|
3558
|
-
* @returns 统一格式的API响应
|
|
3559
|
-
*/
|
|
3560
|
-
getLoginBasicInfo: createBilibiliApiMethod("\u767B\u5F55\u57FA\u672C\u4FE1\u606F"),
|
|
3561
|
-
/**
|
|
3562
|
-
* 申请登录二维码
|
|
3563
|
-
* @param options 可选的请求参数 (主要用于 typeMode)
|
|
3564
|
-
* @param cookie 有效的用户 Cookie
|
|
3565
|
-
* @returns 统一格式的API响应
|
|
3566
|
-
*/
|
|
3567
|
-
getLoginQrcode: createBilibiliApiMethod("\u7533\u8BF7\u4E8C\u7EF4\u7801"),
|
|
3568
|
-
/**
|
|
3569
|
-
* 检查二维码状态
|
|
3570
|
-
* @param options 请求参数,包含 qrcode_key 和可选的 typeMode
|
|
3571
|
-
* @param cookie 有效的用户 Cookie
|
|
3572
|
-
* @returns 统一格式的API响应
|
|
3573
|
-
*/
|
|
3574
|
-
checkQrcodeStatus: createBilibiliApiMethod("\u4E8C\u7EF4\u7801\u72B6\u6001"),
|
|
3575
|
-
/**
|
|
3576
|
-
* 获取 UP 主总播放量
|
|
3577
|
-
* @param options 请求参数,包含 host_mid 和可选的 typeMode
|
|
3578
|
-
* @param cookie 有效的用户 Cookie
|
|
3579
|
-
* @returns 统一格式的API响应
|
|
3580
|
-
*/
|
|
3581
|
-
getUserTotalPlayCount: createBilibiliApiMethod("\u83B7\u53D6UP\u4E3B\u603B\u64AD\u653E\u91CF"),
|
|
3582
|
-
/**
|
|
3583
|
-
* 将 AV 号转换为 BV 号
|
|
3584
|
-
* @param options 请求参数,包含 avid 和可选的 typeMode
|
|
3585
|
-
* @param cookie 有效的用户 Cookie (此接口通常不需要)
|
|
3586
|
-
* @returns 统一格式的API响应
|
|
3587
|
-
*/
|
|
3588
|
-
convertAvToBv: createBilibiliApiMethod("AV\u8F6CBV"),
|
|
3589
|
-
/**
|
|
3590
|
-
* 将 BV 号转换为 AV 号
|
|
3591
|
-
* @param options 请求参数,包含 bvid 和可选的 typeMode
|
|
3592
|
-
* @param cookie 有效的用户 Cookie (此接口通常不需要)
|
|
3593
|
-
* @returns 统一格式的API响应
|
|
3594
|
-
*/
|
|
3595
|
-
convertBvToAv: createBilibiliApiMethod("BV\u8F6CAV")
|
|
3596
|
-
};
|
|
3597
|
-
var createBoundBilibiliApi = (cookie, requestConfig) => {
|
|
3598
|
-
return {
|
|
3599
|
-
/**
|
|
3600
|
-
* 获取单个视频作品数据
|
|
3601
|
-
* @param options 请求参数,包含 bvid 和可选的 typeMode
|
|
3602
|
-
* @returns 统一格式的API响应
|
|
3603
|
-
*/
|
|
3604
|
-
getVideoInfo: createBoundBilibiliApiMethod("\u5355\u4E2A\u89C6\u9891\u4F5C\u54C1\u6570\u636E", cookie),
|
|
3605
|
-
/**
|
|
3606
|
-
* 获取单个视频下载信息数据
|
|
3607
|
-
* @param options 请求参数,包含 avid, cid 和可选的 typeMode
|
|
3608
|
-
* @returns 统一格式的API响应
|
|
3609
|
-
*/
|
|
3610
|
-
getVideoStream: createBoundBilibiliApiMethod("\u5355\u4E2A\u89C6\u9891\u4E0B\u8F7D\u4FE1\u606F\u6570\u636E", cookie),
|
|
3611
|
-
/**
|
|
3612
|
-
* 获取评论数据
|
|
3613
|
-
* @param options 请求参数,包含 type, oid, 可选的 number, pn 和 typeMode
|
|
3614
|
-
* @returns 统一格式的API响应
|
|
3615
|
-
*/
|
|
3616
|
-
getComments: createBoundBilibiliApiMethod("\u8BC4\u8BBA\u6570\u636E", cookie),
|
|
3617
|
-
/**
|
|
3618
|
-
* 获取用户主页数据
|
|
3619
|
-
* @param options 请求参数,包含 host_mid 和可选的 typeMode
|
|
3620
|
-
* @returns 统一格式的API响应
|
|
3621
|
-
*/
|
|
3622
|
-
getUserProfile: createBoundBilibiliApiMethod("\u7528\u6237\u4E3B\u9875\u6570\u636E", cookie),
|
|
3623
|
-
/**
|
|
3624
|
-
* 获取用户主页动态列表数据
|
|
3625
|
-
* @param options 请求参数,包含 host_mid 和可选的 typeMode
|
|
3626
|
-
* @returns 统一格式的API响应
|
|
3627
|
-
*/
|
|
3628
|
-
getUserDynamic: createBoundBilibiliApiMethod("\u7528\u6237\u4E3B\u9875\u52A8\u6001\u5217\u8868\u6570\u636E", cookie),
|
|
3629
|
-
/**
|
|
3630
|
-
* 获取 Emoji 数据
|
|
3631
|
-
* @param options 可选的请求参数 (主要用于 typeMode)
|
|
3632
|
-
* @returns 统一格式的API响应
|
|
3633
|
-
*/
|
|
3634
|
-
getEmojiList: createBoundBilibiliApiMethod("Emoji\u6570\u636E", cookie),
|
|
3635
|
-
/**
|
|
3636
|
-
* 获取番剧基本信息数据
|
|
3637
|
-
* @param options 请求参数,包含可选的 season_id, ep_id 和 typeMode
|
|
3638
|
-
* @returns 统一格式的API响应
|
|
3639
|
-
*/
|
|
3640
|
-
getBangumiInfo: createBoundBilibiliApiMethod("\u756A\u5267\u57FA\u672C\u4FE1\u606F\u6570\u636E", cookie),
|
|
3641
|
-
/**
|
|
3642
|
-
* 获取番剧下载信息数据
|
|
3643
|
-
* @param options 请求参数,包含 cid, ep_id 和可选的 typeMode
|
|
3644
|
-
* @returns 统一格式的API响应
|
|
3645
|
-
*/
|
|
3646
|
-
getBangumiStream: createBoundBilibiliApiMethod("\u756A\u5267\u4E0B\u8F7D\u4FE1\u606F\u6570\u636E", cookie),
|
|
3647
|
-
/**
|
|
3648
|
-
* 获取动态详情数据
|
|
3649
|
-
* @param options 请求参数,包含 dynamic_id 和可选的 typeMode
|
|
3650
|
-
* @returns 统一格式的API响应
|
|
3651
|
-
*/
|
|
3652
|
-
getDynamicInfo: createBoundBilibiliApiMethod("\u52A8\u6001\u8BE6\u60C5\u6570\u636E", cookie),
|
|
3653
|
-
/**
|
|
3654
|
-
* 获取动态卡片数据
|
|
3655
|
-
* @param options 请求参数,包含 dynamic_id 和可选的 typeMode
|
|
3656
|
-
* @returns 统一格式的API响应
|
|
3657
|
-
*/
|
|
3658
|
-
getDynamicCard: createBoundBilibiliApiMethod("\u52A8\u6001\u5361\u7247\u6570\u636E", cookie),
|
|
3659
|
-
/**
|
|
3660
|
-
* 获取直播间信息
|
|
3661
|
-
* @param options 请求参数,包含 room_id 和可选的 typeMode
|
|
3662
|
-
* @returns 统一格式的API响应
|
|
3663
|
-
*/
|
|
3664
|
-
getLiveRoomDetail: createBoundBilibiliApiMethod("\u76F4\u64AD\u95F4\u4FE1\u606F", cookie),
|
|
3665
|
-
/**
|
|
3666
|
-
* 获取直播间初始化信息
|
|
3667
|
-
* @param options 请求参数,包含 room_id 和可选的 typeMode
|
|
3668
|
-
* @returns 统一格式的API响应
|
|
3669
|
-
*/
|
|
3670
|
-
getLiveRoomInitInfo: createBoundBilibiliApiMethod("\u76F4\u64AD\u95F4\u521D\u59CB\u5316\u4FE1\u606F", cookie),
|
|
3671
|
-
/**
|
|
3672
|
-
* 获取登录基本信息
|
|
3673
|
-
* @param options 可选的请求参数 (主要用于 typeMode)
|
|
3674
|
-
* @returns 统一格式的API响应
|
|
3675
|
-
*/
|
|
3676
|
-
getLoginBasicInfo: createBoundBilibiliApiMethod("\u767B\u5F55\u57FA\u672C\u4FE1\u606F", cookie),
|
|
3677
|
-
/**
|
|
3678
|
-
* 申请登录二维码
|
|
3679
|
-
* @param options 可选的请求参数 (主要用于 typeMode)
|
|
3680
|
-
* @returns 统一格式的API响应
|
|
3681
|
-
*/
|
|
3682
|
-
getLoginQrcode: createBoundBilibiliApiMethod("\u7533\u8BF7\u4E8C\u7EF4\u7801", cookie),
|
|
3683
|
-
/**
|
|
3684
|
-
* 检查二维码状态
|
|
3685
|
-
* @param options 请求参数,包含 qrcode_key 和可选的 typeMode
|
|
3686
|
-
* @returns 统一格式的API响应
|
|
3687
|
-
*/
|
|
3688
|
-
checkQrcodeStatus: createBoundBilibiliApiMethod("\u4E8C\u7EF4\u7801\u72B6\u6001", cookie),
|
|
3689
|
-
/**
|
|
3690
|
-
* 获取 UP 主总播放量
|
|
3691
|
-
* @param options 请求参数,包含 host_mid 和可选的 typeMode
|
|
3692
|
-
* @returns 统一格式的API响应
|
|
3693
|
-
*/
|
|
3694
|
-
getUserTotalPlayCount: createBoundBilibiliApiMethod("\u83B7\u53D6UP\u4E3B\u603B\u64AD\u653E\u91CF", cookie),
|
|
3695
|
-
/**
|
|
3696
|
-
* 将 AV 号转换为 BV 号
|
|
3697
|
-
* @param options 请求参数,包含 avid 和可选的 typeMode
|
|
3698
|
-
* @returns 统一格式的API响应
|
|
3699
|
-
*/
|
|
3700
|
-
convertAvToBv: createBoundBilibiliApiMethod("AV\u8F6CBV", cookie),
|
|
3701
|
-
/**
|
|
3702
|
-
* 将 BV 号转换为 AV 号
|
|
3703
|
-
* @param options 请求参数,包含 bvid 和可选的 typeMode
|
|
3704
|
-
* @returns 统一格式的API响应
|
|
3705
|
-
*/
|
|
3706
|
-
convertBvToAv: createBoundBilibiliApiMethod("BV\u8F6CAV", cookie)
|
|
3707
|
-
};
|
|
3708
|
-
};
|
|
3709
|
-
var ApiError = class extends Error {
|
|
3710
|
-
code;
|
|
3711
|
-
platform;
|
|
3712
|
-
/**
|
|
3713
|
-
* 构造API错误
|
|
3714
|
-
* @param message - 错误消息
|
|
3715
|
-
* @param code - 错误代码
|
|
3716
|
-
* @param platform - 平台名称
|
|
3717
|
-
*/
|
|
3718
|
-
constructor(message, code = 500, platform = "unknown") {
|
|
3719
|
-
super(message);
|
|
3720
|
-
this.name = "ApiError";
|
|
3721
|
-
this.code = code;
|
|
3722
|
-
this.platform = platform;
|
|
3723
|
-
}
|
|
3724
|
-
};
|
|
3725
|
-
var ValidationError = class _ValidationError extends Error {
|
|
3726
|
-
errors;
|
|
3727
|
-
requestPath;
|
|
3728
|
-
/**
|
|
3729
|
-
* 构造参数验证错误
|
|
3730
|
-
* @param message - 错误消息
|
|
3731
|
-
* @param errors - 详细错误信息
|
|
3732
|
-
* @param requestPath - HTTP请求路径
|
|
3733
|
-
*/
|
|
3734
|
-
constructor(message, errors, requestPath) {
|
|
3735
|
-
super(message);
|
|
3736
|
-
this.name = "ValidationError";
|
|
3737
|
-
this.errors = errors;
|
|
3738
|
-
this.requestPath = requestPath;
|
|
3739
|
-
}
|
|
3740
|
-
/**
|
|
3741
|
-
* 从Zod错误创建验证错误
|
|
3742
|
-
* @param zodError - Zod验证错误
|
|
3743
|
-
* @param requestPath - HTTP请求路径
|
|
3744
|
-
* @returns 验证错误实例
|
|
3745
|
-
*/
|
|
3746
|
-
static fromZodError(zodError, requestPath) {
|
|
3747
|
-
const errors = zodError.issues.map((err) => ({
|
|
3748
|
-
field: err.path.join("."),
|
|
3749
|
-
message: err.message
|
|
3750
|
-
}));
|
|
3751
|
-
return new _ValidationError("\u53C2\u6570\u9A8C\u8BC1\u5931\u8D25", errors, requestPath);
|
|
3752
|
-
}
|
|
3753
|
-
};
|
|
3754
|
-
var handleError = (error, requestPath) => {
|
|
3755
|
-
if (error instanceof ValidationError) {
|
|
3756
|
-
return {
|
|
3757
|
-
code: 400,
|
|
3758
|
-
message: error.message,
|
|
3759
|
-
data: null,
|
|
3760
|
-
errors: error.errors,
|
|
3761
|
-
requestPath: error.requestPath || requestPath
|
|
3762
|
-
};
|
|
3763
|
-
}
|
|
3764
|
-
if (error instanceof ApiError) {
|
|
3765
|
-
return {
|
|
3766
|
-
code: error.code,
|
|
3767
|
-
message: error.message,
|
|
3768
|
-
data: null,
|
|
3769
|
-
platform: error.platform,
|
|
3770
|
-
requestPath
|
|
3771
|
-
};
|
|
3772
|
-
}
|
|
3773
|
-
if (error instanceof zod.z.ZodError) {
|
|
3774
|
-
const validationError = ValidationError.fromZodError(error, requestPath);
|
|
3775
|
-
return handleError(validationError, requestPath);
|
|
3776
|
-
}
|
|
3777
|
-
const errorMessage = error instanceof Error ? error.message : "\u672A\u77E5\u9519\u8BEF";
|
|
3778
|
-
return {
|
|
3779
|
-
code: 500,
|
|
3780
|
-
message: errorMessage,
|
|
3781
|
-
data: null,
|
|
3782
|
-
requestPath
|
|
3783
|
-
};
|
|
3784
|
-
};
|
|
3785
|
-
|
|
3786
|
-
// src/middleware/validation.ts
|
|
3787
|
-
var createValidationMiddleware = (validateFn, methodType) => {
|
|
3788
|
-
return (req, res, next) => {
|
|
3789
|
-
try {
|
|
3790
|
-
const params = { ...req.query, ...req.body };
|
|
3791
|
-
const validatedParams = validateFn(methodType, params);
|
|
3792
|
-
req.validatedParams = validatedParams;
|
|
3793
|
-
next();
|
|
3794
|
-
} catch (error) {
|
|
3795
|
-
const errorResponse = handleError(error, req.originalUrl);
|
|
3796
|
-
res.status(errorResponse.code || 500).json(errorResponse);
|
|
3797
|
-
}
|
|
3798
|
-
};
|
|
3799
|
-
};
|
|
3800
|
-
var createDouyinValidationMiddleware = (methodType) => createValidationMiddleware(validateDouyinParams, methodType);
|
|
3801
|
-
var createBilibiliValidationMiddleware = (methodType) => createValidationMiddleware(validateBilibiliParams, methodType);
|
|
3802
|
-
var createKuaishouValidationMiddleware = (methodType) => createValidationMiddleware(validateKuaishouParams, methodType);
|
|
3803
|
-
var createXiaohongshuValidationMiddleware = (methodType) => createValidationMiddleware(validateXiaohongshuParams, methodType);
|
|
3804
|
-
var createBilibiliRouteHandler = (dataFetcher, methodType, cookie, requestConfig = getBilibiliDefaultConfig(cookie)) => {
|
|
3805
|
-
return async (req, res) => {
|
|
3806
|
-
try {
|
|
3807
|
-
const result = await dataFetcher(methodType, req.validatedParams, cookie, requestConfig);
|
|
3808
|
-
res.json({
|
|
3809
|
-
...result,
|
|
3810
|
-
requestPath: req.originalUrl
|
|
3811
|
-
});
|
|
3812
|
-
} catch (error) {
|
|
3813
|
-
const errorResponse = handleError(error);
|
|
3814
|
-
res.status(errorResponse.code || 500).json({
|
|
3815
|
-
...errorResponse,
|
|
3816
|
-
requestPath: req.originalUrl
|
|
3817
|
-
});
|
|
3818
|
-
}
|
|
3819
|
-
};
|
|
3820
|
-
};
|
|
3821
|
-
var createBilibiliRoutes = (cookie, requestConfig = getBilibiliDefaultConfig(cookie)) => {
|
|
3822
|
-
const router = express.Router();
|
|
3823
|
-
router.get(
|
|
3824
|
-
"/fetch_one_video",
|
|
3825
|
-
createBilibiliValidationMiddleware("\u5355\u4E2A\u89C6\u9891\u4F5C\u54C1\u6570\u636E"),
|
|
3826
|
-
createBilibiliRouteHandler(getBilibiliData, "\u5355\u4E2A\u89C6\u9891\u4F5C\u54C1\u6570\u636E", cookie, requestConfig)
|
|
3827
|
-
);
|
|
3828
|
-
router.get(
|
|
3829
|
-
"/fetch_video_playurl",
|
|
3830
|
-
createBilibiliValidationMiddleware("\u5355\u4E2A\u89C6\u9891\u4E0B\u8F7D\u4FE1\u606F\u6570\u636E"),
|
|
3831
|
-
createBilibiliRouteHandler(getBilibiliData, "\u5355\u4E2A\u89C6\u9891\u4E0B\u8F7D\u4FE1\u606F\u6570\u636E", cookie, requestConfig)
|
|
3832
|
-
);
|
|
3833
|
-
router.get(
|
|
3834
|
-
"/fetch_work_comments",
|
|
3835
|
-
createBilibiliValidationMiddleware("\u8BC4\u8BBA\u6570\u636E"),
|
|
3836
|
-
createBilibiliRouteHandler(getBilibiliData, "\u8BC4\u8BBA\u6570\u636E", cookie, requestConfig)
|
|
3837
|
-
);
|
|
3838
|
-
router.get(
|
|
3839
|
-
"/fetch_user_profile",
|
|
3840
|
-
createBilibiliValidationMiddleware("\u7528\u6237\u4E3B\u9875\u6570\u636E"),
|
|
3841
|
-
createBilibiliRouteHandler(getBilibiliData, "\u7528\u6237\u4E3B\u9875\u6570\u636E", cookie, requestConfig)
|
|
3842
|
-
);
|
|
3843
|
-
router.get(
|
|
3844
|
-
"/fetch_user_dynamic",
|
|
3845
|
-
createBilibiliValidationMiddleware("\u7528\u6237\u4E3B\u9875\u52A8\u6001\u5217\u8868\u6570\u636E"),
|
|
3846
|
-
createBilibiliRouteHandler(getBilibiliData, "\u7528\u6237\u4E3B\u9875\u52A8\u6001\u5217\u8868\u6570\u636E", cookie, requestConfig)
|
|
3847
|
-
);
|
|
3848
|
-
router.get(
|
|
3849
|
-
"/fetch_emoji_list",
|
|
3850
|
-
createBilibiliValidationMiddleware("Emoji\u6570\u636E"),
|
|
3851
|
-
createBilibiliRouteHandler(getBilibiliData, "Emoji\u6570\u636E", cookie, requestConfig)
|
|
3852
|
-
);
|
|
3853
|
-
router.get(
|
|
3854
|
-
"/fetch_bangumi_video_info",
|
|
3855
|
-
createBilibiliValidationMiddleware("\u756A\u5267\u57FA\u672C\u4FE1\u606F\u6570\u636E"),
|
|
3856
|
-
createBilibiliRouteHandler(getBilibiliData, "\u756A\u5267\u57FA\u672C\u4FE1\u606F\u6570\u636E", cookie, requestConfig)
|
|
3857
|
-
);
|
|
3858
|
-
router.get(
|
|
3859
|
-
"/fetch_bangumi_video_playurl",
|
|
3860
|
-
createBilibiliValidationMiddleware("\u756A\u5267\u4E0B\u8F7D\u4FE1\u606F\u6570\u636E"),
|
|
3861
|
-
createBilibiliRouteHandler(getBilibiliData, "\u756A\u5267\u4E0B\u8F7D\u4FE1\u606F\u6570\u636E", cookie, requestConfig)
|
|
3862
|
-
);
|
|
3863
|
-
router.get(
|
|
3864
|
-
"/fetch_dynamic_info",
|
|
3865
|
-
createBilibiliValidationMiddleware("\u52A8\u6001\u8BE6\u60C5\u6570\u636E"),
|
|
3866
|
-
createBilibiliRouteHandler(getBilibiliData, "\u52A8\u6001\u8BE6\u60C5\u6570\u636E", cookie, requestConfig)
|
|
3867
|
-
);
|
|
3868
|
-
router.get(
|
|
3869
|
-
"/fetch_dynamic_card",
|
|
3870
|
-
createBilibiliValidationMiddleware("\u52A8\u6001\u5361\u7247\u6570\u636E"),
|
|
3871
|
-
createBilibiliRouteHandler(getBilibiliData, "\u52A8\u6001\u5361\u7247\u6570\u636E", cookie, requestConfig)
|
|
3872
|
-
);
|
|
3873
|
-
router.get(
|
|
3874
|
-
"/fetch_live_room_detail",
|
|
3875
|
-
createBilibiliValidationMiddleware("\u76F4\u64AD\u95F4\u4FE1\u606F"),
|
|
3876
|
-
createBilibiliRouteHandler(getBilibiliData, "\u76F4\u64AD\u95F4\u4FE1\u606F", cookie, requestConfig)
|
|
3877
|
-
);
|
|
3878
|
-
router.get(
|
|
3879
|
-
"/fetch_liveroom_def",
|
|
3880
|
-
createBilibiliValidationMiddleware("\u76F4\u64AD\u95F4\u521D\u59CB\u5316\u4FE1\u606F"),
|
|
3881
|
-
createBilibiliRouteHandler(getBilibiliData, "\u76F4\u64AD\u95F4\u521D\u59CB\u5316\u4FE1\u606F", cookie, requestConfig)
|
|
3882
|
-
);
|
|
3883
|
-
router.get(
|
|
3884
|
-
"/login_basic_info",
|
|
3885
|
-
createBilibiliValidationMiddleware("\u767B\u5F55\u57FA\u672C\u4FE1\u606F"),
|
|
3886
|
-
createBilibiliRouteHandler(getBilibiliData, "\u767B\u5F55\u57FA\u672C\u4FE1\u606F", cookie, requestConfig)
|
|
3887
|
-
);
|
|
3888
|
-
router.get(
|
|
3889
|
-
"/new_login_qrcode",
|
|
3890
|
-
createBilibiliValidationMiddleware("\u7533\u8BF7\u4E8C\u7EF4\u7801"),
|
|
3891
|
-
createBilibiliRouteHandler(getBilibiliData, "\u7533\u8BF7\u4E8C\u7EF4\u7801", cookie, requestConfig)
|
|
3892
|
-
);
|
|
3893
|
-
router.get(
|
|
3894
|
-
"/check_qrcode",
|
|
3895
|
-
createBilibiliValidationMiddleware("\u4E8C\u7EF4\u7801\u72B6\u6001"),
|
|
3896
|
-
createBilibiliRouteHandler(getBilibiliData, "\u4E8C\u7EF4\u7801\u72B6\u6001", cookie, requestConfig)
|
|
3897
|
-
);
|
|
3898
|
-
router.get(
|
|
3899
|
-
"/fetch_user_full_view",
|
|
3900
|
-
createBilibiliValidationMiddleware("\u83B7\u53D6UP\u4E3B\u603B\u64AD\u653E\u91CF"),
|
|
3901
|
-
createBilibiliRouteHandler(getBilibiliData, "\u83B7\u53D6UP\u4E3B\u603B\u64AD\u653E\u91CF", cookie, requestConfig)
|
|
3902
|
-
);
|
|
3903
|
-
router.get(
|
|
3904
|
-
"/av_to_bv",
|
|
3905
|
-
createBilibiliValidationMiddleware("AV\u8F6CBV"),
|
|
3906
|
-
createBilibiliRouteHandler(getBilibiliData, "AV\u8F6CBV", cookie, requestConfig)
|
|
3907
|
-
);
|
|
3908
|
-
router.get(
|
|
3909
|
-
"/bv_to_av",
|
|
3910
|
-
createBilibiliValidationMiddleware("BV\u8F6CAV"),
|
|
3911
|
-
createBilibiliRouteHandler(getBilibiliData, "BV\u8F6CAV", cookie, requestConfig)
|
|
3912
|
-
);
|
|
3913
|
-
return router;
|
|
3914
|
-
};
|
|
3915
|
-
|
|
3916
|
-
// src/platform/bilibili/index.ts
|
|
3917
|
-
var bilibiliUtils = {
|
|
3918
|
-
sign: {
|
|
3919
|
-
wbi_sign,
|
|
3920
|
-
av2bv,
|
|
3921
|
-
bv2av
|
|
3922
|
-
},
|
|
3923
|
-
bilibiliApiUrls,
|
|
3924
|
-
api: bilibili
|
|
3925
|
-
};
|
|
3926
|
-
|
|
3927
|
-
// src/platform/douyin/DouyinApi.ts
|
|
3928
|
-
var createDouyinApiMethod = (methodType) => {
|
|
3929
|
-
return async (options, cookie, requestConfig) => {
|
|
3930
|
-
return await getDouyinData(methodType, options, cookie, requestConfig);
|
|
3931
|
-
};
|
|
3932
|
-
};
|
|
3933
|
-
var createBoundDouyinApiMethod = (methodType, cookie, requestConfig) => {
|
|
3934
|
-
return async (options) => {
|
|
3935
|
-
return await getDouyinData(methodType, options, cookie, requestConfig);
|
|
3936
|
-
};
|
|
3937
|
-
};
|
|
3938
|
-
var douyin = {
|
|
3939
|
-
/**
|
|
3940
|
-
* 获取文字作品数据
|
|
3941
|
-
* @param options 请求参数,包含 aweme_id 和可选的 typeMode
|
|
3942
|
-
* @param cookie 有效的用户 Cookie
|
|
3943
|
-
* @returns 统一格式的API响应,包含文字作品详细信息
|
|
3944
|
-
*/
|
|
3945
|
-
getTextWorkInfo: createDouyinApiMethod("\u6587\u5B57\u4F5C\u54C1\u6570\u636E"),
|
|
3946
|
-
/**
|
|
3947
|
-
* 聚合解析 (视频/图集/合辑)
|
|
3948
|
-
* @param options 请求参数,包含 aweme_id 和可选的 typeMode
|
|
3949
|
-
* @param cookie 有效的用户 Cookie
|
|
3950
|
-
* @returns 统一格式的API响应,包含视频、图集或合辑数据
|
|
3951
|
-
*/
|
|
3952
|
-
getWorkInfo: createDouyinApiMethod("\u805A\u5408\u89E3\u6790"),
|
|
3953
|
-
/**
|
|
3954
|
-
* 获取视频作品数据
|
|
3955
|
-
* @param options 请求参数,包含 aweme_id 和可选的 typeMode
|
|
3956
|
-
* @param cookie 有效的用户 Cookie
|
|
3957
|
-
* @returns 统一格式的API响应,包含视频作品详细信息
|
|
3958
|
-
*/
|
|
3959
|
-
getVideoWorkInfo: createDouyinApiMethod("\u89C6\u9891\u4F5C\u54C1\u6570\u636E"),
|
|
3960
|
-
/**
|
|
3961
|
-
* 获取图集作品数据
|
|
3962
|
-
* @param options 请求参数,包含 aweme_id 和可选的 typeMode
|
|
3963
|
-
* @param cookie 有效的用户 Cookie
|
|
3964
|
-
* @returns 统一格式的API响应,包含图集作品详细信息
|
|
3965
|
-
*/
|
|
3966
|
-
getImageAlbumWorkInfo: createDouyinApiMethod("\u56FE\u96C6\u4F5C\u54C1\u6570\u636E"),
|
|
3967
|
-
/**
|
|
3968
|
-
* 获取合辑作品数据
|
|
3969
|
-
* @param options 请求参数,包含 aweme_id 和可选的 typeMode
|
|
3970
|
-
* @param cookie 有效的用户 Cookie
|
|
3971
|
-
* @returns 统一格式的API响应,包含合辑作品详细信息
|
|
3972
|
-
*/
|
|
3973
|
-
getSlidesWorkInfo: createDouyinApiMethod("\u5408\u8F91\u4F5C\u54C1\u6570\u636E"),
|
|
3974
|
-
/**
|
|
3975
|
-
* 获取评论数据
|
|
3976
|
-
* @param options 请求参数,包含 aweme_id, 可选的 number, cursor 和 typeMode
|
|
3977
|
-
* @param cookie 有效的用户 Cookie
|
|
3978
|
-
* @returns 统一格式的API响应,包含评论列表数据
|
|
3979
|
-
*/
|
|
3980
|
-
getComments: createDouyinApiMethod("\u8BC4\u8BBA\u6570\u636E"),
|
|
3981
|
-
/**
|
|
3982
|
-
* 获取指定评论回复数据
|
|
3983
|
-
* @param options 请求参数,包含 aweme_id, comment_id, 可选的 number, cursor 和 typeMode
|
|
3984
|
-
* @param cookie 有效的用户 Cookie
|
|
3985
|
-
* @returns 统一格式的API响应,包含评论回复数据
|
|
3986
|
-
*/
|
|
3987
|
-
getCommentReplies: createDouyinApiMethod("\u6307\u5B9A\u8BC4\u8BBA\u56DE\u590D\u6570\u636E"),
|
|
3988
|
-
/**
|
|
3989
|
-
* 获取用户主页数据
|
|
3990
|
-
* @param options 请求参数,包含 sec_uid 和可选的 typeMode
|
|
3991
|
-
* @param cookie 有效的用户 Cookie
|
|
3992
|
-
* @returns 统一格式的API响应,包含用户详细信息
|
|
3993
|
-
*/
|
|
3994
|
-
getUserProfile: createDouyinApiMethod("\u7528\u6237\u4E3B\u9875\u6570\u636E"),
|
|
3995
|
-
/**
|
|
3996
|
-
* 获取 Emoji 数据
|
|
3997
|
-
* @param options 可选的请求参数 (主要用于 typeMode)
|
|
3998
|
-
* @param cookie 可选的用户 Cookie
|
|
3999
|
-
* @returns 统一格式的API响应,包含Emoji列表数据
|
|
4000
|
-
*/
|
|
4001
|
-
getEmojiList: createDouyinApiMethod("Emoji\u6570\u636E"),
|
|
4002
|
-
/**
|
|
4003
|
-
* 获取动态表情数据
|
|
4004
|
-
* @param options 可选的请求参数 (主要用于 typeMode)
|
|
4005
|
-
* @param cookie 有效的用户 Cookie
|
|
4006
|
-
* @returns 统一格式的API响应,包含动态表情数据
|
|
4007
|
-
*/
|
|
4008
|
-
getEmojiProList: createDouyinApiMethod("\u52A8\u6001\u8868\u60C5\u6570\u636E"),
|
|
4009
|
-
/**
|
|
4010
|
-
* 获取用户主页视频列表数据
|
|
4011
|
-
* @param options 请求参数,包含 sec_uid, 可选的 number, max_cursor 和 typeMode
|
|
4012
|
-
* @param cookie 有效的用户 Cookie
|
|
4013
|
-
* @returns 统一格式的API响应,包含用户发布的视频列表
|
|
4014
|
-
*/
|
|
4015
|
-
getUserVideos: createDouyinApiMethod("\u7528\u6237\u4E3B\u9875\u89C6\u9891\u5217\u8868\u6570\u636E"),
|
|
4016
|
-
/**
|
|
4017
|
-
* 获取音乐数据
|
|
4018
|
-
* @param options 请求参数,包含 music_id 和可选的 typeMode
|
|
4019
|
-
* @param cookie 有效的用户 Cookie
|
|
4020
|
-
* @returns 统一格式的API响应,包含音乐详细信息
|
|
4021
|
-
*/
|
|
4022
|
-
getMusicInfo: createDouyinApiMethod("\u97F3\u4E50\u6570\u636E"),
|
|
4023
|
-
/**
|
|
4024
|
-
* 获取热点词数据
|
|
4025
|
-
* @param options 请求参数,包含 query, 可选的 number 和 typeMode
|
|
4026
|
-
* @param cookie 有效的用户 Cookie
|
|
4027
|
-
* @returns 统一格式的API响应,包含热点搜索词列表
|
|
4028
|
-
*/
|
|
4029
|
-
getSuggestWords: createDouyinApiMethod("\u70ED\u70B9\u8BCD\u6570\u636E"),
|
|
4030
|
-
/**
|
|
4031
|
-
* 获取搜索数据
|
|
4032
|
-
* @param options 请求参数,包含 query, 可选的 number, search_id, cursor 和 typeMode
|
|
4033
|
-
* @param cookie 有效的用户 Cookie
|
|
4034
|
-
* @returns 统一格式的API响应,包含搜索结果数据
|
|
4035
|
-
*/
|
|
4036
|
-
search: createDouyinApiMethod("\u641C\u7D22\u6570\u636E"),
|
|
4037
|
-
/**
|
|
4038
|
-
* 获取直播间信息
|
|
4039
|
-
* @param options 请求参数,包含 sec_uid 和可选的 typeMode
|
|
4040
|
-
* @param cookie 有效的用户 Cookie
|
|
4041
|
-
* @returns 统一格式的API响应,包含直播间详细信息
|
|
4042
|
-
*/
|
|
4043
|
-
getLiveRoomInfo: createDouyinApiMethod("\u76F4\u64AD\u95F4\u4FE1\u606F\u6570\u636E"),
|
|
4044
|
-
/**
|
|
4045
|
-
* 获取弹幕数据
|
|
4046
|
-
* @param options 请求参数,包含 aweme_id, 可选的 start_time, end_time, duration 和 typeMode
|
|
4047
|
-
* @returns 统一格式的API响应,包含弹幕数据
|
|
4048
|
-
*/
|
|
4049
|
-
getDanmaku: createDouyinApiMethod("\u5F39\u5E55\u6570\u636E")
|
|
4050
|
-
};
|
|
4051
|
-
var createBoundDouyinApi = (cookie, requestConfig) => {
|
|
4052
|
-
return {
|
|
4053
|
-
/**
|
|
4054
|
-
* 获取文字作品数据
|
|
4055
|
-
* @param options 请求参数,包含 aweme_id 和可选的 typeMode
|
|
4056
|
-
* @returns 统一格式的API响应,包含文字作品详细信息
|
|
4057
|
-
*/
|
|
4058
|
-
getTextWorkInfo: createBoundDouyinApiMethod("\u6587\u5B57\u4F5C\u54C1\u6570\u636E", cookie, requestConfig),
|
|
4059
|
-
/**
|
|
4060
|
-
* 聚合解析 (视频/图集/合辑)
|
|
4061
|
-
* @param options 请求参数,包含 aweme_id 和可选的 typeMode
|
|
4062
|
-
* @returns 统一格式的API响应,包含视频、图集或合辑数据
|
|
4063
|
-
*/
|
|
4064
|
-
getWorkInfo: createBoundDouyinApiMethod("\u805A\u5408\u89E3\u6790", cookie, requestConfig),
|
|
4065
|
-
/**
|
|
4066
|
-
* 获取视频作品数据
|
|
4067
|
-
* @param options 请求参数,包含 aweme_id 和可选的 typeMode
|
|
4068
|
-
* @returns 统一格式的API响应,包含视频作品详细信息
|
|
4069
|
-
*/
|
|
4070
|
-
getVideoWorkInfo: createBoundDouyinApiMethod("\u89C6\u9891\u4F5C\u54C1\u6570\u636E", cookie, requestConfig),
|
|
4071
|
-
/**
|
|
4072
|
-
* 获取图集作品数据
|
|
4073
|
-
* @param options 请求参数,包含 aweme_id 和可选的 typeMode
|
|
4074
|
-
* @returns 统一格式的API响应,包含图集作品详细信息
|
|
4075
|
-
*/
|
|
4076
|
-
getImageAlbumWorkInfo: createBoundDouyinApiMethod("\u56FE\u96C6\u4F5C\u54C1\u6570\u636E", cookie, requestConfig),
|
|
4077
|
-
/**
|
|
4078
|
-
* 获取合辑作品数据
|
|
4079
|
-
* @param options 请求参数,包含 aweme_id 和可选的 typeMode
|
|
4080
|
-
* @returns 统一格式的API响应,包含合辑作品详细信息
|
|
4081
|
-
*/
|
|
4082
|
-
getSlidesWorkInfo: createBoundDouyinApiMethod("\u5408\u8F91\u4F5C\u54C1\u6570\u636E", cookie, requestConfig),
|
|
4083
|
-
/**
|
|
4084
|
-
* 获取评论数据
|
|
4085
|
-
* @param options 请求参数,包含 aweme_id, 可选的 number, cursor 和 typeMode
|
|
4086
|
-
* @returns 统一格式的API响应,包含评论列表数据
|
|
4087
|
-
*/
|
|
4088
|
-
getComments: createBoundDouyinApiMethod("\u8BC4\u8BBA\u6570\u636E", cookie, requestConfig),
|
|
4089
|
-
/**
|
|
4090
|
-
* 获取指定评论回复数据
|
|
4091
|
-
* @param options 请求参数,包含 aweme_id, comment_id, 可选的 number, cursor 和 typeMode
|
|
4092
|
-
* @returns 统一格式的API响应,包含评论回复数据
|
|
4093
|
-
*/
|
|
4094
|
-
getCommentReplies: createBoundDouyinApiMethod("\u6307\u5B9A\u8BC4\u8BBA\u56DE\u590D\u6570\u636E", cookie, requestConfig),
|
|
4095
|
-
/**
|
|
4096
|
-
* 获取用户主页数据
|
|
4097
|
-
* @param options 请求参数,包含 sec_uid 和可选的 typeMode
|
|
4098
|
-
* @returns 统一格式的API响应,包含用户详细信息
|
|
4099
|
-
*/
|
|
4100
|
-
getUserProfile: createBoundDouyinApiMethod("\u7528\u6237\u4E3B\u9875\u6570\u636E", cookie, requestConfig),
|
|
4101
|
-
/**
|
|
4102
|
-
* 获取 Emoji 数据
|
|
4103
|
-
* @param options 可选的请求参数 (主要用于 typeMode)
|
|
4104
|
-
* @returns 统一格式的API响应,包含Emoji列表数据
|
|
4105
|
-
*/
|
|
4106
|
-
getEmojiList: createBoundDouyinApiMethod("Emoji\u6570\u636E", cookie, requestConfig),
|
|
4107
|
-
/**
|
|
4108
|
-
* 获取动态表情数据
|
|
4109
|
-
* @param options 可选的请求参数 (主要用于 typeMode)
|
|
4110
|
-
* @returns 统一格式的API响应,包含动态表情数据
|
|
4111
|
-
*/
|
|
4112
|
-
getEmojiProList: createBoundDouyinApiMethod("\u52A8\u6001\u8868\u60C5\u6570\u636E", cookie, requestConfig),
|
|
4113
|
-
/**
|
|
4114
|
-
* 获取用户主页视频列表数据
|
|
4115
|
-
* @param options 请求参数,包含 sec_uid, 可选的 number, max_cursor 和 typeMode
|
|
4116
|
-
* @returns 统一格式的API响应,包含用户发布的视频列表
|
|
4117
|
-
*/
|
|
4118
|
-
getUserVideos: createBoundDouyinApiMethod("\u7528\u6237\u4E3B\u9875\u89C6\u9891\u5217\u8868\u6570\u636E", cookie, requestConfig),
|
|
4119
|
-
/**
|
|
4120
|
-
* 获取音乐数据
|
|
4121
|
-
* @param options 请求参数,包含 music_id 和可选的 typeMode
|
|
4122
|
-
* @returns 统一格式的API响应,包含音乐详细信息
|
|
4123
|
-
*/
|
|
4124
|
-
getMusicInfo: createBoundDouyinApiMethod("\u97F3\u4E50\u6570\u636E", cookie, requestConfig),
|
|
4125
|
-
/**
|
|
4126
|
-
* 获取热点词数据
|
|
4127
|
-
* @param options 请求参数,包含 query, 可选的 number 和 typeMode
|
|
4128
|
-
* @returns 统一格式的API响应,包含热点搜索词列表
|
|
4129
|
-
*/
|
|
4130
|
-
getSuggestWords: createBoundDouyinApiMethod("\u70ED\u70B9\u8BCD\u6570\u636E", cookie, requestConfig),
|
|
4131
|
-
/**
|
|
4132
|
-
* 获取搜索数据
|
|
4133
|
-
* @param options 请求参数,包含 query, 可选的 number, search_id, cursor 和 typeMode
|
|
4134
|
-
* @returns 统一格式的API响应,包含搜索结果数据
|
|
4135
|
-
*/
|
|
4136
|
-
search: createBoundDouyinApiMethod("\u641C\u7D22\u6570\u636E", cookie, requestConfig),
|
|
4137
|
-
/**
|
|
4138
|
-
* 获取直播间信息
|
|
4139
|
-
* @param options 请求参数,包含 sec_uid 和可选的 typeMode
|
|
4140
|
-
* @returns 统一格式的API响应,包含直播间详细信息
|
|
4141
|
-
*/
|
|
4142
|
-
getLiveRoomInfo: createBoundDouyinApiMethod("\u76F4\u64AD\u95F4\u4FE1\u606F\u6570\u636E", cookie, requestConfig),
|
|
4143
|
-
/**
|
|
4144
|
-
* 获取弹幕数据
|
|
4145
|
-
* @param options 请求参数,包含 aweme_id, 可选的 start_time, end_time, duration 和 typeMode
|
|
4146
|
-
* @returns 统一格式的API响应,包含弹幕数据
|
|
4147
|
-
*/
|
|
4148
|
-
getDanmaku: createBoundDouyinApiMethod("\u5F39\u5E55\u6570\u636E", cookie, requestConfig)
|
|
4149
|
-
};
|
|
4150
|
-
};
|
|
4151
|
-
var createDouyinRouteHandler = (dataFetcher, methodType, cookie, requestConfig = getDouyinDefaultConfig(cookie)) => {
|
|
4152
|
-
return async (req, res) => {
|
|
4153
|
-
try {
|
|
4154
|
-
const result = await dataFetcher(methodType, req.validatedParams, cookie, requestConfig);
|
|
4155
|
-
res.json({
|
|
4156
|
-
...result,
|
|
4157
|
-
requestPath: req.originalUrl
|
|
4158
|
-
});
|
|
4159
|
-
} catch (error) {
|
|
4160
|
-
const errorResponse = handleError(error);
|
|
4161
|
-
res.status(errorResponse.code || 500).json({
|
|
4162
|
-
...errorResponse,
|
|
4163
|
-
requestPath: req.originalUrl
|
|
4164
|
-
});
|
|
4165
|
-
}
|
|
4166
|
-
};
|
|
4167
|
-
};
|
|
4168
|
-
var createDouyinRoutes = (cookie, requestConfig = getDouyinDefaultConfig(cookie)) => {
|
|
4169
|
-
const router = express.Router();
|
|
4170
|
-
router.get(
|
|
4171
|
-
"/fetch_one_work",
|
|
4172
|
-
createDouyinValidationMiddleware("\u805A\u5408\u89E3\u6790"),
|
|
4173
|
-
createDouyinRouteHandler(getDouyinData, "\u805A\u5408\u89E3\u6790", cookie, requestConfig)
|
|
4174
|
-
);
|
|
4175
|
-
router.get(
|
|
4176
|
-
"/fetch_one_work",
|
|
4177
|
-
createDouyinValidationMiddleware("\u89C6\u9891\u4F5C\u54C1\u6570\u636E"),
|
|
4178
|
-
createDouyinRouteHandler(getDouyinData, "\u89C6\u9891\u4F5C\u54C1\u6570\u636E", cookie, requestConfig)
|
|
4179
|
-
);
|
|
4180
|
-
router.get(
|
|
4181
|
-
"/fetch_one_work",
|
|
4182
|
-
createDouyinValidationMiddleware("\u56FE\u96C6\u4F5C\u54C1\u6570\u636E"),
|
|
4183
|
-
createDouyinRouteHandler(getDouyinData, "\u56FE\u96C6\u4F5C\u54C1\u6570\u636E", cookie, requestConfig)
|
|
4184
|
-
);
|
|
4185
|
-
router.get(
|
|
4186
|
-
"/fetch_one_work",
|
|
4187
|
-
createDouyinValidationMiddleware("\u5408\u8F91\u4F5C\u54C1\u6570\u636E"),
|
|
4188
|
-
createDouyinRouteHandler(getDouyinData, "\u5408\u8F91\u4F5C\u54C1\u6570\u636E", cookie, requestConfig)
|
|
4189
|
-
);
|
|
4190
|
-
router.get(
|
|
4191
|
-
"/fetch_work_comments",
|
|
4192
|
-
createDouyinValidationMiddleware("\u8BC4\u8BBA\u6570\u636E"),
|
|
4193
|
-
createDouyinRouteHandler(getDouyinData, "\u8BC4\u8BBA\u6570\u636E", cookie, requestConfig)
|
|
4194
|
-
);
|
|
4195
|
-
router.get(
|
|
4196
|
-
"/fetch_user_info",
|
|
4197
|
-
createDouyinValidationMiddleware("\u7528\u6237\u4E3B\u9875\u6570\u636E"),
|
|
4198
|
-
createDouyinRouteHandler(getDouyinData, "\u7528\u6237\u4E3B\u9875\u6570\u636E", cookie, requestConfig)
|
|
4199
|
-
);
|
|
4200
|
-
router.get(
|
|
4201
|
-
"/fetch_user_post_videos",
|
|
4202
|
-
createDouyinValidationMiddleware("\u7528\u6237\u4E3B\u9875\u89C6\u9891\u5217\u8868\u6570\u636E"),
|
|
4203
|
-
createDouyinRouteHandler(getDouyinData, "\u7528\u6237\u4E3B\u9875\u89C6\u9891\u5217\u8868\u6570\u636E", cookie, requestConfig)
|
|
4204
|
-
);
|
|
4205
|
-
router.get(
|
|
4206
|
-
"/fetch_search_info",
|
|
4207
|
-
createDouyinValidationMiddleware("\u641C\u7D22\u6570\u636E"),
|
|
4208
|
-
createDouyinRouteHandler(getDouyinData, "\u641C\u7D22\u6570\u636E", cookie, requestConfig)
|
|
4209
|
-
);
|
|
4210
|
-
router.get(
|
|
4211
|
-
"/fetch_suggest_words",
|
|
4212
|
-
createDouyinValidationMiddleware("\u70ED\u70B9\u8BCD\u6570\u636E"),
|
|
4213
|
-
createDouyinRouteHandler(getDouyinData, "\u70ED\u70B9\u8BCD\u6570\u636E", cookie, requestConfig)
|
|
4214
|
-
);
|
|
4215
|
-
router.get(
|
|
4216
|
-
"/fetch_music_work",
|
|
4217
|
-
createDouyinValidationMiddleware("\u97F3\u4E50\u6570\u636E"),
|
|
4218
|
-
createDouyinRouteHandler(getDouyinData, "\u97F3\u4E50\u6570\u636E", cookie, requestConfig)
|
|
4219
|
-
);
|
|
4220
|
-
router.get(
|
|
4221
|
-
"/fetch_emoji_list",
|
|
4222
|
-
createDouyinValidationMiddleware("Emoji\u6570\u636E"),
|
|
4223
|
-
createDouyinRouteHandler(getDouyinData, "Emoji\u6570\u636E", cookie, requestConfig)
|
|
4224
|
-
);
|
|
4225
|
-
router.get(
|
|
4226
|
-
"/fetch_emoji_pro_list",
|
|
4227
|
-
createDouyinValidationMiddleware("\u52A8\u6001\u8868\u60C5\u6570\u636E"),
|
|
4228
|
-
createDouyinRouteHandler(getDouyinData, "\u52A8\u6001\u8868\u60C5\u6570\u636E", cookie, requestConfig)
|
|
4229
|
-
);
|
|
4230
|
-
router.get(
|
|
4231
|
-
"/fetch_user_live_videos",
|
|
4232
|
-
createDouyinValidationMiddleware("\u76F4\u64AD\u95F4\u4FE1\u606F\u6570\u636E"),
|
|
4233
|
-
createDouyinRouteHandler(getDouyinData, "\u76F4\u64AD\u95F4\u4FE1\u606F\u6570\u636E", cookie, requestConfig)
|
|
4234
|
-
);
|
|
4235
|
-
router.get(
|
|
4236
|
-
"/fetch_video_comment_replies",
|
|
4237
|
-
createDouyinValidationMiddleware("\u6307\u5B9A\u8BC4\u8BBA\u56DE\u590D\u6570\u636E"),
|
|
4238
|
-
createDouyinRouteHandler(getDouyinData, "\u6307\u5B9A\u8BC4\u8BBA\u56DE\u590D\u6570\u636E", cookie, requestConfig)
|
|
4239
|
-
);
|
|
4240
|
-
router.get(
|
|
4241
|
-
"/fetch_work_danmaku",
|
|
4242
|
-
createDouyinValidationMiddleware("\u5F39\u5E55\u6570\u636E"),
|
|
4243
|
-
createDouyinRouteHandler(getDouyinData, "\u5F39\u5E55\u6570\u636E", cookie, requestConfig)
|
|
4244
|
-
);
|
|
4245
|
-
return router;
|
|
4246
|
-
};
|
|
4247
|
-
|
|
4248
|
-
// src/platform/douyin/index.ts
|
|
4249
|
-
var douyinUtils = {
|
|
4250
|
-
sign: douyinSign,
|
|
4251
|
-
douyinApiUrls,
|
|
4252
|
-
api: douyin
|
|
4253
|
-
};
|
|
4254
|
-
var createKuaishouRouteHandler = (dataFetcher, methodType, cookie, requestConfig = getKuaishouDefaultConfig(cookie)) => {
|
|
4255
|
-
return async (req, res) => {
|
|
4256
|
-
try {
|
|
4257
|
-
const result = await dataFetcher(methodType, req.validatedParams, cookie, requestConfig);
|
|
4258
|
-
res.json({
|
|
4259
|
-
...result,
|
|
4260
|
-
requestPath: req.originalUrl
|
|
4261
|
-
});
|
|
4262
|
-
} catch (error) {
|
|
4263
|
-
const errorResponse = handleError(error);
|
|
4264
|
-
res.status(errorResponse.code || 500).json({
|
|
4265
|
-
...errorResponse,
|
|
4266
|
-
requestPath: req.originalUrl
|
|
4267
|
-
});
|
|
4268
|
-
}
|
|
4269
|
-
};
|
|
4270
|
-
};
|
|
4271
|
-
var createKuaishouRoutes = (cookie, requestConfig = getKuaishouDefaultConfig(cookie)) => {
|
|
4272
|
-
const router = express.Router();
|
|
4273
|
-
router.get(
|
|
4274
|
-
"/fetch_one_work",
|
|
4275
|
-
createKuaishouValidationMiddleware("\u5355\u4E2A\u89C6\u9891\u4F5C\u54C1\u6570\u636E"),
|
|
4276
|
-
createKuaishouRouteHandler(getKuaishouData, "\u5355\u4E2A\u89C6\u9891\u4F5C\u54C1\u6570\u636E", cookie, requestConfig)
|
|
4277
|
-
);
|
|
4278
|
-
router.get(
|
|
4279
|
-
"/fetch_work_comments",
|
|
4280
|
-
createKuaishouValidationMiddleware("\u8BC4\u8BBA\u6570\u636E"),
|
|
4281
|
-
createKuaishouRouteHandler(getKuaishouData, "\u8BC4\u8BBA\u6570\u636E", cookie, requestConfig)
|
|
4282
|
-
);
|
|
4283
|
-
router.get(
|
|
4284
|
-
"/fetch_emoji_list",
|
|
4285
|
-
createKuaishouValidationMiddleware("Emoji\u6570\u636E"),
|
|
4286
|
-
createKuaishouRouteHandler(getKuaishouData, "Emoji\u6570\u636E", cookie, requestConfig)
|
|
4287
|
-
);
|
|
4288
|
-
return router;
|
|
4289
|
-
};
|
|
4290
|
-
|
|
4291
|
-
// src/platform/kuaishou/KuaishouApi.ts
|
|
4292
|
-
var createKuaishouApiMethod = (methodType) => {
|
|
4293
|
-
return async (options, cookie) => {
|
|
4294
|
-
return await getKuaishouData(methodType, options, cookie);
|
|
4295
|
-
};
|
|
4296
|
-
};
|
|
4297
|
-
var createBoundKuaishouApiMethod = (methodType, cookie) => {
|
|
4298
|
-
return async (options) => {
|
|
4299
|
-
return await getKuaishouData(methodType, options, cookie);
|
|
4300
|
-
};
|
|
4301
|
-
};
|
|
4302
|
-
var kuaishou = {
|
|
4303
|
-
/**
|
|
4304
|
-
* 获取单个视频作品数据
|
|
4305
|
-
* @param options 请求参数,包含 photoId 和可选的 typeMode
|
|
4306
|
-
* @param cookie 可选的用户 Cookie
|
|
4307
|
-
* @returns 统一格式的API响应
|
|
4308
|
-
*/
|
|
4309
|
-
getWorkInfo: createKuaishouApiMethod("\u5355\u4E2A\u89C6\u9891\u4F5C\u54C1\u6570\u636E"),
|
|
4310
|
-
/**
|
|
4311
|
-
* 获取评论数据
|
|
4312
|
-
* @param options 请求参数,包含 photoId 和可选的 typeMode
|
|
4313
|
-
* @param cookie 可选的用户 Cookie
|
|
4314
|
-
* @returns 统一格式的API响应
|
|
4315
|
-
*/
|
|
4316
|
-
getComments: createKuaishouApiMethod("\u8BC4\u8BBA\u6570\u636E"),
|
|
4317
|
-
/**
|
|
4318
|
-
* 获取 Emoji 数据
|
|
4319
|
-
* @param options 可选的请求参数 (主要用于 typeMode)
|
|
4320
|
-
* @param cookie 可选的用户 Cookie
|
|
4321
|
-
* @returns 统一格式的API响应
|
|
4322
|
-
*/
|
|
4323
|
-
getEmojiList: createKuaishouApiMethod("Emoji\u6570\u636E")
|
|
4324
|
-
};
|
|
4325
|
-
var createBoundKuaishouApi = (cookie, requestConfig) => {
|
|
4326
|
-
return {
|
|
4327
|
-
/**
|
|
4328
|
-
* 获取单个视频作品数据
|
|
4329
|
-
* @param options 请求参数,包含 photoId 和可选的 typeMode
|
|
4330
|
-
* @returns 统一格式的API响应
|
|
4331
|
-
*/
|
|
4332
|
-
getWorkInfo: createBoundKuaishouApiMethod("\u5355\u4E2A\u89C6\u9891\u4F5C\u54C1\u6570\u636E", cookie),
|
|
4333
|
-
/**
|
|
4334
|
-
* 获取评论数据
|
|
4335
|
-
* @param options 请求参数,包含 photoId 和可选的 typeMode
|
|
4336
|
-
* @returns 统一格式的API响应
|
|
4337
|
-
*/
|
|
4338
|
-
getComments: createBoundKuaishouApiMethod("\u8BC4\u8BBA\u6570\u636E", cookie),
|
|
4339
|
-
/**
|
|
4340
|
-
* 获取 Emoji 数据
|
|
4341
|
-
* @param options 可选的请求参数 (主要用于 typeMode)
|
|
4342
|
-
* @returns 统一格式的API响应
|
|
4343
|
-
*/
|
|
4344
|
-
getEmojiList: createBoundKuaishouApiMethod("Emoji\u6570\u636E", cookie)
|
|
4345
|
-
};
|
|
4346
|
-
};
|
|
4347
|
-
|
|
4348
|
-
// src/platform/kuaishou/index.ts
|
|
4349
|
-
var kuaishouUtils = {
|
|
4350
|
-
kuaishouApiUrls,
|
|
4351
|
-
api: kuaishou
|
|
4352
|
-
};
|
|
4353
|
-
|
|
4354
|
-
// src/platform/xiaohongshu/XiaohongshuApi.ts
|
|
4355
|
-
var createXiaohongshuApiMethod = (methodType) => {
|
|
4356
|
-
return async (options, cookie, requestConfig) => {
|
|
4357
|
-
return await getXiaohongshuData(methodType, options, cookie);
|
|
4358
|
-
};
|
|
4359
|
-
};
|
|
4360
|
-
var createBoundXiaohongshuApiMethod = (methodType, cookie, requestConfig) => {
|
|
4361
|
-
return async (options) => {
|
|
4362
|
-
return await getXiaohongshuData(methodType, options, cookie);
|
|
4363
|
-
};
|
|
4364
|
-
};
|
|
4365
|
-
var xiaohongshu = {
|
|
4366
|
-
/**
|
|
4367
|
-
* 获取首页推荐数据
|
|
4368
|
-
* @param options 请求参数,包含分页和过滤选项
|
|
4369
|
-
* @param cookie 有效的用户 Cookie
|
|
4370
|
-
* @returns 统一格式的API响应,包含首页推荐笔记列表
|
|
4371
|
-
*/
|
|
4372
|
-
getHomeFeed: createXiaohongshuApiMethod("\u9996\u9875\u63A8\u8350\u6570\u636E"),
|
|
4373
|
-
/**
|
|
4374
|
-
* 获取单个笔记数据
|
|
4375
|
-
* @param options 请求参数,包含笔记ID
|
|
4376
|
-
* @param cookie 有效的用户 Cookie
|
|
4377
|
-
* @returns 统一格式的API响应,包含指定笔记的详细信息
|
|
4378
|
-
*/
|
|
4379
|
-
getNote: createXiaohongshuApiMethod("\u5355\u4E2A\u7B14\u8BB0\u6570\u636E"),
|
|
4380
|
-
/**
|
|
4381
|
-
* 获取评论数据
|
|
4382
|
-
* @param options 请求参数,包含笔记ID和分页选项
|
|
4383
|
-
* @param cookie 有效的用户 Cookie
|
|
4384
|
-
* @returns 统一格式的API响应,包含指定笔记的评论列表
|
|
4385
|
-
*/
|
|
4386
|
-
getComments: createXiaohongshuApiMethod("\u8BC4\u8BBA\u6570\u636E"),
|
|
4387
|
-
/**
|
|
4388
|
-
* 获取用户数据
|
|
4389
|
-
* @param options 请求参数,包含用户ID
|
|
4390
|
-
* @param cookie 有效的用户 Cookie
|
|
4391
|
-
* @returns 统一格式的API响应,包含指定用户的详细信息
|
|
4392
|
-
*/
|
|
4393
|
-
getUser: createXiaohongshuApiMethod("\u7528\u6237\u6570\u636E"),
|
|
4394
|
-
/**
|
|
4395
|
-
* 获取用户笔记数据
|
|
4396
|
-
* @param options 请求参数,包含用户ID和分页选项
|
|
4397
|
-
* @param cookie 有效的用户 Cookie
|
|
4398
|
-
* @returns 统一格式的API响应,包含指定用户的笔记列表
|
|
4399
|
-
*/
|
|
4400
|
-
getUserNotes: createXiaohongshuApiMethod("\u7528\u6237\u7B14\u8BB0\u6570\u636E"),
|
|
4401
|
-
/**
|
|
4402
|
-
* 获取搜索笔记数据
|
|
4403
|
-
* @param options 请求参数,包含搜索关键词和分页选项
|
|
4404
|
-
* @param cookie 有效的用户 Cookie
|
|
4405
|
-
* @returns 统一格式的API响应,包含搜索到的笔记列表
|
|
4406
|
-
*/
|
|
4407
|
-
getSearchNotes: createXiaohongshuApiMethod("\u641C\u7D22\u7B14\u8BB0"),
|
|
4408
|
-
/**
|
|
4409
|
-
* 获取表情列表数据
|
|
4410
|
-
* @param options 请求参数,包含分页和过滤选项
|
|
4411
|
-
* @param cookie 有效的用户 Cookie
|
|
4412
|
-
* @returns 统一格式的API响应,包含表情列表
|
|
4413
|
-
*/
|
|
4414
|
-
getEmojiList: createXiaohongshuApiMethod("\u8868\u60C5\u5217\u8868")
|
|
4415
|
-
};
|
|
4416
|
-
var createBoundXiaohongshuApi = (cookie, requestConfig) => {
|
|
4417
|
-
return {
|
|
4418
|
-
/**
|
|
4419
|
-
* 获取首页推荐数据
|
|
4420
|
-
* @param options 请求参数,包含分页和过滤选项
|
|
4421
|
-
* @returns 统一格式的API响应,包含首页推荐笔记列表
|
|
4422
|
-
*/
|
|
4423
|
-
getHomeFeed: createBoundXiaohongshuApiMethod("\u9996\u9875\u63A8\u8350\u6570\u636E", cookie),
|
|
4424
|
-
/**
|
|
4425
|
-
* 获取单个笔记数据
|
|
4426
|
-
* @param options 请求参数,包含笔记ID
|
|
4427
|
-
* @returns 统一格式的API响应,包含指定笔记的详细信息
|
|
4428
|
-
*/
|
|
4429
|
-
getNote: createBoundXiaohongshuApiMethod("\u5355\u4E2A\u7B14\u8BB0\u6570\u636E", cookie),
|
|
4430
|
-
/**
|
|
4431
|
-
* 获取评论数据
|
|
4432
|
-
* @param options 请求参数,包含笔记ID和分页选项
|
|
4433
|
-
* @returns 统一格式的API响应,包含指定笔记的评论列表
|
|
4434
|
-
*/
|
|
4435
|
-
getComments: createBoundXiaohongshuApiMethod("\u8BC4\u8BBA\u6570\u636E", cookie),
|
|
4436
|
-
/**
|
|
4437
|
-
* 获取用户数据
|
|
4438
|
-
* @param options 请求参数,包含用户ID
|
|
4439
|
-
* @returns 统一格式的API响应,包含指定用户的详细信息
|
|
4440
|
-
*/
|
|
4441
|
-
getUser: createBoundXiaohongshuApiMethod("\u7528\u6237\u6570\u636E", cookie),
|
|
4442
|
-
/**
|
|
4443
|
-
* 获取用户笔记数据
|
|
4444
|
-
* @param options 请求参数,包含用户ID和分页选项
|
|
4445
|
-
* @returns 统一格式的API响应,包含指定用户的笔记列表
|
|
4446
|
-
*/
|
|
4447
|
-
getUserNotes: createBoundXiaohongshuApiMethod("\u7528\u6237\u7B14\u8BB0\u6570\u636E", cookie),
|
|
4448
|
-
/**
|
|
4449
|
-
* 获取搜索笔记数据
|
|
4450
|
-
* @param options 请求参数,包含搜索关键词和分页选项
|
|
4451
|
-
* @returns 统一格式的API响应,包含搜索到的笔记列表
|
|
4452
|
-
*/
|
|
4453
|
-
getSearchNotes: createBoundXiaohongshuApiMethod("\u641C\u7D22\u7B14\u8BB0", cookie),
|
|
4454
|
-
/**
|
|
4455
|
-
* 获取表情列表数据
|
|
4456
|
-
* @param options 请求参数,包含分页和过滤选项
|
|
4457
|
-
* @returns 统一格式的API响应,包含表情列表
|
|
4458
|
-
*/
|
|
4459
|
-
getEmojiList: createBoundXiaohongshuApiMethod("\u8868\u60C5\u5217\u8868", cookie)
|
|
4460
|
-
};
|
|
4461
|
-
};
|
|
4462
|
-
var createXiaohongshuRouteHandler = (dataFetcher, methodType, cookie, requestConfig = getXiaohongshuDefaultConfig(cookie)) => {
|
|
4463
|
-
return async (req, res) => {
|
|
4464
|
-
try {
|
|
4465
|
-
const result = await dataFetcher(methodType, req.validatedParams, cookie, requestConfig);
|
|
4466
|
-
res.json({
|
|
4467
|
-
...result,
|
|
4468
|
-
requestPath: req.originalUrl
|
|
4469
|
-
});
|
|
4470
|
-
} catch (error) {
|
|
4471
|
-
const errorResponse = handleError(error);
|
|
4472
|
-
res.status(errorResponse.code || 500).json({
|
|
4473
|
-
...errorResponse,
|
|
4474
|
-
requestPath: req.originalUrl
|
|
4475
|
-
});
|
|
4476
|
-
}
|
|
4477
|
-
};
|
|
4478
|
-
};
|
|
4479
|
-
var createXiaohongshuRoutes = (cookie, requestConfig = getXiaohongshuDefaultConfig(cookie)) => {
|
|
4480
|
-
const router = express.Router();
|
|
4481
|
-
router.get(
|
|
4482
|
-
"/fetch_home_feed",
|
|
4483
|
-
createXiaohongshuValidationMiddleware("\u9996\u9875\u63A8\u8350\u6570\u636E"),
|
|
4484
|
-
createXiaohongshuRouteHandler(getXiaohongshuData, "\u9996\u9875\u63A8\u8350\u6570\u636E", cookie, requestConfig)
|
|
4485
|
-
);
|
|
4486
|
-
router.get(
|
|
4487
|
-
"/fetch_one_note",
|
|
4488
|
-
createXiaohongshuValidationMiddleware("\u5355\u4E2A\u7B14\u8BB0\u6570\u636E"),
|
|
4489
|
-
createXiaohongshuRouteHandler(getXiaohongshuData, "\u5355\u4E2A\u7B14\u8BB0\u6570\u636E", cookie, requestConfig)
|
|
4490
|
-
);
|
|
4491
|
-
router.get(
|
|
4492
|
-
"/fetch_note_comments",
|
|
4493
|
-
createXiaohongshuValidationMiddleware("\u8BC4\u8BBA\u6570\u636E"),
|
|
4494
|
-
createXiaohongshuRouteHandler(getXiaohongshuData, "\u8BC4\u8BBA\u6570\u636E", cookie, requestConfig)
|
|
4495
|
-
);
|
|
4496
|
-
router.get(
|
|
4497
|
-
"/fetch_user_profile",
|
|
4498
|
-
createXiaohongshuValidationMiddleware("\u7528\u6237\u6570\u636E"),
|
|
4499
|
-
createXiaohongshuRouteHandler(getXiaohongshuData, "\u7528\u6237\u6570\u636E", cookie, requestConfig)
|
|
4500
|
-
);
|
|
4501
|
-
router.get(
|
|
4502
|
-
"/fetch_user_notes",
|
|
4503
|
-
createXiaohongshuValidationMiddleware("\u7528\u6237\u7B14\u8BB0\u6570\u636E"),
|
|
4504
|
-
createXiaohongshuRouteHandler(getXiaohongshuData, "\u7528\u6237\u7B14\u8BB0\u6570\u636E", cookie, requestConfig)
|
|
4505
|
-
);
|
|
4506
|
-
router.get(
|
|
4507
|
-
"/fetch_emoji_list",
|
|
4508
|
-
createXiaohongshuValidationMiddleware("\u8868\u60C5\u5217\u8868"),
|
|
4509
|
-
createXiaohongshuRouteHandler(getXiaohongshuData, "\u8868\u60C5\u5217\u8868", cookie, requestConfig)
|
|
4510
|
-
);
|
|
4511
|
-
router.get(
|
|
4512
|
-
"/fetch_search_notes",
|
|
4513
|
-
createXiaohongshuValidationMiddleware("\u641C\u7D22\u7B14\u8BB0"),
|
|
4514
|
-
createXiaohongshuRouteHandler(getXiaohongshuData, "\u641C\u7D22\u7B14\u8BB0", cookie, requestConfig)
|
|
4515
|
-
);
|
|
4516
|
-
return router;
|
|
4517
|
-
};
|
|
4518
|
-
|
|
4519
|
-
// src/platform/xiaohongshu/index.ts
|
|
4520
|
-
var xiaohongshuUtils = {
|
|
4521
|
-
sign: xiaohongshuSign,
|
|
4522
|
-
xiaohongshuApiUrls,
|
|
4523
|
-
api: xiaohongshu
|
|
4524
|
-
};
|
|
4525
|
-
var createAmagiClient = (options) => {
|
|
4526
|
-
var _a, _b, _c, _d;
|
|
4527
|
-
const douyinCookie = ((_a = options == null ? void 0 : options.cookies) == null ? void 0 : _a.douyin) ?? "";
|
|
4528
|
-
const bilibiliCookie = ((_b = options == null ? void 0 : options.cookies) == null ? void 0 : _b.bilibili) ?? "";
|
|
4529
|
-
const kuaishouCookie = ((_c = options == null ? void 0 : options.cookies) == null ? void 0 : _c.kuaishou) ?? "";
|
|
4530
|
-
const xiaohongshuCookie = ((_d = options == null ? void 0 : options.cookies) == null ? void 0 : _d.xiaohongshu) ?? "";
|
|
4531
|
-
const requestConfig = (options == null ? void 0 : options.request) ?? {};
|
|
4532
|
-
const startServer = (port = 4567) => {
|
|
4533
|
-
const app = express__default.default();
|
|
4534
|
-
app.use(express__default.default.json());
|
|
4535
|
-
app.use(express__default.default.urlencoded({ extended: true }));
|
|
4536
|
-
app.get("/", (_req, res) => {
|
|
4537
|
-
res.redirect(301, "https://amagi.apifox.cn");
|
|
4538
|
-
});
|
|
4539
|
-
app.get("/docs", (_req, res) => {
|
|
4540
|
-
res.redirect(301, "https://amagi.apifox.cn");
|
|
4541
|
-
});
|
|
4542
|
-
app.use("/api/douyin", createDouyinRoutes(douyinCookie, requestConfig));
|
|
4543
|
-
app.use("/api/bilibili", createBilibiliRoutes(bilibiliCookie, requestConfig));
|
|
4544
|
-
app.use("/api/kuaishou", createKuaishouRoutes(kuaishouCookie, requestConfig));
|
|
4545
|
-
app.use("/api/xiaohongshu", createXiaohongshuRoutes(xiaohongshuCookie, requestConfig));
|
|
4546
|
-
app.listen(port, "::", () => {
|
|
4547
|
-
logger.mark(`Amagi server listening on ${logger.green(`http://localhost:${port}`)} ${logger.yellow("API docs: https://amagi.apifox.cn ")}`);
|
|
4548
|
-
});
|
|
4549
|
-
return app;
|
|
4550
|
-
};
|
|
4551
|
-
const getDouyinDataWithCookie = async (methodType, options2) => {
|
|
4552
|
-
return await getDouyinData(methodType, options2, douyinCookie, requestConfig);
|
|
4553
|
-
};
|
|
4554
|
-
const getBilibiliDataWithCookie = async (methodType, options2) => {
|
|
4555
|
-
return await getBilibiliData(methodType, options2, bilibiliCookie);
|
|
4556
|
-
};
|
|
4557
|
-
const getKuaishouDataWithCookie = async (methodType, options2) => {
|
|
4558
|
-
return await getKuaishouData(methodType, options2, kuaishouCookie);
|
|
4559
|
-
};
|
|
4560
|
-
const getXiaohongshuDataWithCookie = async (methodType, options2) => {
|
|
4561
|
-
return await getXiaohongshuData(methodType, options2, xiaohongshuCookie);
|
|
4562
|
-
};
|
|
4563
|
-
return {
|
|
4564
|
-
/** 启动本地HTTP服务 */
|
|
4565
|
-
startServer,
|
|
4566
|
-
getDouyinData: getDouyinDataWithCookie,
|
|
4567
|
-
getBilibiliData: getBilibiliDataWithCookie,
|
|
4568
|
-
getKuaishouData: getKuaishouDataWithCookie,
|
|
4569
|
-
getXiaohongshuData: getXiaohongshuDataWithCookie,
|
|
4570
|
-
douyin: {
|
|
4571
|
-
...douyinUtils,
|
|
4572
|
-
/** 绑定了cookie和请求配置的抖音API对象,调用时不需要传递cookie */
|
|
4573
|
-
api: createBoundDouyinApi(douyinCookie, requestConfig)
|
|
4574
|
-
},
|
|
4575
|
-
bilibili: {
|
|
4576
|
-
...bilibiliUtils,
|
|
4577
|
-
/** 绑定了cookie和请求配置的B站API对象,调用时不需要传递cookie */
|
|
4578
|
-
api: createBoundBilibiliApi(bilibiliCookie)
|
|
4579
|
-
},
|
|
4580
|
-
kuaishou: {
|
|
4581
|
-
...kuaishouUtils,
|
|
4582
|
-
/** 绑定了cookie和请求配置的快手API对象,调用时不需要传递cookie */
|
|
4583
|
-
api: createBoundKuaishouApi(kuaishouCookie)
|
|
4584
|
-
},
|
|
4585
|
-
xiaohongshu: {
|
|
4586
|
-
...xiaohongshuUtils,
|
|
4587
|
-
/** 绑定了cookie和请求配置的小红书API对象,调用时不需要传递cookie */
|
|
4588
|
-
api: createBoundXiaohongshuApi(xiaohongshuCookie)
|
|
4589
|
-
}
|
|
4590
|
-
};
|
|
4591
|
-
};
|
|
4592
|
-
|
|
4593
|
-
// src/types/ReturnDataType/Bilibili/DynamicInfo.ts
|
|
4594
|
-
var DynamicType = /* @__PURE__ */ ((DynamicType2) => {
|
|
4595
|
-
DynamicType2["AV"] = "DYNAMIC_TYPE_AV";
|
|
4596
|
-
DynamicType2["DRAW"] = "DYNAMIC_TYPE_DRAW";
|
|
4597
|
-
DynamicType2["WORD"] = "DYNAMIC_TYPE_WORD";
|
|
4598
|
-
DynamicType2["LIVE_RCMD"] = "DYNAMIC_TYPE_LIVE_RCMD";
|
|
4599
|
-
DynamicType2["FORWARD"] = "DYNAMIC_TYPE_FORWARD";
|
|
4600
|
-
return DynamicType2;
|
|
4601
|
-
})(DynamicType || {});
|
|
4602
|
-
|
|
4603
|
-
// src/types/ReturnDataType/Bilibili/Dynamic/index.ts
|
|
4604
|
-
var MajorType = /* @__PURE__ */ ((MajorType2) => {
|
|
4605
|
-
MajorType2["NONE"] = "MAJOR_TYPE_NONE";
|
|
4606
|
-
MajorType2["OPUS"] = "MAJOR_TYPE_OPUS";
|
|
4607
|
-
MajorType2["ARCHIVE"] = "MAJOR_TYPE_ARCHIVE";
|
|
4608
|
-
MajorType2["PGC"] = "MAJOR_TYPE_PGC";
|
|
4609
|
-
MajorType2["COURSES"] = "MAJOR_TYPE_COURSES";
|
|
4610
|
-
MajorType2["DRAW"] = "MAJOR_TYPE_DRAW";
|
|
4611
|
-
MajorType2["ARTICLE"] = "MAJOR_TYPE_ARTICLE";
|
|
4612
|
-
MajorType2["MUSIC"] = "MAJOR_TYPE_MUSIC";
|
|
4613
|
-
MajorType2["COMMON"] = "MAJOR_TYPE_COMMON";
|
|
4614
|
-
MajorType2["LIVE"] = "MAJOR_TYPE_LIVE";
|
|
4615
|
-
MajorType2["MEDIALIST"] = "MAJOR_TYPE_MEDIALIST";
|
|
4616
|
-
MajorType2["APPLET"] = "MAJOR_TYPE_APPLET";
|
|
4617
|
-
MajorType2["SUBSCRIPTION"] = "MAJOR_TYPE_SUBSCRIPTION";
|
|
4618
|
-
MajorType2["LIVE_RCMD"] = "MAJOR_TYPE_LIVE_RCMD";
|
|
4619
|
-
MajorType2["UGC_SEASON"] = "MAJOR_TYPE_UGC_SEASON";
|
|
4620
|
-
MajorType2["SUBSCRIPTION_NEW"] = "MAJOR_TYPE_SUBSCRIPTION_NEW";
|
|
4621
|
-
MajorType2["UPOWER_COMMON"] = "MAJOR_TYPE_UPOWER_COMMON";
|
|
4622
|
-
return MajorType2;
|
|
4623
|
-
})(MajorType || {});
|
|
4624
|
-
var AdditionalType = /* @__PURE__ */ ((AdditionalType2) => {
|
|
4625
|
-
AdditionalType2["NONE"] = "ADDITIONAL_TYPE_NONE";
|
|
4626
|
-
AdditionalType2["PGC"] = "ADDITIONAL_TYPE_PGC";
|
|
4627
|
-
AdditionalType2["GOODS"] = "ADDITIONAL_TYPE_GOODS";
|
|
4628
|
-
AdditionalType2["VOTE"] = "ADDITIONAL_TYPE_VOTE";
|
|
4629
|
-
AdditionalType2["COMMON"] = "ADDITIONAL_TYPE_COMMON";
|
|
4630
|
-
AdditionalType2["MATCH"] = "ADDITIONAL_TYPE_MATCH";
|
|
4631
|
-
AdditionalType2["UP_RCMD"] = "ADDITIONAL_TYPE_UP_RCMD";
|
|
4632
|
-
AdditionalType2["UGC"] = "ADDITIONAL_TYPE_UGC";
|
|
4633
|
-
AdditionalType2["RESERVE"] = "ADDITIONAL_TYPE_RESERVE";
|
|
4634
|
-
AdditionalType2["UPOWER_LOTTERY"] = "ADDITIONAL_TYPE_UPOWER_LOTTERY";
|
|
4635
|
-
return AdditionalType2;
|
|
4636
|
-
})(AdditionalType || {});
|
|
4637
|
-
|
|
4638
|
-
// src/index.ts
|
|
4639
|
-
var amagiClient = createAmagiClient;
|
|
4640
|
-
function CreateAmagiApp(options = {}) {
|
|
4641
|
-
if (!(this instanceof CreateAmagiApp)) {
|
|
4642
|
-
return createAmagiClient(options);
|
|
4643
|
-
}
|
|
4644
|
-
return createAmagiClient(options);
|
|
4645
|
-
}
|
|
4646
|
-
CreateAmagiApp.douyin = douyinUtils;
|
|
4647
|
-
CreateAmagiApp.bilibili = bilibiliUtils;
|
|
4648
|
-
CreateAmagiApp.kuaishou = kuaishouUtils;
|
|
4649
|
-
CreateAmagiApp.xiaohongshu = xiaohongshuUtils;
|
|
4650
|
-
CreateAmagiApp.getDouyinData = getDouyinData;
|
|
4651
|
-
CreateAmagiApp.getBilibiliData = getBilibiliData;
|
|
4652
|
-
CreateAmagiApp.getKuaishouData = getKuaishouData;
|
|
4653
|
-
CreateAmagiApp.getXiaohongshuData = getXiaohongshuData;
|
|
4654
|
-
var CreateApp = CreateAmagiApp;
|
|
4655
|
-
var Client = CreateApp;
|
|
4656
|
-
var amagi = Client;
|
|
4657
|
-
/*!
|
|
4658
|
-
* @ikenxuan/amagi
|
|
4659
|
-
* Copyright(c) 2023 ikenxuan
|
|
4660
|
-
* GPL-3.0 Licensed
|
|
4661
|
-
*/
|
|
4662
|
-
|
|
4663
|
-
exports.AdditionalType = AdditionalType;
|
|
4664
|
-
exports.ApiError = ApiError;
|
|
4665
|
-
exports.BilibiliAv2BvParamsSchema = BilibiliAv2BvParamsSchema;
|
|
4666
|
-
exports.BilibiliBangumiInfoParamsSchema = BilibiliBangumiInfoParamsSchema;
|
|
4667
|
-
exports.BilibiliBangumiStreamParamsSchema = BilibiliBangumiStreamParamsSchema;
|
|
4668
|
-
exports.BilibiliBv2AvParamsSchema = BilibiliBv2AvParamsSchema;
|
|
4669
|
-
exports.BilibiliCommentParamsSchema = BilibiliCommentParamsSchema;
|
|
4670
|
-
exports.BilibiliDynamicParamsSchema = BilibiliDynamicParamsSchema;
|
|
4671
|
-
exports.BilibiliEmojiParamsSchema = BilibiliEmojiParamsSchema;
|
|
4672
|
-
exports.BilibiliLiveParamsSchema = BilibiliLiveParamsSchema;
|
|
4673
|
-
exports.BilibiliLoginParamsSchema = BilibiliLoginParamsSchema;
|
|
4674
|
-
exports.BilibiliQrcodeParamsSchema = BilibiliQrcodeParamsSchema;
|
|
4675
|
-
exports.BilibiliQrcodeStatusParamsSchema = BilibiliQrcodeStatusParamsSchema;
|
|
4676
|
-
exports.BilibiliUserParamsSchema = BilibiliUserParamsSchema;
|
|
4677
|
-
exports.BilibiliValidationSchemas = BilibiliValidationSchemas2;
|
|
4678
|
-
exports.BilibiliVideoDownloadParamsSchema = BilibiliVideoDownloadParamsSchema;
|
|
4679
|
-
exports.BilibiliVideoParamsSchema = BilibiliVideoParamsSchema;
|
|
4680
|
-
exports.CreateApp = CreateApp;
|
|
4681
|
-
exports.DouyinCommentParamsSchema = DouyinCommentParamsSchema;
|
|
4682
|
-
exports.DouyinCommentReplyParamsSchema = DouyinCommentReplyParamsSchema;
|
|
4683
|
-
exports.DouyinDanmakuParamsSchema = DouyinDanmakuParamsSchema;
|
|
4684
|
-
exports.DouyinEmojiListParamsSchema = DouyinEmojiListParamsSchema;
|
|
4685
|
-
exports.DouyinEmojiProParamsSchema = DouyinEmojiProParamsSchema;
|
|
4686
|
-
exports.DouyinMusicParamsSchema = DouyinMusicParamsSchema;
|
|
4687
|
-
exports.DouyinQrcodeParamsSchema = DouyinQrcodeParamsSchema;
|
|
4688
|
-
exports.DouyinSearchParamsSchema = DouyinSearchParamsSchema;
|
|
4689
|
-
exports.DouyinUserParamsSchema = DouyinUserParamsSchema;
|
|
4690
|
-
exports.DouyinValidationSchemas = DouyinValidationSchemas2;
|
|
4691
|
-
exports.DouyinWorkParamsSchema = DouyinWorkParamsSchema;
|
|
4692
|
-
exports.DynamicType = DynamicType;
|
|
4693
|
-
exports.KuaishouCommentParamsSchema = KuaishouCommentParamsSchema;
|
|
4694
|
-
exports.KuaishouEmojiParamsSchema = KuaishouEmojiParamsSchema;
|
|
4695
|
-
exports.KuaishouValidationSchemas = KuaishouValidationSchemas2;
|
|
4696
|
-
exports.KuaishouVideoParamsSchema = KuaishouVideoParamsSchema;
|
|
4697
|
-
exports.MajorType = MajorType;
|
|
4698
|
-
exports.ValidationError = ValidationError;
|
|
4699
|
-
exports.XiaohongshuValidationSchemas = XiaohongshuValidationSchemas;
|
|
4700
|
-
exports.amagi = amagi;
|
|
4701
|
-
exports.amagiClient = amagiClient;
|
|
4702
|
-
exports.av2bv = av2bv;
|
|
4703
|
-
exports.bilibili = bilibili;
|
|
4704
|
-
exports.bilibiliApiUrls = bilibiliApiUrls;
|
|
4705
|
-
exports.bilibiliErrorCodeMap = bilibiliErrorCodeMap;
|
|
4706
|
-
exports.bilibiliUtils = bilibiliUtils;
|
|
4707
|
-
exports.bv2av = bv2av;
|
|
4708
|
-
exports.createAmagiClient = createAmagiClient;
|
|
4709
|
-
exports.createBilibiliRoutes = createBilibiliRoutes;
|
|
4710
|
-
exports.createBoundBilibiliApi = createBoundBilibiliApi;
|
|
4711
|
-
exports.createBoundDouyinApi = createBoundDouyinApi;
|
|
4712
|
-
exports.createBoundKuaishouApi = createBoundKuaishouApi;
|
|
4713
|
-
exports.createBoundXiaohongshuApi = createBoundXiaohongshuApi;
|
|
4714
|
-
exports.createDouyinRoutes = createDouyinRoutes;
|
|
4715
|
-
exports.createErrorResponse = createErrorResponse;
|
|
4716
|
-
exports.createKuaishouRoutes = createKuaishouRoutes;
|
|
4717
|
-
exports.createSuccessResponse = createSuccessResponse;
|
|
4718
|
-
exports.createXiaohongshuRoutes = createXiaohongshuRoutes;
|
|
4719
|
-
exports.default = Client;
|
|
4720
|
-
exports.douyin = douyin;
|
|
4721
|
-
exports.douyinApiUrls = douyinApiUrls;
|
|
4722
|
-
exports.douyinSign = douyinSign;
|
|
4723
|
-
exports.douyinUtils = douyinUtils;
|
|
4724
|
-
exports.fetchData = fetchData;
|
|
4725
|
-
exports.fetchResponse = fetchResponse;
|
|
4726
|
-
exports.getBilibiliData = getBilibiliData;
|
|
4727
|
-
exports.getDouyinData = getDouyinData;
|
|
4728
|
-
exports.getHeadersAndData = getHeadersAndData;
|
|
4729
|
-
exports.getKuaishouData = getKuaishouData;
|
|
4730
|
-
exports.handleError = handleError;
|
|
4731
|
-
exports.httpLogger = httpLogger;
|
|
4732
|
-
exports.kuaishou = kuaishou;
|
|
4733
|
-
exports.kuaishouApiUrls = kuaishouApiUrls;
|
|
4734
|
-
exports.kuaishouUtils = kuaishouUtils;
|
|
4735
|
-
exports.logMiddleware = logMiddleware;
|
|
4736
|
-
exports.logger = logger;
|
|
4737
|
-
exports.qtparam = qtparam;
|
|
4738
|
-
exports.registerBilibiliRoutes = createBilibiliRoutes;
|
|
4739
|
-
exports.registerDouyinRoutes = createDouyinRoutes;
|
|
4740
|
-
exports.registerKuaishouRoutes = createKuaishouRoutes;
|
|
4741
|
-
exports.registerXiaohongshuRoutes = createXiaohongshuRoutes;
|
|
4742
|
-
exports.validateBilibiliParams = validateBilibiliParams;
|
|
4743
|
-
exports.validateDouyinParams = validateDouyinParams;
|
|
4744
|
-
exports.validateKuaishouParams = validateKuaishouParams;
|
|
4745
|
-
exports.validateXiaohongshuParams = validateXiaohongshuParams;
|
|
4746
|
-
exports.wbi_sign = wbi_sign;
|
|
4747
|
-
exports.xiaohongshu = xiaohongshu;
|
|
4748
|
-
exports.xiaohongshuApiUrls = xiaohongshuApiUrls;
|
|
4749
|
-
exports.xiaohongshuSign = xiaohongshuSign;
|
|
4750
|
-
exports.xiaohongshuUtils = xiaohongshuUtils;
|