@skrillex1224/playwright-toolkit 3.0.37 → 3.0.39
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 +39 -105
- package/dist/browser.js.map +4 -4
- package/dist/index.cjs +248 -282
- package/dist/index.cjs.map +4 -4
- package/dist/index.js +248 -282
- package/dist/index.js.map +4 -4
- package/index.d.ts +0 -7
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -227,7 +227,7 @@ var ActorInfo = {
|
|
|
227
227
|
erine: createActorInfo({
|
|
228
228
|
key: "erine",
|
|
229
229
|
name: "\u6587\u5FC3\u4E00\u8A00",
|
|
230
|
-
domain: "
|
|
230
|
+
domain: "xiaoyan.baidu.com",
|
|
231
231
|
path: "/",
|
|
232
232
|
share: {
|
|
233
233
|
mode: "custom",
|
|
@@ -377,18 +377,18 @@ var fallbackLog = {
|
|
|
377
377
|
error: (...args) => console.error(...args),
|
|
378
378
|
debug: (...args) => console.debug ? console.debug(...args) : console.log(...args)
|
|
379
379
|
};
|
|
380
|
-
var resolveLogMethod = (
|
|
381
|
-
if (
|
|
382
|
-
return
|
|
380
|
+
var resolveLogMethod = (logger17, name) => {
|
|
381
|
+
if (logger17 && typeof logger17[name] === "function") {
|
|
382
|
+
return logger17[name].bind(logger17);
|
|
383
383
|
}
|
|
384
|
-
if (name === "warning" &&
|
|
385
|
-
return
|
|
384
|
+
if (name === "warning" && logger17 && typeof logger17.warn === "function") {
|
|
385
|
+
return logger17.warn.bind(logger17);
|
|
386
386
|
}
|
|
387
387
|
return fallbackLog[name];
|
|
388
388
|
};
|
|
389
389
|
var defaultLogger = null;
|
|
390
|
-
var setDefaultLogger = (
|
|
391
|
-
defaultLogger =
|
|
390
|
+
var setDefaultLogger = (logger17) => {
|
|
391
|
+
defaultLogger = logger17;
|
|
392
392
|
};
|
|
393
393
|
var resolveLogger = (explicitLogger) => {
|
|
394
394
|
if (explicitLogger && typeof explicitLogger.info === "function") {
|
|
@@ -415,8 +415,8 @@ var colorize = (text, color) => {
|
|
|
415
415
|
var createBaseLogger = (prefix = "", explicitLogger) => {
|
|
416
416
|
const name = prefix ? String(prefix) : "";
|
|
417
417
|
const dispatch = (methodName, icon, message, color) => {
|
|
418
|
-
const
|
|
419
|
-
const logFn = resolveLogMethod(
|
|
418
|
+
const logger17 = resolveLogger(explicitLogger);
|
|
419
|
+
const logFn = resolveLogMethod(logger17, methodName);
|
|
420
420
|
const timestamp = colorize(`[${formatTimestamp()}]`, ANSI.gray);
|
|
421
421
|
const line = formatLine(name, icon, message);
|
|
422
422
|
const coloredLine = colorize(line, color);
|
|
@@ -1593,16 +1593,12 @@ var ProxyMeterRuntime = {
|
|
|
1593
1593
|
getProxyMeterSnapshot
|
|
1594
1594
|
};
|
|
1595
1595
|
|
|
1596
|
-
// src/runtime-env.js
|
|
1597
|
-
import picomatch from "picomatch";
|
|
1598
|
-
|
|
1599
1596
|
// src/internals/constants.js
|
|
1600
1597
|
var PageRuntimeStateKey = "__playwright_toolkit_runtime_state__";
|
|
1601
1598
|
|
|
1602
1599
|
// src/runtime-env.js
|
|
1603
1600
|
var BROWSER_PROFILE_SCHEMA_VERSION = 1;
|
|
1604
1601
|
var SUPPORTED_CLOAK_FINGERPRINT_PLATFORMS = /* @__PURE__ */ new Set(["linux", "macos", "windows"]);
|
|
1605
|
-
var logger3 = createInternalLogger("RuntimeEnv");
|
|
1606
1602
|
var rememberedRuntimeState = null;
|
|
1607
1603
|
var isPlainObject = (value) => value && typeof value === "object" && !Array.isArray(value);
|
|
1608
1604
|
var normalizeKnownDevice = (value) => {
|
|
@@ -1759,18 +1755,6 @@ var uniqueStrings = (value) => {
|
|
|
1759
1755
|
});
|
|
1760
1756
|
return result;
|
|
1761
1757
|
};
|
|
1762
|
-
var buildApplyExcludeMatcher = (patterns = []) => {
|
|
1763
|
-
const normalized = (Array.isArray(patterns) ? patterns : []).map((pattern) => String(pattern || "").trim()).filter(Boolean);
|
|
1764
|
-
return normalized.length > 0 ? picomatch(normalized, { nocase: true }) : () => false;
|
|
1765
|
-
};
|
|
1766
|
-
var filterApplyEntries = (entries = {}, matcher = () => false) => Object.entries(entries || {}).reduce((acc, [key, value]) => {
|
|
1767
|
-
if (matcher(key)) acc.skipped.push(key);
|
|
1768
|
-
else acc.payload[key] = value;
|
|
1769
|
-
return acc;
|
|
1770
|
-
}, { payload: {}, skipped: [] });
|
|
1771
|
-
var logApplySkipped = (type, keys = []) => {
|
|
1772
|
-
if (keys.length > 0) logger3.info(`applyToPage \u8DF3\u8FC7\u6CE8\u5165 ${type}: ${keys.join(", ")}`);
|
|
1773
|
-
};
|
|
1774
1758
|
var normalizeHttpUrlList = (value) => uniqueStrings(
|
|
1775
1759
|
(Array.isArray(value) ? value : [value]).map((item) => normalizeHttpUrl(item)).filter(Boolean)
|
|
1776
1760
|
);
|
|
@@ -2242,24 +2226,9 @@ var RuntimeEnv = {
|
|
|
2242
2226
|
writable: true,
|
|
2243
2227
|
value: state2
|
|
2244
2228
|
});
|
|
2245
|
-
const
|
|
2246
|
-
const
|
|
2247
|
-
|
|
2248
|
-
buildApplyExcludeMatcher(exclude.local_storage)
|
|
2249
|
-
);
|
|
2250
|
-
const sessionStorageResult = filterApplyEntries(
|
|
2251
|
-
state2.sessionStorage || {},
|
|
2252
|
-
buildApplyExcludeMatcher(exclude.session_storage)
|
|
2253
|
-
);
|
|
2254
|
-
const cookieMatcher = buildApplyExcludeMatcher(exclude.cookies);
|
|
2255
|
-
const skippedCookies = [];
|
|
2256
|
-
const localStorage = localStorageResult.payload;
|
|
2257
|
-
const sessionStorage = sessionStorageResult.payload;
|
|
2258
|
-
const cookies = (state2.cookies || []).filter((cookie) => {
|
|
2259
|
-
if (!cookieMatcher(cookie?.name)) return true;
|
|
2260
|
-
skippedCookies.push(cookie.name);
|
|
2261
|
-
return false;
|
|
2262
|
-
}).map((cookie) => {
|
|
2229
|
+
const localStorage = state2.localStorage || {};
|
|
2230
|
+
const sessionStorage = state2.sessionStorage || {};
|
|
2231
|
+
const cookies = (state2.cookies || []).map((cookie) => {
|
|
2263
2232
|
const normalized = { ...cookie };
|
|
2264
2233
|
if (!normalized.path) {
|
|
2265
2234
|
normalized.path = "/";
|
|
@@ -2269,9 +2238,6 @@ var RuntimeEnv = {
|
|
|
2269
2238
|
}
|
|
2270
2239
|
return normalized;
|
|
2271
2240
|
}).filter(Boolean);
|
|
2272
|
-
logApplySkipped("cookies", skippedCookies);
|
|
2273
|
-
logApplySkipped("local_storage", localStorageResult.skipped);
|
|
2274
|
-
logApplySkipped("session_storage", sessionStorageResult.skipped);
|
|
2275
2241
|
if (cookies.length > 0) {
|
|
2276
2242
|
await page.context().addCookies(cookies);
|
|
2277
2243
|
}
|
|
@@ -2331,7 +2297,7 @@ var RuntimeEnv = {
|
|
|
2331
2297
|
};
|
|
2332
2298
|
|
|
2333
2299
|
// src/apify-kit.js
|
|
2334
|
-
var
|
|
2300
|
+
var logger3 = createInternalLogger("ApifyKit");
|
|
2335
2301
|
var hasFleetAtHomeFlag = () => String(process.env.FLEET_AT_HOME || "").trim() !== "";
|
|
2336
2302
|
var resolveRuntimeContext = (input) => {
|
|
2337
2303
|
const rememberedState = RuntimeEnv.peekRememberedState();
|
|
@@ -2417,7 +2383,7 @@ var captureAutoEnvPatch = async (page, runtimeContext) => {
|
|
|
2417
2383
|
{ actor: runtimeContext.actor }
|
|
2418
2384
|
);
|
|
2419
2385
|
} catch (error) {
|
|
2420
|
-
|
|
2386
|
+
logger3.warn(`\u81EA\u52A8\u91C7\u96C6 env_patch \u5931\u8D25: ${error?.message || error}`);
|
|
2421
2387
|
return null;
|
|
2422
2388
|
}
|
|
2423
2389
|
};
|
|
@@ -2462,29 +2428,29 @@ async function createApifyKit() {
|
|
|
2462
2428
|
const { times: retryTimes = 0, mode: retryMode = "direct", before: beforeRetry } = retry;
|
|
2463
2429
|
const executeAction = async (attemptNumber) => {
|
|
2464
2430
|
const attemptLabel = attemptNumber > 0 ? ` (\u91CD\u8BD5 #${attemptNumber})` : "";
|
|
2465
|
-
|
|
2431
|
+
logger3.start(`[Step] ${step}${attemptLabel}`);
|
|
2466
2432
|
try {
|
|
2467
2433
|
const result = await actionFn();
|
|
2468
|
-
|
|
2434
|
+
logger3.success(`[Step] ${step}${attemptLabel}`);
|
|
2469
2435
|
return { success: true, result };
|
|
2470
2436
|
} catch (error) {
|
|
2471
|
-
|
|
2437
|
+
logger3.fail(`[Step] ${step}${attemptLabel}`, error);
|
|
2472
2438
|
return { success: false, error };
|
|
2473
2439
|
}
|
|
2474
2440
|
};
|
|
2475
2441
|
const prepareForRetry = async (attemptNumber) => {
|
|
2476
2442
|
if (typeof beforeRetry === "function") {
|
|
2477
|
-
|
|
2443
|
+
logger3.start(`[RetryStep] \u6267\u884C\u81EA\u5B9A\u4E49 before \u94A9\u5B50 (\u7B2C ${attemptNumber} \u6B21\u91CD\u8BD5)`);
|
|
2478
2444
|
await beforeRetry(page, attemptNumber);
|
|
2479
|
-
|
|
2445
|
+
logger3.success(`[RetryStep] before \u94A9\u5B50\u5B8C\u6210`);
|
|
2480
2446
|
} else if (retryMode === "refresh") {
|
|
2481
|
-
|
|
2447
|
+
logger3.start(`[RetryStep] \u5237\u65B0\u9875\u9762 (\u7B2C ${attemptNumber} \u6B21\u91CD\u8BD5)`);
|
|
2482
2448
|
await page.reload({ waitUntil: "commit" });
|
|
2483
|
-
|
|
2449
|
+
logger3.success(`[RetryStep] \u9875\u9762\u5237\u65B0\u5B8C\u6210`);
|
|
2484
2450
|
} else {
|
|
2485
|
-
|
|
2451
|
+
logger3.start(`[RetryStep] \u7B49\u5F85 3 \u79D2 (\u7B2C ${attemptNumber} \u6B21\u91CD\u8BD5)`);
|
|
2486
2452
|
await new Promise((resolve) => setTimeout(resolve, 3e3));
|
|
2487
|
-
|
|
2453
|
+
logger3.success(`[RetryStep] \u7B49\u5F85\u5B8C\u6210`);
|
|
2488
2454
|
}
|
|
2489
2455
|
};
|
|
2490
2456
|
let lastResult = await executeAction(0);
|
|
@@ -2492,11 +2458,11 @@ async function createApifyKit() {
|
|
|
2492
2458
|
return lastResult.result;
|
|
2493
2459
|
}
|
|
2494
2460
|
for (let attempt = 1; attempt <= retryTimes; attempt++) {
|
|
2495
|
-
|
|
2461
|
+
logger3.start(`[RetryStep] \u51C6\u5907\u7B2C ${attempt}/${retryTimes} \u6B21\u91CD\u8BD5: ${step}`);
|
|
2496
2462
|
try {
|
|
2497
2463
|
await prepareForRetry(attempt);
|
|
2498
2464
|
} catch (prepareError) {
|
|
2499
|
-
|
|
2465
|
+
logger3.warn(`[RetryStep] \u91CD\u8BD5\u51C6\u5907\u5931\u8D25: ${prepareError.message}`);
|
|
2500
2466
|
continue;
|
|
2501
2467
|
}
|
|
2502
2468
|
lastResult = await executeAction(attempt);
|
|
@@ -2512,7 +2478,7 @@ async function createApifyKit() {
|
|
|
2512
2478
|
try {
|
|
2513
2479
|
html = await page.content();
|
|
2514
2480
|
} catch (htmlErr) {
|
|
2515
|
-
|
|
2481
|
+
logger3.warn(`HTML \u91C7\u96C6\u5931\u8D25: ${htmlErr.message}`);
|
|
2516
2482
|
}
|
|
2517
2483
|
}
|
|
2518
2484
|
try {
|
|
@@ -2525,7 +2491,7 @@ async function createApifyKit() {
|
|
|
2525
2491
|
base64 = `data:image/jpeg;base64,${buffer.toString("base64")}`;
|
|
2526
2492
|
}
|
|
2527
2493
|
} catch (snapErr) {
|
|
2528
|
-
|
|
2494
|
+
logger3.warn(`\u622A\u56FE\u751F\u6210\u5931\u8D25: ${snapErr.message}`);
|
|
2529
2495
|
}
|
|
2530
2496
|
await this.pushFailed(
|
|
2531
2497
|
finalError,
|
|
@@ -2598,7 +2564,7 @@ async function createApifyKit() {
|
|
|
2598
2564
|
await Actor2.pushData({
|
|
2599
2565
|
...payload
|
|
2600
2566
|
});
|
|
2601
|
-
|
|
2567
|
+
logger3.success("pushSuccess", "Data pushed");
|
|
2602
2568
|
},
|
|
2603
2569
|
/**
|
|
2604
2570
|
* 推送失败数据的通用方法(私有方法,仅供 runStep 内部使用)。
|
|
@@ -2639,7 +2605,7 @@ async function createApifyKit() {
|
|
|
2639
2605
|
await Actor2.pushData({
|
|
2640
2606
|
...payload
|
|
2641
2607
|
});
|
|
2642
|
-
|
|
2608
|
+
logger3.success("pushFailed", "Error data pushed");
|
|
2643
2609
|
}
|
|
2644
2610
|
};
|
|
2645
2611
|
}
|
|
@@ -2655,7 +2621,7 @@ var ApifyKit = {
|
|
|
2655
2621
|
};
|
|
2656
2622
|
|
|
2657
2623
|
// src/internals/utils.js
|
|
2658
|
-
var
|
|
2624
|
+
var logger4 = createInternalLogger("InternalUtils");
|
|
2659
2625
|
var parseCookies = (cookieString, domain) => {
|
|
2660
2626
|
const cookies = [];
|
|
2661
2627
|
const pairs = cookieString.split(";").map((c) => c.trim());
|
|
@@ -2673,7 +2639,7 @@ var parseCookies = (cookieString, domain) => {
|
|
|
2673
2639
|
cookies.push(cookie);
|
|
2674
2640
|
}
|
|
2675
2641
|
}
|
|
2676
|
-
|
|
2642
|
+
logger4.success("parseCookies", `parsed ${cookies.length} cookies`);
|
|
2677
2643
|
return cookies;
|
|
2678
2644
|
};
|
|
2679
2645
|
|
|
@@ -3511,7 +3477,7 @@ import delay4 from "delay";
|
|
|
3511
3477
|
// src/internals/humanize/desktop.js
|
|
3512
3478
|
import delay2 from "delay";
|
|
3513
3479
|
import { createCursor } from "ghost-cursor-playwright";
|
|
3514
|
-
var
|
|
3480
|
+
var logger5 = createInternalLogger("Humanize");
|
|
3515
3481
|
var $CursorWeakMap = /* @__PURE__ */ new WeakMap();
|
|
3516
3482
|
function $GetCursor(page) {
|
|
3517
3483
|
const cursor = $CursorWeakMap.get(page);
|
|
@@ -3539,13 +3505,13 @@ var Humanize = {
|
|
|
3539
3505
|
*/
|
|
3540
3506
|
async initializeCursor(page) {
|
|
3541
3507
|
if ($CursorWeakMap.has(page)) {
|
|
3542
|
-
|
|
3508
|
+
logger5.debug("initializeCursor: cursor already exists, skipping");
|
|
3543
3509
|
return;
|
|
3544
3510
|
}
|
|
3545
|
-
|
|
3511
|
+
logger5.start("initializeCursor", "creating cursor");
|
|
3546
3512
|
const cursor = await createCursor(page);
|
|
3547
3513
|
$CursorWeakMap.set(page, cursor);
|
|
3548
|
-
|
|
3514
|
+
logger5.success("initializeCursor", "cursor initialized");
|
|
3549
3515
|
},
|
|
3550
3516
|
/**
|
|
3551
3517
|
* 人类化鼠标移动 - 使用 ghost-cursor 移动到指定位置或元素
|
|
@@ -3555,17 +3521,17 @@ var Humanize = {
|
|
|
3555
3521
|
*/
|
|
3556
3522
|
async humanMove(page, target) {
|
|
3557
3523
|
const cursor = $GetCursor(page);
|
|
3558
|
-
|
|
3524
|
+
logger5.start("humanMove", `target=${typeof target === "string" ? target : "element/coords"}`);
|
|
3559
3525
|
try {
|
|
3560
3526
|
if (typeof target === "string") {
|
|
3561
3527
|
const element = await page.$(target);
|
|
3562
3528
|
if (!element) {
|
|
3563
|
-
|
|
3529
|
+
logger5.warn(`humanMove: \u5143\u7D20\u4E0D\u5B58\u5728 ${target}`);
|
|
3564
3530
|
return false;
|
|
3565
3531
|
}
|
|
3566
3532
|
const box = await element.boundingBox();
|
|
3567
3533
|
if (!box) {
|
|
3568
|
-
|
|
3534
|
+
logger5.warn(`humanMove: \u65E0\u6CD5\u83B7\u53D6\u4F4D\u7F6E ${target}`);
|
|
3569
3535
|
return false;
|
|
3570
3536
|
}
|
|
3571
3537
|
const x = box.x + box.width / 2 + (Math.random() - 0.5) * box.width * 0.2;
|
|
@@ -3581,10 +3547,10 @@ var Humanize = {
|
|
|
3581
3547
|
await cursor.actions.move({ x, y });
|
|
3582
3548
|
}
|
|
3583
3549
|
}
|
|
3584
|
-
|
|
3550
|
+
logger5.success("humanMove");
|
|
3585
3551
|
return true;
|
|
3586
3552
|
} catch (error) {
|
|
3587
|
-
|
|
3553
|
+
logger5.fail("humanMove", error);
|
|
3588
3554
|
throw error;
|
|
3589
3555
|
}
|
|
3590
3556
|
},
|
|
@@ -3608,12 +3574,12 @@ var Humanize = {
|
|
|
3608
3574
|
maxDurationMs = maxSteps * 220 + 800
|
|
3609
3575
|
} = options;
|
|
3610
3576
|
const targetDesc = typeof target === "string" ? target : "ElementHandle";
|
|
3611
|
-
|
|
3577
|
+
logger5.start("humanScroll", `target=${targetDesc}`);
|
|
3612
3578
|
let element;
|
|
3613
3579
|
if (typeof target === "string") {
|
|
3614
3580
|
element = await page.$(target);
|
|
3615
3581
|
if (!element) {
|
|
3616
|
-
|
|
3582
|
+
logger5.warn(`humanScroll | \u5143\u7D20\u672A\u627E\u5230: ${target}`);
|
|
3617
3583
|
return { element: null, didScroll: false };
|
|
3618
3584
|
}
|
|
3619
3585
|
} else {
|
|
@@ -3688,26 +3654,26 @@ var Humanize = {
|
|
|
3688
3654
|
try {
|
|
3689
3655
|
for (let i = 0; i < maxSteps; i++) {
|
|
3690
3656
|
if (Date.now() - startTime > maxDurationMs) {
|
|
3691
|
-
|
|
3657
|
+
logger5.warn(`humanScroll | \u8D85\u65F6\u4FDD\u62A4\u89E6\u53D1 (${maxDurationMs}ms)`);
|
|
3692
3658
|
return { element, didScroll };
|
|
3693
3659
|
}
|
|
3694
3660
|
const status = await checkVisibility();
|
|
3695
3661
|
if (status.code === "VISIBLE") {
|
|
3696
3662
|
if (status.isFixed) {
|
|
3697
|
-
|
|
3663
|
+
logger5.info("humanScroll | fixed \u5BB9\u5668\u5185\uFF0C\u8DF3\u8FC7\u6EDA\u52A8");
|
|
3698
3664
|
} else {
|
|
3699
|
-
|
|
3665
|
+
logger5.debug("humanScroll | \u5143\u7D20\u53EF\u89C1\u4E14\u65E0\u906E\u6321");
|
|
3700
3666
|
}
|
|
3701
|
-
|
|
3667
|
+
logger5.success("humanScroll", didScroll ? "\u5DF2\u6EDA\u52A8" : "\u65E0\u9700\u6EDA\u52A8");
|
|
3702
3668
|
return { element, didScroll };
|
|
3703
3669
|
}
|
|
3704
|
-
|
|
3670
|
+
logger5.debug(`humanScroll | \u6B65\u9AA4 ${i + 1}/${maxSteps}: ${status.reason} ${status.direction ? `(${status.direction})` : ""}`);
|
|
3705
3671
|
if (status.code === "OBSTRUCTED" && status.obstruction) {
|
|
3706
|
-
|
|
3672
|
+
logger5.debug(`humanScroll | \u88AB\u4EE5\u4E0B\u5143\u7D20\u906E\u6321 <${status.obstruction.tag} id="${status.obstruction.id}">`);
|
|
3707
3673
|
}
|
|
3708
3674
|
const scrollRect = await getScrollableRect2();
|
|
3709
3675
|
if (!scrollRect && status.isFixed) {
|
|
3710
|
-
|
|
3676
|
+
logger5.warn("humanScroll | fixed \u5BB9\u5668\u5185\u4E14\u65E0\u53EF\u6EDA\u52A8\u7956\u5148\uFF0C\u8DF3\u8FC7\u6EDA\u52A8");
|
|
3711
3677
|
return { element, didScroll };
|
|
3712
3678
|
}
|
|
3713
3679
|
const stepMin = scrollRect ? Math.min(minStep, Math.max(60, scrollRect.height * 0.4)) : minStep;
|
|
@@ -3743,10 +3709,10 @@ var Humanize = {
|
|
|
3743
3709
|
didScroll = true;
|
|
3744
3710
|
await delay2(this.jitterMs(20 + Math.random() * 40, 0.2));
|
|
3745
3711
|
}
|
|
3746
|
-
|
|
3712
|
+
logger5.warn(`humanScroll | \u5728 ${maxSteps} \u6B65\u540E\u65E0\u6CD5\u786E\u4FDD\u53EF\u89C1\u6027`);
|
|
3747
3713
|
return { element, didScroll };
|
|
3748
3714
|
} catch (error) {
|
|
3749
|
-
|
|
3715
|
+
logger5.fail("humanScroll", error);
|
|
3750
3716
|
throw error;
|
|
3751
3717
|
}
|
|
3752
3718
|
},
|
|
@@ -3764,7 +3730,7 @@ var Humanize = {
|
|
|
3764
3730
|
const cursor = $GetCursor(page);
|
|
3765
3731
|
const { reactionDelay = 250, throwOnMissing = true, scrollIfNeeded = true, restore = false } = options;
|
|
3766
3732
|
const targetDesc = target == null ? "Current Position" : typeof target === "string" ? target : "ElementHandle";
|
|
3767
|
-
|
|
3733
|
+
logger5.start("humanClick", `target=${targetDesc}`);
|
|
3768
3734
|
const restoreOnce = async () => {
|
|
3769
3735
|
if (restoreOnce.restored) return;
|
|
3770
3736
|
restoreOnce.restored = true;
|
|
@@ -3773,14 +3739,14 @@ var Humanize = {
|
|
|
3773
3739
|
await delay2(this.jitterMs(1e3));
|
|
3774
3740
|
await restoreOnce.do();
|
|
3775
3741
|
} catch (restoreError) {
|
|
3776
|
-
|
|
3742
|
+
logger5.warn(`humanClick: \u6062\u590D\u6EDA\u52A8\u4F4D\u7F6E\u5931\u8D25: ${restoreError.message}`);
|
|
3777
3743
|
}
|
|
3778
3744
|
};
|
|
3779
3745
|
try {
|
|
3780
3746
|
if (target == null) {
|
|
3781
3747
|
await delay2(this.jitterMs(reactionDelay, 0.4));
|
|
3782
3748
|
await cursor.actions.click();
|
|
3783
|
-
|
|
3749
|
+
logger5.success("humanClick", "Clicked current position");
|
|
3784
3750
|
return true;
|
|
3785
3751
|
}
|
|
3786
3752
|
let element;
|
|
@@ -3790,7 +3756,7 @@ var Humanize = {
|
|
|
3790
3756
|
if (throwOnMissing) {
|
|
3791
3757
|
throw new Error(`\u627E\u4E0D\u5230\u5143\u7D20 ${target}`);
|
|
3792
3758
|
}
|
|
3793
|
-
|
|
3759
|
+
logger5.warn(`humanClick: \u5143\u7D20\u4E0D\u5B58\u5728\uFF0C\u8DF3\u8FC7\u70B9\u51FB ${target}`);
|
|
3794
3760
|
return false;
|
|
3795
3761
|
}
|
|
3796
3762
|
} else {
|
|
@@ -3806,7 +3772,7 @@ var Humanize = {
|
|
|
3806
3772
|
if (throwOnMissing) {
|
|
3807
3773
|
throw new Error("\u65E0\u6CD5\u83B7\u53D6\u5143\u7D20\u4F4D\u7F6E");
|
|
3808
3774
|
}
|
|
3809
|
-
|
|
3775
|
+
logger5.warn("humanClick: \u65E0\u6CD5\u83B7\u53D6\u4F4D\u7F6E\uFF0C\u8DF3\u8FC7\u70B9\u51FB");
|
|
3810
3776
|
return false;
|
|
3811
3777
|
}
|
|
3812
3778
|
const x = box.x + box.width / 2 + (Math.random() - 0.5) * box.width * 0.3;
|
|
@@ -3815,11 +3781,11 @@ var Humanize = {
|
|
|
3815
3781
|
await delay2(this.jitterMs(reactionDelay, 0.4));
|
|
3816
3782
|
await cursor.actions.click();
|
|
3817
3783
|
await restoreOnce();
|
|
3818
|
-
|
|
3784
|
+
logger5.success("humanClick");
|
|
3819
3785
|
return true;
|
|
3820
3786
|
} catch (error) {
|
|
3821
3787
|
await restoreOnce();
|
|
3822
|
-
|
|
3788
|
+
logger5.fail("humanClick", error);
|
|
3823
3789
|
throw error;
|
|
3824
3790
|
}
|
|
3825
3791
|
},
|
|
@@ -3830,9 +3796,9 @@ var Humanize = {
|
|
|
3830
3796
|
*/
|
|
3831
3797
|
async randomSleep(baseMs, jitterPercent = 0.3) {
|
|
3832
3798
|
const ms = this.jitterMs(baseMs, jitterPercent);
|
|
3833
|
-
|
|
3799
|
+
logger5.start("randomSleep", `base=${baseMs}, actual=${ms}ms`);
|
|
3834
3800
|
await delay2(ms);
|
|
3835
|
-
|
|
3801
|
+
logger5.success("randomSleep");
|
|
3836
3802
|
},
|
|
3837
3803
|
/**
|
|
3838
3804
|
* 模拟人类"注视"或"阅读"行为:鼠标在页面上随机微动
|
|
@@ -3842,7 +3808,7 @@ var Humanize = {
|
|
|
3842
3808
|
async simulateGaze(page, baseDurationMs = 2500) {
|
|
3843
3809
|
const cursor = $GetCursor(page);
|
|
3844
3810
|
const durationMs = this.jitterMs(baseDurationMs, 0.4);
|
|
3845
|
-
|
|
3811
|
+
logger5.start("simulateGaze", `duration=${durationMs}ms`);
|
|
3846
3812
|
const startTime = Date.now();
|
|
3847
3813
|
const viewportSize = page.viewportSize() || { width: 1920, height: 1080 };
|
|
3848
3814
|
while (Date.now() - startTime < durationMs) {
|
|
@@ -3851,7 +3817,7 @@ var Humanize = {
|
|
|
3851
3817
|
await cursor.actions.move({ x, y });
|
|
3852
3818
|
await delay2(this.jitterMs(600, 0.5));
|
|
3853
3819
|
}
|
|
3854
|
-
|
|
3820
|
+
logger5.success("simulateGaze");
|
|
3855
3821
|
},
|
|
3856
3822
|
/**
|
|
3857
3823
|
* 人类化输入 - 带节奏变化(快-慢-停顿-偶尔加速)
|
|
@@ -3864,7 +3830,7 @@ var Humanize = {
|
|
|
3864
3830
|
* @param {number} [options.pauseBase=800] - 停顿时长基础值 (ms),实际 ±50% 抖动
|
|
3865
3831
|
*/
|
|
3866
3832
|
async humanType(page, selector, text, options = {}) {
|
|
3867
|
-
|
|
3833
|
+
logger5.start("humanType", `selector=${selector}, textLen=${text.length}`);
|
|
3868
3834
|
const {
|
|
3869
3835
|
baseDelay = 180,
|
|
3870
3836
|
pauseProbability = 0.08,
|
|
@@ -3888,13 +3854,13 @@ var Humanize = {
|
|
|
3888
3854
|
await delay2(charDelay);
|
|
3889
3855
|
if (Math.random() < pauseProbability && i < text.length - 1) {
|
|
3890
3856
|
const pauseTime = this.jitterMs(pauseBase, 0.5);
|
|
3891
|
-
|
|
3857
|
+
logger5.debug(`\u505C\u987F ${pauseTime}ms...`);
|
|
3892
3858
|
await delay2(pauseTime);
|
|
3893
3859
|
}
|
|
3894
3860
|
}
|
|
3895
|
-
|
|
3861
|
+
logger5.success("humanType");
|
|
3896
3862
|
} catch (error) {
|
|
3897
|
-
|
|
3863
|
+
logger5.fail("humanType", error);
|
|
3898
3864
|
throw error;
|
|
3899
3865
|
}
|
|
3900
3866
|
},
|
|
@@ -3918,7 +3884,7 @@ var Humanize = {
|
|
|
3918
3884
|
keyboardOptions = {}
|
|
3919
3885
|
} = pressOptions || {};
|
|
3920
3886
|
const targetDesc = hasTarget ? typeof targetOrKey === "string" ? targetOrKey : "ElementHandle" : "current focus";
|
|
3921
|
-
|
|
3887
|
+
logger5.start("humanPress", `key=${key}, target=${targetDesc}`);
|
|
3922
3888
|
try {
|
|
3923
3889
|
if (hasTarget) {
|
|
3924
3890
|
await this.humanClick(page, targetOrKey, { reactionDelay: focusDelay, scrollIfNeeded, throwOnMissing });
|
|
@@ -3928,10 +3894,10 @@ var Humanize = {
|
|
|
3928
3894
|
...keyboardOptions,
|
|
3929
3895
|
delay: this.jitterMs(holdDelay, 0.5)
|
|
3930
3896
|
});
|
|
3931
|
-
|
|
3897
|
+
logger5.success("humanPress");
|
|
3932
3898
|
return true;
|
|
3933
3899
|
} catch (error) {
|
|
3934
|
-
|
|
3900
|
+
logger5.fail("humanPress", error);
|
|
3935
3901
|
throw error;
|
|
3936
3902
|
}
|
|
3937
3903
|
},
|
|
@@ -3941,22 +3907,22 @@ var Humanize = {
|
|
|
3941
3907
|
* @param {string} selector - 输入框选择器
|
|
3942
3908
|
*/
|
|
3943
3909
|
async humanClear(page, selector) {
|
|
3944
|
-
|
|
3910
|
+
logger5.start("humanClear", `selector=${selector}`);
|
|
3945
3911
|
try {
|
|
3946
3912
|
const locator = page.locator(selector);
|
|
3947
3913
|
await locator.click();
|
|
3948
3914
|
await delay2(this.jitterMs(200, 0.4));
|
|
3949
3915
|
const currentValue = await locator.inputValue();
|
|
3950
3916
|
if (!currentValue || currentValue.length === 0) {
|
|
3951
|
-
|
|
3917
|
+
logger5.success("humanClear", "already empty");
|
|
3952
3918
|
return;
|
|
3953
3919
|
}
|
|
3954
3920
|
await page.keyboard.press("Meta+A");
|
|
3955
3921
|
await delay2(this.jitterMs(100, 0.4));
|
|
3956
3922
|
await page.keyboard.press("Backspace");
|
|
3957
|
-
|
|
3923
|
+
logger5.success("humanClear");
|
|
3958
3924
|
} catch (error) {
|
|
3959
|
-
|
|
3925
|
+
logger5.fail("humanClear", error);
|
|
3960
3926
|
throw error;
|
|
3961
3927
|
}
|
|
3962
3928
|
},
|
|
@@ -3968,7 +3934,7 @@ var Humanize = {
|
|
|
3968
3934
|
async warmUpBrowsing(page, baseDuration = 3500) {
|
|
3969
3935
|
const cursor = $GetCursor(page);
|
|
3970
3936
|
const durationMs = this.jitterMs(baseDuration, 0.4);
|
|
3971
|
-
|
|
3937
|
+
logger5.start("warmUpBrowsing", `duration=${durationMs}ms`);
|
|
3972
3938
|
const startTime = Date.now();
|
|
3973
3939
|
const viewportSize = page.viewportSize() || { width: 1920, height: 1080 };
|
|
3974
3940
|
try {
|
|
@@ -3987,9 +3953,9 @@ var Humanize = {
|
|
|
3987
3953
|
await delay2(this.jitterMs(800, 0.5));
|
|
3988
3954
|
}
|
|
3989
3955
|
}
|
|
3990
|
-
|
|
3956
|
+
logger5.success("warmUpBrowsing");
|
|
3991
3957
|
} catch (error) {
|
|
3992
|
-
|
|
3958
|
+
logger5.fail("warmUpBrowsing", error);
|
|
3993
3959
|
throw error;
|
|
3994
3960
|
}
|
|
3995
3961
|
},
|
|
@@ -4003,7 +3969,7 @@ var Humanize = {
|
|
|
4003
3969
|
async naturalScroll(page, direction = "down", distance = 300, baseSteps = 5) {
|
|
4004
3970
|
const steps = Math.max(3, baseSteps + Math.floor(Math.random() * 3) - 1);
|
|
4005
3971
|
const actualDistance = this.jitterMs(distance, 0.15);
|
|
4006
|
-
|
|
3972
|
+
logger5.start("naturalScroll", `dir=${direction}, dist=${actualDistance}, steps=${steps}`);
|
|
4007
3973
|
const sign = direction === "down" ? 1 : -1;
|
|
4008
3974
|
const stepDistance = actualDistance / steps;
|
|
4009
3975
|
try {
|
|
@@ -4015,9 +3981,9 @@ var Humanize = {
|
|
|
4015
3981
|
const baseDelay = 60 + i * 25;
|
|
4016
3982
|
await delay2(this.jitterMs(baseDelay, 0.3));
|
|
4017
3983
|
}
|
|
4018
|
-
|
|
3984
|
+
logger5.success("naturalScroll");
|
|
4019
3985
|
} catch (error) {
|
|
4020
|
-
|
|
3986
|
+
logger5.fail("naturalScroll", error);
|
|
4021
3987
|
throw error;
|
|
4022
3988
|
}
|
|
4023
3989
|
}
|
|
@@ -4046,7 +4012,7 @@ var resolveElement = async (page, target, { throwOnMissing = true } = {}) => {
|
|
|
4046
4012
|
var waitJitter = (base, jitterPercent = 0.3) => delay3(jitterMs(base, jitterPercent));
|
|
4047
4013
|
|
|
4048
4014
|
// src/internals/humanize/mobile.js
|
|
4049
|
-
var
|
|
4015
|
+
var logger6 = createInternalLogger("Humanize.Mobile");
|
|
4050
4016
|
var initializedPages = /* @__PURE__ */ new WeakSet();
|
|
4051
4017
|
var DEFAULT_TAP_TIMEOUT_MS = 2500;
|
|
4052
4018
|
var DEFAULT_MOUSE_TAP_FALLBACK_TIMEOUT_MS = 1200;
|
|
@@ -4503,7 +4469,7 @@ var dispatchTouchSwipe = async (page, deltaY, options = {}) => {
|
|
|
4503
4469
|
}
|
|
4504
4470
|
return true;
|
|
4505
4471
|
} catch (error) {
|
|
4506
|
-
|
|
4472
|
+
logger6.debug(`touch swipe fallback: ${error?.message || error}`);
|
|
4507
4473
|
try {
|
|
4508
4474
|
await page.evaluate((amount) => window.scrollBy(0, amount), deltaY);
|
|
4509
4475
|
await waitJitter(120, 0.35);
|
|
@@ -4537,7 +4503,7 @@ var tapPoint = async (page, point, options = {}) => {
|
|
|
4537
4503
|
);
|
|
4538
4504
|
return { method: "touchscreen" };
|
|
4539
4505
|
} catch (error) {
|
|
4540
|
-
|
|
4506
|
+
logger6.warn(`tapPoint | touchscreen.tap \u5931\u8D25\u6216\u8D85\u65F6\uFF0C\u5C1D\u8BD5\u9F20\u6807\u515C\u5E95: ${error?.message || error}`);
|
|
4541
4507
|
if (!allowMouseFallback) throw error;
|
|
4542
4508
|
}
|
|
4543
4509
|
}
|
|
@@ -4553,10 +4519,10 @@ var MobileHumanize = {
|
|
|
4553
4519
|
async initializeCursor(page) {
|
|
4554
4520
|
if (initializedPages.has(page)) return;
|
|
4555
4521
|
initializedPages.add(page);
|
|
4556
|
-
|
|
4522
|
+
logger6.debug("initializeCursor: mobile mode uses touch gestures, cursor init skipped");
|
|
4557
4523
|
},
|
|
4558
4524
|
async humanMove(page, target) {
|
|
4559
|
-
|
|
4525
|
+
logger6.debug(`humanMove: mobile no-op target=${typeof target === "string" ? target : "element/coords"}`);
|
|
4560
4526
|
if (typeof target === "string" || target && typeof target.boundingBox === "function") {
|
|
4561
4527
|
const element = await resolveElement(page, target, { throwOnMissing: false });
|
|
4562
4528
|
if (!element) {
|
|
@@ -4575,10 +4541,10 @@ var MobileHumanize = {
|
|
|
4575
4541
|
throwOnMissing = false
|
|
4576
4542
|
} = options;
|
|
4577
4543
|
const targetDesc = describeTarget(target);
|
|
4578
|
-
|
|
4544
|
+
logger6.start("humanScroll", `target=${targetDesc}`);
|
|
4579
4545
|
const element = await resolveElement(page, target, { throwOnMissing });
|
|
4580
4546
|
if (!element) {
|
|
4581
|
-
|
|
4547
|
+
logger6.warn(`humanScroll | \u5143\u7D20\u672A\u627E\u5230: ${targetDesc}`);
|
|
4582
4548
|
return { element: null, didScroll: false, restore: null };
|
|
4583
4549
|
}
|
|
4584
4550
|
const startTime = Date.now();
|
|
@@ -4587,42 +4553,42 @@ var MobileHumanize = {
|
|
|
4587
4553
|
const status = await checkElementVisibility(element);
|
|
4588
4554
|
if (status.code === "VISIBLE") {
|
|
4589
4555
|
if (status.isFixed) {
|
|
4590
|
-
|
|
4556
|
+
logger6.info("humanScroll | fixed/sticky \u5BB9\u5668\u5185\uFF0C\u8DF3\u8FC7\u6EDA\u52A8");
|
|
4591
4557
|
} else {
|
|
4592
|
-
|
|
4558
|
+
logger6.debug("humanScroll | \u5143\u7D20\u53EF\u89C1\u4E14\u65E0\u906E\u6321");
|
|
4593
4559
|
}
|
|
4594
|
-
|
|
4560
|
+
logger6.success("humanScroll", didScroll ? "\u5DF2\u6EDA\u52A8" : "\u65E0\u9700\u6EDA\u52A8");
|
|
4595
4561
|
return { element, didScroll, restore: null };
|
|
4596
4562
|
}
|
|
4597
4563
|
if (status.code === "ZERO_DIMENSIONS" || status.code === "NOT_INTERACTABLE") {
|
|
4598
|
-
|
|
4564
|
+
logger6.warn(`humanScroll | \u5143\u7D20\u4E0D\u53EF\u6EDA\u52A8\u81F3\u53EF\u70B9\u51FB\u72B6\u6001: ${status.reason || status.code}`);
|
|
4599
4565
|
return { element, didScroll, restore: null };
|
|
4600
4566
|
}
|
|
4601
4567
|
const scrollRect = await getScrollableRect(element);
|
|
4602
4568
|
if (!scrollRect && status.isFixed && status.code === "OUT_OF_VIEWPORT") {
|
|
4603
|
-
|
|
4569
|
+
logger6.warn(`humanScroll | fixed/sticky \u76EE\u6807\u4E0D\u5728\u89C6\u53E3\u5185\uFF0C\u9875\u9762\u6EDA\u52A8\u65E0\u6CD5\u6539\u53D8\u5176\u4F4D\u7F6E (direction=${status.direction || "unknown"})`);
|
|
4604
4570
|
return { element, didScroll, restore: null, unscrollable: true };
|
|
4605
4571
|
}
|
|
4606
4572
|
if (!scrollRect && status.isFixed && status.code === "OBSTRUCTED") {
|
|
4607
|
-
|
|
4573
|
+
logger6.warn(`humanScroll | fixed/sticky \u76EE\u6807\u88AB\u906E\u6321\uFF0C\u6EDA\u52A8\u65E0\u6CD5\u89E3\u9664 (${status.obstruction?.tag || "unknown"})`);
|
|
4608
4574
|
return { element, didScroll, restore: null, unscrollable: true };
|
|
4609
4575
|
}
|
|
4610
4576
|
if (scrollRect && status.code === "OBSTRUCTED" && status.obstruction?.isFixed) {
|
|
4611
4577
|
const moved = await scrollAwayFromObstruction(element, status);
|
|
4612
4578
|
if (moved.moved) {
|
|
4613
|
-
|
|
4579
|
+
logger6.debug(`humanScroll | sticky/fixed \u906E\u6321\u8865\u507F\u6EDA\u52A8 top=${Math.round(moved.scrollTop || 0)}`);
|
|
4614
4580
|
await waitJitter(90, 0.3);
|
|
4615
4581
|
didScroll = true;
|
|
4616
4582
|
continue;
|
|
4617
4583
|
}
|
|
4618
4584
|
}
|
|
4619
4585
|
if (Date.now() - startTime > maxDurationMs) {
|
|
4620
|
-
|
|
4586
|
+
logger6.warn(`humanScroll | mobile timeout (${maxDurationMs}ms, status=${status.code}, direction=${status.direction || "unknown"}, fixed=${Boolean(status.isFixed)})`);
|
|
4621
4587
|
return { element, didScroll, restore: null };
|
|
4622
4588
|
}
|
|
4623
4589
|
const stepMin = scrollRect ? Math.min(minStep, Math.max(60, scrollRect.height * 0.4)) : minStep;
|
|
4624
4590
|
const stepMax = scrollRect ? Math.min(maxStep, Math.max(stepMin + 40, scrollRect.height * 0.8)) : maxStep;
|
|
4625
|
-
|
|
4591
|
+
logger6.debug(`humanScroll | \u6B65\u9AA4 ${i + 1}/${maxSteps}: ${status.reason || status.code} ${status.direction ? `(${status.direction})` : ""}`);
|
|
4626
4592
|
const distance = stepMin + Math.random() * Math.max(1, stepMax - stepMin);
|
|
4627
4593
|
let deltaY = status.direction === "up" ? -distance : distance;
|
|
4628
4594
|
if (status.code === "OBSTRUCTED") {
|
|
@@ -4663,7 +4629,7 @@ var MobileHumanize = {
|
|
|
4663
4629
|
const afterWindowState = await page.evaluate(() => ({ x: window.scrollX, y: window.scrollY }));
|
|
4664
4630
|
if (Math.abs(afterWindowState.x - beforeWindowState.x) > 2 || Math.abs(afterWindowState.y - beforeWindowState.y) > 2) {
|
|
4665
4631
|
await page.evaluate((state2) => window.scrollTo(state2.x, state2.y), beforeWindowState);
|
|
4666
|
-
|
|
4632
|
+
logger6.debug(`humanScroll | \u7A97\u53E3\u6EDA\u52A8\u56DE\u6536 from=${Math.round(afterWindowState.y)} to=${Math.round(beforeWindowState.y)}`);
|
|
4667
4633
|
}
|
|
4668
4634
|
}
|
|
4669
4635
|
let afterElementSnapshot = null;
|
|
@@ -4677,7 +4643,7 @@ var MobileHumanize = {
|
|
|
4677
4643
|
const afterSnapshot = await readAfterElementSnapshot();
|
|
4678
4644
|
if (isTargetImmobileAfterScroll(beforeElementSnapshot, afterSnapshot)) {
|
|
4679
4645
|
await restoreWindowFromSnapshot(page, beforeElementSnapshot, afterSnapshot);
|
|
4680
|
-
|
|
4646
|
+
logger6.warn(`humanScroll | \u76EE\u6807\u4E0D\u968F\u9875\u9762\u6EDA\u52A8\u79FB\u52A8\uFF0C\u9875\u9762\u6EDA\u52A8\u65E0\u6CD5\u6539\u53D8\u5176\u4F4D\u7F6E (status=${status.code}, direction=${status.direction || "unknown"})`);
|
|
4681
4647
|
return { element, didScroll, restore: null, unscrollable: true };
|
|
4682
4648
|
}
|
|
4683
4649
|
}
|
|
@@ -4709,12 +4675,12 @@ var MobileHumanize = {
|
|
|
4709
4675
|
const moved = beforeState.kind !== afterState.kind || Math.abs(topDelta) > 2 || Math.abs(leftDelta) > 2;
|
|
4710
4676
|
if (!moved) {
|
|
4711
4677
|
const fallback = await scrollScrollableAncestor(element, deltaY);
|
|
4712
|
-
|
|
4678
|
+
logger6.debug(`humanScroll | \u5BB9\u5668\u89E6\u6478\u65E0\u6548\uFF0C\u76F4\u63A5\u6EDA\u52A8 fallback=${fallback.scroller ? "ancestor" : "window"} top=${Math.round(fallback.scrollTop || 0)}`);
|
|
4713
4679
|
} else if (beforeState.kind === afterState.kind && Math.abs(expectedDelta) > 24 && Math.sign(topDelta || expectedDelta) === Math.sign(expectedDelta) && Math.abs(topDelta) < Math.min(Math.abs(expectedDelta) * 0.45, 96)) {
|
|
4714
4680
|
const residualDelta = expectedDelta - topDelta;
|
|
4715
4681
|
if (Math.sign(residualDelta) === Math.sign(expectedDelta) && Math.abs(residualDelta) > 24) {
|
|
4716
4682
|
const fallback = await scrollScrollableAncestor(element, residualDelta);
|
|
4717
|
-
|
|
4683
|
+
logger6.debug(`humanScroll | \u5BB9\u5668\u89E6\u6478\u8DDD\u79BB\u4E0D\u8DB3\uFF0C\u8865\u507F\u6EDA\u52A8 fallback=${fallback.scroller ? "ancestor" : "window"} top=${Math.round(fallback.scrollTop || 0)}`);
|
|
4718
4684
|
}
|
|
4719
4685
|
}
|
|
4720
4686
|
}
|
|
@@ -4722,7 +4688,7 @@ var MobileHumanize = {
|
|
|
4722
4688
|
const afterSnapshot = await getElementViewportSnapshot(element).catch(() => null);
|
|
4723
4689
|
if (isTargetImmobileAfterScroll(beforeElementSnapshot, afterSnapshot)) {
|
|
4724
4690
|
await restoreWindowFromSnapshot(page, beforeElementSnapshot, afterSnapshot);
|
|
4725
|
-
|
|
4691
|
+
logger6.warn(`humanScroll | \u76EE\u6807\u4E0D\u968F\u6EDA\u52A8\u5BB9\u5668\u79FB\u52A8\uFF0C\u6EDA\u52A8\u65E0\u6CD5\u6539\u53D8\u5176\u4F4D\u7F6E (status=${status.code}, direction=${status.direction || "unknown"})`);
|
|
4726
4692
|
return { element, didScroll, restore: null, unscrollable: true };
|
|
4727
4693
|
}
|
|
4728
4694
|
}
|
|
@@ -4733,14 +4699,14 @@ var MobileHumanize = {
|
|
|
4733
4699
|
await waitJitter(80, 0.3);
|
|
4734
4700
|
const finalStatus = await checkElementVisibility(element);
|
|
4735
4701
|
if (finalStatus.code === "VISIBLE") {
|
|
4736
|
-
|
|
4737
|
-
|
|
4702
|
+
logger6.info("humanScroll | \u539F\u751F scrollIntoViewIfNeeded \u515C\u5E95\u6210\u529F");
|
|
4703
|
+
logger6.success("humanScroll", didScroll ? "\u5DF2\u6EDA\u52A8" : "\u65E0\u9700\u6EDA\u52A8");
|
|
4738
4704
|
return { element, didScroll: true, restore: null };
|
|
4739
4705
|
}
|
|
4740
4706
|
} catch (fallbackError) {
|
|
4741
|
-
|
|
4707
|
+
logger6.debug(`humanScroll | native fallback failed: ${fallbackError?.message || fallbackError}`);
|
|
4742
4708
|
}
|
|
4743
|
-
|
|
4709
|
+
logger6.warn(`humanScroll | \u5728 ${maxSteps} \u6B65\u540E\u65E0\u6CD5\u786E\u4FDD\u53EF\u89C1\u6027`);
|
|
4744
4710
|
return { element, didScroll, restore: null };
|
|
4745
4711
|
},
|
|
4746
4712
|
async humanClick(page, target, options = {}) {
|
|
@@ -4755,7 +4721,7 @@ var MobileHumanize = {
|
|
|
4755
4721
|
fallbackDomClickOnTapError = true
|
|
4756
4722
|
} = options;
|
|
4757
4723
|
const targetDesc = describeTarget(target);
|
|
4758
|
-
|
|
4724
|
+
logger6.start("humanClick", `target=${targetDesc}`);
|
|
4759
4725
|
try {
|
|
4760
4726
|
if (target == null) {
|
|
4761
4727
|
const viewport = resolveViewport(page);
|
|
@@ -4767,12 +4733,12 @@ var MobileHumanize = {
|
|
|
4767
4733
|
timeoutMs: tapTimeoutMs,
|
|
4768
4734
|
mouseFallbackTimeoutMs
|
|
4769
4735
|
});
|
|
4770
|
-
|
|
4736
|
+
logger6.success("humanClick", "Tapped current position");
|
|
4771
4737
|
return true;
|
|
4772
4738
|
}
|
|
4773
4739
|
const element = await resolveElement(page, target, { throwOnMissing });
|
|
4774
4740
|
if (!element) {
|
|
4775
|
-
|
|
4741
|
+
logger6.warn(`humanClick: \u5143\u7D20\u4E0D\u5B58\u5728\uFF0C\u8DF3\u8FC7\u70B9\u51FB ${targetDesc}`);
|
|
4776
4742
|
return false;
|
|
4777
4743
|
}
|
|
4778
4744
|
const scrollResult = scrollIfNeeded ? await MobileHumanize.humanScroll(page, element, { throwOnMissing }) : null;
|
|
@@ -4796,19 +4762,19 @@ var MobileHumanize = {
|
|
|
4796
4762
|
).catch(() => null);
|
|
4797
4763
|
}
|
|
4798
4764
|
if (fallback?.activated) {
|
|
4799
|
-
|
|
4765
|
+
logger6.warn(`humanClick: \u4E0D\u53EF\u6EDA\u52A8\u76EE\u6807\u4E0D\u53EF\u7269\u7406\u70B9\u51FB\uFF0C\u5DF2\u7528 ${fallback.method} \u6FC0\u6D3B`);
|
|
4800
4766
|
return true;
|
|
4801
4767
|
}
|
|
4802
4768
|
}
|
|
4803
4769
|
const message = `\u5143\u7D20\u4E0D\u53EF\u70B9\u51FB: ${status.reason || status.code}`;
|
|
4804
4770
|
if (throwOnMissing) throw new Error(message);
|
|
4805
|
-
|
|
4771
|
+
logger6.warn(`humanClick: ${message}\uFF0C\u8DF3\u8FC7\u70B9\u51FB`);
|
|
4806
4772
|
return false;
|
|
4807
4773
|
}
|
|
4808
4774
|
const box = await element.boundingBox();
|
|
4809
4775
|
if (!box) {
|
|
4810
4776
|
if (throwOnMissing) throw new Error("\u65E0\u6CD5\u83B7\u53D6\u5143\u7D20\u4F4D\u7F6E");
|
|
4811
|
-
|
|
4777
|
+
logger6.warn("humanClick: \u65E0\u6CD5\u83B7\u53D6\u4F4D\u7F6E\uFF0C\u8DF3\u8FC7\u70B9\u51FB");
|
|
4812
4778
|
return false;
|
|
4813
4779
|
}
|
|
4814
4780
|
await waitJitter(reactionDelay, 0.45);
|
|
@@ -4829,13 +4795,13 @@ var MobileHumanize = {
|
|
|
4829
4795
|
"activation fallback"
|
|
4830
4796
|
).catch(() => null);
|
|
4831
4797
|
if (!fallback?.activated) throw tapError;
|
|
4832
|
-
|
|
4798
|
+
logger6.warn(`humanClick: tap \u5931\u8D25\u540E\u5DF2\u7528 ${fallback.method} \u515C\u5E95: ${tapError?.message || tapError}`);
|
|
4833
4799
|
}
|
|
4834
4800
|
await waitJitter(120, 0.35);
|
|
4835
|
-
|
|
4801
|
+
logger6.success("humanClick");
|
|
4836
4802
|
return true;
|
|
4837
4803
|
} catch (error) {
|
|
4838
|
-
|
|
4804
|
+
logger6.fail("humanClick", error);
|
|
4839
4805
|
throw error;
|
|
4840
4806
|
}
|
|
4841
4807
|
},
|
|
@@ -4888,7 +4854,7 @@ var MobileHumanize = {
|
|
|
4888
4854
|
keyboardOptions = {}
|
|
4889
4855
|
} = pressOptions || {};
|
|
4890
4856
|
const targetDesc = hasTarget ? describeTarget(targetOrKey) : "current focus";
|
|
4891
|
-
|
|
4857
|
+
logger6.start("humanPress", `key=${key}, target=${targetDesc}`);
|
|
4892
4858
|
try {
|
|
4893
4859
|
if (hasTarget) {
|
|
4894
4860
|
await MobileHumanize.humanClick(page, targetOrKey, {
|
|
@@ -4902,10 +4868,10 @@ var MobileHumanize = {
|
|
|
4902
4868
|
...keyboardOptions,
|
|
4903
4869
|
delay: jitterMs(holdDelay, 0.5)
|
|
4904
4870
|
});
|
|
4905
|
-
|
|
4871
|
+
logger6.success("humanPress");
|
|
4906
4872
|
return true;
|
|
4907
4873
|
} catch (error) {
|
|
4908
|
-
|
|
4874
|
+
logger6.fail("humanPress", error);
|
|
4909
4875
|
throw error;
|
|
4910
4876
|
}
|
|
4911
4877
|
},
|
|
@@ -5064,7 +5030,7 @@ import { FingerprintInjector } from "fingerprint-injector";
|
|
|
5064
5030
|
import { chromium as defaultChromiumLauncher } from "playwright";
|
|
5065
5031
|
|
|
5066
5032
|
// src/proxy-bypass.js
|
|
5067
|
-
import
|
|
5033
|
+
import picomatch from "picomatch";
|
|
5068
5034
|
var normalizeByPassDomains = (domains) => {
|
|
5069
5035
|
if (!Array.isArray(domains)) return [];
|
|
5070
5036
|
return domains.map((item) => String(item || "").trim()).filter(Boolean);
|
|
@@ -5075,7 +5041,7 @@ var buildByPassDomainRule = (rawPattern) => {
|
|
|
5075
5041
|
if (!pattern) return null;
|
|
5076
5042
|
let matcher;
|
|
5077
5043
|
try {
|
|
5078
|
-
matcher =
|
|
5044
|
+
matcher = picomatch(pattern, { nocase: true });
|
|
5079
5045
|
} catch {
|
|
5080
5046
|
return null;
|
|
5081
5047
|
}
|
|
@@ -5144,7 +5110,7 @@ var ByPass = {
|
|
|
5144
5110
|
};
|
|
5145
5111
|
|
|
5146
5112
|
// src/internals/launch/traffic.js
|
|
5147
|
-
var
|
|
5113
|
+
var logger7 = createInternalLogger("Launch");
|
|
5148
5114
|
var normalizeObject = (value) => {
|
|
5149
5115
|
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
5150
5116
|
return {};
|
|
@@ -5193,7 +5159,7 @@ var logLaunchTraffic = ({
|
|
|
5193
5159
|
} = {}) => {
|
|
5194
5160
|
if (!enabled) return;
|
|
5195
5161
|
if (explicitProxy) {
|
|
5196
|
-
|
|
5162
|
+
logger7.info("[\u4EE3\u7406\u5DF2\u542F\u7528] \u4F7F\u7528\u663E\u5F0F proxy \u914D\u7F6E\uFF0C\u8DF3\u8FC7 toolkit \u672C\u5730\u6D41\u91CF\u89C2\u6D4B");
|
|
5197
5163
|
return;
|
|
5198
5164
|
}
|
|
5199
5165
|
if (launchProxy) {
|
|
@@ -5203,18 +5169,18 @@ var logLaunchTraffic = ({
|
|
|
5203
5169
|
upstreamLabel = `${parsedProxyUrl.protocol}//${parsedProxyUrl.host}`;
|
|
5204
5170
|
} catch {
|
|
5205
5171
|
}
|
|
5206
|
-
|
|
5172
|
+
logger7.info(
|
|
5207
5173
|
`[\u4EE3\u7406\u5DF2\u542F\u7528] \u672C\u5730=${launchProxy.server} \u4E0A\u6E38=${upstreamLabel || "-"} \u76F4\u8FDE\u57DF\u540D=${byPassDomains.join(",")}`
|
|
5208
5174
|
);
|
|
5209
|
-
|
|
5175
|
+
logger7.info(`[\u6D41\u91CF\u89C2\u6D4B] \u9010\u8BF7\u6C42\u8C03\u8BD5=${Boolean(debugMode) ? "\u5F00\u542F" : "\u5173\u95ED"}\uFF08\u6C47\u603B\u59CB\u7EC8\u5F00\u542F\uFF09`);
|
|
5210
5176
|
return;
|
|
5211
5177
|
}
|
|
5212
5178
|
if (enableProxy) {
|
|
5213
|
-
|
|
5179
|
+
logger7.info("[\u4EE3\u7406\u672A\u542F\u7528] enable_proxy=true \u4F46 proxy_url \u4E3A\u7A7A");
|
|
5214
5180
|
} else if (proxyUrl) {
|
|
5215
|
-
|
|
5181
|
+
logger7.info("[\u4EE3\u7406\u672A\u542F\u7528] enable_proxy=false \u4E14 proxy_url \u5DF2\u914D\u7F6E");
|
|
5216
5182
|
}
|
|
5217
|
-
|
|
5183
|
+
logger7.info(`[\u6D41\u91CF\u89C2\u6D4B] \u9010\u8BF7\u6C42\u8C03\u8BD5=${Boolean(debugMode) ? "\u5F00\u542F" : "\u5173\u95ED"}\uFF08\u6C47\u603B\u59CB\u7EC8\u5F00\u542F\uFF09`);
|
|
5218
5184
|
};
|
|
5219
5185
|
var createLaunchTrafficHook = ({
|
|
5220
5186
|
byPassDomains = [],
|
|
@@ -5237,13 +5203,13 @@ var createLaunchTrafficHook = ({
|
|
|
5237
5203
|
}
|
|
5238
5204
|
if (!enabled || byPassDomains.length === 0) return;
|
|
5239
5205
|
if (!matched || !matched.rule) return;
|
|
5240
|
-
|
|
5206
|
+
logger7.info(`[\u76F4\u8FDE\u547D\u4E2D] \u89C4\u5219=${matched.rule.pattern} \u57DF\u540D=${matched.hostname} \u8D44\u6E90\u7C7B\u578B=${resourceType} \u65B9\u6CD5=${req.method()} \u5730\u5740=${requestUrl}`);
|
|
5241
5207
|
});
|
|
5242
5208
|
};
|
|
5243
5209
|
};
|
|
5244
5210
|
|
|
5245
5211
|
// src/internals/launch/default.js
|
|
5246
|
-
var
|
|
5212
|
+
var logger8 = createInternalLogger("Launch");
|
|
5247
5213
|
var injectedContexts = /* @__PURE__ */ new WeakSet();
|
|
5248
5214
|
var browserMajorVersionCache = /* @__PURE__ */ new Map();
|
|
5249
5215
|
var DEFAULT_BROWSER_PROFILE_SCHEMA_VERSION = 1;
|
|
@@ -5284,7 +5250,7 @@ var detectBrowserMajorVersion = (launcher) => {
|
|
|
5284
5250
|
});
|
|
5285
5251
|
detectedVersion = parseChromeMajorVersion(rawVersion);
|
|
5286
5252
|
} catch (error) {
|
|
5287
|
-
|
|
5253
|
+
logger8.warn(`\u8BFB\u53D6\u6D4F\u89C8\u5668\u7248\u672C\u5931\u8D25: ${error?.message || error}`);
|
|
5288
5254
|
}
|
|
5289
5255
|
browserMajorVersionCache.set(executablePath, detectedVersion);
|
|
5290
5256
|
return detectedVersion;
|
|
@@ -5321,7 +5287,7 @@ var generateFingerprintForCore = ({ locale, browserMajorVersion, device }) => {
|
|
|
5321
5287
|
if (requestedBrowserMajorVersion <= 0) {
|
|
5322
5288
|
throw error;
|
|
5323
5289
|
}
|
|
5324
|
-
|
|
5290
|
+
logger8.warn(
|
|
5325
5291
|
`\u5F53\u524D\u6D4F\u89C8\u5668\u5927\u7248\u672C ${requestedBrowserMajorVersion} \u65E0\u53EF\u7528 strict \u6307\u7EB9\u6837\u672C\uFF0C\u9000\u56DE\u4E0D\u7ED1\u5B9A\u5927\u7248\u672C\u751F\u6210: ${error?.message || error}`
|
|
5326
5292
|
);
|
|
5327
5293
|
}
|
|
@@ -5367,7 +5333,7 @@ var buildReplayableBrowserProfile = (runtimeState, launcher) => {
|
|
|
5367
5333
|
schema_version: DEFAULT_BROWSER_PROFILE_SCHEMA_VERSION
|
|
5368
5334
|
};
|
|
5369
5335
|
nextState = RuntimeEnv.setBrowserProfileCore(nextState, browserProfileCore);
|
|
5370
|
-
|
|
5336
|
+
logger8.info(
|
|
5371
5337
|
`\u5DF2\u751F\u6210\u6D4F\u89C8\u5668\u6307\u7EB9\u771F\u6E90 | env=${String(nextState.envId || "-")} | device=${device} | version=${browserProfileCore.browser_major_version || "-"} | fingerprintVersion=${fingerprintBrowserMajorVersion || "-"} | exactVersion=${generated.exactBrowserMajorVersion ? "true" : "false"} | timezone=${timezoneId}`
|
|
5372
5338
|
);
|
|
5373
5339
|
return { runtimeState: nextState, browserProfileCore };
|
|
@@ -5554,7 +5520,7 @@ var DefaultLaunch = {
|
|
|
5554
5520
|
import { execFile } from "node:child_process";
|
|
5555
5521
|
import { randomInt } from "node:crypto";
|
|
5556
5522
|
import { promisify } from "node:util";
|
|
5557
|
-
var
|
|
5523
|
+
var logger9 = createInternalLogger("Launch");
|
|
5558
5524
|
var execFileAsync = promisify(execFile);
|
|
5559
5525
|
var DEFAULT_CLOAK_CRAWLER_BASE_OPTIONS = Object.freeze({
|
|
5560
5526
|
maxConcurrency: 1,
|
|
@@ -5760,7 +5726,7 @@ var resolveReplayableCloakProfile = (runtimeState, { fingerprintPlatform = "", c
|
|
|
5760
5726
|
const nextCoreRaw = JSON.stringify(nextBrowserProfileCore);
|
|
5761
5727
|
if (currentCoreRaw !== nextCoreRaw) {
|
|
5762
5728
|
nextState = RuntimeEnv.setBrowserProfileCore(nextState, nextBrowserProfileCore);
|
|
5763
|
-
|
|
5729
|
+
logger9.info(
|
|
5764
5730
|
`\u5DF2\u540C\u6B65 Cloak \u6307\u7EB9\u771F\u6E90 | env=${String(nextState.envId || "-")} | seed=${fingerprintSeed} | platform=${resolvedFingerprintPlatform} | timezone=${timezone || "-"} | locale=${locale || "-"}`
|
|
5765
5731
|
);
|
|
5766
5732
|
}
|
|
@@ -5847,7 +5813,7 @@ var forceTerminateBrowsersByFingerprintArg = async (fingerprintArg) => {
|
|
|
5847
5813
|
if (error?.code === 1 || error?.code === "ENOENT") {
|
|
5848
5814
|
return;
|
|
5849
5815
|
}
|
|
5850
|
-
|
|
5816
|
+
logger9.info(`\u5F3A\u5236\u5173\u95ED Cloak \u8FDB\u7A0B\u5931\u8D25\uFF08\u5FFD\u7565\uFF09: ${error?.message || String(error)}`);
|
|
5851
5817
|
});
|
|
5852
5818
|
};
|
|
5853
5819
|
var CloakLaunch = {
|
|
@@ -6007,7 +5973,7 @@ var Launch = withModeReflect("Launch", launchStrategies);
|
|
|
6007
5973
|
// src/live-view.js
|
|
6008
5974
|
import express from "express";
|
|
6009
5975
|
import { Actor } from "apify";
|
|
6010
|
-
var
|
|
5976
|
+
var logger10 = createInternalLogger("LiveView");
|
|
6011
5977
|
async function startLiveViewServer(liveViewKey) {
|
|
6012
5978
|
const app = express();
|
|
6013
5979
|
app.get("/", async (req, res) => {
|
|
@@ -6032,13 +5998,13 @@ async function startLiveViewServer(liveViewKey) {
|
|
|
6032
5998
|
</html>
|
|
6033
5999
|
`);
|
|
6034
6000
|
} catch (error) {
|
|
6035
|
-
|
|
6001
|
+
logger10.fail("Live View Server", error);
|
|
6036
6002
|
res.status(500).send(`\u65E0\u6CD5\u52A0\u8F7D\u5C4F\u5E55\u622A\u56FE: ${error.message}`);
|
|
6037
6003
|
}
|
|
6038
6004
|
});
|
|
6039
6005
|
const port = process.env.APIFY_CONTAINER_PORT || 4321;
|
|
6040
6006
|
app.listen(port, () => {
|
|
6041
|
-
|
|
6007
|
+
logger10.success("startLiveViewServer", `\u76D1\u542C\u7AEF\u53E3 ${port}`);
|
|
6042
6008
|
});
|
|
6043
6009
|
}
|
|
6044
6010
|
async function takeLiveScreenshot(liveViewKey, page, logMessage) {
|
|
@@ -6046,10 +6012,10 @@ async function takeLiveScreenshot(liveViewKey, page, logMessage) {
|
|
|
6046
6012
|
const buffer = await capturePageScreenshot(page, { type: "png" });
|
|
6047
6013
|
await Actor.setValue(liveViewKey, buffer, { contentType: "image/png" });
|
|
6048
6014
|
if (logMessage) {
|
|
6049
|
-
|
|
6015
|
+
logger10.info(`(\u622A\u56FE): ${logMessage}`);
|
|
6050
6016
|
}
|
|
6051
6017
|
} catch (e) {
|
|
6052
|
-
|
|
6018
|
+
logger10.warn(`\u65E0\u6CD5\u6355\u83B7 Live View \u5C4F\u5E55\u622A\u56FE: ${e.message}`);
|
|
6053
6019
|
}
|
|
6054
6020
|
}
|
|
6055
6021
|
var useLiveView = (liveViewKey = PresetOfLiveViewKey) => {
|
|
@@ -6155,7 +6121,7 @@ var dragCaptchaAction = async (page, sourceLocator, targetLocator, options = {})
|
|
|
6155
6121
|
};
|
|
6156
6122
|
|
|
6157
6123
|
// src/internals/captcha/bytedance.js
|
|
6158
|
-
var
|
|
6124
|
+
var logger11 = createInternalLogger("Captcha");
|
|
6159
6125
|
var DEFAULT_BYTEDANCE_CAPTCHA_OPTIONS = Object.freeze({
|
|
6160
6126
|
apiType: "31234",
|
|
6161
6127
|
maxRetries: 3,
|
|
@@ -6287,7 +6253,7 @@ var collectCaptchaDebugInfo = async (page, frame, iframeLocator, attempt, phase,
|
|
|
6287
6253
|
}
|
|
6288
6254
|
await writeFile(infoPath, JSON.stringify(payload, null, 2), "utf8");
|
|
6289
6255
|
}
|
|
6290
|
-
|
|
6256
|
+
logger11.info(`\u5DF2\u5199\u51FA\u9A8C\u8BC1\u7801\u8C03\u8BD5\u4EA7\u7269\uFF1A${debugDir}`);
|
|
6291
6257
|
};
|
|
6292
6258
|
var maybeCollectCaptchaDebugInfo = async (page, frame, iframeLocator, attempt, phase, options, extra = null) => {
|
|
6293
6259
|
if (!options.debugArtifacts) {
|
|
@@ -6324,14 +6290,14 @@ var getVerifycenterCaptchaContext = async (page, options) => {
|
|
|
6324
6290
|
if (!isContainerVisible) {
|
|
6325
6291
|
return null;
|
|
6326
6292
|
}
|
|
6327
|
-
|
|
6293
|
+
logger11.info("\u68C0\u6D4B\u5230\u9A8C\u8BC1\u7801\u5BB9\u5668\uFF0C\u5F00\u59CB\u7B49\u5F85 iframe \u52A0\u8F7D\u3002");
|
|
6328
6294
|
let iframeLocator = page.locator(options.iframeSelector).first();
|
|
6329
6295
|
let isIframeVisible = await waitForVisible(
|
|
6330
6296
|
iframeLocator,
|
|
6331
6297
|
options.iframeVisibleTimeoutMs
|
|
6332
6298
|
);
|
|
6333
6299
|
if (!isIframeVisible) {
|
|
6334
|
-
|
|
6300
|
+
logger11.warn("\u672A\u5728\u9884\u671F\u9009\u62E9\u5668\u4E2D\u627E\u5230 verifycenter iframe\uFF0C\u5C1D\u8BD5\u5BB9\u5668\u5185\u4EFB\u610F iframe\u3002");
|
|
6335
6301
|
iframeLocator = captchaContainer.locator(options.iframeFallbackSelector).first();
|
|
6336
6302
|
isIframeVisible = await waitForVisible(
|
|
6337
6303
|
iframeLocator,
|
|
@@ -6341,7 +6307,7 @@ var getVerifycenterCaptchaContext = async (page, options) => {
|
|
|
6341
6307
|
if (!isIframeVisible) {
|
|
6342
6308
|
throw new Error("verifycenter iframe not found inside captcha container.");
|
|
6343
6309
|
}
|
|
6344
|
-
|
|
6310
|
+
logger11.info("\u9A8C\u8BC1\u7801 iframe \u5DF2\u53EF\u89C1\uFF0C\u5F00\u59CB\u89E3\u6790\u5185\u5BB9 frame\u3002");
|
|
6345
6311
|
const frame = await resolveContentFrame(page, iframeLocator, options);
|
|
6346
6312
|
if (!frame) {
|
|
6347
6313
|
throw new Error("Failed to resolve verifycenter iframe content frame.");
|
|
@@ -6457,11 +6423,11 @@ var refreshCaptcha = async (page, frame, options) => {
|
|
|
6457
6423
|
const clicked = await clickCaptchaAction(frame, options.refreshTexts, {
|
|
6458
6424
|
...options,
|
|
6459
6425
|
page,
|
|
6460
|
-
logger:
|
|
6426
|
+
logger: logger11,
|
|
6461
6427
|
forceMouse: true
|
|
6462
6428
|
}).catch(() => false);
|
|
6463
6429
|
if (!clicked) {
|
|
6464
|
-
|
|
6430
|
+
logger11.warn("Refresh button not found.");
|
|
6465
6431
|
return false;
|
|
6466
6432
|
}
|
|
6467
6433
|
await page.waitForTimeout(options.refreshWaitMs);
|
|
@@ -6492,24 +6458,24 @@ var waitForCaptchaChallengeReady = async (page, frame, options) => {
|
|
|
6492
6458
|
const hasGuideMaskVisible = options.guideMaskSelector ? await frame.locator(options.guideMaskSelector).first().isVisible({ timeout: options.loadingIndicatorVisibleTimeoutMs }).catch(() => false) : false;
|
|
6493
6459
|
hasSeenGuideMask = hasSeenGuideMask || hasGuideMaskVisible;
|
|
6494
6460
|
if (hasGuideMaskVisible && !hasLoggedGuideMask) {
|
|
6495
|
-
|
|
6461
|
+
logger11.info("\u68C0\u6D4B\u5230\u9A8C\u8BC1\u7801\u64CD\u4F5C\u5F15\u5BFC\u5C42\uFF0C\u7B49\u5F85\u5176\u6D88\u5931\u540E\u518D\u5F00\u59CB\u8BC6\u522B\u3002");
|
|
6496
6462
|
hasLoggedGuideMask = true;
|
|
6497
6463
|
}
|
|
6498
6464
|
if (!isLoadingVisible && hasVisibleSourceImage && hasVisibleDropTarget && !hasGuideMaskVisible) {
|
|
6499
|
-
|
|
6465
|
+
logger11.info(
|
|
6500
6466
|
hasSeenGuideMask ? "\u9A8C\u8BC1\u7801\u56FE\u7247\u548C\u62D6\u62FD\u533A\u57DF\u5DF2\u5C31\u7EEA\uFF0C\u5F15\u5BFC\u5C42\u5DF2\u6D88\u5931\u3002" : hasSeenLoading ? "\u9A8C\u8BC1\u7801\u56FE\u7247\u5DF2\u52A0\u8F7D\u5B8C\u6210\u3002" : "\u9A8C\u8BC1\u7801\u56FE\u7247\u5DF2\u5C31\u7EEA\u3002"
|
|
6501
6467
|
);
|
|
6502
6468
|
return;
|
|
6503
6469
|
}
|
|
6504
6470
|
if (hasErrorTextVisible) {
|
|
6505
|
-
|
|
6471
|
+
logger11.warn("\u9A8C\u8BC1\u7801\u9762\u677F\u51FA\u73B0\u7F51\u7EDC\u5F02\u5E38\u6587\u6848\uFF0C\u5C1D\u8BD5\u7ACB\u5373\u5237\u65B0\u9898\u76EE\u3002");
|
|
6506
6472
|
await refreshCaptcha(page, frame, options);
|
|
6507
6473
|
refreshDeadline = Date.now() + options.challengeReadyRefreshTimeoutMs;
|
|
6508
6474
|
hasSeenLoading = false;
|
|
6509
6475
|
continue;
|
|
6510
6476
|
}
|
|
6511
6477
|
if ((!hasVisibleSourceImage || !hasVisibleDropTarget) && Date.now() >= refreshDeadline) {
|
|
6512
|
-
|
|
6478
|
+
logger11.warn(`\u9A8C\u8BC1\u7801\u9898\u76EE\u8D85\u8FC7 ${options.challengeReadyRefreshTimeoutMs}ms \u4ECD\u672A\u51C6\u5907\u597D\uFF0C\u5C1D\u8BD5\u5237\u65B0\u9898\u76EE\u3002`);
|
|
6513
6479
|
await refreshCaptcha(page, frame, options);
|
|
6514
6480
|
refreshDeadline = Date.now() + options.challengeReadyRefreshTimeoutMs;
|
|
6515
6481
|
hasSeenLoading = false;
|
|
@@ -6557,7 +6523,7 @@ var dragPromptCaptchaImage = async (page, frame, iframeLocator, sourceLocator, d
|
|
|
6557
6523
|
accepted
|
|
6558
6524
|
};
|
|
6559
6525
|
dragAttempts.push(attemptInfo);
|
|
6560
|
-
|
|
6526
|
+
logger11.info(
|
|
6561
6527
|
`\u9A8C\u8BC1\u7801\u62D6\u62FD\u7B2C ${visualIndex + 1} \u5F20\uFF0C\u65B9\u6848 ${plan.name}\uFF0Cbadge ${baselineState.badgeCount} -> ${afterState.badgeCount}\uFF0Cselected ${baselineState.selectedCount} -> ${afterState.selectedCount}`
|
|
6562
6528
|
);
|
|
6563
6529
|
if (accepted) {
|
|
@@ -6575,7 +6541,7 @@ var dragPromptCaptchaImage = async (page, frame, iframeLocator, sourceLocator, d
|
|
|
6575
6541
|
dragAttempts,
|
|
6576
6542
|
finalState: await readPromptCaptchaState(frame, options)
|
|
6577
6543
|
}).catch((error) => {
|
|
6578
|
-
|
|
6544
|
+
logger11.warn(`\u9A8C\u8BC1\u7801\u62D6\u62FD\u5931\u8D25\u8C03\u8BD5\u6293\u53D6\u5931\u8D25\uFF1A${error?.message || error}`);
|
|
6579
6545
|
});
|
|
6580
6546
|
return {
|
|
6581
6547
|
accepted: false,
|
|
@@ -6592,16 +6558,16 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
|
|
|
6592
6558
|
...options
|
|
6593
6559
|
};
|
|
6594
6560
|
if (!config.token) {
|
|
6595
|
-
|
|
6561
|
+
logger11.warn("\u7F3A\u5C11\u9A8C\u8BC1\u7801 token\uFF0C\u8DF3\u8FC7\u81EA\u52A8\u8BC6\u522B\u3002");
|
|
6596
6562
|
return false;
|
|
6597
6563
|
}
|
|
6598
|
-
|
|
6564
|
+
logger11.info("\u5F53\u524D\u4F7F\u7528\u672Ctool\u2014\u2014\u6D4B\u8BD5\u7248\u672C");
|
|
6599
6565
|
for (let attempt = 1; attempt <= config.maxRetries; attempt += 1) {
|
|
6600
|
-
|
|
6566
|
+
logger11.info(`\u5F00\u59CB\u7B2C ${attempt}/${config.maxRetries} \u6B21 verifycenter \u9A8C\u8BC1\u7801\u8BC6\u522B\u3002`);
|
|
6601
6567
|
try {
|
|
6602
6568
|
const captchaContext = await getVerifycenterCaptchaContext(page, config);
|
|
6603
6569
|
if (!captchaContext) {
|
|
6604
|
-
|
|
6570
|
+
logger11.info("Captcha container is not visible anymore.");
|
|
6605
6571
|
return true;
|
|
6606
6572
|
}
|
|
6607
6573
|
const { iframeLocator, frame } = captchaContext;
|
|
@@ -6614,7 +6580,7 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
|
|
|
6614
6580
|
"ready",
|
|
6615
6581
|
config
|
|
6616
6582
|
).catch((error) => {
|
|
6617
|
-
|
|
6583
|
+
logger11.warn(`\u9A8C\u8BC1\u7801\u8C03\u8BD5\u6293\u53D6\u5931\u8D25\uFF1A${error?.message || error}`);
|
|
6618
6584
|
});
|
|
6619
6585
|
await page.waitForTimeout(config.recognitionDelayMs);
|
|
6620
6586
|
const screenshotBuffer = await iframeLocator.screenshot();
|
|
@@ -6626,16 +6592,16 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
|
|
|
6626
6592
|
});
|
|
6627
6593
|
const serialNumbers = extractCaptchaSerialNumbers(apiResponse);
|
|
6628
6594
|
if (apiResponse?.code !== config.recognitionSuccessCode || serialNumbers.length === 0) {
|
|
6629
|
-
|
|
6595
|
+
logger11.warn(
|
|
6630
6596
|
`\u9A8C\u8BC1\u7801\u8BC6\u522B\u5931\u8D25\u3002code=${apiResponse?.code}, msg=${apiResponse?.msg || "unknown"}`
|
|
6631
6597
|
);
|
|
6632
6598
|
await refreshCaptcha(page, frame, config);
|
|
6633
6599
|
continue;
|
|
6634
6600
|
}
|
|
6635
|
-
|
|
6601
|
+
logger11.info(`\u9A8C\u8BC1\u7801\u8BC6\u522B\u6210\u529F\uFF0C\u5E8F\u53F7\uFF1A${serialNumbers.join(", ")}`);
|
|
6636
6602
|
const dropTarget = await findCaptchaDropTarget(frame, config);
|
|
6637
6603
|
if (!dropTarget) {
|
|
6638
|
-
|
|
6604
|
+
logger11.warn("\u672A\u627E\u5230\u9A8C\u8BC1\u7801\u62D6\u62FD\u76EE\u6807\u533A\u57DF\u3002");
|
|
6639
6605
|
await refreshCaptcha(page, frame, config);
|
|
6640
6606
|
continue;
|
|
6641
6607
|
}
|
|
@@ -6646,7 +6612,7 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
|
|
|
6646
6612
|
`Captcha image indexes could not be normalized. raw=${serialNumbers.join(", ")}, count=${orderedSourceImages.length}`
|
|
6647
6613
|
);
|
|
6648
6614
|
}
|
|
6649
|
-
|
|
6615
|
+
logger11.info(`\u9A8C\u8BC1\u7801\u89C6\u89C9\u4F4D\u5E8F\u6620\u5C04\uFF1A${normalizedIndexes.map((index) => index + 1).join(", ")}`);
|
|
6650
6616
|
for (const imageIndex of normalizedIndexes) {
|
|
6651
6617
|
if (imageIndex < 0 || imageIndex >= orderedSourceImages.length) {
|
|
6652
6618
|
throw new Error(
|
|
@@ -6678,52 +6644,52 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
|
|
|
6678
6644
|
}
|
|
6679
6645
|
}
|
|
6680
6646
|
const beforeSubmitState = await readPromptCaptchaState(frame, config);
|
|
6681
|
-
|
|
6647
|
+
logger11.info(
|
|
6682
6648
|
`\u63D0\u4EA4\u524D\u9A8C\u8BC1\u7801\u72B6\u6001\uFF1Abadge=${beforeSubmitState.badgeCount}, selected=${beforeSubmitState.selectedCount}, submitDisabled=${beforeSubmitState.submitDisabled}`
|
|
6683
6649
|
);
|
|
6684
6650
|
const submitted = await clickCaptchaAction(frame, config.submitTexts, {
|
|
6685
6651
|
...config,
|
|
6686
6652
|
page,
|
|
6687
|
-
logger:
|
|
6653
|
+
logger: logger11,
|
|
6688
6654
|
forceMouse: true,
|
|
6689
6655
|
actionVisibleTimeoutMs: config.submitReadyTimeoutMs
|
|
6690
6656
|
}).catch(() => false);
|
|
6691
6657
|
if (!submitted) {
|
|
6692
|
-
|
|
6658
|
+
logger11.warn("\u672A\u627E\u5230\u63D0\u4EA4\u6309\u94AE\uFF0C\u53EF\u80FD\u4F1A\u81EA\u52A8\u63D0\u4EA4\u3002");
|
|
6693
6659
|
}
|
|
6694
6660
|
await page.waitForTimeout(config.submitWaitMs);
|
|
6695
6661
|
const afterSubmitState = await readPromptCaptchaState(frame, config);
|
|
6696
|
-
|
|
6662
|
+
logger11.info(
|
|
6697
6663
|
`\u63D0\u4EA4\u540E\u9A8C\u8BC1\u7801\u72B6\u6001\uFF1Abadge=${afterSubmitState.badgeCount}, selected=${afterSubmitState.selectedCount}, submitDisabled=${afterSubmitState.submitDisabled}`
|
|
6698
6664
|
);
|
|
6699
6665
|
const stillVisible = await iframeLocator.isVisible({ timeout: config.containerVisibleTimeoutMs }).catch(() => false);
|
|
6700
6666
|
if (!stillVisible) {
|
|
6701
|
-
|
|
6667
|
+
logger11.info("\u9A8C\u8BC1\u7801\u8BC6\u522B\u5E76\u63D0\u4EA4\u6210\u529F\u3002");
|
|
6702
6668
|
return true;
|
|
6703
6669
|
}
|
|
6704
6670
|
await maybeCollectCaptchaDebugInfo(page, frame, iframeLocator, attempt, "submit-still-visible", config, {
|
|
6705
6671
|
beforeSubmitState,
|
|
6706
6672
|
afterSubmitState
|
|
6707
6673
|
}).catch((error) => {
|
|
6708
|
-
|
|
6674
|
+
logger11.warn(`\u63D0\u4EA4\u540E\u9A8C\u8BC1\u7801\u8C03\u8BD5\u6293\u53D6\u5931\u8D25\uFF1A${error?.message || error}`);
|
|
6709
6675
|
});
|
|
6710
|
-
|
|
6676
|
+
logger11.warn("\u63D0\u4EA4\u540E\u9A8C\u8BC1\u7801 iframe \u4ECD\u7136\u53EF\u89C1\uFF0C\u51C6\u5907\u5237\u65B0\u540E\u91CD\u8BD5\u3002");
|
|
6711
6677
|
await page.waitForTimeout(2e3);
|
|
6712
6678
|
await refreshCaptcha(page, frame, config);
|
|
6713
6679
|
} catch (error) {
|
|
6714
|
-
|
|
6680
|
+
logger11.error(`\u7B2C ${attempt}/${config.maxRetries} \u6B21\u9A8C\u8BC1\u7801\u8BC6\u522B\u5931\u8D25\uFF1A${error?.message || error}`);
|
|
6715
6681
|
}
|
|
6716
6682
|
if (attempt < config.maxRetries) {
|
|
6717
6683
|
await page.waitForTimeout(config.retryDelayBaseMs + attempt * config.retryDelayStepMs);
|
|
6718
6684
|
}
|
|
6719
6685
|
}
|
|
6720
|
-
|
|
6686
|
+
logger11.error(`\u91CD\u8BD5 ${config.maxRetries} \u6B21\u540E\uFF0C\u9A8C\u8BC1\u7801\u4ECD\u672A\u8BC6\u522B\u6210\u529F\u3002`);
|
|
6721
6687
|
return false;
|
|
6722
6688
|
}
|
|
6723
6689
|
var sloveCaptcha = solveCaptcha;
|
|
6724
6690
|
|
|
6725
6691
|
// src/chaptcha.js
|
|
6726
|
-
var
|
|
6692
|
+
var logger12 = createInternalLogger("Captcha");
|
|
6727
6693
|
var DOM_MONITOR_WAIT_TIMEOUT_MS = 1e3;
|
|
6728
6694
|
var DOM_MONITOR_POST_DETECT_HIDDEN_WAIT_MS = 300;
|
|
6729
6695
|
var DOM_MONITOR_RECOVERY_WAIT_MS = 100;
|
|
@@ -6798,7 +6764,7 @@ function useCaptchaMonitor(page, options) {
|
|
|
6798
6764
|
await sleep(DOM_MONITOR_RECOVERY_WAIT_MS);
|
|
6799
6765
|
continue;
|
|
6800
6766
|
}
|
|
6801
|
-
|
|
6767
|
+
logger12.warning(
|
|
6802
6768
|
"useCaptchaMonitor",
|
|
6803
6769
|
`DOM \u76D1\u63A7\u51FA\u73B0\u5F02\u5E38\uFF08\u7EE7\u7EED\u91CD\u8BD5\uFF09: selector=${domSelector}, error=${getErrorMessage(error)}`
|
|
6804
6770
|
);
|
|
@@ -6806,7 +6772,7 @@ function useCaptchaMonitor(page, options) {
|
|
|
6806
6772
|
}
|
|
6807
6773
|
}
|
|
6808
6774
|
})();
|
|
6809
|
-
|
|
6775
|
+
logger12.success("useCaptchaMonitor", `DOM \u76D1\u63A7\u5DF2\u542F\u7528\uFF1A${domSelector}`);
|
|
6810
6776
|
cleanupFns.push(async () => {
|
|
6811
6777
|
await domMonitorTask?.catch(() => {
|
|
6812
6778
|
});
|
|
@@ -6823,7 +6789,7 @@ function useCaptchaMonitor(page, options) {
|
|
|
6823
6789
|
}
|
|
6824
6790
|
};
|
|
6825
6791
|
page.on("framenavigated", frameHandler);
|
|
6826
|
-
|
|
6792
|
+
logger12.success("useCaptchaMonitor", `URL \u76D1\u63A7\u5DF2\u542F\u7528\uFF1A${urlPattern}`);
|
|
6827
6793
|
Promise.resolve().then(async () => {
|
|
6828
6794
|
if (!isStopped && page.url().includes(urlPattern)) {
|
|
6829
6795
|
await triggerDetected();
|
|
@@ -6836,7 +6802,7 @@ function useCaptchaMonitor(page, options) {
|
|
|
6836
6802
|
}
|
|
6837
6803
|
return {
|
|
6838
6804
|
stop: async () => {
|
|
6839
|
-
|
|
6805
|
+
logger12.info("\u6B63\u5728\u505C\u6B62\u9A8C\u8BC1\u7801\u76D1\u63A7...");
|
|
6840
6806
|
isStopped = true;
|
|
6841
6807
|
for (const fn of cleanupFns) {
|
|
6842
6808
|
await fn();
|
|
@@ -6875,7 +6841,7 @@ async function solveCaptchaWithStrategy(strategyName, page, options = {}) {
|
|
|
6875
6841
|
);
|
|
6876
6842
|
return strategy.sloveCaptcha(page, resolvedOptions, {
|
|
6877
6843
|
callCaptchaRecognitionApi,
|
|
6878
|
-
logger:
|
|
6844
|
+
logger: logger12
|
|
6879
6845
|
});
|
|
6880
6846
|
}
|
|
6881
6847
|
var Captcha = {
|
|
@@ -6886,7 +6852,7 @@ var Captcha = {
|
|
|
6886
6852
|
// src/mutation.js
|
|
6887
6853
|
import { createHash } from "node:crypto";
|
|
6888
6854
|
import { v4 as uuidv4 } from "uuid";
|
|
6889
|
-
var
|
|
6855
|
+
var logger13 = createInternalLogger("Mutation");
|
|
6890
6856
|
var MUTATION_MONITOR_MODE = Object.freeze({
|
|
6891
6857
|
Added: "added",
|
|
6892
6858
|
Changed: "changed",
|
|
@@ -6919,14 +6885,14 @@ var Mutation = {
|
|
|
6919
6885
|
const stableTime = options.stableTime ?? 5 * 1e3;
|
|
6920
6886
|
const timeout = options.timeout ?? 120 * 1e3;
|
|
6921
6887
|
const onMutation = options.onMutation;
|
|
6922
|
-
|
|
6888
|
+
logger13.start("waitForStable", `\u76D1\u63A7 ${selectorList.length} \u4E2A\u9009\u62E9\u5668, \u7A33\u5B9A\u65F6\u95F4=${stableTime}ms`);
|
|
6923
6889
|
if (initialTimeout > 0) {
|
|
6924
6890
|
const selectorQuery = selectorList.join(",");
|
|
6925
6891
|
try {
|
|
6926
6892
|
await page.waitForSelector(selectorQuery, { timeout: initialTimeout });
|
|
6927
|
-
|
|
6893
|
+
logger13.info(`waitForStable \u5DF2\u68C0\u6D4B\u5230\u5143\u7D20: ${selectorQuery}`);
|
|
6928
6894
|
} catch (e) {
|
|
6929
|
-
|
|
6895
|
+
logger13.warning(`waitForStable \u521D\u59CB\u7B49\u5F85\u8D85\u65F6 (${initialTimeout}ms): ${selectorQuery}`);
|
|
6930
6896
|
throw e;
|
|
6931
6897
|
}
|
|
6932
6898
|
}
|
|
@@ -6942,7 +6908,7 @@ var Mutation = {
|
|
|
6942
6908
|
return "__CONTINUE__";
|
|
6943
6909
|
}
|
|
6944
6910
|
});
|
|
6945
|
-
|
|
6911
|
+
logger13.info("waitForStable \u5DF2\u542F\u7528 onMutation \u56DE\u8C03");
|
|
6946
6912
|
} catch (e) {
|
|
6947
6913
|
}
|
|
6948
6914
|
}
|
|
@@ -7057,9 +7023,9 @@ var Mutation = {
|
|
|
7057
7023
|
{ selectorList, stableTime, timeout, callbackName, hasCallback: !!onMutation }
|
|
7058
7024
|
);
|
|
7059
7025
|
if (result.mutationCount === 0 && result.stableTime === 0) {
|
|
7060
|
-
|
|
7026
|
+
logger13.warning("waitForStable \u672A\u627E\u5230\u53EF\u76D1\u63A7\u7684\u5143\u7D20");
|
|
7061
7027
|
}
|
|
7062
|
-
|
|
7028
|
+
logger13.success("waitForStable", `DOM \u7A33\u5B9A, \u603B\u5171 ${result.mutationCount} \u6B21\u53D8\u5316${result.wasPaused ? ", \u66FE\u6682\u505C\u8BA1\u65F6" : ""}`);
|
|
7063
7029
|
return result;
|
|
7064
7030
|
},
|
|
7065
7031
|
/**
|
|
@@ -7231,22 +7197,22 @@ var Mutation = {
|
|
|
7231
7197
|
return "__CONTINUE__";
|
|
7232
7198
|
}
|
|
7233
7199
|
};
|
|
7234
|
-
|
|
7200
|
+
logger13.start(
|
|
7235
7201
|
"waitForStableAcrossRoots",
|
|
7236
7202
|
`\u76D1\u63A7 ${selectorList.length} \u4E2A\u9009\u62E9\u5668(\u8DE8 root), \u7A33\u5B9A\u65F6\u95F4=${waitForStableTime}ms`
|
|
7237
7203
|
);
|
|
7238
7204
|
if (initialTimeout > 0) {
|
|
7239
7205
|
try {
|
|
7240
7206
|
await page.waitForSelector(selectorQuery, { timeout: initialTimeout });
|
|
7241
|
-
|
|
7207
|
+
logger13.info(`waitForStableAcrossRoots \u5DF2\u68C0\u6D4B\u5230\u5143\u7D20: ${selectorQuery}`);
|
|
7242
7208
|
} catch (e) {
|
|
7243
|
-
|
|
7209
|
+
logger13.warning(`waitForStableAcrossRoots \u521D\u59CB\u7B49\u5F85\u8D85\u65F6 (${initialTimeout}ms): ${selectorQuery}`);
|
|
7244
7210
|
throw e;
|
|
7245
7211
|
}
|
|
7246
7212
|
}
|
|
7247
7213
|
let state2 = await buildState();
|
|
7248
7214
|
if (!state2?.hasMatched) {
|
|
7249
|
-
|
|
7215
|
+
logger13.warning("waitForStableAcrossRoots \u672A\u627E\u5230\u53EF\u76D1\u63A7\u7684\u5143\u7D20");
|
|
7250
7216
|
return { mutationCount: 0, stableTime: 0, wasPaused: false };
|
|
7251
7217
|
}
|
|
7252
7218
|
let mutationCount = 0;
|
|
@@ -7283,7 +7249,7 @@ var Mutation = {
|
|
|
7283
7249
|
if (lastState.snapshotKey !== lastSnapshotKey) {
|
|
7284
7250
|
lastSnapshotKey = lastState.snapshotKey;
|
|
7285
7251
|
mutationCount += 1;
|
|
7286
|
-
|
|
7252
|
+
logger13.info(
|
|
7287
7253
|
`waitForStableAcrossRoots \u53D8\u5316#${mutationCount}, len=${lastState.snapshotLength}, path=${lastState.primaryPath || "unknown"}, preview="${truncate(lastState.text, 120)}"`
|
|
7288
7254
|
);
|
|
7289
7255
|
const signal = await invokeMutationCallback({
|
|
@@ -7296,7 +7262,7 @@ var Mutation = {
|
|
|
7296
7262
|
continue;
|
|
7297
7263
|
}
|
|
7298
7264
|
if (!isPaused && stableSince > 0 && Date.now() - stableSince >= waitForStableTime) {
|
|
7299
|
-
|
|
7265
|
+
logger13.success("waitForStableAcrossRoots", `DOM \u7A33\u5B9A, \u603B\u5171 ${mutationCount} \u6B21\u53D8\u5316${wasPaused ? ", \u66FE\u6682\u505C\u8BA1\u65F6" : ""}`);
|
|
7300
7266
|
return {
|
|
7301
7267
|
mutationCount,
|
|
7302
7268
|
stableTime: waitForStableTime,
|
|
@@ -7323,7 +7289,7 @@ var Mutation = {
|
|
|
7323
7289
|
const onMutation = options.onMutation;
|
|
7324
7290
|
const rawMode = String(options.mode || MUTATION_MONITOR_MODE.Added).toLowerCase();
|
|
7325
7291
|
const mode2 = [MUTATION_MONITOR_MODE.Added, MUTATION_MONITOR_MODE.Changed, MUTATION_MONITOR_MODE.All].includes(rawMode) ? rawMode : MUTATION_MONITOR_MODE.Added;
|
|
7326
|
-
|
|
7292
|
+
logger13.start("useMonitor", `\u76D1\u63A7 ${selectorList.length} \u4E2A\u9009\u62E9\u5668, mode=${mode2}`);
|
|
7327
7293
|
const monitorKey = generateKey("pk_mon");
|
|
7328
7294
|
const callbackName = generateKey("pk_mon_cb");
|
|
7329
7295
|
const cleanerName = generateKey("pk_mon_clean");
|
|
@@ -7466,7 +7432,7 @@ var Mutation = {
|
|
|
7466
7432
|
return total;
|
|
7467
7433
|
};
|
|
7468
7434
|
}, { selectorList, monitorKey, callbackName, cleanerName, hasCallback: !!onMutation, mode: mode2 });
|
|
7469
|
-
|
|
7435
|
+
logger13.success("useMonitor", "\u76D1\u63A7\u5668\u5DF2\u542F\u52A8");
|
|
7470
7436
|
return {
|
|
7471
7437
|
stop: async () => {
|
|
7472
7438
|
let totalMutations = 0;
|
|
@@ -7479,7 +7445,7 @@ var Mutation = {
|
|
|
7479
7445
|
}, cleanerName);
|
|
7480
7446
|
} catch (e) {
|
|
7481
7447
|
}
|
|
7482
|
-
|
|
7448
|
+
logger13.success("useMonitor.stop", `\u76D1\u63A7\u5DF2\u505C\u6B62, \u5171 ${totalMutations} \u6B21\u53D8\u5316`);
|
|
7483
7449
|
return { totalMutations };
|
|
7484
7450
|
}
|
|
7485
7451
|
};
|
|
@@ -8348,7 +8314,7 @@ var createTemplateLogger = (baseLogger = createBaseLogger()) => {
|
|
|
8348
8314
|
};
|
|
8349
8315
|
var getDefaultBaseLogger = () => createBaseLogger("");
|
|
8350
8316
|
var Logger = {
|
|
8351
|
-
setLogger: (
|
|
8317
|
+
setLogger: (logger17) => setDefaultLogger(logger17),
|
|
8352
8318
|
info: (message) => getDefaultBaseLogger().info(message),
|
|
8353
8319
|
success: (message) => getDefaultBaseLogger().success(message),
|
|
8354
8320
|
warning: (message) => getDefaultBaseLogger().warning(message),
|
|
@@ -8356,8 +8322,8 @@ var Logger = {
|
|
|
8356
8322
|
error: (message) => getDefaultBaseLogger().error(message),
|
|
8357
8323
|
debug: (message) => getDefaultBaseLogger().debug(message),
|
|
8358
8324
|
start: (message) => getDefaultBaseLogger().start(message),
|
|
8359
|
-
useTemplate: (
|
|
8360
|
-
if (
|
|
8325
|
+
useTemplate: (logger17) => {
|
|
8326
|
+
if (logger17) return createTemplateLogger(createBaseLogger("", logger17));
|
|
8361
8327
|
return createTemplateLogger();
|
|
8362
8328
|
}
|
|
8363
8329
|
};
|
|
@@ -8431,7 +8397,7 @@ var LOCATION_NETWORK_SUFFIX_PATTERNS = [
|
|
|
8431
8397
|
];
|
|
8432
8398
|
var cachedStripLogoSrcPromise = null;
|
|
8433
8399
|
var cachedEnrichmentByContext = /* @__PURE__ */ new WeakMap();
|
|
8434
|
-
var
|
|
8400
|
+
var logger14 = createInternalLogger("Watermarkify");
|
|
8435
8401
|
var normalizeText2 = (value) => String(value || "").trim();
|
|
8436
8402
|
var toInline = (value, maxLen = 200) => {
|
|
8437
8403
|
const text = normalizeText2(value);
|
|
@@ -8673,9 +8639,9 @@ var resolveWithCustomResolver = async (page, baseMeta, options = {}) => {
|
|
|
8673
8639
|
location: toInline(resolved.location, 80)
|
|
8674
8640
|
};
|
|
8675
8641
|
if (enrichment.ip || enrichment.location) {
|
|
8676
|
-
|
|
8642
|
+
logger14.info(`\u81EA\u5B9A\u4E49 resolver \u547D\u4E2D: ip=${enrichment.ip || "-"}, loc=${enrichment.location || "-"}`);
|
|
8677
8643
|
} else {
|
|
8678
|
-
|
|
8644
|
+
logger14.warning("\u81EA\u5B9A\u4E49 resolver \u5DF2\u6267\u884C\uFF0C\u4F46\u672A\u8FD4\u56DE IP/Loc");
|
|
8679
8645
|
}
|
|
8680
8646
|
return enrichment;
|
|
8681
8647
|
} finally {
|
|
@@ -8864,12 +8830,12 @@ var normalizeWatermarkifyRenderMode = (value) => {
|
|
|
8864
8830
|
};
|
|
8865
8831
|
var composeScreenshotBufferWithBrowser = async (page, buffer, overlaySvg, imageInfo = {}, options = {}) => {
|
|
8866
8832
|
if (!page || typeof page.context !== "function") {
|
|
8867
|
-
|
|
8833
|
+
logger14.warning("watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u8DF3\u8FC7: \u7F3A\u5C11\u53EF\u7528 page");
|
|
8868
8834
|
return buffer;
|
|
8869
8835
|
}
|
|
8870
8836
|
const renderScope = await openProbePage(page);
|
|
8871
8837
|
if (!renderScope?.page) {
|
|
8872
|
-
|
|
8838
|
+
logger14.warning("watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u8DF3\u8FC7: \u65E0\u6CD5\u521B\u5EFA render page");
|
|
8873
8839
|
return buffer;
|
|
8874
8840
|
}
|
|
8875
8841
|
try {
|
|
@@ -8934,13 +8900,13 @@ var composeScreenshotBufferWithBrowser = async (page, buffer, overlaySvg, imageI
|
|
|
8934
8900
|
fullPage: true,
|
|
8935
8901
|
animations: "disabled"
|
|
8936
8902
|
}).catch((error) => {
|
|
8937
|
-
|
|
8903
|
+
logger14.warning(`watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u5931\u8D25: ${error instanceof Error ? error.message : String(error)}`);
|
|
8938
8904
|
return null;
|
|
8939
8905
|
});
|
|
8940
8906
|
if (Buffer.isBuffer(composed) && composed.length > 0) {
|
|
8941
8907
|
return composed;
|
|
8942
8908
|
}
|
|
8943
|
-
|
|
8909
|
+
logger14.warning("watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u5931\u8D25: \u672A\u5F97\u5230\u6709\u6548\u622A\u56FE\u7ED3\u679C");
|
|
8944
8910
|
return buffer;
|
|
8945
8911
|
} finally {
|
|
8946
8912
|
await renderScope.close().catch(() => {
|
|
@@ -8953,7 +8919,7 @@ var resolveWithIpLookup = async (page, options = {}) => {
|
|
|
8953
8919
|
}
|
|
8954
8920
|
const probeScope = await openProbePage(page);
|
|
8955
8921
|
if (!probeScope?.page) {
|
|
8956
|
-
|
|
8922
|
+
logger14.warning("ipLookup \u8DF3\u8FC7: \u65E0\u6CD5\u521B\u5EFA probe page");
|
|
8957
8923
|
return null;
|
|
8958
8924
|
}
|
|
8959
8925
|
const timeoutMs = Math.max(
|
|
@@ -8962,12 +8928,12 @@ var resolveWithIpLookup = async (page, options = {}) => {
|
|
|
8962
8928
|
);
|
|
8963
8929
|
try {
|
|
8964
8930
|
const probePage = probeScope.page;
|
|
8965
|
-
|
|
8931
|
+
logger14.info(`ipLookup \u5C1D\u8BD5: url=${DEFAULT_IP_LOOKUP_URL}, timeoutMs=${timeoutMs}`);
|
|
8966
8932
|
const response = await probePage.goto(DEFAULT_IP_LOOKUP_URL, {
|
|
8967
8933
|
waitUntil: "commit",
|
|
8968
8934
|
timeout: timeoutMs
|
|
8969
8935
|
}).catch((error) => {
|
|
8970
|
-
|
|
8936
|
+
logger14.warning(`ipLookup \u8BF7\u6C42\u5931\u8D25: url=${DEFAULT_IP_LOOKUP_URL}, error=${error instanceof Error ? error.message : String(error)}`);
|
|
8971
8937
|
return null;
|
|
8972
8938
|
});
|
|
8973
8939
|
const status = response && typeof response.status === "function" ? response.status() : 0;
|
|
@@ -8989,13 +8955,13 @@ var resolveWithIpLookup = async (page, options = {}) => {
|
|
|
8989
8955
|
}
|
|
8990
8956
|
const parsed = parseIpIpJsonResponse(rawText);
|
|
8991
8957
|
if (parsed?.ip || parsed?.location) {
|
|
8992
|
-
|
|
8958
|
+
logger14.info(`ipLookup \u6210\u529F: url=${DEFAULT_IP_LOOKUP_URL}, status=${status || "-"}, contentType=${contentType || "-"}, ip=${parsed.ip || "-"}, loc=${parsed.location || "-"}`);
|
|
8993
8959
|
return parsed;
|
|
8994
8960
|
}
|
|
8995
|
-
|
|
8961
|
+
logger14.warning(`ipLookup \u672A\u89E3\u6790\u51FA IP/Loc: url=${DEFAULT_IP_LOOKUP_URL}, status=${status || "-"}, contentType=${contentType || "-"}, preview=${shortenTail(rawText, 120) || "[empty]"}`);
|
|
8996
8962
|
return null;
|
|
8997
8963
|
} catch (error) {
|
|
8998
|
-
|
|
8964
|
+
logger14.warning(`ipLookup \u6267\u884C\u5F02\u5E38\uFF0C\u672A\u83B7\u5F97 IP/Loc: ${error instanceof Error ? error.message : String(error)}`);
|
|
8999
8965
|
return null;
|
|
9000
8966
|
} finally {
|
|
9001
8967
|
await probeScope.close().catch(() => {
|
|
@@ -9009,10 +8975,10 @@ var resolveEnrichment = async (page, baseMeta, options) => {
|
|
|
9009
8975
|
ip: toInline(options.ip, 80),
|
|
9010
8976
|
location: toInline(options.location, 80)
|
|
9011
8977
|
};
|
|
9012
|
-
|
|
8978
|
+
logger14.info(`enrichment \u5F00\u59CB: host=${baseMeta.hostname || "-"}, hasPresetIp=${Boolean(merged.ip)}, hasPresetLoc=${Boolean(merged.location)}, ipLookup=${options.ipLookup !== false}`);
|
|
9013
8979
|
if (!merged.ip || !merged.location) {
|
|
9014
8980
|
if (cached?.ip || cached?.location) {
|
|
9015
|
-
|
|
8981
|
+
logger14.info(`enrichment \u547D\u4E2D\u4E0A\u4E0B\u6587\u7F13\u5B58: ip=${cached.ip || "-"}, loc=${cached.location || "-"}`);
|
|
9016
8982
|
}
|
|
9017
8983
|
fillEnrichment(merged, cached);
|
|
9018
8984
|
}
|
|
@@ -9036,15 +9002,15 @@ var resolveEnrichment = async (page, baseMeta, options) => {
|
|
|
9036
9002
|
"x-geo-country"
|
|
9037
9003
|
]), 80);
|
|
9038
9004
|
if (!merged.location || isWeakLocationValue(merged.location) && headerLocation) {
|
|
9039
|
-
|
|
9005
|
+
logger14.info(`enrichment \u4F7F\u7528\u54CD\u5E94\u5934\u8865\u5145 Loc: ${headerLocation || "-"}`);
|
|
9040
9006
|
merged.location = headerLocation || merged.location;
|
|
9041
9007
|
}
|
|
9042
9008
|
}
|
|
9043
9009
|
writeCachedEnrichment(page, merged);
|
|
9044
9010
|
if (merged.ip || merged.location) {
|
|
9045
|
-
|
|
9011
|
+
logger14.info(`enrichment \u5B8C\u6210: ip=${merged.ip || "-"}, loc=${merged.location || "-"}`);
|
|
9046
9012
|
} else {
|
|
9047
|
-
|
|
9013
|
+
logger14.warning("enrichment \u5B8C\u6210: \u672A\u83B7\u5F97 IP/Loc");
|
|
9048
9014
|
}
|
|
9049
9015
|
return merged;
|
|
9050
9016
|
};
|
|
@@ -9857,7 +9823,7 @@ var watermarkifyScreenshotBuffer = async (buffer, meta, page = null, options = {
|
|
|
9857
9823
|
}
|
|
9858
9824
|
const imageInfo = readImageInfo(buffer);
|
|
9859
9825
|
if (!imageInfo.width || !imageInfo.height || !imageInfo.mimeType) {
|
|
9860
|
-
|
|
9826
|
+
logger14.warning("watermarkify \u8DF3\u8FC7: \u65E0\u6CD5\u89E3\u6790\u622A\u56FE\u5C3A\u5BF8\u6216\u683C\u5F0F");
|
|
9861
9827
|
return buffer;
|
|
9862
9828
|
}
|
|
9863
9829
|
const isMobileStrip = normalizeDevice(meta.device) === Device.Mobile && hasStrip;
|
|
@@ -9875,7 +9841,7 @@ var watermarkifyScreenshotBuffer = async (buffer, meta, page = null, options = {
|
|
|
9875
9841
|
|
|
9876
9842
|
// src/internals/compression.js
|
|
9877
9843
|
import { Jimp as Jimp2, JimpMime, ResizeStrategy } from "jimp";
|
|
9878
|
-
var
|
|
9844
|
+
var logger15 = createInternalLogger("Compression");
|
|
9879
9845
|
var DEFAULT_SCREENSHOT_MAX_BYTES = 5 * 1024 * 1024;
|
|
9880
9846
|
var DEFAULT_SCREENSHOT_OUTPUT_TYPE = "jpeg";
|
|
9881
9847
|
var DEFAULT_SCREENSHOT_QUALITY = 0.72;
|
|
@@ -9994,18 +9960,18 @@ var compressImageBufferToBase64 = async (buffer, compression) => {
|
|
|
9994
9960
|
return buffer.toString("base64");
|
|
9995
9961
|
}
|
|
9996
9962
|
const result = await compressImageBuffer(buffer, compression).catch((error) => {
|
|
9997
|
-
|
|
9963
|
+
logger15.warning(`captureScreen \u538B\u7F29\u5931\u8D25\uFF0C\u8FD4\u56DE\u539F\u56FE: ${error instanceof Error ? error.message : String(error)}`);
|
|
9998
9964
|
return null;
|
|
9999
9965
|
});
|
|
10000
9966
|
if (!result?.buffer) {
|
|
10001
9967
|
return buffer.toString("base64");
|
|
10002
9968
|
}
|
|
10003
9969
|
if (result.withinLimit) {
|
|
10004
|
-
|
|
9970
|
+
logger15.info(
|
|
10005
9971
|
`captureScreen \u5DF2\u538B\u7F29: ${originalBytes} -> ${result.bytes} bytes, format=${result.format}, quality=${result.quality}, scale=${result.scale}, size=${result.width}x${result.height}`
|
|
10006
9972
|
);
|
|
10007
9973
|
} else {
|
|
10008
|
-
|
|
9974
|
+
logger15.warning(
|
|
10009
9975
|
`captureScreen \u538B\u7F29\u540E\u4ECD\u8D85\u8FC7\u76EE\u6807: ${originalBytes} -> ${result.bytes} bytes, maxBytes=${compression.maxBytes}, format=${result.format}, quality=${result.quality}, scale=${result.scale}`
|
|
10010
9976
|
);
|
|
10011
9977
|
}
|
|
@@ -10013,7 +9979,7 @@ var compressImageBufferToBase64 = async (buffer, compression) => {
|
|
|
10013
9979
|
};
|
|
10014
9980
|
|
|
10015
9981
|
// src/share.js
|
|
10016
|
-
var
|
|
9982
|
+
var logger16 = createInternalLogger("Share");
|
|
10017
9983
|
var DEFAULT_TIMEOUT_MS2 = 50 * 1e3;
|
|
10018
9984
|
var DEFAULT_PAYLOAD_SNAPSHOT_MAX_LEN = 500;
|
|
10019
9985
|
var DEFAULT_POLL_INTERVAL_MS = 120;
|
|
@@ -10150,7 +10116,7 @@ var createDomShareMonitor = async (page, options = {}) => {
|
|
|
10150
10116
|
const onMatch = typeof options.onMatch === "function" ? options.onMatch : null;
|
|
10151
10117
|
const onTelemetry = typeof options.onTelemetry === "function" ? options.onTelemetry : null;
|
|
10152
10118
|
let matched = false;
|
|
10153
|
-
|
|
10119
|
+
logger16.info(`DOM \u76D1\u542C\u51C6\u5907\u6302\u8F7D: selectors=${toJsonInline(selectors, 120)}, mode=${mode2}`);
|
|
10154
10120
|
const monitor = await Mutation.useMonitor(page, selectors, {
|
|
10155
10121
|
mode: mode2,
|
|
10156
10122
|
onMutation: (context = {}) => {
|
|
@@ -10168,12 +10134,12 @@ ${text}`;
|
|
|
10168
10134
|
});
|
|
10169
10135
|
}
|
|
10170
10136
|
if (mutationCount <= 5 || mutationCount % 50 === 0) {
|
|
10171
|
-
|
|
10137
|
+
logger16.info(`DOM \u53D8\u5316\u5DF2\u6355\u83B7: mutationCount=${mutationCount}, mutationNodes=${mutationNodes.length}`);
|
|
10172
10138
|
}
|
|
10173
10139
|
const [candidate] = Utils.parseLinks(rawDom, { prefix }) || [];
|
|
10174
10140
|
if (!candidate) return;
|
|
10175
10141
|
matched = true;
|
|
10176
|
-
|
|
10142
|
+
logger16.success("captureLink.domHit", `DOM \u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: mutationCount=${mutationCount}, link=${candidate}`);
|
|
10177
10143
|
if (onMatch) {
|
|
10178
10144
|
onMatch({
|
|
10179
10145
|
link: candidate,
|
|
@@ -10189,7 +10155,7 @@ ${text}`;
|
|
|
10189
10155
|
return {
|
|
10190
10156
|
stop: async () => {
|
|
10191
10157
|
const result = await monitor.stop();
|
|
10192
|
-
|
|
10158
|
+
logger16.info(`DOM \u76D1\u542C\u5DF2\u505C\u6B62: totalMutations=${result?.totalMutations || 0}`);
|
|
10193
10159
|
return result;
|
|
10194
10160
|
}
|
|
10195
10161
|
};
|
|
@@ -10238,8 +10204,8 @@ var Share = {
|
|
|
10238
10204
|
if (share.mode === "response" && apiMatchers.length === 0) {
|
|
10239
10205
|
throw new Error("Share.captureLink requires share.xurl[0] api matcher when mode=response");
|
|
10240
10206
|
}
|
|
10241
|
-
|
|
10242
|
-
|
|
10207
|
+
logger16.start("captureLink", `mode=${share.mode}, timeoutMs=${timeoutDisabled ? "disabled" : timeoutMs}, prefix=${share.prefix}`);
|
|
10208
|
+
logger16.info(`captureLink \u914D\u7F6E: xurl=${toJsonInline(share.xurl)}, domMode=${domMode}, domSelectors=${toJsonInline(domSelectors, 120)}`);
|
|
10243
10209
|
const stats = {
|
|
10244
10210
|
actionTimedOut: false,
|
|
10245
10211
|
domMutationCount: 0,
|
|
@@ -10251,7 +10217,7 @@ var Share = {
|
|
|
10251
10217
|
responseSampleUrls: []
|
|
10252
10218
|
};
|
|
10253
10219
|
if (isAborted()) {
|
|
10254
|
-
|
|
10220
|
+
logger16.warning(`captureLink \u5DF2\u53D6\u6D88: ${abortReason()}`);
|
|
10255
10221
|
return {
|
|
10256
10222
|
link: null,
|
|
10257
10223
|
payloadText: "",
|
|
@@ -10274,7 +10240,7 @@ var Share = {
|
|
|
10274
10240
|
link: validated,
|
|
10275
10241
|
payloadText: String(payloadText || "")
|
|
10276
10242
|
};
|
|
10277
|
-
|
|
10243
|
+
logger16.info(`\u5019\u9009\u94FE\u63A5\u5DF2\u786E\u8BA4: source=${source}, link=${validated}`);
|
|
10278
10244
|
return true;
|
|
10279
10245
|
};
|
|
10280
10246
|
const resolveResponseCandidate = (responseText) => {
|
|
@@ -10309,7 +10275,7 @@ var Share = {
|
|
|
10309
10275
|
try {
|
|
10310
10276
|
await monitor.stop();
|
|
10311
10277
|
} catch (error) {
|
|
10312
|
-
|
|
10278
|
+
logger16.warning(`\u505C\u6B62 DOM \u76D1\u542C\u5931\u8D25: ${error instanceof Error ? error.message : String(error)}`);
|
|
10313
10279
|
}
|
|
10314
10280
|
};
|
|
10315
10281
|
const onResponse = async (response) => {
|
|
@@ -10323,29 +10289,29 @@ var Share = {
|
|
|
10323
10289
|
stats.responseSampleUrls.push(url);
|
|
10324
10290
|
}
|
|
10325
10291
|
if (stats.responseObserved <= 5) {
|
|
10326
|
-
|
|
10292
|
+
logger16.info(`\u63A5\u53E3\u54CD\u5E94\u91C7\u6837(${stats.responseObserved}): ${url}`);
|
|
10327
10293
|
}
|
|
10328
10294
|
if (!apiMatchers.some((matcher) => url.includes(matcher))) return;
|
|
10329
10295
|
stats.responseMatched += 1;
|
|
10330
10296
|
stats.lastMatchedUrl = url;
|
|
10331
|
-
|
|
10297
|
+
logger16.info(`\u63A5\u53E3\u547D\u4E2D\u5339\u914D(${stats.responseMatched}): ${url}`);
|
|
10332
10298
|
const text = await response.text();
|
|
10333
10299
|
const hit = resolveResponseCandidate(text);
|
|
10334
10300
|
if (!hit?.link) {
|
|
10335
10301
|
if (stats.responseMatched <= 3) {
|
|
10336
|
-
|
|
10302
|
+
logger16.info(`\u63A5\u53E3\u89E3\u6790\u5B8C\u6210\u4F46\u672A\u63D0\u53D6\u5230\u5206\u4EAB\u94FE\u63A5: payloadSize=${text.length}`);
|
|
10337
10303
|
}
|
|
10338
10304
|
return;
|
|
10339
10305
|
}
|
|
10340
10306
|
stats.responseResolved += 1;
|
|
10341
|
-
|
|
10307
|
+
logger16.success("captureLink.responseHit", `\u63A5\u53E3\u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: url=${url}, link=${hit.link}`);
|
|
10342
10308
|
setCandidate("response", hit.link, hit.payloadText);
|
|
10343
10309
|
} catch (error) {
|
|
10344
|
-
|
|
10310
|
+
logger16.warning(`\u63A5\u53E3\u54CD\u5E94\u5904\u7406\u5F02\u5E38: ${error instanceof Error ? error.message : String(error)}`);
|
|
10345
10311
|
}
|
|
10346
10312
|
};
|
|
10347
10313
|
if (share.mode === "dom") {
|
|
10348
|
-
|
|
10314
|
+
logger16.info("\u5F53\u524D\u4E3A DOM \u6A21\u5F0F\uFF0C\u4EC5\u542F\u7528 DOM \u76D1\u542C");
|
|
10349
10315
|
domMonitor = await createDomShareMonitor(page, {
|
|
10350
10316
|
prefix: share.prefix,
|
|
10351
10317
|
selectors: domSelectors,
|
|
@@ -10360,17 +10326,17 @@ var Share = {
|
|
|
10360
10326
|
});
|
|
10361
10327
|
}
|
|
10362
10328
|
if (share.mode === "response") {
|
|
10363
|
-
|
|
10329
|
+
logger16.info(`\u5F53\u524D\u4E3A\u63A5\u53E3\u6A21\u5F0F\uFF0C\u6302\u8F7D response \u76D1\u542C: apiMatchers=${toJsonInline(apiMatchers, 160)}`);
|
|
10364
10330
|
page.on("response", onResponse);
|
|
10365
10331
|
}
|
|
10366
10332
|
if (share.mode === "custom") {
|
|
10367
|
-
|
|
10333
|
+
logger16.info("\u5F53\u524D\u4E3A custom \u6A21\u5F0F\uFF0C\u5C06\u4F7F\u7528 performActions \u8FD4\u56DE\u503C");
|
|
10368
10334
|
}
|
|
10369
10335
|
const deadline = timeoutDisabled ? Infinity : Date.now() + timeoutMs;
|
|
10370
10336
|
const getRemainingMs = () => timeoutDisabled ? Infinity : Math.max(0, deadline - Date.now());
|
|
10371
10337
|
try {
|
|
10372
10338
|
const actionTimeout = getRemainingMs();
|
|
10373
|
-
|
|
10339
|
+
logger16.start("captureLink.performActions", `\u6267\u884C\u52A8\u4F5C\u9884\u7B97=${timeoutDisabled ? "disabled" : `${actionTimeout}ms`}`);
|
|
10374
10340
|
let actionValue;
|
|
10375
10341
|
if (!isAborted() && actionTimeout > 0) {
|
|
10376
10342
|
let timer = null;
|
|
@@ -10383,30 +10349,30 @@ var Share = {
|
|
|
10383
10349
|
]);
|
|
10384
10350
|
if (timer) clearTimeout(timer);
|
|
10385
10351
|
if (actionResult.type === "error") {
|
|
10386
|
-
|
|
10352
|
+
logger16.fail("captureLink.performActions", actionResult.error);
|
|
10387
10353
|
throw actionResult.error;
|
|
10388
10354
|
}
|
|
10389
10355
|
if (actionResult.type === "timeout") {
|
|
10390
10356
|
stats.actionTimedOut = true;
|
|
10391
|
-
|
|
10357
|
+
logger16.warning(`performActions \u5DF2\u8D85\u65F6 (${actionTimeout}ms)\uFF0C\u52A8\u4F5C\u53EF\u80FD\u4ECD\u5728\u5F02\u6B65\u6267\u884C`);
|
|
10392
10358
|
} else {
|
|
10393
10359
|
actionValue = actionResult.result;
|
|
10394
|
-
|
|
10360
|
+
logger16.success("captureLink.performActions", "\u6267\u884C\u52A8\u4F5C\u5B8C\u6210");
|
|
10395
10361
|
}
|
|
10396
10362
|
}
|
|
10397
10363
|
if (share.mode === "custom") {
|
|
10398
10364
|
const customLink = typeof actionValue === "string" ? actionValue : actionValue?.link || actionValue?.payloadText;
|
|
10399
10365
|
const customPayloadText = typeof actionValue === "string" ? actionValue : actionValue?.payloadText;
|
|
10400
10366
|
if (setCandidate("custom", customLink, customPayloadText)) {
|
|
10401
|
-
|
|
10367
|
+
logger16.success("captureLink.customResult", `custom \u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: link=${candidates.custom.link}`);
|
|
10402
10368
|
} else {
|
|
10403
|
-
|
|
10369
|
+
logger16.warning("performActions \u6267\u884C\u5B8C\u6210\u4F46\u672A\u8FD4\u56DE\u6709\u6548\u5206\u4EAB\u94FE\u63A5");
|
|
10404
10370
|
}
|
|
10405
10371
|
}
|
|
10406
10372
|
let nextProgressLogTs = Date.now() + 3e3;
|
|
10407
10373
|
while (true) {
|
|
10408
10374
|
if (isAborted()) {
|
|
10409
|
-
|
|
10375
|
+
logger16.warning(`captureLink \u5DF2\u53D6\u6D88: ${abortReason()}`);
|
|
10410
10376
|
return {
|
|
10411
10377
|
link: null,
|
|
10412
10378
|
payloadText: "",
|
|
@@ -10416,7 +10382,7 @@ var Share = {
|
|
|
10416
10382
|
}
|
|
10417
10383
|
const selected = candidates[share.mode];
|
|
10418
10384
|
if (selected?.link) {
|
|
10419
|
-
|
|
10385
|
+
logger16.success("captureLink", `\u6355\u83B7\u6210\u529F: source=${share.mode}, link=${selected.link}`);
|
|
10420
10386
|
return {
|
|
10421
10387
|
link: selected.link,
|
|
10422
10388
|
payloadText: selected.payloadText,
|
|
@@ -10429,7 +10395,7 @@ var Share = {
|
|
|
10429
10395
|
if (remaining <= 0) break;
|
|
10430
10396
|
const now = Date.now();
|
|
10431
10397
|
if (now >= nextProgressLogTs) {
|
|
10432
|
-
|
|
10398
|
+
logger16.info(
|
|
10433
10399
|
`captureLink \u7B49\u5F85\u4E2D: remaining=${timeoutDisabled ? "disabled" : `${remaining}ms`}, domMutationCount=${stats.domMutationCount}, responseMatched=${stats.responseMatched}`
|
|
10434
10400
|
);
|
|
10435
10401
|
nextProgressLogTs = now + 5e3;
|
|
@@ -10437,11 +10403,11 @@ var Share = {
|
|
|
10437
10403
|
await delay5(Math.max(0, Math.min(DEFAULT_POLL_INTERVAL_MS, remaining)));
|
|
10438
10404
|
}
|
|
10439
10405
|
if (!timeoutDisabled && share.mode === "response" && stats.responseMatched === 0) {
|
|
10440
|
-
|
|
10406
|
+
logger16.warning(
|
|
10441
10407
|
`\u63A5\u53E3\u76D1\u542C\u672A\u547D\u4E2D: apiMatchers=${toJsonInline(apiMatchers, 220)}, \u54CD\u5E94\u6837\u672CURLs=${toJsonInline(stats.responseSampleUrls, 420)}`
|
|
10442
10408
|
);
|
|
10443
10409
|
}
|
|
10444
|
-
|
|
10410
|
+
logger16.warning(
|
|
10445
10411
|
`captureLink ${timeoutDisabled ? "\u672A\u62FF\u5230\u94FE\u63A5" : "\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"}`
|
|
10446
10412
|
);
|
|
10447
10413
|
return {
|
|
@@ -10453,7 +10419,7 @@ var Share = {
|
|
|
10453
10419
|
} finally {
|
|
10454
10420
|
if (share.mode === "response") {
|
|
10455
10421
|
page.off("response", onResponse);
|
|
10456
|
-
|
|
10422
|
+
logger16.info("response \u76D1\u542C\u5DF2\u5378\u8F7D");
|
|
10457
10423
|
}
|
|
10458
10424
|
await stopDomMonitor();
|
|
10459
10425
|
}
|