@skrillex1224/playwright-toolkit 3.0.39 → 3.0.41
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 +282 -265
- package/dist/index.cjs.map +4 -4
- package/dist/index.js +282 -265
- 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 {
|
|
@@ -3945,17 +3979,13 @@ var Humanize = {
|
|
|
3945
3979
|
const y = 100 + Math.random() * (viewportSize.height - 200);
|
|
3946
3980
|
await cursor.actions.move({ x, y });
|
|
3947
3981
|
await delay2(this.jitterMs(350, 0.4));
|
|
3948
|
-
} else if (action < 0.7) {
|
|
3949
|
-
const scrollY = (Math.random() - 0.5) * 200;
|
|
3950
|
-
await page.mouse.wheel(0, scrollY);
|
|
3951
|
-
await delay2(this.jitterMs(500, 0.4));
|
|
3952
3982
|
} else {
|
|
3953
3983
|
await delay2(this.jitterMs(800, 0.5));
|
|
3954
3984
|
}
|
|
3955
3985
|
}
|
|
3956
|
-
|
|
3986
|
+
logger6.success("warmUpBrowsing");
|
|
3957
3987
|
} catch (error) {
|
|
3958
|
-
|
|
3988
|
+
logger6.fail("warmUpBrowsing", error);
|
|
3959
3989
|
throw error;
|
|
3960
3990
|
}
|
|
3961
3991
|
},
|
|
@@ -3969,7 +3999,7 @@ var Humanize = {
|
|
|
3969
3999
|
async naturalScroll(page, direction = "down", distance = 300, baseSteps = 5) {
|
|
3970
4000
|
const steps = Math.max(3, baseSteps + Math.floor(Math.random() * 3) - 1);
|
|
3971
4001
|
const actualDistance = this.jitterMs(distance, 0.15);
|
|
3972
|
-
|
|
4002
|
+
logger6.start("naturalScroll", `dir=${direction}, dist=${actualDistance}, steps=${steps}`);
|
|
3973
4003
|
const sign = direction === "down" ? 1 : -1;
|
|
3974
4004
|
const stepDistance = actualDistance / steps;
|
|
3975
4005
|
try {
|
|
@@ -3981,9 +4011,9 @@ var Humanize = {
|
|
|
3981
4011
|
const baseDelay = 60 + i * 25;
|
|
3982
4012
|
await delay2(this.jitterMs(baseDelay, 0.3));
|
|
3983
4013
|
}
|
|
3984
|
-
|
|
4014
|
+
logger6.success("naturalScroll");
|
|
3985
4015
|
} catch (error) {
|
|
3986
|
-
|
|
4016
|
+
logger6.fail("naturalScroll", error);
|
|
3987
4017
|
throw error;
|
|
3988
4018
|
}
|
|
3989
4019
|
}
|
|
@@ -4012,7 +4042,7 @@ var resolveElement = async (page, target, { throwOnMissing = true } = {}) => {
|
|
|
4012
4042
|
var waitJitter = (base, jitterPercent = 0.3) => delay3(jitterMs(base, jitterPercent));
|
|
4013
4043
|
|
|
4014
4044
|
// src/internals/humanize/mobile.js
|
|
4015
|
-
var
|
|
4045
|
+
var logger7 = createInternalLogger("Humanize.Mobile");
|
|
4016
4046
|
var initializedPages = /* @__PURE__ */ new WeakSet();
|
|
4017
4047
|
var DEFAULT_TAP_TIMEOUT_MS = 2500;
|
|
4018
4048
|
var DEFAULT_MOUSE_TAP_FALLBACK_TIMEOUT_MS = 1200;
|
|
@@ -4469,7 +4499,7 @@ var dispatchTouchSwipe = async (page, deltaY, options = {}) => {
|
|
|
4469
4499
|
}
|
|
4470
4500
|
return true;
|
|
4471
4501
|
} catch (error) {
|
|
4472
|
-
|
|
4502
|
+
logger7.debug(`touch swipe fallback: ${error?.message || error}`);
|
|
4473
4503
|
try {
|
|
4474
4504
|
await page.evaluate((amount) => window.scrollBy(0, amount), deltaY);
|
|
4475
4505
|
await waitJitter(120, 0.35);
|
|
@@ -4503,7 +4533,7 @@ var tapPoint = async (page, point, options = {}) => {
|
|
|
4503
4533
|
);
|
|
4504
4534
|
return { method: "touchscreen" };
|
|
4505
4535
|
} catch (error) {
|
|
4506
|
-
|
|
4536
|
+
logger7.warn(`tapPoint | touchscreen.tap \u5931\u8D25\u6216\u8D85\u65F6\uFF0C\u5C1D\u8BD5\u9F20\u6807\u515C\u5E95: ${error?.message || error}`);
|
|
4507
4537
|
if (!allowMouseFallback) throw error;
|
|
4508
4538
|
}
|
|
4509
4539
|
}
|
|
@@ -4519,10 +4549,10 @@ var MobileHumanize = {
|
|
|
4519
4549
|
async initializeCursor(page) {
|
|
4520
4550
|
if (initializedPages.has(page)) return;
|
|
4521
4551
|
initializedPages.add(page);
|
|
4522
|
-
|
|
4552
|
+
logger7.debug("initializeCursor: mobile mode uses touch gestures, cursor init skipped");
|
|
4523
4553
|
},
|
|
4524
4554
|
async humanMove(page, target) {
|
|
4525
|
-
|
|
4555
|
+
logger7.debug(`humanMove: mobile no-op target=${typeof target === "string" ? target : "element/coords"}`);
|
|
4526
4556
|
if (typeof target === "string" || target && typeof target.boundingBox === "function") {
|
|
4527
4557
|
const element = await resolveElement(page, target, { throwOnMissing: false });
|
|
4528
4558
|
if (!element) {
|
|
@@ -4541,10 +4571,10 @@ var MobileHumanize = {
|
|
|
4541
4571
|
throwOnMissing = false
|
|
4542
4572
|
} = options;
|
|
4543
4573
|
const targetDesc = describeTarget(target);
|
|
4544
|
-
|
|
4574
|
+
logger7.start("humanScroll", `target=${targetDesc}`);
|
|
4545
4575
|
const element = await resolveElement(page, target, { throwOnMissing });
|
|
4546
4576
|
if (!element) {
|
|
4547
|
-
|
|
4577
|
+
logger7.warn(`humanScroll | \u5143\u7D20\u672A\u627E\u5230: ${targetDesc}`);
|
|
4548
4578
|
return { element: null, didScroll: false, restore: null };
|
|
4549
4579
|
}
|
|
4550
4580
|
const startTime = Date.now();
|
|
@@ -4553,42 +4583,42 @@ var MobileHumanize = {
|
|
|
4553
4583
|
const status = await checkElementVisibility(element);
|
|
4554
4584
|
if (status.code === "VISIBLE") {
|
|
4555
4585
|
if (status.isFixed) {
|
|
4556
|
-
|
|
4586
|
+
logger7.info("humanScroll | fixed/sticky \u5BB9\u5668\u5185\uFF0C\u8DF3\u8FC7\u6EDA\u52A8");
|
|
4557
4587
|
} else {
|
|
4558
|
-
|
|
4588
|
+
logger7.debug("humanScroll | \u5143\u7D20\u53EF\u89C1\u4E14\u65E0\u906E\u6321");
|
|
4559
4589
|
}
|
|
4560
|
-
|
|
4590
|
+
logger7.success("humanScroll", didScroll ? "\u5DF2\u6EDA\u52A8" : "\u65E0\u9700\u6EDA\u52A8");
|
|
4561
4591
|
return { element, didScroll, restore: null };
|
|
4562
4592
|
}
|
|
4563
4593
|
if (status.code === "ZERO_DIMENSIONS" || status.code === "NOT_INTERACTABLE") {
|
|
4564
|
-
|
|
4594
|
+
logger7.warn(`humanScroll | \u5143\u7D20\u4E0D\u53EF\u6EDA\u52A8\u81F3\u53EF\u70B9\u51FB\u72B6\u6001: ${status.reason || status.code}`);
|
|
4565
4595
|
return { element, didScroll, restore: null };
|
|
4566
4596
|
}
|
|
4567
4597
|
const scrollRect = await getScrollableRect(element);
|
|
4568
4598
|
if (!scrollRect && status.isFixed && status.code === "OUT_OF_VIEWPORT") {
|
|
4569
|
-
|
|
4599
|
+
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
4600
|
return { element, didScroll, restore: null, unscrollable: true };
|
|
4571
4601
|
}
|
|
4572
4602
|
if (!scrollRect && status.isFixed && status.code === "OBSTRUCTED") {
|
|
4573
|
-
|
|
4603
|
+
logger7.warn(`humanScroll | fixed/sticky \u76EE\u6807\u88AB\u906E\u6321\uFF0C\u6EDA\u52A8\u65E0\u6CD5\u89E3\u9664 (${status.obstruction?.tag || "unknown"})`);
|
|
4574
4604
|
return { element, didScroll, restore: null, unscrollable: true };
|
|
4575
4605
|
}
|
|
4576
4606
|
if (scrollRect && status.code === "OBSTRUCTED" && status.obstruction?.isFixed) {
|
|
4577
4607
|
const moved = await scrollAwayFromObstruction(element, status);
|
|
4578
4608
|
if (moved.moved) {
|
|
4579
|
-
|
|
4609
|
+
logger7.debug(`humanScroll | sticky/fixed \u906E\u6321\u8865\u507F\u6EDA\u52A8 top=${Math.round(moved.scrollTop || 0)}`);
|
|
4580
4610
|
await waitJitter(90, 0.3);
|
|
4581
4611
|
didScroll = true;
|
|
4582
4612
|
continue;
|
|
4583
4613
|
}
|
|
4584
4614
|
}
|
|
4585
4615
|
if (Date.now() - startTime > maxDurationMs) {
|
|
4586
|
-
|
|
4616
|
+
logger7.warn(`humanScroll | mobile timeout (${maxDurationMs}ms, status=${status.code}, direction=${status.direction || "unknown"}, fixed=${Boolean(status.isFixed)})`);
|
|
4587
4617
|
return { element, didScroll, restore: null };
|
|
4588
4618
|
}
|
|
4589
4619
|
const stepMin = scrollRect ? Math.min(minStep, Math.max(60, scrollRect.height * 0.4)) : minStep;
|
|
4590
4620
|
const stepMax = scrollRect ? Math.min(maxStep, Math.max(stepMin + 40, scrollRect.height * 0.8)) : maxStep;
|
|
4591
|
-
|
|
4621
|
+
logger7.debug(`humanScroll | \u6B65\u9AA4 ${i + 1}/${maxSteps}: ${status.reason || status.code} ${status.direction ? `(${status.direction})` : ""}`);
|
|
4592
4622
|
const distance = stepMin + Math.random() * Math.max(1, stepMax - stepMin);
|
|
4593
4623
|
let deltaY = status.direction === "up" ? -distance : distance;
|
|
4594
4624
|
if (status.code === "OBSTRUCTED") {
|
|
@@ -4629,7 +4659,7 @@ var MobileHumanize = {
|
|
|
4629
4659
|
const afterWindowState = await page.evaluate(() => ({ x: window.scrollX, y: window.scrollY }));
|
|
4630
4660
|
if (Math.abs(afterWindowState.x - beforeWindowState.x) > 2 || Math.abs(afterWindowState.y - beforeWindowState.y) > 2) {
|
|
4631
4661
|
await page.evaluate((state2) => window.scrollTo(state2.x, state2.y), beforeWindowState);
|
|
4632
|
-
|
|
4662
|
+
logger7.debug(`humanScroll | \u7A97\u53E3\u6EDA\u52A8\u56DE\u6536 from=${Math.round(afterWindowState.y)} to=${Math.round(beforeWindowState.y)}`);
|
|
4633
4663
|
}
|
|
4634
4664
|
}
|
|
4635
4665
|
let afterElementSnapshot = null;
|
|
@@ -4643,7 +4673,7 @@ var MobileHumanize = {
|
|
|
4643
4673
|
const afterSnapshot = await readAfterElementSnapshot();
|
|
4644
4674
|
if (isTargetImmobileAfterScroll(beforeElementSnapshot, afterSnapshot)) {
|
|
4645
4675
|
await restoreWindowFromSnapshot(page, beforeElementSnapshot, afterSnapshot);
|
|
4646
|
-
|
|
4676
|
+
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
4677
|
return { element, didScroll, restore: null, unscrollable: true };
|
|
4648
4678
|
}
|
|
4649
4679
|
}
|
|
@@ -4675,12 +4705,12 @@ var MobileHumanize = {
|
|
|
4675
4705
|
const moved = beforeState.kind !== afterState.kind || Math.abs(topDelta) > 2 || Math.abs(leftDelta) > 2;
|
|
4676
4706
|
if (!moved) {
|
|
4677
4707
|
const fallback = await scrollScrollableAncestor(element, deltaY);
|
|
4678
|
-
|
|
4708
|
+
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
4709
|
} 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
4710
|
const residualDelta = expectedDelta - topDelta;
|
|
4681
4711
|
if (Math.sign(residualDelta) === Math.sign(expectedDelta) && Math.abs(residualDelta) > 24) {
|
|
4682
4712
|
const fallback = await scrollScrollableAncestor(element, residualDelta);
|
|
4683
|
-
|
|
4713
|
+
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
4714
|
}
|
|
4685
4715
|
}
|
|
4686
4716
|
}
|
|
@@ -4688,7 +4718,7 @@ var MobileHumanize = {
|
|
|
4688
4718
|
const afterSnapshot = await getElementViewportSnapshot(element).catch(() => null);
|
|
4689
4719
|
if (isTargetImmobileAfterScroll(beforeElementSnapshot, afterSnapshot)) {
|
|
4690
4720
|
await restoreWindowFromSnapshot(page, beforeElementSnapshot, afterSnapshot);
|
|
4691
|
-
|
|
4721
|
+
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
4722
|
return { element, didScroll, restore: null, unscrollable: true };
|
|
4693
4723
|
}
|
|
4694
4724
|
}
|
|
@@ -4699,14 +4729,14 @@ var MobileHumanize = {
|
|
|
4699
4729
|
await waitJitter(80, 0.3);
|
|
4700
4730
|
const finalStatus = await checkElementVisibility(element);
|
|
4701
4731
|
if (finalStatus.code === "VISIBLE") {
|
|
4702
|
-
|
|
4703
|
-
|
|
4732
|
+
logger7.info("humanScroll | \u539F\u751F scrollIntoViewIfNeeded \u515C\u5E95\u6210\u529F");
|
|
4733
|
+
logger7.success("humanScroll", didScroll ? "\u5DF2\u6EDA\u52A8" : "\u65E0\u9700\u6EDA\u52A8");
|
|
4704
4734
|
return { element, didScroll: true, restore: null };
|
|
4705
4735
|
}
|
|
4706
4736
|
} catch (fallbackError) {
|
|
4707
|
-
|
|
4737
|
+
logger7.debug(`humanScroll | native fallback failed: ${fallbackError?.message || fallbackError}`);
|
|
4708
4738
|
}
|
|
4709
|
-
|
|
4739
|
+
logger7.warn(`humanScroll | \u5728 ${maxSteps} \u6B65\u540E\u65E0\u6CD5\u786E\u4FDD\u53EF\u89C1\u6027`);
|
|
4710
4740
|
return { element, didScroll, restore: null };
|
|
4711
4741
|
},
|
|
4712
4742
|
async humanClick(page, target, options = {}) {
|
|
@@ -4721,7 +4751,7 @@ var MobileHumanize = {
|
|
|
4721
4751
|
fallbackDomClickOnTapError = true
|
|
4722
4752
|
} = options;
|
|
4723
4753
|
const targetDesc = describeTarget(target);
|
|
4724
|
-
|
|
4754
|
+
logger7.start("humanClick", `target=${targetDesc}`);
|
|
4725
4755
|
try {
|
|
4726
4756
|
if (target == null) {
|
|
4727
4757
|
const viewport = resolveViewport(page);
|
|
@@ -4733,12 +4763,12 @@ var MobileHumanize = {
|
|
|
4733
4763
|
timeoutMs: tapTimeoutMs,
|
|
4734
4764
|
mouseFallbackTimeoutMs
|
|
4735
4765
|
});
|
|
4736
|
-
|
|
4766
|
+
logger7.success("humanClick", "Tapped current position");
|
|
4737
4767
|
return true;
|
|
4738
4768
|
}
|
|
4739
4769
|
const element = await resolveElement(page, target, { throwOnMissing });
|
|
4740
4770
|
if (!element) {
|
|
4741
|
-
|
|
4771
|
+
logger7.warn(`humanClick: \u5143\u7D20\u4E0D\u5B58\u5728\uFF0C\u8DF3\u8FC7\u70B9\u51FB ${targetDesc}`);
|
|
4742
4772
|
return false;
|
|
4743
4773
|
}
|
|
4744
4774
|
const scrollResult = scrollIfNeeded ? await MobileHumanize.humanScroll(page, element, { throwOnMissing }) : null;
|
|
@@ -4762,19 +4792,19 @@ var MobileHumanize = {
|
|
|
4762
4792
|
).catch(() => null);
|
|
4763
4793
|
}
|
|
4764
4794
|
if (fallback?.activated) {
|
|
4765
|
-
|
|
4795
|
+
logger7.warn(`humanClick: \u4E0D\u53EF\u6EDA\u52A8\u76EE\u6807\u4E0D\u53EF\u7269\u7406\u70B9\u51FB\uFF0C\u5DF2\u7528 ${fallback.method} \u6FC0\u6D3B`);
|
|
4766
4796
|
return true;
|
|
4767
4797
|
}
|
|
4768
4798
|
}
|
|
4769
4799
|
const message = `\u5143\u7D20\u4E0D\u53EF\u70B9\u51FB: ${status.reason || status.code}`;
|
|
4770
4800
|
if (throwOnMissing) throw new Error(message);
|
|
4771
|
-
|
|
4801
|
+
logger7.warn(`humanClick: ${message}\uFF0C\u8DF3\u8FC7\u70B9\u51FB`);
|
|
4772
4802
|
return false;
|
|
4773
4803
|
}
|
|
4774
4804
|
const box = await element.boundingBox();
|
|
4775
4805
|
if (!box) {
|
|
4776
4806
|
if (throwOnMissing) throw new Error("\u65E0\u6CD5\u83B7\u53D6\u5143\u7D20\u4F4D\u7F6E");
|
|
4777
|
-
|
|
4807
|
+
logger7.warn("humanClick: \u65E0\u6CD5\u83B7\u53D6\u4F4D\u7F6E\uFF0C\u8DF3\u8FC7\u70B9\u51FB");
|
|
4778
4808
|
return false;
|
|
4779
4809
|
}
|
|
4780
4810
|
await waitJitter(reactionDelay, 0.45);
|
|
@@ -4795,13 +4825,13 @@ var MobileHumanize = {
|
|
|
4795
4825
|
"activation fallback"
|
|
4796
4826
|
).catch(() => null);
|
|
4797
4827
|
if (!fallback?.activated) throw tapError;
|
|
4798
|
-
|
|
4828
|
+
logger7.warn(`humanClick: tap \u5931\u8D25\u540E\u5DF2\u7528 ${fallback.method} \u515C\u5E95: ${tapError?.message || tapError}`);
|
|
4799
4829
|
}
|
|
4800
4830
|
await waitJitter(120, 0.35);
|
|
4801
|
-
|
|
4831
|
+
logger7.success("humanClick");
|
|
4802
4832
|
return true;
|
|
4803
4833
|
} catch (error) {
|
|
4804
|
-
|
|
4834
|
+
logger7.fail("humanClick", error);
|
|
4805
4835
|
throw error;
|
|
4806
4836
|
}
|
|
4807
4837
|
},
|
|
@@ -4854,7 +4884,7 @@ var MobileHumanize = {
|
|
|
4854
4884
|
keyboardOptions = {}
|
|
4855
4885
|
} = pressOptions || {};
|
|
4856
4886
|
const targetDesc = hasTarget ? describeTarget(targetOrKey) : "current focus";
|
|
4857
|
-
|
|
4887
|
+
logger7.start("humanPress", `key=${key}, target=${targetDesc}`);
|
|
4858
4888
|
try {
|
|
4859
4889
|
if (hasTarget) {
|
|
4860
4890
|
await MobileHumanize.humanClick(page, targetOrKey, {
|
|
@@ -4868,10 +4898,10 @@ var MobileHumanize = {
|
|
|
4868
4898
|
...keyboardOptions,
|
|
4869
4899
|
delay: jitterMs(holdDelay, 0.5)
|
|
4870
4900
|
});
|
|
4871
|
-
|
|
4901
|
+
logger7.success("humanPress");
|
|
4872
4902
|
return true;
|
|
4873
4903
|
} catch (error) {
|
|
4874
|
-
|
|
4904
|
+
logger7.fail("humanPress", error);
|
|
4875
4905
|
throw error;
|
|
4876
4906
|
}
|
|
4877
4907
|
},
|
|
@@ -4908,20 +4938,7 @@ var MobileHumanize = {
|
|
|
4908
4938
|
const durationMs = jitterMs(baseDuration, 0.4);
|
|
4909
4939
|
const startTime = Date.now();
|
|
4910
4940
|
while (Date.now() - startTime < durationMs) {
|
|
4911
|
-
|
|
4912
|
-
if (action < 0.5) {
|
|
4913
|
-
await dispatchTouchSwipe(page, 120 + Math.random() * 220, {
|
|
4914
|
-
durationMs: 240,
|
|
4915
|
-
steps: 5
|
|
4916
|
-
});
|
|
4917
|
-
} else if (action < 0.7) {
|
|
4918
|
-
await dispatchTouchSwipe(page, -(80 + Math.random() * 160), {
|
|
4919
|
-
durationMs: 220,
|
|
4920
|
-
steps: 4
|
|
4921
|
-
});
|
|
4922
|
-
} else {
|
|
4923
|
-
await waitJitter(560, 0.55);
|
|
4924
|
-
}
|
|
4941
|
+
await waitJitter(560, 0.55);
|
|
4925
4942
|
}
|
|
4926
4943
|
},
|
|
4927
4944
|
async naturalScroll(page, direction = "down", distance = 300, baseSteps = 5) {
|
|
@@ -5030,7 +5047,7 @@ import { FingerprintInjector } from "fingerprint-injector";
|
|
|
5030
5047
|
import { chromium as defaultChromiumLauncher } from "playwright";
|
|
5031
5048
|
|
|
5032
5049
|
// src/proxy-bypass.js
|
|
5033
|
-
import
|
|
5050
|
+
import picomatch2 from "picomatch";
|
|
5034
5051
|
var normalizeByPassDomains = (domains) => {
|
|
5035
5052
|
if (!Array.isArray(domains)) return [];
|
|
5036
5053
|
return domains.map((item) => String(item || "").trim()).filter(Boolean);
|
|
@@ -5041,7 +5058,7 @@ var buildByPassDomainRule = (rawPattern) => {
|
|
|
5041
5058
|
if (!pattern) return null;
|
|
5042
5059
|
let matcher;
|
|
5043
5060
|
try {
|
|
5044
|
-
matcher =
|
|
5061
|
+
matcher = picomatch2(pattern, { nocase: true });
|
|
5045
5062
|
} catch {
|
|
5046
5063
|
return null;
|
|
5047
5064
|
}
|
|
@@ -5110,7 +5127,7 @@ var ByPass = {
|
|
|
5110
5127
|
};
|
|
5111
5128
|
|
|
5112
5129
|
// src/internals/launch/traffic.js
|
|
5113
|
-
var
|
|
5130
|
+
var logger8 = createInternalLogger("Launch");
|
|
5114
5131
|
var normalizeObject = (value) => {
|
|
5115
5132
|
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
5116
5133
|
return {};
|
|
@@ -5159,7 +5176,7 @@ var logLaunchTraffic = ({
|
|
|
5159
5176
|
} = {}) => {
|
|
5160
5177
|
if (!enabled) return;
|
|
5161
5178
|
if (explicitProxy) {
|
|
5162
|
-
|
|
5179
|
+
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
5180
|
return;
|
|
5164
5181
|
}
|
|
5165
5182
|
if (launchProxy) {
|
|
@@ -5169,18 +5186,18 @@ var logLaunchTraffic = ({
|
|
|
5169
5186
|
upstreamLabel = `${parsedProxyUrl.protocol}//${parsedProxyUrl.host}`;
|
|
5170
5187
|
} catch {
|
|
5171
5188
|
}
|
|
5172
|
-
|
|
5189
|
+
logger8.info(
|
|
5173
5190
|
`[\u4EE3\u7406\u5DF2\u542F\u7528] \u672C\u5730=${launchProxy.server} \u4E0A\u6E38=${upstreamLabel || "-"} \u76F4\u8FDE\u57DF\u540D=${byPassDomains.join(",")}`
|
|
5174
5191
|
);
|
|
5175
|
-
|
|
5192
|
+
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
5193
|
return;
|
|
5177
5194
|
}
|
|
5178
5195
|
if (enableProxy) {
|
|
5179
|
-
|
|
5196
|
+
logger8.info("[\u4EE3\u7406\u672A\u542F\u7528] enable_proxy=true \u4F46 proxy_url \u4E3A\u7A7A");
|
|
5180
5197
|
} else if (proxyUrl) {
|
|
5181
|
-
|
|
5198
|
+
logger8.info("[\u4EE3\u7406\u672A\u542F\u7528] enable_proxy=false \u4E14 proxy_url \u5DF2\u914D\u7F6E");
|
|
5182
5199
|
}
|
|
5183
|
-
|
|
5200
|
+
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
5201
|
};
|
|
5185
5202
|
var createLaunchTrafficHook = ({
|
|
5186
5203
|
byPassDomains = [],
|
|
@@ -5203,13 +5220,13 @@ var createLaunchTrafficHook = ({
|
|
|
5203
5220
|
}
|
|
5204
5221
|
if (!enabled || byPassDomains.length === 0) return;
|
|
5205
5222
|
if (!matched || !matched.rule) return;
|
|
5206
|
-
|
|
5223
|
+
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
5224
|
});
|
|
5208
5225
|
};
|
|
5209
5226
|
};
|
|
5210
5227
|
|
|
5211
5228
|
// src/internals/launch/default.js
|
|
5212
|
-
var
|
|
5229
|
+
var logger9 = createInternalLogger("Launch");
|
|
5213
5230
|
var injectedContexts = /* @__PURE__ */ new WeakSet();
|
|
5214
5231
|
var browserMajorVersionCache = /* @__PURE__ */ new Map();
|
|
5215
5232
|
var DEFAULT_BROWSER_PROFILE_SCHEMA_VERSION = 1;
|
|
@@ -5250,7 +5267,7 @@ var detectBrowserMajorVersion = (launcher) => {
|
|
|
5250
5267
|
});
|
|
5251
5268
|
detectedVersion = parseChromeMajorVersion(rawVersion);
|
|
5252
5269
|
} catch (error) {
|
|
5253
|
-
|
|
5270
|
+
logger9.warn(`\u8BFB\u53D6\u6D4F\u89C8\u5668\u7248\u672C\u5931\u8D25: ${error?.message || error}`);
|
|
5254
5271
|
}
|
|
5255
5272
|
browserMajorVersionCache.set(executablePath, detectedVersion);
|
|
5256
5273
|
return detectedVersion;
|
|
@@ -5287,7 +5304,7 @@ var generateFingerprintForCore = ({ locale, browserMajorVersion, device }) => {
|
|
|
5287
5304
|
if (requestedBrowserMajorVersion <= 0) {
|
|
5288
5305
|
throw error;
|
|
5289
5306
|
}
|
|
5290
|
-
|
|
5307
|
+
logger9.warn(
|
|
5291
5308
|
`\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
5309
|
);
|
|
5293
5310
|
}
|
|
@@ -5333,7 +5350,7 @@ var buildReplayableBrowserProfile = (runtimeState, launcher) => {
|
|
|
5333
5350
|
schema_version: DEFAULT_BROWSER_PROFILE_SCHEMA_VERSION
|
|
5334
5351
|
};
|
|
5335
5352
|
nextState = RuntimeEnv.setBrowserProfileCore(nextState, browserProfileCore);
|
|
5336
|
-
|
|
5353
|
+
logger9.info(
|
|
5337
5354
|
`\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
5355
|
);
|
|
5339
5356
|
return { runtimeState: nextState, browserProfileCore };
|
|
@@ -5520,7 +5537,7 @@ var DefaultLaunch = {
|
|
|
5520
5537
|
import { execFile } from "node:child_process";
|
|
5521
5538
|
import { randomInt } from "node:crypto";
|
|
5522
5539
|
import { promisify } from "node:util";
|
|
5523
|
-
var
|
|
5540
|
+
var logger10 = createInternalLogger("Launch");
|
|
5524
5541
|
var execFileAsync = promisify(execFile);
|
|
5525
5542
|
var DEFAULT_CLOAK_CRAWLER_BASE_OPTIONS = Object.freeze({
|
|
5526
5543
|
maxConcurrency: 1,
|
|
@@ -5726,7 +5743,7 @@ var resolveReplayableCloakProfile = (runtimeState, { fingerprintPlatform = "", c
|
|
|
5726
5743
|
const nextCoreRaw = JSON.stringify(nextBrowserProfileCore);
|
|
5727
5744
|
if (currentCoreRaw !== nextCoreRaw) {
|
|
5728
5745
|
nextState = RuntimeEnv.setBrowserProfileCore(nextState, nextBrowserProfileCore);
|
|
5729
|
-
|
|
5746
|
+
logger10.info(
|
|
5730
5747
|
`\u5DF2\u540C\u6B65 Cloak \u6307\u7EB9\u771F\u6E90 | env=${String(nextState.envId || "-")} | seed=${fingerprintSeed} | platform=${resolvedFingerprintPlatform} | timezone=${timezone || "-"} | locale=${locale || "-"}`
|
|
5731
5748
|
);
|
|
5732
5749
|
}
|
|
@@ -5813,7 +5830,7 @@ var forceTerminateBrowsersByFingerprintArg = async (fingerprintArg) => {
|
|
|
5813
5830
|
if (error?.code === 1 || error?.code === "ENOENT") {
|
|
5814
5831
|
return;
|
|
5815
5832
|
}
|
|
5816
|
-
|
|
5833
|
+
logger10.info(`\u5F3A\u5236\u5173\u95ED Cloak \u8FDB\u7A0B\u5931\u8D25\uFF08\u5FFD\u7565\uFF09: ${error?.message || String(error)}`);
|
|
5817
5834
|
});
|
|
5818
5835
|
};
|
|
5819
5836
|
var CloakLaunch = {
|
|
@@ -5973,7 +5990,7 @@ var Launch = withModeReflect("Launch", launchStrategies);
|
|
|
5973
5990
|
// src/live-view.js
|
|
5974
5991
|
import express from "express";
|
|
5975
5992
|
import { Actor } from "apify";
|
|
5976
|
-
var
|
|
5993
|
+
var logger11 = createInternalLogger("LiveView");
|
|
5977
5994
|
async function startLiveViewServer(liveViewKey) {
|
|
5978
5995
|
const app = express();
|
|
5979
5996
|
app.get("/", async (req, res) => {
|
|
@@ -5998,13 +6015,13 @@ async function startLiveViewServer(liveViewKey) {
|
|
|
5998
6015
|
</html>
|
|
5999
6016
|
`);
|
|
6000
6017
|
} catch (error) {
|
|
6001
|
-
|
|
6018
|
+
logger11.fail("Live View Server", error);
|
|
6002
6019
|
res.status(500).send(`\u65E0\u6CD5\u52A0\u8F7D\u5C4F\u5E55\u622A\u56FE: ${error.message}`);
|
|
6003
6020
|
}
|
|
6004
6021
|
});
|
|
6005
6022
|
const port = process.env.APIFY_CONTAINER_PORT || 4321;
|
|
6006
6023
|
app.listen(port, () => {
|
|
6007
|
-
|
|
6024
|
+
logger11.success("startLiveViewServer", `\u76D1\u542C\u7AEF\u53E3 ${port}`);
|
|
6008
6025
|
});
|
|
6009
6026
|
}
|
|
6010
6027
|
async function takeLiveScreenshot(liveViewKey, page, logMessage) {
|
|
@@ -6012,10 +6029,10 @@ async function takeLiveScreenshot(liveViewKey, page, logMessage) {
|
|
|
6012
6029
|
const buffer = await capturePageScreenshot(page, { type: "png" });
|
|
6013
6030
|
await Actor.setValue(liveViewKey, buffer, { contentType: "image/png" });
|
|
6014
6031
|
if (logMessage) {
|
|
6015
|
-
|
|
6032
|
+
logger11.info(`(\u622A\u56FE): ${logMessage}`);
|
|
6016
6033
|
}
|
|
6017
6034
|
} catch (e) {
|
|
6018
|
-
|
|
6035
|
+
logger11.warn(`\u65E0\u6CD5\u6355\u83B7 Live View \u5C4F\u5E55\u622A\u56FE: ${e.message}`);
|
|
6019
6036
|
}
|
|
6020
6037
|
}
|
|
6021
6038
|
var useLiveView = (liveViewKey = PresetOfLiveViewKey) => {
|
|
@@ -6121,7 +6138,7 @@ var dragCaptchaAction = async (page, sourceLocator, targetLocator, options = {})
|
|
|
6121
6138
|
};
|
|
6122
6139
|
|
|
6123
6140
|
// src/internals/captcha/bytedance.js
|
|
6124
|
-
var
|
|
6141
|
+
var logger12 = createInternalLogger("Captcha");
|
|
6125
6142
|
var DEFAULT_BYTEDANCE_CAPTCHA_OPTIONS = Object.freeze({
|
|
6126
6143
|
apiType: "31234",
|
|
6127
6144
|
maxRetries: 3,
|
|
@@ -6253,7 +6270,7 @@ var collectCaptchaDebugInfo = async (page, frame, iframeLocator, attempt, phase,
|
|
|
6253
6270
|
}
|
|
6254
6271
|
await writeFile(infoPath, JSON.stringify(payload, null, 2), "utf8");
|
|
6255
6272
|
}
|
|
6256
|
-
|
|
6273
|
+
logger12.info(`\u5DF2\u5199\u51FA\u9A8C\u8BC1\u7801\u8C03\u8BD5\u4EA7\u7269\uFF1A${debugDir}`);
|
|
6257
6274
|
};
|
|
6258
6275
|
var maybeCollectCaptchaDebugInfo = async (page, frame, iframeLocator, attempt, phase, options, extra = null) => {
|
|
6259
6276
|
if (!options.debugArtifacts) {
|
|
@@ -6290,14 +6307,14 @@ var getVerifycenterCaptchaContext = async (page, options) => {
|
|
|
6290
6307
|
if (!isContainerVisible) {
|
|
6291
6308
|
return null;
|
|
6292
6309
|
}
|
|
6293
|
-
|
|
6310
|
+
logger12.info("\u68C0\u6D4B\u5230\u9A8C\u8BC1\u7801\u5BB9\u5668\uFF0C\u5F00\u59CB\u7B49\u5F85 iframe \u52A0\u8F7D\u3002");
|
|
6294
6311
|
let iframeLocator = page.locator(options.iframeSelector).first();
|
|
6295
6312
|
let isIframeVisible = await waitForVisible(
|
|
6296
6313
|
iframeLocator,
|
|
6297
6314
|
options.iframeVisibleTimeoutMs
|
|
6298
6315
|
);
|
|
6299
6316
|
if (!isIframeVisible) {
|
|
6300
|
-
|
|
6317
|
+
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
6318
|
iframeLocator = captchaContainer.locator(options.iframeFallbackSelector).first();
|
|
6302
6319
|
isIframeVisible = await waitForVisible(
|
|
6303
6320
|
iframeLocator,
|
|
@@ -6307,7 +6324,7 @@ var getVerifycenterCaptchaContext = async (page, options) => {
|
|
|
6307
6324
|
if (!isIframeVisible) {
|
|
6308
6325
|
throw new Error("verifycenter iframe not found inside captcha container.");
|
|
6309
6326
|
}
|
|
6310
|
-
|
|
6327
|
+
logger12.info("\u9A8C\u8BC1\u7801 iframe \u5DF2\u53EF\u89C1\uFF0C\u5F00\u59CB\u89E3\u6790\u5185\u5BB9 frame\u3002");
|
|
6311
6328
|
const frame = await resolveContentFrame(page, iframeLocator, options);
|
|
6312
6329
|
if (!frame) {
|
|
6313
6330
|
throw new Error("Failed to resolve verifycenter iframe content frame.");
|
|
@@ -6423,11 +6440,11 @@ var refreshCaptcha = async (page, frame, options) => {
|
|
|
6423
6440
|
const clicked = await clickCaptchaAction(frame, options.refreshTexts, {
|
|
6424
6441
|
...options,
|
|
6425
6442
|
page,
|
|
6426
|
-
logger:
|
|
6443
|
+
logger: logger12,
|
|
6427
6444
|
forceMouse: true
|
|
6428
6445
|
}).catch(() => false);
|
|
6429
6446
|
if (!clicked) {
|
|
6430
|
-
|
|
6447
|
+
logger12.warn("Refresh button not found.");
|
|
6431
6448
|
return false;
|
|
6432
6449
|
}
|
|
6433
6450
|
await page.waitForTimeout(options.refreshWaitMs);
|
|
@@ -6458,24 +6475,24 @@ var waitForCaptchaChallengeReady = async (page, frame, options) => {
|
|
|
6458
6475
|
const hasGuideMaskVisible = options.guideMaskSelector ? await frame.locator(options.guideMaskSelector).first().isVisible({ timeout: options.loadingIndicatorVisibleTimeoutMs }).catch(() => false) : false;
|
|
6459
6476
|
hasSeenGuideMask = hasSeenGuideMask || hasGuideMaskVisible;
|
|
6460
6477
|
if (hasGuideMaskVisible && !hasLoggedGuideMask) {
|
|
6461
|
-
|
|
6478
|
+
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
6479
|
hasLoggedGuideMask = true;
|
|
6463
6480
|
}
|
|
6464
6481
|
if (!isLoadingVisible && hasVisibleSourceImage && hasVisibleDropTarget && !hasGuideMaskVisible) {
|
|
6465
|
-
|
|
6482
|
+
logger12.info(
|
|
6466
6483
|
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
6484
|
);
|
|
6468
6485
|
return;
|
|
6469
6486
|
}
|
|
6470
6487
|
if (hasErrorTextVisible) {
|
|
6471
|
-
|
|
6488
|
+
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
6489
|
await refreshCaptcha(page, frame, options);
|
|
6473
6490
|
refreshDeadline = Date.now() + options.challengeReadyRefreshTimeoutMs;
|
|
6474
6491
|
hasSeenLoading = false;
|
|
6475
6492
|
continue;
|
|
6476
6493
|
}
|
|
6477
6494
|
if ((!hasVisibleSourceImage || !hasVisibleDropTarget) && Date.now() >= refreshDeadline) {
|
|
6478
|
-
|
|
6495
|
+
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
6496
|
await refreshCaptcha(page, frame, options);
|
|
6480
6497
|
refreshDeadline = Date.now() + options.challengeReadyRefreshTimeoutMs;
|
|
6481
6498
|
hasSeenLoading = false;
|
|
@@ -6523,7 +6540,7 @@ var dragPromptCaptchaImage = async (page, frame, iframeLocator, sourceLocator, d
|
|
|
6523
6540
|
accepted
|
|
6524
6541
|
};
|
|
6525
6542
|
dragAttempts.push(attemptInfo);
|
|
6526
|
-
|
|
6543
|
+
logger12.info(
|
|
6527
6544
|
`\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
6545
|
);
|
|
6529
6546
|
if (accepted) {
|
|
@@ -6541,7 +6558,7 @@ var dragPromptCaptchaImage = async (page, frame, iframeLocator, sourceLocator, d
|
|
|
6541
6558
|
dragAttempts,
|
|
6542
6559
|
finalState: await readPromptCaptchaState(frame, options)
|
|
6543
6560
|
}).catch((error) => {
|
|
6544
|
-
|
|
6561
|
+
logger12.warn(`\u9A8C\u8BC1\u7801\u62D6\u62FD\u5931\u8D25\u8C03\u8BD5\u6293\u53D6\u5931\u8D25\uFF1A${error?.message || error}`);
|
|
6545
6562
|
});
|
|
6546
6563
|
return {
|
|
6547
6564
|
accepted: false,
|
|
@@ -6558,16 +6575,16 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
|
|
|
6558
6575
|
...options
|
|
6559
6576
|
};
|
|
6560
6577
|
if (!config.token) {
|
|
6561
|
-
|
|
6578
|
+
logger12.warn("\u7F3A\u5C11\u9A8C\u8BC1\u7801 token\uFF0C\u8DF3\u8FC7\u81EA\u52A8\u8BC6\u522B\u3002");
|
|
6562
6579
|
return false;
|
|
6563
6580
|
}
|
|
6564
|
-
|
|
6581
|
+
logger12.info("\u5F53\u524D\u4F7F\u7528\u672Ctool\u2014\u2014\u6D4B\u8BD5\u7248\u672C");
|
|
6565
6582
|
for (let attempt = 1; attempt <= config.maxRetries; attempt += 1) {
|
|
6566
|
-
|
|
6583
|
+
logger12.info(`\u5F00\u59CB\u7B2C ${attempt}/${config.maxRetries} \u6B21 verifycenter \u9A8C\u8BC1\u7801\u8BC6\u522B\u3002`);
|
|
6567
6584
|
try {
|
|
6568
6585
|
const captchaContext = await getVerifycenterCaptchaContext(page, config);
|
|
6569
6586
|
if (!captchaContext) {
|
|
6570
|
-
|
|
6587
|
+
logger12.info("Captcha container is not visible anymore.");
|
|
6571
6588
|
return true;
|
|
6572
6589
|
}
|
|
6573
6590
|
const { iframeLocator, frame } = captchaContext;
|
|
@@ -6580,7 +6597,7 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
|
|
|
6580
6597
|
"ready",
|
|
6581
6598
|
config
|
|
6582
6599
|
).catch((error) => {
|
|
6583
|
-
|
|
6600
|
+
logger12.warn(`\u9A8C\u8BC1\u7801\u8C03\u8BD5\u6293\u53D6\u5931\u8D25\uFF1A${error?.message || error}`);
|
|
6584
6601
|
});
|
|
6585
6602
|
await page.waitForTimeout(config.recognitionDelayMs);
|
|
6586
6603
|
const screenshotBuffer = await iframeLocator.screenshot();
|
|
@@ -6592,16 +6609,16 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
|
|
|
6592
6609
|
});
|
|
6593
6610
|
const serialNumbers = extractCaptchaSerialNumbers(apiResponse);
|
|
6594
6611
|
if (apiResponse?.code !== config.recognitionSuccessCode || serialNumbers.length === 0) {
|
|
6595
|
-
|
|
6612
|
+
logger12.warn(
|
|
6596
6613
|
`\u9A8C\u8BC1\u7801\u8BC6\u522B\u5931\u8D25\u3002code=${apiResponse?.code}, msg=${apiResponse?.msg || "unknown"}`
|
|
6597
6614
|
);
|
|
6598
6615
|
await refreshCaptcha(page, frame, config);
|
|
6599
6616
|
continue;
|
|
6600
6617
|
}
|
|
6601
|
-
|
|
6618
|
+
logger12.info(`\u9A8C\u8BC1\u7801\u8BC6\u522B\u6210\u529F\uFF0C\u5E8F\u53F7\uFF1A${serialNumbers.join(", ")}`);
|
|
6602
6619
|
const dropTarget = await findCaptchaDropTarget(frame, config);
|
|
6603
6620
|
if (!dropTarget) {
|
|
6604
|
-
|
|
6621
|
+
logger12.warn("\u672A\u627E\u5230\u9A8C\u8BC1\u7801\u62D6\u62FD\u76EE\u6807\u533A\u57DF\u3002");
|
|
6605
6622
|
await refreshCaptcha(page, frame, config);
|
|
6606
6623
|
continue;
|
|
6607
6624
|
}
|
|
@@ -6612,7 +6629,7 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
|
|
|
6612
6629
|
`Captcha image indexes could not be normalized. raw=${serialNumbers.join(", ")}, count=${orderedSourceImages.length}`
|
|
6613
6630
|
);
|
|
6614
6631
|
}
|
|
6615
|
-
|
|
6632
|
+
logger12.info(`\u9A8C\u8BC1\u7801\u89C6\u89C9\u4F4D\u5E8F\u6620\u5C04\uFF1A${normalizedIndexes.map((index) => index + 1).join(", ")}`);
|
|
6616
6633
|
for (const imageIndex of normalizedIndexes) {
|
|
6617
6634
|
if (imageIndex < 0 || imageIndex >= orderedSourceImages.length) {
|
|
6618
6635
|
throw new Error(
|
|
@@ -6644,52 +6661,52 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
|
|
|
6644
6661
|
}
|
|
6645
6662
|
}
|
|
6646
6663
|
const beforeSubmitState = await readPromptCaptchaState(frame, config);
|
|
6647
|
-
|
|
6664
|
+
logger12.info(
|
|
6648
6665
|
`\u63D0\u4EA4\u524D\u9A8C\u8BC1\u7801\u72B6\u6001\uFF1Abadge=${beforeSubmitState.badgeCount}, selected=${beforeSubmitState.selectedCount}, submitDisabled=${beforeSubmitState.submitDisabled}`
|
|
6649
6666
|
);
|
|
6650
6667
|
const submitted = await clickCaptchaAction(frame, config.submitTexts, {
|
|
6651
6668
|
...config,
|
|
6652
6669
|
page,
|
|
6653
|
-
logger:
|
|
6670
|
+
logger: logger12,
|
|
6654
6671
|
forceMouse: true,
|
|
6655
6672
|
actionVisibleTimeoutMs: config.submitReadyTimeoutMs
|
|
6656
6673
|
}).catch(() => false);
|
|
6657
6674
|
if (!submitted) {
|
|
6658
|
-
|
|
6675
|
+
logger12.warn("\u672A\u627E\u5230\u63D0\u4EA4\u6309\u94AE\uFF0C\u53EF\u80FD\u4F1A\u81EA\u52A8\u63D0\u4EA4\u3002");
|
|
6659
6676
|
}
|
|
6660
6677
|
await page.waitForTimeout(config.submitWaitMs);
|
|
6661
6678
|
const afterSubmitState = await readPromptCaptchaState(frame, config);
|
|
6662
|
-
|
|
6679
|
+
logger12.info(
|
|
6663
6680
|
`\u63D0\u4EA4\u540E\u9A8C\u8BC1\u7801\u72B6\u6001\uFF1Abadge=${afterSubmitState.badgeCount}, selected=${afterSubmitState.selectedCount}, submitDisabled=${afterSubmitState.submitDisabled}`
|
|
6664
6681
|
);
|
|
6665
6682
|
const stillVisible = await iframeLocator.isVisible({ timeout: config.containerVisibleTimeoutMs }).catch(() => false);
|
|
6666
6683
|
if (!stillVisible) {
|
|
6667
|
-
|
|
6684
|
+
logger12.info("\u9A8C\u8BC1\u7801\u8BC6\u522B\u5E76\u63D0\u4EA4\u6210\u529F\u3002");
|
|
6668
6685
|
return true;
|
|
6669
6686
|
}
|
|
6670
6687
|
await maybeCollectCaptchaDebugInfo(page, frame, iframeLocator, attempt, "submit-still-visible", config, {
|
|
6671
6688
|
beforeSubmitState,
|
|
6672
6689
|
afterSubmitState
|
|
6673
6690
|
}).catch((error) => {
|
|
6674
|
-
|
|
6691
|
+
logger12.warn(`\u63D0\u4EA4\u540E\u9A8C\u8BC1\u7801\u8C03\u8BD5\u6293\u53D6\u5931\u8D25\uFF1A${error?.message || error}`);
|
|
6675
6692
|
});
|
|
6676
|
-
|
|
6693
|
+
logger12.warn("\u63D0\u4EA4\u540E\u9A8C\u8BC1\u7801 iframe \u4ECD\u7136\u53EF\u89C1\uFF0C\u51C6\u5907\u5237\u65B0\u540E\u91CD\u8BD5\u3002");
|
|
6677
6694
|
await page.waitForTimeout(2e3);
|
|
6678
6695
|
await refreshCaptcha(page, frame, config);
|
|
6679
6696
|
} catch (error) {
|
|
6680
|
-
|
|
6697
|
+
logger12.error(`\u7B2C ${attempt}/${config.maxRetries} \u6B21\u9A8C\u8BC1\u7801\u8BC6\u522B\u5931\u8D25\uFF1A${error?.message || error}`);
|
|
6681
6698
|
}
|
|
6682
6699
|
if (attempt < config.maxRetries) {
|
|
6683
6700
|
await page.waitForTimeout(config.retryDelayBaseMs + attempt * config.retryDelayStepMs);
|
|
6684
6701
|
}
|
|
6685
6702
|
}
|
|
6686
|
-
|
|
6703
|
+
logger12.error(`\u91CD\u8BD5 ${config.maxRetries} \u6B21\u540E\uFF0C\u9A8C\u8BC1\u7801\u4ECD\u672A\u8BC6\u522B\u6210\u529F\u3002`);
|
|
6687
6704
|
return false;
|
|
6688
6705
|
}
|
|
6689
6706
|
var sloveCaptcha = solveCaptcha;
|
|
6690
6707
|
|
|
6691
6708
|
// src/chaptcha.js
|
|
6692
|
-
var
|
|
6709
|
+
var logger13 = createInternalLogger("Captcha");
|
|
6693
6710
|
var DOM_MONITOR_WAIT_TIMEOUT_MS = 1e3;
|
|
6694
6711
|
var DOM_MONITOR_POST_DETECT_HIDDEN_WAIT_MS = 300;
|
|
6695
6712
|
var DOM_MONITOR_RECOVERY_WAIT_MS = 100;
|
|
@@ -6764,7 +6781,7 @@ function useCaptchaMonitor(page, options) {
|
|
|
6764
6781
|
await sleep(DOM_MONITOR_RECOVERY_WAIT_MS);
|
|
6765
6782
|
continue;
|
|
6766
6783
|
}
|
|
6767
|
-
|
|
6784
|
+
logger13.warning(
|
|
6768
6785
|
"useCaptchaMonitor",
|
|
6769
6786
|
`DOM \u76D1\u63A7\u51FA\u73B0\u5F02\u5E38\uFF08\u7EE7\u7EED\u91CD\u8BD5\uFF09: selector=${domSelector}, error=${getErrorMessage(error)}`
|
|
6770
6787
|
);
|
|
@@ -6772,7 +6789,7 @@ function useCaptchaMonitor(page, options) {
|
|
|
6772
6789
|
}
|
|
6773
6790
|
}
|
|
6774
6791
|
})();
|
|
6775
|
-
|
|
6792
|
+
logger13.success("useCaptchaMonitor", `DOM \u76D1\u63A7\u5DF2\u542F\u7528\uFF1A${domSelector}`);
|
|
6776
6793
|
cleanupFns.push(async () => {
|
|
6777
6794
|
await domMonitorTask?.catch(() => {
|
|
6778
6795
|
});
|
|
@@ -6789,7 +6806,7 @@ function useCaptchaMonitor(page, options) {
|
|
|
6789
6806
|
}
|
|
6790
6807
|
};
|
|
6791
6808
|
page.on("framenavigated", frameHandler);
|
|
6792
|
-
|
|
6809
|
+
logger13.success("useCaptchaMonitor", `URL \u76D1\u63A7\u5DF2\u542F\u7528\uFF1A${urlPattern}`);
|
|
6793
6810
|
Promise.resolve().then(async () => {
|
|
6794
6811
|
if (!isStopped && page.url().includes(urlPattern)) {
|
|
6795
6812
|
await triggerDetected();
|
|
@@ -6802,7 +6819,7 @@ function useCaptchaMonitor(page, options) {
|
|
|
6802
6819
|
}
|
|
6803
6820
|
return {
|
|
6804
6821
|
stop: async () => {
|
|
6805
|
-
|
|
6822
|
+
logger13.info("\u6B63\u5728\u505C\u6B62\u9A8C\u8BC1\u7801\u76D1\u63A7...");
|
|
6806
6823
|
isStopped = true;
|
|
6807
6824
|
for (const fn of cleanupFns) {
|
|
6808
6825
|
await fn();
|
|
@@ -6841,7 +6858,7 @@ async function solveCaptchaWithStrategy(strategyName, page, options = {}) {
|
|
|
6841
6858
|
);
|
|
6842
6859
|
return strategy.sloveCaptcha(page, resolvedOptions, {
|
|
6843
6860
|
callCaptchaRecognitionApi,
|
|
6844
|
-
logger:
|
|
6861
|
+
logger: logger13
|
|
6845
6862
|
});
|
|
6846
6863
|
}
|
|
6847
6864
|
var Captcha = {
|
|
@@ -6852,7 +6869,7 @@ var Captcha = {
|
|
|
6852
6869
|
// src/mutation.js
|
|
6853
6870
|
import { createHash } from "node:crypto";
|
|
6854
6871
|
import { v4 as uuidv4 } from "uuid";
|
|
6855
|
-
var
|
|
6872
|
+
var logger14 = createInternalLogger("Mutation");
|
|
6856
6873
|
var MUTATION_MONITOR_MODE = Object.freeze({
|
|
6857
6874
|
Added: "added",
|
|
6858
6875
|
Changed: "changed",
|
|
@@ -6885,14 +6902,14 @@ var Mutation = {
|
|
|
6885
6902
|
const stableTime = options.stableTime ?? 5 * 1e3;
|
|
6886
6903
|
const timeout = options.timeout ?? 120 * 1e3;
|
|
6887
6904
|
const onMutation = options.onMutation;
|
|
6888
|
-
|
|
6905
|
+
logger14.start("waitForStable", `\u76D1\u63A7 ${selectorList.length} \u4E2A\u9009\u62E9\u5668, \u7A33\u5B9A\u65F6\u95F4=${stableTime}ms`);
|
|
6889
6906
|
if (initialTimeout > 0) {
|
|
6890
6907
|
const selectorQuery = selectorList.join(",");
|
|
6891
6908
|
try {
|
|
6892
6909
|
await page.waitForSelector(selectorQuery, { timeout: initialTimeout });
|
|
6893
|
-
|
|
6910
|
+
logger14.info(`waitForStable \u5DF2\u68C0\u6D4B\u5230\u5143\u7D20: ${selectorQuery}`);
|
|
6894
6911
|
} catch (e) {
|
|
6895
|
-
|
|
6912
|
+
logger14.warning(`waitForStable \u521D\u59CB\u7B49\u5F85\u8D85\u65F6 (${initialTimeout}ms): ${selectorQuery}`);
|
|
6896
6913
|
throw e;
|
|
6897
6914
|
}
|
|
6898
6915
|
}
|
|
@@ -6908,7 +6925,7 @@ var Mutation = {
|
|
|
6908
6925
|
return "__CONTINUE__";
|
|
6909
6926
|
}
|
|
6910
6927
|
});
|
|
6911
|
-
|
|
6928
|
+
logger14.info("waitForStable \u5DF2\u542F\u7528 onMutation \u56DE\u8C03");
|
|
6912
6929
|
} catch (e) {
|
|
6913
6930
|
}
|
|
6914
6931
|
}
|
|
@@ -7023,9 +7040,9 @@ var Mutation = {
|
|
|
7023
7040
|
{ selectorList, stableTime, timeout, callbackName, hasCallback: !!onMutation }
|
|
7024
7041
|
);
|
|
7025
7042
|
if (result.mutationCount === 0 && result.stableTime === 0) {
|
|
7026
|
-
|
|
7043
|
+
logger14.warning("waitForStable \u672A\u627E\u5230\u53EF\u76D1\u63A7\u7684\u5143\u7D20");
|
|
7027
7044
|
}
|
|
7028
|
-
|
|
7045
|
+
logger14.success("waitForStable", `DOM \u7A33\u5B9A, \u603B\u5171 ${result.mutationCount} \u6B21\u53D8\u5316${result.wasPaused ? ", \u66FE\u6682\u505C\u8BA1\u65F6" : ""}`);
|
|
7029
7046
|
return result;
|
|
7030
7047
|
},
|
|
7031
7048
|
/**
|
|
@@ -7197,22 +7214,22 @@ var Mutation = {
|
|
|
7197
7214
|
return "__CONTINUE__";
|
|
7198
7215
|
}
|
|
7199
7216
|
};
|
|
7200
|
-
|
|
7217
|
+
logger14.start(
|
|
7201
7218
|
"waitForStableAcrossRoots",
|
|
7202
7219
|
`\u76D1\u63A7 ${selectorList.length} \u4E2A\u9009\u62E9\u5668(\u8DE8 root), \u7A33\u5B9A\u65F6\u95F4=${waitForStableTime}ms`
|
|
7203
7220
|
);
|
|
7204
7221
|
if (initialTimeout > 0) {
|
|
7205
7222
|
try {
|
|
7206
7223
|
await page.waitForSelector(selectorQuery, { timeout: initialTimeout });
|
|
7207
|
-
|
|
7224
|
+
logger14.info(`waitForStableAcrossRoots \u5DF2\u68C0\u6D4B\u5230\u5143\u7D20: ${selectorQuery}`);
|
|
7208
7225
|
} catch (e) {
|
|
7209
|
-
|
|
7226
|
+
logger14.warning(`waitForStableAcrossRoots \u521D\u59CB\u7B49\u5F85\u8D85\u65F6 (${initialTimeout}ms): ${selectorQuery}`);
|
|
7210
7227
|
throw e;
|
|
7211
7228
|
}
|
|
7212
7229
|
}
|
|
7213
7230
|
let state2 = await buildState();
|
|
7214
7231
|
if (!state2?.hasMatched) {
|
|
7215
|
-
|
|
7232
|
+
logger14.warning("waitForStableAcrossRoots \u672A\u627E\u5230\u53EF\u76D1\u63A7\u7684\u5143\u7D20");
|
|
7216
7233
|
return { mutationCount: 0, stableTime: 0, wasPaused: false };
|
|
7217
7234
|
}
|
|
7218
7235
|
let mutationCount = 0;
|
|
@@ -7249,7 +7266,7 @@ var Mutation = {
|
|
|
7249
7266
|
if (lastState.snapshotKey !== lastSnapshotKey) {
|
|
7250
7267
|
lastSnapshotKey = lastState.snapshotKey;
|
|
7251
7268
|
mutationCount += 1;
|
|
7252
|
-
|
|
7269
|
+
logger14.info(
|
|
7253
7270
|
`waitForStableAcrossRoots \u53D8\u5316#${mutationCount}, len=${lastState.snapshotLength}, path=${lastState.primaryPath || "unknown"}, preview="${truncate(lastState.text, 120)}"`
|
|
7254
7271
|
);
|
|
7255
7272
|
const signal = await invokeMutationCallback({
|
|
@@ -7262,7 +7279,7 @@ var Mutation = {
|
|
|
7262
7279
|
continue;
|
|
7263
7280
|
}
|
|
7264
7281
|
if (!isPaused && stableSince > 0 && Date.now() - stableSince >= waitForStableTime) {
|
|
7265
|
-
|
|
7282
|
+
logger14.success("waitForStableAcrossRoots", `DOM \u7A33\u5B9A, \u603B\u5171 ${mutationCount} \u6B21\u53D8\u5316${wasPaused ? ", \u66FE\u6682\u505C\u8BA1\u65F6" : ""}`);
|
|
7266
7283
|
return {
|
|
7267
7284
|
mutationCount,
|
|
7268
7285
|
stableTime: waitForStableTime,
|
|
@@ -7289,7 +7306,7 @@ var Mutation = {
|
|
|
7289
7306
|
const onMutation = options.onMutation;
|
|
7290
7307
|
const rawMode = String(options.mode || MUTATION_MONITOR_MODE.Added).toLowerCase();
|
|
7291
7308
|
const mode2 = [MUTATION_MONITOR_MODE.Added, MUTATION_MONITOR_MODE.Changed, MUTATION_MONITOR_MODE.All].includes(rawMode) ? rawMode : MUTATION_MONITOR_MODE.Added;
|
|
7292
|
-
|
|
7309
|
+
logger14.start("useMonitor", `\u76D1\u63A7 ${selectorList.length} \u4E2A\u9009\u62E9\u5668, mode=${mode2}`);
|
|
7293
7310
|
const monitorKey = generateKey("pk_mon");
|
|
7294
7311
|
const callbackName = generateKey("pk_mon_cb");
|
|
7295
7312
|
const cleanerName = generateKey("pk_mon_clean");
|
|
@@ -7432,7 +7449,7 @@ var Mutation = {
|
|
|
7432
7449
|
return total;
|
|
7433
7450
|
};
|
|
7434
7451
|
}, { selectorList, monitorKey, callbackName, cleanerName, hasCallback: !!onMutation, mode: mode2 });
|
|
7435
|
-
|
|
7452
|
+
logger14.success("useMonitor", "\u76D1\u63A7\u5668\u5DF2\u542F\u52A8");
|
|
7436
7453
|
return {
|
|
7437
7454
|
stop: async () => {
|
|
7438
7455
|
let totalMutations = 0;
|
|
@@ -7445,7 +7462,7 @@ var Mutation = {
|
|
|
7445
7462
|
}, cleanerName);
|
|
7446
7463
|
} catch (e) {
|
|
7447
7464
|
}
|
|
7448
|
-
|
|
7465
|
+
logger14.success("useMonitor.stop", `\u76D1\u63A7\u5DF2\u505C\u6B62, \u5171 ${totalMutations} \u6B21\u53D8\u5316`);
|
|
7449
7466
|
return { totalMutations };
|
|
7450
7467
|
}
|
|
7451
7468
|
};
|
|
@@ -8314,7 +8331,7 @@ var createTemplateLogger = (baseLogger = createBaseLogger()) => {
|
|
|
8314
8331
|
};
|
|
8315
8332
|
var getDefaultBaseLogger = () => createBaseLogger("");
|
|
8316
8333
|
var Logger = {
|
|
8317
|
-
setLogger: (
|
|
8334
|
+
setLogger: (logger18) => setDefaultLogger(logger18),
|
|
8318
8335
|
info: (message) => getDefaultBaseLogger().info(message),
|
|
8319
8336
|
success: (message) => getDefaultBaseLogger().success(message),
|
|
8320
8337
|
warning: (message) => getDefaultBaseLogger().warning(message),
|
|
@@ -8322,8 +8339,8 @@ var Logger = {
|
|
|
8322
8339
|
error: (message) => getDefaultBaseLogger().error(message),
|
|
8323
8340
|
debug: (message) => getDefaultBaseLogger().debug(message),
|
|
8324
8341
|
start: (message) => getDefaultBaseLogger().start(message),
|
|
8325
|
-
useTemplate: (
|
|
8326
|
-
if (
|
|
8342
|
+
useTemplate: (logger18) => {
|
|
8343
|
+
if (logger18) return createTemplateLogger(createBaseLogger("", logger18));
|
|
8327
8344
|
return createTemplateLogger();
|
|
8328
8345
|
}
|
|
8329
8346
|
};
|
|
@@ -8397,7 +8414,7 @@ var LOCATION_NETWORK_SUFFIX_PATTERNS = [
|
|
|
8397
8414
|
];
|
|
8398
8415
|
var cachedStripLogoSrcPromise = null;
|
|
8399
8416
|
var cachedEnrichmentByContext = /* @__PURE__ */ new WeakMap();
|
|
8400
|
-
var
|
|
8417
|
+
var logger15 = createInternalLogger("Watermarkify");
|
|
8401
8418
|
var normalizeText2 = (value) => String(value || "").trim();
|
|
8402
8419
|
var toInline = (value, maxLen = 200) => {
|
|
8403
8420
|
const text = normalizeText2(value);
|
|
@@ -8639,9 +8656,9 @@ var resolveWithCustomResolver = async (page, baseMeta, options = {}) => {
|
|
|
8639
8656
|
location: toInline(resolved.location, 80)
|
|
8640
8657
|
};
|
|
8641
8658
|
if (enrichment.ip || enrichment.location) {
|
|
8642
|
-
|
|
8659
|
+
logger15.info(`\u81EA\u5B9A\u4E49 resolver \u547D\u4E2D: ip=${enrichment.ip || "-"}, loc=${enrichment.location || "-"}`);
|
|
8643
8660
|
} else {
|
|
8644
|
-
|
|
8661
|
+
logger15.warning("\u81EA\u5B9A\u4E49 resolver \u5DF2\u6267\u884C\uFF0C\u4F46\u672A\u8FD4\u56DE IP/Loc");
|
|
8645
8662
|
}
|
|
8646
8663
|
return enrichment;
|
|
8647
8664
|
} finally {
|
|
@@ -8830,12 +8847,12 @@ var normalizeWatermarkifyRenderMode = (value) => {
|
|
|
8830
8847
|
};
|
|
8831
8848
|
var composeScreenshotBufferWithBrowser = async (page, buffer, overlaySvg, imageInfo = {}, options = {}) => {
|
|
8832
8849
|
if (!page || typeof page.context !== "function") {
|
|
8833
|
-
|
|
8850
|
+
logger15.warning("watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u8DF3\u8FC7: \u7F3A\u5C11\u53EF\u7528 page");
|
|
8834
8851
|
return buffer;
|
|
8835
8852
|
}
|
|
8836
8853
|
const renderScope = await openProbePage(page);
|
|
8837
8854
|
if (!renderScope?.page) {
|
|
8838
|
-
|
|
8855
|
+
logger15.warning("watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u8DF3\u8FC7: \u65E0\u6CD5\u521B\u5EFA render page");
|
|
8839
8856
|
return buffer;
|
|
8840
8857
|
}
|
|
8841
8858
|
try {
|
|
@@ -8900,13 +8917,13 @@ var composeScreenshotBufferWithBrowser = async (page, buffer, overlaySvg, imageI
|
|
|
8900
8917
|
fullPage: true,
|
|
8901
8918
|
animations: "disabled"
|
|
8902
8919
|
}).catch((error) => {
|
|
8903
|
-
|
|
8920
|
+
logger15.warning(`watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u5931\u8D25: ${error instanceof Error ? error.message : String(error)}`);
|
|
8904
8921
|
return null;
|
|
8905
8922
|
});
|
|
8906
8923
|
if (Buffer.isBuffer(composed) && composed.length > 0) {
|
|
8907
8924
|
return composed;
|
|
8908
8925
|
}
|
|
8909
|
-
|
|
8926
|
+
logger15.warning("watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u5931\u8D25: \u672A\u5F97\u5230\u6709\u6548\u622A\u56FE\u7ED3\u679C");
|
|
8910
8927
|
return buffer;
|
|
8911
8928
|
} finally {
|
|
8912
8929
|
await renderScope.close().catch(() => {
|
|
@@ -8919,7 +8936,7 @@ var resolveWithIpLookup = async (page, options = {}) => {
|
|
|
8919
8936
|
}
|
|
8920
8937
|
const probeScope = await openProbePage(page);
|
|
8921
8938
|
if (!probeScope?.page) {
|
|
8922
|
-
|
|
8939
|
+
logger15.warning("ipLookup \u8DF3\u8FC7: \u65E0\u6CD5\u521B\u5EFA probe page");
|
|
8923
8940
|
return null;
|
|
8924
8941
|
}
|
|
8925
8942
|
const timeoutMs = Math.max(
|
|
@@ -8928,12 +8945,12 @@ var resolveWithIpLookup = async (page, options = {}) => {
|
|
|
8928
8945
|
);
|
|
8929
8946
|
try {
|
|
8930
8947
|
const probePage = probeScope.page;
|
|
8931
|
-
|
|
8948
|
+
logger15.info(`ipLookup \u5C1D\u8BD5: url=${DEFAULT_IP_LOOKUP_URL}, timeoutMs=${timeoutMs}`);
|
|
8932
8949
|
const response = await probePage.goto(DEFAULT_IP_LOOKUP_URL, {
|
|
8933
8950
|
waitUntil: "commit",
|
|
8934
8951
|
timeout: timeoutMs
|
|
8935
8952
|
}).catch((error) => {
|
|
8936
|
-
|
|
8953
|
+
logger15.warning(`ipLookup \u8BF7\u6C42\u5931\u8D25: url=${DEFAULT_IP_LOOKUP_URL}, error=${error instanceof Error ? error.message : String(error)}`);
|
|
8937
8954
|
return null;
|
|
8938
8955
|
});
|
|
8939
8956
|
const status = response && typeof response.status === "function" ? response.status() : 0;
|
|
@@ -8955,13 +8972,13 @@ var resolveWithIpLookup = async (page, options = {}) => {
|
|
|
8955
8972
|
}
|
|
8956
8973
|
const parsed = parseIpIpJsonResponse(rawText);
|
|
8957
8974
|
if (parsed?.ip || parsed?.location) {
|
|
8958
|
-
|
|
8975
|
+
logger15.info(`ipLookup \u6210\u529F: url=${DEFAULT_IP_LOOKUP_URL}, status=${status || "-"}, contentType=${contentType || "-"}, ip=${parsed.ip || "-"}, loc=${parsed.location || "-"}`);
|
|
8959
8976
|
return parsed;
|
|
8960
8977
|
}
|
|
8961
|
-
|
|
8978
|
+
logger15.warning(`ipLookup \u672A\u89E3\u6790\u51FA IP/Loc: url=${DEFAULT_IP_LOOKUP_URL}, status=${status || "-"}, contentType=${contentType || "-"}, preview=${shortenTail(rawText, 120) || "[empty]"}`);
|
|
8962
8979
|
return null;
|
|
8963
8980
|
} catch (error) {
|
|
8964
|
-
|
|
8981
|
+
logger15.warning(`ipLookup \u6267\u884C\u5F02\u5E38\uFF0C\u672A\u83B7\u5F97 IP/Loc: ${error instanceof Error ? error.message : String(error)}`);
|
|
8965
8982
|
return null;
|
|
8966
8983
|
} finally {
|
|
8967
8984
|
await probeScope.close().catch(() => {
|
|
@@ -8975,10 +8992,10 @@ var resolveEnrichment = async (page, baseMeta, options) => {
|
|
|
8975
8992
|
ip: toInline(options.ip, 80),
|
|
8976
8993
|
location: toInline(options.location, 80)
|
|
8977
8994
|
};
|
|
8978
|
-
|
|
8995
|
+
logger15.info(`enrichment \u5F00\u59CB: host=${baseMeta.hostname || "-"}, hasPresetIp=${Boolean(merged.ip)}, hasPresetLoc=${Boolean(merged.location)}, ipLookup=${options.ipLookup !== false}`);
|
|
8979
8996
|
if (!merged.ip || !merged.location) {
|
|
8980
8997
|
if (cached?.ip || cached?.location) {
|
|
8981
|
-
|
|
8998
|
+
logger15.info(`enrichment \u547D\u4E2D\u4E0A\u4E0B\u6587\u7F13\u5B58: ip=${cached.ip || "-"}, loc=${cached.location || "-"}`);
|
|
8982
8999
|
}
|
|
8983
9000
|
fillEnrichment(merged, cached);
|
|
8984
9001
|
}
|
|
@@ -9002,15 +9019,15 @@ var resolveEnrichment = async (page, baseMeta, options) => {
|
|
|
9002
9019
|
"x-geo-country"
|
|
9003
9020
|
]), 80);
|
|
9004
9021
|
if (!merged.location || isWeakLocationValue(merged.location) && headerLocation) {
|
|
9005
|
-
|
|
9022
|
+
logger15.info(`enrichment \u4F7F\u7528\u54CD\u5E94\u5934\u8865\u5145 Loc: ${headerLocation || "-"}`);
|
|
9006
9023
|
merged.location = headerLocation || merged.location;
|
|
9007
9024
|
}
|
|
9008
9025
|
}
|
|
9009
9026
|
writeCachedEnrichment(page, merged);
|
|
9010
9027
|
if (merged.ip || merged.location) {
|
|
9011
|
-
|
|
9028
|
+
logger15.info(`enrichment \u5B8C\u6210: ip=${merged.ip || "-"}, loc=${merged.location || "-"}`);
|
|
9012
9029
|
} else {
|
|
9013
|
-
|
|
9030
|
+
logger15.warning("enrichment \u5B8C\u6210: \u672A\u83B7\u5F97 IP/Loc");
|
|
9014
9031
|
}
|
|
9015
9032
|
return merged;
|
|
9016
9033
|
};
|
|
@@ -9823,7 +9840,7 @@ var watermarkifyScreenshotBuffer = async (buffer, meta, page = null, options = {
|
|
|
9823
9840
|
}
|
|
9824
9841
|
const imageInfo = readImageInfo(buffer);
|
|
9825
9842
|
if (!imageInfo.width || !imageInfo.height || !imageInfo.mimeType) {
|
|
9826
|
-
|
|
9843
|
+
logger15.warning("watermarkify \u8DF3\u8FC7: \u65E0\u6CD5\u89E3\u6790\u622A\u56FE\u5C3A\u5BF8\u6216\u683C\u5F0F");
|
|
9827
9844
|
return buffer;
|
|
9828
9845
|
}
|
|
9829
9846
|
const isMobileStrip = normalizeDevice(meta.device) === Device.Mobile && hasStrip;
|
|
@@ -9841,7 +9858,7 @@ var watermarkifyScreenshotBuffer = async (buffer, meta, page = null, options = {
|
|
|
9841
9858
|
|
|
9842
9859
|
// src/internals/compression.js
|
|
9843
9860
|
import { Jimp as Jimp2, JimpMime, ResizeStrategy } from "jimp";
|
|
9844
|
-
var
|
|
9861
|
+
var logger16 = createInternalLogger("Compression");
|
|
9845
9862
|
var DEFAULT_SCREENSHOT_MAX_BYTES = 5 * 1024 * 1024;
|
|
9846
9863
|
var DEFAULT_SCREENSHOT_OUTPUT_TYPE = "jpeg";
|
|
9847
9864
|
var DEFAULT_SCREENSHOT_QUALITY = 0.72;
|
|
@@ -9960,18 +9977,18 @@ var compressImageBufferToBase64 = async (buffer, compression) => {
|
|
|
9960
9977
|
return buffer.toString("base64");
|
|
9961
9978
|
}
|
|
9962
9979
|
const result = await compressImageBuffer(buffer, compression).catch((error) => {
|
|
9963
|
-
|
|
9980
|
+
logger16.warning(`captureScreen \u538B\u7F29\u5931\u8D25\uFF0C\u8FD4\u56DE\u539F\u56FE: ${error instanceof Error ? error.message : String(error)}`);
|
|
9964
9981
|
return null;
|
|
9965
9982
|
});
|
|
9966
9983
|
if (!result?.buffer) {
|
|
9967
9984
|
return buffer.toString("base64");
|
|
9968
9985
|
}
|
|
9969
9986
|
if (result.withinLimit) {
|
|
9970
|
-
|
|
9987
|
+
logger16.info(
|
|
9971
9988
|
`captureScreen \u5DF2\u538B\u7F29: ${originalBytes} -> ${result.bytes} bytes, format=${result.format}, quality=${result.quality}, scale=${result.scale}, size=${result.width}x${result.height}`
|
|
9972
9989
|
);
|
|
9973
9990
|
} else {
|
|
9974
|
-
|
|
9991
|
+
logger16.warning(
|
|
9975
9992
|
`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
9993
|
);
|
|
9977
9994
|
}
|
|
@@ -9979,7 +9996,7 @@ var compressImageBufferToBase64 = async (buffer, compression) => {
|
|
|
9979
9996
|
};
|
|
9980
9997
|
|
|
9981
9998
|
// src/share.js
|
|
9982
|
-
var
|
|
9999
|
+
var logger17 = createInternalLogger("Share");
|
|
9983
10000
|
var DEFAULT_TIMEOUT_MS2 = 50 * 1e3;
|
|
9984
10001
|
var DEFAULT_PAYLOAD_SNAPSHOT_MAX_LEN = 500;
|
|
9985
10002
|
var DEFAULT_POLL_INTERVAL_MS = 120;
|
|
@@ -10116,7 +10133,7 @@ var createDomShareMonitor = async (page, options = {}) => {
|
|
|
10116
10133
|
const onMatch = typeof options.onMatch === "function" ? options.onMatch : null;
|
|
10117
10134
|
const onTelemetry = typeof options.onTelemetry === "function" ? options.onTelemetry : null;
|
|
10118
10135
|
let matched = false;
|
|
10119
|
-
|
|
10136
|
+
logger17.info(`DOM \u76D1\u542C\u51C6\u5907\u6302\u8F7D: selectors=${toJsonInline(selectors, 120)}, mode=${mode2}`);
|
|
10120
10137
|
const monitor = await Mutation.useMonitor(page, selectors, {
|
|
10121
10138
|
mode: mode2,
|
|
10122
10139
|
onMutation: (context = {}) => {
|
|
@@ -10134,12 +10151,12 @@ ${text}`;
|
|
|
10134
10151
|
});
|
|
10135
10152
|
}
|
|
10136
10153
|
if (mutationCount <= 5 || mutationCount % 50 === 0) {
|
|
10137
|
-
|
|
10154
|
+
logger17.info(`DOM \u53D8\u5316\u5DF2\u6355\u83B7: mutationCount=${mutationCount}, mutationNodes=${mutationNodes.length}`);
|
|
10138
10155
|
}
|
|
10139
10156
|
const [candidate] = Utils.parseLinks(rawDom, { prefix }) || [];
|
|
10140
10157
|
if (!candidate) return;
|
|
10141
10158
|
matched = true;
|
|
10142
|
-
|
|
10159
|
+
logger17.success("captureLink.domHit", `DOM \u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: mutationCount=${mutationCount}, link=${candidate}`);
|
|
10143
10160
|
if (onMatch) {
|
|
10144
10161
|
onMatch({
|
|
10145
10162
|
link: candidate,
|
|
@@ -10155,7 +10172,7 @@ ${text}`;
|
|
|
10155
10172
|
return {
|
|
10156
10173
|
stop: async () => {
|
|
10157
10174
|
const result = await monitor.stop();
|
|
10158
|
-
|
|
10175
|
+
logger17.info(`DOM \u76D1\u542C\u5DF2\u505C\u6B62: totalMutations=${result?.totalMutations || 0}`);
|
|
10159
10176
|
return result;
|
|
10160
10177
|
}
|
|
10161
10178
|
};
|
|
@@ -10204,8 +10221,8 @@ var Share = {
|
|
|
10204
10221
|
if (share.mode === "response" && apiMatchers.length === 0) {
|
|
10205
10222
|
throw new Error("Share.captureLink requires share.xurl[0] api matcher when mode=response");
|
|
10206
10223
|
}
|
|
10207
|
-
|
|
10208
|
-
|
|
10224
|
+
logger17.start("captureLink", `mode=${share.mode}, timeoutMs=${timeoutDisabled ? "disabled" : timeoutMs}, prefix=${share.prefix}`);
|
|
10225
|
+
logger17.info(`captureLink \u914D\u7F6E: xurl=${toJsonInline(share.xurl)}, domMode=${domMode}, domSelectors=${toJsonInline(domSelectors, 120)}`);
|
|
10209
10226
|
const stats = {
|
|
10210
10227
|
actionTimedOut: false,
|
|
10211
10228
|
domMutationCount: 0,
|
|
@@ -10217,7 +10234,7 @@ var Share = {
|
|
|
10217
10234
|
responseSampleUrls: []
|
|
10218
10235
|
};
|
|
10219
10236
|
if (isAborted()) {
|
|
10220
|
-
|
|
10237
|
+
logger17.warning(`captureLink \u5DF2\u53D6\u6D88: ${abortReason()}`);
|
|
10221
10238
|
return {
|
|
10222
10239
|
link: null,
|
|
10223
10240
|
payloadText: "",
|
|
@@ -10240,7 +10257,7 @@ var Share = {
|
|
|
10240
10257
|
link: validated,
|
|
10241
10258
|
payloadText: String(payloadText || "")
|
|
10242
10259
|
};
|
|
10243
|
-
|
|
10260
|
+
logger17.info(`\u5019\u9009\u94FE\u63A5\u5DF2\u786E\u8BA4: source=${source}, link=${validated}`);
|
|
10244
10261
|
return true;
|
|
10245
10262
|
};
|
|
10246
10263
|
const resolveResponseCandidate = (responseText) => {
|
|
@@ -10275,7 +10292,7 @@ var Share = {
|
|
|
10275
10292
|
try {
|
|
10276
10293
|
await monitor.stop();
|
|
10277
10294
|
} catch (error) {
|
|
10278
|
-
|
|
10295
|
+
logger17.warning(`\u505C\u6B62 DOM \u76D1\u542C\u5931\u8D25: ${error instanceof Error ? error.message : String(error)}`);
|
|
10279
10296
|
}
|
|
10280
10297
|
};
|
|
10281
10298
|
const onResponse = async (response) => {
|
|
@@ -10289,29 +10306,29 @@ var Share = {
|
|
|
10289
10306
|
stats.responseSampleUrls.push(url);
|
|
10290
10307
|
}
|
|
10291
10308
|
if (stats.responseObserved <= 5) {
|
|
10292
|
-
|
|
10309
|
+
logger17.info(`\u63A5\u53E3\u54CD\u5E94\u91C7\u6837(${stats.responseObserved}): ${url}`);
|
|
10293
10310
|
}
|
|
10294
10311
|
if (!apiMatchers.some((matcher) => url.includes(matcher))) return;
|
|
10295
10312
|
stats.responseMatched += 1;
|
|
10296
10313
|
stats.lastMatchedUrl = url;
|
|
10297
|
-
|
|
10314
|
+
logger17.info(`\u63A5\u53E3\u547D\u4E2D\u5339\u914D(${stats.responseMatched}): ${url}`);
|
|
10298
10315
|
const text = await response.text();
|
|
10299
10316
|
const hit = resolveResponseCandidate(text);
|
|
10300
10317
|
if (!hit?.link) {
|
|
10301
10318
|
if (stats.responseMatched <= 3) {
|
|
10302
|
-
|
|
10319
|
+
logger17.info(`\u63A5\u53E3\u89E3\u6790\u5B8C\u6210\u4F46\u672A\u63D0\u53D6\u5230\u5206\u4EAB\u94FE\u63A5: payloadSize=${text.length}`);
|
|
10303
10320
|
}
|
|
10304
10321
|
return;
|
|
10305
10322
|
}
|
|
10306
10323
|
stats.responseResolved += 1;
|
|
10307
|
-
|
|
10324
|
+
logger17.success("captureLink.responseHit", `\u63A5\u53E3\u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: url=${url}, link=${hit.link}`);
|
|
10308
10325
|
setCandidate("response", hit.link, hit.payloadText);
|
|
10309
10326
|
} catch (error) {
|
|
10310
|
-
|
|
10327
|
+
logger17.warning(`\u63A5\u53E3\u54CD\u5E94\u5904\u7406\u5F02\u5E38: ${error instanceof Error ? error.message : String(error)}`);
|
|
10311
10328
|
}
|
|
10312
10329
|
};
|
|
10313
10330
|
if (share.mode === "dom") {
|
|
10314
|
-
|
|
10331
|
+
logger17.info("\u5F53\u524D\u4E3A DOM \u6A21\u5F0F\uFF0C\u4EC5\u542F\u7528 DOM \u76D1\u542C");
|
|
10315
10332
|
domMonitor = await createDomShareMonitor(page, {
|
|
10316
10333
|
prefix: share.prefix,
|
|
10317
10334
|
selectors: domSelectors,
|
|
@@ -10326,17 +10343,17 @@ var Share = {
|
|
|
10326
10343
|
});
|
|
10327
10344
|
}
|
|
10328
10345
|
if (share.mode === "response") {
|
|
10329
|
-
|
|
10346
|
+
logger17.info(`\u5F53\u524D\u4E3A\u63A5\u53E3\u6A21\u5F0F\uFF0C\u6302\u8F7D response \u76D1\u542C: apiMatchers=${toJsonInline(apiMatchers, 160)}`);
|
|
10330
10347
|
page.on("response", onResponse);
|
|
10331
10348
|
}
|
|
10332
10349
|
if (share.mode === "custom") {
|
|
10333
|
-
|
|
10350
|
+
logger17.info("\u5F53\u524D\u4E3A custom \u6A21\u5F0F\uFF0C\u5C06\u4F7F\u7528 performActions \u8FD4\u56DE\u503C");
|
|
10334
10351
|
}
|
|
10335
10352
|
const deadline = timeoutDisabled ? Infinity : Date.now() + timeoutMs;
|
|
10336
10353
|
const getRemainingMs = () => timeoutDisabled ? Infinity : Math.max(0, deadline - Date.now());
|
|
10337
10354
|
try {
|
|
10338
10355
|
const actionTimeout = getRemainingMs();
|
|
10339
|
-
|
|
10356
|
+
logger17.start("captureLink.performActions", `\u6267\u884C\u52A8\u4F5C\u9884\u7B97=${timeoutDisabled ? "disabled" : `${actionTimeout}ms`}`);
|
|
10340
10357
|
let actionValue;
|
|
10341
10358
|
if (!isAborted() && actionTimeout > 0) {
|
|
10342
10359
|
let timer = null;
|
|
@@ -10349,30 +10366,30 @@ var Share = {
|
|
|
10349
10366
|
]);
|
|
10350
10367
|
if (timer) clearTimeout(timer);
|
|
10351
10368
|
if (actionResult.type === "error") {
|
|
10352
|
-
|
|
10369
|
+
logger17.fail("captureLink.performActions", actionResult.error);
|
|
10353
10370
|
throw actionResult.error;
|
|
10354
10371
|
}
|
|
10355
10372
|
if (actionResult.type === "timeout") {
|
|
10356
10373
|
stats.actionTimedOut = true;
|
|
10357
|
-
|
|
10374
|
+
logger17.warning(`performActions \u5DF2\u8D85\u65F6 (${actionTimeout}ms)\uFF0C\u52A8\u4F5C\u53EF\u80FD\u4ECD\u5728\u5F02\u6B65\u6267\u884C`);
|
|
10358
10375
|
} else {
|
|
10359
10376
|
actionValue = actionResult.result;
|
|
10360
|
-
|
|
10377
|
+
logger17.success("captureLink.performActions", "\u6267\u884C\u52A8\u4F5C\u5B8C\u6210");
|
|
10361
10378
|
}
|
|
10362
10379
|
}
|
|
10363
10380
|
if (share.mode === "custom") {
|
|
10364
10381
|
const customLink = typeof actionValue === "string" ? actionValue : actionValue?.link || actionValue?.payloadText;
|
|
10365
10382
|
const customPayloadText = typeof actionValue === "string" ? actionValue : actionValue?.payloadText;
|
|
10366
10383
|
if (setCandidate("custom", customLink, customPayloadText)) {
|
|
10367
|
-
|
|
10384
|
+
logger17.success("captureLink.customResult", `custom \u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: link=${candidates.custom.link}`);
|
|
10368
10385
|
} else {
|
|
10369
|
-
|
|
10386
|
+
logger17.warning("performActions \u6267\u884C\u5B8C\u6210\u4F46\u672A\u8FD4\u56DE\u6709\u6548\u5206\u4EAB\u94FE\u63A5");
|
|
10370
10387
|
}
|
|
10371
10388
|
}
|
|
10372
10389
|
let nextProgressLogTs = Date.now() + 3e3;
|
|
10373
10390
|
while (true) {
|
|
10374
10391
|
if (isAborted()) {
|
|
10375
|
-
|
|
10392
|
+
logger17.warning(`captureLink \u5DF2\u53D6\u6D88: ${abortReason()}`);
|
|
10376
10393
|
return {
|
|
10377
10394
|
link: null,
|
|
10378
10395
|
payloadText: "",
|
|
@@ -10382,7 +10399,7 @@ var Share = {
|
|
|
10382
10399
|
}
|
|
10383
10400
|
const selected = candidates[share.mode];
|
|
10384
10401
|
if (selected?.link) {
|
|
10385
|
-
|
|
10402
|
+
logger17.success("captureLink", `\u6355\u83B7\u6210\u529F: source=${share.mode}, link=${selected.link}`);
|
|
10386
10403
|
return {
|
|
10387
10404
|
link: selected.link,
|
|
10388
10405
|
payloadText: selected.payloadText,
|
|
@@ -10395,7 +10412,7 @@ var Share = {
|
|
|
10395
10412
|
if (remaining <= 0) break;
|
|
10396
10413
|
const now = Date.now();
|
|
10397
10414
|
if (now >= nextProgressLogTs) {
|
|
10398
|
-
|
|
10415
|
+
logger17.info(
|
|
10399
10416
|
`captureLink \u7B49\u5F85\u4E2D: remaining=${timeoutDisabled ? "disabled" : `${remaining}ms`}, domMutationCount=${stats.domMutationCount}, responseMatched=${stats.responseMatched}`
|
|
10400
10417
|
);
|
|
10401
10418
|
nextProgressLogTs = now + 5e3;
|
|
@@ -10403,11 +10420,11 @@ var Share = {
|
|
|
10403
10420
|
await delay5(Math.max(0, Math.min(DEFAULT_POLL_INTERVAL_MS, remaining)));
|
|
10404
10421
|
}
|
|
10405
10422
|
if (!timeoutDisabled && share.mode === "response" && stats.responseMatched === 0) {
|
|
10406
|
-
|
|
10423
|
+
logger17.warning(
|
|
10407
10424
|
`\u63A5\u53E3\u76D1\u542C\u672A\u547D\u4E2D: apiMatchers=${toJsonInline(apiMatchers, 220)}, \u54CD\u5E94\u6837\u672CURLs=${toJsonInline(stats.responseSampleUrls, 420)}`
|
|
10408
10425
|
);
|
|
10409
10426
|
}
|
|
10410
|
-
|
|
10427
|
+
logger17.warning(
|
|
10411
10428
|
`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
10429
|
);
|
|
10413
10430
|
return {
|
|
@@ -10419,7 +10436,7 @@ var Share = {
|
|
|
10419
10436
|
} finally {
|
|
10420
10437
|
if (share.mode === "response") {
|
|
10421
10438
|
page.off("response", onResponse);
|
|
10422
|
-
|
|
10439
|
+
logger17.info("response \u76D1\u542C\u5DF2\u5378\u8F7D");
|
|
10423
10440
|
}
|
|
10424
10441
|
await stopDomMonitor();
|
|
10425
10442
|
}
|