@skrillex1224/playwright-toolkit 3.0.38 → 3.0.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser.js +39 -105
- package/dist/browser.js.map +4 -4
- package/dist/index.cjs +266 -283
- package/dist/index.cjs.map +4 -4
- package/dist/index.js +266 -283
- package/dist/index.js.map +4 -4
- package/index.d.ts +0 -7
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -227,7 +227,7 @@ var ActorInfo = {
|
|
|
227
227
|
erine: createActorInfo({
|
|
228
228
|
key: "erine",
|
|
229
229
|
name: "\u6587\u5FC3\u4E00\u8A00",
|
|
230
|
-
domain: "
|
|
230
|
+
domain: "xiaoyan.baidu.com",
|
|
231
231
|
path: "/",
|
|
232
232
|
share: {
|
|
233
233
|
mode: "custom",
|
|
@@ -377,18 +377,18 @@ var fallbackLog = {
|
|
|
377
377
|
error: (...args) => console.error(...args),
|
|
378
378
|
debug: (...args) => console.debug ? console.debug(...args) : console.log(...args)
|
|
379
379
|
};
|
|
380
|
-
var resolveLogMethod = (
|
|
381
|
-
if (
|
|
382
|
-
return
|
|
380
|
+
var resolveLogMethod = (logger17, name) => {
|
|
381
|
+
if (logger17 && typeof logger17[name] === "function") {
|
|
382
|
+
return logger17[name].bind(logger17);
|
|
383
383
|
}
|
|
384
|
-
if (name === "warning" &&
|
|
385
|
-
return
|
|
384
|
+
if (name === "warning" && logger17 && typeof logger17.warn === "function") {
|
|
385
|
+
return logger17.warn.bind(logger17);
|
|
386
386
|
}
|
|
387
387
|
return fallbackLog[name];
|
|
388
388
|
};
|
|
389
389
|
var defaultLogger = null;
|
|
390
|
-
var setDefaultLogger = (
|
|
391
|
-
defaultLogger =
|
|
390
|
+
var setDefaultLogger = (logger17) => {
|
|
391
|
+
defaultLogger = logger17;
|
|
392
392
|
};
|
|
393
393
|
var resolveLogger = (explicitLogger) => {
|
|
394
394
|
if (explicitLogger && typeof explicitLogger.info === "function") {
|
|
@@ -415,8 +415,8 @@ var colorize = (text, color) => {
|
|
|
415
415
|
var createBaseLogger = (prefix = "", explicitLogger) => {
|
|
416
416
|
const name = prefix ? String(prefix) : "";
|
|
417
417
|
const dispatch = (methodName, icon, message, color) => {
|
|
418
|
-
const
|
|
419
|
-
const logFn = resolveLogMethod(
|
|
418
|
+
const logger17 = resolveLogger(explicitLogger);
|
|
419
|
+
const logFn = resolveLogMethod(logger17, methodName);
|
|
420
420
|
const timestamp = colorize(`[${formatTimestamp()}]`, ANSI.gray);
|
|
421
421
|
const line = formatLine(name, icon, message);
|
|
422
422
|
const coloredLine = colorize(line, color);
|
|
@@ -1593,16 +1593,12 @@ var ProxyMeterRuntime = {
|
|
|
1593
1593
|
getProxyMeterSnapshot
|
|
1594
1594
|
};
|
|
1595
1595
|
|
|
1596
|
-
// src/runtime-env.js
|
|
1597
|
-
import picomatch from "picomatch";
|
|
1598
|
-
|
|
1599
1596
|
// src/internals/constants.js
|
|
1600
1597
|
var PageRuntimeStateKey = "__playwright_toolkit_runtime_state__";
|
|
1601
1598
|
|
|
1602
1599
|
// src/runtime-env.js
|
|
1603
1600
|
var BROWSER_PROFILE_SCHEMA_VERSION = 1;
|
|
1604
1601
|
var SUPPORTED_CLOAK_FINGERPRINT_PLATFORMS = /* @__PURE__ */ new Set(["linux", "macos", "windows"]);
|
|
1605
|
-
var logger3 = createInternalLogger("RuntimeEnv");
|
|
1606
1602
|
var rememberedRuntimeState = null;
|
|
1607
1603
|
var isPlainObject = (value) => value && typeof value === "object" && !Array.isArray(value);
|
|
1608
1604
|
var normalizeKnownDevice = (value) => {
|
|
@@ -1759,18 +1755,6 @@ var uniqueStrings = (value) => {
|
|
|
1759
1755
|
});
|
|
1760
1756
|
return result;
|
|
1761
1757
|
};
|
|
1762
|
-
var buildApplyExcludeMatcher = (patterns = []) => {
|
|
1763
|
-
const normalized = (Array.isArray(patterns) ? patterns : []).map((pattern) => String(pattern || "").trim()).filter(Boolean);
|
|
1764
|
-
return normalized.length > 0 ? picomatch(normalized, { nocase: true }) : () => false;
|
|
1765
|
-
};
|
|
1766
|
-
var filterApplyEntries = (entries = {}, matcher = () => false) => Object.entries(entries || {}).reduce((acc, [key, value]) => {
|
|
1767
|
-
if (matcher(key)) acc.skipped.push(key);
|
|
1768
|
-
else acc.payload[key] = value;
|
|
1769
|
-
return acc;
|
|
1770
|
-
}, { payload: {}, skipped: [] });
|
|
1771
|
-
var logApplySkipped = (type, keys = []) => {
|
|
1772
|
-
if (keys.length > 0) logger3.info(`applyToPage \u8DF3\u8FC7\u6CE8\u5165 ${type}: ${keys.join(", ")}`);
|
|
1773
|
-
};
|
|
1774
1758
|
var normalizeHttpUrlList = (value) => uniqueStrings(
|
|
1775
1759
|
(Array.isArray(value) ? value : [value]).map((item) => normalizeHttpUrl(item)).filter(Boolean)
|
|
1776
1760
|
);
|
|
@@ -2242,24 +2226,9 @@ var RuntimeEnv = {
|
|
|
2242
2226
|
writable: true,
|
|
2243
2227
|
value: state2
|
|
2244
2228
|
});
|
|
2245
|
-
const
|
|
2246
|
-
const
|
|
2247
|
-
|
|
2248
|
-
buildApplyExcludeMatcher(exclude.local_storage)
|
|
2249
|
-
);
|
|
2250
|
-
const sessionStorageResult = filterApplyEntries(
|
|
2251
|
-
state2.sessionStorage || {},
|
|
2252
|
-
buildApplyExcludeMatcher(exclude.session_storage)
|
|
2253
|
-
);
|
|
2254
|
-
const cookieMatcher = buildApplyExcludeMatcher(exclude.cookies);
|
|
2255
|
-
const skippedCookies = [];
|
|
2256
|
-
const localStorage = localStorageResult.payload;
|
|
2257
|
-
const sessionStorage = sessionStorageResult.payload;
|
|
2258
|
-
const cookies = (state2.cookies || []).filter((cookie) => {
|
|
2259
|
-
if (!cookieMatcher(cookie?.name)) return true;
|
|
2260
|
-
skippedCookies.push(cookie.name);
|
|
2261
|
-
return false;
|
|
2262
|
-
}).map((cookie) => {
|
|
2229
|
+
const localStorage = state2.localStorage || {};
|
|
2230
|
+
const sessionStorage = state2.sessionStorage || {};
|
|
2231
|
+
const cookies = (state2.cookies || []).map((cookie) => {
|
|
2263
2232
|
const normalized = { ...cookie };
|
|
2264
2233
|
if (!normalized.path) {
|
|
2265
2234
|
normalized.path = "/";
|
|
@@ -2269,9 +2238,6 @@ var RuntimeEnv = {
|
|
|
2269
2238
|
}
|
|
2270
2239
|
return normalized;
|
|
2271
2240
|
}).filter(Boolean);
|
|
2272
|
-
logApplySkipped("cookies", skippedCookies);
|
|
2273
|
-
logApplySkipped("local_storage", localStorageResult.skipped);
|
|
2274
|
-
logApplySkipped("session_storage", sessionStorageResult.skipped);
|
|
2275
2241
|
if (cookies.length > 0) {
|
|
2276
2242
|
await page.context().addCookies(cookies);
|
|
2277
2243
|
}
|
|
@@ -2331,7 +2297,7 @@ var RuntimeEnv = {
|
|
|
2331
2297
|
};
|
|
2332
2298
|
|
|
2333
2299
|
// src/apify-kit.js
|
|
2334
|
-
var
|
|
2300
|
+
var logger3 = createInternalLogger("ApifyKit");
|
|
2335
2301
|
var hasFleetAtHomeFlag = () => String(process.env.FLEET_AT_HOME || "").trim() !== "";
|
|
2336
2302
|
var resolveRuntimeContext = (input) => {
|
|
2337
2303
|
const rememberedState = RuntimeEnv.peekRememberedState();
|
|
@@ -2417,7 +2383,7 @@ var captureAutoEnvPatch = async (page, runtimeContext) => {
|
|
|
2417
2383
|
{ actor: runtimeContext.actor }
|
|
2418
2384
|
);
|
|
2419
2385
|
} catch (error) {
|
|
2420
|
-
|
|
2386
|
+
logger3.warn(`\u81EA\u52A8\u91C7\u96C6 env_patch \u5931\u8D25: ${error?.message || error}`);
|
|
2421
2387
|
return null;
|
|
2422
2388
|
}
|
|
2423
2389
|
};
|
|
@@ -2462,29 +2428,29 @@ async function createApifyKit() {
|
|
|
2462
2428
|
const { times: retryTimes = 0, mode: retryMode = "direct", before: beforeRetry } = retry;
|
|
2463
2429
|
const executeAction = async (attemptNumber) => {
|
|
2464
2430
|
const attemptLabel = attemptNumber > 0 ? ` (\u91CD\u8BD5 #${attemptNumber})` : "";
|
|
2465
|
-
|
|
2431
|
+
logger3.start(`[Step] ${step}${attemptLabel}`);
|
|
2466
2432
|
try {
|
|
2467
2433
|
const result = await actionFn();
|
|
2468
|
-
|
|
2434
|
+
logger3.success(`[Step] ${step}${attemptLabel}`);
|
|
2469
2435
|
return { success: true, result };
|
|
2470
2436
|
} catch (error) {
|
|
2471
|
-
|
|
2437
|
+
logger3.fail(`[Step] ${step}${attemptLabel}`, error);
|
|
2472
2438
|
return { success: false, error };
|
|
2473
2439
|
}
|
|
2474
2440
|
};
|
|
2475
2441
|
const prepareForRetry = async (attemptNumber) => {
|
|
2476
2442
|
if (typeof beforeRetry === "function") {
|
|
2477
|
-
|
|
2443
|
+
logger3.start(`[RetryStep] \u6267\u884C\u81EA\u5B9A\u4E49 before \u94A9\u5B50 (\u7B2C ${attemptNumber} \u6B21\u91CD\u8BD5)`);
|
|
2478
2444
|
await beforeRetry(page, attemptNumber);
|
|
2479
|
-
|
|
2445
|
+
logger3.success(`[RetryStep] before \u94A9\u5B50\u5B8C\u6210`);
|
|
2480
2446
|
} else if (retryMode === "refresh") {
|
|
2481
|
-
|
|
2447
|
+
logger3.start(`[RetryStep] \u5237\u65B0\u9875\u9762 (\u7B2C ${attemptNumber} \u6B21\u91CD\u8BD5)`);
|
|
2482
2448
|
await page.reload({ waitUntil: "commit" });
|
|
2483
|
-
|
|
2449
|
+
logger3.success(`[RetryStep] \u9875\u9762\u5237\u65B0\u5B8C\u6210`);
|
|
2484
2450
|
} else {
|
|
2485
|
-
|
|
2451
|
+
logger3.start(`[RetryStep] \u7B49\u5F85 3 \u79D2 (\u7B2C ${attemptNumber} \u6B21\u91CD\u8BD5)`);
|
|
2486
2452
|
await new Promise((resolve) => setTimeout(resolve, 3e3));
|
|
2487
|
-
|
|
2453
|
+
logger3.success(`[RetryStep] \u7B49\u5F85\u5B8C\u6210`);
|
|
2488
2454
|
}
|
|
2489
2455
|
};
|
|
2490
2456
|
let lastResult = await executeAction(0);
|
|
@@ -2492,11 +2458,11 @@ async function createApifyKit() {
|
|
|
2492
2458
|
return lastResult.result;
|
|
2493
2459
|
}
|
|
2494
2460
|
for (let attempt = 1; attempt <= retryTimes; attempt++) {
|
|
2495
|
-
|
|
2461
|
+
logger3.start(`[RetryStep] \u51C6\u5907\u7B2C ${attempt}/${retryTimes} \u6B21\u91CD\u8BD5: ${step}`);
|
|
2496
2462
|
try {
|
|
2497
2463
|
await prepareForRetry(attempt);
|
|
2498
2464
|
} catch (prepareError) {
|
|
2499
|
-
|
|
2465
|
+
logger3.warn(`[RetryStep] \u91CD\u8BD5\u51C6\u5907\u5931\u8D25: ${prepareError.message}`);
|
|
2500
2466
|
continue;
|
|
2501
2467
|
}
|
|
2502
2468
|
lastResult = await executeAction(attempt);
|
|
@@ -2512,7 +2478,7 @@ async function createApifyKit() {
|
|
|
2512
2478
|
try {
|
|
2513
2479
|
html = await page.content();
|
|
2514
2480
|
} catch (htmlErr) {
|
|
2515
|
-
|
|
2481
|
+
logger3.warn(`HTML \u91C7\u96C6\u5931\u8D25: ${htmlErr.message}`);
|
|
2516
2482
|
}
|
|
2517
2483
|
}
|
|
2518
2484
|
try {
|
|
@@ -2525,7 +2491,7 @@ async function createApifyKit() {
|
|
|
2525
2491
|
base64 = `data:image/jpeg;base64,${buffer.toString("base64")}`;
|
|
2526
2492
|
}
|
|
2527
2493
|
} catch (snapErr) {
|
|
2528
|
-
|
|
2494
|
+
logger3.warn(`\u622A\u56FE\u751F\u6210\u5931\u8D25: ${snapErr.message}`);
|
|
2529
2495
|
}
|
|
2530
2496
|
await this.pushFailed(
|
|
2531
2497
|
finalError,
|
|
@@ -2598,7 +2564,7 @@ async function createApifyKit() {
|
|
|
2598
2564
|
await Actor2.pushData({
|
|
2599
2565
|
...payload
|
|
2600
2566
|
});
|
|
2601
|
-
|
|
2567
|
+
logger3.success("pushSuccess", "Data pushed");
|
|
2602
2568
|
},
|
|
2603
2569
|
/**
|
|
2604
2570
|
* 推送失败数据的通用方法(私有方法,仅供 runStep 内部使用)。
|
|
@@ -2639,7 +2605,7 @@ async function createApifyKit() {
|
|
|
2639
2605
|
await Actor2.pushData({
|
|
2640
2606
|
...payload
|
|
2641
2607
|
});
|
|
2642
|
-
|
|
2608
|
+
logger3.success("pushFailed", "Error data pushed");
|
|
2643
2609
|
}
|
|
2644
2610
|
};
|
|
2645
2611
|
}
|
|
@@ -2655,7 +2621,7 @@ var ApifyKit = {
|
|
|
2655
2621
|
};
|
|
2656
2622
|
|
|
2657
2623
|
// src/internals/utils.js
|
|
2658
|
-
var
|
|
2624
|
+
var logger4 = createInternalLogger("InternalUtils");
|
|
2659
2625
|
var parseCookies = (cookieString, domain) => {
|
|
2660
2626
|
const cookies = [];
|
|
2661
2627
|
const pairs = cookieString.split(";").map((c) => c.trim());
|
|
@@ -2673,7 +2639,7 @@ var parseCookies = (cookieString, domain) => {
|
|
|
2673
2639
|
cookies.push(cookie);
|
|
2674
2640
|
}
|
|
2675
2641
|
}
|
|
2676
|
-
|
|
2642
|
+
logger4.success("parseCookies", `parsed ${cookies.length} cookies`);
|
|
2677
2643
|
return cookies;
|
|
2678
2644
|
};
|
|
2679
2645
|
|
|
@@ -3511,7 +3477,7 @@ import delay4 from "delay";
|
|
|
3511
3477
|
// src/internals/humanize/desktop.js
|
|
3512
3478
|
import delay2 from "delay";
|
|
3513
3479
|
import { createCursor } from "ghost-cursor-playwright";
|
|
3514
|
-
var
|
|
3480
|
+
var logger5 = createInternalLogger("Humanize");
|
|
3515
3481
|
var $CursorWeakMap = /* @__PURE__ */ new WeakMap();
|
|
3516
3482
|
function $GetCursor(page) {
|
|
3517
3483
|
const cursor = $CursorWeakMap.get(page);
|
|
@@ -3539,13 +3505,13 @@ var Humanize = {
|
|
|
3539
3505
|
*/
|
|
3540
3506
|
async initializeCursor(page) {
|
|
3541
3507
|
if ($CursorWeakMap.has(page)) {
|
|
3542
|
-
|
|
3508
|
+
logger5.debug("initializeCursor: cursor already exists, skipping");
|
|
3543
3509
|
return;
|
|
3544
3510
|
}
|
|
3545
|
-
|
|
3511
|
+
logger5.start("initializeCursor", "creating cursor");
|
|
3546
3512
|
const cursor = await createCursor(page);
|
|
3547
3513
|
$CursorWeakMap.set(page, cursor);
|
|
3548
|
-
|
|
3514
|
+
logger5.success("initializeCursor", "cursor initialized");
|
|
3549
3515
|
},
|
|
3550
3516
|
/**
|
|
3551
3517
|
* 人类化鼠标移动 - 使用 ghost-cursor 移动到指定位置或元素
|
|
@@ -3555,17 +3521,17 @@ var Humanize = {
|
|
|
3555
3521
|
*/
|
|
3556
3522
|
async humanMove(page, target) {
|
|
3557
3523
|
const cursor = $GetCursor(page);
|
|
3558
|
-
|
|
3524
|
+
logger5.start("humanMove", `target=${typeof target === "string" ? target : "element/coords"}`);
|
|
3559
3525
|
try {
|
|
3560
3526
|
if (typeof target === "string") {
|
|
3561
3527
|
const element = await page.$(target);
|
|
3562
3528
|
if (!element) {
|
|
3563
|
-
|
|
3529
|
+
logger5.warn(`humanMove: \u5143\u7D20\u4E0D\u5B58\u5728 ${target}`);
|
|
3564
3530
|
return false;
|
|
3565
3531
|
}
|
|
3566
3532
|
const box = await element.boundingBox();
|
|
3567
3533
|
if (!box) {
|
|
3568
|
-
|
|
3534
|
+
logger5.warn(`humanMove: \u65E0\u6CD5\u83B7\u53D6\u4F4D\u7F6E ${target}`);
|
|
3569
3535
|
return false;
|
|
3570
3536
|
}
|
|
3571
3537
|
const x = box.x + box.width / 2 + (Math.random() - 0.5) * box.width * 0.2;
|
|
@@ -3581,10 +3547,10 @@ var Humanize = {
|
|
|
3581
3547
|
await cursor.actions.move({ x, y });
|
|
3582
3548
|
}
|
|
3583
3549
|
}
|
|
3584
|
-
|
|
3550
|
+
logger5.success("humanMove");
|
|
3585
3551
|
return true;
|
|
3586
3552
|
} catch (error) {
|
|
3587
|
-
|
|
3553
|
+
logger5.fail("humanMove", error);
|
|
3588
3554
|
throw error;
|
|
3589
3555
|
}
|
|
3590
3556
|
},
|
|
@@ -3608,12 +3574,12 @@ var Humanize = {
|
|
|
3608
3574
|
maxDurationMs = maxSteps * 220 + 800
|
|
3609
3575
|
} = options;
|
|
3610
3576
|
const targetDesc = typeof target === "string" ? target : "ElementHandle";
|
|
3611
|
-
|
|
3577
|
+
logger5.start("humanScroll", `target=${targetDesc}`);
|
|
3612
3578
|
let element;
|
|
3613
3579
|
if (typeof target === "string") {
|
|
3614
3580
|
element = await page.$(target);
|
|
3615
3581
|
if (!element) {
|
|
3616
|
-
|
|
3582
|
+
logger5.warn(`humanScroll | \u5143\u7D20\u672A\u627E\u5230: ${target}`);
|
|
3617
3583
|
return { element: null, didScroll: false };
|
|
3618
3584
|
}
|
|
3619
3585
|
} else {
|
|
@@ -3688,26 +3654,26 @@ var Humanize = {
|
|
|
3688
3654
|
try {
|
|
3689
3655
|
for (let i = 0; i < maxSteps; i++) {
|
|
3690
3656
|
if (Date.now() - startTime > maxDurationMs) {
|
|
3691
|
-
|
|
3657
|
+
logger5.warn(`humanScroll | \u8D85\u65F6\u4FDD\u62A4\u89E6\u53D1 (${maxDurationMs}ms)`);
|
|
3692
3658
|
return { element, didScroll };
|
|
3693
3659
|
}
|
|
3694
3660
|
const status = await checkVisibility();
|
|
3695
3661
|
if (status.code === "VISIBLE") {
|
|
3696
3662
|
if (status.isFixed) {
|
|
3697
|
-
|
|
3663
|
+
logger5.info("humanScroll | fixed \u5BB9\u5668\u5185\uFF0C\u8DF3\u8FC7\u6EDA\u52A8");
|
|
3698
3664
|
} else {
|
|
3699
|
-
|
|
3665
|
+
logger5.debug("humanScroll | \u5143\u7D20\u53EF\u89C1\u4E14\u65E0\u906E\u6321");
|
|
3700
3666
|
}
|
|
3701
|
-
|
|
3667
|
+
logger5.success("humanScroll", didScroll ? "\u5DF2\u6EDA\u52A8" : "\u65E0\u9700\u6EDA\u52A8");
|
|
3702
3668
|
return { element, didScroll };
|
|
3703
3669
|
}
|
|
3704
|
-
|
|
3670
|
+
logger5.debug(`humanScroll | \u6B65\u9AA4 ${i + 1}/${maxSteps}: ${status.reason} ${status.direction ? `(${status.direction})` : ""}`);
|
|
3705
3671
|
if (status.code === "OBSTRUCTED" && status.obstruction) {
|
|
3706
|
-
|
|
3672
|
+
logger5.debug(`humanScroll | \u88AB\u4EE5\u4E0B\u5143\u7D20\u906E\u6321 <${status.obstruction.tag} id="${status.obstruction.id}">`);
|
|
3707
3673
|
}
|
|
3708
3674
|
const scrollRect = await getScrollableRect2();
|
|
3709
3675
|
if (!scrollRect && status.isFixed) {
|
|
3710
|
-
|
|
3676
|
+
logger5.warn("humanScroll | fixed \u5BB9\u5668\u5185\u4E14\u65E0\u53EF\u6EDA\u52A8\u7956\u5148\uFF0C\u8DF3\u8FC7\u6EDA\u52A8");
|
|
3711
3677
|
return { element, didScroll };
|
|
3712
3678
|
}
|
|
3713
3679
|
const stepMin = scrollRect ? Math.min(minStep, Math.max(60, scrollRect.height * 0.4)) : minStep;
|
|
@@ -3743,10 +3709,10 @@ var Humanize = {
|
|
|
3743
3709
|
didScroll = true;
|
|
3744
3710
|
await delay2(this.jitterMs(20 + Math.random() * 40, 0.2));
|
|
3745
3711
|
}
|
|
3746
|
-
|
|
3712
|
+
logger5.warn(`humanScroll | \u5728 ${maxSteps} \u6B65\u540E\u65E0\u6CD5\u786E\u4FDD\u53EF\u89C1\u6027`);
|
|
3747
3713
|
return { element, didScroll };
|
|
3748
3714
|
} catch (error) {
|
|
3749
|
-
|
|
3715
|
+
logger5.fail("humanScroll", error);
|
|
3750
3716
|
throw error;
|
|
3751
3717
|
}
|
|
3752
3718
|
},
|
|
@@ -3764,7 +3730,7 @@ var Humanize = {
|
|
|
3764
3730
|
const cursor = $GetCursor(page);
|
|
3765
3731
|
const { reactionDelay = 250, throwOnMissing = true, scrollIfNeeded = true, restore = false } = options;
|
|
3766
3732
|
const targetDesc = target == null ? "Current Position" : typeof target === "string" ? target : "ElementHandle";
|
|
3767
|
-
|
|
3733
|
+
logger5.start("humanClick", `target=${targetDesc}`);
|
|
3768
3734
|
const restoreOnce = async () => {
|
|
3769
3735
|
if (restoreOnce.restored) return;
|
|
3770
3736
|
restoreOnce.restored = true;
|
|
@@ -3773,14 +3739,14 @@ var Humanize = {
|
|
|
3773
3739
|
await delay2(this.jitterMs(1e3));
|
|
3774
3740
|
await restoreOnce.do();
|
|
3775
3741
|
} catch (restoreError) {
|
|
3776
|
-
|
|
3742
|
+
logger5.warn(`humanClick: \u6062\u590D\u6EDA\u52A8\u4F4D\u7F6E\u5931\u8D25: ${restoreError.message}`);
|
|
3777
3743
|
}
|
|
3778
3744
|
};
|
|
3779
3745
|
try {
|
|
3780
3746
|
if (target == null) {
|
|
3781
3747
|
await delay2(this.jitterMs(reactionDelay, 0.4));
|
|
3782
3748
|
await cursor.actions.click();
|
|
3783
|
-
|
|
3749
|
+
logger5.success("humanClick", "Clicked current position");
|
|
3784
3750
|
return true;
|
|
3785
3751
|
}
|
|
3786
3752
|
let element;
|
|
@@ -3790,7 +3756,7 @@ var Humanize = {
|
|
|
3790
3756
|
if (throwOnMissing) {
|
|
3791
3757
|
throw new Error(`\u627E\u4E0D\u5230\u5143\u7D20 ${target}`);
|
|
3792
3758
|
}
|
|
3793
|
-
|
|
3759
|
+
logger5.warn(`humanClick: \u5143\u7D20\u4E0D\u5B58\u5728\uFF0C\u8DF3\u8FC7\u70B9\u51FB ${target}`);
|
|
3794
3760
|
return false;
|
|
3795
3761
|
}
|
|
3796
3762
|
} else {
|
|
@@ -3806,7 +3772,7 @@ var Humanize = {
|
|
|
3806
3772
|
if (throwOnMissing) {
|
|
3807
3773
|
throw new Error("\u65E0\u6CD5\u83B7\u53D6\u5143\u7D20\u4F4D\u7F6E");
|
|
3808
3774
|
}
|
|
3809
|
-
|
|
3775
|
+
logger5.warn("humanClick: \u65E0\u6CD5\u83B7\u53D6\u4F4D\u7F6E\uFF0C\u8DF3\u8FC7\u70B9\u51FB");
|
|
3810
3776
|
return false;
|
|
3811
3777
|
}
|
|
3812
3778
|
const x = box.x + box.width / 2 + (Math.random() - 0.5) * box.width * 0.3;
|
|
@@ -3815,11 +3781,11 @@ var Humanize = {
|
|
|
3815
3781
|
await delay2(this.jitterMs(reactionDelay, 0.4));
|
|
3816
3782
|
await cursor.actions.click();
|
|
3817
3783
|
await restoreOnce();
|
|
3818
|
-
|
|
3784
|
+
logger5.success("humanClick");
|
|
3819
3785
|
return true;
|
|
3820
3786
|
} catch (error) {
|
|
3821
3787
|
await restoreOnce();
|
|
3822
|
-
|
|
3788
|
+
logger5.fail("humanClick", error);
|
|
3823
3789
|
throw error;
|
|
3824
3790
|
}
|
|
3825
3791
|
},
|
|
@@ -3830,9 +3796,9 @@ var Humanize = {
|
|
|
3830
3796
|
*/
|
|
3831
3797
|
async randomSleep(baseMs, jitterPercent = 0.3) {
|
|
3832
3798
|
const ms = this.jitterMs(baseMs, jitterPercent);
|
|
3833
|
-
|
|
3799
|
+
logger5.start("randomSleep", `base=${baseMs}, actual=${ms}ms`);
|
|
3834
3800
|
await delay2(ms);
|
|
3835
|
-
|
|
3801
|
+
logger5.success("randomSleep");
|
|
3836
3802
|
},
|
|
3837
3803
|
/**
|
|
3838
3804
|
* 模拟人类"注视"或"阅读"行为:鼠标在页面上随机微动
|
|
@@ -3842,7 +3808,7 @@ var Humanize = {
|
|
|
3842
3808
|
async simulateGaze(page, baseDurationMs = 2500) {
|
|
3843
3809
|
const cursor = $GetCursor(page);
|
|
3844
3810
|
const durationMs = this.jitterMs(baseDurationMs, 0.4);
|
|
3845
|
-
|
|
3811
|
+
logger5.start("simulateGaze", `duration=${durationMs}ms`);
|
|
3846
3812
|
const startTime = Date.now();
|
|
3847
3813
|
const viewportSize = page.viewportSize() || { width: 1920, height: 1080 };
|
|
3848
3814
|
while (Date.now() - startTime < durationMs) {
|
|
@@ -3851,7 +3817,7 @@ var Humanize = {
|
|
|
3851
3817
|
await cursor.actions.move({ x, y });
|
|
3852
3818
|
await delay2(this.jitterMs(600, 0.5));
|
|
3853
3819
|
}
|
|
3854
|
-
|
|
3820
|
+
logger5.success("simulateGaze");
|
|
3855
3821
|
},
|
|
3856
3822
|
/**
|
|
3857
3823
|
* 人类化输入 - 带节奏变化(快-慢-停顿-偶尔加速)
|
|
@@ -3864,7 +3830,7 @@ var Humanize = {
|
|
|
3864
3830
|
* @param {number} [options.pauseBase=800] - 停顿时长基础值 (ms),实际 ±50% 抖动
|
|
3865
3831
|
*/
|
|
3866
3832
|
async humanType(page, selector, text, options = {}) {
|
|
3867
|
-
|
|
3833
|
+
logger5.start("humanType", `selector=${selector}, textLen=${text.length}`);
|
|
3868
3834
|
const {
|
|
3869
3835
|
baseDelay = 180,
|
|
3870
3836
|
pauseProbability = 0.08,
|
|
@@ -3888,13 +3854,13 @@ var Humanize = {
|
|
|
3888
3854
|
await delay2(charDelay);
|
|
3889
3855
|
if (Math.random() < pauseProbability && i < text.length - 1) {
|
|
3890
3856
|
const pauseTime = this.jitterMs(pauseBase, 0.5);
|
|
3891
|
-
|
|
3857
|
+
logger5.debug(`\u505C\u987F ${pauseTime}ms...`);
|
|
3892
3858
|
await delay2(pauseTime);
|
|
3893
3859
|
}
|
|
3894
3860
|
}
|
|
3895
|
-
|
|
3861
|
+
logger5.success("humanType");
|
|
3896
3862
|
} catch (error) {
|
|
3897
|
-
|
|
3863
|
+
logger5.fail("humanType", error);
|
|
3898
3864
|
throw error;
|
|
3899
3865
|
}
|
|
3900
3866
|
},
|
|
@@ -3918,7 +3884,7 @@ var Humanize = {
|
|
|
3918
3884
|
keyboardOptions = {}
|
|
3919
3885
|
} = pressOptions || {};
|
|
3920
3886
|
const targetDesc = hasTarget ? typeof targetOrKey === "string" ? targetOrKey : "ElementHandle" : "current focus";
|
|
3921
|
-
|
|
3887
|
+
logger5.start("humanPress", `key=${key}, target=${targetDesc}`);
|
|
3922
3888
|
try {
|
|
3923
3889
|
if (hasTarget) {
|
|
3924
3890
|
await this.humanClick(page, targetOrKey, { reactionDelay: focusDelay, scrollIfNeeded, throwOnMissing });
|
|
@@ -3928,10 +3894,10 @@ var Humanize = {
|
|
|
3928
3894
|
...keyboardOptions,
|
|
3929
3895
|
delay: this.jitterMs(holdDelay, 0.5)
|
|
3930
3896
|
});
|
|
3931
|
-
|
|
3897
|
+
logger5.success("humanPress");
|
|
3932
3898
|
return true;
|
|
3933
3899
|
} catch (error) {
|
|
3934
|
-
|
|
3900
|
+
logger5.fail("humanPress", error);
|
|
3935
3901
|
throw error;
|
|
3936
3902
|
}
|
|
3937
3903
|
},
|
|
@@ -3941,22 +3907,22 @@ var Humanize = {
|
|
|
3941
3907
|
* @param {string} selector - 输入框选择器
|
|
3942
3908
|
*/
|
|
3943
3909
|
async humanClear(page, selector) {
|
|
3944
|
-
|
|
3910
|
+
logger5.start("humanClear", `selector=${selector}`);
|
|
3945
3911
|
try {
|
|
3946
3912
|
const locator = page.locator(selector);
|
|
3947
3913
|
await locator.click();
|
|
3948
3914
|
await delay2(this.jitterMs(200, 0.4));
|
|
3949
3915
|
const currentValue = await locator.inputValue();
|
|
3950
3916
|
if (!currentValue || currentValue.length === 0) {
|
|
3951
|
-
|
|
3917
|
+
logger5.success("humanClear", "already empty");
|
|
3952
3918
|
return;
|
|
3953
3919
|
}
|
|
3954
3920
|
await page.keyboard.press("Meta+A");
|
|
3955
3921
|
await delay2(this.jitterMs(100, 0.4));
|
|
3956
3922
|
await page.keyboard.press("Backspace");
|
|
3957
|
-
|
|
3923
|
+
logger5.success("humanClear");
|
|
3958
3924
|
} catch (error) {
|
|
3959
|
-
|
|
3925
|
+
logger5.fail("humanClear", error);
|
|
3960
3926
|
throw error;
|
|
3961
3927
|
}
|
|
3962
3928
|
},
|
|
@@ -3968,7 +3934,7 @@ var Humanize = {
|
|
|
3968
3934
|
async warmUpBrowsing(page, baseDuration = 3500) {
|
|
3969
3935
|
const cursor = $GetCursor(page);
|
|
3970
3936
|
const durationMs = this.jitterMs(baseDuration, 0.4);
|
|
3971
|
-
|
|
3937
|
+
logger5.start("warmUpBrowsing", `duration=${durationMs}ms`);
|
|
3972
3938
|
const startTime = Date.now();
|
|
3973
3939
|
const viewportSize = page.viewportSize() || { width: 1920, height: 1080 };
|
|
3974
3940
|
try {
|
|
@@ -3979,13 +3945,17 @@ var Humanize = {
|
|
|
3979
3945
|
const y = 100 + Math.random() * (viewportSize.height - 200);
|
|
3980
3946
|
await cursor.actions.move({ x, y });
|
|
3981
3947
|
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));
|
|
3982
3952
|
} else {
|
|
3983
3953
|
await delay2(this.jitterMs(800, 0.5));
|
|
3984
3954
|
}
|
|
3985
3955
|
}
|
|
3986
|
-
|
|
3956
|
+
logger5.success("warmUpBrowsing");
|
|
3987
3957
|
} catch (error) {
|
|
3988
|
-
|
|
3958
|
+
logger5.fail("warmUpBrowsing", error);
|
|
3989
3959
|
throw error;
|
|
3990
3960
|
}
|
|
3991
3961
|
},
|
|
@@ -3999,7 +3969,7 @@ var Humanize = {
|
|
|
3999
3969
|
async naturalScroll(page, direction = "down", distance = 300, baseSteps = 5) {
|
|
4000
3970
|
const steps = Math.max(3, baseSteps + Math.floor(Math.random() * 3) - 1);
|
|
4001
3971
|
const actualDistance = this.jitterMs(distance, 0.15);
|
|
4002
|
-
|
|
3972
|
+
logger5.start("naturalScroll", `dir=${direction}, dist=${actualDistance}, steps=${steps}`);
|
|
4003
3973
|
const sign = direction === "down" ? 1 : -1;
|
|
4004
3974
|
const stepDistance = actualDistance / steps;
|
|
4005
3975
|
try {
|
|
@@ -4011,9 +3981,9 @@ var Humanize = {
|
|
|
4011
3981
|
const baseDelay = 60 + i * 25;
|
|
4012
3982
|
await delay2(this.jitterMs(baseDelay, 0.3));
|
|
4013
3983
|
}
|
|
4014
|
-
|
|
3984
|
+
logger5.success("naturalScroll");
|
|
4015
3985
|
} catch (error) {
|
|
4016
|
-
|
|
3986
|
+
logger5.fail("naturalScroll", error);
|
|
4017
3987
|
throw error;
|
|
4018
3988
|
}
|
|
4019
3989
|
}
|
|
@@ -4042,7 +4012,7 @@ var resolveElement = async (page, target, { throwOnMissing = true } = {}) => {
|
|
|
4042
4012
|
var waitJitter = (base, jitterPercent = 0.3) => delay3(jitterMs(base, jitterPercent));
|
|
4043
4013
|
|
|
4044
4014
|
// src/internals/humanize/mobile.js
|
|
4045
|
-
var
|
|
4015
|
+
var logger6 = createInternalLogger("Humanize.Mobile");
|
|
4046
4016
|
var initializedPages = /* @__PURE__ */ new WeakSet();
|
|
4047
4017
|
var DEFAULT_TAP_TIMEOUT_MS = 2500;
|
|
4048
4018
|
var DEFAULT_MOUSE_TAP_FALLBACK_TIMEOUT_MS = 1200;
|
|
@@ -4499,7 +4469,7 @@ var dispatchTouchSwipe = async (page, deltaY, options = {}) => {
|
|
|
4499
4469
|
}
|
|
4500
4470
|
return true;
|
|
4501
4471
|
} catch (error) {
|
|
4502
|
-
|
|
4472
|
+
logger6.debug(`touch swipe fallback: ${error?.message || error}`);
|
|
4503
4473
|
try {
|
|
4504
4474
|
await page.evaluate((amount) => window.scrollBy(0, amount), deltaY);
|
|
4505
4475
|
await waitJitter(120, 0.35);
|
|
@@ -4533,7 +4503,7 @@ var tapPoint = async (page, point, options = {}) => {
|
|
|
4533
4503
|
);
|
|
4534
4504
|
return { method: "touchscreen" };
|
|
4535
4505
|
} catch (error) {
|
|
4536
|
-
|
|
4506
|
+
logger6.warn(`tapPoint | touchscreen.tap \u5931\u8D25\u6216\u8D85\u65F6\uFF0C\u5C1D\u8BD5\u9F20\u6807\u515C\u5E95: ${error?.message || error}`);
|
|
4537
4507
|
if (!allowMouseFallback) throw error;
|
|
4538
4508
|
}
|
|
4539
4509
|
}
|
|
@@ -4549,10 +4519,10 @@ var MobileHumanize = {
|
|
|
4549
4519
|
async initializeCursor(page) {
|
|
4550
4520
|
if (initializedPages.has(page)) return;
|
|
4551
4521
|
initializedPages.add(page);
|
|
4552
|
-
|
|
4522
|
+
logger6.debug("initializeCursor: mobile mode uses touch gestures, cursor init skipped");
|
|
4553
4523
|
},
|
|
4554
4524
|
async humanMove(page, target) {
|
|
4555
|
-
|
|
4525
|
+
logger6.debug(`humanMove: mobile no-op target=${typeof target === "string" ? target : "element/coords"}`);
|
|
4556
4526
|
if (typeof target === "string" || target && typeof target.boundingBox === "function") {
|
|
4557
4527
|
const element = await resolveElement(page, target, { throwOnMissing: false });
|
|
4558
4528
|
if (!element) {
|
|
@@ -4571,10 +4541,10 @@ var MobileHumanize = {
|
|
|
4571
4541
|
throwOnMissing = false
|
|
4572
4542
|
} = options;
|
|
4573
4543
|
const targetDesc = describeTarget(target);
|
|
4574
|
-
|
|
4544
|
+
logger6.start("humanScroll", `target=${targetDesc}`);
|
|
4575
4545
|
const element = await resolveElement(page, target, { throwOnMissing });
|
|
4576
4546
|
if (!element) {
|
|
4577
|
-
|
|
4547
|
+
logger6.warn(`humanScroll | \u5143\u7D20\u672A\u627E\u5230: ${targetDesc}`);
|
|
4578
4548
|
return { element: null, didScroll: false, restore: null };
|
|
4579
4549
|
}
|
|
4580
4550
|
const startTime = Date.now();
|
|
@@ -4583,42 +4553,42 @@ var MobileHumanize = {
|
|
|
4583
4553
|
const status = await checkElementVisibility(element);
|
|
4584
4554
|
if (status.code === "VISIBLE") {
|
|
4585
4555
|
if (status.isFixed) {
|
|
4586
|
-
|
|
4556
|
+
logger6.info("humanScroll | fixed/sticky \u5BB9\u5668\u5185\uFF0C\u8DF3\u8FC7\u6EDA\u52A8");
|
|
4587
4557
|
} else {
|
|
4588
|
-
|
|
4558
|
+
logger6.debug("humanScroll | \u5143\u7D20\u53EF\u89C1\u4E14\u65E0\u906E\u6321");
|
|
4589
4559
|
}
|
|
4590
|
-
|
|
4560
|
+
logger6.success("humanScroll", didScroll ? "\u5DF2\u6EDA\u52A8" : "\u65E0\u9700\u6EDA\u52A8");
|
|
4591
4561
|
return { element, didScroll, restore: null };
|
|
4592
4562
|
}
|
|
4593
4563
|
if (status.code === "ZERO_DIMENSIONS" || status.code === "NOT_INTERACTABLE") {
|
|
4594
|
-
|
|
4564
|
+
logger6.warn(`humanScroll | \u5143\u7D20\u4E0D\u53EF\u6EDA\u52A8\u81F3\u53EF\u70B9\u51FB\u72B6\u6001: ${status.reason || status.code}`);
|
|
4595
4565
|
return { element, didScroll, restore: null };
|
|
4596
4566
|
}
|
|
4597
4567
|
const scrollRect = await getScrollableRect(element);
|
|
4598
4568
|
if (!scrollRect && status.isFixed && status.code === "OUT_OF_VIEWPORT") {
|
|
4599
|
-
|
|
4569
|
+
logger6.warn(`humanScroll | fixed/sticky \u76EE\u6807\u4E0D\u5728\u89C6\u53E3\u5185\uFF0C\u9875\u9762\u6EDA\u52A8\u65E0\u6CD5\u6539\u53D8\u5176\u4F4D\u7F6E (direction=${status.direction || "unknown"})`);
|
|
4600
4570
|
return { element, didScroll, restore: null, unscrollable: true };
|
|
4601
4571
|
}
|
|
4602
4572
|
if (!scrollRect && status.isFixed && status.code === "OBSTRUCTED") {
|
|
4603
|
-
|
|
4573
|
+
logger6.warn(`humanScroll | fixed/sticky \u76EE\u6807\u88AB\u906E\u6321\uFF0C\u6EDA\u52A8\u65E0\u6CD5\u89E3\u9664 (${status.obstruction?.tag || "unknown"})`);
|
|
4604
4574
|
return { element, didScroll, restore: null, unscrollable: true };
|
|
4605
4575
|
}
|
|
4606
4576
|
if (scrollRect && status.code === "OBSTRUCTED" && status.obstruction?.isFixed) {
|
|
4607
4577
|
const moved = await scrollAwayFromObstruction(element, status);
|
|
4608
4578
|
if (moved.moved) {
|
|
4609
|
-
|
|
4579
|
+
logger6.debug(`humanScroll | sticky/fixed \u906E\u6321\u8865\u507F\u6EDA\u52A8 top=${Math.round(moved.scrollTop || 0)}`);
|
|
4610
4580
|
await waitJitter(90, 0.3);
|
|
4611
4581
|
didScroll = true;
|
|
4612
4582
|
continue;
|
|
4613
4583
|
}
|
|
4614
4584
|
}
|
|
4615
4585
|
if (Date.now() - startTime > maxDurationMs) {
|
|
4616
|
-
|
|
4586
|
+
logger6.warn(`humanScroll | mobile timeout (${maxDurationMs}ms, status=${status.code}, direction=${status.direction || "unknown"}, fixed=${Boolean(status.isFixed)})`);
|
|
4617
4587
|
return { element, didScroll, restore: null };
|
|
4618
4588
|
}
|
|
4619
4589
|
const stepMin = scrollRect ? Math.min(minStep, Math.max(60, scrollRect.height * 0.4)) : minStep;
|
|
4620
4590
|
const stepMax = scrollRect ? Math.min(maxStep, Math.max(stepMin + 40, scrollRect.height * 0.8)) : maxStep;
|
|
4621
|
-
|
|
4591
|
+
logger6.debug(`humanScroll | \u6B65\u9AA4 ${i + 1}/${maxSteps}: ${status.reason || status.code} ${status.direction ? `(${status.direction})` : ""}`);
|
|
4622
4592
|
const distance = stepMin + Math.random() * Math.max(1, stepMax - stepMin);
|
|
4623
4593
|
let deltaY = status.direction === "up" ? -distance : distance;
|
|
4624
4594
|
if (status.code === "OBSTRUCTED") {
|
|
@@ -4659,7 +4629,7 @@ var MobileHumanize = {
|
|
|
4659
4629
|
const afterWindowState = await page.evaluate(() => ({ x: window.scrollX, y: window.scrollY }));
|
|
4660
4630
|
if (Math.abs(afterWindowState.x - beforeWindowState.x) > 2 || Math.abs(afterWindowState.y - beforeWindowState.y) > 2) {
|
|
4661
4631
|
await page.evaluate((state2) => window.scrollTo(state2.x, state2.y), beforeWindowState);
|
|
4662
|
-
|
|
4632
|
+
logger6.debug(`humanScroll | \u7A97\u53E3\u6EDA\u52A8\u56DE\u6536 from=${Math.round(afterWindowState.y)} to=${Math.round(beforeWindowState.y)}`);
|
|
4663
4633
|
}
|
|
4664
4634
|
}
|
|
4665
4635
|
let afterElementSnapshot = null;
|
|
@@ -4673,7 +4643,7 @@ var MobileHumanize = {
|
|
|
4673
4643
|
const afterSnapshot = await readAfterElementSnapshot();
|
|
4674
4644
|
if (isTargetImmobileAfterScroll(beforeElementSnapshot, afterSnapshot)) {
|
|
4675
4645
|
await restoreWindowFromSnapshot(page, beforeElementSnapshot, afterSnapshot);
|
|
4676
|
-
|
|
4646
|
+
logger6.warn(`humanScroll | \u76EE\u6807\u4E0D\u968F\u9875\u9762\u6EDA\u52A8\u79FB\u52A8\uFF0C\u9875\u9762\u6EDA\u52A8\u65E0\u6CD5\u6539\u53D8\u5176\u4F4D\u7F6E (status=${status.code}, direction=${status.direction || "unknown"})`);
|
|
4677
4647
|
return { element, didScroll, restore: null, unscrollable: true };
|
|
4678
4648
|
}
|
|
4679
4649
|
}
|
|
@@ -4705,12 +4675,12 @@ var MobileHumanize = {
|
|
|
4705
4675
|
const moved = beforeState.kind !== afterState.kind || Math.abs(topDelta) > 2 || Math.abs(leftDelta) > 2;
|
|
4706
4676
|
if (!moved) {
|
|
4707
4677
|
const fallback = await scrollScrollableAncestor(element, deltaY);
|
|
4708
|
-
|
|
4678
|
+
logger6.debug(`humanScroll | \u5BB9\u5668\u89E6\u6478\u65E0\u6548\uFF0C\u76F4\u63A5\u6EDA\u52A8 fallback=${fallback.scroller ? "ancestor" : "window"} top=${Math.round(fallback.scrollTop || 0)}`);
|
|
4709
4679
|
} else if (beforeState.kind === afterState.kind && Math.abs(expectedDelta) > 24 && Math.sign(topDelta || expectedDelta) === Math.sign(expectedDelta) && Math.abs(topDelta) < Math.min(Math.abs(expectedDelta) * 0.45, 96)) {
|
|
4710
4680
|
const residualDelta = expectedDelta - topDelta;
|
|
4711
4681
|
if (Math.sign(residualDelta) === Math.sign(expectedDelta) && Math.abs(residualDelta) > 24) {
|
|
4712
4682
|
const fallback = await scrollScrollableAncestor(element, residualDelta);
|
|
4713
|
-
|
|
4683
|
+
logger6.debug(`humanScroll | \u5BB9\u5668\u89E6\u6478\u8DDD\u79BB\u4E0D\u8DB3\uFF0C\u8865\u507F\u6EDA\u52A8 fallback=${fallback.scroller ? "ancestor" : "window"} top=${Math.round(fallback.scrollTop || 0)}`);
|
|
4714
4684
|
}
|
|
4715
4685
|
}
|
|
4716
4686
|
}
|
|
@@ -4718,7 +4688,7 @@ var MobileHumanize = {
|
|
|
4718
4688
|
const afterSnapshot = await getElementViewportSnapshot(element).catch(() => null);
|
|
4719
4689
|
if (isTargetImmobileAfterScroll(beforeElementSnapshot, afterSnapshot)) {
|
|
4720
4690
|
await restoreWindowFromSnapshot(page, beforeElementSnapshot, afterSnapshot);
|
|
4721
|
-
|
|
4691
|
+
logger6.warn(`humanScroll | \u76EE\u6807\u4E0D\u968F\u6EDA\u52A8\u5BB9\u5668\u79FB\u52A8\uFF0C\u6EDA\u52A8\u65E0\u6CD5\u6539\u53D8\u5176\u4F4D\u7F6E (status=${status.code}, direction=${status.direction || "unknown"})`);
|
|
4722
4692
|
return { element, didScroll, restore: null, unscrollable: true };
|
|
4723
4693
|
}
|
|
4724
4694
|
}
|
|
@@ -4729,14 +4699,14 @@ var MobileHumanize = {
|
|
|
4729
4699
|
await waitJitter(80, 0.3);
|
|
4730
4700
|
const finalStatus = await checkElementVisibility(element);
|
|
4731
4701
|
if (finalStatus.code === "VISIBLE") {
|
|
4732
|
-
|
|
4733
|
-
|
|
4702
|
+
logger6.info("humanScroll | \u539F\u751F scrollIntoViewIfNeeded \u515C\u5E95\u6210\u529F");
|
|
4703
|
+
logger6.success("humanScroll", didScroll ? "\u5DF2\u6EDA\u52A8" : "\u65E0\u9700\u6EDA\u52A8");
|
|
4734
4704
|
return { element, didScroll: true, restore: null };
|
|
4735
4705
|
}
|
|
4736
4706
|
} catch (fallbackError) {
|
|
4737
|
-
|
|
4707
|
+
logger6.debug(`humanScroll | native fallback failed: ${fallbackError?.message || fallbackError}`);
|
|
4738
4708
|
}
|
|
4739
|
-
|
|
4709
|
+
logger6.warn(`humanScroll | \u5728 ${maxSteps} \u6B65\u540E\u65E0\u6CD5\u786E\u4FDD\u53EF\u89C1\u6027`);
|
|
4740
4710
|
return { element, didScroll, restore: null };
|
|
4741
4711
|
},
|
|
4742
4712
|
async humanClick(page, target, options = {}) {
|
|
@@ -4751,7 +4721,7 @@ var MobileHumanize = {
|
|
|
4751
4721
|
fallbackDomClickOnTapError = true
|
|
4752
4722
|
} = options;
|
|
4753
4723
|
const targetDesc = describeTarget(target);
|
|
4754
|
-
|
|
4724
|
+
logger6.start("humanClick", `target=${targetDesc}`);
|
|
4755
4725
|
try {
|
|
4756
4726
|
if (target == null) {
|
|
4757
4727
|
const viewport = resolveViewport(page);
|
|
@@ -4763,12 +4733,12 @@ var MobileHumanize = {
|
|
|
4763
4733
|
timeoutMs: tapTimeoutMs,
|
|
4764
4734
|
mouseFallbackTimeoutMs
|
|
4765
4735
|
});
|
|
4766
|
-
|
|
4736
|
+
logger6.success("humanClick", "Tapped current position");
|
|
4767
4737
|
return true;
|
|
4768
4738
|
}
|
|
4769
4739
|
const element = await resolveElement(page, target, { throwOnMissing });
|
|
4770
4740
|
if (!element) {
|
|
4771
|
-
|
|
4741
|
+
logger6.warn(`humanClick: \u5143\u7D20\u4E0D\u5B58\u5728\uFF0C\u8DF3\u8FC7\u70B9\u51FB ${targetDesc}`);
|
|
4772
4742
|
return false;
|
|
4773
4743
|
}
|
|
4774
4744
|
const scrollResult = scrollIfNeeded ? await MobileHumanize.humanScroll(page, element, { throwOnMissing }) : null;
|
|
@@ -4792,19 +4762,19 @@ var MobileHumanize = {
|
|
|
4792
4762
|
).catch(() => null);
|
|
4793
4763
|
}
|
|
4794
4764
|
if (fallback?.activated) {
|
|
4795
|
-
|
|
4765
|
+
logger6.warn(`humanClick: \u4E0D\u53EF\u6EDA\u52A8\u76EE\u6807\u4E0D\u53EF\u7269\u7406\u70B9\u51FB\uFF0C\u5DF2\u7528 ${fallback.method} \u6FC0\u6D3B`);
|
|
4796
4766
|
return true;
|
|
4797
4767
|
}
|
|
4798
4768
|
}
|
|
4799
4769
|
const message = `\u5143\u7D20\u4E0D\u53EF\u70B9\u51FB: ${status.reason || status.code}`;
|
|
4800
4770
|
if (throwOnMissing) throw new Error(message);
|
|
4801
|
-
|
|
4771
|
+
logger6.warn(`humanClick: ${message}\uFF0C\u8DF3\u8FC7\u70B9\u51FB`);
|
|
4802
4772
|
return false;
|
|
4803
4773
|
}
|
|
4804
4774
|
const box = await element.boundingBox();
|
|
4805
4775
|
if (!box) {
|
|
4806
4776
|
if (throwOnMissing) throw new Error("\u65E0\u6CD5\u83B7\u53D6\u5143\u7D20\u4F4D\u7F6E");
|
|
4807
|
-
|
|
4777
|
+
logger6.warn("humanClick: \u65E0\u6CD5\u83B7\u53D6\u4F4D\u7F6E\uFF0C\u8DF3\u8FC7\u70B9\u51FB");
|
|
4808
4778
|
return false;
|
|
4809
4779
|
}
|
|
4810
4780
|
await waitJitter(reactionDelay, 0.45);
|
|
@@ -4825,13 +4795,13 @@ var MobileHumanize = {
|
|
|
4825
4795
|
"activation fallback"
|
|
4826
4796
|
).catch(() => null);
|
|
4827
4797
|
if (!fallback?.activated) throw tapError;
|
|
4828
|
-
|
|
4798
|
+
logger6.warn(`humanClick: tap \u5931\u8D25\u540E\u5DF2\u7528 ${fallback.method} \u515C\u5E95: ${tapError?.message || tapError}`);
|
|
4829
4799
|
}
|
|
4830
4800
|
await waitJitter(120, 0.35);
|
|
4831
|
-
|
|
4801
|
+
logger6.success("humanClick");
|
|
4832
4802
|
return true;
|
|
4833
4803
|
} catch (error) {
|
|
4834
|
-
|
|
4804
|
+
logger6.fail("humanClick", error);
|
|
4835
4805
|
throw error;
|
|
4836
4806
|
}
|
|
4837
4807
|
},
|
|
@@ -4884,7 +4854,7 @@ var MobileHumanize = {
|
|
|
4884
4854
|
keyboardOptions = {}
|
|
4885
4855
|
} = pressOptions || {};
|
|
4886
4856
|
const targetDesc = hasTarget ? describeTarget(targetOrKey) : "current focus";
|
|
4887
|
-
|
|
4857
|
+
logger6.start("humanPress", `key=${key}, target=${targetDesc}`);
|
|
4888
4858
|
try {
|
|
4889
4859
|
if (hasTarget) {
|
|
4890
4860
|
await MobileHumanize.humanClick(page, targetOrKey, {
|
|
@@ -4898,10 +4868,10 @@ var MobileHumanize = {
|
|
|
4898
4868
|
...keyboardOptions,
|
|
4899
4869
|
delay: jitterMs(holdDelay, 0.5)
|
|
4900
4870
|
});
|
|
4901
|
-
|
|
4871
|
+
logger6.success("humanPress");
|
|
4902
4872
|
return true;
|
|
4903
4873
|
} catch (error) {
|
|
4904
|
-
|
|
4874
|
+
logger6.fail("humanPress", error);
|
|
4905
4875
|
throw error;
|
|
4906
4876
|
}
|
|
4907
4877
|
},
|
|
@@ -4938,7 +4908,20 @@ var MobileHumanize = {
|
|
|
4938
4908
|
const durationMs = jitterMs(baseDuration, 0.4);
|
|
4939
4909
|
const startTime = Date.now();
|
|
4940
4910
|
while (Date.now() - startTime < durationMs) {
|
|
4941
|
-
|
|
4911
|
+
const action = Math.random();
|
|
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
|
+
}
|
|
4942
4925
|
}
|
|
4943
4926
|
},
|
|
4944
4927
|
async naturalScroll(page, direction = "down", distance = 300, baseSteps = 5) {
|
|
@@ -5047,7 +5030,7 @@ import { FingerprintInjector } from "fingerprint-injector";
|
|
|
5047
5030
|
import { chromium as defaultChromiumLauncher } from "playwright";
|
|
5048
5031
|
|
|
5049
5032
|
// src/proxy-bypass.js
|
|
5050
|
-
import
|
|
5033
|
+
import picomatch from "picomatch";
|
|
5051
5034
|
var normalizeByPassDomains = (domains) => {
|
|
5052
5035
|
if (!Array.isArray(domains)) return [];
|
|
5053
5036
|
return domains.map((item) => String(item || "").trim()).filter(Boolean);
|
|
@@ -5058,7 +5041,7 @@ var buildByPassDomainRule = (rawPattern) => {
|
|
|
5058
5041
|
if (!pattern) return null;
|
|
5059
5042
|
let matcher;
|
|
5060
5043
|
try {
|
|
5061
|
-
matcher =
|
|
5044
|
+
matcher = picomatch(pattern, { nocase: true });
|
|
5062
5045
|
} catch {
|
|
5063
5046
|
return null;
|
|
5064
5047
|
}
|
|
@@ -5127,7 +5110,7 @@ var ByPass = {
|
|
|
5127
5110
|
};
|
|
5128
5111
|
|
|
5129
5112
|
// src/internals/launch/traffic.js
|
|
5130
|
-
var
|
|
5113
|
+
var logger7 = createInternalLogger("Launch");
|
|
5131
5114
|
var normalizeObject = (value) => {
|
|
5132
5115
|
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
5133
5116
|
return {};
|
|
@@ -5176,7 +5159,7 @@ var logLaunchTraffic = ({
|
|
|
5176
5159
|
} = {}) => {
|
|
5177
5160
|
if (!enabled) return;
|
|
5178
5161
|
if (explicitProxy) {
|
|
5179
|
-
|
|
5162
|
+
logger7.info("[\u4EE3\u7406\u5DF2\u542F\u7528] \u4F7F\u7528\u663E\u5F0F proxy \u914D\u7F6E\uFF0C\u8DF3\u8FC7 toolkit \u672C\u5730\u6D41\u91CF\u89C2\u6D4B");
|
|
5180
5163
|
return;
|
|
5181
5164
|
}
|
|
5182
5165
|
if (launchProxy) {
|
|
@@ -5186,18 +5169,18 @@ var logLaunchTraffic = ({
|
|
|
5186
5169
|
upstreamLabel = `${parsedProxyUrl.protocol}//${parsedProxyUrl.host}`;
|
|
5187
5170
|
} catch {
|
|
5188
5171
|
}
|
|
5189
|
-
|
|
5172
|
+
logger7.info(
|
|
5190
5173
|
`[\u4EE3\u7406\u5DF2\u542F\u7528] \u672C\u5730=${launchProxy.server} \u4E0A\u6E38=${upstreamLabel || "-"} \u76F4\u8FDE\u57DF\u540D=${byPassDomains.join(",")}`
|
|
5191
5174
|
);
|
|
5192
|
-
|
|
5175
|
+
logger7.info(`[\u6D41\u91CF\u89C2\u6D4B] \u9010\u8BF7\u6C42\u8C03\u8BD5=${Boolean(debugMode) ? "\u5F00\u542F" : "\u5173\u95ED"}\uFF08\u6C47\u603B\u59CB\u7EC8\u5F00\u542F\uFF09`);
|
|
5193
5176
|
return;
|
|
5194
5177
|
}
|
|
5195
5178
|
if (enableProxy) {
|
|
5196
|
-
|
|
5179
|
+
logger7.info("[\u4EE3\u7406\u672A\u542F\u7528] enable_proxy=true \u4F46 proxy_url \u4E3A\u7A7A");
|
|
5197
5180
|
} else if (proxyUrl) {
|
|
5198
|
-
|
|
5181
|
+
logger7.info("[\u4EE3\u7406\u672A\u542F\u7528] enable_proxy=false \u4E14 proxy_url \u5DF2\u914D\u7F6E");
|
|
5199
5182
|
}
|
|
5200
|
-
|
|
5183
|
+
logger7.info(`[\u6D41\u91CF\u89C2\u6D4B] \u9010\u8BF7\u6C42\u8C03\u8BD5=${Boolean(debugMode) ? "\u5F00\u542F" : "\u5173\u95ED"}\uFF08\u6C47\u603B\u59CB\u7EC8\u5F00\u542F\uFF09`);
|
|
5201
5184
|
};
|
|
5202
5185
|
var createLaunchTrafficHook = ({
|
|
5203
5186
|
byPassDomains = [],
|
|
@@ -5220,13 +5203,13 @@ var createLaunchTrafficHook = ({
|
|
|
5220
5203
|
}
|
|
5221
5204
|
if (!enabled || byPassDomains.length === 0) return;
|
|
5222
5205
|
if (!matched || !matched.rule) return;
|
|
5223
|
-
|
|
5206
|
+
logger7.info(`[\u76F4\u8FDE\u547D\u4E2D] \u89C4\u5219=${matched.rule.pattern} \u57DF\u540D=${matched.hostname} \u8D44\u6E90\u7C7B\u578B=${resourceType} \u65B9\u6CD5=${req.method()} \u5730\u5740=${requestUrl}`);
|
|
5224
5207
|
});
|
|
5225
5208
|
};
|
|
5226
5209
|
};
|
|
5227
5210
|
|
|
5228
5211
|
// src/internals/launch/default.js
|
|
5229
|
-
var
|
|
5212
|
+
var logger8 = createInternalLogger("Launch");
|
|
5230
5213
|
var injectedContexts = /* @__PURE__ */ new WeakSet();
|
|
5231
5214
|
var browserMajorVersionCache = /* @__PURE__ */ new Map();
|
|
5232
5215
|
var DEFAULT_BROWSER_PROFILE_SCHEMA_VERSION = 1;
|
|
@@ -5267,7 +5250,7 @@ var detectBrowserMajorVersion = (launcher) => {
|
|
|
5267
5250
|
});
|
|
5268
5251
|
detectedVersion = parseChromeMajorVersion(rawVersion);
|
|
5269
5252
|
} catch (error) {
|
|
5270
|
-
|
|
5253
|
+
logger8.warn(`\u8BFB\u53D6\u6D4F\u89C8\u5668\u7248\u672C\u5931\u8D25: ${error?.message || error}`);
|
|
5271
5254
|
}
|
|
5272
5255
|
browserMajorVersionCache.set(executablePath, detectedVersion);
|
|
5273
5256
|
return detectedVersion;
|
|
@@ -5304,7 +5287,7 @@ var generateFingerprintForCore = ({ locale, browserMajorVersion, device }) => {
|
|
|
5304
5287
|
if (requestedBrowserMajorVersion <= 0) {
|
|
5305
5288
|
throw error;
|
|
5306
5289
|
}
|
|
5307
|
-
|
|
5290
|
+
logger8.warn(
|
|
5308
5291
|
`\u5F53\u524D\u6D4F\u89C8\u5668\u5927\u7248\u672C ${requestedBrowserMajorVersion} \u65E0\u53EF\u7528 strict \u6307\u7EB9\u6837\u672C\uFF0C\u9000\u56DE\u4E0D\u7ED1\u5B9A\u5927\u7248\u672C\u751F\u6210: ${error?.message || error}`
|
|
5309
5292
|
);
|
|
5310
5293
|
}
|
|
@@ -5350,7 +5333,7 @@ var buildReplayableBrowserProfile = (runtimeState, launcher) => {
|
|
|
5350
5333
|
schema_version: DEFAULT_BROWSER_PROFILE_SCHEMA_VERSION
|
|
5351
5334
|
};
|
|
5352
5335
|
nextState = RuntimeEnv.setBrowserProfileCore(nextState, browserProfileCore);
|
|
5353
|
-
|
|
5336
|
+
logger8.info(
|
|
5354
5337
|
`\u5DF2\u751F\u6210\u6D4F\u89C8\u5668\u6307\u7EB9\u771F\u6E90 | env=${String(nextState.envId || "-")} | device=${device} | version=${browserProfileCore.browser_major_version || "-"} | fingerprintVersion=${fingerprintBrowserMajorVersion || "-"} | exactVersion=${generated.exactBrowserMajorVersion ? "true" : "false"} | timezone=${timezoneId}`
|
|
5355
5338
|
);
|
|
5356
5339
|
return { runtimeState: nextState, browserProfileCore };
|
|
@@ -5537,7 +5520,7 @@ var DefaultLaunch = {
|
|
|
5537
5520
|
import { execFile } from "node:child_process";
|
|
5538
5521
|
import { randomInt } from "node:crypto";
|
|
5539
5522
|
import { promisify } from "node:util";
|
|
5540
|
-
var
|
|
5523
|
+
var logger9 = createInternalLogger("Launch");
|
|
5541
5524
|
var execFileAsync = promisify(execFile);
|
|
5542
5525
|
var DEFAULT_CLOAK_CRAWLER_BASE_OPTIONS = Object.freeze({
|
|
5543
5526
|
maxConcurrency: 1,
|
|
@@ -5743,7 +5726,7 @@ var resolveReplayableCloakProfile = (runtimeState, { fingerprintPlatform = "", c
|
|
|
5743
5726
|
const nextCoreRaw = JSON.stringify(nextBrowserProfileCore);
|
|
5744
5727
|
if (currentCoreRaw !== nextCoreRaw) {
|
|
5745
5728
|
nextState = RuntimeEnv.setBrowserProfileCore(nextState, nextBrowserProfileCore);
|
|
5746
|
-
|
|
5729
|
+
logger9.info(
|
|
5747
5730
|
`\u5DF2\u540C\u6B65 Cloak \u6307\u7EB9\u771F\u6E90 | env=${String(nextState.envId || "-")} | seed=${fingerprintSeed} | platform=${resolvedFingerprintPlatform} | timezone=${timezone || "-"} | locale=${locale || "-"}`
|
|
5748
5731
|
);
|
|
5749
5732
|
}
|
|
@@ -5830,7 +5813,7 @@ var forceTerminateBrowsersByFingerprintArg = async (fingerprintArg) => {
|
|
|
5830
5813
|
if (error?.code === 1 || error?.code === "ENOENT") {
|
|
5831
5814
|
return;
|
|
5832
5815
|
}
|
|
5833
|
-
|
|
5816
|
+
logger9.info(`\u5F3A\u5236\u5173\u95ED Cloak \u8FDB\u7A0B\u5931\u8D25\uFF08\u5FFD\u7565\uFF09: ${error?.message || String(error)}`);
|
|
5834
5817
|
});
|
|
5835
5818
|
};
|
|
5836
5819
|
var CloakLaunch = {
|
|
@@ -5990,7 +5973,7 @@ var Launch = withModeReflect("Launch", launchStrategies);
|
|
|
5990
5973
|
// src/live-view.js
|
|
5991
5974
|
import express from "express";
|
|
5992
5975
|
import { Actor } from "apify";
|
|
5993
|
-
var
|
|
5976
|
+
var logger10 = createInternalLogger("LiveView");
|
|
5994
5977
|
async function startLiveViewServer(liveViewKey) {
|
|
5995
5978
|
const app = express();
|
|
5996
5979
|
app.get("/", async (req, res) => {
|
|
@@ -6015,13 +5998,13 @@ async function startLiveViewServer(liveViewKey) {
|
|
|
6015
5998
|
</html>
|
|
6016
5999
|
`);
|
|
6017
6000
|
} catch (error) {
|
|
6018
|
-
|
|
6001
|
+
logger10.fail("Live View Server", error);
|
|
6019
6002
|
res.status(500).send(`\u65E0\u6CD5\u52A0\u8F7D\u5C4F\u5E55\u622A\u56FE: ${error.message}`);
|
|
6020
6003
|
}
|
|
6021
6004
|
});
|
|
6022
6005
|
const port = process.env.APIFY_CONTAINER_PORT || 4321;
|
|
6023
6006
|
app.listen(port, () => {
|
|
6024
|
-
|
|
6007
|
+
logger10.success("startLiveViewServer", `\u76D1\u542C\u7AEF\u53E3 ${port}`);
|
|
6025
6008
|
});
|
|
6026
6009
|
}
|
|
6027
6010
|
async function takeLiveScreenshot(liveViewKey, page, logMessage) {
|
|
@@ -6029,10 +6012,10 @@ async function takeLiveScreenshot(liveViewKey, page, logMessage) {
|
|
|
6029
6012
|
const buffer = await capturePageScreenshot(page, { type: "png" });
|
|
6030
6013
|
await Actor.setValue(liveViewKey, buffer, { contentType: "image/png" });
|
|
6031
6014
|
if (logMessage) {
|
|
6032
|
-
|
|
6015
|
+
logger10.info(`(\u622A\u56FE): ${logMessage}`);
|
|
6033
6016
|
}
|
|
6034
6017
|
} catch (e) {
|
|
6035
|
-
|
|
6018
|
+
logger10.warn(`\u65E0\u6CD5\u6355\u83B7 Live View \u5C4F\u5E55\u622A\u56FE: ${e.message}`);
|
|
6036
6019
|
}
|
|
6037
6020
|
}
|
|
6038
6021
|
var useLiveView = (liveViewKey = PresetOfLiveViewKey) => {
|
|
@@ -6138,7 +6121,7 @@ var dragCaptchaAction = async (page, sourceLocator, targetLocator, options = {})
|
|
|
6138
6121
|
};
|
|
6139
6122
|
|
|
6140
6123
|
// src/internals/captcha/bytedance.js
|
|
6141
|
-
var
|
|
6124
|
+
var logger11 = createInternalLogger("Captcha");
|
|
6142
6125
|
var DEFAULT_BYTEDANCE_CAPTCHA_OPTIONS = Object.freeze({
|
|
6143
6126
|
apiType: "31234",
|
|
6144
6127
|
maxRetries: 3,
|
|
@@ -6270,7 +6253,7 @@ var collectCaptchaDebugInfo = async (page, frame, iframeLocator, attempt, phase,
|
|
|
6270
6253
|
}
|
|
6271
6254
|
await writeFile(infoPath, JSON.stringify(payload, null, 2), "utf8");
|
|
6272
6255
|
}
|
|
6273
|
-
|
|
6256
|
+
logger11.info(`\u5DF2\u5199\u51FA\u9A8C\u8BC1\u7801\u8C03\u8BD5\u4EA7\u7269\uFF1A${debugDir}`);
|
|
6274
6257
|
};
|
|
6275
6258
|
var maybeCollectCaptchaDebugInfo = async (page, frame, iframeLocator, attempt, phase, options, extra = null) => {
|
|
6276
6259
|
if (!options.debugArtifacts) {
|
|
@@ -6307,14 +6290,14 @@ var getVerifycenterCaptchaContext = async (page, options) => {
|
|
|
6307
6290
|
if (!isContainerVisible) {
|
|
6308
6291
|
return null;
|
|
6309
6292
|
}
|
|
6310
|
-
|
|
6293
|
+
logger11.info("\u68C0\u6D4B\u5230\u9A8C\u8BC1\u7801\u5BB9\u5668\uFF0C\u5F00\u59CB\u7B49\u5F85 iframe \u52A0\u8F7D\u3002");
|
|
6311
6294
|
let iframeLocator = page.locator(options.iframeSelector).first();
|
|
6312
6295
|
let isIframeVisible = await waitForVisible(
|
|
6313
6296
|
iframeLocator,
|
|
6314
6297
|
options.iframeVisibleTimeoutMs
|
|
6315
6298
|
);
|
|
6316
6299
|
if (!isIframeVisible) {
|
|
6317
|
-
|
|
6300
|
+
logger11.warn("\u672A\u5728\u9884\u671F\u9009\u62E9\u5668\u4E2D\u627E\u5230 verifycenter iframe\uFF0C\u5C1D\u8BD5\u5BB9\u5668\u5185\u4EFB\u610F iframe\u3002");
|
|
6318
6301
|
iframeLocator = captchaContainer.locator(options.iframeFallbackSelector).first();
|
|
6319
6302
|
isIframeVisible = await waitForVisible(
|
|
6320
6303
|
iframeLocator,
|
|
@@ -6324,7 +6307,7 @@ var getVerifycenterCaptchaContext = async (page, options) => {
|
|
|
6324
6307
|
if (!isIframeVisible) {
|
|
6325
6308
|
throw new Error("verifycenter iframe not found inside captcha container.");
|
|
6326
6309
|
}
|
|
6327
|
-
|
|
6310
|
+
logger11.info("\u9A8C\u8BC1\u7801 iframe \u5DF2\u53EF\u89C1\uFF0C\u5F00\u59CB\u89E3\u6790\u5185\u5BB9 frame\u3002");
|
|
6328
6311
|
const frame = await resolveContentFrame(page, iframeLocator, options);
|
|
6329
6312
|
if (!frame) {
|
|
6330
6313
|
throw new Error("Failed to resolve verifycenter iframe content frame.");
|
|
@@ -6440,11 +6423,11 @@ var refreshCaptcha = async (page, frame, options) => {
|
|
|
6440
6423
|
const clicked = await clickCaptchaAction(frame, options.refreshTexts, {
|
|
6441
6424
|
...options,
|
|
6442
6425
|
page,
|
|
6443
|
-
logger:
|
|
6426
|
+
logger: logger11,
|
|
6444
6427
|
forceMouse: true
|
|
6445
6428
|
}).catch(() => false);
|
|
6446
6429
|
if (!clicked) {
|
|
6447
|
-
|
|
6430
|
+
logger11.warn("Refresh button not found.");
|
|
6448
6431
|
return false;
|
|
6449
6432
|
}
|
|
6450
6433
|
await page.waitForTimeout(options.refreshWaitMs);
|
|
@@ -6475,24 +6458,24 @@ var waitForCaptchaChallengeReady = async (page, frame, options) => {
|
|
|
6475
6458
|
const hasGuideMaskVisible = options.guideMaskSelector ? await frame.locator(options.guideMaskSelector).first().isVisible({ timeout: options.loadingIndicatorVisibleTimeoutMs }).catch(() => false) : false;
|
|
6476
6459
|
hasSeenGuideMask = hasSeenGuideMask || hasGuideMaskVisible;
|
|
6477
6460
|
if (hasGuideMaskVisible && !hasLoggedGuideMask) {
|
|
6478
|
-
|
|
6461
|
+
logger11.info("\u68C0\u6D4B\u5230\u9A8C\u8BC1\u7801\u64CD\u4F5C\u5F15\u5BFC\u5C42\uFF0C\u7B49\u5F85\u5176\u6D88\u5931\u540E\u518D\u5F00\u59CB\u8BC6\u522B\u3002");
|
|
6479
6462
|
hasLoggedGuideMask = true;
|
|
6480
6463
|
}
|
|
6481
6464
|
if (!isLoadingVisible && hasVisibleSourceImage && hasVisibleDropTarget && !hasGuideMaskVisible) {
|
|
6482
|
-
|
|
6465
|
+
logger11.info(
|
|
6483
6466
|
hasSeenGuideMask ? "\u9A8C\u8BC1\u7801\u56FE\u7247\u548C\u62D6\u62FD\u533A\u57DF\u5DF2\u5C31\u7EEA\uFF0C\u5F15\u5BFC\u5C42\u5DF2\u6D88\u5931\u3002" : hasSeenLoading ? "\u9A8C\u8BC1\u7801\u56FE\u7247\u5DF2\u52A0\u8F7D\u5B8C\u6210\u3002" : "\u9A8C\u8BC1\u7801\u56FE\u7247\u5DF2\u5C31\u7EEA\u3002"
|
|
6484
6467
|
);
|
|
6485
6468
|
return;
|
|
6486
6469
|
}
|
|
6487
6470
|
if (hasErrorTextVisible) {
|
|
6488
|
-
|
|
6471
|
+
logger11.warn("\u9A8C\u8BC1\u7801\u9762\u677F\u51FA\u73B0\u7F51\u7EDC\u5F02\u5E38\u6587\u6848\uFF0C\u5C1D\u8BD5\u7ACB\u5373\u5237\u65B0\u9898\u76EE\u3002");
|
|
6489
6472
|
await refreshCaptcha(page, frame, options);
|
|
6490
6473
|
refreshDeadline = Date.now() + options.challengeReadyRefreshTimeoutMs;
|
|
6491
6474
|
hasSeenLoading = false;
|
|
6492
6475
|
continue;
|
|
6493
6476
|
}
|
|
6494
6477
|
if ((!hasVisibleSourceImage || !hasVisibleDropTarget) && Date.now() >= refreshDeadline) {
|
|
6495
|
-
|
|
6478
|
+
logger11.warn(`\u9A8C\u8BC1\u7801\u9898\u76EE\u8D85\u8FC7 ${options.challengeReadyRefreshTimeoutMs}ms \u4ECD\u672A\u51C6\u5907\u597D\uFF0C\u5C1D\u8BD5\u5237\u65B0\u9898\u76EE\u3002`);
|
|
6496
6479
|
await refreshCaptcha(page, frame, options);
|
|
6497
6480
|
refreshDeadline = Date.now() + options.challengeReadyRefreshTimeoutMs;
|
|
6498
6481
|
hasSeenLoading = false;
|
|
@@ -6540,7 +6523,7 @@ var dragPromptCaptchaImage = async (page, frame, iframeLocator, sourceLocator, d
|
|
|
6540
6523
|
accepted
|
|
6541
6524
|
};
|
|
6542
6525
|
dragAttempts.push(attemptInfo);
|
|
6543
|
-
|
|
6526
|
+
logger11.info(
|
|
6544
6527
|
`\u9A8C\u8BC1\u7801\u62D6\u62FD\u7B2C ${visualIndex + 1} \u5F20\uFF0C\u65B9\u6848 ${plan.name}\uFF0Cbadge ${baselineState.badgeCount} -> ${afterState.badgeCount}\uFF0Cselected ${baselineState.selectedCount} -> ${afterState.selectedCount}`
|
|
6545
6528
|
);
|
|
6546
6529
|
if (accepted) {
|
|
@@ -6558,7 +6541,7 @@ var dragPromptCaptchaImage = async (page, frame, iframeLocator, sourceLocator, d
|
|
|
6558
6541
|
dragAttempts,
|
|
6559
6542
|
finalState: await readPromptCaptchaState(frame, options)
|
|
6560
6543
|
}).catch((error) => {
|
|
6561
|
-
|
|
6544
|
+
logger11.warn(`\u9A8C\u8BC1\u7801\u62D6\u62FD\u5931\u8D25\u8C03\u8BD5\u6293\u53D6\u5931\u8D25\uFF1A${error?.message || error}`);
|
|
6562
6545
|
});
|
|
6563
6546
|
return {
|
|
6564
6547
|
accepted: false,
|
|
@@ -6575,16 +6558,16 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
|
|
|
6575
6558
|
...options
|
|
6576
6559
|
};
|
|
6577
6560
|
if (!config.token) {
|
|
6578
|
-
|
|
6561
|
+
logger11.warn("\u7F3A\u5C11\u9A8C\u8BC1\u7801 token\uFF0C\u8DF3\u8FC7\u81EA\u52A8\u8BC6\u522B\u3002");
|
|
6579
6562
|
return false;
|
|
6580
6563
|
}
|
|
6581
|
-
|
|
6564
|
+
logger11.info("\u5F53\u524D\u4F7F\u7528\u672Ctool\u2014\u2014\u6D4B\u8BD5\u7248\u672C");
|
|
6582
6565
|
for (let attempt = 1; attempt <= config.maxRetries; attempt += 1) {
|
|
6583
|
-
|
|
6566
|
+
logger11.info(`\u5F00\u59CB\u7B2C ${attempt}/${config.maxRetries} \u6B21 verifycenter \u9A8C\u8BC1\u7801\u8BC6\u522B\u3002`);
|
|
6584
6567
|
try {
|
|
6585
6568
|
const captchaContext = await getVerifycenterCaptchaContext(page, config);
|
|
6586
6569
|
if (!captchaContext) {
|
|
6587
|
-
|
|
6570
|
+
logger11.info("Captcha container is not visible anymore.");
|
|
6588
6571
|
return true;
|
|
6589
6572
|
}
|
|
6590
6573
|
const { iframeLocator, frame } = captchaContext;
|
|
@@ -6597,7 +6580,7 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
|
|
|
6597
6580
|
"ready",
|
|
6598
6581
|
config
|
|
6599
6582
|
).catch((error) => {
|
|
6600
|
-
|
|
6583
|
+
logger11.warn(`\u9A8C\u8BC1\u7801\u8C03\u8BD5\u6293\u53D6\u5931\u8D25\uFF1A${error?.message || error}`);
|
|
6601
6584
|
});
|
|
6602
6585
|
await page.waitForTimeout(config.recognitionDelayMs);
|
|
6603
6586
|
const screenshotBuffer = await iframeLocator.screenshot();
|
|
@@ -6609,16 +6592,16 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
|
|
|
6609
6592
|
});
|
|
6610
6593
|
const serialNumbers = extractCaptchaSerialNumbers(apiResponse);
|
|
6611
6594
|
if (apiResponse?.code !== config.recognitionSuccessCode || serialNumbers.length === 0) {
|
|
6612
|
-
|
|
6595
|
+
logger11.warn(
|
|
6613
6596
|
`\u9A8C\u8BC1\u7801\u8BC6\u522B\u5931\u8D25\u3002code=${apiResponse?.code}, msg=${apiResponse?.msg || "unknown"}`
|
|
6614
6597
|
);
|
|
6615
6598
|
await refreshCaptcha(page, frame, config);
|
|
6616
6599
|
continue;
|
|
6617
6600
|
}
|
|
6618
|
-
|
|
6601
|
+
logger11.info(`\u9A8C\u8BC1\u7801\u8BC6\u522B\u6210\u529F\uFF0C\u5E8F\u53F7\uFF1A${serialNumbers.join(", ")}`);
|
|
6619
6602
|
const dropTarget = await findCaptchaDropTarget(frame, config);
|
|
6620
6603
|
if (!dropTarget) {
|
|
6621
|
-
|
|
6604
|
+
logger11.warn("\u672A\u627E\u5230\u9A8C\u8BC1\u7801\u62D6\u62FD\u76EE\u6807\u533A\u57DF\u3002");
|
|
6622
6605
|
await refreshCaptcha(page, frame, config);
|
|
6623
6606
|
continue;
|
|
6624
6607
|
}
|
|
@@ -6629,7 +6612,7 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
|
|
|
6629
6612
|
`Captcha image indexes could not be normalized. raw=${serialNumbers.join(", ")}, count=${orderedSourceImages.length}`
|
|
6630
6613
|
);
|
|
6631
6614
|
}
|
|
6632
|
-
|
|
6615
|
+
logger11.info(`\u9A8C\u8BC1\u7801\u89C6\u89C9\u4F4D\u5E8F\u6620\u5C04\uFF1A${normalizedIndexes.map((index) => index + 1).join(", ")}`);
|
|
6633
6616
|
for (const imageIndex of normalizedIndexes) {
|
|
6634
6617
|
if (imageIndex < 0 || imageIndex >= orderedSourceImages.length) {
|
|
6635
6618
|
throw new Error(
|
|
@@ -6661,52 +6644,52 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
|
|
|
6661
6644
|
}
|
|
6662
6645
|
}
|
|
6663
6646
|
const beforeSubmitState = await readPromptCaptchaState(frame, config);
|
|
6664
|
-
|
|
6647
|
+
logger11.info(
|
|
6665
6648
|
`\u63D0\u4EA4\u524D\u9A8C\u8BC1\u7801\u72B6\u6001\uFF1Abadge=${beforeSubmitState.badgeCount}, selected=${beforeSubmitState.selectedCount}, submitDisabled=${beforeSubmitState.submitDisabled}`
|
|
6666
6649
|
);
|
|
6667
6650
|
const submitted = await clickCaptchaAction(frame, config.submitTexts, {
|
|
6668
6651
|
...config,
|
|
6669
6652
|
page,
|
|
6670
|
-
logger:
|
|
6653
|
+
logger: logger11,
|
|
6671
6654
|
forceMouse: true,
|
|
6672
6655
|
actionVisibleTimeoutMs: config.submitReadyTimeoutMs
|
|
6673
6656
|
}).catch(() => false);
|
|
6674
6657
|
if (!submitted) {
|
|
6675
|
-
|
|
6658
|
+
logger11.warn("\u672A\u627E\u5230\u63D0\u4EA4\u6309\u94AE\uFF0C\u53EF\u80FD\u4F1A\u81EA\u52A8\u63D0\u4EA4\u3002");
|
|
6676
6659
|
}
|
|
6677
6660
|
await page.waitForTimeout(config.submitWaitMs);
|
|
6678
6661
|
const afterSubmitState = await readPromptCaptchaState(frame, config);
|
|
6679
|
-
|
|
6662
|
+
logger11.info(
|
|
6680
6663
|
`\u63D0\u4EA4\u540E\u9A8C\u8BC1\u7801\u72B6\u6001\uFF1Abadge=${afterSubmitState.badgeCount}, selected=${afterSubmitState.selectedCount}, submitDisabled=${afterSubmitState.submitDisabled}`
|
|
6681
6664
|
);
|
|
6682
6665
|
const stillVisible = await iframeLocator.isVisible({ timeout: config.containerVisibleTimeoutMs }).catch(() => false);
|
|
6683
6666
|
if (!stillVisible) {
|
|
6684
|
-
|
|
6667
|
+
logger11.info("\u9A8C\u8BC1\u7801\u8BC6\u522B\u5E76\u63D0\u4EA4\u6210\u529F\u3002");
|
|
6685
6668
|
return true;
|
|
6686
6669
|
}
|
|
6687
6670
|
await maybeCollectCaptchaDebugInfo(page, frame, iframeLocator, attempt, "submit-still-visible", config, {
|
|
6688
6671
|
beforeSubmitState,
|
|
6689
6672
|
afterSubmitState
|
|
6690
6673
|
}).catch((error) => {
|
|
6691
|
-
|
|
6674
|
+
logger11.warn(`\u63D0\u4EA4\u540E\u9A8C\u8BC1\u7801\u8C03\u8BD5\u6293\u53D6\u5931\u8D25\uFF1A${error?.message || error}`);
|
|
6692
6675
|
});
|
|
6693
|
-
|
|
6676
|
+
logger11.warn("\u63D0\u4EA4\u540E\u9A8C\u8BC1\u7801 iframe \u4ECD\u7136\u53EF\u89C1\uFF0C\u51C6\u5907\u5237\u65B0\u540E\u91CD\u8BD5\u3002");
|
|
6694
6677
|
await page.waitForTimeout(2e3);
|
|
6695
6678
|
await refreshCaptcha(page, frame, config);
|
|
6696
6679
|
} catch (error) {
|
|
6697
|
-
|
|
6680
|
+
logger11.error(`\u7B2C ${attempt}/${config.maxRetries} \u6B21\u9A8C\u8BC1\u7801\u8BC6\u522B\u5931\u8D25\uFF1A${error?.message || error}`);
|
|
6698
6681
|
}
|
|
6699
6682
|
if (attempt < config.maxRetries) {
|
|
6700
6683
|
await page.waitForTimeout(config.retryDelayBaseMs + attempt * config.retryDelayStepMs);
|
|
6701
6684
|
}
|
|
6702
6685
|
}
|
|
6703
|
-
|
|
6686
|
+
logger11.error(`\u91CD\u8BD5 ${config.maxRetries} \u6B21\u540E\uFF0C\u9A8C\u8BC1\u7801\u4ECD\u672A\u8BC6\u522B\u6210\u529F\u3002`);
|
|
6704
6687
|
return false;
|
|
6705
6688
|
}
|
|
6706
6689
|
var sloveCaptcha = solveCaptcha;
|
|
6707
6690
|
|
|
6708
6691
|
// src/chaptcha.js
|
|
6709
|
-
var
|
|
6692
|
+
var logger12 = createInternalLogger("Captcha");
|
|
6710
6693
|
var DOM_MONITOR_WAIT_TIMEOUT_MS = 1e3;
|
|
6711
6694
|
var DOM_MONITOR_POST_DETECT_HIDDEN_WAIT_MS = 300;
|
|
6712
6695
|
var DOM_MONITOR_RECOVERY_WAIT_MS = 100;
|
|
@@ -6781,7 +6764,7 @@ function useCaptchaMonitor(page, options) {
|
|
|
6781
6764
|
await sleep(DOM_MONITOR_RECOVERY_WAIT_MS);
|
|
6782
6765
|
continue;
|
|
6783
6766
|
}
|
|
6784
|
-
|
|
6767
|
+
logger12.warning(
|
|
6785
6768
|
"useCaptchaMonitor",
|
|
6786
6769
|
`DOM \u76D1\u63A7\u51FA\u73B0\u5F02\u5E38\uFF08\u7EE7\u7EED\u91CD\u8BD5\uFF09: selector=${domSelector}, error=${getErrorMessage(error)}`
|
|
6787
6770
|
);
|
|
@@ -6789,7 +6772,7 @@ function useCaptchaMonitor(page, options) {
|
|
|
6789
6772
|
}
|
|
6790
6773
|
}
|
|
6791
6774
|
})();
|
|
6792
|
-
|
|
6775
|
+
logger12.success("useCaptchaMonitor", `DOM \u76D1\u63A7\u5DF2\u542F\u7528\uFF1A${domSelector}`);
|
|
6793
6776
|
cleanupFns.push(async () => {
|
|
6794
6777
|
await domMonitorTask?.catch(() => {
|
|
6795
6778
|
});
|
|
@@ -6806,7 +6789,7 @@ function useCaptchaMonitor(page, options) {
|
|
|
6806
6789
|
}
|
|
6807
6790
|
};
|
|
6808
6791
|
page.on("framenavigated", frameHandler);
|
|
6809
|
-
|
|
6792
|
+
logger12.success("useCaptchaMonitor", `URL \u76D1\u63A7\u5DF2\u542F\u7528\uFF1A${urlPattern}`);
|
|
6810
6793
|
Promise.resolve().then(async () => {
|
|
6811
6794
|
if (!isStopped && page.url().includes(urlPattern)) {
|
|
6812
6795
|
await triggerDetected();
|
|
@@ -6819,7 +6802,7 @@ function useCaptchaMonitor(page, options) {
|
|
|
6819
6802
|
}
|
|
6820
6803
|
return {
|
|
6821
6804
|
stop: async () => {
|
|
6822
|
-
|
|
6805
|
+
logger12.info("\u6B63\u5728\u505C\u6B62\u9A8C\u8BC1\u7801\u76D1\u63A7...");
|
|
6823
6806
|
isStopped = true;
|
|
6824
6807
|
for (const fn of cleanupFns) {
|
|
6825
6808
|
await fn();
|
|
@@ -6858,7 +6841,7 @@ async function solveCaptchaWithStrategy(strategyName, page, options = {}) {
|
|
|
6858
6841
|
);
|
|
6859
6842
|
return strategy.sloveCaptcha(page, resolvedOptions, {
|
|
6860
6843
|
callCaptchaRecognitionApi,
|
|
6861
|
-
logger:
|
|
6844
|
+
logger: logger12
|
|
6862
6845
|
});
|
|
6863
6846
|
}
|
|
6864
6847
|
var Captcha = {
|
|
@@ -6869,7 +6852,7 @@ var Captcha = {
|
|
|
6869
6852
|
// src/mutation.js
|
|
6870
6853
|
import { createHash } from "node:crypto";
|
|
6871
6854
|
import { v4 as uuidv4 } from "uuid";
|
|
6872
|
-
var
|
|
6855
|
+
var logger13 = createInternalLogger("Mutation");
|
|
6873
6856
|
var MUTATION_MONITOR_MODE = Object.freeze({
|
|
6874
6857
|
Added: "added",
|
|
6875
6858
|
Changed: "changed",
|
|
@@ -6902,14 +6885,14 @@ var Mutation = {
|
|
|
6902
6885
|
const stableTime = options.stableTime ?? 5 * 1e3;
|
|
6903
6886
|
const timeout = options.timeout ?? 120 * 1e3;
|
|
6904
6887
|
const onMutation = options.onMutation;
|
|
6905
|
-
|
|
6888
|
+
logger13.start("waitForStable", `\u76D1\u63A7 ${selectorList.length} \u4E2A\u9009\u62E9\u5668, \u7A33\u5B9A\u65F6\u95F4=${stableTime}ms`);
|
|
6906
6889
|
if (initialTimeout > 0) {
|
|
6907
6890
|
const selectorQuery = selectorList.join(",");
|
|
6908
6891
|
try {
|
|
6909
6892
|
await page.waitForSelector(selectorQuery, { timeout: initialTimeout });
|
|
6910
|
-
|
|
6893
|
+
logger13.info(`waitForStable \u5DF2\u68C0\u6D4B\u5230\u5143\u7D20: ${selectorQuery}`);
|
|
6911
6894
|
} catch (e) {
|
|
6912
|
-
|
|
6895
|
+
logger13.warning(`waitForStable \u521D\u59CB\u7B49\u5F85\u8D85\u65F6 (${initialTimeout}ms): ${selectorQuery}`);
|
|
6913
6896
|
throw e;
|
|
6914
6897
|
}
|
|
6915
6898
|
}
|
|
@@ -6925,7 +6908,7 @@ var Mutation = {
|
|
|
6925
6908
|
return "__CONTINUE__";
|
|
6926
6909
|
}
|
|
6927
6910
|
});
|
|
6928
|
-
|
|
6911
|
+
logger13.info("waitForStable \u5DF2\u542F\u7528 onMutation \u56DE\u8C03");
|
|
6929
6912
|
} catch (e) {
|
|
6930
6913
|
}
|
|
6931
6914
|
}
|
|
@@ -7040,9 +7023,9 @@ var Mutation = {
|
|
|
7040
7023
|
{ selectorList, stableTime, timeout, callbackName, hasCallback: !!onMutation }
|
|
7041
7024
|
);
|
|
7042
7025
|
if (result.mutationCount === 0 && result.stableTime === 0) {
|
|
7043
|
-
|
|
7026
|
+
logger13.warning("waitForStable \u672A\u627E\u5230\u53EF\u76D1\u63A7\u7684\u5143\u7D20");
|
|
7044
7027
|
}
|
|
7045
|
-
|
|
7028
|
+
logger13.success("waitForStable", `DOM \u7A33\u5B9A, \u603B\u5171 ${result.mutationCount} \u6B21\u53D8\u5316${result.wasPaused ? ", \u66FE\u6682\u505C\u8BA1\u65F6" : ""}`);
|
|
7046
7029
|
return result;
|
|
7047
7030
|
},
|
|
7048
7031
|
/**
|
|
@@ -7214,22 +7197,22 @@ var Mutation = {
|
|
|
7214
7197
|
return "__CONTINUE__";
|
|
7215
7198
|
}
|
|
7216
7199
|
};
|
|
7217
|
-
|
|
7200
|
+
logger13.start(
|
|
7218
7201
|
"waitForStableAcrossRoots",
|
|
7219
7202
|
`\u76D1\u63A7 ${selectorList.length} \u4E2A\u9009\u62E9\u5668(\u8DE8 root), \u7A33\u5B9A\u65F6\u95F4=${waitForStableTime}ms`
|
|
7220
7203
|
);
|
|
7221
7204
|
if (initialTimeout > 0) {
|
|
7222
7205
|
try {
|
|
7223
7206
|
await page.waitForSelector(selectorQuery, { timeout: initialTimeout });
|
|
7224
|
-
|
|
7207
|
+
logger13.info(`waitForStableAcrossRoots \u5DF2\u68C0\u6D4B\u5230\u5143\u7D20: ${selectorQuery}`);
|
|
7225
7208
|
} catch (e) {
|
|
7226
|
-
|
|
7209
|
+
logger13.warning(`waitForStableAcrossRoots \u521D\u59CB\u7B49\u5F85\u8D85\u65F6 (${initialTimeout}ms): ${selectorQuery}`);
|
|
7227
7210
|
throw e;
|
|
7228
7211
|
}
|
|
7229
7212
|
}
|
|
7230
7213
|
let state2 = await buildState();
|
|
7231
7214
|
if (!state2?.hasMatched) {
|
|
7232
|
-
|
|
7215
|
+
logger13.warning("waitForStableAcrossRoots \u672A\u627E\u5230\u53EF\u76D1\u63A7\u7684\u5143\u7D20");
|
|
7233
7216
|
return { mutationCount: 0, stableTime: 0, wasPaused: false };
|
|
7234
7217
|
}
|
|
7235
7218
|
let mutationCount = 0;
|
|
@@ -7266,7 +7249,7 @@ var Mutation = {
|
|
|
7266
7249
|
if (lastState.snapshotKey !== lastSnapshotKey) {
|
|
7267
7250
|
lastSnapshotKey = lastState.snapshotKey;
|
|
7268
7251
|
mutationCount += 1;
|
|
7269
|
-
|
|
7252
|
+
logger13.info(
|
|
7270
7253
|
`waitForStableAcrossRoots \u53D8\u5316#${mutationCount}, len=${lastState.snapshotLength}, path=${lastState.primaryPath || "unknown"}, preview="${truncate(lastState.text, 120)}"`
|
|
7271
7254
|
);
|
|
7272
7255
|
const signal = await invokeMutationCallback({
|
|
@@ -7279,7 +7262,7 @@ var Mutation = {
|
|
|
7279
7262
|
continue;
|
|
7280
7263
|
}
|
|
7281
7264
|
if (!isPaused && stableSince > 0 && Date.now() - stableSince >= waitForStableTime) {
|
|
7282
|
-
|
|
7265
|
+
logger13.success("waitForStableAcrossRoots", `DOM \u7A33\u5B9A, \u603B\u5171 ${mutationCount} \u6B21\u53D8\u5316${wasPaused ? ", \u66FE\u6682\u505C\u8BA1\u65F6" : ""}`);
|
|
7283
7266
|
return {
|
|
7284
7267
|
mutationCount,
|
|
7285
7268
|
stableTime: waitForStableTime,
|
|
@@ -7306,7 +7289,7 @@ var Mutation = {
|
|
|
7306
7289
|
const onMutation = options.onMutation;
|
|
7307
7290
|
const rawMode = String(options.mode || MUTATION_MONITOR_MODE.Added).toLowerCase();
|
|
7308
7291
|
const mode2 = [MUTATION_MONITOR_MODE.Added, MUTATION_MONITOR_MODE.Changed, MUTATION_MONITOR_MODE.All].includes(rawMode) ? rawMode : MUTATION_MONITOR_MODE.Added;
|
|
7309
|
-
|
|
7292
|
+
logger13.start("useMonitor", `\u76D1\u63A7 ${selectorList.length} \u4E2A\u9009\u62E9\u5668, mode=${mode2}`);
|
|
7310
7293
|
const monitorKey = generateKey("pk_mon");
|
|
7311
7294
|
const callbackName = generateKey("pk_mon_cb");
|
|
7312
7295
|
const cleanerName = generateKey("pk_mon_clean");
|
|
@@ -7449,7 +7432,7 @@ var Mutation = {
|
|
|
7449
7432
|
return total;
|
|
7450
7433
|
};
|
|
7451
7434
|
}, { selectorList, monitorKey, callbackName, cleanerName, hasCallback: !!onMutation, mode: mode2 });
|
|
7452
|
-
|
|
7435
|
+
logger13.success("useMonitor", "\u76D1\u63A7\u5668\u5DF2\u542F\u52A8");
|
|
7453
7436
|
return {
|
|
7454
7437
|
stop: async () => {
|
|
7455
7438
|
let totalMutations = 0;
|
|
@@ -7462,7 +7445,7 @@ var Mutation = {
|
|
|
7462
7445
|
}, cleanerName);
|
|
7463
7446
|
} catch (e) {
|
|
7464
7447
|
}
|
|
7465
|
-
|
|
7448
|
+
logger13.success("useMonitor.stop", `\u76D1\u63A7\u5DF2\u505C\u6B62, \u5171 ${totalMutations} \u6B21\u53D8\u5316`);
|
|
7466
7449
|
return { totalMutations };
|
|
7467
7450
|
}
|
|
7468
7451
|
};
|
|
@@ -8331,7 +8314,7 @@ var createTemplateLogger = (baseLogger = createBaseLogger()) => {
|
|
|
8331
8314
|
};
|
|
8332
8315
|
var getDefaultBaseLogger = () => createBaseLogger("");
|
|
8333
8316
|
var Logger = {
|
|
8334
|
-
setLogger: (
|
|
8317
|
+
setLogger: (logger17) => setDefaultLogger(logger17),
|
|
8335
8318
|
info: (message) => getDefaultBaseLogger().info(message),
|
|
8336
8319
|
success: (message) => getDefaultBaseLogger().success(message),
|
|
8337
8320
|
warning: (message) => getDefaultBaseLogger().warning(message),
|
|
@@ -8339,8 +8322,8 @@ var Logger = {
|
|
|
8339
8322
|
error: (message) => getDefaultBaseLogger().error(message),
|
|
8340
8323
|
debug: (message) => getDefaultBaseLogger().debug(message),
|
|
8341
8324
|
start: (message) => getDefaultBaseLogger().start(message),
|
|
8342
|
-
useTemplate: (
|
|
8343
|
-
if (
|
|
8325
|
+
useTemplate: (logger17) => {
|
|
8326
|
+
if (logger17) return createTemplateLogger(createBaseLogger("", logger17));
|
|
8344
8327
|
return createTemplateLogger();
|
|
8345
8328
|
}
|
|
8346
8329
|
};
|
|
@@ -8414,7 +8397,7 @@ var LOCATION_NETWORK_SUFFIX_PATTERNS = [
|
|
|
8414
8397
|
];
|
|
8415
8398
|
var cachedStripLogoSrcPromise = null;
|
|
8416
8399
|
var cachedEnrichmentByContext = /* @__PURE__ */ new WeakMap();
|
|
8417
|
-
var
|
|
8400
|
+
var logger14 = createInternalLogger("Watermarkify");
|
|
8418
8401
|
var normalizeText2 = (value) => String(value || "").trim();
|
|
8419
8402
|
var toInline = (value, maxLen = 200) => {
|
|
8420
8403
|
const text = normalizeText2(value);
|
|
@@ -8656,9 +8639,9 @@ var resolveWithCustomResolver = async (page, baseMeta, options = {}) => {
|
|
|
8656
8639
|
location: toInline(resolved.location, 80)
|
|
8657
8640
|
};
|
|
8658
8641
|
if (enrichment.ip || enrichment.location) {
|
|
8659
|
-
|
|
8642
|
+
logger14.info(`\u81EA\u5B9A\u4E49 resolver \u547D\u4E2D: ip=${enrichment.ip || "-"}, loc=${enrichment.location || "-"}`);
|
|
8660
8643
|
} else {
|
|
8661
|
-
|
|
8644
|
+
logger14.warning("\u81EA\u5B9A\u4E49 resolver \u5DF2\u6267\u884C\uFF0C\u4F46\u672A\u8FD4\u56DE IP/Loc");
|
|
8662
8645
|
}
|
|
8663
8646
|
return enrichment;
|
|
8664
8647
|
} finally {
|
|
@@ -8847,12 +8830,12 @@ var normalizeWatermarkifyRenderMode = (value) => {
|
|
|
8847
8830
|
};
|
|
8848
8831
|
var composeScreenshotBufferWithBrowser = async (page, buffer, overlaySvg, imageInfo = {}, options = {}) => {
|
|
8849
8832
|
if (!page || typeof page.context !== "function") {
|
|
8850
|
-
|
|
8833
|
+
logger14.warning("watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u8DF3\u8FC7: \u7F3A\u5C11\u53EF\u7528 page");
|
|
8851
8834
|
return buffer;
|
|
8852
8835
|
}
|
|
8853
8836
|
const renderScope = await openProbePage(page);
|
|
8854
8837
|
if (!renderScope?.page) {
|
|
8855
|
-
|
|
8838
|
+
logger14.warning("watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u8DF3\u8FC7: \u65E0\u6CD5\u521B\u5EFA render page");
|
|
8856
8839
|
return buffer;
|
|
8857
8840
|
}
|
|
8858
8841
|
try {
|
|
@@ -8917,13 +8900,13 @@ var composeScreenshotBufferWithBrowser = async (page, buffer, overlaySvg, imageI
|
|
|
8917
8900
|
fullPage: true,
|
|
8918
8901
|
animations: "disabled"
|
|
8919
8902
|
}).catch((error) => {
|
|
8920
|
-
|
|
8903
|
+
logger14.warning(`watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u5931\u8D25: ${error instanceof Error ? error.message : String(error)}`);
|
|
8921
8904
|
return null;
|
|
8922
8905
|
});
|
|
8923
8906
|
if (Buffer.isBuffer(composed) && composed.length > 0) {
|
|
8924
8907
|
return composed;
|
|
8925
8908
|
}
|
|
8926
|
-
|
|
8909
|
+
logger14.warning("watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u5931\u8D25: \u672A\u5F97\u5230\u6709\u6548\u622A\u56FE\u7ED3\u679C");
|
|
8927
8910
|
return buffer;
|
|
8928
8911
|
} finally {
|
|
8929
8912
|
await renderScope.close().catch(() => {
|
|
@@ -8936,7 +8919,7 @@ var resolveWithIpLookup = async (page, options = {}) => {
|
|
|
8936
8919
|
}
|
|
8937
8920
|
const probeScope = await openProbePage(page);
|
|
8938
8921
|
if (!probeScope?.page) {
|
|
8939
|
-
|
|
8922
|
+
logger14.warning("ipLookup \u8DF3\u8FC7: \u65E0\u6CD5\u521B\u5EFA probe page");
|
|
8940
8923
|
return null;
|
|
8941
8924
|
}
|
|
8942
8925
|
const timeoutMs = Math.max(
|
|
@@ -8945,12 +8928,12 @@ var resolveWithIpLookup = async (page, options = {}) => {
|
|
|
8945
8928
|
);
|
|
8946
8929
|
try {
|
|
8947
8930
|
const probePage = probeScope.page;
|
|
8948
|
-
|
|
8931
|
+
logger14.info(`ipLookup \u5C1D\u8BD5: url=${DEFAULT_IP_LOOKUP_URL}, timeoutMs=${timeoutMs}`);
|
|
8949
8932
|
const response = await probePage.goto(DEFAULT_IP_LOOKUP_URL, {
|
|
8950
8933
|
waitUntil: "commit",
|
|
8951
8934
|
timeout: timeoutMs
|
|
8952
8935
|
}).catch((error) => {
|
|
8953
|
-
|
|
8936
|
+
logger14.warning(`ipLookup \u8BF7\u6C42\u5931\u8D25: url=${DEFAULT_IP_LOOKUP_URL}, error=${error instanceof Error ? error.message : String(error)}`);
|
|
8954
8937
|
return null;
|
|
8955
8938
|
});
|
|
8956
8939
|
const status = response && typeof response.status === "function" ? response.status() : 0;
|
|
@@ -8972,13 +8955,13 @@ var resolveWithIpLookup = async (page, options = {}) => {
|
|
|
8972
8955
|
}
|
|
8973
8956
|
const parsed = parseIpIpJsonResponse(rawText);
|
|
8974
8957
|
if (parsed?.ip || parsed?.location) {
|
|
8975
|
-
|
|
8958
|
+
logger14.info(`ipLookup \u6210\u529F: url=${DEFAULT_IP_LOOKUP_URL}, status=${status || "-"}, contentType=${contentType || "-"}, ip=${parsed.ip || "-"}, loc=${parsed.location || "-"}`);
|
|
8976
8959
|
return parsed;
|
|
8977
8960
|
}
|
|
8978
|
-
|
|
8961
|
+
logger14.warning(`ipLookup \u672A\u89E3\u6790\u51FA IP/Loc: url=${DEFAULT_IP_LOOKUP_URL}, status=${status || "-"}, contentType=${contentType || "-"}, preview=${shortenTail(rawText, 120) || "[empty]"}`);
|
|
8979
8962
|
return null;
|
|
8980
8963
|
} catch (error) {
|
|
8981
|
-
|
|
8964
|
+
logger14.warning(`ipLookup \u6267\u884C\u5F02\u5E38\uFF0C\u672A\u83B7\u5F97 IP/Loc: ${error instanceof Error ? error.message : String(error)}`);
|
|
8982
8965
|
return null;
|
|
8983
8966
|
} finally {
|
|
8984
8967
|
await probeScope.close().catch(() => {
|
|
@@ -8992,10 +8975,10 @@ var resolveEnrichment = async (page, baseMeta, options) => {
|
|
|
8992
8975
|
ip: toInline(options.ip, 80),
|
|
8993
8976
|
location: toInline(options.location, 80)
|
|
8994
8977
|
};
|
|
8995
|
-
|
|
8978
|
+
logger14.info(`enrichment \u5F00\u59CB: host=${baseMeta.hostname || "-"}, hasPresetIp=${Boolean(merged.ip)}, hasPresetLoc=${Boolean(merged.location)}, ipLookup=${options.ipLookup !== false}`);
|
|
8996
8979
|
if (!merged.ip || !merged.location) {
|
|
8997
8980
|
if (cached?.ip || cached?.location) {
|
|
8998
|
-
|
|
8981
|
+
logger14.info(`enrichment \u547D\u4E2D\u4E0A\u4E0B\u6587\u7F13\u5B58: ip=${cached.ip || "-"}, loc=${cached.location || "-"}`);
|
|
8999
8982
|
}
|
|
9000
8983
|
fillEnrichment(merged, cached);
|
|
9001
8984
|
}
|
|
@@ -9019,15 +9002,15 @@ var resolveEnrichment = async (page, baseMeta, options) => {
|
|
|
9019
9002
|
"x-geo-country"
|
|
9020
9003
|
]), 80);
|
|
9021
9004
|
if (!merged.location || isWeakLocationValue(merged.location) && headerLocation) {
|
|
9022
|
-
|
|
9005
|
+
logger14.info(`enrichment \u4F7F\u7528\u54CD\u5E94\u5934\u8865\u5145 Loc: ${headerLocation || "-"}`);
|
|
9023
9006
|
merged.location = headerLocation || merged.location;
|
|
9024
9007
|
}
|
|
9025
9008
|
}
|
|
9026
9009
|
writeCachedEnrichment(page, merged);
|
|
9027
9010
|
if (merged.ip || merged.location) {
|
|
9028
|
-
|
|
9011
|
+
logger14.info(`enrichment \u5B8C\u6210: ip=${merged.ip || "-"}, loc=${merged.location || "-"}`);
|
|
9029
9012
|
} else {
|
|
9030
|
-
|
|
9013
|
+
logger14.warning("enrichment \u5B8C\u6210: \u672A\u83B7\u5F97 IP/Loc");
|
|
9031
9014
|
}
|
|
9032
9015
|
return merged;
|
|
9033
9016
|
};
|
|
@@ -9840,7 +9823,7 @@ var watermarkifyScreenshotBuffer = async (buffer, meta, page = null, options = {
|
|
|
9840
9823
|
}
|
|
9841
9824
|
const imageInfo = readImageInfo(buffer);
|
|
9842
9825
|
if (!imageInfo.width || !imageInfo.height || !imageInfo.mimeType) {
|
|
9843
|
-
|
|
9826
|
+
logger14.warning("watermarkify \u8DF3\u8FC7: \u65E0\u6CD5\u89E3\u6790\u622A\u56FE\u5C3A\u5BF8\u6216\u683C\u5F0F");
|
|
9844
9827
|
return buffer;
|
|
9845
9828
|
}
|
|
9846
9829
|
const isMobileStrip = normalizeDevice(meta.device) === Device.Mobile && hasStrip;
|
|
@@ -9858,7 +9841,7 @@ var watermarkifyScreenshotBuffer = async (buffer, meta, page = null, options = {
|
|
|
9858
9841
|
|
|
9859
9842
|
// src/internals/compression.js
|
|
9860
9843
|
import { Jimp as Jimp2, JimpMime, ResizeStrategy } from "jimp";
|
|
9861
|
-
var
|
|
9844
|
+
var logger15 = createInternalLogger("Compression");
|
|
9862
9845
|
var DEFAULT_SCREENSHOT_MAX_BYTES = 5 * 1024 * 1024;
|
|
9863
9846
|
var DEFAULT_SCREENSHOT_OUTPUT_TYPE = "jpeg";
|
|
9864
9847
|
var DEFAULT_SCREENSHOT_QUALITY = 0.72;
|
|
@@ -9977,18 +9960,18 @@ var compressImageBufferToBase64 = async (buffer, compression) => {
|
|
|
9977
9960
|
return buffer.toString("base64");
|
|
9978
9961
|
}
|
|
9979
9962
|
const result = await compressImageBuffer(buffer, compression).catch((error) => {
|
|
9980
|
-
|
|
9963
|
+
logger15.warning(`captureScreen \u538B\u7F29\u5931\u8D25\uFF0C\u8FD4\u56DE\u539F\u56FE: ${error instanceof Error ? error.message : String(error)}`);
|
|
9981
9964
|
return null;
|
|
9982
9965
|
});
|
|
9983
9966
|
if (!result?.buffer) {
|
|
9984
9967
|
return buffer.toString("base64");
|
|
9985
9968
|
}
|
|
9986
9969
|
if (result.withinLimit) {
|
|
9987
|
-
|
|
9970
|
+
logger15.info(
|
|
9988
9971
|
`captureScreen \u5DF2\u538B\u7F29: ${originalBytes} -> ${result.bytes} bytes, format=${result.format}, quality=${result.quality}, scale=${result.scale}, size=${result.width}x${result.height}`
|
|
9989
9972
|
);
|
|
9990
9973
|
} else {
|
|
9991
|
-
|
|
9974
|
+
logger15.warning(
|
|
9992
9975
|
`captureScreen \u538B\u7F29\u540E\u4ECD\u8D85\u8FC7\u76EE\u6807: ${originalBytes} -> ${result.bytes} bytes, maxBytes=${compression.maxBytes}, format=${result.format}, quality=${result.quality}, scale=${result.scale}`
|
|
9993
9976
|
);
|
|
9994
9977
|
}
|
|
@@ -9996,7 +9979,7 @@ var compressImageBufferToBase64 = async (buffer, compression) => {
|
|
|
9996
9979
|
};
|
|
9997
9980
|
|
|
9998
9981
|
// src/share.js
|
|
9999
|
-
var
|
|
9982
|
+
var logger16 = createInternalLogger("Share");
|
|
10000
9983
|
var DEFAULT_TIMEOUT_MS2 = 50 * 1e3;
|
|
10001
9984
|
var DEFAULT_PAYLOAD_SNAPSHOT_MAX_LEN = 500;
|
|
10002
9985
|
var DEFAULT_POLL_INTERVAL_MS = 120;
|
|
@@ -10133,7 +10116,7 @@ var createDomShareMonitor = async (page, options = {}) => {
|
|
|
10133
10116
|
const onMatch = typeof options.onMatch === "function" ? options.onMatch : null;
|
|
10134
10117
|
const onTelemetry = typeof options.onTelemetry === "function" ? options.onTelemetry : null;
|
|
10135
10118
|
let matched = false;
|
|
10136
|
-
|
|
10119
|
+
logger16.info(`DOM \u76D1\u542C\u51C6\u5907\u6302\u8F7D: selectors=${toJsonInline(selectors, 120)}, mode=${mode2}`);
|
|
10137
10120
|
const monitor = await Mutation.useMonitor(page, selectors, {
|
|
10138
10121
|
mode: mode2,
|
|
10139
10122
|
onMutation: (context = {}) => {
|
|
@@ -10151,12 +10134,12 @@ ${text}`;
|
|
|
10151
10134
|
});
|
|
10152
10135
|
}
|
|
10153
10136
|
if (mutationCount <= 5 || mutationCount % 50 === 0) {
|
|
10154
|
-
|
|
10137
|
+
logger16.info(`DOM \u53D8\u5316\u5DF2\u6355\u83B7: mutationCount=${mutationCount}, mutationNodes=${mutationNodes.length}`);
|
|
10155
10138
|
}
|
|
10156
10139
|
const [candidate] = Utils.parseLinks(rawDom, { prefix }) || [];
|
|
10157
10140
|
if (!candidate) return;
|
|
10158
10141
|
matched = true;
|
|
10159
|
-
|
|
10142
|
+
logger16.success("captureLink.domHit", `DOM \u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: mutationCount=${mutationCount}, link=${candidate}`);
|
|
10160
10143
|
if (onMatch) {
|
|
10161
10144
|
onMatch({
|
|
10162
10145
|
link: candidate,
|
|
@@ -10172,7 +10155,7 @@ ${text}`;
|
|
|
10172
10155
|
return {
|
|
10173
10156
|
stop: async () => {
|
|
10174
10157
|
const result = await monitor.stop();
|
|
10175
|
-
|
|
10158
|
+
logger16.info(`DOM \u76D1\u542C\u5DF2\u505C\u6B62: totalMutations=${result?.totalMutations || 0}`);
|
|
10176
10159
|
return result;
|
|
10177
10160
|
}
|
|
10178
10161
|
};
|
|
@@ -10221,8 +10204,8 @@ var Share = {
|
|
|
10221
10204
|
if (share.mode === "response" && apiMatchers.length === 0) {
|
|
10222
10205
|
throw new Error("Share.captureLink requires share.xurl[0] api matcher when mode=response");
|
|
10223
10206
|
}
|
|
10224
|
-
|
|
10225
|
-
|
|
10207
|
+
logger16.start("captureLink", `mode=${share.mode}, timeoutMs=${timeoutDisabled ? "disabled" : timeoutMs}, prefix=${share.prefix}`);
|
|
10208
|
+
logger16.info(`captureLink \u914D\u7F6E: xurl=${toJsonInline(share.xurl)}, domMode=${domMode}, domSelectors=${toJsonInline(domSelectors, 120)}`);
|
|
10226
10209
|
const stats = {
|
|
10227
10210
|
actionTimedOut: false,
|
|
10228
10211
|
domMutationCount: 0,
|
|
@@ -10234,7 +10217,7 @@ var Share = {
|
|
|
10234
10217
|
responseSampleUrls: []
|
|
10235
10218
|
};
|
|
10236
10219
|
if (isAborted()) {
|
|
10237
|
-
|
|
10220
|
+
logger16.warning(`captureLink \u5DF2\u53D6\u6D88: ${abortReason()}`);
|
|
10238
10221
|
return {
|
|
10239
10222
|
link: null,
|
|
10240
10223
|
payloadText: "",
|
|
@@ -10257,7 +10240,7 @@ var Share = {
|
|
|
10257
10240
|
link: validated,
|
|
10258
10241
|
payloadText: String(payloadText || "")
|
|
10259
10242
|
};
|
|
10260
|
-
|
|
10243
|
+
logger16.info(`\u5019\u9009\u94FE\u63A5\u5DF2\u786E\u8BA4: source=${source}, link=${validated}`);
|
|
10261
10244
|
return true;
|
|
10262
10245
|
};
|
|
10263
10246
|
const resolveResponseCandidate = (responseText) => {
|
|
@@ -10292,7 +10275,7 @@ var Share = {
|
|
|
10292
10275
|
try {
|
|
10293
10276
|
await monitor.stop();
|
|
10294
10277
|
} catch (error) {
|
|
10295
|
-
|
|
10278
|
+
logger16.warning(`\u505C\u6B62 DOM \u76D1\u542C\u5931\u8D25: ${error instanceof Error ? error.message : String(error)}`);
|
|
10296
10279
|
}
|
|
10297
10280
|
};
|
|
10298
10281
|
const onResponse = async (response) => {
|
|
@@ -10306,29 +10289,29 @@ var Share = {
|
|
|
10306
10289
|
stats.responseSampleUrls.push(url);
|
|
10307
10290
|
}
|
|
10308
10291
|
if (stats.responseObserved <= 5) {
|
|
10309
|
-
|
|
10292
|
+
logger16.info(`\u63A5\u53E3\u54CD\u5E94\u91C7\u6837(${stats.responseObserved}): ${url}`);
|
|
10310
10293
|
}
|
|
10311
10294
|
if (!apiMatchers.some((matcher) => url.includes(matcher))) return;
|
|
10312
10295
|
stats.responseMatched += 1;
|
|
10313
10296
|
stats.lastMatchedUrl = url;
|
|
10314
|
-
|
|
10297
|
+
logger16.info(`\u63A5\u53E3\u547D\u4E2D\u5339\u914D(${stats.responseMatched}): ${url}`);
|
|
10315
10298
|
const text = await response.text();
|
|
10316
10299
|
const hit = resolveResponseCandidate(text);
|
|
10317
10300
|
if (!hit?.link) {
|
|
10318
10301
|
if (stats.responseMatched <= 3) {
|
|
10319
|
-
|
|
10302
|
+
logger16.info(`\u63A5\u53E3\u89E3\u6790\u5B8C\u6210\u4F46\u672A\u63D0\u53D6\u5230\u5206\u4EAB\u94FE\u63A5: payloadSize=${text.length}`);
|
|
10320
10303
|
}
|
|
10321
10304
|
return;
|
|
10322
10305
|
}
|
|
10323
10306
|
stats.responseResolved += 1;
|
|
10324
|
-
|
|
10307
|
+
logger16.success("captureLink.responseHit", `\u63A5\u53E3\u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: url=${url}, link=${hit.link}`);
|
|
10325
10308
|
setCandidate("response", hit.link, hit.payloadText);
|
|
10326
10309
|
} catch (error) {
|
|
10327
|
-
|
|
10310
|
+
logger16.warning(`\u63A5\u53E3\u54CD\u5E94\u5904\u7406\u5F02\u5E38: ${error instanceof Error ? error.message : String(error)}`);
|
|
10328
10311
|
}
|
|
10329
10312
|
};
|
|
10330
10313
|
if (share.mode === "dom") {
|
|
10331
|
-
|
|
10314
|
+
logger16.info("\u5F53\u524D\u4E3A DOM \u6A21\u5F0F\uFF0C\u4EC5\u542F\u7528 DOM \u76D1\u542C");
|
|
10332
10315
|
domMonitor = await createDomShareMonitor(page, {
|
|
10333
10316
|
prefix: share.prefix,
|
|
10334
10317
|
selectors: domSelectors,
|
|
@@ -10343,17 +10326,17 @@ var Share = {
|
|
|
10343
10326
|
});
|
|
10344
10327
|
}
|
|
10345
10328
|
if (share.mode === "response") {
|
|
10346
|
-
|
|
10329
|
+
logger16.info(`\u5F53\u524D\u4E3A\u63A5\u53E3\u6A21\u5F0F\uFF0C\u6302\u8F7D response \u76D1\u542C: apiMatchers=${toJsonInline(apiMatchers, 160)}`);
|
|
10347
10330
|
page.on("response", onResponse);
|
|
10348
10331
|
}
|
|
10349
10332
|
if (share.mode === "custom") {
|
|
10350
|
-
|
|
10333
|
+
logger16.info("\u5F53\u524D\u4E3A custom \u6A21\u5F0F\uFF0C\u5C06\u4F7F\u7528 performActions \u8FD4\u56DE\u503C");
|
|
10351
10334
|
}
|
|
10352
10335
|
const deadline = timeoutDisabled ? Infinity : Date.now() + timeoutMs;
|
|
10353
10336
|
const getRemainingMs = () => timeoutDisabled ? Infinity : Math.max(0, deadline - Date.now());
|
|
10354
10337
|
try {
|
|
10355
10338
|
const actionTimeout = getRemainingMs();
|
|
10356
|
-
|
|
10339
|
+
logger16.start("captureLink.performActions", `\u6267\u884C\u52A8\u4F5C\u9884\u7B97=${timeoutDisabled ? "disabled" : `${actionTimeout}ms`}`);
|
|
10357
10340
|
let actionValue;
|
|
10358
10341
|
if (!isAborted() && actionTimeout > 0) {
|
|
10359
10342
|
let timer = null;
|
|
@@ -10366,30 +10349,30 @@ var Share = {
|
|
|
10366
10349
|
]);
|
|
10367
10350
|
if (timer) clearTimeout(timer);
|
|
10368
10351
|
if (actionResult.type === "error") {
|
|
10369
|
-
|
|
10352
|
+
logger16.fail("captureLink.performActions", actionResult.error);
|
|
10370
10353
|
throw actionResult.error;
|
|
10371
10354
|
}
|
|
10372
10355
|
if (actionResult.type === "timeout") {
|
|
10373
10356
|
stats.actionTimedOut = true;
|
|
10374
|
-
|
|
10357
|
+
logger16.warning(`performActions \u5DF2\u8D85\u65F6 (${actionTimeout}ms)\uFF0C\u52A8\u4F5C\u53EF\u80FD\u4ECD\u5728\u5F02\u6B65\u6267\u884C`);
|
|
10375
10358
|
} else {
|
|
10376
10359
|
actionValue = actionResult.result;
|
|
10377
|
-
|
|
10360
|
+
logger16.success("captureLink.performActions", "\u6267\u884C\u52A8\u4F5C\u5B8C\u6210");
|
|
10378
10361
|
}
|
|
10379
10362
|
}
|
|
10380
10363
|
if (share.mode === "custom") {
|
|
10381
10364
|
const customLink = typeof actionValue === "string" ? actionValue : actionValue?.link || actionValue?.payloadText;
|
|
10382
10365
|
const customPayloadText = typeof actionValue === "string" ? actionValue : actionValue?.payloadText;
|
|
10383
10366
|
if (setCandidate("custom", customLink, customPayloadText)) {
|
|
10384
|
-
|
|
10367
|
+
logger16.success("captureLink.customResult", `custom \u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: link=${candidates.custom.link}`);
|
|
10385
10368
|
} else {
|
|
10386
|
-
|
|
10369
|
+
logger16.warning("performActions \u6267\u884C\u5B8C\u6210\u4F46\u672A\u8FD4\u56DE\u6709\u6548\u5206\u4EAB\u94FE\u63A5");
|
|
10387
10370
|
}
|
|
10388
10371
|
}
|
|
10389
10372
|
let nextProgressLogTs = Date.now() + 3e3;
|
|
10390
10373
|
while (true) {
|
|
10391
10374
|
if (isAborted()) {
|
|
10392
|
-
|
|
10375
|
+
logger16.warning(`captureLink \u5DF2\u53D6\u6D88: ${abortReason()}`);
|
|
10393
10376
|
return {
|
|
10394
10377
|
link: null,
|
|
10395
10378
|
payloadText: "",
|
|
@@ -10399,7 +10382,7 @@ var Share = {
|
|
|
10399
10382
|
}
|
|
10400
10383
|
const selected = candidates[share.mode];
|
|
10401
10384
|
if (selected?.link) {
|
|
10402
|
-
|
|
10385
|
+
logger16.success("captureLink", `\u6355\u83B7\u6210\u529F: source=${share.mode}, link=${selected.link}`);
|
|
10403
10386
|
return {
|
|
10404
10387
|
link: selected.link,
|
|
10405
10388
|
payloadText: selected.payloadText,
|
|
@@ -10412,7 +10395,7 @@ var Share = {
|
|
|
10412
10395
|
if (remaining <= 0) break;
|
|
10413
10396
|
const now = Date.now();
|
|
10414
10397
|
if (now >= nextProgressLogTs) {
|
|
10415
|
-
|
|
10398
|
+
logger16.info(
|
|
10416
10399
|
`captureLink \u7B49\u5F85\u4E2D: remaining=${timeoutDisabled ? "disabled" : `${remaining}ms`}, domMutationCount=${stats.domMutationCount}, responseMatched=${stats.responseMatched}`
|
|
10417
10400
|
);
|
|
10418
10401
|
nextProgressLogTs = now + 5e3;
|
|
@@ -10420,11 +10403,11 @@ var Share = {
|
|
|
10420
10403
|
await delay5(Math.max(0, Math.min(DEFAULT_POLL_INTERVAL_MS, remaining)));
|
|
10421
10404
|
}
|
|
10422
10405
|
if (!timeoutDisabled && share.mode === "response" && stats.responseMatched === 0) {
|
|
10423
|
-
|
|
10406
|
+
logger16.warning(
|
|
10424
10407
|
`\u63A5\u53E3\u76D1\u542C\u672A\u547D\u4E2D: apiMatchers=${toJsonInline(apiMatchers, 220)}, \u54CD\u5E94\u6837\u672CURLs=${toJsonInline(stats.responseSampleUrls, 420)}`
|
|
10425
10408
|
);
|
|
10426
10409
|
}
|
|
10427
|
-
|
|
10410
|
+
logger16.warning(
|
|
10428
10411
|
`captureLink ${timeoutDisabled ? "\u672A\u62FF\u5230\u94FE\u63A5" : "\u8D85\u65F6\u672A\u62FF\u5230\u94FE\u63A5"}: mode=${share.mode}, actionTimedOut=${stats.actionTimedOut}, domMutationCount=${stats.domMutationCount}, responseObserved=${stats.responseObserved}, responseMatched=${stats.responseMatched}, lastMatchedUrl=${stats.lastMatchedUrl || "none"}`
|
|
10429
10412
|
);
|
|
10430
10413
|
return {
|
|
@@ -10436,7 +10419,7 @@ var Share = {
|
|
|
10436
10419
|
} finally {
|
|
10437
10420
|
if (share.mode === "response") {
|
|
10438
10421
|
page.off("response", onResponse);
|
|
10439
|
-
|
|
10422
|
+
logger16.info("response \u76D1\u542C\u5DF2\u5378\u8F7D");
|
|
10440
10423
|
}
|
|
10441
10424
|
await stopDomMonitor();
|
|
10442
10425
|
}
|