@skrillex1224/playwright-toolkit 2.1.154 → 2.1.156
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/browser.js +14 -0
- package/dist/browser.js.map +2 -2
- package/dist/index.cjs +367 -85
- package/dist/index.cjs.map +4 -4
- package/dist/index.js +367 -85
- package/dist/index.js.map +4 -4
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -171,6 +171,20 @@ var ActorInfo = {
|
|
|
171
171
|
xurl: []
|
|
172
172
|
}
|
|
173
173
|
}),
|
|
174
|
+
lingguang: createActorInfo({
|
|
175
|
+
key: "lingguang",
|
|
176
|
+
name: "\u7075\u5149",
|
|
177
|
+
domain: "www.lingguang.com",
|
|
178
|
+
path: "/",
|
|
179
|
+
share: {
|
|
180
|
+
mode: "response",
|
|
181
|
+
prefix: "https://www.lingguang.com/share/",
|
|
182
|
+
xurl: [
|
|
183
|
+
"/chat/shareChat.json",
|
|
184
|
+
"result"
|
|
185
|
+
]
|
|
186
|
+
}
|
|
187
|
+
}),
|
|
174
188
|
doubao: createActorInfo({
|
|
175
189
|
key: "doubao",
|
|
176
190
|
name: "\u8C46\u5305",
|
|
@@ -321,18 +335,18 @@ var fallbackLog = {
|
|
|
321
335
|
error: (...args) => console.error(...args),
|
|
322
336
|
debug: (...args) => console.debug ? console.debug(...args) : console.log(...args)
|
|
323
337
|
};
|
|
324
|
-
var resolveLogMethod = (
|
|
325
|
-
if (
|
|
326
|
-
return
|
|
338
|
+
var resolveLogMethod = (logger12, name) => {
|
|
339
|
+
if (logger12 && typeof logger12[name] === "function") {
|
|
340
|
+
return logger12[name].bind(logger12);
|
|
327
341
|
}
|
|
328
|
-
if (name === "warning" &&
|
|
329
|
-
return
|
|
342
|
+
if (name === "warning" && logger12 && typeof logger12.warn === "function") {
|
|
343
|
+
return logger12.warn.bind(logger12);
|
|
330
344
|
}
|
|
331
345
|
return fallbackLog[name];
|
|
332
346
|
};
|
|
333
347
|
var defaultLogger = null;
|
|
334
|
-
var setDefaultLogger = (
|
|
335
|
-
defaultLogger =
|
|
348
|
+
var setDefaultLogger = (logger12) => {
|
|
349
|
+
defaultLogger = logger12;
|
|
336
350
|
};
|
|
337
351
|
var resolveLogger = (explicitLogger) => {
|
|
338
352
|
if (explicitLogger && typeof explicitLogger.info === "function") {
|
|
@@ -359,8 +373,8 @@ var colorize = (text, color) => {
|
|
|
359
373
|
var createBaseLogger = (prefix = "", explicitLogger) => {
|
|
360
374
|
const name = prefix ? String(prefix) : "";
|
|
361
375
|
const dispatch = (methodName, icon, message, color) => {
|
|
362
|
-
const
|
|
363
|
-
const logFn = resolveLogMethod(
|
|
376
|
+
const logger12 = resolveLogger(explicitLogger);
|
|
377
|
+
const logFn = resolveLogMethod(logger12, methodName);
|
|
364
378
|
const timestamp = colorize(`[${formatTimestamp()}]`, ANSI.gray);
|
|
365
379
|
const line = formatLine(name, icon, message);
|
|
366
380
|
const coloredLine = colorize(line, color);
|
|
@@ -465,6 +479,20 @@ var CrawlerError = class _CrawlerError extends Error {
|
|
|
465
479
|
|
|
466
480
|
// src/apify-kit.js
|
|
467
481
|
var import_serialize_error2 = require("serialize-error");
|
|
482
|
+
|
|
483
|
+
// src/traffic-runtime.js
|
|
484
|
+
var trafficMeter = null;
|
|
485
|
+
var setTrafficMeter = (meter) => {
|
|
486
|
+
trafficMeter = meter || null;
|
|
487
|
+
};
|
|
488
|
+
var getTrafficSnapshot = () => {
|
|
489
|
+
if (!trafficMeter || typeof trafficMeter.snapshot !== "function") {
|
|
490
|
+
return null;
|
|
491
|
+
}
|
|
492
|
+
return trafficMeter.snapshot();
|
|
493
|
+
};
|
|
494
|
+
|
|
495
|
+
// src/apify-kit.js
|
|
468
496
|
var logger = createInternalLogger("ApifyKit");
|
|
469
497
|
async function createApifyKit() {
|
|
470
498
|
let apify = null;
|
|
@@ -578,10 +606,12 @@ async function createApifyKit() {
|
|
|
578
606
|
* @param {Object} data - 要推送的数据对象
|
|
579
607
|
*/
|
|
580
608
|
async pushSuccess(data) {
|
|
609
|
+
const traffic = getTrafficSnapshot();
|
|
581
610
|
await Actor2.pushData({
|
|
582
611
|
// 固定为0
|
|
583
612
|
code: Code.Success,
|
|
584
613
|
status: Status.Success,
|
|
614
|
+
...traffic ? { traffic } : {},
|
|
585
615
|
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
586
616
|
data
|
|
587
617
|
});
|
|
@@ -598,10 +628,12 @@ async function createApifyKit() {
|
|
|
598
628
|
const isCrawlerError = CrawlerError.isCrawlerError(error);
|
|
599
629
|
const code = isCrawlerError ? error.code : Code.UnknownError;
|
|
600
630
|
const context = isCrawlerError ? error.context : {};
|
|
631
|
+
const traffic = getTrafficSnapshot();
|
|
601
632
|
await Actor2.pushData({
|
|
602
633
|
// 如果是 CrawlerError,使用其 code,否则使用默认 Failed code
|
|
603
634
|
code,
|
|
604
635
|
status: Status.Failed,
|
|
636
|
+
...traffic ? { traffic } : {},
|
|
605
637
|
error: (0, import_serialize_error2.serializeError)(error),
|
|
606
638
|
meta,
|
|
607
639
|
context,
|
|
@@ -1221,9 +1253,12 @@ var Humanize = {
|
|
|
1221
1253
|
}
|
|
1222
1254
|
};
|
|
1223
1255
|
|
|
1224
|
-
// src/
|
|
1256
|
+
// src/proxy-bypass.js
|
|
1225
1257
|
var import_picomatch = __toESM(require("picomatch"), 1);
|
|
1226
|
-
var
|
|
1258
|
+
var normalizeByPassDomains = (domains) => {
|
|
1259
|
+
if (!Array.isArray(domains)) return [];
|
|
1260
|
+
return domains.map((item) => String(item || "").trim()).filter(Boolean);
|
|
1261
|
+
};
|
|
1227
1262
|
var buildByPassDomainRule = (rawPattern) => {
|
|
1228
1263
|
const pattern = String(rawPattern || "").trim().toLowerCase();
|
|
1229
1264
|
if (!pattern) return null;
|
|
@@ -1238,10 +1273,255 @@ var buildByPassDomainRule = (rawPattern) => {
|
|
|
1238
1273
|
test: (hostname) => matcher(String(hostname || "").toLowerCase())
|
|
1239
1274
|
};
|
|
1240
1275
|
};
|
|
1241
|
-
var
|
|
1242
|
-
|
|
1243
|
-
|
|
1276
|
+
var buildByPassDomainRules = (domains = []) => {
|
|
1277
|
+
return normalizeByPassDomains(domains).map((domain) => buildByPassDomainRule(domain)).filter(Boolean);
|
|
1278
|
+
};
|
|
1279
|
+
var findMatchedByPassRule = (rules = [], requestUrl = "") => {
|
|
1280
|
+
let hostname = "";
|
|
1281
|
+
try {
|
|
1282
|
+
hostname = new URL(String(requestUrl || "")).hostname.toLowerCase();
|
|
1283
|
+
} catch {
|
|
1284
|
+
return null;
|
|
1285
|
+
}
|
|
1286
|
+
for (const rule of rules) {
|
|
1287
|
+
if (rule && typeof rule.test === "function" && rule.test(hostname)) {
|
|
1288
|
+
return {
|
|
1289
|
+
rule,
|
|
1290
|
+
hostname
|
|
1291
|
+
};
|
|
1292
|
+
}
|
|
1293
|
+
}
|
|
1294
|
+
return {
|
|
1295
|
+
rule: null,
|
|
1296
|
+
hostname
|
|
1297
|
+
};
|
|
1298
|
+
};
|
|
1299
|
+
var resolveRouteByProxy = ({
|
|
1300
|
+
requestUrl = "",
|
|
1301
|
+
enableProxy = false,
|
|
1302
|
+
byPassRules = []
|
|
1303
|
+
}) => {
|
|
1304
|
+
if (!enableProxy) {
|
|
1305
|
+
return { route: "direct", matchedRule: null, hostname: "" };
|
|
1306
|
+
}
|
|
1307
|
+
const matched = findMatchedByPassRule(byPassRules, requestUrl);
|
|
1308
|
+
if (!matched) {
|
|
1309
|
+
return { route: "proxy", matchedRule: null, hostname: "" };
|
|
1310
|
+
}
|
|
1311
|
+
if (matched.rule) {
|
|
1312
|
+
return { route: "direct", matchedRule: matched.rule, hostname: matched.hostname };
|
|
1313
|
+
}
|
|
1314
|
+
return { route: "proxy", matchedRule: null, hostname: matched.hostname };
|
|
1315
|
+
};
|
|
1316
|
+
|
|
1317
|
+
// src/traffic-meter.js
|
|
1318
|
+
var logger5 = createInternalLogger("TrafficMeter");
|
|
1319
|
+
var encoder = new TextEncoder();
|
|
1320
|
+
var toSafeNumber = (value) => {
|
|
1321
|
+
if (typeof value !== "number" || !Number.isFinite(value) || value <= 0) return 0;
|
|
1322
|
+
return Math.round(value);
|
|
1323
|
+
};
|
|
1324
|
+
var byteLength = (value) => {
|
|
1325
|
+
const text = String(value || "");
|
|
1326
|
+
if (!text) return 0;
|
|
1327
|
+
try {
|
|
1328
|
+
return encoder.encode(text).length;
|
|
1329
|
+
} catch {
|
|
1330
|
+
return text.length;
|
|
1331
|
+
}
|
|
1244
1332
|
};
|
|
1333
|
+
var normalizeHeaderValue = (value) => {
|
|
1334
|
+
if (Array.isArray(value)) return value.join(",");
|
|
1335
|
+
if (value === null || value === void 0) return "";
|
|
1336
|
+
return String(value);
|
|
1337
|
+
};
|
|
1338
|
+
var estimateRequestBytes = (request = {}) => {
|
|
1339
|
+
const method = String(request.method || "GET");
|
|
1340
|
+
const url = String(request.url || "");
|
|
1341
|
+
let total = byteLength(`${method} ${url} HTTP/1.1\r
|
|
1342
|
+
`);
|
|
1343
|
+
const headers = request.headers && typeof request.headers === "object" ? request.headers : {};
|
|
1344
|
+
Object.entries(headers).forEach(([key, value]) => {
|
|
1345
|
+
total += byteLength(`${key}: ${normalizeHeaderValue(value)}\r
|
|
1346
|
+
`);
|
|
1347
|
+
});
|
|
1348
|
+
total += 2;
|
|
1349
|
+
if (typeof request.postData === "string" && request.postData) {
|
|
1350
|
+
total += byteLength(request.postData);
|
|
1351
|
+
}
|
|
1352
|
+
return total;
|
|
1353
|
+
};
|
|
1354
|
+
var createTrafficState = () => ({
|
|
1355
|
+
totalRequests: 0,
|
|
1356
|
+
proxyRequests: 0,
|
|
1357
|
+
directRequests: 0,
|
|
1358
|
+
totalUploadBytes: 0,
|
|
1359
|
+
proxyUploadBytes: 0,
|
|
1360
|
+
directUploadBytes: 0,
|
|
1361
|
+
totalDownloadBytes: 0,
|
|
1362
|
+
proxyDownloadBytes: 0,
|
|
1363
|
+
directDownloadBytes: 0
|
|
1364
|
+
});
|
|
1365
|
+
var ensureRoute = (route) => route === "proxy" ? "proxy" : "direct";
|
|
1366
|
+
var addRequests = (state, route, count = 1) => {
|
|
1367
|
+
const c = toSafeNumber(count);
|
|
1368
|
+
if (c <= 0) return;
|
|
1369
|
+
const normalizedRoute = ensureRoute(route);
|
|
1370
|
+
state.totalRequests += c;
|
|
1371
|
+
if (normalizedRoute === "proxy") {
|
|
1372
|
+
state.proxyRequests += c;
|
|
1373
|
+
return;
|
|
1374
|
+
}
|
|
1375
|
+
state.directRequests += c;
|
|
1376
|
+
};
|
|
1377
|
+
var addUploadBytes = (state, route, bytes = 0) => {
|
|
1378
|
+
const b = toSafeNumber(bytes);
|
|
1379
|
+
if (b <= 0) return;
|
|
1380
|
+
const normalizedRoute = ensureRoute(route);
|
|
1381
|
+
state.totalUploadBytes += b;
|
|
1382
|
+
if (normalizedRoute === "proxy") {
|
|
1383
|
+
state.proxyUploadBytes += b;
|
|
1384
|
+
return;
|
|
1385
|
+
}
|
|
1386
|
+
state.directUploadBytes += b;
|
|
1387
|
+
};
|
|
1388
|
+
var addDownloadBytes = (state, route, bytes = 0) => {
|
|
1389
|
+
const b = toSafeNumber(bytes);
|
|
1390
|
+
if (b <= 0) return;
|
|
1391
|
+
const normalizedRoute = ensureRoute(route);
|
|
1392
|
+
state.totalDownloadBytes += b;
|
|
1393
|
+
if (normalizedRoute === "proxy") {
|
|
1394
|
+
state.proxyDownloadBytes += b;
|
|
1395
|
+
return;
|
|
1396
|
+
}
|
|
1397
|
+
state.directDownloadBytes += b;
|
|
1398
|
+
};
|
|
1399
|
+
var createTrafficMeter = ({
|
|
1400
|
+
enableProxy = false,
|
|
1401
|
+
byPassRules = []
|
|
1402
|
+
} = {}) => {
|
|
1403
|
+
const state = createTrafficState();
|
|
1404
|
+
const requestMap = /* @__PURE__ */ new Map();
|
|
1405
|
+
const wsRouteMap = /* @__PURE__ */ new Map();
|
|
1406
|
+
const resolveRoute = (url = "") => {
|
|
1407
|
+
return resolveRouteByProxy({
|
|
1408
|
+
requestUrl: url,
|
|
1409
|
+
enableProxy,
|
|
1410
|
+
byPassRules
|
|
1411
|
+
}).route;
|
|
1412
|
+
};
|
|
1413
|
+
const recordRequest = (params = {}) => {
|
|
1414
|
+
const requestId = String(params.requestId || "");
|
|
1415
|
+
const request = params.request && typeof params.request === "object" ? params.request : {};
|
|
1416
|
+
const route = resolveRoute(request.url || "");
|
|
1417
|
+
addRequests(state, route, 1);
|
|
1418
|
+
const uploadBytes = estimateRequestBytes(request);
|
|
1419
|
+
addUploadBytes(state, route, uploadBytes);
|
|
1420
|
+
if (requestId) {
|
|
1421
|
+
requestMap.set(requestId, {
|
|
1422
|
+
route
|
|
1423
|
+
});
|
|
1424
|
+
}
|
|
1425
|
+
};
|
|
1426
|
+
const recordLoadingFinished = (params = {}) => {
|
|
1427
|
+
const requestId = String(params.requestId || "");
|
|
1428
|
+
const requestState = requestId ? requestMap.get(requestId) : null;
|
|
1429
|
+
const route = requestState?.route || "direct";
|
|
1430
|
+
const downloadBytes = toSafeNumber(params.encodedDataLength);
|
|
1431
|
+
addDownloadBytes(state, route, downloadBytes);
|
|
1432
|
+
if (requestId) {
|
|
1433
|
+
requestMap.delete(requestId);
|
|
1434
|
+
}
|
|
1435
|
+
};
|
|
1436
|
+
const recordRequestFailed = (params = {}) => {
|
|
1437
|
+
const requestId = String(params.requestId || "");
|
|
1438
|
+
if (requestId) {
|
|
1439
|
+
requestMap.delete(requestId);
|
|
1440
|
+
}
|
|
1441
|
+
};
|
|
1442
|
+
const bindWebSocketRoute = (params = {}) => {
|
|
1443
|
+
const requestId = String(params.requestId || "");
|
|
1444
|
+
if (!requestId) return;
|
|
1445
|
+
const route = resolveRoute(params.url || "");
|
|
1446
|
+
wsRouteMap.set(requestId, route);
|
|
1447
|
+
};
|
|
1448
|
+
const clearWebSocketRoute = (params = {}) => {
|
|
1449
|
+
const requestId = String(params.requestId || "");
|
|
1450
|
+
if (!requestId) return;
|
|
1451
|
+
wsRouteMap.delete(requestId);
|
|
1452
|
+
};
|
|
1453
|
+
const getWebSocketRoute = (requestId = "") => {
|
|
1454
|
+
if (!requestId) return "direct";
|
|
1455
|
+
return wsRouteMap.get(requestId) || "direct";
|
|
1456
|
+
};
|
|
1457
|
+
const recordWebSocketFrameSent = (params = {}) => {
|
|
1458
|
+
const requestId = String(params.requestId || "");
|
|
1459
|
+
const route = getWebSocketRoute(requestId);
|
|
1460
|
+
const payload = params.response && typeof params.response === "object" ? params.response.payloadData : "";
|
|
1461
|
+
const bytes = byteLength(payload || "");
|
|
1462
|
+
addUploadBytes(state, route, bytes);
|
|
1463
|
+
};
|
|
1464
|
+
const recordWebSocketFrameReceived = (params = {}) => {
|
|
1465
|
+
const requestId = String(params.requestId || "");
|
|
1466
|
+
const route = getWebSocketRoute(requestId);
|
|
1467
|
+
const payload = params.response && typeof params.response === "object" ? params.response.payloadData : "";
|
|
1468
|
+
const bytes = byteLength(payload || "");
|
|
1469
|
+
addDownloadBytes(state, route, bytes);
|
|
1470
|
+
};
|
|
1471
|
+
const attachPage = async (page) => {
|
|
1472
|
+
if (!page || typeof page.context !== "function") return;
|
|
1473
|
+
try {
|
|
1474
|
+
const context = page.context();
|
|
1475
|
+
if (!context || typeof context.newCDPSession !== "function") {
|
|
1476
|
+
return;
|
|
1477
|
+
}
|
|
1478
|
+
const session = await context.newCDPSession(page);
|
|
1479
|
+
await session.send("Network.enable");
|
|
1480
|
+
session.on("Network.requestWillBeSent", recordRequest);
|
|
1481
|
+
session.on("Network.loadingFinished", recordLoadingFinished);
|
|
1482
|
+
session.on("Network.loadingFailed", recordRequestFailed);
|
|
1483
|
+
session.on("Network.webSocketCreated", bindWebSocketRoute);
|
|
1484
|
+
session.on("Network.webSocketClosed", clearWebSocketRoute);
|
|
1485
|
+
session.on("Network.webSocketFrameSent", recordWebSocketFrameSent);
|
|
1486
|
+
session.on("Network.webSocketFrameReceived", recordWebSocketFrameReceived);
|
|
1487
|
+
} catch (error) {
|
|
1488
|
+
logger5.warn(`CDP \u76D1\u542C\u6CE8\u518C\u5931\u8D25: ${error?.message || error}`);
|
|
1489
|
+
}
|
|
1490
|
+
};
|
|
1491
|
+
const snapshot = () => {
|
|
1492
|
+
const totalBytes = state.totalUploadBytes + state.totalDownloadBytes;
|
|
1493
|
+
const proxyBytes = state.proxyUploadBytes + state.proxyDownloadBytes;
|
|
1494
|
+
const directBytes = state.directUploadBytes + state.directDownloadBytes;
|
|
1495
|
+
return {
|
|
1496
|
+
meter: "cdp",
|
|
1497
|
+
totalRequests: state.totalRequests,
|
|
1498
|
+
proxyRequests: state.proxyRequests,
|
|
1499
|
+
directRequests: state.directRequests,
|
|
1500
|
+
totalUploadBytes: state.totalUploadBytes,
|
|
1501
|
+
proxyUploadBytes: state.proxyUploadBytes,
|
|
1502
|
+
directUploadBytes: state.directUploadBytes,
|
|
1503
|
+
totalDownloadBytes: state.totalDownloadBytes,
|
|
1504
|
+
proxyDownloadBytes: state.proxyDownloadBytes,
|
|
1505
|
+
directDownloadBytes: state.directDownloadBytes,
|
|
1506
|
+
totalBytes,
|
|
1507
|
+
proxyBytes,
|
|
1508
|
+
directBytes
|
|
1509
|
+
};
|
|
1510
|
+
};
|
|
1511
|
+
const reset = () => {
|
|
1512
|
+
Object.assign(state, createTrafficState());
|
|
1513
|
+
requestMap.clear();
|
|
1514
|
+
wsRouteMap.clear();
|
|
1515
|
+
};
|
|
1516
|
+
return {
|
|
1517
|
+
attachPage,
|
|
1518
|
+
snapshot,
|
|
1519
|
+
reset
|
|
1520
|
+
};
|
|
1521
|
+
};
|
|
1522
|
+
|
|
1523
|
+
// src/launch.js
|
|
1524
|
+
var logger6 = createInternalLogger("Launch");
|
|
1245
1525
|
var resolveProxyLaunchOptions = (proxyConfiguration = {}) => {
|
|
1246
1526
|
const config = proxyConfiguration && typeof proxyConfiguration === "object" && !Array.isArray(proxyConfiguration) ? proxyConfiguration : {};
|
|
1247
1527
|
const proxyUrl = String(config.proxy_url || "").trim();
|
|
@@ -1275,6 +1555,12 @@ var Launch = {
|
|
|
1275
1555
|
log: logOptions = null
|
|
1276
1556
|
} = normalizedOptions;
|
|
1277
1557
|
const { launchProxy, byPassDomains, enableProxy, proxyUrl } = resolveProxyLaunchOptions(proxyConfiguration);
|
|
1558
|
+
const byPassRules = buildByPassDomainRules(byPassDomains);
|
|
1559
|
+
const trafficMeter2 = createTrafficMeter({
|
|
1560
|
+
enableProxy: Boolean(launchProxy),
|
|
1561
|
+
byPassRules
|
|
1562
|
+
});
|
|
1563
|
+
setTrafficMeter(trafficMeter2);
|
|
1278
1564
|
const launchOptions = {
|
|
1279
1565
|
args: [
|
|
1280
1566
|
...AntiCheat.getLaunchArgs(),
|
|
@@ -1287,15 +1573,15 @@ var Launch = {
|
|
|
1287
1573
|
}
|
|
1288
1574
|
const enableByPassLogger = Boolean(logOptions && logOptions.enable);
|
|
1289
1575
|
if (enableByPassLogger && launchProxy) {
|
|
1290
|
-
|
|
1576
|
+
logger6.info(
|
|
1291
1577
|
`[\u4EE3\u7406\u5DF2\u542F\u7528] \u4EE3\u7406\u670D\u52A1=${launchProxy.server} \u76F4\u8FDE\u57DF\u540D=${(byPassDomains || []).join(",")}`
|
|
1292
1578
|
);
|
|
1293
1579
|
} else if (enableByPassLogger && enableProxy && !launchProxy) {
|
|
1294
|
-
|
|
1580
|
+
logger6.info(
|
|
1295
1581
|
`[\u4EE3\u7406\u672A\u542F\u7528] enable_proxy=true \u4F46 proxy_url \u4E3A\u7A7A`
|
|
1296
1582
|
);
|
|
1297
1583
|
} else if (enableByPassLogger && !enableProxy && proxyUrl) {
|
|
1298
|
-
|
|
1584
|
+
logger6.info(
|
|
1299
1585
|
`[\u4EE3\u7406\u672A\u542F\u7528] enable_proxy=false \u4E14 proxy_url \u5DF2\u914D\u7F6E`
|
|
1300
1586
|
);
|
|
1301
1587
|
}
|
|
@@ -1303,21 +1589,17 @@ var Launch = {
|
|
|
1303
1589
|
const recommendedGotoOptions = {
|
|
1304
1590
|
waitUntil: "domcontentloaded"
|
|
1305
1591
|
};
|
|
1592
|
+
if (page && typeof page.on === "function") {
|
|
1593
|
+
trafficMeter2.attachPage(page);
|
|
1594
|
+
}
|
|
1306
1595
|
if (!enableByPassLogger || byPassDomains.length === 0 || !page || typeof page.on !== "function") {
|
|
1307
1596
|
return recommendedGotoOptions;
|
|
1308
1597
|
}
|
|
1309
|
-
const byPassRules = byPassDomains.map((domain) => buildByPassDomainRule(domain)).filter(Boolean);
|
|
1310
1598
|
const requestHandler = (req) => {
|
|
1311
1599
|
const requestUrl = req.url();
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
} catch {
|
|
1316
|
-
return;
|
|
1317
|
-
}
|
|
1318
|
-
const matchedRule = byPassRules.find((rule) => rule.test(hostname));
|
|
1319
|
-
if (!matchedRule) return;
|
|
1320
|
-
logger5.info(`[\u76F4\u8FDE\u547D\u4E2D] \u89C4\u5219=${matchedRule.pattern} \u57DF\u540D=${hostname} \u8D44\u6E90\u7C7B\u578B=${req.resourceType()} \u65B9\u6CD5=${req.method()} \u5730\u5740=${requestUrl}`);
|
|
1600
|
+
const matched = findMatchedByPassRule(byPassRules, requestUrl);
|
|
1601
|
+
if (!matched || !matched.rule) return;
|
|
1602
|
+
logger6.info(`[\u76F4\u8FDE\u547D\u4E2D] \u89C4\u5219=${matched.rule.pattern} \u57DF\u540D=${matched.hostname} \u8D44\u6E90\u7C7B\u578B=${req.resourceType()} \u65B9\u6CD5=${req.method()} \u5730\u5740=${requestUrl}`);
|
|
1321
1603
|
};
|
|
1322
1604
|
page.on("request", requestHandler);
|
|
1323
1605
|
return recommendedGotoOptions;
|
|
@@ -1336,7 +1618,7 @@ var Launch = {
|
|
|
1336
1618
|
// src/live-view.js
|
|
1337
1619
|
var import_express = __toESM(require("express"), 1);
|
|
1338
1620
|
var import_apify = require("apify");
|
|
1339
|
-
var
|
|
1621
|
+
var logger7 = createInternalLogger("LiveView");
|
|
1340
1622
|
async function startLiveViewServer(liveViewKey) {
|
|
1341
1623
|
const app = (0, import_express.default)();
|
|
1342
1624
|
app.get("/", async (req, res) => {
|
|
@@ -1361,13 +1643,13 @@ async function startLiveViewServer(liveViewKey) {
|
|
|
1361
1643
|
</html>
|
|
1362
1644
|
`);
|
|
1363
1645
|
} catch (error) {
|
|
1364
|
-
|
|
1646
|
+
logger7.fail("Live View Server", error);
|
|
1365
1647
|
res.status(500).send(`\u65E0\u6CD5\u52A0\u8F7D\u5C4F\u5E55\u622A\u56FE: ${error.message}`);
|
|
1366
1648
|
}
|
|
1367
1649
|
});
|
|
1368
1650
|
const port = process.env.APIFY_CONTAINER_PORT || 4321;
|
|
1369
1651
|
app.listen(port, () => {
|
|
1370
|
-
|
|
1652
|
+
logger7.success("startLiveViewServer", `\u76D1\u542C\u7AEF\u53E3 ${port}`);
|
|
1371
1653
|
});
|
|
1372
1654
|
}
|
|
1373
1655
|
async function takeLiveScreenshot(liveViewKey, page, logMessage) {
|
|
@@ -1375,10 +1657,10 @@ async function takeLiveScreenshot(liveViewKey, page, logMessage) {
|
|
|
1375
1657
|
const buffer = await page.screenshot({ type: "png" });
|
|
1376
1658
|
await import_apify.Actor.setValue(liveViewKey, buffer, { contentType: "image/png" });
|
|
1377
1659
|
if (logMessage) {
|
|
1378
|
-
|
|
1660
|
+
logger7.info(`(\u622A\u56FE): ${logMessage}`);
|
|
1379
1661
|
}
|
|
1380
1662
|
} catch (e) {
|
|
1381
|
-
|
|
1663
|
+
logger7.warn(`\u65E0\u6CD5\u6355\u83B7 Live View \u5C4F\u5E55\u622A\u56FE: ${e.message}`);
|
|
1382
1664
|
}
|
|
1383
1665
|
}
|
|
1384
1666
|
var useLiveView = (liveViewKey = PresetOfLiveViewKey) => {
|
|
@@ -1397,7 +1679,7 @@ var LiveView = {
|
|
|
1397
1679
|
|
|
1398
1680
|
// src/captcha-monitor.js
|
|
1399
1681
|
var import_uuid = require("uuid");
|
|
1400
|
-
var
|
|
1682
|
+
var logger8 = createInternalLogger("Captcha");
|
|
1401
1683
|
function useCaptchaMonitor(page, options) {
|
|
1402
1684
|
const { domSelector, urlPattern, onDetected } = options;
|
|
1403
1685
|
if (!domSelector && !urlPattern) {
|
|
@@ -1470,7 +1752,7 @@ function useCaptchaMonitor(page, options) {
|
|
|
1470
1752
|
};
|
|
1471
1753
|
})();
|
|
1472
1754
|
}, { selector: domSelector, callbackName: exposedFunctionName, cleanerName });
|
|
1473
|
-
|
|
1755
|
+
logger8.success("useCaptchaMonitor", `DOM \u76D1\u63A7\u5DF2\u542F\u7528: ${domSelector}`);
|
|
1474
1756
|
cleanupFns.push(async () => {
|
|
1475
1757
|
try {
|
|
1476
1758
|
await page.evaluate((name) => {
|
|
@@ -1493,14 +1775,14 @@ function useCaptchaMonitor(page, options) {
|
|
|
1493
1775
|
}
|
|
1494
1776
|
};
|
|
1495
1777
|
page.on("framenavigated", frameHandler);
|
|
1496
|
-
|
|
1778
|
+
logger8.success("useCaptchaMonitor", `URL \u76D1\u63A7\u5DF2\u542F\u7528: ${urlPattern}`);
|
|
1497
1779
|
cleanupFns.push(async () => {
|
|
1498
1780
|
page.off("framenavigated", frameHandler);
|
|
1499
1781
|
});
|
|
1500
1782
|
}
|
|
1501
1783
|
return {
|
|
1502
1784
|
stop: async () => {
|
|
1503
|
-
|
|
1785
|
+
logger8.info("useCaptchaMonitor", "\u6B63\u5728\u505C\u6B62\u76D1\u63A7...");
|
|
1504
1786
|
for (const fn of cleanupFns) {
|
|
1505
1787
|
await fn();
|
|
1506
1788
|
}
|
|
@@ -1515,7 +1797,7 @@ var Captcha = {
|
|
|
1515
1797
|
// src/sse.js
|
|
1516
1798
|
var import_https = __toESM(require("https"), 1);
|
|
1517
1799
|
var import_url = require("url");
|
|
1518
|
-
var
|
|
1800
|
+
var logger9 = createInternalLogger("Sse");
|
|
1519
1801
|
var Sse = {
|
|
1520
1802
|
/**
|
|
1521
1803
|
* 解析 SSE 流文本
|
|
@@ -1534,11 +1816,11 @@ var Sse = {
|
|
|
1534
1816
|
events.push(JSON.parse(jsonContent));
|
|
1535
1817
|
}
|
|
1536
1818
|
} catch (e) {
|
|
1537
|
-
|
|
1819
|
+
logger9.debug("parseSseStream", `JSON \u89E3\u6790\u5931\u8D25: ${e.message}, line: ${line.substring(0, 100)}...`);
|
|
1538
1820
|
}
|
|
1539
1821
|
}
|
|
1540
1822
|
}
|
|
1541
|
-
|
|
1823
|
+
logger9.success("parseSseStream", `\u89E3\u6790\u5B8C\u6210, events \u6570\u91CF: ${events.length}`);
|
|
1542
1824
|
return events;
|
|
1543
1825
|
},
|
|
1544
1826
|
/**
|
|
@@ -1588,7 +1870,7 @@ var Sse = {
|
|
|
1588
1870
|
if (!autoUnroute) return;
|
|
1589
1871
|
if (unrouteRequested) return;
|
|
1590
1872
|
unrouteRequested = true;
|
|
1591
|
-
|
|
1873
|
+
logger9.info("[MITM] autoUnroute: \u53D6\u6D88\u540E\u7EED\u62E6\u622A");
|
|
1592
1874
|
page.unroute(urlPattern, routeHandler).catch(() => {
|
|
1593
1875
|
});
|
|
1594
1876
|
};
|
|
@@ -1608,19 +1890,19 @@ var Sse = {
|
|
|
1608
1890
|
};
|
|
1609
1891
|
const routeHandler = async (route) => {
|
|
1610
1892
|
if (firstMatchOnly && hasMatchedOnce) {
|
|
1611
|
-
|
|
1893
|
+
logger9.info(`[MITM] firstMatchOnly: \u653E\u884C\u540E\u7EED\u8BF7\u6C42: ${route.request().url()}`);
|
|
1612
1894
|
route.continue().catch(() => {
|
|
1613
1895
|
});
|
|
1614
1896
|
return;
|
|
1615
1897
|
}
|
|
1616
1898
|
if (firstMatchOnly && !hasMatchedOnce) {
|
|
1617
1899
|
hasMatchedOnce = true;
|
|
1618
|
-
|
|
1900
|
+
logger9.info("[MITM] firstMatchOnly: \u547D\u4E2D\u9996\u4E2A\u8BF7\u6C42\uFF0C\u53D6\u6D88\u540E\u7EED\u62E6\u622A");
|
|
1619
1901
|
page.unroute(urlPattern, routeHandler).catch(() => {
|
|
1620
1902
|
});
|
|
1621
1903
|
}
|
|
1622
1904
|
const request = route.request();
|
|
1623
|
-
|
|
1905
|
+
logger9.info(`[MITM] \u5DF2\u62E6\u622A\u8BF7\u6C42: ${request.url()}`);
|
|
1624
1906
|
try {
|
|
1625
1907
|
const headers = await request.allHeaders();
|
|
1626
1908
|
const postData = request.postData();
|
|
@@ -1645,7 +1927,7 @@ var Sse = {
|
|
|
1645
1927
|
clearTimeout(initialTimer);
|
|
1646
1928
|
initialTimer = null;
|
|
1647
1929
|
}
|
|
1648
|
-
|
|
1930
|
+
logger9.debug("[Intercept] \u5DF2\u63A5\u6536\u521D\u59CB\u6570\u636E");
|
|
1649
1931
|
}
|
|
1650
1932
|
chunks.push(chunk);
|
|
1651
1933
|
const textChunk = chunk.toString("utf-8");
|
|
@@ -1654,18 +1936,18 @@ var Sse = {
|
|
|
1654
1936
|
try {
|
|
1655
1937
|
onData(textChunk, safeResolve, accumulatedText);
|
|
1656
1938
|
} catch (e) {
|
|
1657
|
-
|
|
1939
|
+
logger9.fail(`onData \u9519\u8BEF`, e);
|
|
1658
1940
|
}
|
|
1659
1941
|
}
|
|
1660
1942
|
});
|
|
1661
1943
|
res.on("end", () => {
|
|
1662
|
-
|
|
1944
|
+
logger9.info("[MITM] \u4E0A\u6E38\u54CD\u5E94\u7ED3\u675F");
|
|
1663
1945
|
clearAllTimers();
|
|
1664
1946
|
if (onEnd) {
|
|
1665
1947
|
try {
|
|
1666
1948
|
onEnd(accumulatedText, safeResolve);
|
|
1667
1949
|
} catch (e) {
|
|
1668
|
-
|
|
1950
|
+
logger9.fail(`onEnd \u9519\u8BEF`, e);
|
|
1669
1951
|
}
|
|
1670
1952
|
} else if (!onData) {
|
|
1671
1953
|
safeResolve(accumulatedText);
|
|
@@ -1746,7 +2028,7 @@ var Sse = {
|
|
|
1746
2028
|
|
|
1747
2029
|
// src/mutation.js
|
|
1748
2030
|
var import_uuid2 = require("uuid");
|
|
1749
|
-
var
|
|
2031
|
+
var logger10 = createInternalLogger("Mutation");
|
|
1750
2032
|
var MUTATION_MONITOR_MODE = Object.freeze({
|
|
1751
2033
|
Added: "added",
|
|
1752
2034
|
Changed: "changed",
|
|
@@ -1779,14 +2061,14 @@ var Mutation = {
|
|
|
1779
2061
|
const stableTime = options.stableTime ?? 5 * 1e3;
|
|
1780
2062
|
const timeout = options.timeout ?? 120 * 1e3;
|
|
1781
2063
|
const onMutation = options.onMutation;
|
|
1782
|
-
|
|
2064
|
+
logger10.start("waitForStable", `\u76D1\u63A7 ${selectorList.length} \u4E2A\u9009\u62E9\u5668, \u7A33\u5B9A\u65F6\u95F4=${stableTime}ms`);
|
|
1783
2065
|
if (initialTimeout > 0) {
|
|
1784
2066
|
const selectorQuery = selectorList.join(",");
|
|
1785
2067
|
try {
|
|
1786
2068
|
await page.waitForSelector(selectorQuery, { timeout: initialTimeout });
|
|
1787
|
-
|
|
2069
|
+
logger10.info(`waitForStable \u5DF2\u68C0\u6D4B\u5230\u5143\u7D20: ${selectorQuery}`);
|
|
1788
2070
|
} catch (e) {
|
|
1789
|
-
|
|
2071
|
+
logger10.warning(`waitForStable \u521D\u59CB\u7B49\u5F85\u8D85\u65F6 (${initialTimeout}ms): ${selectorQuery}`);
|
|
1790
2072
|
throw e;
|
|
1791
2073
|
}
|
|
1792
2074
|
}
|
|
@@ -1802,7 +2084,7 @@ var Mutation = {
|
|
|
1802
2084
|
return "__CONTINUE__";
|
|
1803
2085
|
}
|
|
1804
2086
|
});
|
|
1805
|
-
|
|
2087
|
+
logger10.info("waitForStable \u5DF2\u542F\u7528 onMutation \u56DE\u8C03");
|
|
1806
2088
|
} catch (e) {
|
|
1807
2089
|
}
|
|
1808
2090
|
}
|
|
@@ -1917,9 +2199,9 @@ var Mutation = {
|
|
|
1917
2199
|
{ selectorList, stableTime, timeout, callbackName, hasCallback: !!onMutation }
|
|
1918
2200
|
);
|
|
1919
2201
|
if (result.mutationCount === 0 && result.stableTime === 0) {
|
|
1920
|
-
|
|
2202
|
+
logger10.warning("waitForStable \u672A\u627E\u5230\u53EF\u76D1\u63A7\u7684\u5143\u7D20");
|
|
1921
2203
|
}
|
|
1922
|
-
|
|
2204
|
+
logger10.success("waitForStable", `DOM \u7A33\u5B9A, \u603B\u5171 ${result.mutationCount} \u6B21\u53D8\u5316${result.wasPaused ? ", \u66FE\u6682\u505C\u8BA1\u65F6" : ""}`);
|
|
1923
2205
|
return result;
|
|
1924
2206
|
},
|
|
1925
2207
|
/**
|
|
@@ -1939,7 +2221,7 @@ var Mutation = {
|
|
|
1939
2221
|
const onMutation = options.onMutation;
|
|
1940
2222
|
const rawMode = String(options.mode || MUTATION_MONITOR_MODE.Added).toLowerCase();
|
|
1941
2223
|
const mode = [MUTATION_MONITOR_MODE.Added, MUTATION_MONITOR_MODE.Changed, MUTATION_MONITOR_MODE.All].includes(rawMode) ? rawMode : MUTATION_MONITOR_MODE.Added;
|
|
1942
|
-
|
|
2224
|
+
logger10.start("useMonitor", `\u76D1\u63A7 ${selectorList.length} \u4E2A\u9009\u62E9\u5668, mode=${mode}`);
|
|
1943
2225
|
const monitorKey = generateKey("pk_mon");
|
|
1944
2226
|
const callbackName = generateKey("pk_mon_cb");
|
|
1945
2227
|
const cleanerName = generateKey("pk_mon_clean");
|
|
@@ -2082,7 +2364,7 @@ var Mutation = {
|
|
|
2082
2364
|
return total;
|
|
2083
2365
|
};
|
|
2084
2366
|
}, { selectorList, monitorKey, callbackName, cleanerName, hasCallback: !!onMutation, mode });
|
|
2085
|
-
|
|
2367
|
+
logger10.success("useMonitor", "\u76D1\u63A7\u5668\u5DF2\u542F\u52A8");
|
|
2086
2368
|
return {
|
|
2087
2369
|
stop: async () => {
|
|
2088
2370
|
let totalMutations = 0;
|
|
@@ -2095,7 +2377,7 @@ var Mutation = {
|
|
|
2095
2377
|
}, cleanerName);
|
|
2096
2378
|
} catch (e) {
|
|
2097
2379
|
}
|
|
2098
|
-
|
|
2380
|
+
logger10.success("useMonitor.stop", `\u76D1\u63A7\u5DF2\u505C\u6B62, \u5171 ${totalMutations} \u6B21\u53D8\u5316`);
|
|
2099
2381
|
return { totalMutations };
|
|
2100
2382
|
}
|
|
2101
2383
|
};
|
|
@@ -2964,7 +3246,7 @@ var createTemplateLogger = (baseLogger = createBaseLogger()) => {
|
|
|
2964
3246
|
};
|
|
2965
3247
|
var getDefaultBaseLogger = () => createBaseLogger("");
|
|
2966
3248
|
var Logger = {
|
|
2967
|
-
setLogger: (
|
|
3249
|
+
setLogger: (logger12) => setDefaultLogger(logger12),
|
|
2968
3250
|
info: (message) => getDefaultBaseLogger().info(message),
|
|
2969
3251
|
success: (message) => getDefaultBaseLogger().success(message),
|
|
2970
3252
|
warning: (message) => getDefaultBaseLogger().warning(message),
|
|
@@ -2972,15 +3254,15 @@ var Logger = {
|
|
|
2972
3254
|
error: (message) => getDefaultBaseLogger().error(message),
|
|
2973
3255
|
debug: (message) => getDefaultBaseLogger().debug(message),
|
|
2974
3256
|
start: (message) => getDefaultBaseLogger().start(message),
|
|
2975
|
-
useTemplate: (
|
|
2976
|
-
if (
|
|
3257
|
+
useTemplate: (logger12) => {
|
|
3258
|
+
if (logger12) return createTemplateLogger(createBaseLogger("", logger12));
|
|
2977
3259
|
return createTemplateLogger();
|
|
2978
3260
|
}
|
|
2979
3261
|
};
|
|
2980
3262
|
|
|
2981
3263
|
// src/share.js
|
|
2982
3264
|
var import_delay2 = __toESM(require("delay"), 1);
|
|
2983
|
-
var
|
|
3265
|
+
var logger11 = createInternalLogger("Share");
|
|
2984
3266
|
var DEFAULT_TIMEOUT_MS = 50 * 1e3;
|
|
2985
3267
|
var DEFAULT_PAYLOAD_SNAPSHOT_MAX_LEN = 500;
|
|
2986
3268
|
var DEFAULT_POLL_INTERVAL_MS = 120;
|
|
@@ -3100,7 +3382,7 @@ var createDomShareMonitor = async (page, options = {}) => {
|
|
|
3100
3382
|
const onMatch = typeof options.onMatch === "function" ? options.onMatch : null;
|
|
3101
3383
|
const onTelemetry = typeof options.onTelemetry === "function" ? options.onTelemetry : null;
|
|
3102
3384
|
let matched = false;
|
|
3103
|
-
|
|
3385
|
+
logger11.info(`DOM \u76D1\u542C\u51C6\u5907\u6302\u8F7D: selectors=${toJsonInline(selectors, 120)}, mode=${mode}`);
|
|
3104
3386
|
const monitor = await Mutation.useMonitor(page, selectors, {
|
|
3105
3387
|
mode,
|
|
3106
3388
|
onMutation: (context = {}) => {
|
|
@@ -3118,12 +3400,12 @@ ${text}`;
|
|
|
3118
3400
|
});
|
|
3119
3401
|
}
|
|
3120
3402
|
if (mutationCount <= 5 || mutationCount % 50 === 0) {
|
|
3121
|
-
|
|
3403
|
+
logger11.info(`DOM \u53D8\u5316\u5DF2\u6355\u83B7: mutationCount=${mutationCount}, mutationNodes=${mutationNodes.length}`);
|
|
3122
3404
|
}
|
|
3123
3405
|
const [candidate] = Utils.parseLinks(rawDom, { prefix }) || [];
|
|
3124
3406
|
if (!candidate) return;
|
|
3125
3407
|
matched = true;
|
|
3126
|
-
|
|
3408
|
+
logger11.success("captureLink.domHit", `DOM \u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: mutationCount=${mutationCount}, link=${candidate}`);
|
|
3127
3409
|
if (onMatch) {
|
|
3128
3410
|
onMatch({
|
|
3129
3411
|
link: candidate,
|
|
@@ -3139,7 +3421,7 @@ ${text}`;
|
|
|
3139
3421
|
return {
|
|
3140
3422
|
stop: async () => {
|
|
3141
3423
|
const result = await monitor.stop();
|
|
3142
|
-
|
|
3424
|
+
logger11.info(`DOM \u76D1\u542C\u5DF2\u505C\u6B62: totalMutations=${result?.totalMutations || 0}`);
|
|
3143
3425
|
return result;
|
|
3144
3426
|
}
|
|
3145
3427
|
};
|
|
@@ -3179,8 +3461,8 @@ var Share = {
|
|
|
3179
3461
|
if (share.mode === "response" && apiMatchers.length === 0) {
|
|
3180
3462
|
throw new Error("Share.captureLink requires share.xurl[0] api matcher when mode=response");
|
|
3181
3463
|
}
|
|
3182
|
-
|
|
3183
|
-
|
|
3464
|
+
logger11.start("captureLink", `mode=${share.mode}, timeoutMs=${timeoutMs}, prefix=${share.prefix}`);
|
|
3465
|
+
logger11.info(`captureLink \u914D\u7F6E: xurl=${toJsonInline(share.xurl)}, domMode=${domMode}, domSelectors=${toJsonInline(domSelectors, 120)}`);
|
|
3184
3466
|
const stats = {
|
|
3185
3467
|
actionTimedOut: false,
|
|
3186
3468
|
domMutationCount: 0,
|
|
@@ -3205,7 +3487,7 @@ var Share = {
|
|
|
3205
3487
|
link: validated,
|
|
3206
3488
|
payloadText: String(payloadText || "")
|
|
3207
3489
|
};
|
|
3208
|
-
|
|
3490
|
+
logger11.info(`\u5019\u9009\u94FE\u63A5\u5DF2\u786E\u8BA4: source=${source}, link=${validated}`);
|
|
3209
3491
|
return true;
|
|
3210
3492
|
};
|
|
3211
3493
|
const resolveResponseCandidate = (responseText) => {
|
|
@@ -3240,7 +3522,7 @@ var Share = {
|
|
|
3240
3522
|
try {
|
|
3241
3523
|
await monitor.stop();
|
|
3242
3524
|
} catch (error) {
|
|
3243
|
-
|
|
3525
|
+
logger11.warning(`\u505C\u6B62 DOM \u76D1\u542C\u5931\u8D25: ${error instanceof Error ? error.message : String(error)}`);
|
|
3244
3526
|
}
|
|
3245
3527
|
};
|
|
3246
3528
|
const onResponse = async (response) => {
|
|
@@ -3253,29 +3535,29 @@ var Share = {
|
|
|
3253
3535
|
stats.responseSampleUrls.push(url);
|
|
3254
3536
|
}
|
|
3255
3537
|
if (stats.responseObserved <= 5) {
|
|
3256
|
-
|
|
3538
|
+
logger11.info(`\u63A5\u53E3\u54CD\u5E94\u91C7\u6837(${stats.responseObserved}): ${url}`);
|
|
3257
3539
|
}
|
|
3258
3540
|
if (!apiMatchers.some((matcher) => url.includes(matcher))) return;
|
|
3259
3541
|
stats.responseMatched += 1;
|
|
3260
3542
|
stats.lastMatchedUrl = url;
|
|
3261
|
-
|
|
3543
|
+
logger11.info(`\u63A5\u53E3\u547D\u4E2D\u5339\u914D(${stats.responseMatched}): ${url}`);
|
|
3262
3544
|
const text = await response.text();
|
|
3263
3545
|
const hit = resolveResponseCandidate(text);
|
|
3264
3546
|
if (!hit?.link) {
|
|
3265
3547
|
if (stats.responseMatched <= 3) {
|
|
3266
|
-
|
|
3548
|
+
logger11.info(`\u63A5\u53E3\u89E3\u6790\u5B8C\u6210\u4F46\u672A\u63D0\u53D6\u5230\u5206\u4EAB\u94FE\u63A5: payloadSize=${text.length}`);
|
|
3267
3549
|
}
|
|
3268
3550
|
return;
|
|
3269
3551
|
}
|
|
3270
3552
|
stats.responseResolved += 1;
|
|
3271
|
-
|
|
3553
|
+
logger11.success("captureLink.responseHit", `\u63A5\u53E3\u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: url=${url}, link=${hit.link}`);
|
|
3272
3554
|
setCandidate("response", hit.link, hit.payloadText);
|
|
3273
3555
|
} catch (error) {
|
|
3274
|
-
|
|
3556
|
+
logger11.warning(`\u63A5\u53E3\u54CD\u5E94\u5904\u7406\u5F02\u5E38: ${error instanceof Error ? error.message : String(error)}`);
|
|
3275
3557
|
}
|
|
3276
3558
|
};
|
|
3277
3559
|
if (share.mode === "dom") {
|
|
3278
|
-
|
|
3560
|
+
logger11.info("\u5F53\u524D\u4E3A DOM \u6A21\u5F0F\uFF0C\u4EC5\u542F\u7528 DOM \u76D1\u542C");
|
|
3279
3561
|
domMonitor = await createDomShareMonitor(page, {
|
|
3280
3562
|
prefix: share.prefix,
|
|
3281
3563
|
selectors: domSelectors,
|
|
@@ -3290,14 +3572,14 @@ var Share = {
|
|
|
3290
3572
|
});
|
|
3291
3573
|
}
|
|
3292
3574
|
if (share.mode === "response") {
|
|
3293
|
-
|
|
3575
|
+
logger11.info(`\u5F53\u524D\u4E3A\u63A5\u53E3\u6A21\u5F0F\uFF0C\u6302\u8F7D response \u76D1\u542C: apiMatchers=${toJsonInline(apiMatchers, 160)}`);
|
|
3294
3576
|
page.on("response", onResponse);
|
|
3295
3577
|
}
|
|
3296
3578
|
const deadline = Date.now() + timeoutMs;
|
|
3297
3579
|
const getRemainingMs = () => Math.max(0, deadline - Date.now());
|
|
3298
3580
|
try {
|
|
3299
3581
|
const actionTimeout = getRemainingMs();
|
|
3300
|
-
|
|
3582
|
+
logger11.start("captureLink.performActions", `\u6267\u884C\u52A8\u4F5C\u9884\u7B97=${actionTimeout}ms`);
|
|
3301
3583
|
if (actionTimeout > 0) {
|
|
3302
3584
|
let timer = null;
|
|
3303
3585
|
let actionError = null;
|
|
@@ -3311,21 +3593,21 @@ var Share = {
|
|
|
3311
3593
|
const actionResult = await Promise.race([actionPromise, timeoutPromise]);
|
|
3312
3594
|
if (timer) clearTimeout(timer);
|
|
3313
3595
|
if (actionResult === "__ACTION_ERROR__") {
|
|
3314
|
-
|
|
3596
|
+
logger11.fail("captureLink.performActions", actionError);
|
|
3315
3597
|
throw actionError;
|
|
3316
3598
|
}
|
|
3317
3599
|
if (actionResult === "__ACTION_TIMEOUT__") {
|
|
3318
3600
|
stats.actionTimedOut = true;
|
|
3319
|
-
|
|
3601
|
+
logger11.warning(`performActions \u5DF2\u8D85\u65F6 (${actionTimeout}ms)\uFF0C\u52A8\u4F5C\u53EF\u80FD\u4ECD\u5728\u5F02\u6B65\u6267\u884C`);
|
|
3320
3602
|
} else {
|
|
3321
|
-
|
|
3603
|
+
logger11.success("captureLink.performActions", "\u6267\u884C\u52A8\u4F5C\u5B8C\u6210");
|
|
3322
3604
|
}
|
|
3323
3605
|
}
|
|
3324
3606
|
let nextProgressLogTs = Date.now() + 3e3;
|
|
3325
3607
|
while (true) {
|
|
3326
3608
|
const selected = share.mode === "dom" ? candidates.dom : candidates.response;
|
|
3327
3609
|
if (selected?.link) {
|
|
3328
|
-
|
|
3610
|
+
logger11.success("captureLink", `\u6355\u83B7\u6210\u529F: source=${share.mode}, link=${selected.link}`);
|
|
3329
3611
|
return {
|
|
3330
3612
|
link: selected.link,
|
|
3331
3613
|
payloadText: selected.payloadText,
|
|
@@ -3337,7 +3619,7 @@ var Share = {
|
|
|
3337
3619
|
if (remaining <= 0) break;
|
|
3338
3620
|
const now = Date.now();
|
|
3339
3621
|
if (now >= nextProgressLogTs) {
|
|
3340
|
-
|
|
3622
|
+
logger11.info(
|
|
3341
3623
|
`captureLink \u7B49\u5F85\u4E2D: remaining=${remaining}ms, domMutationCount=${stats.domMutationCount}, responseMatched=${stats.responseMatched}`
|
|
3342
3624
|
);
|
|
3343
3625
|
nextProgressLogTs = now + 5e3;
|
|
@@ -3345,11 +3627,11 @@ var Share = {
|
|
|
3345
3627
|
await (0, import_delay2.default)(Math.max(0, Math.min(DEFAULT_POLL_INTERVAL_MS, remaining)));
|
|
3346
3628
|
}
|
|
3347
3629
|
if (share.mode === "response" && stats.responseMatched === 0) {
|
|
3348
|
-
|
|
3630
|
+
logger11.warning(
|
|
3349
3631
|
`\u63A5\u53E3\u76D1\u542C\u672A\u547D\u4E2D: apiMatchers=${toJsonInline(apiMatchers, 220)}, \u54CD\u5E94\u6837\u672CURLs=${toJsonInline(stats.responseSampleUrls, 420)}`
|
|
3350
3632
|
);
|
|
3351
3633
|
}
|
|
3352
|
-
|
|
3634
|
+
logger11.warning(
|
|
3353
3635
|
`captureLink \u8D85\u65F6\u672A\u62FF\u5230\u94FE\u63A5: mode=${share.mode}, actionTimedOut=${stats.actionTimedOut}, domMutationCount=${stats.domMutationCount}, responseObserved=${stats.responseObserved}, responseMatched=${stats.responseMatched}, lastMatchedUrl=${stats.lastMatchedUrl || "none"}`
|
|
3354
3636
|
);
|
|
3355
3637
|
return {
|
|
@@ -3361,7 +3643,7 @@ var Share = {
|
|
|
3361
3643
|
} finally {
|
|
3362
3644
|
if (share.mode === "response") {
|
|
3363
3645
|
page.off("response", onResponse);
|
|
3364
|
-
|
|
3646
|
+
logger11.info("response \u76D1\u542C\u5DF2\u5378\u8F7D");
|
|
3365
3647
|
}
|
|
3366
3648
|
await stopDomMonitor();
|
|
3367
3649
|
}
|