@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.js CHANGED
@@ -360,18 +360,18 @@ var fallbackLog = {
360
360
  error: (...args) => console.error(...args),
361
361
  debug: (...args) => console.debug ? console.debug(...args) : console.log(...args)
362
362
  };
363
- var resolveLogMethod = (logger17, name) => {
364
- if (logger17 && typeof logger17[name] === "function") {
365
- return logger17[name].bind(logger17);
363
+ var resolveLogMethod = (logger16, name) => {
364
+ if (logger16 && typeof logger16[name] === "function") {
365
+ return logger16[name].bind(logger16);
366
366
  }
367
- if (name === "warning" && logger17 && typeof logger17.warn === "function") {
368
- return logger17.warn.bind(logger17);
367
+ if (name === "warning" && logger16 && typeof logger16.warn === "function") {
368
+ return logger16.warn.bind(logger16);
369
369
  }
370
370
  return fallbackLog[name];
371
371
  };
372
372
  var defaultLogger = null;
373
- var setDefaultLogger = (logger17) => {
374
- defaultLogger = logger17;
373
+ var setDefaultLogger = (logger16) => {
374
+ defaultLogger = logger16;
375
375
  };
376
376
  var resolveLogger = (explicitLogger) => {
377
377
  if (explicitLogger && typeof explicitLogger.info === "function") {
@@ -398,8 +398,8 @@ var colorize = (text, color) => {
398
398
  var createBaseLogger = (prefix = "", explicitLogger) => {
399
399
  const name = prefix ? String(prefix) : "";
400
400
  const dispatch = (methodName, icon, message, color) => {
401
- const logger17 = resolveLogger(explicitLogger);
402
- const logFn = resolveLogMethod(logger17, methodName);
401
+ const logger16 = resolveLogger(explicitLogger);
402
+ const logFn = resolveLogMethod(logger16, methodName);
403
403
  const timestamp = colorize(`[${formatTimestamp()}]`, ANSI.gray);
404
404
  const line = formatLine(name, icon, message);
405
405
  const coloredLine = colorize(line, color);
@@ -896,7 +896,7 @@ var prepareExpandedFullPageScreenshot = async (page, options = {}) => {
896
896
  viewportResized
897
897
  };
898
898
  };
899
- var restoreExpandedFullPageScreenshot = async (page, state = {}) => {
899
+ var restoreExpandedFullPageScreenshot = async (page, state2 = {}) => {
900
900
  await page.evaluate((className) => {
901
901
  const targets = new Set([
902
902
  ...document.querySelectorAll(`.${className}`),
@@ -920,8 +920,8 @@ var restoreExpandedFullPageScreenshot = async (page, state = {}) => {
920
920
  el.classList.remove(className);
921
921
  });
922
922
  }, EXPANDED_SCROLLABLE_CLASS);
923
- if (state?.originalViewport && state?.viewportResized) {
924
- await page.setViewportSize(state.originalViewport);
923
+ if (state2?.originalViewport && state2?.viewportResized) {
924
+ await page.setViewportSize(state2.originalViewport);
925
925
  }
926
926
  };
927
927
  var capturePageScreenshot = async (page, options = {}) => {
@@ -978,21 +978,21 @@ var capturePageScreenshot = async (page, options = {}) => {
978
978
  }
979
979
  };
980
980
  var captureExpandedFullPageScreenshot = async (page, options = {}) => {
981
- const state = await prepareExpandedFullPageScreenshot(page, options);
981
+ const state2 = await prepareExpandedFullPageScreenshot(page, options);
982
982
  try {
983
983
  return await capturePageScreenshot(page, {
984
984
  fullPage: true,
985
985
  type: options.type || "png",
986
986
  quality: options.quality,
987
987
  timeout: options.timeout,
988
- maxClipHeight: state.targetHeight
988
+ maxClipHeight: state2.targetHeight
989
989
  });
990
990
  } finally {
991
991
  await restoreAffixedElementsForExpandedScreenshot(page).catch((error) => {
992
992
  logger.warning(`\u79FB\u52A8\u7AEF\u5438\u9644\u5143\u7D20\u6062\u590D\u5931\u8D25: ${error?.message || error}`);
993
993
  });
994
994
  if (options.restore) {
995
- await restoreExpandedFullPageScreenshot(page, state);
995
+ await restoreExpandedFullPageScreenshot(page, state2);
996
996
  }
997
997
  }
998
998
  };
@@ -1887,8 +1887,8 @@ var normalizeBrowserProfile = (value) => {
1887
1887
  payload: buildBrowserProfilePayload(core, observed)
1888
1888
  };
1889
1889
  };
1890
- var rememberRuntimeState = (state) => {
1891
- rememberedRuntimeState = deepClone(state);
1890
+ var rememberRuntimeState = (state2) => {
1891
+ rememberedRuntimeState = deepClone(state2);
1892
1892
  return rememberedRuntimeState;
1893
1893
  };
1894
1894
  var normalizeRuntimeState = (source = {}, actor = "") => {
@@ -1947,7 +1947,7 @@ var RuntimeEnv = {
1947
1947
  } else {
1948
1948
  delete normalizedRuntime.browser_profile;
1949
1949
  }
1950
- const state = {
1950
+ const state2 = {
1951
1951
  actor: resolvedActor,
1952
1952
  device,
1953
1953
  runtime: normalizedRuntime,
@@ -1961,73 +1961,73 @@ var RuntimeEnv = {
1961
1961
  browserProfileCore: browserProfile.core,
1962
1962
  browserProfileObserved: browserProfile.observed
1963
1963
  };
1964
- rememberRuntimeState(state);
1965
- return state;
1964
+ rememberRuntimeState(state2);
1965
+ return state2;
1966
1966
  },
1967
1967
  // buildEnvPatch 只构造允许回写到后端 env 的字段集合。
1968
1968
  buildEnvPatch(source = {}, actor = "") {
1969
- const state = normalizeRuntimeState(source, actor);
1970
- const browserProfile = buildBrowserProfilePayload(state.browserProfileCore, state.browserProfileObserved);
1969
+ const state2 = normalizeRuntimeState(source, actor);
1970
+ const browserProfile = buildBrowserProfilePayload(state2.browserProfileCore, state2.browserProfileObserved);
1971
1971
  const envPatch = {
1972
- ...Array.isArray(state.cookies) && state.cookies.length > 0 ? { cookies: state.cookies } : {},
1973
- ...Object.keys(state.localStorage || {}).length > 0 ? { local_storage: state.localStorage } : {},
1974
- ...Object.keys(state.sessionStorage || {}).length > 0 ? { session_storage: state.sessionStorage } : {},
1972
+ ...Array.isArray(state2.cookies) && state2.cookies.length > 0 ? { cookies: state2.cookies } : {},
1973
+ ...Object.keys(state2.localStorage || {}).length > 0 ? { local_storage: state2.localStorage } : {},
1974
+ ...Object.keys(state2.sessionStorage || {}).length > 0 ? { session_storage: state2.sessionStorage } : {},
1975
1975
  ...Object.keys(browserProfile).length > 0 ? { browser_profile: browserProfile } : {}
1976
1976
  };
1977
1977
  return Object.keys(envPatch).length > 0 ? envPatch : null;
1978
1978
  },
1979
1979
  // hasLoginState 只判断 runtime 是否存在有效载荷,不再区分具体字段来源。
1980
1980
  hasLoginState(source = {}, actor = "") {
1981
- const state = normalizeRuntimeState(source, actor);
1982
- return isPlainObject(state.runtime) && Object.keys(state.runtime || {}).length > 0;
1981
+ const state2 = normalizeRuntimeState(source, actor);
1982
+ return isPlainObject(state2.runtime) && Object.keys(state2.runtime || {}).length > 0;
1983
1983
  },
1984
1984
  rememberState(source = {}) {
1985
- const state = normalizeRuntimeState(source);
1986
- rememberRuntimeState(state);
1985
+ const state2 = normalizeRuntimeState(source);
1986
+ rememberRuntimeState(state2);
1987
1987
  return RuntimeEnv.peekRememberedState();
1988
1988
  },
1989
1989
  peekRememberedState() {
1990
1990
  return rememberedRuntimeState ? deepClone(rememberedRuntimeState) : null;
1991
1991
  },
1992
1992
  getBrowserProfileCore(source = {}, actor = "") {
1993
- const state = normalizeRuntimeState(source, actor);
1994
- return deepClone(state.browserProfileCore || {});
1993
+ const state2 = normalizeRuntimeState(source, actor);
1994
+ return deepClone(state2.browserProfileCore || {});
1995
1995
  },
1996
1996
  setBrowserProfileCore(source = {}, core = {}, actor = "") {
1997
- const state = normalizeRuntimeState(source, actor);
1997
+ const state2 = normalizeRuntimeState(source, actor);
1998
1998
  const normalizedCore = normalizeBrowserProfileCore({
1999
1999
  ...core,
2000
- device: normalizeKnownDevice(core?.device) || state.device
2000
+ device: normalizeKnownDevice(core?.device) || state2.device
2001
2001
  });
2002
- state.browserProfileCore = normalizedCore;
2003
- state.browserProfile = buildBrowserProfilePayload(normalizedCore, state.browserProfileObserved);
2004
- if (Object.keys(state.browserProfile).length > 0) {
2005
- state.runtime.browser_profile = state.browserProfile;
2002
+ state2.browserProfileCore = normalizedCore;
2003
+ state2.browserProfile = buildBrowserProfilePayload(normalizedCore, state2.browserProfileObserved);
2004
+ if (Object.keys(state2.browserProfile).length > 0) {
2005
+ state2.runtime.browser_profile = state2.browserProfile;
2006
2006
  } else {
2007
- delete state.runtime.browser_profile;
2007
+ delete state2.runtime.browser_profile;
2008
2008
  }
2009
- rememberRuntimeState(state);
2010
- return state;
2009
+ rememberRuntimeState(state2);
2010
+ return state2;
2011
2011
  },
2012
2012
  // applyToPage 只负责把登录态相关字段注入页面:
2013
2013
  // cookies / localStorage / sessionStorage。
2014
2014
  // 指纹、时区、UA、viewport 的回放发生在 launch.js 启动阶段,不在这里做。
2015
2015
  async applyToPage(page, source = {}, options = {}) {
2016
2016
  if (!page) return;
2017
- let state = normalizeRuntimeState(source, options?.actor || "");
2017
+ let state2 = normalizeRuntimeState(source, options?.actor || "");
2018
2018
  if (typeof options?.preapply === "function") {
2019
- state = await options.preapply(state) || state;
2020
- rememberRuntimeState(state);
2019
+ state2 = await options.preapply(state2) || state2;
2020
+ rememberRuntimeState(state2);
2021
2021
  }
2022
2022
  Object.defineProperty(page, PageRuntimeStateKey, {
2023
2023
  configurable: true,
2024
2024
  enumerable: false,
2025
2025
  writable: true,
2026
- value: state
2026
+ value: state2
2027
2027
  });
2028
- const localStorage = state.localStorage || {};
2029
- const sessionStorage = state.sessionStorage || {};
2030
- const cookies = (state.cookies || []).map((cookie) => {
2028
+ const localStorage = state2.localStorage || {};
2029
+ const sessionStorage = state2.sessionStorage || {};
2030
+ const cookies = (state2.cookies || []).map((cookie) => {
2031
2031
  const normalized = { ...cookie };
2032
2032
  if (!normalized.path) {
2033
2033
  normalized.path = "/";
@@ -2065,8 +2065,8 @@ var RuntimeEnv = {
2065
2065
  },
2066
2066
  // captureEnvPatch 在任务结束时采集最新环境快照,用于 pushSuccess / pushFailed 自动回写。
2067
2067
  async captureEnvPatch(page, source = {}, options = {}) {
2068
- const state = normalizeRuntimeState(source, options?.actor || "");
2069
- const baseline = RuntimeEnv.buildEnvPatch(state) || {};
2068
+ const state2 = normalizeRuntimeState(source, options?.actor || "");
2069
+ const baseline = RuntimeEnv.buildEnvPatch(state2) || {};
2070
2070
  if (!page || typeof page.evaluate !== "function" || typeof page.context !== "function") {
2071
2071
  return Object.keys(baseline).length > 0 ? baseline : null;
2072
2072
  }
@@ -2085,7 +2085,7 @@ var RuntimeEnv = {
2085
2085
  cookies
2086
2086
  },
2087
2087
  {
2088
- browserProfileCore: state.browserProfileCore
2088
+ browserProfileCore: state2.browserProfileCore
2089
2089
  }
2090
2090
  );
2091
2091
  return RuntimeEnv.mergeEnvPatches(baseline, capturedPatch);
@@ -2099,11 +2099,11 @@ var RuntimeEnv = {
2099
2099
  var logger3 = createInternalLogger("ApifyKit");
2100
2100
  var resolveRuntimeContext = (input) => {
2101
2101
  const rememberedState = RuntimeEnv.peekRememberedState();
2102
- const state = rememberedState || RuntimeEnv.parseInput(input || {});
2103
- const envPatch = RuntimeEnv.buildEnvPatch(state) || null;
2102
+ const state2 = rememberedState || RuntimeEnv.parseInput(input || {});
2103
+ const envPatch = RuntimeEnv.buildEnvPatch(state2) || null;
2104
2104
  return {
2105
- actor: state.actor,
2106
- runtime: state.runtime,
2105
+ actor: state2.actor,
2106
+ runtime: state2.runtime,
2107
2107
  envPatch
2108
2108
  };
2109
2109
  };
@@ -2462,6 +2462,57 @@ var Utils = {
2462
2462
  }
2463
2463
  };
2464
2464
 
2465
+ // src/internals/context.js
2466
+ var state = {
2467
+ mode: Mode.Default
2468
+ };
2469
+ var normalizeStrategies = (strategies) => strategies && typeof strategies === "object" ? strategies : {};
2470
+ var ToolkitContext = {
2471
+ get mode() {
2472
+ return state.mode;
2473
+ },
2474
+ setMode(mode = Mode.Default) {
2475
+ state.mode = normalizeMode(mode, Mode.Default);
2476
+ return state.mode;
2477
+ }
2478
+ };
2479
+ var getToolkitMode = () => state.mode;
2480
+ var setToolkitMode = (mode = Mode.Default) => ToolkitContext.setMode(mode);
2481
+ var resolveModeStrategy = (strategies = {}, mode = getToolkitMode(), fallbackMode = Mode.Default) => {
2482
+ const normalizedStrategies = normalizeStrategies(strategies);
2483
+ const normalizedMode = normalizeMode(mode, fallbackMode);
2484
+ const delegate = normalizedStrategies[normalizedMode] ?? normalizedStrategies[fallbackMode] ?? Object.values(normalizedStrategies).find(Boolean) ?? null;
2485
+ return {
2486
+ mode: normalizedMode,
2487
+ delegate
2488
+ };
2489
+ };
2490
+
2491
+ // src/internals/delegate.js
2492
+ var normalizeMethodDefinition = (definition) => typeof definition === "string" ? { name: definition, enumerable: true } : {
2493
+ name: String(definition?.name || "").trim(),
2494
+ enumerable: definition?.enumerable !== false
2495
+ };
2496
+ var createMethodDescriptor = (namespace, methodName, enumerable, strategies) => ({
2497
+ enumerable,
2498
+ value: (...args) => {
2499
+ const { mode, delegate } = resolveModeStrategy(strategies);
2500
+ if (typeof delegate?.[methodName] !== "function") {
2501
+ throw new Error(`${namespace}.${methodName} is not available in ${mode} mode`);
2502
+ }
2503
+ return delegate[methodName](...args);
2504
+ }
2505
+ });
2506
+ var createDelegatedFacade = (namespace, strategies = {}, methods = []) => {
2507
+ const descriptors = Object.fromEntries(
2508
+ methods.map(normalizeMethodDefinition).filter((method) => method.name).map((method) => [
2509
+ method.name,
2510
+ createMethodDescriptor(namespace, method.name, method.enumerable, strategies)
2511
+ ])
2512
+ );
2513
+ return Object.defineProperties({}, descriptors);
2514
+ };
2515
+
2465
2516
  // src/internals/anti-cheat/default.js
2466
2517
  var BASE_CONFIG = Object.freeze({
2467
2518
  locale: "zh-CN",
@@ -2535,43 +2586,52 @@ var DefaultAntiCheat = {
2535
2586
  };
2536
2587
 
2537
2588
  // src/internals/anti-cheat/cloakbrowser.js
2538
- var CloakBrowserAntiCheat = DefaultAntiCheat;
2539
-
2540
- // src/internals/toolkit-mode.js
2541
- var currentMode = Mode.Default;
2542
- var getToolkitMode = () => currentMode;
2543
- var setToolkitMode = (mode = Mode.Default) => {
2544
- currentMode = normalizeMode(mode, Mode.Default);
2545
- return currentMode;
2546
- };
2547
-
2548
- // src/anti-cheat.js
2549
- var resolveAntiCheatDelegate = () => getToolkitMode() === Mode.CloakBrowser ? CloakBrowserAntiCheat : DefaultAntiCheat;
2550
- var callAntiCheat = (method, ...args) => {
2551
- const delegate = resolveAntiCheatDelegate();
2552
- if (typeof delegate?.[method] !== "function") {
2553
- throw new Error(`AntiCheat.${method} is not available in ${getToolkitMode()} mode`);
2554
- }
2555
- return delegate[method](...args);
2556
- };
2557
- var AntiCheat = {
2589
+ var CLOAK_BROWSER_BASE_CONFIG = Object.freeze({
2590
+ locale: "",
2591
+ acceptLanguage: "",
2592
+ timezoneId: "",
2593
+ timezoneOffset: null,
2594
+ geolocation: null
2595
+ });
2596
+ var normalizeHeaders = (headers) => headers && typeof headers === "object" ? headers : {};
2597
+ var CloakBrowserAntiCheat = {
2598
+ /**
2599
+ * CloakBrowser 自身会负责浏览器指纹,toolkit 在该模式下尽量不再注入额外反检测配置。
2600
+ */
2558
2601
  getBaseConfig() {
2559
- return callAntiCheat("getBaseConfig");
2602
+ return { ...CLOAK_BROWSER_BASE_CONFIG };
2560
2603
  },
2561
- getFingerprintGeneratorOptions(options = {}) {
2562
- return callAntiCheat("getFingerprintGeneratorOptions", options);
2604
+ getFingerprintGeneratorOptions() {
2605
+ return {};
2563
2606
  },
2564
- getLaunchArgs(options = {}) {
2565
- return callAntiCheat("getLaunchArgs", options);
2607
+ getLaunchArgs() {
2608
+ return [];
2566
2609
  },
2567
- getTlsFingerprintOptions(userAgent = "", acceptLanguage = "", options = {}) {
2568
- return callAntiCheat("getTlsFingerprintOptions", userAgent, acceptLanguage, options);
2610
+ getTlsFingerprintOptions() {
2611
+ return {};
2569
2612
  },
2570
2613
  applyLocaleHeaders(headers, acceptLanguage = "") {
2571
- return callAntiCheat("applyLocaleHeaders", headers, acceptLanguage);
2614
+ const normalizedHeaders = normalizeHeaders(headers);
2615
+ if (acceptLanguage && !normalizedHeaders["accept-language"]) {
2616
+ normalizedHeaders["accept-language"] = acceptLanguage;
2617
+ }
2618
+ return normalizedHeaders;
2572
2619
  }
2573
2620
  };
2574
2621
 
2622
+ // src/anti-cheat.js
2623
+ var antiCheatStrategies = {
2624
+ [Mode.Default]: DefaultAntiCheat,
2625
+ [Mode.CloakBrowser]: CloakBrowserAntiCheat
2626
+ };
2627
+ var AntiCheat = createDelegatedFacade("AntiCheat", antiCheatStrategies, [
2628
+ "getBaseConfig",
2629
+ "getFingerprintGeneratorOptions",
2630
+ "getLaunchArgs",
2631
+ "getTlsFingerprintOptions",
2632
+ "applyLocaleHeaders"
2633
+ ]);
2634
+
2575
2635
  // src/device-input.js
2576
2636
  var resolveDeviceFromPage = (page) => normalizeDevice(page?.[PageRuntimeStateKey]?.device);
2577
2637
  var assertPage = (page, method) => {
@@ -2971,12 +3031,12 @@ var resolveDescriptor = (descriptor, device) => {
2971
3031
  }
2972
3032
  return resolved;
2973
3033
  };
2974
- var attachRuntimeState = (page, state) => {
3034
+ var attachRuntimeState = (page, state2) => {
2975
3035
  Object.defineProperty(page, PageRuntimeStateKey, {
2976
3036
  configurable: true,
2977
3037
  enumerable: false,
2978
3038
  writable: true,
2979
- value: state
3039
+ value: state2
2980
3040
  });
2981
3041
  };
2982
3042
  var restoreRuntimeState = (page, snapshot) => {
@@ -4030,7 +4090,7 @@ var restoreWindowFromSnapshot = async (page, before, after) => {
4030
4090
  return;
4031
4091
  }
4032
4092
  await page.evaluate(
4033
- (state) => window.scrollTo(state.x, state.y),
4093
+ (state2) => window.scrollTo(state2.x, state2.y),
4034
4094
  { x: Number(before.scrollX || 0), y: Number(before.scrollY || 0) }
4035
4095
  ).catch(() => {
4036
4096
  });
@@ -4276,7 +4336,7 @@ var MobileHumanize = {
4276
4336
  if (scrollRect && beforeWindowState) {
4277
4337
  const afterWindowState = await page.evaluate(() => ({ x: window.scrollX, y: window.scrollY }));
4278
4338
  if (Math.abs(afterWindowState.x - beforeWindowState.x) > 2 || Math.abs(afterWindowState.y - beforeWindowState.y) > 2) {
4279
- await page.evaluate((state) => window.scrollTo(state.x, state.y), beforeWindowState);
4339
+ await page.evaluate((state2) => window.scrollTo(state2.x, state2.y), beforeWindowState);
4280
4340
  logger6.debug(`humanScroll | \u7A97\u53E3\u6EDA\u52A8\u56DE\u6536 from=${Math.round(afterWindowState.y)} to=${Math.round(beforeWindowState.y)}`);
4281
4341
  }
4282
4342
  }
@@ -4643,23 +4703,60 @@ var DefaultHumanize = {
4643
4703
 
4644
4704
  // src/internals/humanize/cloakbrowser.js
4645
4705
  import delay4 from "delay";
4646
- var logger7 = createInternalLogger("Humanize.CloakBrowser");
4647
- var humanizedPages = /* @__PURE__ */ new WeakSet();
4648
- var cachedCloakHumanModulePromise = null;
4649
4706
  var isPageLike2 = (value) => value && typeof value === "object" && typeof value.evaluate === "function";
4650
4707
  var isPoint2 = (value) => value && typeof value === "object" && Number.isFinite(Number(value.x)) && Number.isFinite(Number(value.y));
4651
4708
  var resolveDeviceFromPage3 = (page) => normalizeDevice(page?.[PageRuntimeStateKey]?.device);
4652
4709
  var isMobilePage = (page) => resolveDeviceFromPage3(page) === Device.Mobile;
4653
- var loadCloakHumanModule = async () => {
4654
- if (!cachedCloakHumanModulePromise) {
4655
- cachedCloakHumanModulePromise = import("cloakbrowser/human").catch((error) => {
4656
- cachedCloakHumanModulePromise = null;
4657
- 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", {
4658
- cause: error
4710
+ var resolveNativeTarget2 = (page, target) => typeof target === "string" ? page.locator(target).first() : target;
4711
+ var targetExists = async (target) => {
4712
+ if (!target) {
4713
+ return false;
4714
+ }
4715
+ if (typeof target.count === "function") {
4716
+ const count = await target.count().catch(() => 0);
4717
+ return count > 0;
4718
+ }
4719
+ if (typeof target.elementHandle === "function") {
4720
+ const handle = await target.elementHandle().catch(() => null);
4721
+ try {
4722
+ return Boolean(handle);
4723
+ } finally {
4724
+ await handle?.dispose?.().catch(() => {
4659
4725
  });
4660
- });
4726
+ }
4727
+ }
4728
+ return true;
4729
+ };
4730
+ var getTargetBoundingBox2 = async (target) => {
4731
+ if (!target) {
4732
+ return null;
4733
+ }
4734
+ if (typeof target.boundingBox === "function") {
4735
+ return await target.boundingBox().catch(() => null);
4736
+ }
4737
+ if (typeof target.elementHandle === "function") {
4738
+ const handle = await target.elementHandle().catch(() => null);
4739
+ try {
4740
+ return await handle?.boundingBox?.().catch(() => null);
4741
+ } finally {
4742
+ await handle?.dispose?.().catch(() => {
4743
+ });
4744
+ }
4745
+ }
4746
+ return null;
4747
+ };
4748
+ var resolveActionTarget = async (page, target, { throwOnMissing = true } = {}) => {
4749
+ if (target == null) {
4750
+ return null;
4751
+ }
4752
+ const resolvedTarget = resolveNativeTarget2(page, target);
4753
+ if (throwOnMissing || await targetExists(resolvedTarget)) {
4754
+ return resolvedTarget;
4661
4755
  }
4662
- return cachedCloakHumanModulePromise;
4756
+ return null;
4757
+ };
4758
+ var readViewportScroll = async (page) => {
4759
+ return await page.evaluate(() => ({ x: window.scrollX, y: window.scrollY })).catch(() => ({ x: 0, y: 0 }));
4663
4760
  };
4664
4761
  var buildTypingHumanConfig = (options = {}) => {
4665
4762
  const humanConfig = {};
@@ -4679,264 +4776,109 @@ var buildTypingHumanConfig = (options = {}) => {
4679
4776
  return Object.keys(humanConfig).length > 0 ? humanConfig : null;
4680
4777
  };
4681
4778
  var buildActionOptions = (options = {}) => {
4682
- const actionOptions = {};
4779
+ const actionOptions = {
4780
+ force: true
4781
+ };
4683
4782
  if (options && options.timeout != null) {
4684
4783
  actionOptions.timeout = options.timeout;
4685
4784
  }
4686
- if (options && options.force != null) {
4687
- actionOptions.force = options.force;
4688
- }
4689
4785
  const humanConfig = buildTypingHumanConfig(options);
4690
4786
  if (humanConfig) {
4691
4787
  actionOptions.human_config = humanConfig;
4692
4788
  }
4693
4789
  return actionOptions;
4694
4790
  };
4695
- var getErrorMessage = (error) => {
4696
- if (typeof error === "string") return error;
4697
- if (error && typeof error.message === "string") return error.message;
4698
- return String(error ?? "");
4699
- };
4700
- var isPointerEventsCoveredError = (error) => {
4701
- const message = getErrorMessage(error).toLowerCase();
4702
- return message.includes("pointer_events") && (message.includes("covered by") || message.includes("receiving events"));
4703
- };
4704
- var withPointerEventsForceFallback = async (label, options, operation) => {
4705
- try {
4706
- return await operation(options);
4707
- } catch (error) {
4708
- if (options?.force || !isPointerEventsCoveredError(error)) {
4709
- throw error;
4710
- }
4711
- logger7.warn(`${label}: cloakbrowser pointer_events check failed, retrying with force=true (${getErrorMessage(error)})`);
4712
- return await operation({
4713
- ...options || {},
4714
- force: true
4715
- });
4716
- }
4717
- };
4718
- var ensureDesktopHumanized = async (page) => {
4719
- if (!page || typeof page !== "object") {
4720
- throw new Error("Humanize requires a Playwright page");
4721
- }
4722
- const humanModule = await loadCloakHumanModule();
4723
- if (page._original && page._humanCursor) {
4724
- humanizedPages.add(page);
4725
- return humanModule;
4726
- }
4727
- if (humanizedPages.has(page)) {
4728
- return humanModule;
4729
- }
4730
- const config = page._humanCfg || humanModule.resolveConfig?.("default") || humanModule.resolveConfig?.();
4731
- const cursor = page._humanCursor || { x: 0, y: 0, initialized: false };
4732
- humanModule.patchPage(page, config, cursor);
4733
- humanizedPages.add(page);
4734
- return humanModule;
4735
- };
4736
- var patchHandle = async (page, handle) => {
4737
- if (!handle || typeof handle !== "object") return handle;
4738
- const humanModule = await ensureDesktopHumanized(page);
4739
- humanModule.patchSingleElementHandle(
4740
- handle,
4741
- page,
4742
- page._humanCfg,
4743
- page._humanCursor,
4744
- page._humanRaw,
4745
- page._humanRawKb,
4746
- page._humanOriginals,
4747
- page._stealth
4748
- );
4749
- return handle;
4750
- };
4751
- var resolvePatchedTarget = async (page, target, { throwOnMissing = true } = {}) => {
4752
- if (target == null) {
4753
- return { target: null, dispose: null };
4754
- }
4755
- if (typeof target === "string") {
4756
- const handle = await page.$(target);
4757
- if (!handle) {
4758
- if (throwOnMissing) {
4759
- throw new Error(`\u627E\u4E0D\u5230\u5143\u7D20 ${String(target)}`);
4760
- }
4761
- return { target: null, dispose: null };
4762
- }
4763
- return { target: handle, dispose: null };
4764
- }
4765
- if (typeof target.elementHandle === "function") {
4766
- const handle = await target.elementHandle();
4767
- if (!handle) {
4768
- if (throwOnMissing) {
4769
- throw new Error("\u627E\u4E0D\u5230 locator \u5BF9\u5E94\u7684\u5143\u7D20");
4770
- }
4771
- return { target: null, dispose: null };
4772
- }
4773
- await patchHandle(page, handle);
4774
- return {
4775
- target: handle,
4776
- dispose: async () => {
4777
- await handle.dispose().catch(() => {
4778
- });
4779
- }
4780
- };
4781
- }
4782
- await patchHandle(page, target);
4783
- return { target, dispose: null };
4784
- };
4785
4791
  var jitterSleep = async (baseMs, jitterPercent = 0.3) => {
4786
4792
  await delay4(jitterMs(baseMs, jitterPercent));
4787
4793
  };
4788
- var humanMoveToPoint = async (page, point) => {
4789
- await ensureDesktopHumanized(page);
4794
+ var moveCursorToPoint = async (page, point) => {
4790
4795
  await page.mouse.move(Number(point.x), Number(point.y));
4791
4796
  return true;
4792
4797
  };
4793
- var doDesktopHumanClick = async (page, target, options = {}) => {
4794
- await ensureDesktopHumanized(page);
4795
- return await withPointerEventsForceFallback("humanClick", options, async (effectiveOptions = {}) => {
4796
- if (target == null) {
4797
- const cursor = page._humanCursor || { x: 0, y: 0 };
4798
- await page.mouse.click(cursor.x || 0, cursor.y || 0);
4799
- return true;
4800
- }
4801
- if (isPoint2(target)) {
4802
- return humanMoveToPoint(page, target).then(async () => {
4803
- await page.mouse.click(Number(target.x), Number(target.y));
4804
- return true;
4805
- });
4806
- }
4807
- const throwOnMissing = effectiveOptions.throwOnMissing !== false;
4808
- if (typeof target === "string") {
4809
- if (!throwOnMissing) {
4810
- const existingHandle = await page.$(target);
4811
- if (!existingHandle) {
4812
- return false;
4813
- }
4814
- await existingHandle.click(buildActionOptions(effectiveOptions));
4815
- return true;
4816
- }
4817
- await page.click(target, buildActionOptions(effectiveOptions));
4818
- return true;
4819
- }
4820
- const { target: resolvedTarget, dispose } = await resolvePatchedTarget(page, target, { throwOnMissing });
4821
- try {
4822
- if (!resolvedTarget) {
4823
- return false;
4824
- }
4825
- if (typeof resolvedTarget.click === "function") {
4826
- await resolvedTarget.click(buildActionOptions(effectiveOptions));
4827
- return true;
4828
- }
4829
- const box = await resolvedTarget.boundingBox?.();
4830
- if (!box) {
4831
- if (throwOnMissing) {
4832
- throw new Error("\u65E0\u6CD5\u83B7\u53D6\u5143\u7D20\u4F4D\u7F6E");
4833
- }
4834
- return false;
4835
- }
4836
- await page.mouse.click(box.x + box.width / 2, box.y + box.height / 2);
4837
- return true;
4838
- } finally {
4839
- if (typeof dispose === "function") {
4840
- await dispose();
4841
- }
4842
- }
4843
- });
4844
- };
4845
4798
  var CloakBrowserHumanize = {
4846
4799
  jitterMs(base, jitterPercent = 0.3) {
4847
4800
  return jitterMs(base, jitterPercent);
4848
4801
  },
4849
4802
  async initializeCursor(page) {
4850
4803
  if (isMobilePage(page)) {
4851
- return MobileHumanize.initializeCursor(page);
4804
+ return await MobileHumanize.initializeCursor(page);
4852
4805
  }
4853
- await ensureDesktopHumanized(page);
4854
- logger7.debug("initializeCursor: cloakbrowser human layer ready");
4806
+ return Boolean(page);
4855
4807
  },
4856
4808
  async humanMove(page, target) {
4857
4809
  if (isMobilePage(page)) {
4858
4810
  return await MobileHumanize.humanMove(page, target);
4859
4811
  }
4860
- await ensureDesktopHumanized(page);
4861
4812
  if (isPoint2(target)) {
4862
- return await humanMoveToPoint(page, target);
4813
+ return await moveCursorToPoint(page, target);
4863
4814
  }
4864
- const { target: resolvedTarget, dispose } = await resolvePatchedTarget(page, target, { throwOnMissing: false });
4865
- try {
4866
- if (!resolvedTarget) {
4867
- return false;
4868
- }
4869
- if (typeof resolvedTarget.hover === "function") {
4870
- await resolvedTarget.hover();
4871
- return true;
4872
- }
4873
- const box = await resolvedTarget.boundingBox?.();
4874
- if (!box) {
4875
- return false;
4876
- }
4877
- await page.mouse.move(box.x + box.width / 2, box.y + box.height / 2);
4815
+ const resolvedTarget = await resolveActionTarget(page, target, { throwOnMissing: false });
4816
+ if (!resolvedTarget) {
4817
+ return false;
4818
+ }
4819
+ if (typeof resolvedTarget.hover === "function") {
4820
+ await resolvedTarget.hover({ force: true });
4878
4821
  return true;
4879
- } finally {
4880
- if (typeof dispose === "function") {
4881
- await dispose();
4882
- }
4883
4822
  }
4823
+ const box = await getTargetBoundingBox2(resolvedTarget);
4824
+ if (!box) {
4825
+ return false;
4826
+ }
4827
+ return await moveCursorToPoint(page, {
4828
+ x: box.x + box.width / 2,
4829
+ y: box.y + box.height / 2
4830
+ });
4884
4831
  },
4885
4832
  async humanScroll(page, target, options = {}) {
4886
4833
  if (isMobilePage(page)) {
4887
4834
  return await MobileHumanize.humanScroll(page, target, options);
4888
4835
  }
4889
- const humanModule = await ensureDesktopHumanized(page);
4890
- if (typeof target === "string") {
4891
- const { x = 0, y = 0 } = page._humanCursor || {};
4892
- try {
4893
- const result = await humanModule.scrollToElement(
4894
- page,
4895
- page._humanRaw,
4896
- target,
4897
- x,
4898
- y,
4899
- page._humanCfg,
4900
- options.timeout
4901
- );
4902
- if (page._humanCursor) {
4903
- page._humanCursor.x = result.cursorX;
4904
- page._humanCursor.y = result.cursorY;
4905
- }
4906
- return {
4907
- element: await page.$(target),
4908
- didScroll: Boolean(result.didScroll),
4909
- restore: null
4910
- };
4911
- } catch (error) {
4912
- logger7.warn(`humanScroll: cloakbrowser \u6EDA\u52A8\u5931\u8D25\uFF0C\u8DF3\u8FC7 (${error?.message || error})`);
4913
- return { element: null, didScroll: false, restore: null };
4914
- }
4915
- }
4916
- const { target: resolvedTarget, dispose } = await resolvePatchedTarget(page, target, { throwOnMissing: false });
4917
- try {
4918
- if (!resolvedTarget) {
4919
- return { element: null, didScroll: false, restore: null };
4920
- }
4921
- const before = await page.evaluate(() => ({ x: window.scrollX, y: window.scrollY }));
4922
- await resolvedTarget.scrollIntoViewIfNeeded?.();
4923
- const after = await page.evaluate(() => ({ x: window.scrollX, y: window.scrollY }));
4924
- return {
4925
- element: resolvedTarget,
4926
- didScroll: before.x !== after.x || before.y !== after.y,
4927
- restore: null
4928
- };
4929
- } finally {
4930
- if (typeof dispose === "function") {
4931
- await dispose();
4932
- }
4836
+ const resolvedTarget = await resolveActionTarget(page, target, { throwOnMissing: false });
4837
+ if (!resolvedTarget) {
4838
+ return { element: null, didScroll: false, restore: null };
4933
4839
  }
4840
+ const before = await readViewportScroll(page);
4841
+ await resolvedTarget.scrollIntoViewIfNeeded?.().catch(() => {
4842
+ });
4843
+ const after = await readViewportScroll(page);
4844
+ return {
4845
+ element: resolvedTarget,
4846
+ didScroll: before.x !== after.x || before.y !== after.y,
4847
+ restore: null
4848
+ };
4934
4849
  },
4935
4850
  async humanClick(page, target, options = {}) {
4936
4851
  if (isMobilePage(page)) {
4937
4852
  return await MobileHumanize.humanClick(page, target, options);
4938
4853
  }
4939
- return await doDesktopHumanClick(page, target, options);
4854
+ if (target == null) {
4855
+ const { x = 0, y = 0 } = page?._humanCursor || {};
4856
+ await page.mouse.click(x || 0, y || 0);
4857
+ return true;
4858
+ }
4859
+ if (isPoint2(target)) {
4860
+ await page.mouse.click(Number(target.x), Number(target.y));
4861
+ return true;
4862
+ }
4863
+ const resolvedTarget = await resolveActionTarget(page, target, {
4864
+ throwOnMissing: options.throwOnMissing !== false
4865
+ });
4866
+ if (!resolvedTarget) {
4867
+ return false;
4868
+ }
4869
+ if (typeof resolvedTarget.click === "function") {
4870
+ await resolvedTarget.click(buildActionOptions(options));
4871
+ return true;
4872
+ }
4873
+ const box = await getTargetBoundingBox2(resolvedTarget);
4874
+ if (!box) {
4875
+ if (options.throwOnMissing !== false) {
4876
+ throw new Error("\u65E0\u6CD5\u83B7\u53D6\u5143\u7D20\u4F4D\u7F6E");
4877
+ }
4878
+ return false;
4879
+ }
4880
+ await page.mouse.click(box.x + box.width / 2, box.y + box.height / 2);
4881
+ return true;
4940
4882
  },
4941
4883
  async randomSleep(pageOrBaseMs, maybeBaseMs, maybeJitterPercent) {
4942
4884
  if (isPageLike2(pageOrBaseMs)) {
@@ -4952,7 +4894,6 @@ var CloakBrowserHumanize = {
4952
4894
  if (isMobilePage(page)) {
4953
4895
  return await MobileHumanize.simulateGaze(page, baseDurationMs);
4954
4896
  }
4955
- await ensureDesktopHumanized(page);
4956
4897
  const durationMs = jitterMs(baseDurationMs, 0.4);
4957
4898
  const startTime = Date.now();
4958
4899
  const viewportSize = page.viewportSize() || { width: 1365, height: 900 };
@@ -4968,31 +4909,21 @@ var CloakBrowserHumanize = {
4968
4909
  if (isMobilePage(page)) {
4969
4910
  return await MobileHumanize.humanType(page, selector, text, options);
4970
4911
  }
4971
- await ensureDesktopHumanized(page);
4972
- await withPointerEventsForceFallback("humanType", options, async (effectiveOptions = {}) => {
4973
- const actionOptions = buildActionOptions(effectiveOptions);
4974
- if (typeof selector === "string") {
4975
- await page.type(selector, text, actionOptions);
4976
- return;
4977
- }
4978
- const { target: resolvedTarget, dispose } = await resolvePatchedTarget(page, selector, { throwOnMissing: true });
4979
- try {
4980
- if (!resolvedTarget || typeof resolvedTarget.type !== "function") {
4981
- throw new Error("\u76EE\u6807\u5143\u7D20\u4E0D\u652F\u6301 type()");
4982
- }
4983
- await resolvedTarget.type(text, actionOptions);
4984
- } finally {
4985
- if (typeof dispose === "function") {
4986
- await dispose();
4987
- }
4988
- }
4989
- });
4912
+ const actionOptions = buildActionOptions(options);
4913
+ if (typeof selector === "string") {
4914
+ await page.type(selector, text, actionOptions);
4915
+ return;
4916
+ }
4917
+ const resolvedTarget = await resolveActionTarget(page, selector, { throwOnMissing: true });
4918
+ if (!resolvedTarget || typeof resolvedTarget.type !== "function") {
4919
+ throw new Error("\u76EE\u6807\u5143\u7D20\u4E0D\u652F\u6301 type()");
4920
+ }
4921
+ await resolvedTarget.type(text, actionOptions);
4990
4922
  },
4991
4923
  async humanPress(page, targetOrKey, maybeKey, options = {}) {
4992
4924
  if (isMobilePage(page)) {
4993
4925
  return await MobileHumanize.humanPress(page, targetOrKey, maybeKey, options);
4994
4926
  }
4995
- await ensureDesktopHumanized(page);
4996
4927
  const hasTarget = typeof maybeKey === "string";
4997
4928
  const key = hasTarget ? maybeKey : targetOrKey;
4998
4929
  const pressOptions = hasTarget ? options : maybeKey || options;
@@ -5004,55 +4935,61 @@ var CloakBrowserHumanize = {
5004
4935
  });
5005
4936
  return true;
5006
4937
  }
5007
- return await withPointerEventsForceFallback("humanPress", pressOptions, async (effectiveOptions = {}) => {
5008
- if (typeof targetOrKey === "string") {
5009
- await page.press(targetOrKey, key, buildActionOptions(effectiveOptions));
5010
- return true;
5011
- }
5012
- const { target: resolvedTarget, dispose } = await resolvePatchedTarget(page, targetOrKey, {
5013
- throwOnMissing: effectiveOptions.throwOnMissing !== false
5014
- });
5015
- try {
5016
- if (!resolvedTarget) {
5017
- return false;
5018
- }
5019
- if (typeof resolvedTarget.press === "function") {
5020
- await resolvedTarget.press(key, buildActionOptions(effectiveOptions));
5021
- return true;
5022
- }
5023
- await doDesktopHumanClick(page, targetOrKey, {
5024
- ...effectiveOptions,
5025
- reactionDelay: effectiveOptions.focusDelay ?? 180
5026
- });
5027
- await jitterSleep(effectiveOptions.reactionDelay ?? 180, 0.45);
5028
- await page.keyboard.press(key, {
5029
- ...effectiveOptions.keyboardOptions || {},
5030
- delay: jitterMs(effectiveOptions.holdDelay ?? 45, 0.5)
5031
- });
5032
- return true;
5033
- } finally {
5034
- if (typeof dispose === "function") {
5035
- await dispose();
5036
- }
5037
- }
4938
+ if (typeof targetOrKey === "string") {
4939
+ await page.press(targetOrKey, key, buildActionOptions(pressOptions));
4940
+ return true;
4941
+ }
4942
+ const resolvedTarget = await resolveActionTarget(page, targetOrKey, {
4943
+ throwOnMissing: pressOptions.throwOnMissing !== false
4944
+ });
4945
+ if (!resolvedTarget) {
4946
+ return false;
4947
+ }
4948
+ if (typeof resolvedTarget.press === "function") {
4949
+ await resolvedTarget.press(key, buildActionOptions(pressOptions));
4950
+ return true;
4951
+ }
4952
+ await this.humanClick(page, targetOrKey, {
4953
+ ...pressOptions,
4954
+ reactionDelay: pressOptions.focusDelay ?? 180
4955
+ });
4956
+ await jitterSleep(pressOptions.reactionDelay ?? 180, 0.45);
4957
+ await page.keyboard.press(key, {
4958
+ ...pressOptions.keyboardOptions || {},
4959
+ delay: jitterMs(pressOptions.holdDelay ?? 45, 0.5)
5038
4960
  });
4961
+ return true;
5039
4962
  },
5040
4963
  async humanClear(page, selector) {
5041
4964
  if (isMobilePage(page)) {
5042
4965
  return await MobileHumanize.humanClear(page, selector);
5043
4966
  }
5044
- await ensureDesktopHumanized(page);
5045
- if (typeof page.clear === "function") {
5046
- await page.clear(selector);
4967
+ if (typeof selector === "string") {
4968
+ if (typeof page.clear === "function") {
4969
+ await page.clear(selector, { force: true });
4970
+ return;
4971
+ }
4972
+ await page.fill(selector, "", { force: true });
4973
+ return;
4974
+ }
4975
+ const resolvedTarget = await resolveActionTarget(page, selector, { throwOnMissing: true });
4976
+ if (!resolvedTarget) {
4977
+ throw new Error("\u76EE\u6807\u5143\u7D20\u4E0D\u652F\u6301 clear()");
4978
+ }
4979
+ if (typeof resolvedTarget.clear === "function") {
4980
+ await resolvedTarget.clear(buildActionOptions());
4981
+ return;
4982
+ }
4983
+ if (typeof resolvedTarget.fill === "function") {
4984
+ await resolvedTarget.fill("", buildActionOptions());
5047
4985
  return;
5048
4986
  }
5049
- await page.fill(selector, "");
4987
+ throw new Error("\u76EE\u6807\u5143\u7D20\u4E0D\u652F\u6301 clear()");
5050
4988
  },
5051
4989
  async warmUpBrowsing(page, baseDuration = 3500) {
5052
4990
  if (isMobilePage(page)) {
5053
4991
  return await MobileHumanize.warmUpBrowsing(page, baseDuration);
5054
4992
  }
5055
- await ensureDesktopHumanized(page);
5056
4993
  const durationMs = jitterMs(baseDuration, 0.4);
5057
4994
  const startTime = Date.now();
5058
4995
  const viewportSize = page.viewportSize() || { width: 1365, height: 900 };
@@ -5078,7 +5015,6 @@ var CloakBrowserHumanize = {
5078
5015
  if (isMobilePage(page)) {
5079
5016
  return await MobileHumanize.naturalScroll(page, direction, distance, baseSteps);
5080
5017
  }
5081
- await ensureDesktopHumanized(page);
5082
5018
  const steps = Math.max(3, baseSteps + Math.floor(Math.random() * 3) - 1);
5083
5019
  const actualDistance = jitterMs(distance, 0.15);
5084
5020
  const sign = direction === "down" ? 1 : -1;
@@ -5093,55 +5029,24 @@ var CloakBrowserHumanize = {
5093
5029
  };
5094
5030
 
5095
5031
  // src/humanize.js
5096
- var resolveHumanizeDelegate = () => getToolkitMode() === Mode.CloakBrowser ? CloakBrowserHumanize : DefaultHumanize;
5097
- var callHumanize = (method, ...args) => {
5098
- const delegate = resolveHumanizeDelegate();
5099
- if (typeof delegate?.[method] !== "function") {
5100
- throw new Error(`Humanize.${method} is not available in ${getToolkitMode()} mode`);
5101
- }
5102
- return delegate[method](...args);
5103
- };
5104
- var Humanize2 = {
5105
- jitterMs(base, jitterPercent = 0.3) {
5106
- return callHumanize("jitterMs", base, jitterPercent);
5107
- },
5108
- initializeCursor(page) {
5109
- return callHumanize("initializeCursor", page);
5110
- },
5111
- humanMove(page, target) {
5112
- return callHumanize("humanMove", page, target);
5113
- },
5114
- humanScroll(page, target, options = {}) {
5115
- return callHumanize("humanScroll", page, target, options);
5116
- },
5117
- humanClick(page, target, options = {}) {
5118
- return callHumanize("humanClick", page, target, options);
5119
- },
5120
- randomSleep(pageOrBaseMs, maybeBaseMs, maybeJitterPercent) {
5121
- return callHumanize("randomSleep", pageOrBaseMs, maybeBaseMs, maybeJitterPercent);
5122
- },
5123
- simulateGaze(page, baseDurationMs = 2500) {
5124
- return callHumanize("simulateGaze", page, baseDurationMs);
5125
- },
5126
- humanType(page, selector, text, options = {}) {
5127
- return callHumanize("humanType", page, selector, text, options);
5128
- },
5129
- humanPress(page, targetOrKey, maybeKey, options = {}) {
5130
- if (typeof maybeKey === "string") {
5131
- return callHumanize("humanPress", page, targetOrKey, maybeKey, options);
5132
- }
5133
- return callHumanize("humanPress", page, targetOrKey, maybeKey || options);
5134
- },
5135
- humanClear(page, selector) {
5136
- return callHumanize("humanClear", page, selector);
5137
- },
5138
- warmUpBrowsing(page, baseDuration = 3500) {
5139
- return callHumanize("warmUpBrowsing", page, baseDuration);
5140
- },
5141
- naturalScroll(page, direction = "down", distance = 300, baseSteps = 5) {
5142
- return callHumanize("naturalScroll", page, direction, distance, baseSteps);
5143
- }
5144
- };
5032
+ var humanizeStrategies = {
5033
+ [Mode.Default]: DefaultHumanize,
5034
+ [Mode.CloakBrowser]: CloakBrowserHumanize
5035
+ };
5036
+ var Humanize2 = createDelegatedFacade("Humanize", humanizeStrategies, [
5037
+ "jitterMs",
5038
+ "initializeCursor",
5039
+ "humanMove",
5040
+ "humanScroll",
5041
+ "humanClick",
5042
+ "randomSleep",
5043
+ "simulateGaze",
5044
+ "humanType",
5045
+ "humanPress",
5046
+ "humanClear",
5047
+ "warmUpBrowsing",
5048
+ "naturalScroll"
5049
+ ]);
5145
5050
 
5146
5051
  // src/internals/launch/default.js
5147
5052
  import { execFileSync } from "node:child_process";
@@ -5229,7 +5134,7 @@ var ByPass = {
5229
5134
  };
5230
5135
 
5231
5136
  // src/internals/launch/default.js
5232
- var logger8 = createInternalLogger("Launch");
5137
+ var logger7 = createInternalLogger("Launch");
5233
5138
  var REQUEST_HOOK_FLAG = Symbol("playwright-toolkit-request-hook");
5234
5139
  var injectedContexts = /* @__PURE__ */ new WeakSet();
5235
5140
  var browserMajorVersionCache = /* @__PURE__ */ new Map();
@@ -5281,7 +5186,7 @@ var detectBrowserMajorVersion = (launcher) => {
5281
5186
  });
5282
5187
  detectedVersion = parseChromeMajorVersion(rawVersion);
5283
5188
  } catch (error) {
5284
- logger8.warn(`\u8BFB\u53D6\u6D4F\u89C8\u5668\u7248\u672C\u5931\u8D25: ${error?.message || error}`);
5189
+ logger7.warn(`\u8BFB\u53D6\u6D4F\u89C8\u5668\u7248\u672C\u5931\u8D25: ${error?.message || error}`);
5285
5190
  }
5286
5191
  browserMajorVersionCache.set(executablePath, detectedVersion);
5287
5192
  return detectedVersion;
@@ -5318,7 +5223,7 @@ var generateFingerprintForCore = ({ locale, browserMajorVersion, device }) => {
5318
5223
  if (requestedBrowserMajorVersion <= 0) {
5319
5224
  throw error;
5320
5225
  }
5321
- logger8.warn(
5226
+ logger7.warn(
5322
5227
  `\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}`
5323
5228
  );
5324
5229
  }
@@ -5363,7 +5268,7 @@ var buildReplayableBrowserProfile = (runtimeState, launcher) => {
5363
5268
  schema_version: DEFAULT_BROWSER_PROFILE_SCHEMA_VERSION
5364
5269
  };
5365
5270
  nextState = RuntimeEnv.setBrowserProfileCore(nextState, browserProfileCore);
5366
- logger8.info(
5271
+ logger7.info(
5367
5272
  `\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}`
5368
5273
  );
5369
5274
  return { runtimeState: nextState, browserProfileCore };
@@ -5492,18 +5397,18 @@ var DefaultLaunch = {
5492
5397
  upstreamLabel = `${parsedProxyUrl.protocol}//${parsedProxyUrl.host}`;
5493
5398
  } catch {
5494
5399
  }
5495
- logger8.info(
5400
+ logger7.info(
5496
5401
  `[\u4EE3\u7406\u5DF2\u542F\u7528] \u672C\u5730=${launchProxy.server} \u4E0A\u6E38=${upstreamLabel || "-"} \u76F4\u8FDE\u57DF\u540D=${(byPassDomains || []).join(",")}`
5497
5402
  );
5498
- 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`);
5403
+ 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`);
5499
5404
  } else if (enableByPassLogger && enableProxy && !launchProxy) {
5500
- logger8.info("[\u4EE3\u7406\u672A\u542F\u7528] enable_proxy=true \u4F46 proxy_url \u4E3A\u7A7A");
5501
- 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`);
5405
+ logger7.info("[\u4EE3\u7406\u672A\u542F\u7528] enable_proxy=true \u4F46 proxy_url \u4E3A\u7A7A");
5406
+ 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`);
5502
5407
  } else if (enableByPassLogger && !enableProxy && proxyUrl) {
5503
- logger8.info("[\u4EE3\u7406\u672A\u542F\u7528] enable_proxy=false \u4E14 proxy_url \u5DF2\u914D\u7F6E");
5504
- 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`);
5408
+ logger7.info("[\u4EE3\u7406\u672A\u542F\u7528] enable_proxy=false \u4E14 proxy_url \u5DF2\u914D\u7F6E");
5409
+ 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`);
5505
5410
  } else if (enableByPassLogger) {
5506
- 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`);
5411
+ 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`);
5507
5412
  }
5508
5413
  const onPageCreated = (page) => {
5509
5414
  const recommendedGotoOptions = {
@@ -5525,7 +5430,7 @@ var DefaultLaunch = {
5525
5430
  }
5526
5431
  if (!enableByPassLogger || byPassDomains.length === 0) return;
5527
5432
  if (!matched || !matched.rule) return;
5528
- 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}`);
5433
+ 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}`);
5529
5434
  };
5530
5435
  page.on("request", requestHandler);
5531
5436
  return recommendedGotoOptions;
@@ -5582,7 +5487,7 @@ var DefaultLaunch = {
5582
5487
  // src/internals/launch/cloakbrowser.js
5583
5488
  import { execFile } from "node:child_process";
5584
5489
  import { promisify } from "node:util";
5585
- var logger9 = createInternalLogger("CloakBrowser");
5490
+ var logger8 = createInternalLogger("CloakBrowser");
5586
5491
  var execFileAsync = promisify(execFile);
5587
5492
  var DEFAULT_CLOAK_CRAWLER_BASE_OPTIONS = Object.freeze({
5588
5493
  maxConcurrency: 1,
@@ -5718,7 +5623,7 @@ var forceTerminateBrowsersByFingerprintArg = async (fingerprintArg) => {
5718
5623
  if (error?.code === 1 || error?.code === "ENOENT") {
5719
5624
  return;
5720
5625
  }
5721
- logger9.info(`\u5F3A\u5236\u5173\u95ED CloakBrowser \u8FDB\u7A0B\u5931\u8D25\uFF08\u5FFD\u7565\uFF09: ${error?.message || String(error)}`);
5626
+ logger8.info(`\u5F3A\u5236\u5173\u95ED CloakBrowser \u8FDB\u7A0B\u5931\u8D25\uFF08\u5FFD\u7565\uFF09: ${error?.message || String(error)}`);
5722
5627
  });
5723
5628
  };
5724
5629
  var CloakBrowserLaunch = {
@@ -5732,8 +5637,21 @@ var CloakBrowserLaunch = {
5732
5637
  return createStableGotoHook(recommendedGotoOptions);
5733
5638
  },
5734
5639
  async getPlaywrightCrawlerOptions(options = {}) {
5735
- const { crawlerOptions } = await CloakBrowserLaunch.createPlaywrightCrawlerRuntime(options);
5736
- return crawlerOptions;
5640
+ const runtime2 = await CloakBrowserLaunch.createPlaywrightCrawlerRuntime(options);
5641
+ return Object.defineProperties(runtime2.crawlerOptions, {
5642
+ cleanup: {
5643
+ enumerable: false,
5644
+ value: runtime2.cleanup
5645
+ },
5646
+ closeActiveBrowsers: {
5647
+ enumerable: false,
5648
+ value: runtime2.closeActiveBrowsers
5649
+ },
5650
+ forceTerminateActiveProcesses: {
5651
+ enumerable: false,
5652
+ value: runtime2.forceTerminateActiveProcesses
5653
+ }
5654
+ });
5737
5655
  },
5738
5656
  async buildLaunchOptions(options = {}) {
5739
5657
  return await buildCloakLaunchOptions(options);
@@ -5814,39 +5732,18 @@ var CloakBrowserLaunch = {
5814
5732
  };
5815
5733
 
5816
5734
  // src/launch.js
5817
- var resolveLaunchDelegate = () => getToolkitMode() === Mode.CloakBrowser ? CloakBrowserLaunch : DefaultLaunch;
5818
- var callLaunch = (method, ...args) => {
5819
- const delegate = resolveLaunchDelegate();
5820
- if (typeof delegate?.[method] !== "function") {
5821
- throw new Error(`Launch.${method} is not available in ${getToolkitMode()} mode`);
5822
- }
5823
- return delegate[method](...args);
5824
- };
5825
- var Launch = {
5826
- getPlaywrightCrawlerOptions(options = {}) {
5827
- return callLaunch("getPlaywrightCrawlerOptions", options);
5828
- },
5829
- resolveProxyConfiguration(proxyConfiguration = {}) {
5830
- return callLaunch("resolveProxyConfiguration", proxyConfiguration);
5831
- },
5832
- extractFingerprintArg(launchOptions = {}) {
5833
- return callLaunch("extractFingerprintArg", launchOptions);
5834
- },
5835
- createStableGotoHook(recommendedGotoOptions = {}) {
5836
- return callLaunch("createStableGotoHook", recommendedGotoOptions);
5837
- },
5838
- buildLaunchOptions(options = {}) {
5839
- return callLaunch("buildLaunchOptions", options);
5840
- },
5841
- createPlaywrightCrawlerRuntime(options = {}) {
5842
- return callLaunch("createPlaywrightCrawlerRuntime", options);
5843
- }
5735
+ var launchStrategies = {
5736
+ [Mode.Default]: DefaultLaunch,
5737
+ [Mode.CloakBrowser]: CloakBrowserLaunch
5844
5738
  };
5739
+ var Launch = createDelegatedFacade("Launch", launchStrategies, [
5740
+ "getPlaywrightCrawlerOptions"
5741
+ ]);
5845
5742
 
5846
5743
  // src/live-view.js
5847
5744
  import express from "express";
5848
5745
  import { Actor } from "apify";
5849
- var logger10 = createInternalLogger("LiveView");
5746
+ var logger9 = createInternalLogger("LiveView");
5850
5747
  async function startLiveViewServer(liveViewKey) {
5851
5748
  const app = express();
5852
5749
  app.get("/", async (req, res) => {
@@ -5871,13 +5768,13 @@ async function startLiveViewServer(liveViewKey) {
5871
5768
  </html>
5872
5769
  `);
5873
5770
  } catch (error) {
5874
- logger10.fail("Live View Server", error);
5771
+ logger9.fail("Live View Server", error);
5875
5772
  res.status(500).send(`\u65E0\u6CD5\u52A0\u8F7D\u5C4F\u5E55\u622A\u56FE: ${error.message}`);
5876
5773
  }
5877
5774
  });
5878
5775
  const port = process.env.APIFY_CONTAINER_PORT || 4321;
5879
5776
  app.listen(port, () => {
5880
- logger10.success("startLiveViewServer", `\u76D1\u542C\u7AEF\u53E3 ${port}`);
5777
+ logger9.success("startLiveViewServer", `\u76D1\u542C\u7AEF\u53E3 ${port}`);
5881
5778
  });
5882
5779
  }
5883
5780
  async function takeLiveScreenshot(liveViewKey, page, logMessage) {
@@ -5885,10 +5782,10 @@ async function takeLiveScreenshot(liveViewKey, page, logMessage) {
5885
5782
  const buffer = await capturePageScreenshot(page, { type: "png" });
5886
5783
  await Actor.setValue(liveViewKey, buffer, { contentType: "image/png" });
5887
5784
  if (logMessage) {
5888
- logger10.info(`(\u622A\u56FE): ${logMessage}`);
5785
+ logger9.info(`(\u622A\u56FE): ${logMessage}`);
5889
5786
  }
5890
5787
  } catch (e) {
5891
- logger10.warn(`\u65E0\u6CD5\u6355\u83B7 Live View \u5C4F\u5E55\u622A\u56FE: ${e.message}`);
5788
+ logger9.warn(`\u65E0\u6CD5\u6355\u83B7 Live View \u5C4F\u5E55\u622A\u56FE: ${e.message}`);
5892
5789
  }
5893
5790
  }
5894
5791
  var useLiveView = (liveViewKey = PresetOfLiveViewKey) => {
@@ -5997,7 +5894,7 @@ var dragCaptchaAction = async (page, sourceLocator, targetLocator, options = {})
5997
5894
  };
5998
5895
 
5999
5896
  // src/internals/captcha/bytedance.js
6000
- var logger11 = createInternalLogger("Captcha");
5897
+ var logger10 = createInternalLogger("Captcha");
6001
5898
  var DEFAULT_BYTEDANCE_CAPTCHA_OPTIONS = Object.freeze({
6002
5899
  apiType: "31234",
6003
5900
  maxRetries: 3,
@@ -6129,7 +6026,7 @@ var collectCaptchaDebugInfo = async (page, frame, iframeLocator, attempt, phase,
6129
6026
  }
6130
6027
  await writeFile(infoPath, JSON.stringify(payload, null, 2), "utf8");
6131
6028
  }
6132
- logger11.info(`\u5DF2\u5199\u51FA\u9A8C\u8BC1\u7801\u8C03\u8BD5\u4EA7\u7269\uFF1A${debugDir}`);
6029
+ logger10.info(`\u5DF2\u5199\u51FA\u9A8C\u8BC1\u7801\u8C03\u8BD5\u4EA7\u7269\uFF1A${debugDir}`);
6133
6030
  };
6134
6031
  var maybeCollectCaptchaDebugInfo = async (page, frame, iframeLocator, attempt, phase, options, extra = null) => {
6135
6032
  if (!options.debugArtifacts) {
@@ -6166,14 +6063,14 @@ var getVerifycenterCaptchaContext = async (page, options) => {
6166
6063
  if (!isContainerVisible) {
6167
6064
  return null;
6168
6065
  }
6169
- logger11.info("\u68C0\u6D4B\u5230\u9A8C\u8BC1\u7801\u5BB9\u5668\uFF0C\u5F00\u59CB\u7B49\u5F85 iframe \u52A0\u8F7D\u3002");
6066
+ logger10.info("\u68C0\u6D4B\u5230\u9A8C\u8BC1\u7801\u5BB9\u5668\uFF0C\u5F00\u59CB\u7B49\u5F85 iframe \u52A0\u8F7D\u3002");
6170
6067
  let iframeLocator = page.locator(options.iframeSelector).first();
6171
6068
  let isIframeVisible = await waitForVisible(
6172
6069
  iframeLocator,
6173
6070
  options.iframeVisibleTimeoutMs
6174
6071
  );
6175
6072
  if (!isIframeVisible) {
6176
- logger11.warn("\u672A\u5728\u9884\u671F\u9009\u62E9\u5668\u4E2D\u627E\u5230 verifycenter iframe\uFF0C\u5C1D\u8BD5\u5BB9\u5668\u5185\u4EFB\u610F iframe\u3002");
6073
+ logger10.warn("\u672A\u5728\u9884\u671F\u9009\u62E9\u5668\u4E2D\u627E\u5230 verifycenter iframe\uFF0C\u5C1D\u8BD5\u5BB9\u5668\u5185\u4EFB\u610F iframe\u3002");
6177
6074
  iframeLocator = captchaContainer.locator(options.iframeFallbackSelector).first();
6178
6075
  isIframeVisible = await waitForVisible(
6179
6076
  iframeLocator,
@@ -6183,7 +6080,7 @@ var getVerifycenterCaptchaContext = async (page, options) => {
6183
6080
  if (!isIframeVisible) {
6184
6081
  throw new Error("verifycenter iframe not found inside captcha container.");
6185
6082
  }
6186
- logger11.info("\u9A8C\u8BC1\u7801 iframe \u5DF2\u53EF\u89C1\uFF0C\u5F00\u59CB\u89E3\u6790\u5185\u5BB9 frame\u3002");
6083
+ logger10.info("\u9A8C\u8BC1\u7801 iframe \u5DF2\u53EF\u89C1\uFF0C\u5F00\u59CB\u89E3\u6790\u5185\u5BB9 frame\u3002");
6187
6084
  const frame = await resolveContentFrame(page, iframeLocator, options);
6188
6085
  if (!frame) {
6189
6086
  throw new Error("Failed to resolve verifycenter iframe content frame.");
@@ -6299,11 +6196,11 @@ var refreshCaptcha = async (page, frame, options) => {
6299
6196
  const clicked = await clickCaptchaAction(frame, options.refreshTexts, {
6300
6197
  ...options,
6301
6198
  page,
6302
- logger: logger11,
6199
+ logger: logger10,
6303
6200
  forceMouse: true
6304
6201
  }).catch(() => false);
6305
6202
  if (!clicked) {
6306
- logger11.warn("Refresh button not found.");
6203
+ logger10.warn("Refresh button not found.");
6307
6204
  return false;
6308
6205
  }
6309
6206
  await page.waitForTimeout(options.refreshWaitMs);
@@ -6334,24 +6231,24 @@ var waitForCaptchaChallengeReady = async (page, frame, options) => {
6334
6231
  const hasGuideMaskVisible = options.guideMaskSelector ? await frame.locator(options.guideMaskSelector).first().isVisible({ timeout: options.loadingIndicatorVisibleTimeoutMs }).catch(() => false) : false;
6335
6232
  hasSeenGuideMask = hasSeenGuideMask || hasGuideMaskVisible;
6336
6233
  if (hasGuideMaskVisible && !hasLoggedGuideMask) {
6337
- 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");
6234
+ 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");
6338
6235
  hasLoggedGuideMask = true;
6339
6236
  }
6340
6237
  if (!isLoadingVisible && hasVisibleSourceImage && hasVisibleDropTarget && !hasGuideMaskVisible) {
6341
- logger11.info(
6238
+ logger10.info(
6342
6239
  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"
6343
6240
  );
6344
6241
  return;
6345
6242
  }
6346
6243
  if (hasErrorTextVisible) {
6347
- 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");
6244
+ 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");
6348
6245
  await refreshCaptcha(page, frame, options);
6349
6246
  refreshDeadline = Date.now() + options.challengeReadyRefreshTimeoutMs;
6350
6247
  hasSeenLoading = false;
6351
6248
  continue;
6352
6249
  }
6353
6250
  if ((!hasVisibleSourceImage || !hasVisibleDropTarget) && Date.now() >= refreshDeadline) {
6354
- 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`);
6251
+ 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`);
6355
6252
  await refreshCaptcha(page, frame, options);
6356
6253
  refreshDeadline = Date.now() + options.challengeReadyRefreshTimeoutMs;
6357
6254
  hasSeenLoading = false;
@@ -6399,7 +6296,7 @@ var dragPromptCaptchaImage = async (page, frame, iframeLocator, sourceLocator, d
6399
6296
  accepted
6400
6297
  };
6401
6298
  dragAttempts.push(attemptInfo);
6402
- logger11.info(
6299
+ logger10.info(
6403
6300
  `\u9A8C\u8BC1\u7801\u62D6\u62FD\u7B2C ${visualIndex + 1} \u5F20\uFF0C\u65B9\u6848 ${plan.name}\uFF0Cbadge ${baselineState.badgeCount} -> ${afterState.badgeCount}\uFF0Cselected ${baselineState.selectedCount} -> ${afterState.selectedCount}`
6404
6301
  );
6405
6302
  if (accepted) {
@@ -6417,7 +6314,7 @@ var dragPromptCaptchaImage = async (page, frame, iframeLocator, sourceLocator, d
6417
6314
  dragAttempts,
6418
6315
  finalState: await readPromptCaptchaState(frame, options)
6419
6316
  }).catch((error) => {
6420
- logger11.warn(`\u9A8C\u8BC1\u7801\u62D6\u62FD\u5931\u8D25\u8C03\u8BD5\u6293\u53D6\u5931\u8D25\uFF1A${error?.message || error}`);
6317
+ logger10.warn(`\u9A8C\u8BC1\u7801\u62D6\u62FD\u5931\u8D25\u8C03\u8BD5\u6293\u53D6\u5931\u8D25\uFF1A${error?.message || error}`);
6421
6318
  });
6422
6319
  return {
6423
6320
  accepted: false,
@@ -6434,16 +6331,16 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
6434
6331
  ...options
6435
6332
  };
6436
6333
  if (!config.token) {
6437
- logger11.warn("\u7F3A\u5C11\u9A8C\u8BC1\u7801 token\uFF0C\u8DF3\u8FC7\u81EA\u52A8\u8BC6\u522B\u3002");
6334
+ logger10.warn("\u7F3A\u5C11\u9A8C\u8BC1\u7801 token\uFF0C\u8DF3\u8FC7\u81EA\u52A8\u8BC6\u522B\u3002");
6438
6335
  return false;
6439
6336
  }
6440
- logger11.info("\u5F53\u524D\u4F7F\u7528\u672Ctool\u2014\u2014\u6D4B\u8BD5\u7248\u672C");
6337
+ logger10.info("\u5F53\u524D\u4F7F\u7528\u672Ctool\u2014\u2014\u6D4B\u8BD5\u7248\u672C");
6441
6338
  for (let attempt = 1; attempt <= config.maxRetries; attempt += 1) {
6442
- logger11.info(`\u5F00\u59CB\u7B2C ${attempt}/${config.maxRetries} \u6B21 verifycenter \u9A8C\u8BC1\u7801\u8BC6\u522B\u3002`);
6339
+ logger10.info(`\u5F00\u59CB\u7B2C ${attempt}/${config.maxRetries} \u6B21 verifycenter \u9A8C\u8BC1\u7801\u8BC6\u522B\u3002`);
6443
6340
  try {
6444
6341
  const captchaContext = await getVerifycenterCaptchaContext(page, config);
6445
6342
  if (!captchaContext) {
6446
- logger11.info("Captcha container is not visible anymore.");
6343
+ logger10.info("Captcha container is not visible anymore.");
6447
6344
  return true;
6448
6345
  }
6449
6346
  const { iframeLocator, frame } = captchaContext;
@@ -6456,7 +6353,7 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
6456
6353
  "ready",
6457
6354
  config
6458
6355
  ).catch((error) => {
6459
- logger11.warn(`\u9A8C\u8BC1\u7801\u8C03\u8BD5\u6293\u53D6\u5931\u8D25\uFF1A${error?.message || error}`);
6356
+ logger10.warn(`\u9A8C\u8BC1\u7801\u8C03\u8BD5\u6293\u53D6\u5931\u8D25\uFF1A${error?.message || error}`);
6460
6357
  });
6461
6358
  await page.waitForTimeout(config.recognitionDelayMs);
6462
6359
  const screenshotBuffer = await iframeLocator.screenshot();
@@ -6468,16 +6365,16 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
6468
6365
  });
6469
6366
  const serialNumbers = extractCaptchaSerialNumbers(apiResponse);
6470
6367
  if (apiResponse?.code !== config.recognitionSuccessCode || serialNumbers.length === 0) {
6471
- logger11.warn(
6368
+ logger10.warn(
6472
6369
  `\u9A8C\u8BC1\u7801\u8BC6\u522B\u5931\u8D25\u3002code=${apiResponse?.code}, msg=${apiResponse?.msg || "unknown"}`
6473
6370
  );
6474
6371
  await refreshCaptcha(page, frame, config);
6475
6372
  continue;
6476
6373
  }
6477
- logger11.info(`\u9A8C\u8BC1\u7801\u8BC6\u522B\u6210\u529F\uFF0C\u5E8F\u53F7\uFF1A${serialNumbers.join(", ")}`);
6374
+ logger10.info(`\u9A8C\u8BC1\u7801\u8BC6\u522B\u6210\u529F\uFF0C\u5E8F\u53F7\uFF1A${serialNumbers.join(", ")}`);
6478
6375
  const dropTarget = await findCaptchaDropTarget(frame, config);
6479
6376
  if (!dropTarget) {
6480
- logger11.warn("\u672A\u627E\u5230\u9A8C\u8BC1\u7801\u62D6\u62FD\u76EE\u6807\u533A\u57DF\u3002");
6377
+ logger10.warn("\u672A\u627E\u5230\u9A8C\u8BC1\u7801\u62D6\u62FD\u76EE\u6807\u533A\u57DF\u3002");
6481
6378
  await refreshCaptcha(page, frame, config);
6482
6379
  continue;
6483
6380
  }
@@ -6488,7 +6385,7 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
6488
6385
  `Captcha image indexes could not be normalized. raw=${serialNumbers.join(", ")}, count=${orderedSourceImages.length}`
6489
6386
  );
6490
6387
  }
6491
- logger11.info(`\u9A8C\u8BC1\u7801\u89C6\u89C9\u4F4D\u5E8F\u6620\u5C04\uFF1A${normalizedIndexes.map((index) => index + 1).join(", ")}`);
6388
+ logger10.info(`\u9A8C\u8BC1\u7801\u89C6\u89C9\u4F4D\u5E8F\u6620\u5C04\uFF1A${normalizedIndexes.map((index) => index + 1).join(", ")}`);
6492
6389
  for (const imageIndex of normalizedIndexes) {
6493
6390
  if (imageIndex < 0 || imageIndex >= orderedSourceImages.length) {
6494
6391
  throw new Error(
@@ -6520,52 +6417,52 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
6520
6417
  }
6521
6418
  }
6522
6419
  const beforeSubmitState = await readPromptCaptchaState(frame, config);
6523
- logger11.info(
6420
+ logger10.info(
6524
6421
  `\u63D0\u4EA4\u524D\u9A8C\u8BC1\u7801\u72B6\u6001\uFF1Abadge=${beforeSubmitState.badgeCount}, selected=${beforeSubmitState.selectedCount}, submitDisabled=${beforeSubmitState.submitDisabled}`
6525
6422
  );
6526
6423
  const submitted = await clickCaptchaAction(frame, config.submitTexts, {
6527
6424
  ...config,
6528
6425
  page,
6529
- logger: logger11,
6426
+ logger: logger10,
6530
6427
  forceMouse: true,
6531
6428
  actionVisibleTimeoutMs: config.submitReadyTimeoutMs
6532
6429
  }).catch(() => false);
6533
6430
  if (!submitted) {
6534
- logger11.warn("\u672A\u627E\u5230\u63D0\u4EA4\u6309\u94AE\uFF0C\u53EF\u80FD\u4F1A\u81EA\u52A8\u63D0\u4EA4\u3002");
6431
+ logger10.warn("\u672A\u627E\u5230\u63D0\u4EA4\u6309\u94AE\uFF0C\u53EF\u80FD\u4F1A\u81EA\u52A8\u63D0\u4EA4\u3002");
6535
6432
  }
6536
6433
  await page.waitForTimeout(config.submitWaitMs);
6537
6434
  const afterSubmitState = await readPromptCaptchaState(frame, config);
6538
- logger11.info(
6435
+ logger10.info(
6539
6436
  `\u63D0\u4EA4\u540E\u9A8C\u8BC1\u7801\u72B6\u6001\uFF1Abadge=${afterSubmitState.badgeCount}, selected=${afterSubmitState.selectedCount}, submitDisabled=${afterSubmitState.submitDisabled}`
6540
6437
  );
6541
6438
  const stillVisible = await iframeLocator.isVisible({ timeout: config.containerVisibleTimeoutMs }).catch(() => false);
6542
6439
  if (!stillVisible) {
6543
- logger11.info("\u9A8C\u8BC1\u7801\u8BC6\u522B\u5E76\u63D0\u4EA4\u6210\u529F\u3002");
6440
+ logger10.info("\u9A8C\u8BC1\u7801\u8BC6\u522B\u5E76\u63D0\u4EA4\u6210\u529F\u3002");
6544
6441
  return true;
6545
6442
  }
6546
6443
  await maybeCollectCaptchaDebugInfo(page, frame, iframeLocator, attempt, "submit-still-visible", config, {
6547
6444
  beforeSubmitState,
6548
6445
  afterSubmitState
6549
6446
  }).catch((error) => {
6550
- logger11.warn(`\u63D0\u4EA4\u540E\u9A8C\u8BC1\u7801\u8C03\u8BD5\u6293\u53D6\u5931\u8D25\uFF1A${error?.message || error}`);
6447
+ logger10.warn(`\u63D0\u4EA4\u540E\u9A8C\u8BC1\u7801\u8C03\u8BD5\u6293\u53D6\u5931\u8D25\uFF1A${error?.message || error}`);
6551
6448
  });
6552
- logger11.warn("\u63D0\u4EA4\u540E\u9A8C\u8BC1\u7801 iframe \u4ECD\u7136\u53EF\u89C1\uFF0C\u51C6\u5907\u5237\u65B0\u540E\u91CD\u8BD5\u3002");
6449
+ logger10.warn("\u63D0\u4EA4\u540E\u9A8C\u8BC1\u7801 iframe \u4ECD\u7136\u53EF\u89C1\uFF0C\u51C6\u5907\u5237\u65B0\u540E\u91CD\u8BD5\u3002");
6553
6450
  await page.waitForTimeout(2e3);
6554
6451
  await refreshCaptcha(page, frame, config);
6555
6452
  } catch (error) {
6556
- logger11.error(`\u7B2C ${attempt}/${config.maxRetries} \u6B21\u9A8C\u8BC1\u7801\u8BC6\u522B\u5931\u8D25\uFF1A${error?.message || error}`);
6453
+ logger10.error(`\u7B2C ${attempt}/${config.maxRetries} \u6B21\u9A8C\u8BC1\u7801\u8BC6\u522B\u5931\u8D25\uFF1A${error?.message || error}`);
6557
6454
  }
6558
6455
  if (attempt < config.maxRetries) {
6559
6456
  await page.waitForTimeout(config.retryDelayBaseMs + attempt * config.retryDelayStepMs);
6560
6457
  }
6561
6458
  }
6562
- logger11.error(`\u91CD\u8BD5 ${config.maxRetries} \u6B21\u540E\uFF0C\u9A8C\u8BC1\u7801\u4ECD\u672A\u8BC6\u522B\u6210\u529F\u3002`);
6459
+ logger10.error(`\u91CD\u8BD5 ${config.maxRetries} \u6B21\u540E\uFF0C\u9A8C\u8BC1\u7801\u4ECD\u672A\u8BC6\u522B\u6210\u529F\u3002`);
6563
6460
  return false;
6564
6461
  }
6565
6462
  var sloveCaptcha = solveCaptcha;
6566
6463
 
6567
6464
  // src/chaptcha.js
6568
- var logger12 = createInternalLogger("Captcha");
6465
+ var logger11 = createInternalLogger("Captcha");
6569
6466
  var DEFAULT_CAPTCHA_RECOGNITION_OPTIONS = Object.freeze({
6570
6467
  token: "eKJvBfwfN0YRav0-VD_44E2VBSfm7l0YtddUQ7cFySI",
6571
6468
  apiUrl: "https://api.jfbym.com/api/YmServer/customApi"
@@ -6652,7 +6549,7 @@ function useCaptchaMonitor(page, options) {
6652
6549
  };
6653
6550
  })();
6654
6551
  }, { selector: domSelector, callbackName: exposedFunctionName, cleanerName });
6655
- logger12.success("useCaptchaMonitor", `DOM \u76D1\u63A7\u5DF2\u542F\u7528\uFF1A${domSelector}`);
6552
+ logger11.success("useCaptchaMonitor", `DOM \u76D1\u63A7\u5DF2\u542F\u7528\uFF1A${domSelector}`);
6656
6553
  cleanupFns.push(async () => {
6657
6554
  try {
6658
6555
  await page.evaluate((name) => {
@@ -6676,14 +6573,14 @@ function useCaptchaMonitor(page, options) {
6676
6573
  }
6677
6574
  };
6678
6575
  page.on("framenavigated", frameHandler);
6679
- logger12.success("useCaptchaMonitor", `URL \u76D1\u63A7\u5DF2\u542F\u7528\uFF1A${urlPattern}`);
6576
+ logger11.success("useCaptchaMonitor", `URL \u76D1\u63A7\u5DF2\u542F\u7528\uFF1A${urlPattern}`);
6680
6577
  cleanupFns.push(async () => {
6681
6578
  page.off("framenavigated", frameHandler);
6682
6579
  });
6683
6580
  }
6684
6581
  return {
6685
6582
  stop: async () => {
6686
- logger12.info("\u6B63\u5728\u505C\u6B62\u9A8C\u8BC1\u7801\u76D1\u63A7...");
6583
+ logger11.info("\u6B63\u5728\u505C\u6B62\u9A8C\u8BC1\u7801\u76D1\u63A7...");
6687
6584
  for (const fn of cleanupFns) {
6688
6585
  await fn();
6689
6586
  }
@@ -6722,7 +6619,7 @@ async function solveCaptchaWithStrategy(strategyName, page, options = {}) {
6722
6619
  );
6723
6620
  return strategy.sloveCaptcha(page, resolvedOptions, {
6724
6621
  callCaptchaRecognitionApi,
6725
- logger: logger12
6622
+ logger: logger11
6726
6623
  });
6727
6624
  }
6728
6625
  var Captcha = {
@@ -6733,7 +6630,7 @@ var Captcha = {
6733
6630
  // src/mutation.js
6734
6631
  import { createHash } from "node:crypto";
6735
6632
  import { v4 as uuidv42 } from "uuid";
6736
- var logger13 = createInternalLogger("Mutation");
6633
+ var logger12 = createInternalLogger("Mutation");
6737
6634
  var MUTATION_MONITOR_MODE = Object.freeze({
6738
6635
  Added: "added",
6739
6636
  Changed: "changed",
@@ -6766,14 +6663,14 @@ var Mutation = {
6766
6663
  const stableTime = options.stableTime ?? 5 * 1e3;
6767
6664
  const timeout = options.timeout ?? 120 * 1e3;
6768
6665
  const onMutation = options.onMutation;
6769
- logger13.start("waitForStable", `\u76D1\u63A7 ${selectorList.length} \u4E2A\u9009\u62E9\u5668, \u7A33\u5B9A\u65F6\u95F4=${stableTime}ms`);
6666
+ logger12.start("waitForStable", `\u76D1\u63A7 ${selectorList.length} \u4E2A\u9009\u62E9\u5668, \u7A33\u5B9A\u65F6\u95F4=${stableTime}ms`);
6770
6667
  if (initialTimeout > 0) {
6771
6668
  const selectorQuery = selectorList.join(",");
6772
6669
  try {
6773
6670
  await page.waitForSelector(selectorQuery, { timeout: initialTimeout });
6774
- logger13.info(`waitForStable \u5DF2\u68C0\u6D4B\u5230\u5143\u7D20: ${selectorQuery}`);
6671
+ logger12.info(`waitForStable \u5DF2\u68C0\u6D4B\u5230\u5143\u7D20: ${selectorQuery}`);
6775
6672
  } catch (e) {
6776
- logger13.warning(`waitForStable \u521D\u59CB\u7B49\u5F85\u8D85\u65F6 (${initialTimeout}ms): ${selectorQuery}`);
6673
+ logger12.warning(`waitForStable \u521D\u59CB\u7B49\u5F85\u8D85\u65F6 (${initialTimeout}ms): ${selectorQuery}`);
6777
6674
  throw e;
6778
6675
  }
6779
6676
  }
@@ -6789,7 +6686,7 @@ var Mutation = {
6789
6686
  return "__CONTINUE__";
6790
6687
  }
6791
6688
  });
6792
- logger13.info("waitForStable \u5DF2\u542F\u7528 onMutation \u56DE\u8C03");
6689
+ logger12.info("waitForStable \u5DF2\u542F\u7528 onMutation \u56DE\u8C03");
6793
6690
  } catch (e) {
6794
6691
  }
6795
6692
  }
@@ -6904,9 +6801,9 @@ var Mutation = {
6904
6801
  { selectorList, stableTime, timeout, callbackName, hasCallback: !!onMutation }
6905
6802
  );
6906
6803
  if (result.mutationCount === 0 && result.stableTime === 0) {
6907
- logger13.warning("waitForStable \u672A\u627E\u5230\u53EF\u76D1\u63A7\u7684\u5143\u7D20");
6804
+ logger12.warning("waitForStable \u672A\u627E\u5230\u53EF\u76D1\u63A7\u7684\u5143\u7D20");
6908
6805
  }
6909
- logger13.success("waitForStable", `DOM \u7A33\u5B9A, \u603B\u5171 ${result.mutationCount} \u6B21\u53D8\u5316${result.wasPaused ? ", \u66FE\u6682\u505C\u8BA1\u65F6" : ""}`);
6806
+ logger12.success("waitForStable", `DOM \u7A33\u5B9A, \u603B\u5171 ${result.mutationCount} \u6B21\u53D8\u5316${result.wasPaused ? ", \u66FE\u6682\u505C\u8BA1\u65F6" : ""}`);
6910
6807
  return result;
6911
6808
  },
6912
6809
  /**
@@ -7078,29 +6975,29 @@ var Mutation = {
7078
6975
  return "__CONTINUE__";
7079
6976
  }
7080
6977
  };
7081
- logger13.start(
6978
+ logger12.start(
7082
6979
  "waitForStableAcrossRoots",
7083
6980
  `\u76D1\u63A7 ${selectorList.length} \u4E2A\u9009\u62E9\u5668(\u8DE8 root), \u7A33\u5B9A\u65F6\u95F4=${waitForStableTime}ms`
7084
6981
  );
7085
6982
  if (initialTimeout > 0) {
7086
6983
  try {
7087
6984
  await page.waitForSelector(selectorQuery, { timeout: initialTimeout });
7088
- logger13.info(`waitForStableAcrossRoots \u5DF2\u68C0\u6D4B\u5230\u5143\u7D20: ${selectorQuery}`);
6985
+ logger12.info(`waitForStableAcrossRoots \u5DF2\u68C0\u6D4B\u5230\u5143\u7D20: ${selectorQuery}`);
7089
6986
  } catch (e) {
7090
- logger13.warning(`waitForStableAcrossRoots \u521D\u59CB\u7B49\u5F85\u8D85\u65F6 (${initialTimeout}ms): ${selectorQuery}`);
6987
+ logger12.warning(`waitForStableAcrossRoots \u521D\u59CB\u7B49\u5F85\u8D85\u65F6 (${initialTimeout}ms): ${selectorQuery}`);
7091
6988
  throw e;
7092
6989
  }
7093
6990
  }
7094
- let state = await buildState();
7095
- if (!state?.hasMatched) {
7096
- logger13.warning("waitForStableAcrossRoots \u672A\u627E\u5230\u53EF\u76D1\u63A7\u7684\u5143\u7D20");
6991
+ let state2 = await buildState();
6992
+ if (!state2?.hasMatched) {
6993
+ logger12.warning("waitForStableAcrossRoots \u672A\u627E\u5230\u53EF\u76D1\u63A7\u7684\u5143\u7D20");
7097
6994
  return { mutationCount: 0, stableTime: 0, wasPaused: false };
7098
6995
  }
7099
6996
  let mutationCount = 0;
7100
6997
  let stableSince = 0;
7101
6998
  let isPaused = false;
7102
6999
  let wasPaused = false;
7103
- let lastSnapshotKey = state.snapshotKey;
7000
+ let lastSnapshotKey = state2.snapshotKey;
7104
7001
  const applyPauseSignal = (signal) => {
7105
7002
  const nextPaused = signal === "__PAUSE__";
7106
7003
  if (nextPaused) {
@@ -7114,13 +7011,13 @@ var Mutation = {
7114
7011
  };
7115
7012
  const initialSignal = await invokeMutationCallback({
7116
7013
  mutationCount: 0,
7117
- html: state.html || "",
7118
- text: state.text || "",
7119
- mutationNodes: state.mutationNodes || []
7014
+ html: state2.html || "",
7015
+ text: state2.text || "",
7016
+ mutationNodes: state2.mutationNodes || []
7120
7017
  });
7121
7018
  applyPauseSignal(initialSignal);
7122
7019
  const deadline = Date.now() + overallTimeout;
7123
- let lastState = state;
7020
+ let lastState = state2;
7124
7021
  while (Date.now() < deadline) {
7125
7022
  await sleep(pollInterval);
7126
7023
  lastState = await buildState();
@@ -7130,7 +7027,7 @@ var Mutation = {
7130
7027
  if (lastState.snapshotKey !== lastSnapshotKey) {
7131
7028
  lastSnapshotKey = lastState.snapshotKey;
7132
7029
  mutationCount += 1;
7133
- logger13.info(
7030
+ logger12.info(
7134
7031
  `waitForStableAcrossRoots \u53D8\u5316#${mutationCount}, len=${lastState.snapshotLength}, path=${lastState.primaryPath || "unknown"}, preview="${truncate(lastState.text, 120)}"`
7135
7032
  );
7136
7033
  const signal = await invokeMutationCallback({
@@ -7143,7 +7040,7 @@ var Mutation = {
7143
7040
  continue;
7144
7041
  }
7145
7042
  if (!isPaused && stableSince > 0 && Date.now() - stableSince >= waitForStableTime) {
7146
- logger13.success("waitForStableAcrossRoots", `DOM \u7A33\u5B9A, \u603B\u5171 ${mutationCount} \u6B21\u53D8\u5316${wasPaused ? ", \u66FE\u6682\u505C\u8BA1\u65F6" : ""}`);
7043
+ logger12.success("waitForStableAcrossRoots", `DOM \u7A33\u5B9A, \u603B\u5171 ${mutationCount} \u6B21\u53D8\u5316${wasPaused ? ", \u66FE\u6682\u505C\u8BA1\u65F6" : ""}`);
7147
7044
  return {
7148
7045
  mutationCount,
7149
7046
  stableTime: waitForStableTime,
@@ -7170,7 +7067,7 @@ var Mutation = {
7170
7067
  const onMutation = options.onMutation;
7171
7068
  const rawMode = String(options.mode || MUTATION_MONITOR_MODE.Added).toLowerCase();
7172
7069
  const mode = [MUTATION_MONITOR_MODE.Added, MUTATION_MONITOR_MODE.Changed, MUTATION_MONITOR_MODE.All].includes(rawMode) ? rawMode : MUTATION_MONITOR_MODE.Added;
7173
- logger13.start("useMonitor", `\u76D1\u63A7 ${selectorList.length} \u4E2A\u9009\u62E9\u5668, mode=${mode}`);
7070
+ logger12.start("useMonitor", `\u76D1\u63A7 ${selectorList.length} \u4E2A\u9009\u62E9\u5668, mode=${mode}`);
7174
7071
  const monitorKey = generateKey("pk_mon");
7175
7072
  const callbackName = generateKey("pk_mon_cb");
7176
7073
  const cleanerName = generateKey("pk_mon_clean");
@@ -7313,7 +7210,7 @@ var Mutation = {
7313
7210
  return total;
7314
7211
  };
7315
7212
  }, { selectorList, monitorKey, callbackName, cleanerName, hasCallback: !!onMutation, mode });
7316
- logger13.success("useMonitor", "\u76D1\u63A7\u5668\u5DF2\u542F\u52A8");
7213
+ logger12.success("useMonitor", "\u76D1\u63A7\u5668\u5DF2\u542F\u52A8");
7317
7214
  return {
7318
7215
  stop: async () => {
7319
7216
  let totalMutations = 0;
@@ -7326,7 +7223,7 @@ var Mutation = {
7326
7223
  }, cleanerName);
7327
7224
  } catch (e) {
7328
7225
  }
7329
- logger13.success("useMonitor.stop", `\u76D1\u63A7\u5DF2\u505C\u6B62, \u5171 ${totalMutations} \u6B21\u53D8\u5316`);
7226
+ logger12.success("useMonitor.stop", `\u76D1\u63A7\u5DF2\u505C\u6B62, \u5171 ${totalMutations} \u6B21\u53D8\u5316`);
7330
7227
  return { totalMutations };
7331
7228
  }
7332
7229
  };
@@ -8195,7 +8092,7 @@ var createTemplateLogger = (baseLogger = createBaseLogger()) => {
8195
8092
  };
8196
8093
  var getDefaultBaseLogger = () => createBaseLogger("");
8197
8094
  var Logger = {
8198
- setLogger: (logger17) => setDefaultLogger(logger17),
8095
+ setLogger: (logger16) => setDefaultLogger(logger16),
8199
8096
  info: (message) => getDefaultBaseLogger().info(message),
8200
8097
  success: (message) => getDefaultBaseLogger().success(message),
8201
8098
  warning: (message) => getDefaultBaseLogger().warning(message),
@@ -8203,8 +8100,8 @@ var Logger = {
8203
8100
  error: (message) => getDefaultBaseLogger().error(message),
8204
8101
  debug: (message) => getDefaultBaseLogger().debug(message),
8205
8102
  start: (message) => getDefaultBaseLogger().start(message),
8206
- useTemplate: (logger17) => {
8207
- if (logger17) return createTemplateLogger(createBaseLogger("", logger17));
8103
+ useTemplate: (logger16) => {
8104
+ if (logger16) return createTemplateLogger(createBaseLogger("", logger16));
8208
8105
  return createTemplateLogger();
8209
8106
  }
8210
8107
  };
@@ -8278,7 +8175,7 @@ var LOCATION_NETWORK_SUFFIX_PATTERNS = [
8278
8175
  ];
8279
8176
  var cachedStripLogoSrcPromise = null;
8280
8177
  var cachedEnrichmentByContext = /* @__PURE__ */ new WeakMap();
8281
- var logger14 = createInternalLogger("Watermarkify");
8178
+ var logger13 = createInternalLogger("Watermarkify");
8282
8179
  var normalizeText = (value) => String(value || "").trim();
8283
8180
  var toInline = (value, maxLen = 200) => {
8284
8181
  const text = normalizeText(value);
@@ -8520,9 +8417,9 @@ var resolveWithCustomResolver = async (page, baseMeta, options = {}) => {
8520
8417
  location: toInline(resolved.location, 80)
8521
8418
  };
8522
8419
  if (enrichment.ip || enrichment.location) {
8523
- logger14.info(`\u81EA\u5B9A\u4E49 resolver \u547D\u4E2D: ip=${enrichment.ip || "-"}, loc=${enrichment.location || "-"}`);
8420
+ logger13.info(`\u81EA\u5B9A\u4E49 resolver \u547D\u4E2D: ip=${enrichment.ip || "-"}, loc=${enrichment.location || "-"}`);
8524
8421
  } else {
8525
- logger14.warning("\u81EA\u5B9A\u4E49 resolver \u5DF2\u6267\u884C\uFF0C\u4F46\u672A\u8FD4\u56DE IP/Loc");
8422
+ logger13.warning("\u81EA\u5B9A\u4E49 resolver \u5DF2\u6267\u884C\uFF0C\u4F46\u672A\u8FD4\u56DE IP/Loc");
8526
8423
  }
8527
8424
  return enrichment;
8528
8425
  } finally {
@@ -8711,12 +8608,12 @@ var normalizeWatermarkifyRenderMode = (value) => {
8711
8608
  };
8712
8609
  var composeScreenshotBufferWithBrowser = async (page, buffer, overlaySvg, imageInfo = {}, options = {}) => {
8713
8610
  if (!page || typeof page.context !== "function") {
8714
- logger14.warning("watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u8DF3\u8FC7: \u7F3A\u5C11\u53EF\u7528 page");
8611
+ logger13.warning("watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u8DF3\u8FC7: \u7F3A\u5C11\u53EF\u7528 page");
8715
8612
  return buffer;
8716
8613
  }
8717
8614
  const renderScope = await openProbePage(page);
8718
8615
  if (!renderScope?.page) {
8719
- logger14.warning("watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u8DF3\u8FC7: \u65E0\u6CD5\u521B\u5EFA render page");
8616
+ logger13.warning("watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u8DF3\u8FC7: \u65E0\u6CD5\u521B\u5EFA render page");
8720
8617
  return buffer;
8721
8618
  }
8722
8619
  try {
@@ -8781,13 +8678,13 @@ var composeScreenshotBufferWithBrowser = async (page, buffer, overlaySvg, imageI
8781
8678
  fullPage: true,
8782
8679
  animations: "disabled"
8783
8680
  }).catch((error) => {
8784
- logger14.warning(`watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u5931\u8D25: ${error instanceof Error ? error.message : String(error)}`);
8681
+ logger13.warning(`watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u5931\u8D25: ${error instanceof Error ? error.message : String(error)}`);
8785
8682
  return null;
8786
8683
  });
8787
8684
  if (Buffer.isBuffer(composed) && composed.length > 0) {
8788
8685
  return composed;
8789
8686
  }
8790
- logger14.warning("watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u5931\u8D25: \u672A\u5F97\u5230\u6709\u6548\u622A\u56FE\u7ED3\u679C");
8687
+ logger13.warning("watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u5931\u8D25: \u672A\u5F97\u5230\u6709\u6548\u622A\u56FE\u7ED3\u679C");
8791
8688
  return buffer;
8792
8689
  } finally {
8793
8690
  await renderScope.close().catch(() => {
@@ -8800,7 +8697,7 @@ var resolveWithIpLookup = async (page, options = {}) => {
8800
8697
  }
8801
8698
  const probeScope = await openProbePage(page);
8802
8699
  if (!probeScope?.page) {
8803
- logger14.warning("ipLookup \u8DF3\u8FC7: \u65E0\u6CD5\u521B\u5EFA probe page");
8700
+ logger13.warning("ipLookup \u8DF3\u8FC7: \u65E0\u6CD5\u521B\u5EFA probe page");
8804
8701
  return null;
8805
8702
  }
8806
8703
  const timeoutMs = Math.max(
@@ -8809,12 +8706,12 @@ var resolveWithIpLookup = async (page, options = {}) => {
8809
8706
  );
8810
8707
  try {
8811
8708
  const probePage = probeScope.page;
8812
- logger14.info(`ipLookup \u5C1D\u8BD5: url=${DEFAULT_IP_LOOKUP_URL}, timeoutMs=${timeoutMs}`);
8709
+ logger13.info(`ipLookup \u5C1D\u8BD5: url=${DEFAULT_IP_LOOKUP_URL}, timeoutMs=${timeoutMs}`);
8813
8710
  const response = await probePage.goto(DEFAULT_IP_LOOKUP_URL, {
8814
8711
  waitUntil: "commit",
8815
8712
  timeout: timeoutMs
8816
8713
  }).catch((error) => {
8817
- logger14.warning(`ipLookup \u8BF7\u6C42\u5931\u8D25: url=${DEFAULT_IP_LOOKUP_URL}, error=${error instanceof Error ? error.message : String(error)}`);
8714
+ logger13.warning(`ipLookup \u8BF7\u6C42\u5931\u8D25: url=${DEFAULT_IP_LOOKUP_URL}, error=${error instanceof Error ? error.message : String(error)}`);
8818
8715
  return null;
8819
8716
  });
8820
8717
  const status = response && typeof response.status === "function" ? response.status() : 0;
@@ -8836,13 +8733,13 @@ var resolveWithIpLookup = async (page, options = {}) => {
8836
8733
  }
8837
8734
  const parsed = parseIpIpJsonResponse(rawText);
8838
8735
  if (parsed?.ip || parsed?.location) {
8839
- logger14.info(`ipLookup \u6210\u529F: url=${DEFAULT_IP_LOOKUP_URL}, status=${status || "-"}, contentType=${contentType || "-"}, ip=${parsed.ip || "-"}, loc=${parsed.location || "-"}`);
8736
+ logger13.info(`ipLookup \u6210\u529F: url=${DEFAULT_IP_LOOKUP_URL}, status=${status || "-"}, contentType=${contentType || "-"}, ip=${parsed.ip || "-"}, loc=${parsed.location || "-"}`);
8840
8737
  return parsed;
8841
8738
  }
8842
- logger14.warning(`ipLookup \u672A\u89E3\u6790\u51FA IP/Loc: url=${DEFAULT_IP_LOOKUP_URL}, status=${status || "-"}, contentType=${contentType || "-"}, preview=${shortenTail(rawText, 120) || "[empty]"}`);
8739
+ logger13.warning(`ipLookup \u672A\u89E3\u6790\u51FA IP/Loc: url=${DEFAULT_IP_LOOKUP_URL}, status=${status || "-"}, contentType=${contentType || "-"}, preview=${shortenTail(rawText, 120) || "[empty]"}`);
8843
8740
  return null;
8844
8741
  } catch (error) {
8845
- logger14.warning(`ipLookup \u6267\u884C\u5F02\u5E38\uFF0C\u672A\u83B7\u5F97 IP/Loc: ${error instanceof Error ? error.message : String(error)}`);
8742
+ logger13.warning(`ipLookup \u6267\u884C\u5F02\u5E38\uFF0C\u672A\u83B7\u5F97 IP/Loc: ${error instanceof Error ? error.message : String(error)}`);
8846
8743
  return null;
8847
8744
  } finally {
8848
8745
  await probeScope.close().catch(() => {
@@ -8856,10 +8753,10 @@ var resolveEnrichment = async (page, baseMeta, options) => {
8856
8753
  ip: toInline(options.ip, 80),
8857
8754
  location: toInline(options.location, 80)
8858
8755
  };
8859
- logger14.info(`enrichment \u5F00\u59CB: host=${baseMeta.hostname || "-"}, hasPresetIp=${Boolean(merged.ip)}, hasPresetLoc=${Boolean(merged.location)}, ipLookup=${options.ipLookup !== false}`);
8756
+ logger13.info(`enrichment \u5F00\u59CB: host=${baseMeta.hostname || "-"}, hasPresetIp=${Boolean(merged.ip)}, hasPresetLoc=${Boolean(merged.location)}, ipLookup=${options.ipLookup !== false}`);
8860
8757
  if (!merged.ip || !merged.location) {
8861
8758
  if (cached?.ip || cached?.location) {
8862
- logger14.info(`enrichment \u547D\u4E2D\u4E0A\u4E0B\u6587\u7F13\u5B58: ip=${cached.ip || "-"}, loc=${cached.location || "-"}`);
8759
+ logger13.info(`enrichment \u547D\u4E2D\u4E0A\u4E0B\u6587\u7F13\u5B58: ip=${cached.ip || "-"}, loc=${cached.location || "-"}`);
8863
8760
  }
8864
8761
  fillEnrichment(merged, cached);
8865
8762
  }
@@ -8883,15 +8780,15 @@ var resolveEnrichment = async (page, baseMeta, options) => {
8883
8780
  "x-geo-country"
8884
8781
  ]), 80);
8885
8782
  if (!merged.location || isWeakLocationValue(merged.location) && headerLocation) {
8886
- logger14.info(`enrichment \u4F7F\u7528\u54CD\u5E94\u5934\u8865\u5145 Loc: ${headerLocation || "-"}`);
8783
+ logger13.info(`enrichment \u4F7F\u7528\u54CD\u5E94\u5934\u8865\u5145 Loc: ${headerLocation || "-"}`);
8887
8784
  merged.location = headerLocation || merged.location;
8888
8785
  }
8889
8786
  }
8890
8787
  writeCachedEnrichment(page, merged);
8891
8788
  if (merged.ip || merged.location) {
8892
- logger14.info(`enrichment \u5B8C\u6210: ip=${merged.ip || "-"}, loc=${merged.location || "-"}`);
8789
+ logger13.info(`enrichment \u5B8C\u6210: ip=${merged.ip || "-"}, loc=${merged.location || "-"}`);
8893
8790
  } else {
8894
- logger14.warning("enrichment \u5B8C\u6210: \u672A\u83B7\u5F97 IP/Loc");
8791
+ logger13.warning("enrichment \u5B8C\u6210: \u672A\u83B7\u5F97 IP/Loc");
8895
8792
  }
8896
8793
  return merged;
8897
8794
  };
@@ -9704,7 +9601,7 @@ var watermarkifyScreenshotBuffer = async (buffer, meta, page = null, options = {
9704
9601
  }
9705
9602
  const imageInfo = readImageInfo(buffer);
9706
9603
  if (!imageInfo.width || !imageInfo.height || !imageInfo.mimeType) {
9707
- logger14.warning("watermarkify \u8DF3\u8FC7: \u65E0\u6CD5\u89E3\u6790\u622A\u56FE\u5C3A\u5BF8\u6216\u683C\u5F0F");
9604
+ logger13.warning("watermarkify \u8DF3\u8FC7: \u65E0\u6CD5\u89E3\u6790\u622A\u56FE\u5C3A\u5BF8\u6216\u683C\u5F0F");
9708
9605
  return buffer;
9709
9606
  }
9710
9607
  const isMobileStrip = normalizeDevice(meta.device) === Device.Mobile && hasStrip;
@@ -9722,7 +9619,7 @@ var watermarkifyScreenshotBuffer = async (buffer, meta, page = null, options = {
9722
9619
 
9723
9620
  // src/internals/compression.js
9724
9621
  import { Jimp, JimpMime, ResizeStrategy } from "jimp";
9725
- var logger15 = createInternalLogger("Compression");
9622
+ var logger14 = createInternalLogger("Compression");
9726
9623
  var DEFAULT_SCREENSHOT_MAX_BYTES = 5 * 1024 * 1024;
9727
9624
  var DEFAULT_SCREENSHOT_OUTPUT_TYPE = "jpeg";
9728
9625
  var DEFAULT_SCREENSHOT_QUALITY = 0.72;
@@ -9841,18 +9738,18 @@ var compressImageBufferToBase64 = async (buffer, compression) => {
9841
9738
  return buffer.toString("base64");
9842
9739
  }
9843
9740
  const result = await compressImageBuffer(buffer, compression).catch((error) => {
9844
- logger15.warning(`captureScreen \u538B\u7F29\u5931\u8D25\uFF0C\u8FD4\u56DE\u539F\u56FE: ${error instanceof Error ? error.message : String(error)}`);
9741
+ logger14.warning(`captureScreen \u538B\u7F29\u5931\u8D25\uFF0C\u8FD4\u56DE\u539F\u56FE: ${error instanceof Error ? error.message : String(error)}`);
9845
9742
  return null;
9846
9743
  });
9847
9744
  if (!result?.buffer) {
9848
9745
  return buffer.toString("base64");
9849
9746
  }
9850
9747
  if (result.withinLimit) {
9851
- logger15.info(
9748
+ logger14.info(
9852
9749
  `captureScreen \u5DF2\u538B\u7F29: ${originalBytes} -> ${result.bytes} bytes, format=${result.format}, quality=${result.quality}, scale=${result.scale}, size=${result.width}x${result.height}`
9853
9750
  );
9854
9751
  } else {
9855
- logger15.warning(
9752
+ logger14.warning(
9856
9753
  `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}`
9857
9754
  );
9858
9755
  }
@@ -9860,7 +9757,7 @@ var compressImageBufferToBase64 = async (buffer, compression) => {
9860
9757
  };
9861
9758
 
9862
9759
  // src/share.js
9863
- var logger16 = createInternalLogger("Share");
9760
+ var logger15 = createInternalLogger("Share");
9864
9761
  var DEFAULT_TIMEOUT_MS2 = 50 * 1e3;
9865
9762
  var DEFAULT_PAYLOAD_SNAPSHOT_MAX_LEN = 500;
9866
9763
  var DEFAULT_POLL_INTERVAL_MS = 120;
@@ -9997,7 +9894,7 @@ var createDomShareMonitor = async (page, options = {}) => {
9997
9894
  const onMatch = typeof options.onMatch === "function" ? options.onMatch : null;
9998
9895
  const onTelemetry = typeof options.onTelemetry === "function" ? options.onTelemetry : null;
9999
9896
  let matched = false;
10000
- logger16.info(`DOM \u76D1\u542C\u51C6\u5907\u6302\u8F7D: selectors=${toJsonInline(selectors, 120)}, mode=${mode}`);
9897
+ logger15.info(`DOM \u76D1\u542C\u51C6\u5907\u6302\u8F7D: selectors=${toJsonInline(selectors, 120)}, mode=${mode}`);
10001
9898
  const monitor = await Mutation.useMonitor(page, selectors, {
10002
9899
  mode,
10003
9900
  onMutation: (context = {}) => {
@@ -10015,12 +9912,12 @@ ${text}`;
10015
9912
  });
10016
9913
  }
10017
9914
  if (mutationCount <= 5 || mutationCount % 50 === 0) {
10018
- logger16.info(`DOM \u53D8\u5316\u5DF2\u6355\u83B7: mutationCount=${mutationCount}, mutationNodes=${mutationNodes.length}`);
9915
+ logger15.info(`DOM \u53D8\u5316\u5DF2\u6355\u83B7: mutationCount=${mutationCount}, mutationNodes=${mutationNodes.length}`);
10019
9916
  }
10020
9917
  const [candidate] = Utils.parseLinks(rawDom, { prefix }) || [];
10021
9918
  if (!candidate) return;
10022
9919
  matched = true;
10023
- logger16.success("captureLink.domHit", `DOM \u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: mutationCount=${mutationCount}, link=${candidate}`);
9920
+ logger15.success("captureLink.domHit", `DOM \u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: mutationCount=${mutationCount}, link=${candidate}`);
10024
9921
  if (onMatch) {
10025
9922
  onMatch({
10026
9923
  link: candidate,
@@ -10036,7 +9933,7 @@ ${text}`;
10036
9933
  return {
10037
9934
  stop: async () => {
10038
9935
  const result = await monitor.stop();
10039
- logger16.info(`DOM \u76D1\u542C\u5DF2\u505C\u6B62: totalMutations=${result?.totalMutations || 0}`);
9936
+ logger15.info(`DOM \u76D1\u542C\u5DF2\u505C\u6B62: totalMutations=${result?.totalMutations || 0}`);
10040
9937
  return result;
10041
9938
  }
10042
9939
  };
@@ -10085,8 +9982,8 @@ var Share = {
10085
9982
  if (share.mode === "response" && apiMatchers.length === 0) {
10086
9983
  throw new Error("Share.captureLink requires share.xurl[0] api matcher when mode=response");
10087
9984
  }
10088
- logger16.start("captureLink", `mode=${share.mode}, timeoutMs=${timeoutDisabled ? "disabled" : timeoutMs}, prefix=${share.prefix}`);
10089
- logger16.info(`captureLink \u914D\u7F6E: xurl=${toJsonInline(share.xurl)}, domMode=${domMode}, domSelectors=${toJsonInline(domSelectors, 120)}`);
9985
+ logger15.start("captureLink", `mode=${share.mode}, timeoutMs=${timeoutDisabled ? "disabled" : timeoutMs}, prefix=${share.prefix}`);
9986
+ logger15.info(`captureLink \u914D\u7F6E: xurl=${toJsonInline(share.xurl)}, domMode=${domMode}, domSelectors=${toJsonInline(domSelectors, 120)}`);
10090
9987
  const stats = {
10091
9988
  actionTimedOut: false,
10092
9989
  domMutationCount: 0,
@@ -10098,7 +9995,7 @@ var Share = {
10098
9995
  responseSampleUrls: []
10099
9996
  };
10100
9997
  if (isAborted()) {
10101
- logger16.warning(`captureLink \u5DF2\u53D6\u6D88: ${abortReason()}`);
9998
+ logger15.warning(`captureLink \u5DF2\u53D6\u6D88: ${abortReason()}`);
10102
9999
  return {
10103
10000
  link: null,
10104
10001
  payloadText: "",
@@ -10121,7 +10018,7 @@ var Share = {
10121
10018
  link: validated,
10122
10019
  payloadText: String(payloadText || "")
10123
10020
  };
10124
- logger16.info(`\u5019\u9009\u94FE\u63A5\u5DF2\u786E\u8BA4: source=${source}, link=${validated}`);
10021
+ logger15.info(`\u5019\u9009\u94FE\u63A5\u5DF2\u786E\u8BA4: source=${source}, link=${validated}`);
10125
10022
  return true;
10126
10023
  };
10127
10024
  const resolveResponseCandidate = (responseText) => {
@@ -10156,7 +10053,7 @@ var Share = {
10156
10053
  try {
10157
10054
  await monitor.stop();
10158
10055
  } catch (error) {
10159
- logger16.warning(`\u505C\u6B62 DOM \u76D1\u542C\u5931\u8D25: ${error instanceof Error ? error.message : String(error)}`);
10056
+ logger15.warning(`\u505C\u6B62 DOM \u76D1\u542C\u5931\u8D25: ${error instanceof Error ? error.message : String(error)}`);
10160
10057
  }
10161
10058
  };
10162
10059
  const onResponse = async (response) => {
@@ -10170,29 +10067,29 @@ var Share = {
10170
10067
  stats.responseSampleUrls.push(url);
10171
10068
  }
10172
10069
  if (stats.responseObserved <= 5) {
10173
- logger16.info(`\u63A5\u53E3\u54CD\u5E94\u91C7\u6837(${stats.responseObserved}): ${url}`);
10070
+ logger15.info(`\u63A5\u53E3\u54CD\u5E94\u91C7\u6837(${stats.responseObserved}): ${url}`);
10174
10071
  }
10175
10072
  if (!apiMatchers.some((matcher) => url.includes(matcher))) return;
10176
10073
  stats.responseMatched += 1;
10177
10074
  stats.lastMatchedUrl = url;
10178
- logger16.info(`\u63A5\u53E3\u547D\u4E2D\u5339\u914D(${stats.responseMatched}): ${url}`);
10075
+ logger15.info(`\u63A5\u53E3\u547D\u4E2D\u5339\u914D(${stats.responseMatched}): ${url}`);
10179
10076
  const text = await response.text();
10180
10077
  const hit = resolveResponseCandidate(text);
10181
10078
  if (!hit?.link) {
10182
10079
  if (stats.responseMatched <= 3) {
10183
- logger16.info(`\u63A5\u53E3\u89E3\u6790\u5B8C\u6210\u4F46\u672A\u63D0\u53D6\u5230\u5206\u4EAB\u94FE\u63A5: payloadSize=${text.length}`);
10080
+ logger15.info(`\u63A5\u53E3\u89E3\u6790\u5B8C\u6210\u4F46\u672A\u63D0\u53D6\u5230\u5206\u4EAB\u94FE\u63A5: payloadSize=${text.length}`);
10184
10081
  }
10185
10082
  return;
10186
10083
  }
10187
10084
  stats.responseResolved += 1;
10188
- logger16.success("captureLink.responseHit", `\u63A5\u53E3\u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: url=${url}, link=${hit.link}`);
10085
+ logger15.success("captureLink.responseHit", `\u63A5\u53E3\u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: url=${url}, link=${hit.link}`);
10189
10086
  setCandidate("response", hit.link, hit.payloadText);
10190
10087
  } catch (error) {
10191
- logger16.warning(`\u63A5\u53E3\u54CD\u5E94\u5904\u7406\u5F02\u5E38: ${error instanceof Error ? error.message : String(error)}`);
10088
+ logger15.warning(`\u63A5\u53E3\u54CD\u5E94\u5904\u7406\u5F02\u5E38: ${error instanceof Error ? error.message : String(error)}`);
10192
10089
  }
10193
10090
  };
10194
10091
  if (share.mode === "dom") {
10195
- logger16.info("\u5F53\u524D\u4E3A DOM \u6A21\u5F0F\uFF0C\u4EC5\u542F\u7528 DOM \u76D1\u542C");
10092
+ logger15.info("\u5F53\u524D\u4E3A DOM \u6A21\u5F0F\uFF0C\u4EC5\u542F\u7528 DOM \u76D1\u542C");
10196
10093
  domMonitor = await createDomShareMonitor(page, {
10197
10094
  prefix: share.prefix,
10198
10095
  selectors: domSelectors,
@@ -10207,17 +10104,17 @@ var Share = {
10207
10104
  });
10208
10105
  }
10209
10106
  if (share.mode === "response") {
10210
- logger16.info(`\u5F53\u524D\u4E3A\u63A5\u53E3\u6A21\u5F0F\uFF0C\u6302\u8F7D response \u76D1\u542C: apiMatchers=${toJsonInline(apiMatchers, 160)}`);
10107
+ logger15.info(`\u5F53\u524D\u4E3A\u63A5\u53E3\u6A21\u5F0F\uFF0C\u6302\u8F7D response \u76D1\u542C: apiMatchers=${toJsonInline(apiMatchers, 160)}`);
10211
10108
  page.on("response", onResponse);
10212
10109
  }
10213
10110
  if (share.mode === "custom") {
10214
- logger16.info("\u5F53\u524D\u4E3A custom \u6A21\u5F0F\uFF0C\u5C06\u4F7F\u7528 performActions \u8FD4\u56DE\u503C");
10111
+ logger15.info("\u5F53\u524D\u4E3A custom \u6A21\u5F0F\uFF0C\u5C06\u4F7F\u7528 performActions \u8FD4\u56DE\u503C");
10215
10112
  }
10216
10113
  const deadline = timeoutDisabled ? Infinity : Date.now() + timeoutMs;
10217
10114
  const getRemainingMs = () => timeoutDisabled ? Infinity : Math.max(0, deadline - Date.now());
10218
10115
  try {
10219
10116
  const actionTimeout = getRemainingMs();
10220
- logger16.start("captureLink.performActions", `\u6267\u884C\u52A8\u4F5C\u9884\u7B97=${timeoutDisabled ? "disabled" : `${actionTimeout}ms`}`);
10117
+ logger15.start("captureLink.performActions", `\u6267\u884C\u52A8\u4F5C\u9884\u7B97=${timeoutDisabled ? "disabled" : `${actionTimeout}ms`}`);
10221
10118
  let actionValue;
10222
10119
  if (!isAborted() && actionTimeout > 0) {
10223
10120
  let timer = null;
@@ -10230,30 +10127,30 @@ var Share = {
10230
10127
  ]);
10231
10128
  if (timer) clearTimeout(timer);
10232
10129
  if (actionResult.type === "error") {
10233
- logger16.fail("captureLink.performActions", actionResult.error);
10130
+ logger15.fail("captureLink.performActions", actionResult.error);
10234
10131
  throw actionResult.error;
10235
10132
  }
10236
10133
  if (actionResult.type === "timeout") {
10237
10134
  stats.actionTimedOut = true;
10238
- logger16.warning(`performActions \u5DF2\u8D85\u65F6 (${actionTimeout}ms)\uFF0C\u52A8\u4F5C\u53EF\u80FD\u4ECD\u5728\u5F02\u6B65\u6267\u884C`);
10135
+ logger15.warning(`performActions \u5DF2\u8D85\u65F6 (${actionTimeout}ms)\uFF0C\u52A8\u4F5C\u53EF\u80FD\u4ECD\u5728\u5F02\u6B65\u6267\u884C`);
10239
10136
  } else {
10240
10137
  actionValue = actionResult.result;
10241
- logger16.success("captureLink.performActions", "\u6267\u884C\u52A8\u4F5C\u5B8C\u6210");
10138
+ logger15.success("captureLink.performActions", "\u6267\u884C\u52A8\u4F5C\u5B8C\u6210");
10242
10139
  }
10243
10140
  }
10244
10141
  if (share.mode === "custom") {
10245
10142
  const customLink = typeof actionValue === "string" ? actionValue : actionValue?.link || actionValue?.payloadText;
10246
10143
  const customPayloadText = typeof actionValue === "string" ? actionValue : actionValue?.payloadText;
10247
10144
  if (setCandidate("custom", customLink, customPayloadText)) {
10248
- logger16.success("captureLink.customResult", `custom \u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: link=${candidates.custom.link}`);
10145
+ logger15.success("captureLink.customResult", `custom \u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: link=${candidates.custom.link}`);
10249
10146
  } else {
10250
- logger16.warning("performActions \u6267\u884C\u5B8C\u6210\u4F46\u672A\u8FD4\u56DE\u6709\u6548\u5206\u4EAB\u94FE\u63A5");
10147
+ logger15.warning("performActions \u6267\u884C\u5B8C\u6210\u4F46\u672A\u8FD4\u56DE\u6709\u6548\u5206\u4EAB\u94FE\u63A5");
10251
10148
  }
10252
10149
  }
10253
10150
  let nextProgressLogTs = Date.now() + 3e3;
10254
10151
  while (true) {
10255
10152
  if (isAborted()) {
10256
- logger16.warning(`captureLink \u5DF2\u53D6\u6D88: ${abortReason()}`);
10153
+ logger15.warning(`captureLink \u5DF2\u53D6\u6D88: ${abortReason()}`);
10257
10154
  return {
10258
10155
  link: null,
10259
10156
  payloadText: "",
@@ -10263,7 +10160,7 @@ var Share = {
10263
10160
  }
10264
10161
  const selected = candidates[share.mode];
10265
10162
  if (selected?.link) {
10266
- logger16.success("captureLink", `\u6355\u83B7\u6210\u529F: source=${share.mode}, link=${selected.link}`);
10163
+ logger15.success("captureLink", `\u6355\u83B7\u6210\u529F: source=${share.mode}, link=${selected.link}`);
10267
10164
  return {
10268
10165
  link: selected.link,
10269
10166
  payloadText: selected.payloadText,
@@ -10276,7 +10173,7 @@ var Share = {
10276
10173
  if (remaining <= 0) break;
10277
10174
  const now = Date.now();
10278
10175
  if (now >= nextProgressLogTs) {
10279
- logger16.info(
10176
+ logger15.info(
10280
10177
  `captureLink \u7B49\u5F85\u4E2D: remaining=${timeoutDisabled ? "disabled" : `${remaining}ms`}, domMutationCount=${stats.domMutationCount}, responseMatched=${stats.responseMatched}`
10281
10178
  );
10282
10179
  nextProgressLogTs = now + 5e3;
@@ -10284,11 +10181,11 @@ var Share = {
10284
10181
  await delay5(Math.max(0, Math.min(DEFAULT_POLL_INTERVAL_MS, remaining)));
10285
10182
  }
10286
10183
  if (!timeoutDisabled && share.mode === "response" && stats.responseMatched === 0) {
10287
- logger16.warning(
10184
+ logger15.warning(
10288
10185
  `\u63A5\u53E3\u76D1\u542C\u672A\u547D\u4E2D: apiMatchers=${toJsonInline(apiMatchers, 220)}, \u54CD\u5E94\u6837\u672CURLs=${toJsonInline(stats.responseSampleUrls, 420)}`
10289
10186
  );
10290
10187
  }
10291
- logger16.warning(
10188
+ logger15.warning(
10292
10189
  `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"}`
10293
10190
  );
10294
10191
  return {
@@ -10300,7 +10197,7 @@ var Share = {
10300
10197
  } finally {
10301
10198
  if (share.mode === "response") {
10302
10199
  page.off("response", onResponse);
10303
- logger16.info("response \u76D1\u542C\u5DF2\u5378\u8F7D");
10200
+ logger15.info("response \u76D1\u542C\u5DF2\u5378\u8F7D");
10304
10201
  }
10305
10202
  await stopDomMonitor();
10306
10203
  }