@skrillex1224/playwright-toolkit 3.0.35 → 3.0.36

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