@skrillex1224/playwright-toolkit 3.0.39 → 3.0.41

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