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