@skrillex1224/playwright-toolkit 2.1.278 → 2.1.280

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.cjs CHANGED
@@ -387,18 +387,18 @@ var fallbackLog = {
387
387
  error: (...args) => console.error(...args),
388
388
  debug: (...args) => console.debug ? console.debug(...args) : console.log(...args)
389
389
  };
390
- var resolveLogMethod = (logger17, name) => {
391
- if (logger17 && typeof logger17[name] === "function") {
392
- return logger17[name].bind(logger17);
390
+ var resolveLogMethod = (logger16, name) => {
391
+ if (logger16 && typeof logger16[name] === "function") {
392
+ return logger16[name].bind(logger16);
393
393
  }
394
- if (name === "warning" && logger17 && typeof logger17.warn === "function") {
395
- return logger17.warn.bind(logger17);
394
+ if (name === "warning" && logger16 && typeof logger16.warn === "function") {
395
+ return logger16.warn.bind(logger16);
396
396
  }
397
397
  return fallbackLog[name];
398
398
  };
399
399
  var defaultLogger = null;
400
- var setDefaultLogger = (logger17) => {
401
- defaultLogger = logger17;
400
+ var setDefaultLogger = (logger16) => {
401
+ defaultLogger = logger16;
402
402
  };
403
403
  var resolveLogger = (explicitLogger) => {
404
404
  if (explicitLogger && typeof explicitLogger.info === "function") {
@@ -425,8 +425,8 @@ var colorize = (text, color) => {
425
425
  var createBaseLogger = (prefix = "", explicitLogger) => {
426
426
  const name = prefix ? String(prefix) : "";
427
427
  const dispatch = (methodName, icon, message, color) => {
428
- const logger17 = resolveLogger(explicitLogger);
429
- const logFn = resolveLogMethod(logger17, methodName);
428
+ const logger16 = resolveLogger(explicitLogger);
429
+ const logFn = resolveLogMethod(logger16, methodName);
430
430
  const timestamp = colorize(`[${formatTimestamp()}]`, ANSI.gray);
431
431
  const line = formatLine(name, icon, message);
432
432
  const coloredLine = colorize(line, color);
@@ -923,7 +923,7 @@ var prepareExpandedFullPageScreenshot = async (page, options = {}) => {
923
923
  viewportResized
924
924
  };
925
925
  };
926
- var restoreExpandedFullPageScreenshot = async (page, state = {}) => {
926
+ var restoreExpandedFullPageScreenshot = async (page, state2 = {}) => {
927
927
  await page.evaluate((className) => {
928
928
  const targets = new Set([
929
929
  ...document.querySelectorAll(`.${className}`),
@@ -947,8 +947,8 @@ var restoreExpandedFullPageScreenshot = async (page, state = {}) => {
947
947
  el.classList.remove(className);
948
948
  });
949
949
  }, EXPANDED_SCROLLABLE_CLASS);
950
- if (state?.originalViewport && state?.viewportResized) {
951
- await page.setViewportSize(state.originalViewport);
950
+ if (state2?.originalViewport && state2?.viewportResized) {
951
+ await page.setViewportSize(state2.originalViewport);
952
952
  }
953
953
  };
954
954
  var capturePageScreenshot = async (page, options = {}) => {
@@ -1005,21 +1005,21 @@ var capturePageScreenshot = async (page, options = {}) => {
1005
1005
  }
1006
1006
  };
1007
1007
  var captureExpandedFullPageScreenshot = async (page, options = {}) => {
1008
- const state = await prepareExpandedFullPageScreenshot(page, options);
1008
+ const state2 = await prepareExpandedFullPageScreenshot(page, options);
1009
1009
  try {
1010
1010
  return await capturePageScreenshot(page, {
1011
1011
  fullPage: true,
1012
1012
  type: options.type || "png",
1013
1013
  quality: options.quality,
1014
1014
  timeout: options.timeout,
1015
- maxClipHeight: state.targetHeight
1015
+ maxClipHeight: state2.targetHeight
1016
1016
  });
1017
1017
  } finally {
1018
1018
  await restoreAffixedElementsForExpandedScreenshot(page).catch((error) => {
1019
1019
  logger.warning(`\u79FB\u52A8\u7AEF\u5438\u9644\u5143\u7D20\u6062\u590D\u5931\u8D25: ${error?.message || error}`);
1020
1020
  });
1021
1021
  if (options.restore) {
1022
- await restoreExpandedFullPageScreenshot(page, state);
1022
+ await restoreExpandedFullPageScreenshot(page, state2);
1023
1023
  }
1024
1024
  }
1025
1025
  };
@@ -1915,8 +1915,8 @@ var normalizeBrowserProfile = (value) => {
1915
1915
  payload: buildBrowserProfilePayload(core, observed)
1916
1916
  };
1917
1917
  };
1918
- var rememberRuntimeState = (state) => {
1919
- rememberedRuntimeState = deepClone(state);
1918
+ var rememberRuntimeState = (state2) => {
1919
+ rememberedRuntimeState = deepClone(state2);
1920
1920
  return rememberedRuntimeState;
1921
1921
  };
1922
1922
  var normalizeRuntimeState = (source = {}, actor = "") => {
@@ -1975,7 +1975,7 @@ var RuntimeEnv = {
1975
1975
  } else {
1976
1976
  delete normalizedRuntime.browser_profile;
1977
1977
  }
1978
- const state = {
1978
+ const state2 = {
1979
1979
  actor: resolvedActor,
1980
1980
  device,
1981
1981
  runtime: normalizedRuntime,
@@ -1989,73 +1989,73 @@ var RuntimeEnv = {
1989
1989
  browserProfileCore: browserProfile.core,
1990
1990
  browserProfileObserved: browserProfile.observed
1991
1991
  };
1992
- rememberRuntimeState(state);
1993
- return state;
1992
+ rememberRuntimeState(state2);
1993
+ return state2;
1994
1994
  },
1995
1995
  // buildEnvPatch 只构造允许回写到后端 env 的字段集合。
1996
1996
  buildEnvPatch(source = {}, actor = "") {
1997
- const state = normalizeRuntimeState(source, actor);
1998
- const browserProfile = buildBrowserProfilePayload(state.browserProfileCore, state.browserProfileObserved);
1997
+ const state2 = normalizeRuntimeState(source, actor);
1998
+ const browserProfile = buildBrowserProfilePayload(state2.browserProfileCore, state2.browserProfileObserved);
1999
1999
  const envPatch = {
2000
- ...Array.isArray(state.cookies) && state.cookies.length > 0 ? { cookies: state.cookies } : {},
2001
- ...Object.keys(state.localStorage || {}).length > 0 ? { local_storage: state.localStorage } : {},
2002
- ...Object.keys(state.sessionStorage || {}).length > 0 ? { session_storage: state.sessionStorage } : {},
2000
+ ...Array.isArray(state2.cookies) && state2.cookies.length > 0 ? { cookies: state2.cookies } : {},
2001
+ ...Object.keys(state2.localStorage || {}).length > 0 ? { local_storage: state2.localStorage } : {},
2002
+ ...Object.keys(state2.sessionStorage || {}).length > 0 ? { session_storage: state2.sessionStorage } : {},
2003
2003
  ...Object.keys(browserProfile).length > 0 ? { browser_profile: browserProfile } : {}
2004
2004
  };
2005
2005
  return Object.keys(envPatch).length > 0 ? envPatch : null;
2006
2006
  },
2007
2007
  // hasLoginState 只判断 runtime 是否存在有效载荷,不再区分具体字段来源。
2008
2008
  hasLoginState(source = {}, actor = "") {
2009
- const state = normalizeRuntimeState(source, actor);
2010
- return isPlainObject(state.runtime) && Object.keys(state.runtime || {}).length > 0;
2009
+ const state2 = normalizeRuntimeState(source, actor);
2010
+ return isPlainObject(state2.runtime) && Object.keys(state2.runtime || {}).length > 0;
2011
2011
  },
2012
2012
  rememberState(source = {}) {
2013
- const state = normalizeRuntimeState(source);
2014
- rememberRuntimeState(state);
2013
+ const state2 = normalizeRuntimeState(source);
2014
+ rememberRuntimeState(state2);
2015
2015
  return RuntimeEnv.peekRememberedState();
2016
2016
  },
2017
2017
  peekRememberedState() {
2018
2018
  return rememberedRuntimeState ? deepClone(rememberedRuntimeState) : null;
2019
2019
  },
2020
2020
  getBrowserProfileCore(source = {}, actor = "") {
2021
- const state = normalizeRuntimeState(source, actor);
2022
- return deepClone(state.browserProfileCore || {});
2021
+ const state2 = normalizeRuntimeState(source, actor);
2022
+ return deepClone(state2.browserProfileCore || {});
2023
2023
  },
2024
2024
  setBrowserProfileCore(source = {}, core = {}, actor = "") {
2025
- const state = normalizeRuntimeState(source, actor);
2025
+ const state2 = normalizeRuntimeState(source, actor);
2026
2026
  const normalizedCore = normalizeBrowserProfileCore({
2027
2027
  ...core,
2028
- device: normalizeKnownDevice(core?.device) || state.device
2028
+ device: normalizeKnownDevice(core?.device) || state2.device
2029
2029
  });
2030
- state.browserProfileCore = normalizedCore;
2031
- state.browserProfile = buildBrowserProfilePayload(normalizedCore, state.browserProfileObserved);
2032
- if (Object.keys(state.browserProfile).length > 0) {
2033
- state.runtime.browser_profile = state.browserProfile;
2030
+ state2.browserProfileCore = normalizedCore;
2031
+ state2.browserProfile = buildBrowserProfilePayload(normalizedCore, state2.browserProfileObserved);
2032
+ if (Object.keys(state2.browserProfile).length > 0) {
2033
+ state2.runtime.browser_profile = state2.browserProfile;
2034
2034
  } else {
2035
- delete state.runtime.browser_profile;
2035
+ delete state2.runtime.browser_profile;
2036
2036
  }
2037
- rememberRuntimeState(state);
2038
- return state;
2037
+ rememberRuntimeState(state2);
2038
+ return state2;
2039
2039
  },
2040
2040
  // applyToPage 只负责把登录态相关字段注入页面:
2041
2041
  // cookies / localStorage / sessionStorage。
2042
2042
  // 指纹、时区、UA、viewport 的回放发生在 launch.js 启动阶段,不在这里做。
2043
2043
  async applyToPage(page, source = {}, options = {}) {
2044
2044
  if (!page) return;
2045
- let state = normalizeRuntimeState(source, options?.actor || "");
2045
+ let state2 = normalizeRuntimeState(source, options?.actor || "");
2046
2046
  if (typeof options?.preapply === "function") {
2047
- state = await options.preapply(state) || state;
2048
- rememberRuntimeState(state);
2047
+ state2 = await options.preapply(state2) || state2;
2048
+ rememberRuntimeState(state2);
2049
2049
  }
2050
2050
  Object.defineProperty(page, PageRuntimeStateKey, {
2051
2051
  configurable: true,
2052
2052
  enumerable: false,
2053
2053
  writable: true,
2054
- value: state
2054
+ value: state2
2055
2055
  });
2056
- const localStorage = state.localStorage || {};
2057
- const sessionStorage = state.sessionStorage || {};
2058
- const cookies = (state.cookies || []).map((cookie) => {
2056
+ const localStorage = state2.localStorage || {};
2057
+ const sessionStorage = state2.sessionStorage || {};
2058
+ const cookies = (state2.cookies || []).map((cookie) => {
2059
2059
  const normalized = { ...cookie };
2060
2060
  if (!normalized.path) {
2061
2061
  normalized.path = "/";
@@ -2093,8 +2093,8 @@ var RuntimeEnv = {
2093
2093
  },
2094
2094
  // captureEnvPatch 在任务结束时采集最新环境快照,用于 pushSuccess / pushFailed 自动回写。
2095
2095
  async captureEnvPatch(page, source = {}, options = {}) {
2096
- const state = normalizeRuntimeState(source, options?.actor || "");
2097
- const baseline = RuntimeEnv.buildEnvPatch(state) || {};
2096
+ const state2 = normalizeRuntimeState(source, options?.actor || "");
2097
+ const baseline = RuntimeEnv.buildEnvPatch(state2) || {};
2098
2098
  if (!page || typeof page.evaluate !== "function" || typeof page.context !== "function") {
2099
2099
  return Object.keys(baseline).length > 0 ? baseline : null;
2100
2100
  }
@@ -2113,7 +2113,7 @@ var RuntimeEnv = {
2113
2113
  cookies
2114
2114
  },
2115
2115
  {
2116
- browserProfileCore: state.browserProfileCore
2116
+ browserProfileCore: state2.browserProfileCore
2117
2117
  }
2118
2118
  );
2119
2119
  return RuntimeEnv.mergeEnvPatches(baseline, capturedPatch);
@@ -2127,11 +2127,11 @@ var RuntimeEnv = {
2127
2127
  var logger3 = createInternalLogger("ApifyKit");
2128
2128
  var resolveRuntimeContext = (input) => {
2129
2129
  const rememberedState = RuntimeEnv.peekRememberedState();
2130
- const state = rememberedState || RuntimeEnv.parseInput(input || {});
2131
- const envPatch = RuntimeEnv.buildEnvPatch(state) || null;
2130
+ const state2 = rememberedState || RuntimeEnv.parseInput(input || {});
2131
+ const envPatch = RuntimeEnv.buildEnvPatch(state2) || null;
2132
2132
  return {
2133
- actor: state.actor,
2134
- runtime: state.runtime,
2133
+ actor: state2.actor,
2134
+ runtime: state2.runtime,
2135
2135
  envPatch
2136
2136
  };
2137
2137
  };
@@ -2490,6 +2490,57 @@ var Utils = {
2490
2490
  }
2491
2491
  };
2492
2492
 
2493
+ // src/internals/context.js
2494
+ var state = {
2495
+ mode: Mode.Default
2496
+ };
2497
+ var normalizeStrategies = (strategies) => strategies && typeof strategies === "object" ? strategies : {};
2498
+ var ToolkitContext = {
2499
+ get mode() {
2500
+ return state.mode;
2501
+ },
2502
+ setMode(mode = Mode.Default) {
2503
+ state.mode = normalizeMode(mode, Mode.Default);
2504
+ return state.mode;
2505
+ }
2506
+ };
2507
+ var getToolkitMode = () => state.mode;
2508
+ var setToolkitMode = (mode = Mode.Default) => ToolkitContext.setMode(mode);
2509
+ var resolveModeStrategy = (strategies = {}, mode = getToolkitMode(), fallbackMode = Mode.Default) => {
2510
+ const normalizedStrategies = normalizeStrategies(strategies);
2511
+ const normalizedMode = normalizeMode(mode, fallbackMode);
2512
+ const delegate = normalizedStrategies[normalizedMode] ?? normalizedStrategies[fallbackMode] ?? Object.values(normalizedStrategies).find(Boolean) ?? null;
2513
+ return {
2514
+ mode: normalizedMode,
2515
+ delegate
2516
+ };
2517
+ };
2518
+
2519
+ // src/internals/delegate.js
2520
+ var normalizeMethodDefinition = (definition) => typeof definition === "string" ? { name: definition, enumerable: true } : {
2521
+ name: String(definition?.name || "").trim(),
2522
+ enumerable: definition?.enumerable !== false
2523
+ };
2524
+ var createMethodDescriptor = (namespace, methodName, enumerable, strategies) => ({
2525
+ enumerable,
2526
+ value: (...args) => {
2527
+ const { mode, delegate } = resolveModeStrategy(strategies);
2528
+ if (typeof delegate?.[methodName] !== "function") {
2529
+ throw new Error(`${namespace}.${methodName} is not available in ${mode} mode`);
2530
+ }
2531
+ return delegate[methodName](...args);
2532
+ }
2533
+ });
2534
+ var createDelegatedFacade = (namespace, strategies = {}, methods = []) => {
2535
+ const descriptors = Object.fromEntries(
2536
+ methods.map(normalizeMethodDefinition).filter((method) => method.name).map((method) => [
2537
+ method.name,
2538
+ createMethodDescriptor(namespace, method.name, method.enumerable, strategies)
2539
+ ])
2540
+ );
2541
+ return Object.defineProperties({}, descriptors);
2542
+ };
2543
+
2493
2544
  // src/internals/anti-cheat/default.js
2494
2545
  var BASE_CONFIG = Object.freeze({
2495
2546
  locale: "zh-CN",
@@ -2563,43 +2614,52 @@ var DefaultAntiCheat = {
2563
2614
  };
2564
2615
 
2565
2616
  // src/internals/anti-cheat/cloakbrowser.js
2566
- var CloakBrowserAntiCheat = DefaultAntiCheat;
2567
-
2568
- // src/internals/toolkit-mode.js
2569
- var currentMode = Mode.Default;
2570
- var getToolkitMode = () => currentMode;
2571
- var setToolkitMode = (mode = Mode.Default) => {
2572
- currentMode = normalizeMode(mode, Mode.Default);
2573
- return currentMode;
2574
- };
2575
-
2576
- // src/anti-cheat.js
2577
- var resolveAntiCheatDelegate = () => getToolkitMode() === Mode.CloakBrowser ? CloakBrowserAntiCheat : DefaultAntiCheat;
2578
- var callAntiCheat = (method, ...args) => {
2579
- const delegate = resolveAntiCheatDelegate();
2580
- if (typeof delegate?.[method] !== "function") {
2581
- throw new Error(`AntiCheat.${method} is not available in ${getToolkitMode()} mode`);
2582
- }
2583
- return delegate[method](...args);
2584
- };
2585
- var AntiCheat = {
2617
+ var CLOAK_BROWSER_BASE_CONFIG = Object.freeze({
2618
+ locale: "",
2619
+ acceptLanguage: "",
2620
+ timezoneId: "",
2621
+ timezoneOffset: null,
2622
+ geolocation: null
2623
+ });
2624
+ var normalizeHeaders = (headers) => headers && typeof headers === "object" ? headers : {};
2625
+ var CloakBrowserAntiCheat = {
2626
+ /**
2627
+ * CloakBrowser 自身会负责浏览器指纹,toolkit 在该模式下尽量不再注入额外反检测配置。
2628
+ */
2586
2629
  getBaseConfig() {
2587
- return callAntiCheat("getBaseConfig");
2630
+ return { ...CLOAK_BROWSER_BASE_CONFIG };
2588
2631
  },
2589
- getFingerprintGeneratorOptions(options = {}) {
2590
- return callAntiCheat("getFingerprintGeneratorOptions", options);
2632
+ getFingerprintGeneratorOptions() {
2633
+ return {};
2591
2634
  },
2592
- getLaunchArgs(options = {}) {
2593
- return callAntiCheat("getLaunchArgs", options);
2635
+ getLaunchArgs() {
2636
+ return [];
2594
2637
  },
2595
- getTlsFingerprintOptions(userAgent = "", acceptLanguage = "", options = {}) {
2596
- return callAntiCheat("getTlsFingerprintOptions", userAgent, acceptLanguage, options);
2638
+ getTlsFingerprintOptions() {
2639
+ return {};
2597
2640
  },
2598
2641
  applyLocaleHeaders(headers, acceptLanguage = "") {
2599
- return callAntiCheat("applyLocaleHeaders", headers, acceptLanguage);
2642
+ const normalizedHeaders = normalizeHeaders(headers);
2643
+ if (acceptLanguage && !normalizedHeaders["accept-language"]) {
2644
+ normalizedHeaders["accept-language"] = acceptLanguage;
2645
+ }
2646
+ return normalizedHeaders;
2600
2647
  }
2601
2648
  };
2602
2649
 
2650
+ // src/anti-cheat.js
2651
+ var antiCheatStrategies = {
2652
+ [Mode.Default]: DefaultAntiCheat,
2653
+ [Mode.CloakBrowser]: CloakBrowserAntiCheat
2654
+ };
2655
+ var AntiCheat = createDelegatedFacade("AntiCheat", antiCheatStrategies, [
2656
+ "getBaseConfig",
2657
+ "getFingerprintGeneratorOptions",
2658
+ "getLaunchArgs",
2659
+ "getTlsFingerprintOptions",
2660
+ "applyLocaleHeaders"
2661
+ ]);
2662
+
2603
2663
  // src/device-input.js
2604
2664
  var resolveDeviceFromPage = (page) => normalizeDevice(page?.[PageRuntimeStateKey]?.device);
2605
2665
  var assertPage = (page, method) => {
@@ -2999,12 +3059,12 @@ var resolveDescriptor = (descriptor, device) => {
2999
3059
  }
3000
3060
  return resolved;
3001
3061
  };
3002
- var attachRuntimeState = (page, state) => {
3062
+ var attachRuntimeState = (page, state2) => {
3003
3063
  Object.defineProperty(page, PageRuntimeStateKey, {
3004
3064
  configurable: true,
3005
3065
  enumerable: false,
3006
3066
  writable: true,
3007
- value: state
3067
+ value: state2
3008
3068
  });
3009
3069
  };
3010
3070
  var restoreRuntimeState = (page, snapshot) => {
@@ -4058,7 +4118,7 @@ var restoreWindowFromSnapshot = async (page, before, after) => {
4058
4118
  return;
4059
4119
  }
4060
4120
  await page.evaluate(
4061
- (state) => window.scrollTo(state.x, state.y),
4121
+ (state2) => window.scrollTo(state2.x, state2.y),
4062
4122
  { x: Number(before.scrollX || 0), y: Number(before.scrollY || 0) }
4063
4123
  ).catch(() => {
4064
4124
  });
@@ -4304,7 +4364,7 @@ var MobileHumanize = {
4304
4364
  if (scrollRect && beforeWindowState) {
4305
4365
  const afterWindowState = await page.evaluate(() => ({ x: window.scrollX, y: window.scrollY }));
4306
4366
  if (Math.abs(afterWindowState.x - beforeWindowState.x) > 2 || Math.abs(afterWindowState.y - beforeWindowState.y) > 2) {
4307
- await page.evaluate((state) => window.scrollTo(state.x, state.y), beforeWindowState);
4367
+ await page.evaluate((state2) => window.scrollTo(state2.x, state2.y), beforeWindowState);
4308
4368
  logger6.debug(`humanScroll | \u7A97\u53E3\u6EDA\u52A8\u56DE\u6536 from=${Math.round(afterWindowState.y)} to=${Math.round(beforeWindowState.y)}`);
4309
4369
  }
4310
4370
  }
@@ -4671,23 +4731,60 @@ var DefaultHumanize = {
4671
4731
 
4672
4732
  // src/internals/humanize/cloakbrowser.js
4673
4733
  var import_delay4 = __toESM(require("delay"), 1);
4674
- var logger7 = createInternalLogger("Humanize.CloakBrowser");
4675
- var humanizedPages = /* @__PURE__ */ new WeakSet();
4676
- var cachedCloakHumanModulePromise = null;
4677
4734
  var isPageLike2 = (value) => value && typeof value === "object" && typeof value.evaluate === "function";
4678
4735
  var isPoint2 = (value) => value && typeof value === "object" && Number.isFinite(Number(value.x)) && Number.isFinite(Number(value.y));
4679
4736
  var resolveDeviceFromPage3 = (page) => normalizeDevice(page?.[PageRuntimeStateKey]?.device);
4680
4737
  var isMobilePage = (page) => resolveDeviceFromPage3(page) === Device.Mobile;
4681
- var loadCloakHumanModule = async () => {
4682
- if (!cachedCloakHumanModulePromise) {
4683
- cachedCloakHumanModulePromise = import("cloakbrowser/human").catch((error) => {
4684
- cachedCloakHumanModulePromise = null;
4685
- throw new Error("cloakbrowser/human \u6A21\u5757\u52A0\u8F7D\u5931\u8D25\uFF0C\u8BF7\u786E\u8BA4\u5F53\u524D\u8FD0\u884C\u73AF\u5883\u5DF2\u5B89\u88C5 cloakbrowser\u3002", {
4686
- cause: error
4738
+ var resolveNativeTarget2 = (page, target) => typeof target === "string" ? page.locator(target).first() : target;
4739
+ var targetExists = async (target) => {
4740
+ if (!target) {
4741
+ return false;
4742
+ }
4743
+ if (typeof target.count === "function") {
4744
+ const count = await target.count().catch(() => 0);
4745
+ return count > 0;
4746
+ }
4747
+ if (typeof target.elementHandle === "function") {
4748
+ const handle = await target.elementHandle().catch(() => null);
4749
+ try {
4750
+ return Boolean(handle);
4751
+ } finally {
4752
+ await handle?.dispose?.().catch(() => {
4687
4753
  });
4688
- });
4754
+ }
4755
+ }
4756
+ return true;
4757
+ };
4758
+ var getTargetBoundingBox2 = async (target) => {
4759
+ if (!target) {
4760
+ return null;
4761
+ }
4762
+ if (typeof target.boundingBox === "function") {
4763
+ return await target.boundingBox().catch(() => null);
4764
+ }
4765
+ if (typeof target.elementHandle === "function") {
4766
+ const handle = await target.elementHandle().catch(() => null);
4767
+ try {
4768
+ return await handle?.boundingBox?.().catch(() => null);
4769
+ } finally {
4770
+ await handle?.dispose?.().catch(() => {
4771
+ });
4772
+ }
4773
+ }
4774
+ return null;
4775
+ };
4776
+ var resolveActionTarget = async (page, target, { throwOnMissing = true } = {}) => {
4777
+ if (target == null) {
4778
+ return null;
4779
+ }
4780
+ const resolvedTarget = resolveNativeTarget2(page, target);
4781
+ if (throwOnMissing || await targetExists(resolvedTarget)) {
4782
+ return resolvedTarget;
4689
4783
  }
4690
- return cachedCloakHumanModulePromise;
4784
+ return null;
4785
+ };
4786
+ var readViewportScroll = async (page) => {
4787
+ return await page.evaluate(() => ({ x: window.scrollX, y: window.scrollY })).catch(() => ({ x: 0, y: 0 }));
4691
4788
  };
4692
4789
  var buildTypingHumanConfig = (options = {}) => {
4693
4790
  const humanConfig = {};
@@ -4707,264 +4804,109 @@ var buildTypingHumanConfig = (options = {}) => {
4707
4804
  return Object.keys(humanConfig).length > 0 ? humanConfig : null;
4708
4805
  };
4709
4806
  var buildActionOptions = (options = {}) => {
4710
- const actionOptions = {};
4807
+ const actionOptions = {
4808
+ force: true
4809
+ };
4711
4810
  if (options && options.timeout != null) {
4712
4811
  actionOptions.timeout = options.timeout;
4713
4812
  }
4714
- if (options && options.force != null) {
4715
- actionOptions.force = options.force;
4716
- }
4717
4813
  const humanConfig = buildTypingHumanConfig(options);
4718
4814
  if (humanConfig) {
4719
4815
  actionOptions.human_config = humanConfig;
4720
4816
  }
4721
4817
  return actionOptions;
4722
4818
  };
4723
- var getErrorMessage = (error) => {
4724
- if (typeof error === "string") return error;
4725
- if (error && typeof error.message === "string") return error.message;
4726
- return String(error ?? "");
4727
- };
4728
- var isPointerEventsCoveredError = (error) => {
4729
- const message = getErrorMessage(error).toLowerCase();
4730
- return message.includes("pointer_events") && (message.includes("covered by") || message.includes("receiving events"));
4731
- };
4732
- var withPointerEventsForceFallback = async (label, options, operation) => {
4733
- try {
4734
- return await operation(options);
4735
- } catch (error) {
4736
- if (options?.force || !isPointerEventsCoveredError(error)) {
4737
- throw error;
4738
- }
4739
- logger7.warn(`${label}: cloakbrowser pointer_events check failed, retrying with force=true (${getErrorMessage(error)})`);
4740
- return await operation({
4741
- ...options || {},
4742
- force: true
4743
- });
4744
- }
4745
- };
4746
- var ensureDesktopHumanized = async (page) => {
4747
- if (!page || typeof page !== "object") {
4748
- throw new Error("Humanize requires a Playwright page");
4749
- }
4750
- const humanModule = await loadCloakHumanModule();
4751
- if (page._original && page._humanCursor) {
4752
- humanizedPages.add(page);
4753
- return humanModule;
4754
- }
4755
- if (humanizedPages.has(page)) {
4756
- return humanModule;
4757
- }
4758
- const config = page._humanCfg || humanModule.resolveConfig?.("default") || humanModule.resolveConfig?.();
4759
- const cursor = page._humanCursor || { x: 0, y: 0, initialized: false };
4760
- humanModule.patchPage(page, config, cursor);
4761
- humanizedPages.add(page);
4762
- return humanModule;
4763
- };
4764
- var patchHandle = async (page, handle) => {
4765
- if (!handle || typeof handle !== "object") return handle;
4766
- const humanModule = await ensureDesktopHumanized(page);
4767
- humanModule.patchSingleElementHandle(
4768
- handle,
4769
- page,
4770
- page._humanCfg,
4771
- page._humanCursor,
4772
- page._humanRaw,
4773
- page._humanRawKb,
4774
- page._humanOriginals,
4775
- page._stealth
4776
- );
4777
- return handle;
4778
- };
4779
- var resolvePatchedTarget = async (page, target, { throwOnMissing = true } = {}) => {
4780
- if (target == null) {
4781
- return { target: null, dispose: null };
4782
- }
4783
- if (typeof target === "string") {
4784
- const handle = await page.$(target);
4785
- if (!handle) {
4786
- if (throwOnMissing) {
4787
- throw new Error(`\u627E\u4E0D\u5230\u5143\u7D20 ${String(target)}`);
4788
- }
4789
- return { target: null, dispose: null };
4790
- }
4791
- return { target: handle, dispose: null };
4792
- }
4793
- if (typeof target.elementHandle === "function") {
4794
- const handle = await target.elementHandle();
4795
- if (!handle) {
4796
- if (throwOnMissing) {
4797
- throw new Error("\u627E\u4E0D\u5230 locator \u5BF9\u5E94\u7684\u5143\u7D20");
4798
- }
4799
- return { target: null, dispose: null };
4800
- }
4801
- await patchHandle(page, handle);
4802
- return {
4803
- target: handle,
4804
- dispose: async () => {
4805
- await handle.dispose().catch(() => {
4806
- });
4807
- }
4808
- };
4809
- }
4810
- await patchHandle(page, target);
4811
- return { target, dispose: null };
4812
- };
4813
4819
  var jitterSleep = async (baseMs, jitterPercent = 0.3) => {
4814
4820
  await (0, import_delay4.default)(jitterMs(baseMs, jitterPercent));
4815
4821
  };
4816
- var humanMoveToPoint = async (page, point) => {
4817
- await ensureDesktopHumanized(page);
4822
+ var moveCursorToPoint = async (page, point) => {
4818
4823
  await page.mouse.move(Number(point.x), Number(point.y));
4819
4824
  return true;
4820
4825
  };
4821
- var doDesktopHumanClick = async (page, target, options = {}) => {
4822
- await ensureDesktopHumanized(page);
4823
- return await withPointerEventsForceFallback("humanClick", options, async (effectiveOptions = {}) => {
4824
- if (target == null) {
4825
- const cursor = page._humanCursor || { x: 0, y: 0 };
4826
- await page.mouse.click(cursor.x || 0, cursor.y || 0);
4827
- return true;
4828
- }
4829
- if (isPoint2(target)) {
4830
- return humanMoveToPoint(page, target).then(async () => {
4831
- await page.mouse.click(Number(target.x), Number(target.y));
4832
- return true;
4833
- });
4834
- }
4835
- const throwOnMissing = effectiveOptions.throwOnMissing !== false;
4836
- if (typeof target === "string") {
4837
- if (!throwOnMissing) {
4838
- const existingHandle = await page.$(target);
4839
- if (!existingHandle) {
4840
- return false;
4841
- }
4842
- await existingHandle.click(buildActionOptions(effectiveOptions));
4843
- return true;
4844
- }
4845
- await page.click(target, buildActionOptions(effectiveOptions));
4846
- return true;
4847
- }
4848
- const { target: resolvedTarget, dispose } = await resolvePatchedTarget(page, target, { throwOnMissing });
4849
- try {
4850
- if (!resolvedTarget) {
4851
- return false;
4852
- }
4853
- if (typeof resolvedTarget.click === "function") {
4854
- await resolvedTarget.click(buildActionOptions(effectiveOptions));
4855
- return true;
4856
- }
4857
- const box = await resolvedTarget.boundingBox?.();
4858
- if (!box) {
4859
- if (throwOnMissing) {
4860
- throw new Error("\u65E0\u6CD5\u83B7\u53D6\u5143\u7D20\u4F4D\u7F6E");
4861
- }
4862
- return false;
4863
- }
4864
- await page.mouse.click(box.x + box.width / 2, box.y + box.height / 2);
4865
- return true;
4866
- } finally {
4867
- if (typeof dispose === "function") {
4868
- await dispose();
4869
- }
4870
- }
4871
- });
4872
- };
4873
4826
  var CloakBrowserHumanize = {
4874
4827
  jitterMs(base, jitterPercent = 0.3) {
4875
4828
  return jitterMs(base, jitterPercent);
4876
4829
  },
4877
4830
  async initializeCursor(page) {
4878
4831
  if (isMobilePage(page)) {
4879
- return MobileHumanize.initializeCursor(page);
4832
+ return await MobileHumanize.initializeCursor(page);
4880
4833
  }
4881
- await ensureDesktopHumanized(page);
4882
- logger7.debug("initializeCursor: cloakbrowser human layer ready");
4834
+ return Boolean(page);
4883
4835
  },
4884
4836
  async humanMove(page, target) {
4885
4837
  if (isMobilePage(page)) {
4886
4838
  return await MobileHumanize.humanMove(page, target);
4887
4839
  }
4888
- await ensureDesktopHumanized(page);
4889
4840
  if (isPoint2(target)) {
4890
- return await humanMoveToPoint(page, target);
4841
+ return await moveCursorToPoint(page, target);
4891
4842
  }
4892
- const { target: resolvedTarget, dispose } = await resolvePatchedTarget(page, target, { throwOnMissing: false });
4893
- try {
4894
- if (!resolvedTarget) {
4895
- return false;
4896
- }
4897
- if (typeof resolvedTarget.hover === "function") {
4898
- await resolvedTarget.hover();
4899
- return true;
4900
- }
4901
- const box = await resolvedTarget.boundingBox?.();
4902
- if (!box) {
4903
- return false;
4904
- }
4905
- await page.mouse.move(box.x + box.width / 2, box.y + box.height / 2);
4843
+ const resolvedTarget = await resolveActionTarget(page, target, { throwOnMissing: false });
4844
+ if (!resolvedTarget) {
4845
+ return false;
4846
+ }
4847
+ if (typeof resolvedTarget.hover === "function") {
4848
+ await resolvedTarget.hover({ force: true });
4906
4849
  return true;
4907
- } finally {
4908
- if (typeof dispose === "function") {
4909
- await dispose();
4910
- }
4911
4850
  }
4851
+ const box = await getTargetBoundingBox2(resolvedTarget);
4852
+ if (!box) {
4853
+ return false;
4854
+ }
4855
+ return await moveCursorToPoint(page, {
4856
+ x: box.x + box.width / 2,
4857
+ y: box.y + box.height / 2
4858
+ });
4912
4859
  },
4913
4860
  async humanScroll(page, target, options = {}) {
4914
4861
  if (isMobilePage(page)) {
4915
4862
  return await MobileHumanize.humanScroll(page, target, options);
4916
4863
  }
4917
- const humanModule = await ensureDesktopHumanized(page);
4918
- if (typeof target === "string") {
4919
- const { x = 0, y = 0 } = page._humanCursor || {};
4920
- try {
4921
- const result = await humanModule.scrollToElement(
4922
- page,
4923
- page._humanRaw,
4924
- target,
4925
- x,
4926
- y,
4927
- page._humanCfg,
4928
- options.timeout
4929
- );
4930
- if (page._humanCursor) {
4931
- page._humanCursor.x = result.cursorX;
4932
- page._humanCursor.y = result.cursorY;
4933
- }
4934
- return {
4935
- element: await page.$(target),
4936
- didScroll: Boolean(result.didScroll),
4937
- restore: null
4938
- };
4939
- } catch (error) {
4940
- logger7.warn(`humanScroll: cloakbrowser \u6EDA\u52A8\u5931\u8D25\uFF0C\u8DF3\u8FC7 (${error?.message || error})`);
4941
- return { element: null, didScroll: false, restore: null };
4942
- }
4943
- }
4944
- const { target: resolvedTarget, dispose } = await resolvePatchedTarget(page, target, { throwOnMissing: false });
4945
- try {
4946
- if (!resolvedTarget) {
4947
- return { element: null, didScroll: false, restore: null };
4948
- }
4949
- const before = await page.evaluate(() => ({ x: window.scrollX, y: window.scrollY }));
4950
- await resolvedTarget.scrollIntoViewIfNeeded?.();
4951
- const after = await page.evaluate(() => ({ x: window.scrollX, y: window.scrollY }));
4952
- return {
4953
- element: resolvedTarget,
4954
- didScroll: before.x !== after.x || before.y !== after.y,
4955
- restore: null
4956
- };
4957
- } finally {
4958
- if (typeof dispose === "function") {
4959
- await dispose();
4960
- }
4864
+ const resolvedTarget = await resolveActionTarget(page, target, { throwOnMissing: false });
4865
+ if (!resolvedTarget) {
4866
+ return { element: null, didScroll: false, restore: null };
4961
4867
  }
4868
+ const before = await readViewportScroll(page);
4869
+ await resolvedTarget.scrollIntoViewIfNeeded?.().catch(() => {
4870
+ });
4871
+ const after = await readViewportScroll(page);
4872
+ return {
4873
+ element: resolvedTarget,
4874
+ didScroll: before.x !== after.x || before.y !== after.y,
4875
+ restore: null
4876
+ };
4962
4877
  },
4963
4878
  async humanClick(page, target, options = {}) {
4964
4879
  if (isMobilePage(page)) {
4965
4880
  return await MobileHumanize.humanClick(page, target, options);
4966
4881
  }
4967
- return await doDesktopHumanClick(page, target, options);
4882
+ if (target == null) {
4883
+ const { x = 0, y = 0 } = page?._humanCursor || {};
4884
+ await page.mouse.click(x || 0, y || 0);
4885
+ return true;
4886
+ }
4887
+ if (isPoint2(target)) {
4888
+ await page.mouse.click(Number(target.x), Number(target.y));
4889
+ return true;
4890
+ }
4891
+ const resolvedTarget = await resolveActionTarget(page, target, {
4892
+ throwOnMissing: options.throwOnMissing !== false
4893
+ });
4894
+ if (!resolvedTarget) {
4895
+ return false;
4896
+ }
4897
+ if (typeof resolvedTarget.click === "function") {
4898
+ await resolvedTarget.click(buildActionOptions(options));
4899
+ return true;
4900
+ }
4901
+ const box = await getTargetBoundingBox2(resolvedTarget);
4902
+ if (!box) {
4903
+ if (options.throwOnMissing !== false) {
4904
+ throw new Error("\u65E0\u6CD5\u83B7\u53D6\u5143\u7D20\u4F4D\u7F6E");
4905
+ }
4906
+ return false;
4907
+ }
4908
+ await page.mouse.click(box.x + box.width / 2, box.y + box.height / 2);
4909
+ return true;
4968
4910
  },
4969
4911
  async randomSleep(pageOrBaseMs, maybeBaseMs, maybeJitterPercent) {
4970
4912
  if (isPageLike2(pageOrBaseMs)) {
@@ -4980,7 +4922,6 @@ var CloakBrowserHumanize = {
4980
4922
  if (isMobilePage(page)) {
4981
4923
  return await MobileHumanize.simulateGaze(page, baseDurationMs);
4982
4924
  }
4983
- await ensureDesktopHumanized(page);
4984
4925
  const durationMs = jitterMs(baseDurationMs, 0.4);
4985
4926
  const startTime = Date.now();
4986
4927
  const viewportSize = page.viewportSize() || { width: 1365, height: 900 };
@@ -4996,31 +4937,21 @@ var CloakBrowserHumanize = {
4996
4937
  if (isMobilePage(page)) {
4997
4938
  return await MobileHumanize.humanType(page, selector, text, options);
4998
4939
  }
4999
- await ensureDesktopHumanized(page);
5000
- await withPointerEventsForceFallback("humanType", options, async (effectiveOptions = {}) => {
5001
- const actionOptions = buildActionOptions(effectiveOptions);
5002
- if (typeof selector === "string") {
5003
- await page.type(selector, text, actionOptions);
5004
- return;
5005
- }
5006
- const { target: resolvedTarget, dispose } = await resolvePatchedTarget(page, selector, { throwOnMissing: true });
5007
- try {
5008
- if (!resolvedTarget || typeof resolvedTarget.type !== "function") {
5009
- throw new Error("\u76EE\u6807\u5143\u7D20\u4E0D\u652F\u6301 type()");
5010
- }
5011
- await resolvedTarget.type(text, actionOptions);
5012
- } finally {
5013
- if (typeof dispose === "function") {
5014
- await dispose();
5015
- }
5016
- }
5017
- });
4940
+ const actionOptions = buildActionOptions(options);
4941
+ if (typeof selector === "string") {
4942
+ await page.type(selector, text, actionOptions);
4943
+ return;
4944
+ }
4945
+ const resolvedTarget = await resolveActionTarget(page, selector, { throwOnMissing: true });
4946
+ if (!resolvedTarget || typeof resolvedTarget.type !== "function") {
4947
+ throw new Error("\u76EE\u6807\u5143\u7D20\u4E0D\u652F\u6301 type()");
4948
+ }
4949
+ await resolvedTarget.type(text, actionOptions);
5018
4950
  },
5019
4951
  async humanPress(page, targetOrKey, maybeKey, options = {}) {
5020
4952
  if (isMobilePage(page)) {
5021
4953
  return await MobileHumanize.humanPress(page, targetOrKey, maybeKey, options);
5022
4954
  }
5023
- await ensureDesktopHumanized(page);
5024
4955
  const hasTarget = typeof maybeKey === "string";
5025
4956
  const key = hasTarget ? maybeKey : targetOrKey;
5026
4957
  const pressOptions = hasTarget ? options : maybeKey || options;
@@ -5032,55 +4963,61 @@ var CloakBrowserHumanize = {
5032
4963
  });
5033
4964
  return true;
5034
4965
  }
5035
- return await withPointerEventsForceFallback("humanPress", pressOptions, async (effectiveOptions = {}) => {
5036
- if (typeof targetOrKey === "string") {
5037
- await page.press(targetOrKey, key, buildActionOptions(effectiveOptions));
5038
- return true;
5039
- }
5040
- const { target: resolvedTarget, dispose } = await resolvePatchedTarget(page, targetOrKey, {
5041
- throwOnMissing: effectiveOptions.throwOnMissing !== false
5042
- });
5043
- try {
5044
- if (!resolvedTarget) {
5045
- return false;
5046
- }
5047
- if (typeof resolvedTarget.press === "function") {
5048
- await resolvedTarget.press(key, buildActionOptions(effectiveOptions));
5049
- return true;
5050
- }
5051
- await doDesktopHumanClick(page, targetOrKey, {
5052
- ...effectiveOptions,
5053
- reactionDelay: effectiveOptions.focusDelay ?? 180
5054
- });
5055
- await jitterSleep(effectiveOptions.reactionDelay ?? 180, 0.45);
5056
- await page.keyboard.press(key, {
5057
- ...effectiveOptions.keyboardOptions || {},
5058
- delay: jitterMs(effectiveOptions.holdDelay ?? 45, 0.5)
5059
- });
5060
- return true;
5061
- } finally {
5062
- if (typeof dispose === "function") {
5063
- await dispose();
5064
- }
5065
- }
4966
+ if (typeof targetOrKey === "string") {
4967
+ await page.press(targetOrKey, key, buildActionOptions(pressOptions));
4968
+ return true;
4969
+ }
4970
+ const resolvedTarget = await resolveActionTarget(page, targetOrKey, {
4971
+ throwOnMissing: pressOptions.throwOnMissing !== false
4972
+ });
4973
+ if (!resolvedTarget) {
4974
+ return false;
4975
+ }
4976
+ if (typeof resolvedTarget.press === "function") {
4977
+ await resolvedTarget.press(key, buildActionOptions(pressOptions));
4978
+ return true;
4979
+ }
4980
+ await this.humanClick(page, targetOrKey, {
4981
+ ...pressOptions,
4982
+ reactionDelay: pressOptions.focusDelay ?? 180
4983
+ });
4984
+ await jitterSleep(pressOptions.reactionDelay ?? 180, 0.45);
4985
+ await page.keyboard.press(key, {
4986
+ ...pressOptions.keyboardOptions || {},
4987
+ delay: jitterMs(pressOptions.holdDelay ?? 45, 0.5)
5066
4988
  });
4989
+ return true;
5067
4990
  },
5068
4991
  async humanClear(page, selector) {
5069
4992
  if (isMobilePage(page)) {
5070
4993
  return await MobileHumanize.humanClear(page, selector);
5071
4994
  }
5072
- await ensureDesktopHumanized(page);
5073
- if (typeof page.clear === "function") {
5074
- await page.clear(selector);
4995
+ if (typeof selector === "string") {
4996
+ if (typeof page.clear === "function") {
4997
+ await page.clear(selector, { force: true });
4998
+ return;
4999
+ }
5000
+ await page.fill(selector, "", { force: true });
5001
+ return;
5002
+ }
5003
+ const resolvedTarget = await resolveActionTarget(page, selector, { throwOnMissing: true });
5004
+ if (!resolvedTarget) {
5005
+ throw new Error("\u76EE\u6807\u5143\u7D20\u4E0D\u652F\u6301 clear()");
5006
+ }
5007
+ if (typeof resolvedTarget.clear === "function") {
5008
+ await resolvedTarget.clear(buildActionOptions());
5009
+ return;
5010
+ }
5011
+ if (typeof resolvedTarget.fill === "function") {
5012
+ await resolvedTarget.fill("", buildActionOptions());
5075
5013
  return;
5076
5014
  }
5077
- await page.fill(selector, "");
5015
+ throw new Error("\u76EE\u6807\u5143\u7D20\u4E0D\u652F\u6301 clear()");
5078
5016
  },
5079
5017
  async warmUpBrowsing(page, baseDuration = 3500) {
5080
5018
  if (isMobilePage(page)) {
5081
5019
  return await MobileHumanize.warmUpBrowsing(page, baseDuration);
5082
5020
  }
5083
- await ensureDesktopHumanized(page);
5084
5021
  const durationMs = jitterMs(baseDuration, 0.4);
5085
5022
  const startTime = Date.now();
5086
5023
  const viewportSize = page.viewportSize() || { width: 1365, height: 900 };
@@ -5106,7 +5043,6 @@ var CloakBrowserHumanize = {
5106
5043
  if (isMobilePage(page)) {
5107
5044
  return await MobileHumanize.naturalScroll(page, direction, distance, baseSteps);
5108
5045
  }
5109
- await ensureDesktopHumanized(page);
5110
5046
  const steps = Math.max(3, baseSteps + Math.floor(Math.random() * 3) - 1);
5111
5047
  const actualDistance = jitterMs(distance, 0.15);
5112
5048
  const sign = direction === "down" ? 1 : -1;
@@ -5121,55 +5057,24 @@ var CloakBrowserHumanize = {
5121
5057
  };
5122
5058
 
5123
5059
  // src/humanize.js
5124
- var resolveHumanizeDelegate = () => getToolkitMode() === Mode.CloakBrowser ? CloakBrowserHumanize : DefaultHumanize;
5125
- var callHumanize = (method, ...args) => {
5126
- const delegate = resolveHumanizeDelegate();
5127
- if (typeof delegate?.[method] !== "function") {
5128
- throw new Error(`Humanize.${method} is not available in ${getToolkitMode()} mode`);
5129
- }
5130
- return delegate[method](...args);
5131
- };
5132
- var Humanize2 = {
5133
- jitterMs(base, jitterPercent = 0.3) {
5134
- return callHumanize("jitterMs", base, jitterPercent);
5135
- },
5136
- initializeCursor(page) {
5137
- return callHumanize("initializeCursor", page);
5138
- },
5139
- humanMove(page, target) {
5140
- return callHumanize("humanMove", page, target);
5141
- },
5142
- humanScroll(page, target, options = {}) {
5143
- return callHumanize("humanScroll", page, target, options);
5144
- },
5145
- humanClick(page, target, options = {}) {
5146
- return callHumanize("humanClick", page, target, options);
5147
- },
5148
- randomSleep(pageOrBaseMs, maybeBaseMs, maybeJitterPercent) {
5149
- return callHumanize("randomSleep", pageOrBaseMs, maybeBaseMs, maybeJitterPercent);
5150
- },
5151
- simulateGaze(page, baseDurationMs = 2500) {
5152
- return callHumanize("simulateGaze", page, baseDurationMs);
5153
- },
5154
- humanType(page, selector, text, options = {}) {
5155
- return callHumanize("humanType", page, selector, text, options);
5156
- },
5157
- humanPress(page, targetOrKey, maybeKey, options = {}) {
5158
- if (typeof maybeKey === "string") {
5159
- return callHumanize("humanPress", page, targetOrKey, maybeKey, options);
5160
- }
5161
- return callHumanize("humanPress", page, targetOrKey, maybeKey || options);
5162
- },
5163
- humanClear(page, selector) {
5164
- return callHumanize("humanClear", page, selector);
5165
- },
5166
- warmUpBrowsing(page, baseDuration = 3500) {
5167
- return callHumanize("warmUpBrowsing", page, baseDuration);
5168
- },
5169
- naturalScroll(page, direction = "down", distance = 300, baseSteps = 5) {
5170
- return callHumanize("naturalScroll", page, direction, distance, baseSteps);
5171
- }
5172
- };
5060
+ var humanizeStrategies = {
5061
+ [Mode.Default]: DefaultHumanize,
5062
+ [Mode.CloakBrowser]: CloakBrowserHumanize
5063
+ };
5064
+ var Humanize2 = createDelegatedFacade("Humanize", humanizeStrategies, [
5065
+ "jitterMs",
5066
+ "initializeCursor",
5067
+ "humanMove",
5068
+ "humanScroll",
5069
+ "humanClick",
5070
+ "randomSleep",
5071
+ "simulateGaze",
5072
+ "humanType",
5073
+ "humanPress",
5074
+ "humanClear",
5075
+ "warmUpBrowsing",
5076
+ "naturalScroll"
5077
+ ]);
5173
5078
 
5174
5079
  // src/internals/launch/default.js
5175
5080
  var import_node_child_process = require("node:child_process");
@@ -5257,7 +5162,7 @@ var ByPass = {
5257
5162
  };
5258
5163
 
5259
5164
  // src/internals/launch/default.js
5260
- var logger8 = createInternalLogger("Launch");
5165
+ var logger7 = createInternalLogger("Launch");
5261
5166
  var REQUEST_HOOK_FLAG = Symbol("playwright-toolkit-request-hook");
5262
5167
  var injectedContexts = /* @__PURE__ */ new WeakSet();
5263
5168
  var browserMajorVersionCache = /* @__PURE__ */ new Map();
@@ -5309,7 +5214,7 @@ var detectBrowserMajorVersion = (launcher) => {
5309
5214
  });
5310
5215
  detectedVersion = parseChromeMajorVersion(rawVersion);
5311
5216
  } catch (error) {
5312
- logger8.warn(`\u8BFB\u53D6\u6D4F\u89C8\u5668\u7248\u672C\u5931\u8D25: ${error?.message || error}`);
5217
+ logger7.warn(`\u8BFB\u53D6\u6D4F\u89C8\u5668\u7248\u672C\u5931\u8D25: ${error?.message || error}`);
5313
5218
  }
5314
5219
  browserMajorVersionCache.set(executablePath, detectedVersion);
5315
5220
  return detectedVersion;
@@ -5346,7 +5251,7 @@ var generateFingerprintForCore = ({ locale, browserMajorVersion, device }) => {
5346
5251
  if (requestedBrowserMajorVersion <= 0) {
5347
5252
  throw error;
5348
5253
  }
5349
- logger8.warn(
5254
+ logger7.warn(
5350
5255
  `\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}`
5351
5256
  );
5352
5257
  }
@@ -5391,7 +5296,7 @@ var buildReplayableBrowserProfile = (runtimeState, launcher) => {
5391
5296
  schema_version: DEFAULT_BROWSER_PROFILE_SCHEMA_VERSION
5392
5297
  };
5393
5298
  nextState = RuntimeEnv.setBrowserProfileCore(nextState, browserProfileCore);
5394
- logger8.info(
5299
+ logger7.info(
5395
5300
  `\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}`
5396
5301
  );
5397
5302
  return { runtimeState: nextState, browserProfileCore };
@@ -5520,18 +5425,18 @@ var DefaultLaunch = {
5520
5425
  upstreamLabel = `${parsedProxyUrl.protocol}//${parsedProxyUrl.host}`;
5521
5426
  } catch {
5522
5427
  }
5523
- logger8.info(
5428
+ logger7.info(
5524
5429
  `[\u4EE3\u7406\u5DF2\u542F\u7528] \u672C\u5730=${launchProxy.server} \u4E0A\u6E38=${upstreamLabel || "-"} \u76F4\u8FDE\u57DF\u540D=${(byPassDomains || []).join(",")}`
5525
5430
  );
5526
- 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`);
5431
+ 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`);
5527
5432
  } else if (enableByPassLogger && enableProxy && !launchProxy) {
5528
- logger8.info("[\u4EE3\u7406\u672A\u542F\u7528] enable_proxy=true \u4F46 proxy_url \u4E3A\u7A7A");
5529
- 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`);
5433
+ logger7.info("[\u4EE3\u7406\u672A\u542F\u7528] enable_proxy=true \u4F46 proxy_url \u4E3A\u7A7A");
5434
+ 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`);
5530
5435
  } else if (enableByPassLogger && !enableProxy && proxyUrl) {
5531
- logger8.info("[\u4EE3\u7406\u672A\u542F\u7528] enable_proxy=false \u4E14 proxy_url \u5DF2\u914D\u7F6E");
5532
- 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`);
5436
+ logger7.info("[\u4EE3\u7406\u672A\u542F\u7528] enable_proxy=false \u4E14 proxy_url \u5DF2\u914D\u7F6E");
5437
+ 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`);
5533
5438
  } else if (enableByPassLogger) {
5534
- 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`);
5439
+ 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`);
5535
5440
  }
5536
5441
  const onPageCreated = (page) => {
5537
5442
  const recommendedGotoOptions = {
@@ -5553,7 +5458,7 @@ var DefaultLaunch = {
5553
5458
  }
5554
5459
  if (!enableByPassLogger || byPassDomains.length === 0) return;
5555
5460
  if (!matched || !matched.rule) return;
5556
- 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}`);
5461
+ 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}`);
5557
5462
  };
5558
5463
  page.on("request", requestHandler);
5559
5464
  return recommendedGotoOptions;
@@ -5610,7 +5515,7 @@ var DefaultLaunch = {
5610
5515
  // src/internals/launch/cloakbrowser.js
5611
5516
  var import_node_child_process2 = require("node:child_process");
5612
5517
  var import_node_util = require("node:util");
5613
- var logger9 = createInternalLogger("CloakBrowser");
5518
+ var logger8 = createInternalLogger("CloakBrowser");
5614
5519
  var execFileAsync = (0, import_node_util.promisify)(import_node_child_process2.execFile);
5615
5520
  var DEFAULT_CLOAK_CRAWLER_BASE_OPTIONS = Object.freeze({
5616
5521
  maxConcurrency: 1,
@@ -5746,7 +5651,7 @@ var forceTerminateBrowsersByFingerprintArg = async (fingerprintArg) => {
5746
5651
  if (error?.code === 1 || error?.code === "ENOENT") {
5747
5652
  return;
5748
5653
  }
5749
- logger9.info(`\u5F3A\u5236\u5173\u95ED CloakBrowser \u8FDB\u7A0B\u5931\u8D25\uFF08\u5FFD\u7565\uFF09: ${error?.message || String(error)}`);
5654
+ logger8.info(`\u5F3A\u5236\u5173\u95ED CloakBrowser \u8FDB\u7A0B\u5931\u8D25\uFF08\u5FFD\u7565\uFF09: ${error?.message || String(error)}`);
5750
5655
  });
5751
5656
  };
5752
5657
  var CloakBrowserLaunch = {
@@ -5760,8 +5665,21 @@ var CloakBrowserLaunch = {
5760
5665
  return createStableGotoHook(recommendedGotoOptions);
5761
5666
  },
5762
5667
  async getPlaywrightCrawlerOptions(options = {}) {
5763
- const { crawlerOptions } = await CloakBrowserLaunch.createPlaywrightCrawlerRuntime(options);
5764
- return crawlerOptions;
5668
+ const runtime2 = await CloakBrowserLaunch.createPlaywrightCrawlerRuntime(options);
5669
+ return Object.defineProperties(runtime2.crawlerOptions, {
5670
+ cleanup: {
5671
+ enumerable: false,
5672
+ value: runtime2.cleanup
5673
+ },
5674
+ closeActiveBrowsers: {
5675
+ enumerable: false,
5676
+ value: runtime2.closeActiveBrowsers
5677
+ },
5678
+ forceTerminateActiveProcesses: {
5679
+ enumerable: false,
5680
+ value: runtime2.forceTerminateActiveProcesses
5681
+ }
5682
+ });
5765
5683
  },
5766
5684
  async buildLaunchOptions(options = {}) {
5767
5685
  return await buildCloakLaunchOptions(options);
@@ -5842,39 +5760,18 @@ var CloakBrowserLaunch = {
5842
5760
  };
5843
5761
 
5844
5762
  // src/launch.js
5845
- var resolveLaunchDelegate = () => getToolkitMode() === Mode.CloakBrowser ? CloakBrowserLaunch : DefaultLaunch;
5846
- var callLaunch = (method, ...args) => {
5847
- const delegate = resolveLaunchDelegate();
5848
- if (typeof delegate?.[method] !== "function") {
5849
- throw new Error(`Launch.${method} is not available in ${getToolkitMode()} mode`);
5850
- }
5851
- return delegate[method](...args);
5852
- };
5853
- var Launch = {
5854
- getPlaywrightCrawlerOptions(options = {}) {
5855
- return callLaunch("getPlaywrightCrawlerOptions", options);
5856
- },
5857
- resolveProxyConfiguration(proxyConfiguration = {}) {
5858
- return callLaunch("resolveProxyConfiguration", proxyConfiguration);
5859
- },
5860
- extractFingerprintArg(launchOptions = {}) {
5861
- return callLaunch("extractFingerprintArg", launchOptions);
5862
- },
5863
- createStableGotoHook(recommendedGotoOptions = {}) {
5864
- return callLaunch("createStableGotoHook", recommendedGotoOptions);
5865
- },
5866
- buildLaunchOptions(options = {}) {
5867
- return callLaunch("buildLaunchOptions", options);
5868
- },
5869
- createPlaywrightCrawlerRuntime(options = {}) {
5870
- return callLaunch("createPlaywrightCrawlerRuntime", options);
5871
- }
5763
+ var launchStrategies = {
5764
+ [Mode.Default]: DefaultLaunch,
5765
+ [Mode.CloakBrowser]: CloakBrowserLaunch
5872
5766
  };
5767
+ var Launch = createDelegatedFacade("Launch", launchStrategies, [
5768
+ "getPlaywrightCrawlerOptions"
5769
+ ]);
5873
5770
 
5874
5771
  // src/live-view.js
5875
5772
  var import_express = __toESM(require("express"), 1);
5876
5773
  var import_apify = require("apify");
5877
- var logger10 = createInternalLogger("LiveView");
5774
+ var logger9 = createInternalLogger("LiveView");
5878
5775
  async function startLiveViewServer(liveViewKey) {
5879
5776
  const app = (0, import_express.default)();
5880
5777
  app.get("/", async (req, res) => {
@@ -5899,13 +5796,13 @@ async function startLiveViewServer(liveViewKey) {
5899
5796
  </html>
5900
5797
  `);
5901
5798
  } catch (error) {
5902
- logger10.fail("Live View Server", error);
5799
+ logger9.fail("Live View Server", error);
5903
5800
  res.status(500).send(`\u65E0\u6CD5\u52A0\u8F7D\u5C4F\u5E55\u622A\u56FE: ${error.message}`);
5904
5801
  }
5905
5802
  });
5906
5803
  const port = process.env.APIFY_CONTAINER_PORT || 4321;
5907
5804
  app.listen(port, () => {
5908
- logger10.success("startLiveViewServer", `\u76D1\u542C\u7AEF\u53E3 ${port}`);
5805
+ logger9.success("startLiveViewServer", `\u76D1\u542C\u7AEF\u53E3 ${port}`);
5909
5806
  });
5910
5807
  }
5911
5808
  async function takeLiveScreenshot(liveViewKey, page, logMessage) {
@@ -5913,10 +5810,10 @@ async function takeLiveScreenshot(liveViewKey, page, logMessage) {
5913
5810
  const buffer = await capturePageScreenshot(page, { type: "png" });
5914
5811
  await import_apify.Actor.setValue(liveViewKey, buffer, { contentType: "image/png" });
5915
5812
  if (logMessage) {
5916
- logger10.info(`(\u622A\u56FE): ${logMessage}`);
5813
+ logger9.info(`(\u622A\u56FE): ${logMessage}`);
5917
5814
  }
5918
5815
  } catch (e) {
5919
- logger10.warn(`\u65E0\u6CD5\u6355\u83B7 Live View \u5C4F\u5E55\u622A\u56FE: ${e.message}`);
5816
+ logger9.warn(`\u65E0\u6CD5\u6355\u83B7 Live View \u5C4F\u5E55\u622A\u56FE: ${e.message}`);
5920
5817
  }
5921
5818
  }
5922
5819
  var useLiveView = (liveViewKey = PresetOfLiveViewKey) => {
@@ -6025,7 +5922,7 @@ var dragCaptchaAction = async (page, sourceLocator, targetLocator, options = {})
6025
5922
  };
6026
5923
 
6027
5924
  // src/internals/captcha/bytedance.js
6028
- var logger11 = createInternalLogger("Captcha");
5925
+ var logger10 = createInternalLogger("Captcha");
6029
5926
  var DEFAULT_BYTEDANCE_CAPTCHA_OPTIONS = Object.freeze({
6030
5927
  apiType: "31234",
6031
5928
  maxRetries: 3,
@@ -6157,7 +6054,7 @@ var collectCaptchaDebugInfo = async (page, frame, iframeLocator, attempt, phase,
6157
6054
  }
6158
6055
  await (0, import_promises.writeFile)(infoPath, JSON.stringify(payload, null, 2), "utf8");
6159
6056
  }
6160
- logger11.info(`\u5DF2\u5199\u51FA\u9A8C\u8BC1\u7801\u8C03\u8BD5\u4EA7\u7269\uFF1A${debugDir}`);
6057
+ logger10.info(`\u5DF2\u5199\u51FA\u9A8C\u8BC1\u7801\u8C03\u8BD5\u4EA7\u7269\uFF1A${debugDir}`);
6161
6058
  };
6162
6059
  var maybeCollectCaptchaDebugInfo = async (page, frame, iframeLocator, attempt, phase, options, extra = null) => {
6163
6060
  if (!options.debugArtifacts) {
@@ -6194,14 +6091,14 @@ var getVerifycenterCaptchaContext = async (page, options) => {
6194
6091
  if (!isContainerVisible) {
6195
6092
  return null;
6196
6093
  }
6197
- logger11.info("\u68C0\u6D4B\u5230\u9A8C\u8BC1\u7801\u5BB9\u5668\uFF0C\u5F00\u59CB\u7B49\u5F85 iframe \u52A0\u8F7D\u3002");
6094
+ logger10.info("\u68C0\u6D4B\u5230\u9A8C\u8BC1\u7801\u5BB9\u5668\uFF0C\u5F00\u59CB\u7B49\u5F85 iframe \u52A0\u8F7D\u3002");
6198
6095
  let iframeLocator = page.locator(options.iframeSelector).first();
6199
6096
  let isIframeVisible = await waitForVisible(
6200
6097
  iframeLocator,
6201
6098
  options.iframeVisibleTimeoutMs
6202
6099
  );
6203
6100
  if (!isIframeVisible) {
6204
- logger11.warn("\u672A\u5728\u9884\u671F\u9009\u62E9\u5668\u4E2D\u627E\u5230 verifycenter iframe\uFF0C\u5C1D\u8BD5\u5BB9\u5668\u5185\u4EFB\u610F iframe\u3002");
6101
+ logger10.warn("\u672A\u5728\u9884\u671F\u9009\u62E9\u5668\u4E2D\u627E\u5230 verifycenter iframe\uFF0C\u5C1D\u8BD5\u5BB9\u5668\u5185\u4EFB\u610F iframe\u3002");
6205
6102
  iframeLocator = captchaContainer.locator(options.iframeFallbackSelector).first();
6206
6103
  isIframeVisible = await waitForVisible(
6207
6104
  iframeLocator,
@@ -6211,7 +6108,7 @@ var getVerifycenterCaptchaContext = async (page, options) => {
6211
6108
  if (!isIframeVisible) {
6212
6109
  throw new Error("verifycenter iframe not found inside captcha container.");
6213
6110
  }
6214
- logger11.info("\u9A8C\u8BC1\u7801 iframe \u5DF2\u53EF\u89C1\uFF0C\u5F00\u59CB\u89E3\u6790\u5185\u5BB9 frame\u3002");
6111
+ logger10.info("\u9A8C\u8BC1\u7801 iframe \u5DF2\u53EF\u89C1\uFF0C\u5F00\u59CB\u89E3\u6790\u5185\u5BB9 frame\u3002");
6215
6112
  const frame = await resolveContentFrame(page, iframeLocator, options);
6216
6113
  if (!frame) {
6217
6114
  throw new Error("Failed to resolve verifycenter iframe content frame.");
@@ -6327,11 +6224,11 @@ var refreshCaptcha = async (page, frame, options) => {
6327
6224
  const clicked = await clickCaptchaAction(frame, options.refreshTexts, {
6328
6225
  ...options,
6329
6226
  page,
6330
- logger: logger11,
6227
+ logger: logger10,
6331
6228
  forceMouse: true
6332
6229
  }).catch(() => false);
6333
6230
  if (!clicked) {
6334
- logger11.warn("Refresh button not found.");
6231
+ logger10.warn("Refresh button not found.");
6335
6232
  return false;
6336
6233
  }
6337
6234
  await page.waitForTimeout(options.refreshWaitMs);
@@ -6362,24 +6259,24 @@ var waitForCaptchaChallengeReady = async (page, frame, options) => {
6362
6259
  const hasGuideMaskVisible = options.guideMaskSelector ? await frame.locator(options.guideMaskSelector).first().isVisible({ timeout: options.loadingIndicatorVisibleTimeoutMs }).catch(() => false) : false;
6363
6260
  hasSeenGuideMask = hasSeenGuideMask || hasGuideMaskVisible;
6364
6261
  if (hasGuideMaskVisible && !hasLoggedGuideMask) {
6365
- 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");
6262
+ logger10.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");
6366
6263
  hasLoggedGuideMask = true;
6367
6264
  }
6368
6265
  if (!isLoadingVisible && hasVisibleSourceImage && hasVisibleDropTarget && !hasGuideMaskVisible) {
6369
- logger11.info(
6266
+ logger10.info(
6370
6267
  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"
6371
6268
  );
6372
6269
  return;
6373
6270
  }
6374
6271
  if (hasErrorTextVisible) {
6375
- 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");
6272
+ logger10.warn("\u9A8C\u8BC1\u7801\u9762\u677F\u51FA\u73B0\u7F51\u7EDC\u5F02\u5E38\u6587\u6848\uFF0C\u5C1D\u8BD5\u7ACB\u5373\u5237\u65B0\u9898\u76EE\u3002");
6376
6273
  await refreshCaptcha(page, frame, options);
6377
6274
  refreshDeadline = Date.now() + options.challengeReadyRefreshTimeoutMs;
6378
6275
  hasSeenLoading = false;
6379
6276
  continue;
6380
6277
  }
6381
6278
  if ((!hasVisibleSourceImage || !hasVisibleDropTarget) && Date.now() >= refreshDeadline) {
6382
- 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`);
6279
+ logger10.warn(`\u9A8C\u8BC1\u7801\u9898\u76EE\u8D85\u8FC7 ${options.challengeReadyRefreshTimeoutMs}ms \u4ECD\u672A\u51C6\u5907\u597D\uFF0C\u5C1D\u8BD5\u5237\u65B0\u9898\u76EE\u3002`);
6383
6280
  await refreshCaptcha(page, frame, options);
6384
6281
  refreshDeadline = Date.now() + options.challengeReadyRefreshTimeoutMs;
6385
6282
  hasSeenLoading = false;
@@ -6427,7 +6324,7 @@ var dragPromptCaptchaImage = async (page, frame, iframeLocator, sourceLocator, d
6427
6324
  accepted
6428
6325
  };
6429
6326
  dragAttempts.push(attemptInfo);
6430
- logger11.info(
6327
+ logger10.info(
6431
6328
  `\u9A8C\u8BC1\u7801\u62D6\u62FD\u7B2C ${visualIndex + 1} \u5F20\uFF0C\u65B9\u6848 ${plan.name}\uFF0Cbadge ${baselineState.badgeCount} -> ${afterState.badgeCount}\uFF0Cselected ${baselineState.selectedCount} -> ${afterState.selectedCount}`
6432
6329
  );
6433
6330
  if (accepted) {
@@ -6445,7 +6342,7 @@ var dragPromptCaptchaImage = async (page, frame, iframeLocator, sourceLocator, d
6445
6342
  dragAttempts,
6446
6343
  finalState: await readPromptCaptchaState(frame, options)
6447
6344
  }).catch((error) => {
6448
- logger11.warn(`\u9A8C\u8BC1\u7801\u62D6\u62FD\u5931\u8D25\u8C03\u8BD5\u6293\u53D6\u5931\u8D25\uFF1A${error?.message || error}`);
6345
+ logger10.warn(`\u9A8C\u8BC1\u7801\u62D6\u62FD\u5931\u8D25\u8C03\u8BD5\u6293\u53D6\u5931\u8D25\uFF1A${error?.message || error}`);
6449
6346
  });
6450
6347
  return {
6451
6348
  accepted: false,
@@ -6462,16 +6359,16 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
6462
6359
  ...options
6463
6360
  };
6464
6361
  if (!config.token) {
6465
- logger11.warn("\u7F3A\u5C11\u9A8C\u8BC1\u7801 token\uFF0C\u8DF3\u8FC7\u81EA\u52A8\u8BC6\u522B\u3002");
6362
+ logger10.warn("\u7F3A\u5C11\u9A8C\u8BC1\u7801 token\uFF0C\u8DF3\u8FC7\u81EA\u52A8\u8BC6\u522B\u3002");
6466
6363
  return false;
6467
6364
  }
6468
- logger11.info("\u5F53\u524D\u4F7F\u7528\u672Ctool\u2014\u2014\u6D4B\u8BD5\u7248\u672C");
6365
+ logger10.info("\u5F53\u524D\u4F7F\u7528\u672Ctool\u2014\u2014\u6D4B\u8BD5\u7248\u672C");
6469
6366
  for (let attempt = 1; attempt <= config.maxRetries; attempt += 1) {
6470
- logger11.info(`\u5F00\u59CB\u7B2C ${attempt}/${config.maxRetries} \u6B21 verifycenter \u9A8C\u8BC1\u7801\u8BC6\u522B\u3002`);
6367
+ logger10.info(`\u5F00\u59CB\u7B2C ${attempt}/${config.maxRetries} \u6B21 verifycenter \u9A8C\u8BC1\u7801\u8BC6\u522B\u3002`);
6471
6368
  try {
6472
6369
  const captchaContext = await getVerifycenterCaptchaContext(page, config);
6473
6370
  if (!captchaContext) {
6474
- logger11.info("Captcha container is not visible anymore.");
6371
+ logger10.info("Captcha container is not visible anymore.");
6475
6372
  return true;
6476
6373
  }
6477
6374
  const { iframeLocator, frame } = captchaContext;
@@ -6484,7 +6381,7 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
6484
6381
  "ready",
6485
6382
  config
6486
6383
  ).catch((error) => {
6487
- logger11.warn(`\u9A8C\u8BC1\u7801\u8C03\u8BD5\u6293\u53D6\u5931\u8D25\uFF1A${error?.message || error}`);
6384
+ logger10.warn(`\u9A8C\u8BC1\u7801\u8C03\u8BD5\u6293\u53D6\u5931\u8D25\uFF1A${error?.message || error}`);
6488
6385
  });
6489
6386
  await page.waitForTimeout(config.recognitionDelayMs);
6490
6387
  const screenshotBuffer = await iframeLocator.screenshot();
@@ -6496,16 +6393,16 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
6496
6393
  });
6497
6394
  const serialNumbers = extractCaptchaSerialNumbers(apiResponse);
6498
6395
  if (apiResponse?.code !== config.recognitionSuccessCode || serialNumbers.length === 0) {
6499
- logger11.warn(
6396
+ logger10.warn(
6500
6397
  `\u9A8C\u8BC1\u7801\u8BC6\u522B\u5931\u8D25\u3002code=${apiResponse?.code}, msg=${apiResponse?.msg || "unknown"}`
6501
6398
  );
6502
6399
  await refreshCaptcha(page, frame, config);
6503
6400
  continue;
6504
6401
  }
6505
- logger11.info(`\u9A8C\u8BC1\u7801\u8BC6\u522B\u6210\u529F\uFF0C\u5E8F\u53F7\uFF1A${serialNumbers.join(", ")}`);
6402
+ logger10.info(`\u9A8C\u8BC1\u7801\u8BC6\u522B\u6210\u529F\uFF0C\u5E8F\u53F7\uFF1A${serialNumbers.join(", ")}`);
6506
6403
  const dropTarget = await findCaptchaDropTarget(frame, config);
6507
6404
  if (!dropTarget) {
6508
- logger11.warn("\u672A\u627E\u5230\u9A8C\u8BC1\u7801\u62D6\u62FD\u76EE\u6807\u533A\u57DF\u3002");
6405
+ logger10.warn("\u672A\u627E\u5230\u9A8C\u8BC1\u7801\u62D6\u62FD\u76EE\u6807\u533A\u57DF\u3002");
6509
6406
  await refreshCaptcha(page, frame, config);
6510
6407
  continue;
6511
6408
  }
@@ -6516,7 +6413,7 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
6516
6413
  `Captcha image indexes could not be normalized. raw=${serialNumbers.join(", ")}, count=${orderedSourceImages.length}`
6517
6414
  );
6518
6415
  }
6519
- logger11.info(`\u9A8C\u8BC1\u7801\u89C6\u89C9\u4F4D\u5E8F\u6620\u5C04\uFF1A${normalizedIndexes.map((index) => index + 1).join(", ")}`);
6416
+ logger10.info(`\u9A8C\u8BC1\u7801\u89C6\u89C9\u4F4D\u5E8F\u6620\u5C04\uFF1A${normalizedIndexes.map((index) => index + 1).join(", ")}`);
6520
6417
  for (const imageIndex of normalizedIndexes) {
6521
6418
  if (imageIndex < 0 || imageIndex >= orderedSourceImages.length) {
6522
6419
  throw new Error(
@@ -6548,52 +6445,52 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
6548
6445
  }
6549
6446
  }
6550
6447
  const beforeSubmitState = await readPromptCaptchaState(frame, config);
6551
- logger11.info(
6448
+ logger10.info(
6552
6449
  `\u63D0\u4EA4\u524D\u9A8C\u8BC1\u7801\u72B6\u6001\uFF1Abadge=${beforeSubmitState.badgeCount}, selected=${beforeSubmitState.selectedCount}, submitDisabled=${beforeSubmitState.submitDisabled}`
6553
6450
  );
6554
6451
  const submitted = await clickCaptchaAction(frame, config.submitTexts, {
6555
6452
  ...config,
6556
6453
  page,
6557
- logger: logger11,
6454
+ logger: logger10,
6558
6455
  forceMouse: true,
6559
6456
  actionVisibleTimeoutMs: config.submitReadyTimeoutMs
6560
6457
  }).catch(() => false);
6561
6458
  if (!submitted) {
6562
- logger11.warn("\u672A\u627E\u5230\u63D0\u4EA4\u6309\u94AE\uFF0C\u53EF\u80FD\u4F1A\u81EA\u52A8\u63D0\u4EA4\u3002");
6459
+ logger10.warn("\u672A\u627E\u5230\u63D0\u4EA4\u6309\u94AE\uFF0C\u53EF\u80FD\u4F1A\u81EA\u52A8\u63D0\u4EA4\u3002");
6563
6460
  }
6564
6461
  await page.waitForTimeout(config.submitWaitMs);
6565
6462
  const afterSubmitState = await readPromptCaptchaState(frame, config);
6566
- logger11.info(
6463
+ logger10.info(
6567
6464
  `\u63D0\u4EA4\u540E\u9A8C\u8BC1\u7801\u72B6\u6001\uFF1Abadge=${afterSubmitState.badgeCount}, selected=${afterSubmitState.selectedCount}, submitDisabled=${afterSubmitState.submitDisabled}`
6568
6465
  );
6569
6466
  const stillVisible = await iframeLocator.isVisible({ timeout: config.containerVisibleTimeoutMs }).catch(() => false);
6570
6467
  if (!stillVisible) {
6571
- logger11.info("\u9A8C\u8BC1\u7801\u8BC6\u522B\u5E76\u63D0\u4EA4\u6210\u529F\u3002");
6468
+ logger10.info("\u9A8C\u8BC1\u7801\u8BC6\u522B\u5E76\u63D0\u4EA4\u6210\u529F\u3002");
6572
6469
  return true;
6573
6470
  }
6574
6471
  await maybeCollectCaptchaDebugInfo(page, frame, iframeLocator, attempt, "submit-still-visible", config, {
6575
6472
  beforeSubmitState,
6576
6473
  afterSubmitState
6577
6474
  }).catch((error) => {
6578
- logger11.warn(`\u63D0\u4EA4\u540E\u9A8C\u8BC1\u7801\u8C03\u8BD5\u6293\u53D6\u5931\u8D25\uFF1A${error?.message || error}`);
6475
+ logger10.warn(`\u63D0\u4EA4\u540E\u9A8C\u8BC1\u7801\u8C03\u8BD5\u6293\u53D6\u5931\u8D25\uFF1A${error?.message || error}`);
6579
6476
  });
6580
- logger11.warn("\u63D0\u4EA4\u540E\u9A8C\u8BC1\u7801 iframe \u4ECD\u7136\u53EF\u89C1\uFF0C\u51C6\u5907\u5237\u65B0\u540E\u91CD\u8BD5\u3002");
6477
+ logger10.warn("\u63D0\u4EA4\u540E\u9A8C\u8BC1\u7801 iframe \u4ECD\u7136\u53EF\u89C1\uFF0C\u51C6\u5907\u5237\u65B0\u540E\u91CD\u8BD5\u3002");
6581
6478
  await page.waitForTimeout(2e3);
6582
6479
  await refreshCaptcha(page, frame, config);
6583
6480
  } catch (error) {
6584
- logger11.error(`\u7B2C ${attempt}/${config.maxRetries} \u6B21\u9A8C\u8BC1\u7801\u8BC6\u522B\u5931\u8D25\uFF1A${error?.message || error}`);
6481
+ logger10.error(`\u7B2C ${attempt}/${config.maxRetries} \u6B21\u9A8C\u8BC1\u7801\u8BC6\u522B\u5931\u8D25\uFF1A${error?.message || error}`);
6585
6482
  }
6586
6483
  if (attempt < config.maxRetries) {
6587
6484
  await page.waitForTimeout(config.retryDelayBaseMs + attempt * config.retryDelayStepMs);
6588
6485
  }
6589
6486
  }
6590
- logger11.error(`\u91CD\u8BD5 ${config.maxRetries} \u6B21\u540E\uFF0C\u9A8C\u8BC1\u7801\u4ECD\u672A\u8BC6\u522B\u6210\u529F\u3002`);
6487
+ logger10.error(`\u91CD\u8BD5 ${config.maxRetries} \u6B21\u540E\uFF0C\u9A8C\u8BC1\u7801\u4ECD\u672A\u8BC6\u522B\u6210\u529F\u3002`);
6591
6488
  return false;
6592
6489
  }
6593
6490
  var sloveCaptcha = solveCaptcha;
6594
6491
 
6595
6492
  // src/chaptcha.js
6596
- var logger12 = createInternalLogger("Captcha");
6493
+ var logger11 = createInternalLogger("Captcha");
6597
6494
  var DEFAULT_CAPTCHA_RECOGNITION_OPTIONS = Object.freeze({
6598
6495
  token: "eKJvBfwfN0YRav0-VD_44E2VBSfm7l0YtddUQ7cFySI",
6599
6496
  apiUrl: "https://api.jfbym.com/api/YmServer/customApi"
@@ -6680,7 +6577,7 @@ function useCaptchaMonitor(page, options) {
6680
6577
  };
6681
6578
  })();
6682
6579
  }, { selector: domSelector, callbackName: exposedFunctionName, cleanerName });
6683
- logger12.success("useCaptchaMonitor", `DOM \u76D1\u63A7\u5DF2\u542F\u7528\uFF1A${domSelector}`);
6580
+ logger11.success("useCaptchaMonitor", `DOM \u76D1\u63A7\u5DF2\u542F\u7528\uFF1A${domSelector}`);
6684
6581
  cleanupFns.push(async () => {
6685
6582
  try {
6686
6583
  await page.evaluate((name) => {
@@ -6704,14 +6601,14 @@ function useCaptchaMonitor(page, options) {
6704
6601
  }
6705
6602
  };
6706
6603
  page.on("framenavigated", frameHandler);
6707
- logger12.success("useCaptchaMonitor", `URL \u76D1\u63A7\u5DF2\u542F\u7528\uFF1A${urlPattern}`);
6604
+ logger11.success("useCaptchaMonitor", `URL \u76D1\u63A7\u5DF2\u542F\u7528\uFF1A${urlPattern}`);
6708
6605
  cleanupFns.push(async () => {
6709
6606
  page.off("framenavigated", frameHandler);
6710
6607
  });
6711
6608
  }
6712
6609
  return {
6713
6610
  stop: async () => {
6714
- logger12.info("\u6B63\u5728\u505C\u6B62\u9A8C\u8BC1\u7801\u76D1\u63A7...");
6611
+ logger11.info("\u6B63\u5728\u505C\u6B62\u9A8C\u8BC1\u7801\u76D1\u63A7...");
6715
6612
  for (const fn of cleanupFns) {
6716
6613
  await fn();
6717
6614
  }
@@ -6750,7 +6647,7 @@ async function solveCaptchaWithStrategy(strategyName, page, options = {}) {
6750
6647
  );
6751
6648
  return strategy.sloveCaptcha(page, resolvedOptions, {
6752
6649
  callCaptchaRecognitionApi,
6753
- logger: logger12
6650
+ logger: logger11
6754
6651
  });
6755
6652
  }
6756
6653
  var Captcha = {
@@ -6761,7 +6658,7 @@ var Captcha = {
6761
6658
  // src/mutation.js
6762
6659
  var import_node_crypto = require("node:crypto");
6763
6660
  var import_uuid2 = require("uuid");
6764
- var logger13 = createInternalLogger("Mutation");
6661
+ var logger12 = createInternalLogger("Mutation");
6765
6662
  var MUTATION_MONITOR_MODE = Object.freeze({
6766
6663
  Added: "added",
6767
6664
  Changed: "changed",
@@ -6794,14 +6691,14 @@ var Mutation = {
6794
6691
  const stableTime = options.stableTime ?? 5 * 1e3;
6795
6692
  const timeout = options.timeout ?? 120 * 1e3;
6796
6693
  const onMutation = options.onMutation;
6797
- logger13.start("waitForStable", `\u76D1\u63A7 ${selectorList.length} \u4E2A\u9009\u62E9\u5668, \u7A33\u5B9A\u65F6\u95F4=${stableTime}ms`);
6694
+ logger12.start("waitForStable", `\u76D1\u63A7 ${selectorList.length} \u4E2A\u9009\u62E9\u5668, \u7A33\u5B9A\u65F6\u95F4=${stableTime}ms`);
6798
6695
  if (initialTimeout > 0) {
6799
6696
  const selectorQuery = selectorList.join(",");
6800
6697
  try {
6801
6698
  await page.waitForSelector(selectorQuery, { timeout: initialTimeout });
6802
- logger13.info(`waitForStable \u5DF2\u68C0\u6D4B\u5230\u5143\u7D20: ${selectorQuery}`);
6699
+ logger12.info(`waitForStable \u5DF2\u68C0\u6D4B\u5230\u5143\u7D20: ${selectorQuery}`);
6803
6700
  } catch (e) {
6804
- logger13.warning(`waitForStable \u521D\u59CB\u7B49\u5F85\u8D85\u65F6 (${initialTimeout}ms): ${selectorQuery}`);
6701
+ logger12.warning(`waitForStable \u521D\u59CB\u7B49\u5F85\u8D85\u65F6 (${initialTimeout}ms): ${selectorQuery}`);
6805
6702
  throw e;
6806
6703
  }
6807
6704
  }
@@ -6817,7 +6714,7 @@ var Mutation = {
6817
6714
  return "__CONTINUE__";
6818
6715
  }
6819
6716
  });
6820
- logger13.info("waitForStable \u5DF2\u542F\u7528 onMutation \u56DE\u8C03");
6717
+ logger12.info("waitForStable \u5DF2\u542F\u7528 onMutation \u56DE\u8C03");
6821
6718
  } catch (e) {
6822
6719
  }
6823
6720
  }
@@ -6932,9 +6829,9 @@ var Mutation = {
6932
6829
  { selectorList, stableTime, timeout, callbackName, hasCallback: !!onMutation }
6933
6830
  );
6934
6831
  if (result.mutationCount === 0 && result.stableTime === 0) {
6935
- logger13.warning("waitForStable \u672A\u627E\u5230\u53EF\u76D1\u63A7\u7684\u5143\u7D20");
6832
+ logger12.warning("waitForStable \u672A\u627E\u5230\u53EF\u76D1\u63A7\u7684\u5143\u7D20");
6936
6833
  }
6937
- logger13.success("waitForStable", `DOM \u7A33\u5B9A, \u603B\u5171 ${result.mutationCount} \u6B21\u53D8\u5316${result.wasPaused ? ", \u66FE\u6682\u505C\u8BA1\u65F6" : ""}`);
6834
+ logger12.success("waitForStable", `DOM \u7A33\u5B9A, \u603B\u5171 ${result.mutationCount} \u6B21\u53D8\u5316${result.wasPaused ? ", \u66FE\u6682\u505C\u8BA1\u65F6" : ""}`);
6938
6835
  return result;
6939
6836
  },
6940
6837
  /**
@@ -7106,29 +7003,29 @@ var Mutation = {
7106
7003
  return "__CONTINUE__";
7107
7004
  }
7108
7005
  };
7109
- logger13.start(
7006
+ logger12.start(
7110
7007
  "waitForStableAcrossRoots",
7111
7008
  `\u76D1\u63A7 ${selectorList.length} \u4E2A\u9009\u62E9\u5668(\u8DE8 root), \u7A33\u5B9A\u65F6\u95F4=${waitForStableTime}ms`
7112
7009
  );
7113
7010
  if (initialTimeout > 0) {
7114
7011
  try {
7115
7012
  await page.waitForSelector(selectorQuery, { timeout: initialTimeout });
7116
- logger13.info(`waitForStableAcrossRoots \u5DF2\u68C0\u6D4B\u5230\u5143\u7D20: ${selectorQuery}`);
7013
+ logger12.info(`waitForStableAcrossRoots \u5DF2\u68C0\u6D4B\u5230\u5143\u7D20: ${selectorQuery}`);
7117
7014
  } catch (e) {
7118
- logger13.warning(`waitForStableAcrossRoots \u521D\u59CB\u7B49\u5F85\u8D85\u65F6 (${initialTimeout}ms): ${selectorQuery}`);
7015
+ logger12.warning(`waitForStableAcrossRoots \u521D\u59CB\u7B49\u5F85\u8D85\u65F6 (${initialTimeout}ms): ${selectorQuery}`);
7119
7016
  throw e;
7120
7017
  }
7121
7018
  }
7122
- let state = await buildState();
7123
- if (!state?.hasMatched) {
7124
- logger13.warning("waitForStableAcrossRoots \u672A\u627E\u5230\u53EF\u76D1\u63A7\u7684\u5143\u7D20");
7019
+ let state2 = await buildState();
7020
+ if (!state2?.hasMatched) {
7021
+ logger12.warning("waitForStableAcrossRoots \u672A\u627E\u5230\u53EF\u76D1\u63A7\u7684\u5143\u7D20");
7125
7022
  return { mutationCount: 0, stableTime: 0, wasPaused: false };
7126
7023
  }
7127
7024
  let mutationCount = 0;
7128
7025
  let stableSince = 0;
7129
7026
  let isPaused = false;
7130
7027
  let wasPaused = false;
7131
- let lastSnapshotKey = state.snapshotKey;
7028
+ let lastSnapshotKey = state2.snapshotKey;
7132
7029
  const applyPauseSignal = (signal) => {
7133
7030
  const nextPaused = signal === "__PAUSE__";
7134
7031
  if (nextPaused) {
@@ -7142,13 +7039,13 @@ var Mutation = {
7142
7039
  };
7143
7040
  const initialSignal = await invokeMutationCallback({
7144
7041
  mutationCount: 0,
7145
- html: state.html || "",
7146
- text: state.text || "",
7147
- mutationNodes: state.mutationNodes || []
7042
+ html: state2.html || "",
7043
+ text: state2.text || "",
7044
+ mutationNodes: state2.mutationNodes || []
7148
7045
  });
7149
7046
  applyPauseSignal(initialSignal);
7150
7047
  const deadline = Date.now() + overallTimeout;
7151
- let lastState = state;
7048
+ let lastState = state2;
7152
7049
  while (Date.now() < deadline) {
7153
7050
  await sleep(pollInterval);
7154
7051
  lastState = await buildState();
@@ -7158,7 +7055,7 @@ var Mutation = {
7158
7055
  if (lastState.snapshotKey !== lastSnapshotKey) {
7159
7056
  lastSnapshotKey = lastState.snapshotKey;
7160
7057
  mutationCount += 1;
7161
- logger13.info(
7058
+ logger12.info(
7162
7059
  `waitForStableAcrossRoots \u53D8\u5316#${mutationCount}, len=${lastState.snapshotLength}, path=${lastState.primaryPath || "unknown"}, preview="${truncate(lastState.text, 120)}"`
7163
7060
  );
7164
7061
  const signal = await invokeMutationCallback({
@@ -7171,7 +7068,7 @@ var Mutation = {
7171
7068
  continue;
7172
7069
  }
7173
7070
  if (!isPaused && stableSince > 0 && Date.now() - stableSince >= waitForStableTime) {
7174
- logger13.success("waitForStableAcrossRoots", `DOM \u7A33\u5B9A, \u603B\u5171 ${mutationCount} \u6B21\u53D8\u5316${wasPaused ? ", \u66FE\u6682\u505C\u8BA1\u65F6" : ""}`);
7071
+ logger12.success("waitForStableAcrossRoots", `DOM \u7A33\u5B9A, \u603B\u5171 ${mutationCount} \u6B21\u53D8\u5316${wasPaused ? ", \u66FE\u6682\u505C\u8BA1\u65F6" : ""}`);
7175
7072
  return {
7176
7073
  mutationCount,
7177
7074
  stableTime: waitForStableTime,
@@ -7198,7 +7095,7 @@ var Mutation = {
7198
7095
  const onMutation = options.onMutation;
7199
7096
  const rawMode = String(options.mode || MUTATION_MONITOR_MODE.Added).toLowerCase();
7200
7097
  const mode = [MUTATION_MONITOR_MODE.Added, MUTATION_MONITOR_MODE.Changed, MUTATION_MONITOR_MODE.All].includes(rawMode) ? rawMode : MUTATION_MONITOR_MODE.Added;
7201
- logger13.start("useMonitor", `\u76D1\u63A7 ${selectorList.length} \u4E2A\u9009\u62E9\u5668, mode=${mode}`);
7098
+ logger12.start("useMonitor", `\u76D1\u63A7 ${selectorList.length} \u4E2A\u9009\u62E9\u5668, mode=${mode}`);
7202
7099
  const monitorKey = generateKey("pk_mon");
7203
7100
  const callbackName = generateKey("pk_mon_cb");
7204
7101
  const cleanerName = generateKey("pk_mon_clean");
@@ -7341,7 +7238,7 @@ var Mutation = {
7341
7238
  return total;
7342
7239
  };
7343
7240
  }, { selectorList, monitorKey, callbackName, cleanerName, hasCallback: !!onMutation, mode });
7344
- logger13.success("useMonitor", "\u76D1\u63A7\u5668\u5DF2\u542F\u52A8");
7241
+ logger12.success("useMonitor", "\u76D1\u63A7\u5668\u5DF2\u542F\u52A8");
7345
7242
  return {
7346
7243
  stop: async () => {
7347
7244
  let totalMutations = 0;
@@ -7354,7 +7251,7 @@ var Mutation = {
7354
7251
  }, cleanerName);
7355
7252
  } catch (e) {
7356
7253
  }
7357
- logger13.success("useMonitor.stop", `\u76D1\u63A7\u5DF2\u505C\u6B62, \u5171 ${totalMutations} \u6B21\u53D8\u5316`);
7254
+ logger12.success("useMonitor.stop", `\u76D1\u63A7\u5DF2\u505C\u6B62, \u5171 ${totalMutations} \u6B21\u53D8\u5316`);
7358
7255
  return { totalMutations };
7359
7256
  }
7360
7257
  };
@@ -8223,7 +8120,7 @@ var createTemplateLogger = (baseLogger = createBaseLogger()) => {
8223
8120
  };
8224
8121
  var getDefaultBaseLogger = () => createBaseLogger("");
8225
8122
  var Logger = {
8226
- setLogger: (logger17) => setDefaultLogger(logger17),
8123
+ setLogger: (logger16) => setDefaultLogger(logger16),
8227
8124
  info: (message) => getDefaultBaseLogger().info(message),
8228
8125
  success: (message) => getDefaultBaseLogger().success(message),
8229
8126
  warning: (message) => getDefaultBaseLogger().warning(message),
@@ -8231,8 +8128,8 @@ var Logger = {
8231
8128
  error: (message) => getDefaultBaseLogger().error(message),
8232
8129
  debug: (message) => getDefaultBaseLogger().debug(message),
8233
8130
  start: (message) => getDefaultBaseLogger().start(message),
8234
- useTemplate: (logger17) => {
8235
- if (logger17) return createTemplateLogger(createBaseLogger("", logger17));
8131
+ useTemplate: (logger16) => {
8132
+ if (logger16) return createTemplateLogger(createBaseLogger("", logger16));
8236
8133
  return createTemplateLogger();
8237
8134
  }
8238
8135
  };
@@ -8306,7 +8203,7 @@ var LOCATION_NETWORK_SUFFIX_PATTERNS = [
8306
8203
  ];
8307
8204
  var cachedStripLogoSrcPromise = null;
8308
8205
  var cachedEnrichmentByContext = /* @__PURE__ */ new WeakMap();
8309
- var logger14 = createInternalLogger("Watermarkify");
8206
+ var logger13 = createInternalLogger("Watermarkify");
8310
8207
  var normalizeText = (value) => String(value || "").trim();
8311
8208
  var toInline = (value, maxLen = 200) => {
8312
8209
  const text = normalizeText(value);
@@ -8548,9 +8445,9 @@ var resolveWithCustomResolver = async (page, baseMeta, options = {}) => {
8548
8445
  location: toInline(resolved.location, 80)
8549
8446
  };
8550
8447
  if (enrichment.ip || enrichment.location) {
8551
- logger14.info(`\u81EA\u5B9A\u4E49 resolver \u547D\u4E2D: ip=${enrichment.ip || "-"}, loc=${enrichment.location || "-"}`);
8448
+ logger13.info(`\u81EA\u5B9A\u4E49 resolver \u547D\u4E2D: ip=${enrichment.ip || "-"}, loc=${enrichment.location || "-"}`);
8552
8449
  } else {
8553
- logger14.warning("\u81EA\u5B9A\u4E49 resolver \u5DF2\u6267\u884C\uFF0C\u4F46\u672A\u8FD4\u56DE IP/Loc");
8450
+ logger13.warning("\u81EA\u5B9A\u4E49 resolver \u5DF2\u6267\u884C\uFF0C\u4F46\u672A\u8FD4\u56DE IP/Loc");
8554
8451
  }
8555
8452
  return enrichment;
8556
8453
  } finally {
@@ -8739,12 +8636,12 @@ var normalizeWatermarkifyRenderMode = (value) => {
8739
8636
  };
8740
8637
  var composeScreenshotBufferWithBrowser = async (page, buffer, overlaySvg, imageInfo = {}, options = {}) => {
8741
8638
  if (!page || typeof page.context !== "function") {
8742
- logger14.warning("watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u8DF3\u8FC7: \u7F3A\u5C11\u53EF\u7528 page");
8639
+ logger13.warning("watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u8DF3\u8FC7: \u7F3A\u5C11\u53EF\u7528 page");
8743
8640
  return buffer;
8744
8641
  }
8745
8642
  const renderScope = await openProbePage(page);
8746
8643
  if (!renderScope?.page) {
8747
- logger14.warning("watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u8DF3\u8FC7: \u65E0\u6CD5\u521B\u5EFA render page");
8644
+ logger13.warning("watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u8DF3\u8FC7: \u65E0\u6CD5\u521B\u5EFA render page");
8748
8645
  return buffer;
8749
8646
  }
8750
8647
  try {
@@ -8809,13 +8706,13 @@ var composeScreenshotBufferWithBrowser = async (page, buffer, overlaySvg, imageI
8809
8706
  fullPage: true,
8810
8707
  animations: "disabled"
8811
8708
  }).catch((error) => {
8812
- logger14.warning(`watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u5931\u8D25: ${error instanceof Error ? error.message : String(error)}`);
8709
+ logger13.warning(`watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u5931\u8D25: ${error instanceof Error ? error.message : String(error)}`);
8813
8710
  return null;
8814
8711
  });
8815
8712
  if (Buffer.isBuffer(composed) && composed.length > 0) {
8816
8713
  return composed;
8817
8714
  }
8818
- logger14.warning("watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u5931\u8D25: \u672A\u5F97\u5230\u6709\u6548\u622A\u56FE\u7ED3\u679C");
8715
+ logger13.warning("watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u5931\u8D25: \u672A\u5F97\u5230\u6709\u6548\u622A\u56FE\u7ED3\u679C");
8819
8716
  return buffer;
8820
8717
  } finally {
8821
8718
  await renderScope.close().catch(() => {
@@ -8828,7 +8725,7 @@ var resolveWithIpLookup = async (page, options = {}) => {
8828
8725
  }
8829
8726
  const probeScope = await openProbePage(page);
8830
8727
  if (!probeScope?.page) {
8831
- logger14.warning("ipLookup \u8DF3\u8FC7: \u65E0\u6CD5\u521B\u5EFA probe page");
8728
+ logger13.warning("ipLookup \u8DF3\u8FC7: \u65E0\u6CD5\u521B\u5EFA probe page");
8832
8729
  return null;
8833
8730
  }
8834
8731
  const timeoutMs = Math.max(
@@ -8837,12 +8734,12 @@ var resolveWithIpLookup = async (page, options = {}) => {
8837
8734
  );
8838
8735
  try {
8839
8736
  const probePage = probeScope.page;
8840
- logger14.info(`ipLookup \u5C1D\u8BD5: url=${DEFAULT_IP_LOOKUP_URL}, timeoutMs=${timeoutMs}`);
8737
+ logger13.info(`ipLookup \u5C1D\u8BD5: url=${DEFAULT_IP_LOOKUP_URL}, timeoutMs=${timeoutMs}`);
8841
8738
  const response = await probePage.goto(DEFAULT_IP_LOOKUP_URL, {
8842
8739
  waitUntil: "commit",
8843
8740
  timeout: timeoutMs
8844
8741
  }).catch((error) => {
8845
- logger14.warning(`ipLookup \u8BF7\u6C42\u5931\u8D25: url=${DEFAULT_IP_LOOKUP_URL}, error=${error instanceof Error ? error.message : String(error)}`);
8742
+ logger13.warning(`ipLookup \u8BF7\u6C42\u5931\u8D25: url=${DEFAULT_IP_LOOKUP_URL}, error=${error instanceof Error ? error.message : String(error)}`);
8846
8743
  return null;
8847
8744
  });
8848
8745
  const status = response && typeof response.status === "function" ? response.status() : 0;
@@ -8864,13 +8761,13 @@ var resolveWithIpLookup = async (page, options = {}) => {
8864
8761
  }
8865
8762
  const parsed = parseIpIpJsonResponse(rawText);
8866
8763
  if (parsed?.ip || parsed?.location) {
8867
- logger14.info(`ipLookup \u6210\u529F: url=${DEFAULT_IP_LOOKUP_URL}, status=${status || "-"}, contentType=${contentType || "-"}, ip=${parsed.ip || "-"}, loc=${parsed.location || "-"}`);
8764
+ logger13.info(`ipLookup \u6210\u529F: url=${DEFAULT_IP_LOOKUP_URL}, status=${status || "-"}, contentType=${contentType || "-"}, ip=${parsed.ip || "-"}, loc=${parsed.location || "-"}`);
8868
8765
  return parsed;
8869
8766
  }
8870
- logger14.warning(`ipLookup \u672A\u89E3\u6790\u51FA IP/Loc: url=${DEFAULT_IP_LOOKUP_URL}, status=${status || "-"}, contentType=${contentType || "-"}, preview=${shortenTail(rawText, 120) || "[empty]"}`);
8767
+ logger13.warning(`ipLookup \u672A\u89E3\u6790\u51FA IP/Loc: url=${DEFAULT_IP_LOOKUP_URL}, status=${status || "-"}, contentType=${contentType || "-"}, preview=${shortenTail(rawText, 120) || "[empty]"}`);
8871
8768
  return null;
8872
8769
  } catch (error) {
8873
- logger14.warning(`ipLookup \u6267\u884C\u5F02\u5E38\uFF0C\u672A\u83B7\u5F97 IP/Loc: ${error instanceof Error ? error.message : String(error)}`);
8770
+ logger13.warning(`ipLookup \u6267\u884C\u5F02\u5E38\uFF0C\u672A\u83B7\u5F97 IP/Loc: ${error instanceof Error ? error.message : String(error)}`);
8874
8771
  return null;
8875
8772
  } finally {
8876
8773
  await probeScope.close().catch(() => {
@@ -8884,10 +8781,10 @@ var resolveEnrichment = async (page, baseMeta, options) => {
8884
8781
  ip: toInline(options.ip, 80),
8885
8782
  location: toInline(options.location, 80)
8886
8783
  };
8887
- logger14.info(`enrichment \u5F00\u59CB: host=${baseMeta.hostname || "-"}, hasPresetIp=${Boolean(merged.ip)}, hasPresetLoc=${Boolean(merged.location)}, ipLookup=${options.ipLookup !== false}`);
8784
+ logger13.info(`enrichment \u5F00\u59CB: host=${baseMeta.hostname || "-"}, hasPresetIp=${Boolean(merged.ip)}, hasPresetLoc=${Boolean(merged.location)}, ipLookup=${options.ipLookup !== false}`);
8888
8785
  if (!merged.ip || !merged.location) {
8889
8786
  if (cached?.ip || cached?.location) {
8890
- logger14.info(`enrichment \u547D\u4E2D\u4E0A\u4E0B\u6587\u7F13\u5B58: ip=${cached.ip || "-"}, loc=${cached.location || "-"}`);
8787
+ logger13.info(`enrichment \u547D\u4E2D\u4E0A\u4E0B\u6587\u7F13\u5B58: ip=${cached.ip || "-"}, loc=${cached.location || "-"}`);
8891
8788
  }
8892
8789
  fillEnrichment(merged, cached);
8893
8790
  }
@@ -8911,15 +8808,15 @@ var resolveEnrichment = async (page, baseMeta, options) => {
8911
8808
  "x-geo-country"
8912
8809
  ]), 80);
8913
8810
  if (!merged.location || isWeakLocationValue(merged.location) && headerLocation) {
8914
- logger14.info(`enrichment \u4F7F\u7528\u54CD\u5E94\u5934\u8865\u5145 Loc: ${headerLocation || "-"}`);
8811
+ logger13.info(`enrichment \u4F7F\u7528\u54CD\u5E94\u5934\u8865\u5145 Loc: ${headerLocation || "-"}`);
8915
8812
  merged.location = headerLocation || merged.location;
8916
8813
  }
8917
8814
  }
8918
8815
  writeCachedEnrichment(page, merged);
8919
8816
  if (merged.ip || merged.location) {
8920
- logger14.info(`enrichment \u5B8C\u6210: ip=${merged.ip || "-"}, loc=${merged.location || "-"}`);
8817
+ logger13.info(`enrichment \u5B8C\u6210: ip=${merged.ip || "-"}, loc=${merged.location || "-"}`);
8921
8818
  } else {
8922
- logger14.warning("enrichment \u5B8C\u6210: \u672A\u83B7\u5F97 IP/Loc");
8819
+ logger13.warning("enrichment \u5B8C\u6210: \u672A\u83B7\u5F97 IP/Loc");
8923
8820
  }
8924
8821
  return merged;
8925
8822
  };
@@ -9732,7 +9629,7 @@ var watermarkifyScreenshotBuffer = async (buffer, meta, page = null, options = {
9732
9629
  }
9733
9630
  const imageInfo = readImageInfo(buffer);
9734
9631
  if (!imageInfo.width || !imageInfo.height || !imageInfo.mimeType) {
9735
- logger14.warning("watermarkify \u8DF3\u8FC7: \u65E0\u6CD5\u89E3\u6790\u622A\u56FE\u5C3A\u5BF8\u6216\u683C\u5F0F");
9632
+ logger13.warning("watermarkify \u8DF3\u8FC7: \u65E0\u6CD5\u89E3\u6790\u622A\u56FE\u5C3A\u5BF8\u6216\u683C\u5F0F");
9736
9633
  return buffer;
9737
9634
  }
9738
9635
  const isMobileStrip = normalizeDevice(meta.device) === Device.Mobile && hasStrip;
@@ -9750,7 +9647,7 @@ var watermarkifyScreenshotBuffer = async (buffer, meta, page = null, options = {
9750
9647
 
9751
9648
  // src/internals/compression.js
9752
9649
  var import_jimp = require("jimp");
9753
- var logger15 = createInternalLogger("Compression");
9650
+ var logger14 = createInternalLogger("Compression");
9754
9651
  var DEFAULT_SCREENSHOT_MAX_BYTES = 5 * 1024 * 1024;
9755
9652
  var DEFAULT_SCREENSHOT_OUTPUT_TYPE = "jpeg";
9756
9653
  var DEFAULT_SCREENSHOT_QUALITY = 0.72;
@@ -9869,18 +9766,18 @@ var compressImageBufferToBase64 = async (buffer, compression) => {
9869
9766
  return buffer.toString("base64");
9870
9767
  }
9871
9768
  const result = await compressImageBuffer(buffer, compression).catch((error) => {
9872
- logger15.warning(`captureScreen \u538B\u7F29\u5931\u8D25\uFF0C\u8FD4\u56DE\u539F\u56FE: ${error instanceof Error ? error.message : String(error)}`);
9769
+ logger14.warning(`captureScreen \u538B\u7F29\u5931\u8D25\uFF0C\u8FD4\u56DE\u539F\u56FE: ${error instanceof Error ? error.message : String(error)}`);
9873
9770
  return null;
9874
9771
  });
9875
9772
  if (!result?.buffer) {
9876
9773
  return buffer.toString("base64");
9877
9774
  }
9878
9775
  if (result.withinLimit) {
9879
- logger15.info(
9776
+ logger14.info(
9880
9777
  `captureScreen \u5DF2\u538B\u7F29: ${originalBytes} -> ${result.bytes} bytes, format=${result.format}, quality=${result.quality}, scale=${result.scale}, size=${result.width}x${result.height}`
9881
9778
  );
9882
9779
  } else {
9883
- logger15.warning(
9780
+ logger14.warning(
9884
9781
  `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}`
9885
9782
  );
9886
9783
  }
@@ -9888,7 +9785,7 @@ var compressImageBufferToBase64 = async (buffer, compression) => {
9888
9785
  };
9889
9786
 
9890
9787
  // src/share.js
9891
- var logger16 = createInternalLogger("Share");
9788
+ var logger15 = createInternalLogger("Share");
9892
9789
  var DEFAULT_TIMEOUT_MS2 = 50 * 1e3;
9893
9790
  var DEFAULT_PAYLOAD_SNAPSHOT_MAX_LEN = 500;
9894
9791
  var DEFAULT_POLL_INTERVAL_MS = 120;
@@ -10025,7 +9922,7 @@ var createDomShareMonitor = async (page, options = {}) => {
10025
9922
  const onMatch = typeof options.onMatch === "function" ? options.onMatch : null;
10026
9923
  const onTelemetry = typeof options.onTelemetry === "function" ? options.onTelemetry : null;
10027
9924
  let matched = false;
10028
- logger16.info(`DOM \u76D1\u542C\u51C6\u5907\u6302\u8F7D: selectors=${toJsonInline(selectors, 120)}, mode=${mode}`);
9925
+ logger15.info(`DOM \u76D1\u542C\u51C6\u5907\u6302\u8F7D: selectors=${toJsonInline(selectors, 120)}, mode=${mode}`);
10029
9926
  const monitor = await Mutation.useMonitor(page, selectors, {
10030
9927
  mode,
10031
9928
  onMutation: (context = {}) => {
@@ -10043,12 +9940,12 @@ ${text}`;
10043
9940
  });
10044
9941
  }
10045
9942
  if (mutationCount <= 5 || mutationCount % 50 === 0) {
10046
- logger16.info(`DOM \u53D8\u5316\u5DF2\u6355\u83B7: mutationCount=${mutationCount}, mutationNodes=${mutationNodes.length}`);
9943
+ logger15.info(`DOM \u53D8\u5316\u5DF2\u6355\u83B7: mutationCount=${mutationCount}, mutationNodes=${mutationNodes.length}`);
10047
9944
  }
10048
9945
  const [candidate] = Utils.parseLinks(rawDom, { prefix }) || [];
10049
9946
  if (!candidate) return;
10050
9947
  matched = true;
10051
- logger16.success("captureLink.domHit", `DOM \u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: mutationCount=${mutationCount}, link=${candidate}`);
9948
+ logger15.success("captureLink.domHit", `DOM \u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: mutationCount=${mutationCount}, link=${candidate}`);
10052
9949
  if (onMatch) {
10053
9950
  onMatch({
10054
9951
  link: candidate,
@@ -10064,7 +9961,7 @@ ${text}`;
10064
9961
  return {
10065
9962
  stop: async () => {
10066
9963
  const result = await monitor.stop();
10067
- logger16.info(`DOM \u76D1\u542C\u5DF2\u505C\u6B62: totalMutations=${result?.totalMutations || 0}`);
9964
+ logger15.info(`DOM \u76D1\u542C\u5DF2\u505C\u6B62: totalMutations=${result?.totalMutations || 0}`);
10068
9965
  return result;
10069
9966
  }
10070
9967
  };
@@ -10113,8 +10010,8 @@ var Share = {
10113
10010
  if (share.mode === "response" && apiMatchers.length === 0) {
10114
10011
  throw new Error("Share.captureLink requires share.xurl[0] api matcher when mode=response");
10115
10012
  }
10116
- logger16.start("captureLink", `mode=${share.mode}, timeoutMs=${timeoutDisabled ? "disabled" : timeoutMs}, prefix=${share.prefix}`);
10117
- logger16.info(`captureLink \u914D\u7F6E: xurl=${toJsonInline(share.xurl)}, domMode=${domMode}, domSelectors=${toJsonInline(domSelectors, 120)}`);
10013
+ logger15.start("captureLink", `mode=${share.mode}, timeoutMs=${timeoutDisabled ? "disabled" : timeoutMs}, prefix=${share.prefix}`);
10014
+ logger15.info(`captureLink \u914D\u7F6E: xurl=${toJsonInline(share.xurl)}, domMode=${domMode}, domSelectors=${toJsonInline(domSelectors, 120)}`);
10118
10015
  const stats = {
10119
10016
  actionTimedOut: false,
10120
10017
  domMutationCount: 0,
@@ -10126,7 +10023,7 @@ var Share = {
10126
10023
  responseSampleUrls: []
10127
10024
  };
10128
10025
  if (isAborted()) {
10129
- logger16.warning(`captureLink \u5DF2\u53D6\u6D88: ${abortReason()}`);
10026
+ logger15.warning(`captureLink \u5DF2\u53D6\u6D88: ${abortReason()}`);
10130
10027
  return {
10131
10028
  link: null,
10132
10029
  payloadText: "",
@@ -10149,7 +10046,7 @@ var Share = {
10149
10046
  link: validated,
10150
10047
  payloadText: String(payloadText || "")
10151
10048
  };
10152
- logger16.info(`\u5019\u9009\u94FE\u63A5\u5DF2\u786E\u8BA4: source=${source}, link=${validated}`);
10049
+ logger15.info(`\u5019\u9009\u94FE\u63A5\u5DF2\u786E\u8BA4: source=${source}, link=${validated}`);
10153
10050
  return true;
10154
10051
  };
10155
10052
  const resolveResponseCandidate = (responseText) => {
@@ -10184,7 +10081,7 @@ var Share = {
10184
10081
  try {
10185
10082
  await monitor.stop();
10186
10083
  } catch (error) {
10187
- logger16.warning(`\u505C\u6B62 DOM \u76D1\u542C\u5931\u8D25: ${error instanceof Error ? error.message : String(error)}`);
10084
+ logger15.warning(`\u505C\u6B62 DOM \u76D1\u542C\u5931\u8D25: ${error instanceof Error ? error.message : String(error)}`);
10188
10085
  }
10189
10086
  };
10190
10087
  const onResponse = async (response) => {
@@ -10198,29 +10095,29 @@ var Share = {
10198
10095
  stats.responseSampleUrls.push(url);
10199
10096
  }
10200
10097
  if (stats.responseObserved <= 5) {
10201
- logger16.info(`\u63A5\u53E3\u54CD\u5E94\u91C7\u6837(${stats.responseObserved}): ${url}`);
10098
+ logger15.info(`\u63A5\u53E3\u54CD\u5E94\u91C7\u6837(${stats.responseObserved}): ${url}`);
10202
10099
  }
10203
10100
  if (!apiMatchers.some((matcher) => url.includes(matcher))) return;
10204
10101
  stats.responseMatched += 1;
10205
10102
  stats.lastMatchedUrl = url;
10206
- logger16.info(`\u63A5\u53E3\u547D\u4E2D\u5339\u914D(${stats.responseMatched}): ${url}`);
10103
+ logger15.info(`\u63A5\u53E3\u547D\u4E2D\u5339\u914D(${stats.responseMatched}): ${url}`);
10207
10104
  const text = await response.text();
10208
10105
  const hit = resolveResponseCandidate(text);
10209
10106
  if (!hit?.link) {
10210
10107
  if (stats.responseMatched <= 3) {
10211
- logger16.info(`\u63A5\u53E3\u89E3\u6790\u5B8C\u6210\u4F46\u672A\u63D0\u53D6\u5230\u5206\u4EAB\u94FE\u63A5: payloadSize=${text.length}`);
10108
+ logger15.info(`\u63A5\u53E3\u89E3\u6790\u5B8C\u6210\u4F46\u672A\u63D0\u53D6\u5230\u5206\u4EAB\u94FE\u63A5: payloadSize=${text.length}`);
10212
10109
  }
10213
10110
  return;
10214
10111
  }
10215
10112
  stats.responseResolved += 1;
10216
- logger16.success("captureLink.responseHit", `\u63A5\u53E3\u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: url=${url}, link=${hit.link}`);
10113
+ logger15.success("captureLink.responseHit", `\u63A5\u53E3\u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: url=${url}, link=${hit.link}`);
10217
10114
  setCandidate("response", hit.link, hit.payloadText);
10218
10115
  } catch (error) {
10219
- logger16.warning(`\u63A5\u53E3\u54CD\u5E94\u5904\u7406\u5F02\u5E38: ${error instanceof Error ? error.message : String(error)}`);
10116
+ logger15.warning(`\u63A5\u53E3\u54CD\u5E94\u5904\u7406\u5F02\u5E38: ${error instanceof Error ? error.message : String(error)}`);
10220
10117
  }
10221
10118
  };
10222
10119
  if (share.mode === "dom") {
10223
- logger16.info("\u5F53\u524D\u4E3A DOM \u6A21\u5F0F\uFF0C\u4EC5\u542F\u7528 DOM \u76D1\u542C");
10120
+ logger15.info("\u5F53\u524D\u4E3A DOM \u6A21\u5F0F\uFF0C\u4EC5\u542F\u7528 DOM \u76D1\u542C");
10224
10121
  domMonitor = await createDomShareMonitor(page, {
10225
10122
  prefix: share.prefix,
10226
10123
  selectors: domSelectors,
@@ -10235,17 +10132,17 @@ var Share = {
10235
10132
  });
10236
10133
  }
10237
10134
  if (share.mode === "response") {
10238
- logger16.info(`\u5F53\u524D\u4E3A\u63A5\u53E3\u6A21\u5F0F\uFF0C\u6302\u8F7D response \u76D1\u542C: apiMatchers=${toJsonInline(apiMatchers, 160)}`);
10135
+ logger15.info(`\u5F53\u524D\u4E3A\u63A5\u53E3\u6A21\u5F0F\uFF0C\u6302\u8F7D response \u76D1\u542C: apiMatchers=${toJsonInline(apiMatchers, 160)}`);
10239
10136
  page.on("response", onResponse);
10240
10137
  }
10241
10138
  if (share.mode === "custom") {
10242
- logger16.info("\u5F53\u524D\u4E3A custom \u6A21\u5F0F\uFF0C\u5C06\u4F7F\u7528 performActions \u8FD4\u56DE\u503C");
10139
+ logger15.info("\u5F53\u524D\u4E3A custom \u6A21\u5F0F\uFF0C\u5C06\u4F7F\u7528 performActions \u8FD4\u56DE\u503C");
10243
10140
  }
10244
10141
  const deadline = timeoutDisabled ? Infinity : Date.now() + timeoutMs;
10245
10142
  const getRemainingMs = () => timeoutDisabled ? Infinity : Math.max(0, deadline - Date.now());
10246
10143
  try {
10247
10144
  const actionTimeout = getRemainingMs();
10248
- logger16.start("captureLink.performActions", `\u6267\u884C\u52A8\u4F5C\u9884\u7B97=${timeoutDisabled ? "disabled" : `${actionTimeout}ms`}`);
10145
+ logger15.start("captureLink.performActions", `\u6267\u884C\u52A8\u4F5C\u9884\u7B97=${timeoutDisabled ? "disabled" : `${actionTimeout}ms`}`);
10249
10146
  let actionValue;
10250
10147
  if (!isAborted() && actionTimeout > 0) {
10251
10148
  let timer = null;
@@ -10258,30 +10155,30 @@ var Share = {
10258
10155
  ]);
10259
10156
  if (timer) clearTimeout(timer);
10260
10157
  if (actionResult.type === "error") {
10261
- logger16.fail("captureLink.performActions", actionResult.error);
10158
+ logger15.fail("captureLink.performActions", actionResult.error);
10262
10159
  throw actionResult.error;
10263
10160
  }
10264
10161
  if (actionResult.type === "timeout") {
10265
10162
  stats.actionTimedOut = true;
10266
- logger16.warning(`performActions \u5DF2\u8D85\u65F6 (${actionTimeout}ms)\uFF0C\u52A8\u4F5C\u53EF\u80FD\u4ECD\u5728\u5F02\u6B65\u6267\u884C`);
10163
+ logger15.warning(`performActions \u5DF2\u8D85\u65F6 (${actionTimeout}ms)\uFF0C\u52A8\u4F5C\u53EF\u80FD\u4ECD\u5728\u5F02\u6B65\u6267\u884C`);
10267
10164
  } else {
10268
10165
  actionValue = actionResult.result;
10269
- logger16.success("captureLink.performActions", "\u6267\u884C\u52A8\u4F5C\u5B8C\u6210");
10166
+ logger15.success("captureLink.performActions", "\u6267\u884C\u52A8\u4F5C\u5B8C\u6210");
10270
10167
  }
10271
10168
  }
10272
10169
  if (share.mode === "custom") {
10273
10170
  const customLink = typeof actionValue === "string" ? actionValue : actionValue?.link || actionValue?.payloadText;
10274
10171
  const customPayloadText = typeof actionValue === "string" ? actionValue : actionValue?.payloadText;
10275
10172
  if (setCandidate("custom", customLink, customPayloadText)) {
10276
- logger16.success("captureLink.customResult", `custom \u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: link=${candidates.custom.link}`);
10173
+ logger15.success("captureLink.customResult", `custom \u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: link=${candidates.custom.link}`);
10277
10174
  } else {
10278
- logger16.warning("performActions \u6267\u884C\u5B8C\u6210\u4F46\u672A\u8FD4\u56DE\u6709\u6548\u5206\u4EAB\u94FE\u63A5");
10175
+ logger15.warning("performActions \u6267\u884C\u5B8C\u6210\u4F46\u672A\u8FD4\u56DE\u6709\u6548\u5206\u4EAB\u94FE\u63A5");
10279
10176
  }
10280
10177
  }
10281
10178
  let nextProgressLogTs = Date.now() + 3e3;
10282
10179
  while (true) {
10283
10180
  if (isAborted()) {
10284
- logger16.warning(`captureLink \u5DF2\u53D6\u6D88: ${abortReason()}`);
10181
+ logger15.warning(`captureLink \u5DF2\u53D6\u6D88: ${abortReason()}`);
10285
10182
  return {
10286
10183
  link: null,
10287
10184
  payloadText: "",
@@ -10291,7 +10188,7 @@ var Share = {
10291
10188
  }
10292
10189
  const selected = candidates[share.mode];
10293
10190
  if (selected?.link) {
10294
- logger16.success("captureLink", `\u6355\u83B7\u6210\u529F: source=${share.mode}, link=${selected.link}`);
10191
+ logger15.success("captureLink", `\u6355\u83B7\u6210\u529F: source=${share.mode}, link=${selected.link}`);
10295
10192
  return {
10296
10193
  link: selected.link,
10297
10194
  payloadText: selected.payloadText,
@@ -10304,7 +10201,7 @@ var Share = {
10304
10201
  if (remaining <= 0) break;
10305
10202
  const now = Date.now();
10306
10203
  if (now >= nextProgressLogTs) {
10307
- logger16.info(
10204
+ logger15.info(
10308
10205
  `captureLink \u7B49\u5F85\u4E2D: remaining=${timeoutDisabled ? "disabled" : `${remaining}ms`}, domMutationCount=${stats.domMutationCount}, responseMatched=${stats.responseMatched}`
10309
10206
  );
10310
10207
  nextProgressLogTs = now + 5e3;
@@ -10312,11 +10209,11 @@ var Share = {
10312
10209
  await (0, import_delay5.default)(Math.max(0, Math.min(DEFAULT_POLL_INTERVAL_MS, remaining)));
10313
10210
  }
10314
10211
  if (!timeoutDisabled && share.mode === "response" && stats.responseMatched === 0) {
10315
- logger16.warning(
10212
+ logger15.warning(
10316
10213
  `\u63A5\u53E3\u76D1\u542C\u672A\u547D\u4E2D: apiMatchers=${toJsonInline(apiMatchers, 220)}, \u54CD\u5E94\u6837\u672CURLs=${toJsonInline(stats.responseSampleUrls, 420)}`
10317
10214
  );
10318
10215
  }
10319
- logger16.warning(
10216
+ logger15.warning(
10320
10217
  `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"}`
10321
10218
  );
10322
10219
  return {
@@ -10328,7 +10225,7 @@ var Share = {
10328
10225
  } finally {
10329
10226
  if (share.mode === "response") {
10330
10227
  page.off("response", onResponse);
10331
- logger16.info("response \u76D1\u542C\u5DF2\u5378\u8F7D");
10228
+ logger15.info("response \u76D1\u542C\u5DF2\u5378\u8F7D");
10332
10229
  }
10333
10230
  await stopDomMonitor();
10334
10231
  }