@skrillex1224/playwright-toolkit 2.1.279 → 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;
4661
4751
  }
4662
- return cachedCloakHumanModulePromise;
4752
+ const resolvedTarget = resolveNativeTarget2(page, target);
4753
+ if (throwOnMissing || await targetExists(resolvedTarget)) {
4754
+ return resolvedTarget;
4755
+ }
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,237 +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
- actionOptions.force = true;
4687
4785
  const humanConfig = buildTypingHumanConfig(options);
4688
4786
  if (humanConfig) {
4689
4787
  actionOptions.human_config = humanConfig;
4690
4788
  }
4691
4789
  return actionOptions;
4692
4790
  };
4693
- var ensureDesktopHumanized = async (page) => {
4694
- if (!page || typeof page !== "object") {
4695
- throw new Error("Humanize requires a Playwright page");
4696
- }
4697
- const humanModule = await loadCloakHumanModule();
4698
- if (page._original && page._humanCursor) {
4699
- humanizedPages.add(page);
4700
- return humanModule;
4701
- }
4702
- if (humanizedPages.has(page)) {
4703
- return humanModule;
4704
- }
4705
- const config = page._humanCfg || humanModule.resolveConfig?.("default") || humanModule.resolveConfig?.();
4706
- const cursor = page._humanCursor || { x: 0, y: 0, initialized: false };
4707
- humanModule.patchPage(page, config, cursor);
4708
- humanizedPages.add(page);
4709
- return humanModule;
4710
- };
4711
- var patchHandle = async (page, handle) => {
4712
- if (!handle || typeof handle !== "object") return handle;
4713
- const humanModule = await ensureDesktopHumanized(page);
4714
- humanModule.patchSingleElementHandle(
4715
- handle,
4716
- page,
4717
- page._humanCfg,
4718
- page._humanCursor,
4719
- page._humanRaw,
4720
- page._humanRawKb,
4721
- page._humanOriginals,
4722
- page._stealth
4723
- );
4724
- return handle;
4725
- };
4726
- var resolvePatchedTarget = async (page, target, { throwOnMissing = true } = {}) => {
4727
- if (target == null) {
4728
- return { target: null, dispose: null };
4729
- }
4730
- if (typeof target === "string") {
4731
- const handle = await page.$(target);
4732
- if (!handle) {
4733
- if (throwOnMissing) {
4734
- throw new Error(`\u627E\u4E0D\u5230\u5143\u7D20 ${String(target)}`);
4735
- }
4736
- return { target: null, dispose: null };
4737
- }
4738
- return { target: handle, dispose: null };
4739
- }
4740
- if (typeof target.elementHandle === "function") {
4741
- const handle = await target.elementHandle();
4742
- if (!handle) {
4743
- if (throwOnMissing) {
4744
- throw new Error("\u627E\u4E0D\u5230 locator \u5BF9\u5E94\u7684\u5143\u7D20");
4745
- }
4746
- return { target: null, dispose: null };
4747
- }
4748
- await patchHandle(page, handle);
4749
- return {
4750
- target: handle,
4751
- dispose: async () => {
4752
- await handle.dispose().catch(() => {
4753
- });
4754
- }
4755
- };
4756
- }
4757
- await patchHandle(page, target);
4758
- return { target, dispose: null };
4759
- };
4760
4791
  var jitterSleep = async (baseMs, jitterPercent = 0.3) => {
4761
4792
  await delay4(jitterMs(baseMs, jitterPercent));
4762
4793
  };
4763
- var humanMoveToPoint = async (page, point) => {
4764
- await ensureDesktopHumanized(page);
4794
+ var moveCursorToPoint = async (page, point) => {
4765
4795
  await page.mouse.move(Number(point.x), Number(point.y));
4766
4796
  return true;
4767
4797
  };
4768
- var doDesktopHumanClick = async (page, target, options = {}) => {
4769
- await ensureDesktopHumanized(page);
4770
- if (target == null) {
4771
- const cursor = page._humanCursor || { x: 0, y: 0 };
4772
- await page.mouse.click(cursor.x || 0, cursor.y || 0);
4773
- return true;
4774
- }
4775
- if (isPoint2(target)) {
4776
- return humanMoveToPoint(page, target).then(async () => {
4777
- await page.mouse.click(Number(target.x), Number(target.y));
4778
- return true;
4779
- });
4780
- }
4781
- const throwOnMissing = options.throwOnMissing !== false;
4782
- if (typeof target === "string") {
4783
- if (!throwOnMissing) {
4784
- const existingHandle = await page.$(target);
4785
- if (!existingHandle) {
4786
- return false;
4787
- }
4788
- await existingHandle.click(buildActionOptions(options));
4789
- return true;
4790
- }
4791
- await page.click(target, buildActionOptions(options));
4792
- return true;
4793
- }
4794
- const { target: resolvedTarget, dispose } = await resolvePatchedTarget(page, target, { throwOnMissing });
4795
- try {
4796
- if (!resolvedTarget) {
4797
- return false;
4798
- }
4799
- if (typeof resolvedTarget.click === "function") {
4800
- await resolvedTarget.click(buildActionOptions(options));
4801
- return true;
4802
- }
4803
- const box = await resolvedTarget.boundingBox?.();
4804
- if (!box) {
4805
- if (throwOnMissing) {
4806
- throw new Error("\u65E0\u6CD5\u83B7\u53D6\u5143\u7D20\u4F4D\u7F6E");
4807
- }
4808
- return false;
4809
- }
4810
- await page.mouse.click(box.x + box.width / 2, box.y + box.height / 2);
4811
- return true;
4812
- } finally {
4813
- if (typeof dispose === "function") {
4814
- await dispose();
4815
- }
4816
- }
4817
- };
4818
4798
  var CloakBrowserHumanize = {
4819
4799
  jitterMs(base, jitterPercent = 0.3) {
4820
4800
  return jitterMs(base, jitterPercent);
4821
4801
  },
4822
4802
  async initializeCursor(page) {
4823
4803
  if (isMobilePage(page)) {
4824
- return MobileHumanize.initializeCursor(page);
4804
+ return await MobileHumanize.initializeCursor(page);
4825
4805
  }
4826
- await ensureDesktopHumanized(page);
4827
- logger7.debug("initializeCursor: cloakbrowser human layer ready");
4806
+ return Boolean(page);
4828
4807
  },
4829
4808
  async humanMove(page, target) {
4830
4809
  if (isMobilePage(page)) {
4831
4810
  return await MobileHumanize.humanMove(page, target);
4832
4811
  }
4833
- await ensureDesktopHumanized(page);
4834
4812
  if (isPoint2(target)) {
4835
- return await humanMoveToPoint(page, target);
4813
+ return await moveCursorToPoint(page, target);
4836
4814
  }
4837
- const { target: resolvedTarget, dispose } = await resolvePatchedTarget(page, target, { throwOnMissing: false });
4838
- try {
4839
- if (!resolvedTarget) {
4840
- return false;
4841
- }
4842
- if (typeof resolvedTarget.hover === "function") {
4843
- await resolvedTarget.hover({ force: true });
4844
- return true;
4845
- }
4846
- const box = await resolvedTarget.boundingBox?.();
4847
- if (!box) {
4848
- return false;
4849
- }
4850
- 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 });
4851
4821
  return true;
4852
- } finally {
4853
- if (typeof dispose === "function") {
4854
- await dispose();
4855
- }
4856
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
+ });
4857
4831
  },
4858
4832
  async humanScroll(page, target, options = {}) {
4859
4833
  if (isMobilePage(page)) {
4860
4834
  return await MobileHumanize.humanScroll(page, target, options);
4861
4835
  }
4862
- const humanModule = await ensureDesktopHumanized(page);
4863
- if (typeof target === "string") {
4864
- const { x = 0, y = 0 } = page._humanCursor || {};
4865
- try {
4866
- const result = await humanModule.scrollToElement(
4867
- page,
4868
- page._humanRaw,
4869
- target,
4870
- x,
4871
- y,
4872
- page._humanCfg,
4873
- options.timeout
4874
- );
4875
- if (page._humanCursor) {
4876
- page._humanCursor.x = result.cursorX;
4877
- page._humanCursor.y = result.cursorY;
4878
- }
4879
- return {
4880
- element: await page.$(target),
4881
- didScroll: Boolean(result.didScroll),
4882
- restore: null
4883
- };
4884
- } catch (error) {
4885
- logger7.warn(`humanScroll: cloakbrowser \u6EDA\u52A8\u5931\u8D25\uFF0C\u8DF3\u8FC7 (${error?.message || error})`);
4886
- return { element: null, didScroll: false, restore: null };
4887
- }
4888
- }
4889
- const { target: resolvedTarget, dispose } = await resolvePatchedTarget(page, target, { throwOnMissing: false });
4890
- try {
4891
- if (!resolvedTarget) {
4892
- return { element: null, didScroll: false, restore: null };
4893
- }
4894
- const before = await page.evaluate(() => ({ x: window.scrollX, y: window.scrollY }));
4895
- await resolvedTarget.scrollIntoViewIfNeeded?.();
4896
- const after = await page.evaluate(() => ({ x: window.scrollX, y: window.scrollY }));
4897
- return {
4898
- element: resolvedTarget,
4899
- didScroll: before.x !== after.x || before.y !== after.y,
4900
- restore: null
4901
- };
4902
- } finally {
4903
- if (typeof dispose === "function") {
4904
- await dispose();
4905
- }
4836
+ const resolvedTarget = await resolveActionTarget(page, target, { throwOnMissing: false });
4837
+ if (!resolvedTarget) {
4838
+ return { element: null, didScroll: false, restore: null };
4906
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
+ };
4907
4849
  },
4908
4850
  async humanClick(page, target, options = {}) {
4909
4851
  if (isMobilePage(page)) {
4910
4852
  return await MobileHumanize.humanClick(page, target, options);
4911
4853
  }
4912
- 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;
4913
4882
  },
4914
4883
  async randomSleep(pageOrBaseMs, maybeBaseMs, maybeJitterPercent) {
4915
4884
  if (isPageLike2(pageOrBaseMs)) {
@@ -4925,7 +4894,6 @@ var CloakBrowserHumanize = {
4925
4894
  if (isMobilePage(page)) {
4926
4895
  return await MobileHumanize.simulateGaze(page, baseDurationMs);
4927
4896
  }
4928
- await ensureDesktopHumanized(page);
4929
4897
  const durationMs = jitterMs(baseDurationMs, 0.4);
4930
4898
  const startTime = Date.now();
4931
4899
  const viewportSize = page.viewportSize() || { width: 1365, height: 900 };
@@ -4941,29 +4909,21 @@ var CloakBrowserHumanize = {
4941
4909
  if (isMobilePage(page)) {
4942
4910
  return await MobileHumanize.humanType(page, selector, text, options);
4943
4911
  }
4944
- await ensureDesktopHumanized(page);
4945
4912
  const actionOptions = buildActionOptions(options);
4946
4913
  if (typeof selector === "string") {
4947
4914
  await page.type(selector, text, actionOptions);
4948
4915
  return;
4949
4916
  }
4950
- const { target: resolvedTarget, dispose } = await resolvePatchedTarget(page, selector, { throwOnMissing: true });
4951
- try {
4952
- if (!resolvedTarget || typeof resolvedTarget.type !== "function") {
4953
- throw new Error("\u76EE\u6807\u5143\u7D20\u4E0D\u652F\u6301 type()");
4954
- }
4955
- await resolvedTarget.type(text, actionOptions);
4956
- } finally {
4957
- if (typeof dispose === "function") {
4958
- await dispose();
4959
- }
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()");
4960
4920
  }
4921
+ await resolvedTarget.type(text, actionOptions);
4961
4922
  },
4962
4923
  async humanPress(page, targetOrKey, maybeKey, options = {}) {
4963
4924
  if (isMobilePage(page)) {
4964
4925
  return await MobileHumanize.humanPress(page, targetOrKey, maybeKey, options);
4965
4926
  }
4966
- await ensureDesktopHumanized(page);
4967
4927
  const hasTarget = typeof maybeKey === "string";
4968
4928
  const key = hasTarget ? maybeKey : targetOrKey;
4969
4929
  const pressOptions = hasTarget ? options : maybeKey || options;
@@ -4979,49 +4939,57 @@ var CloakBrowserHumanize = {
4979
4939
  await page.press(targetOrKey, key, buildActionOptions(pressOptions));
4980
4940
  return true;
4981
4941
  }
4982
- const { target: resolvedTarget, dispose } = await resolvePatchedTarget(page, targetOrKey, {
4942
+ const resolvedTarget = await resolveActionTarget(page, targetOrKey, {
4983
4943
  throwOnMissing: pressOptions.throwOnMissing !== false
4984
4944
  });
4985
- try {
4986
- if (!resolvedTarget) {
4987
- return false;
4988
- }
4989
- if (typeof resolvedTarget.press === "function") {
4990
- await resolvedTarget.press(key, buildActionOptions(pressOptions));
4991
- return true;
4992
- }
4993
- await doDesktopHumanClick(page, targetOrKey, {
4994
- ...pressOptions,
4995
- reactionDelay: pressOptions.focusDelay ?? 180
4996
- });
4997
- await jitterSleep(pressOptions.reactionDelay ?? 180, 0.45);
4998
- await page.keyboard.press(key, {
4999
- ...pressOptions.keyboardOptions || {},
5000
- delay: jitterMs(pressOptions.holdDelay ?? 45, 0.5)
5001
- });
4945
+ if (!resolvedTarget) {
4946
+ return false;
4947
+ }
4948
+ if (typeof resolvedTarget.press === "function") {
4949
+ await resolvedTarget.press(key, buildActionOptions(pressOptions));
5002
4950
  return true;
5003
- } finally {
5004
- if (typeof dispose === "function") {
5005
- await dispose();
5006
- }
5007
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)
4960
+ });
4961
+ return true;
5008
4962
  },
5009
4963
  async humanClear(page, selector) {
5010
4964
  if (isMobilePage(page)) {
5011
4965
  return await MobileHumanize.humanClear(page, selector);
5012
4966
  }
5013
- await ensureDesktopHumanized(page);
5014
- if (typeof page.clear === "function") {
5015
- await page.clear(selector, { force: true });
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());
5016
4985
  return;
5017
4986
  }
5018
- await page.fill(selector, "", { force: true });
4987
+ throw new Error("\u76EE\u6807\u5143\u7D20\u4E0D\u652F\u6301 clear()");
5019
4988
  },
5020
4989
  async warmUpBrowsing(page, baseDuration = 3500) {
5021
4990
  if (isMobilePage(page)) {
5022
4991
  return await MobileHumanize.warmUpBrowsing(page, baseDuration);
5023
4992
  }
5024
- await ensureDesktopHumanized(page);
5025
4993
  const durationMs = jitterMs(baseDuration, 0.4);
5026
4994
  const startTime = Date.now();
5027
4995
  const viewportSize = page.viewportSize() || { width: 1365, height: 900 };
@@ -5047,7 +5015,6 @@ var CloakBrowserHumanize = {
5047
5015
  if (isMobilePage(page)) {
5048
5016
  return await MobileHumanize.naturalScroll(page, direction, distance, baseSteps);
5049
5017
  }
5050
- await ensureDesktopHumanized(page);
5051
5018
  const steps = Math.max(3, baseSteps + Math.floor(Math.random() * 3) - 1);
5052
5019
  const actualDistance = jitterMs(distance, 0.15);
5053
5020
  const sign = direction === "down" ? 1 : -1;
@@ -5062,55 +5029,24 @@ var CloakBrowserHumanize = {
5062
5029
  };
5063
5030
 
5064
5031
  // src/humanize.js
5065
- var resolveHumanizeDelegate = () => getToolkitMode() === Mode.CloakBrowser ? CloakBrowserHumanize : DefaultHumanize;
5066
- var callHumanize = (method, ...args) => {
5067
- const delegate = resolveHumanizeDelegate();
5068
- if (typeof delegate?.[method] !== "function") {
5069
- throw new Error(`Humanize.${method} is not available in ${getToolkitMode()} mode`);
5070
- }
5071
- return delegate[method](...args);
5072
- };
5073
- var Humanize2 = {
5074
- jitterMs(base, jitterPercent = 0.3) {
5075
- return callHumanize("jitterMs", base, jitterPercent);
5076
- },
5077
- initializeCursor(page) {
5078
- return callHumanize("initializeCursor", page);
5079
- },
5080
- humanMove(page, target) {
5081
- return callHumanize("humanMove", page, target);
5082
- },
5083
- humanScroll(page, target, options = {}) {
5084
- return callHumanize("humanScroll", page, target, options);
5085
- },
5086
- humanClick(page, target, options = {}) {
5087
- return callHumanize("humanClick", page, target, options);
5088
- },
5089
- randomSleep(pageOrBaseMs, maybeBaseMs, maybeJitterPercent) {
5090
- return callHumanize("randomSleep", pageOrBaseMs, maybeBaseMs, maybeJitterPercent);
5091
- },
5092
- simulateGaze(page, baseDurationMs = 2500) {
5093
- return callHumanize("simulateGaze", page, baseDurationMs);
5094
- },
5095
- humanType(page, selector, text, options = {}) {
5096
- return callHumanize("humanType", page, selector, text, options);
5097
- },
5098
- humanPress(page, targetOrKey, maybeKey, options = {}) {
5099
- if (typeof maybeKey === "string") {
5100
- return callHumanize("humanPress", page, targetOrKey, maybeKey, options);
5101
- }
5102
- return callHumanize("humanPress", page, targetOrKey, maybeKey || options);
5103
- },
5104
- humanClear(page, selector) {
5105
- return callHumanize("humanClear", page, selector);
5106
- },
5107
- warmUpBrowsing(page, baseDuration = 3500) {
5108
- return callHumanize("warmUpBrowsing", page, baseDuration);
5109
- },
5110
- naturalScroll(page, direction = "down", distance = 300, baseSteps = 5) {
5111
- return callHumanize("naturalScroll", page, direction, distance, baseSteps);
5112
- }
5113
- };
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
+ ]);
5114
5050
 
5115
5051
  // src/internals/launch/default.js
5116
5052
  import { execFileSync } from "node:child_process";
@@ -5198,7 +5134,7 @@ var ByPass = {
5198
5134
  };
5199
5135
 
5200
5136
  // src/internals/launch/default.js
5201
- var logger8 = createInternalLogger("Launch");
5137
+ var logger7 = createInternalLogger("Launch");
5202
5138
  var REQUEST_HOOK_FLAG = Symbol("playwright-toolkit-request-hook");
5203
5139
  var injectedContexts = /* @__PURE__ */ new WeakSet();
5204
5140
  var browserMajorVersionCache = /* @__PURE__ */ new Map();
@@ -5250,7 +5186,7 @@ var detectBrowserMajorVersion = (launcher) => {
5250
5186
  });
5251
5187
  detectedVersion = parseChromeMajorVersion(rawVersion);
5252
5188
  } catch (error) {
5253
- 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}`);
5254
5190
  }
5255
5191
  browserMajorVersionCache.set(executablePath, detectedVersion);
5256
5192
  return detectedVersion;
@@ -5287,7 +5223,7 @@ var generateFingerprintForCore = ({ locale, browserMajorVersion, device }) => {
5287
5223
  if (requestedBrowserMajorVersion <= 0) {
5288
5224
  throw error;
5289
5225
  }
5290
- logger8.warn(
5226
+ logger7.warn(
5291
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}`
5292
5228
  );
5293
5229
  }
@@ -5332,7 +5268,7 @@ var buildReplayableBrowserProfile = (runtimeState, launcher) => {
5332
5268
  schema_version: DEFAULT_BROWSER_PROFILE_SCHEMA_VERSION
5333
5269
  };
5334
5270
  nextState = RuntimeEnv.setBrowserProfileCore(nextState, browserProfileCore);
5335
- logger8.info(
5271
+ logger7.info(
5336
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}`
5337
5273
  );
5338
5274
  return { runtimeState: nextState, browserProfileCore };
@@ -5461,18 +5397,18 @@ var DefaultLaunch = {
5461
5397
  upstreamLabel = `${parsedProxyUrl.protocol}//${parsedProxyUrl.host}`;
5462
5398
  } catch {
5463
5399
  }
5464
- logger8.info(
5400
+ logger7.info(
5465
5401
  `[\u4EE3\u7406\u5DF2\u542F\u7528] \u672C\u5730=${launchProxy.server} \u4E0A\u6E38=${upstreamLabel || "-"} \u76F4\u8FDE\u57DF\u540D=${(byPassDomains || []).join(",")}`
5466
5402
  );
5467
- 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`);
5468
5404
  } else if (enableByPassLogger && enableProxy && !launchProxy) {
5469
- logger8.info("[\u4EE3\u7406\u672A\u542F\u7528] enable_proxy=true \u4F46 proxy_url \u4E3A\u7A7A");
5470
- 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`);
5471
5407
  } else if (enableByPassLogger && !enableProxy && proxyUrl) {
5472
- logger8.info("[\u4EE3\u7406\u672A\u542F\u7528] enable_proxy=false \u4E14 proxy_url \u5DF2\u914D\u7F6E");
5473
- 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`);
5474
5410
  } else if (enableByPassLogger) {
5475
- 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`);
5476
5412
  }
5477
5413
  const onPageCreated = (page) => {
5478
5414
  const recommendedGotoOptions = {
@@ -5494,7 +5430,7 @@ var DefaultLaunch = {
5494
5430
  }
5495
5431
  if (!enableByPassLogger || byPassDomains.length === 0) return;
5496
5432
  if (!matched || !matched.rule) return;
5497
- 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}`);
5498
5434
  };
5499
5435
  page.on("request", requestHandler);
5500
5436
  return recommendedGotoOptions;
@@ -5551,7 +5487,7 @@ var DefaultLaunch = {
5551
5487
  // src/internals/launch/cloakbrowser.js
5552
5488
  import { execFile } from "node:child_process";
5553
5489
  import { promisify } from "node:util";
5554
- var logger9 = createInternalLogger("CloakBrowser");
5490
+ var logger8 = createInternalLogger("CloakBrowser");
5555
5491
  var execFileAsync = promisify(execFile);
5556
5492
  var DEFAULT_CLOAK_CRAWLER_BASE_OPTIONS = Object.freeze({
5557
5493
  maxConcurrency: 1,
@@ -5687,7 +5623,7 @@ var forceTerminateBrowsersByFingerprintArg = async (fingerprintArg) => {
5687
5623
  if (error?.code === 1 || error?.code === "ENOENT") {
5688
5624
  return;
5689
5625
  }
5690
- 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)}`);
5691
5627
  });
5692
5628
  };
5693
5629
  var CloakBrowserLaunch = {
@@ -5701,8 +5637,21 @@ var CloakBrowserLaunch = {
5701
5637
  return createStableGotoHook(recommendedGotoOptions);
5702
5638
  },
5703
5639
  async getPlaywrightCrawlerOptions(options = {}) {
5704
- const { crawlerOptions } = await CloakBrowserLaunch.createPlaywrightCrawlerRuntime(options);
5705
- 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
+ });
5706
5655
  },
5707
5656
  async buildLaunchOptions(options = {}) {
5708
5657
  return await buildCloakLaunchOptions(options);
@@ -5783,39 +5732,18 @@ var CloakBrowserLaunch = {
5783
5732
  };
5784
5733
 
5785
5734
  // src/launch.js
5786
- var resolveLaunchDelegate = () => getToolkitMode() === Mode.CloakBrowser ? CloakBrowserLaunch : DefaultLaunch;
5787
- var callLaunch = (method, ...args) => {
5788
- const delegate = resolveLaunchDelegate();
5789
- if (typeof delegate?.[method] !== "function") {
5790
- throw new Error(`Launch.${method} is not available in ${getToolkitMode()} mode`);
5791
- }
5792
- return delegate[method](...args);
5793
- };
5794
- var Launch = {
5795
- getPlaywrightCrawlerOptions(options = {}) {
5796
- return callLaunch("getPlaywrightCrawlerOptions", options);
5797
- },
5798
- resolveProxyConfiguration(proxyConfiguration = {}) {
5799
- return callLaunch("resolveProxyConfiguration", proxyConfiguration);
5800
- },
5801
- extractFingerprintArg(launchOptions = {}) {
5802
- return callLaunch("extractFingerprintArg", launchOptions);
5803
- },
5804
- createStableGotoHook(recommendedGotoOptions = {}) {
5805
- return callLaunch("createStableGotoHook", recommendedGotoOptions);
5806
- },
5807
- buildLaunchOptions(options = {}) {
5808
- return callLaunch("buildLaunchOptions", options);
5809
- },
5810
- createPlaywrightCrawlerRuntime(options = {}) {
5811
- return callLaunch("createPlaywrightCrawlerRuntime", options);
5812
- }
5735
+ var launchStrategies = {
5736
+ [Mode.Default]: DefaultLaunch,
5737
+ [Mode.CloakBrowser]: CloakBrowserLaunch
5813
5738
  };
5739
+ var Launch = createDelegatedFacade("Launch", launchStrategies, [
5740
+ "getPlaywrightCrawlerOptions"
5741
+ ]);
5814
5742
 
5815
5743
  // src/live-view.js
5816
5744
  import express from "express";
5817
5745
  import { Actor } from "apify";
5818
- var logger10 = createInternalLogger("LiveView");
5746
+ var logger9 = createInternalLogger("LiveView");
5819
5747
  async function startLiveViewServer(liveViewKey) {
5820
5748
  const app = express();
5821
5749
  app.get("/", async (req, res) => {
@@ -5840,13 +5768,13 @@ async function startLiveViewServer(liveViewKey) {
5840
5768
  </html>
5841
5769
  `);
5842
5770
  } catch (error) {
5843
- logger10.fail("Live View Server", error);
5771
+ logger9.fail("Live View Server", error);
5844
5772
  res.status(500).send(`\u65E0\u6CD5\u52A0\u8F7D\u5C4F\u5E55\u622A\u56FE: ${error.message}`);
5845
5773
  }
5846
5774
  });
5847
5775
  const port = process.env.APIFY_CONTAINER_PORT || 4321;
5848
5776
  app.listen(port, () => {
5849
- logger10.success("startLiveViewServer", `\u76D1\u542C\u7AEF\u53E3 ${port}`);
5777
+ logger9.success("startLiveViewServer", `\u76D1\u542C\u7AEF\u53E3 ${port}`);
5850
5778
  });
5851
5779
  }
5852
5780
  async function takeLiveScreenshot(liveViewKey, page, logMessage) {
@@ -5854,10 +5782,10 @@ async function takeLiveScreenshot(liveViewKey, page, logMessage) {
5854
5782
  const buffer = await capturePageScreenshot(page, { type: "png" });
5855
5783
  await Actor.setValue(liveViewKey, buffer, { contentType: "image/png" });
5856
5784
  if (logMessage) {
5857
- logger10.info(`(\u622A\u56FE): ${logMessage}`);
5785
+ logger9.info(`(\u622A\u56FE): ${logMessage}`);
5858
5786
  }
5859
5787
  } catch (e) {
5860
- 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}`);
5861
5789
  }
5862
5790
  }
5863
5791
  var useLiveView = (liveViewKey = PresetOfLiveViewKey) => {
@@ -5966,7 +5894,7 @@ var dragCaptchaAction = async (page, sourceLocator, targetLocator, options = {})
5966
5894
  };
5967
5895
 
5968
5896
  // src/internals/captcha/bytedance.js
5969
- var logger11 = createInternalLogger("Captcha");
5897
+ var logger10 = createInternalLogger("Captcha");
5970
5898
  var DEFAULT_BYTEDANCE_CAPTCHA_OPTIONS = Object.freeze({
5971
5899
  apiType: "31234",
5972
5900
  maxRetries: 3,
@@ -6098,7 +6026,7 @@ var collectCaptchaDebugInfo = async (page, frame, iframeLocator, attempt, phase,
6098
6026
  }
6099
6027
  await writeFile(infoPath, JSON.stringify(payload, null, 2), "utf8");
6100
6028
  }
6101
- 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}`);
6102
6030
  };
6103
6031
  var maybeCollectCaptchaDebugInfo = async (page, frame, iframeLocator, attempt, phase, options, extra = null) => {
6104
6032
  if (!options.debugArtifacts) {
@@ -6135,14 +6063,14 @@ var getVerifycenterCaptchaContext = async (page, options) => {
6135
6063
  if (!isContainerVisible) {
6136
6064
  return null;
6137
6065
  }
6138
- 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");
6139
6067
  let iframeLocator = page.locator(options.iframeSelector).first();
6140
6068
  let isIframeVisible = await waitForVisible(
6141
6069
  iframeLocator,
6142
6070
  options.iframeVisibleTimeoutMs
6143
6071
  );
6144
6072
  if (!isIframeVisible) {
6145
- 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");
6146
6074
  iframeLocator = captchaContainer.locator(options.iframeFallbackSelector).first();
6147
6075
  isIframeVisible = await waitForVisible(
6148
6076
  iframeLocator,
@@ -6152,7 +6080,7 @@ var getVerifycenterCaptchaContext = async (page, options) => {
6152
6080
  if (!isIframeVisible) {
6153
6081
  throw new Error("verifycenter iframe not found inside captcha container.");
6154
6082
  }
6155
- 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");
6156
6084
  const frame = await resolveContentFrame(page, iframeLocator, options);
6157
6085
  if (!frame) {
6158
6086
  throw new Error("Failed to resolve verifycenter iframe content frame.");
@@ -6268,11 +6196,11 @@ var refreshCaptcha = async (page, frame, options) => {
6268
6196
  const clicked = await clickCaptchaAction(frame, options.refreshTexts, {
6269
6197
  ...options,
6270
6198
  page,
6271
- logger: logger11,
6199
+ logger: logger10,
6272
6200
  forceMouse: true
6273
6201
  }).catch(() => false);
6274
6202
  if (!clicked) {
6275
- logger11.warn("Refresh button not found.");
6203
+ logger10.warn("Refresh button not found.");
6276
6204
  return false;
6277
6205
  }
6278
6206
  await page.waitForTimeout(options.refreshWaitMs);
@@ -6303,24 +6231,24 @@ var waitForCaptchaChallengeReady = async (page, frame, options) => {
6303
6231
  const hasGuideMaskVisible = options.guideMaskSelector ? await frame.locator(options.guideMaskSelector).first().isVisible({ timeout: options.loadingIndicatorVisibleTimeoutMs }).catch(() => false) : false;
6304
6232
  hasSeenGuideMask = hasSeenGuideMask || hasGuideMaskVisible;
6305
6233
  if (hasGuideMaskVisible && !hasLoggedGuideMask) {
6306
- 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");
6307
6235
  hasLoggedGuideMask = true;
6308
6236
  }
6309
6237
  if (!isLoadingVisible && hasVisibleSourceImage && hasVisibleDropTarget && !hasGuideMaskVisible) {
6310
- logger11.info(
6238
+ logger10.info(
6311
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"
6312
6240
  );
6313
6241
  return;
6314
6242
  }
6315
6243
  if (hasErrorTextVisible) {
6316
- 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");
6317
6245
  await refreshCaptcha(page, frame, options);
6318
6246
  refreshDeadline = Date.now() + options.challengeReadyRefreshTimeoutMs;
6319
6247
  hasSeenLoading = false;
6320
6248
  continue;
6321
6249
  }
6322
6250
  if ((!hasVisibleSourceImage || !hasVisibleDropTarget) && Date.now() >= refreshDeadline) {
6323
- 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`);
6324
6252
  await refreshCaptcha(page, frame, options);
6325
6253
  refreshDeadline = Date.now() + options.challengeReadyRefreshTimeoutMs;
6326
6254
  hasSeenLoading = false;
@@ -6368,7 +6296,7 @@ var dragPromptCaptchaImage = async (page, frame, iframeLocator, sourceLocator, d
6368
6296
  accepted
6369
6297
  };
6370
6298
  dragAttempts.push(attemptInfo);
6371
- logger11.info(
6299
+ logger10.info(
6372
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}`
6373
6301
  );
6374
6302
  if (accepted) {
@@ -6386,7 +6314,7 @@ var dragPromptCaptchaImage = async (page, frame, iframeLocator, sourceLocator, d
6386
6314
  dragAttempts,
6387
6315
  finalState: await readPromptCaptchaState(frame, options)
6388
6316
  }).catch((error) => {
6389
- 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}`);
6390
6318
  });
6391
6319
  return {
6392
6320
  accepted: false,
@@ -6403,16 +6331,16 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
6403
6331
  ...options
6404
6332
  };
6405
6333
  if (!config.token) {
6406
- 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");
6407
6335
  return false;
6408
6336
  }
6409
- 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");
6410
6338
  for (let attempt = 1; attempt <= config.maxRetries; attempt += 1) {
6411
- 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`);
6412
6340
  try {
6413
6341
  const captchaContext = await getVerifycenterCaptchaContext(page, config);
6414
6342
  if (!captchaContext) {
6415
- logger11.info("Captcha container is not visible anymore.");
6343
+ logger10.info("Captcha container is not visible anymore.");
6416
6344
  return true;
6417
6345
  }
6418
6346
  const { iframeLocator, frame } = captchaContext;
@@ -6425,7 +6353,7 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
6425
6353
  "ready",
6426
6354
  config
6427
6355
  ).catch((error) => {
6428
- 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}`);
6429
6357
  });
6430
6358
  await page.waitForTimeout(config.recognitionDelayMs);
6431
6359
  const screenshotBuffer = await iframeLocator.screenshot();
@@ -6437,16 +6365,16 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
6437
6365
  });
6438
6366
  const serialNumbers = extractCaptchaSerialNumbers(apiResponse);
6439
6367
  if (apiResponse?.code !== config.recognitionSuccessCode || serialNumbers.length === 0) {
6440
- logger11.warn(
6368
+ logger10.warn(
6441
6369
  `\u9A8C\u8BC1\u7801\u8BC6\u522B\u5931\u8D25\u3002code=${apiResponse?.code}, msg=${apiResponse?.msg || "unknown"}`
6442
6370
  );
6443
6371
  await refreshCaptcha(page, frame, config);
6444
6372
  continue;
6445
6373
  }
6446
- 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(", ")}`);
6447
6375
  const dropTarget = await findCaptchaDropTarget(frame, config);
6448
6376
  if (!dropTarget) {
6449
- 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");
6450
6378
  await refreshCaptcha(page, frame, config);
6451
6379
  continue;
6452
6380
  }
@@ -6457,7 +6385,7 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
6457
6385
  `Captcha image indexes could not be normalized. raw=${serialNumbers.join(", ")}, count=${orderedSourceImages.length}`
6458
6386
  );
6459
6387
  }
6460
- 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(", ")}`);
6461
6389
  for (const imageIndex of normalizedIndexes) {
6462
6390
  if (imageIndex < 0 || imageIndex >= orderedSourceImages.length) {
6463
6391
  throw new Error(
@@ -6489,52 +6417,52 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
6489
6417
  }
6490
6418
  }
6491
6419
  const beforeSubmitState = await readPromptCaptchaState(frame, config);
6492
- logger11.info(
6420
+ logger10.info(
6493
6421
  `\u63D0\u4EA4\u524D\u9A8C\u8BC1\u7801\u72B6\u6001\uFF1Abadge=${beforeSubmitState.badgeCount}, selected=${beforeSubmitState.selectedCount}, submitDisabled=${beforeSubmitState.submitDisabled}`
6494
6422
  );
6495
6423
  const submitted = await clickCaptchaAction(frame, config.submitTexts, {
6496
6424
  ...config,
6497
6425
  page,
6498
- logger: logger11,
6426
+ logger: logger10,
6499
6427
  forceMouse: true,
6500
6428
  actionVisibleTimeoutMs: config.submitReadyTimeoutMs
6501
6429
  }).catch(() => false);
6502
6430
  if (!submitted) {
6503
- 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");
6504
6432
  }
6505
6433
  await page.waitForTimeout(config.submitWaitMs);
6506
6434
  const afterSubmitState = await readPromptCaptchaState(frame, config);
6507
- logger11.info(
6435
+ logger10.info(
6508
6436
  `\u63D0\u4EA4\u540E\u9A8C\u8BC1\u7801\u72B6\u6001\uFF1Abadge=${afterSubmitState.badgeCount}, selected=${afterSubmitState.selectedCount}, submitDisabled=${afterSubmitState.submitDisabled}`
6509
6437
  );
6510
6438
  const stillVisible = await iframeLocator.isVisible({ timeout: config.containerVisibleTimeoutMs }).catch(() => false);
6511
6439
  if (!stillVisible) {
6512
- 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");
6513
6441
  return true;
6514
6442
  }
6515
6443
  await maybeCollectCaptchaDebugInfo(page, frame, iframeLocator, attempt, "submit-still-visible", config, {
6516
6444
  beforeSubmitState,
6517
6445
  afterSubmitState
6518
6446
  }).catch((error) => {
6519
- 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}`);
6520
6448
  });
6521
- 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");
6522
6450
  await page.waitForTimeout(2e3);
6523
6451
  await refreshCaptcha(page, frame, config);
6524
6452
  } catch (error) {
6525
- 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}`);
6526
6454
  }
6527
6455
  if (attempt < config.maxRetries) {
6528
6456
  await page.waitForTimeout(config.retryDelayBaseMs + attempt * config.retryDelayStepMs);
6529
6457
  }
6530
6458
  }
6531
- 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`);
6532
6460
  return false;
6533
6461
  }
6534
6462
  var sloveCaptcha = solveCaptcha;
6535
6463
 
6536
6464
  // src/chaptcha.js
6537
- var logger12 = createInternalLogger("Captcha");
6465
+ var logger11 = createInternalLogger("Captcha");
6538
6466
  var DEFAULT_CAPTCHA_RECOGNITION_OPTIONS = Object.freeze({
6539
6467
  token: "eKJvBfwfN0YRav0-VD_44E2VBSfm7l0YtddUQ7cFySI",
6540
6468
  apiUrl: "https://api.jfbym.com/api/YmServer/customApi"
@@ -6621,7 +6549,7 @@ function useCaptchaMonitor(page, options) {
6621
6549
  };
6622
6550
  })();
6623
6551
  }, { selector: domSelector, callbackName: exposedFunctionName, cleanerName });
6624
- logger12.success("useCaptchaMonitor", `DOM \u76D1\u63A7\u5DF2\u542F\u7528\uFF1A${domSelector}`);
6552
+ logger11.success("useCaptchaMonitor", `DOM \u76D1\u63A7\u5DF2\u542F\u7528\uFF1A${domSelector}`);
6625
6553
  cleanupFns.push(async () => {
6626
6554
  try {
6627
6555
  await page.evaluate((name) => {
@@ -6645,14 +6573,14 @@ function useCaptchaMonitor(page, options) {
6645
6573
  }
6646
6574
  };
6647
6575
  page.on("framenavigated", frameHandler);
6648
- logger12.success("useCaptchaMonitor", `URL \u76D1\u63A7\u5DF2\u542F\u7528\uFF1A${urlPattern}`);
6576
+ logger11.success("useCaptchaMonitor", `URL \u76D1\u63A7\u5DF2\u542F\u7528\uFF1A${urlPattern}`);
6649
6577
  cleanupFns.push(async () => {
6650
6578
  page.off("framenavigated", frameHandler);
6651
6579
  });
6652
6580
  }
6653
6581
  return {
6654
6582
  stop: async () => {
6655
- logger12.info("\u6B63\u5728\u505C\u6B62\u9A8C\u8BC1\u7801\u76D1\u63A7...");
6583
+ logger11.info("\u6B63\u5728\u505C\u6B62\u9A8C\u8BC1\u7801\u76D1\u63A7...");
6656
6584
  for (const fn of cleanupFns) {
6657
6585
  await fn();
6658
6586
  }
@@ -6691,7 +6619,7 @@ async function solveCaptchaWithStrategy(strategyName, page, options = {}) {
6691
6619
  );
6692
6620
  return strategy.sloveCaptcha(page, resolvedOptions, {
6693
6621
  callCaptchaRecognitionApi,
6694
- logger: logger12
6622
+ logger: logger11
6695
6623
  });
6696
6624
  }
6697
6625
  var Captcha = {
@@ -6702,7 +6630,7 @@ var Captcha = {
6702
6630
  // src/mutation.js
6703
6631
  import { createHash } from "node:crypto";
6704
6632
  import { v4 as uuidv42 } from "uuid";
6705
- var logger13 = createInternalLogger("Mutation");
6633
+ var logger12 = createInternalLogger("Mutation");
6706
6634
  var MUTATION_MONITOR_MODE = Object.freeze({
6707
6635
  Added: "added",
6708
6636
  Changed: "changed",
@@ -6735,14 +6663,14 @@ var Mutation = {
6735
6663
  const stableTime = options.stableTime ?? 5 * 1e3;
6736
6664
  const timeout = options.timeout ?? 120 * 1e3;
6737
6665
  const onMutation = options.onMutation;
6738
- 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`);
6739
6667
  if (initialTimeout > 0) {
6740
6668
  const selectorQuery = selectorList.join(",");
6741
6669
  try {
6742
6670
  await page.waitForSelector(selectorQuery, { timeout: initialTimeout });
6743
- logger13.info(`waitForStable \u5DF2\u68C0\u6D4B\u5230\u5143\u7D20: ${selectorQuery}`);
6671
+ logger12.info(`waitForStable \u5DF2\u68C0\u6D4B\u5230\u5143\u7D20: ${selectorQuery}`);
6744
6672
  } catch (e) {
6745
- 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}`);
6746
6674
  throw e;
6747
6675
  }
6748
6676
  }
@@ -6758,7 +6686,7 @@ var Mutation = {
6758
6686
  return "__CONTINUE__";
6759
6687
  }
6760
6688
  });
6761
- logger13.info("waitForStable \u5DF2\u542F\u7528 onMutation \u56DE\u8C03");
6689
+ logger12.info("waitForStable \u5DF2\u542F\u7528 onMutation \u56DE\u8C03");
6762
6690
  } catch (e) {
6763
6691
  }
6764
6692
  }
@@ -6873,9 +6801,9 @@ var Mutation = {
6873
6801
  { selectorList, stableTime, timeout, callbackName, hasCallback: !!onMutation }
6874
6802
  );
6875
6803
  if (result.mutationCount === 0 && result.stableTime === 0) {
6876
- 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");
6877
6805
  }
6878
- 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" : ""}`);
6879
6807
  return result;
6880
6808
  },
6881
6809
  /**
@@ -7047,29 +6975,29 @@ var Mutation = {
7047
6975
  return "__CONTINUE__";
7048
6976
  }
7049
6977
  };
7050
- logger13.start(
6978
+ logger12.start(
7051
6979
  "waitForStableAcrossRoots",
7052
6980
  `\u76D1\u63A7 ${selectorList.length} \u4E2A\u9009\u62E9\u5668(\u8DE8 root), \u7A33\u5B9A\u65F6\u95F4=${waitForStableTime}ms`
7053
6981
  );
7054
6982
  if (initialTimeout > 0) {
7055
6983
  try {
7056
6984
  await page.waitForSelector(selectorQuery, { timeout: initialTimeout });
7057
- logger13.info(`waitForStableAcrossRoots \u5DF2\u68C0\u6D4B\u5230\u5143\u7D20: ${selectorQuery}`);
6985
+ logger12.info(`waitForStableAcrossRoots \u5DF2\u68C0\u6D4B\u5230\u5143\u7D20: ${selectorQuery}`);
7058
6986
  } catch (e) {
7059
- 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}`);
7060
6988
  throw e;
7061
6989
  }
7062
6990
  }
7063
- let state = await buildState();
7064
- if (!state?.hasMatched) {
7065
- 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");
7066
6994
  return { mutationCount: 0, stableTime: 0, wasPaused: false };
7067
6995
  }
7068
6996
  let mutationCount = 0;
7069
6997
  let stableSince = 0;
7070
6998
  let isPaused = false;
7071
6999
  let wasPaused = false;
7072
- let lastSnapshotKey = state.snapshotKey;
7000
+ let lastSnapshotKey = state2.snapshotKey;
7073
7001
  const applyPauseSignal = (signal) => {
7074
7002
  const nextPaused = signal === "__PAUSE__";
7075
7003
  if (nextPaused) {
@@ -7083,13 +7011,13 @@ var Mutation = {
7083
7011
  };
7084
7012
  const initialSignal = await invokeMutationCallback({
7085
7013
  mutationCount: 0,
7086
- html: state.html || "",
7087
- text: state.text || "",
7088
- mutationNodes: state.mutationNodes || []
7014
+ html: state2.html || "",
7015
+ text: state2.text || "",
7016
+ mutationNodes: state2.mutationNodes || []
7089
7017
  });
7090
7018
  applyPauseSignal(initialSignal);
7091
7019
  const deadline = Date.now() + overallTimeout;
7092
- let lastState = state;
7020
+ let lastState = state2;
7093
7021
  while (Date.now() < deadline) {
7094
7022
  await sleep(pollInterval);
7095
7023
  lastState = await buildState();
@@ -7099,7 +7027,7 @@ var Mutation = {
7099
7027
  if (lastState.snapshotKey !== lastSnapshotKey) {
7100
7028
  lastSnapshotKey = lastState.snapshotKey;
7101
7029
  mutationCount += 1;
7102
- logger13.info(
7030
+ logger12.info(
7103
7031
  `waitForStableAcrossRoots \u53D8\u5316#${mutationCount}, len=${lastState.snapshotLength}, path=${lastState.primaryPath || "unknown"}, preview="${truncate(lastState.text, 120)}"`
7104
7032
  );
7105
7033
  const signal = await invokeMutationCallback({
@@ -7112,7 +7040,7 @@ var Mutation = {
7112
7040
  continue;
7113
7041
  }
7114
7042
  if (!isPaused && stableSince > 0 && Date.now() - stableSince >= waitForStableTime) {
7115
- 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" : ""}`);
7116
7044
  return {
7117
7045
  mutationCount,
7118
7046
  stableTime: waitForStableTime,
@@ -7139,7 +7067,7 @@ var Mutation = {
7139
7067
  const onMutation = options.onMutation;
7140
7068
  const rawMode = String(options.mode || MUTATION_MONITOR_MODE.Added).toLowerCase();
7141
7069
  const mode = [MUTATION_MONITOR_MODE.Added, MUTATION_MONITOR_MODE.Changed, MUTATION_MONITOR_MODE.All].includes(rawMode) ? rawMode : MUTATION_MONITOR_MODE.Added;
7142
- 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}`);
7143
7071
  const monitorKey = generateKey("pk_mon");
7144
7072
  const callbackName = generateKey("pk_mon_cb");
7145
7073
  const cleanerName = generateKey("pk_mon_clean");
@@ -7282,7 +7210,7 @@ var Mutation = {
7282
7210
  return total;
7283
7211
  };
7284
7212
  }, { selectorList, monitorKey, callbackName, cleanerName, hasCallback: !!onMutation, mode });
7285
- logger13.success("useMonitor", "\u76D1\u63A7\u5668\u5DF2\u542F\u52A8");
7213
+ logger12.success("useMonitor", "\u76D1\u63A7\u5668\u5DF2\u542F\u52A8");
7286
7214
  return {
7287
7215
  stop: async () => {
7288
7216
  let totalMutations = 0;
@@ -7295,7 +7223,7 @@ var Mutation = {
7295
7223
  }, cleanerName);
7296
7224
  } catch (e) {
7297
7225
  }
7298
- 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`);
7299
7227
  return { totalMutations };
7300
7228
  }
7301
7229
  };
@@ -8164,7 +8092,7 @@ var createTemplateLogger = (baseLogger = createBaseLogger()) => {
8164
8092
  };
8165
8093
  var getDefaultBaseLogger = () => createBaseLogger("");
8166
8094
  var Logger = {
8167
- setLogger: (logger17) => setDefaultLogger(logger17),
8095
+ setLogger: (logger16) => setDefaultLogger(logger16),
8168
8096
  info: (message) => getDefaultBaseLogger().info(message),
8169
8097
  success: (message) => getDefaultBaseLogger().success(message),
8170
8098
  warning: (message) => getDefaultBaseLogger().warning(message),
@@ -8172,8 +8100,8 @@ var Logger = {
8172
8100
  error: (message) => getDefaultBaseLogger().error(message),
8173
8101
  debug: (message) => getDefaultBaseLogger().debug(message),
8174
8102
  start: (message) => getDefaultBaseLogger().start(message),
8175
- useTemplate: (logger17) => {
8176
- if (logger17) return createTemplateLogger(createBaseLogger("", logger17));
8103
+ useTemplate: (logger16) => {
8104
+ if (logger16) return createTemplateLogger(createBaseLogger("", logger16));
8177
8105
  return createTemplateLogger();
8178
8106
  }
8179
8107
  };
@@ -8247,7 +8175,7 @@ var LOCATION_NETWORK_SUFFIX_PATTERNS = [
8247
8175
  ];
8248
8176
  var cachedStripLogoSrcPromise = null;
8249
8177
  var cachedEnrichmentByContext = /* @__PURE__ */ new WeakMap();
8250
- var logger14 = createInternalLogger("Watermarkify");
8178
+ var logger13 = createInternalLogger("Watermarkify");
8251
8179
  var normalizeText = (value) => String(value || "").trim();
8252
8180
  var toInline = (value, maxLen = 200) => {
8253
8181
  const text = normalizeText(value);
@@ -8489,9 +8417,9 @@ var resolveWithCustomResolver = async (page, baseMeta, options = {}) => {
8489
8417
  location: toInline(resolved.location, 80)
8490
8418
  };
8491
8419
  if (enrichment.ip || enrichment.location) {
8492
- 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 || "-"}`);
8493
8421
  } else {
8494
- 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");
8495
8423
  }
8496
8424
  return enrichment;
8497
8425
  } finally {
@@ -8680,12 +8608,12 @@ var normalizeWatermarkifyRenderMode = (value) => {
8680
8608
  };
8681
8609
  var composeScreenshotBufferWithBrowser = async (page, buffer, overlaySvg, imageInfo = {}, options = {}) => {
8682
8610
  if (!page || typeof page.context !== "function") {
8683
- 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");
8684
8612
  return buffer;
8685
8613
  }
8686
8614
  const renderScope = await openProbePage(page);
8687
8615
  if (!renderScope?.page) {
8688
- 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");
8689
8617
  return buffer;
8690
8618
  }
8691
8619
  try {
@@ -8750,13 +8678,13 @@ var composeScreenshotBufferWithBrowser = async (page, buffer, overlaySvg, imageI
8750
8678
  fullPage: true,
8751
8679
  animations: "disabled"
8752
8680
  }).catch((error) => {
8753
- 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)}`);
8754
8682
  return null;
8755
8683
  });
8756
8684
  if (Buffer.isBuffer(composed) && composed.length > 0) {
8757
8685
  return composed;
8758
8686
  }
8759
- 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");
8760
8688
  return buffer;
8761
8689
  } finally {
8762
8690
  await renderScope.close().catch(() => {
@@ -8769,7 +8697,7 @@ var resolveWithIpLookup = async (page, options = {}) => {
8769
8697
  }
8770
8698
  const probeScope = await openProbePage(page);
8771
8699
  if (!probeScope?.page) {
8772
- logger14.warning("ipLookup \u8DF3\u8FC7: \u65E0\u6CD5\u521B\u5EFA probe page");
8700
+ logger13.warning("ipLookup \u8DF3\u8FC7: \u65E0\u6CD5\u521B\u5EFA probe page");
8773
8701
  return null;
8774
8702
  }
8775
8703
  const timeoutMs = Math.max(
@@ -8778,12 +8706,12 @@ var resolveWithIpLookup = async (page, options = {}) => {
8778
8706
  );
8779
8707
  try {
8780
8708
  const probePage = probeScope.page;
8781
- 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}`);
8782
8710
  const response = await probePage.goto(DEFAULT_IP_LOOKUP_URL, {
8783
8711
  waitUntil: "commit",
8784
8712
  timeout: timeoutMs
8785
8713
  }).catch((error) => {
8786
- 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)}`);
8787
8715
  return null;
8788
8716
  });
8789
8717
  const status = response && typeof response.status === "function" ? response.status() : 0;
@@ -8805,13 +8733,13 @@ var resolveWithIpLookup = async (page, options = {}) => {
8805
8733
  }
8806
8734
  const parsed = parseIpIpJsonResponse(rawText);
8807
8735
  if (parsed?.ip || parsed?.location) {
8808
- 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 || "-"}`);
8809
8737
  return parsed;
8810
8738
  }
8811
- 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]"}`);
8812
8740
  return null;
8813
8741
  } catch (error) {
8814
- 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)}`);
8815
8743
  return null;
8816
8744
  } finally {
8817
8745
  await probeScope.close().catch(() => {
@@ -8825,10 +8753,10 @@ var resolveEnrichment = async (page, baseMeta, options) => {
8825
8753
  ip: toInline(options.ip, 80),
8826
8754
  location: toInline(options.location, 80)
8827
8755
  };
8828
- 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}`);
8829
8757
  if (!merged.ip || !merged.location) {
8830
8758
  if (cached?.ip || cached?.location) {
8831
- 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 || "-"}`);
8832
8760
  }
8833
8761
  fillEnrichment(merged, cached);
8834
8762
  }
@@ -8852,15 +8780,15 @@ var resolveEnrichment = async (page, baseMeta, options) => {
8852
8780
  "x-geo-country"
8853
8781
  ]), 80);
8854
8782
  if (!merged.location || isWeakLocationValue(merged.location) && headerLocation) {
8855
- 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 || "-"}`);
8856
8784
  merged.location = headerLocation || merged.location;
8857
8785
  }
8858
8786
  }
8859
8787
  writeCachedEnrichment(page, merged);
8860
8788
  if (merged.ip || merged.location) {
8861
- logger14.info(`enrichment \u5B8C\u6210: ip=${merged.ip || "-"}, loc=${merged.location || "-"}`);
8789
+ logger13.info(`enrichment \u5B8C\u6210: ip=${merged.ip || "-"}, loc=${merged.location || "-"}`);
8862
8790
  } else {
8863
- logger14.warning("enrichment \u5B8C\u6210: \u672A\u83B7\u5F97 IP/Loc");
8791
+ logger13.warning("enrichment \u5B8C\u6210: \u672A\u83B7\u5F97 IP/Loc");
8864
8792
  }
8865
8793
  return merged;
8866
8794
  };
@@ -9673,7 +9601,7 @@ var watermarkifyScreenshotBuffer = async (buffer, meta, page = null, options = {
9673
9601
  }
9674
9602
  const imageInfo = readImageInfo(buffer);
9675
9603
  if (!imageInfo.width || !imageInfo.height || !imageInfo.mimeType) {
9676
- 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");
9677
9605
  return buffer;
9678
9606
  }
9679
9607
  const isMobileStrip = normalizeDevice(meta.device) === Device.Mobile && hasStrip;
@@ -9691,7 +9619,7 @@ var watermarkifyScreenshotBuffer = async (buffer, meta, page = null, options = {
9691
9619
 
9692
9620
  // src/internals/compression.js
9693
9621
  import { Jimp, JimpMime, ResizeStrategy } from "jimp";
9694
- var logger15 = createInternalLogger("Compression");
9622
+ var logger14 = createInternalLogger("Compression");
9695
9623
  var DEFAULT_SCREENSHOT_MAX_BYTES = 5 * 1024 * 1024;
9696
9624
  var DEFAULT_SCREENSHOT_OUTPUT_TYPE = "jpeg";
9697
9625
  var DEFAULT_SCREENSHOT_QUALITY = 0.72;
@@ -9810,18 +9738,18 @@ var compressImageBufferToBase64 = async (buffer, compression) => {
9810
9738
  return buffer.toString("base64");
9811
9739
  }
9812
9740
  const result = await compressImageBuffer(buffer, compression).catch((error) => {
9813
- 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)}`);
9814
9742
  return null;
9815
9743
  });
9816
9744
  if (!result?.buffer) {
9817
9745
  return buffer.toString("base64");
9818
9746
  }
9819
9747
  if (result.withinLimit) {
9820
- logger15.info(
9748
+ logger14.info(
9821
9749
  `captureScreen \u5DF2\u538B\u7F29: ${originalBytes} -> ${result.bytes} bytes, format=${result.format}, quality=${result.quality}, scale=${result.scale}, size=${result.width}x${result.height}`
9822
9750
  );
9823
9751
  } else {
9824
- logger15.warning(
9752
+ logger14.warning(
9825
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}`
9826
9754
  );
9827
9755
  }
@@ -9829,7 +9757,7 @@ var compressImageBufferToBase64 = async (buffer, compression) => {
9829
9757
  };
9830
9758
 
9831
9759
  // src/share.js
9832
- var logger16 = createInternalLogger("Share");
9760
+ var logger15 = createInternalLogger("Share");
9833
9761
  var DEFAULT_TIMEOUT_MS2 = 50 * 1e3;
9834
9762
  var DEFAULT_PAYLOAD_SNAPSHOT_MAX_LEN = 500;
9835
9763
  var DEFAULT_POLL_INTERVAL_MS = 120;
@@ -9966,7 +9894,7 @@ var createDomShareMonitor = async (page, options = {}) => {
9966
9894
  const onMatch = typeof options.onMatch === "function" ? options.onMatch : null;
9967
9895
  const onTelemetry = typeof options.onTelemetry === "function" ? options.onTelemetry : null;
9968
9896
  let matched = false;
9969
- 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}`);
9970
9898
  const monitor = await Mutation.useMonitor(page, selectors, {
9971
9899
  mode,
9972
9900
  onMutation: (context = {}) => {
@@ -9984,12 +9912,12 @@ ${text}`;
9984
9912
  });
9985
9913
  }
9986
9914
  if (mutationCount <= 5 || mutationCount % 50 === 0) {
9987
- 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}`);
9988
9916
  }
9989
9917
  const [candidate] = Utils.parseLinks(rawDom, { prefix }) || [];
9990
9918
  if (!candidate) return;
9991
9919
  matched = true;
9992
- 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}`);
9993
9921
  if (onMatch) {
9994
9922
  onMatch({
9995
9923
  link: candidate,
@@ -10005,7 +9933,7 @@ ${text}`;
10005
9933
  return {
10006
9934
  stop: async () => {
10007
9935
  const result = await monitor.stop();
10008
- 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}`);
10009
9937
  return result;
10010
9938
  }
10011
9939
  };
@@ -10054,8 +9982,8 @@ var Share = {
10054
9982
  if (share.mode === "response" && apiMatchers.length === 0) {
10055
9983
  throw new Error("Share.captureLink requires share.xurl[0] api matcher when mode=response");
10056
9984
  }
10057
- logger16.start("captureLink", `mode=${share.mode}, timeoutMs=${timeoutDisabled ? "disabled" : timeoutMs}, prefix=${share.prefix}`);
10058
- 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)}`);
10059
9987
  const stats = {
10060
9988
  actionTimedOut: false,
10061
9989
  domMutationCount: 0,
@@ -10067,7 +9995,7 @@ var Share = {
10067
9995
  responseSampleUrls: []
10068
9996
  };
10069
9997
  if (isAborted()) {
10070
- logger16.warning(`captureLink \u5DF2\u53D6\u6D88: ${abortReason()}`);
9998
+ logger15.warning(`captureLink \u5DF2\u53D6\u6D88: ${abortReason()}`);
10071
9999
  return {
10072
10000
  link: null,
10073
10001
  payloadText: "",
@@ -10090,7 +10018,7 @@ var Share = {
10090
10018
  link: validated,
10091
10019
  payloadText: String(payloadText || "")
10092
10020
  };
10093
- 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}`);
10094
10022
  return true;
10095
10023
  };
10096
10024
  const resolveResponseCandidate = (responseText) => {
@@ -10125,7 +10053,7 @@ var Share = {
10125
10053
  try {
10126
10054
  await monitor.stop();
10127
10055
  } catch (error) {
10128
- 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)}`);
10129
10057
  }
10130
10058
  };
10131
10059
  const onResponse = async (response) => {
@@ -10139,29 +10067,29 @@ var Share = {
10139
10067
  stats.responseSampleUrls.push(url);
10140
10068
  }
10141
10069
  if (stats.responseObserved <= 5) {
10142
- logger16.info(`\u63A5\u53E3\u54CD\u5E94\u91C7\u6837(${stats.responseObserved}): ${url}`);
10070
+ logger15.info(`\u63A5\u53E3\u54CD\u5E94\u91C7\u6837(${stats.responseObserved}): ${url}`);
10143
10071
  }
10144
10072
  if (!apiMatchers.some((matcher) => url.includes(matcher))) return;
10145
10073
  stats.responseMatched += 1;
10146
10074
  stats.lastMatchedUrl = url;
10147
- logger16.info(`\u63A5\u53E3\u547D\u4E2D\u5339\u914D(${stats.responseMatched}): ${url}`);
10075
+ logger15.info(`\u63A5\u53E3\u547D\u4E2D\u5339\u914D(${stats.responseMatched}): ${url}`);
10148
10076
  const text = await response.text();
10149
10077
  const hit = resolveResponseCandidate(text);
10150
10078
  if (!hit?.link) {
10151
10079
  if (stats.responseMatched <= 3) {
10152
- 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}`);
10153
10081
  }
10154
10082
  return;
10155
10083
  }
10156
10084
  stats.responseResolved += 1;
10157
- 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}`);
10158
10086
  setCandidate("response", hit.link, hit.payloadText);
10159
10087
  } catch (error) {
10160
- 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)}`);
10161
10089
  }
10162
10090
  };
10163
10091
  if (share.mode === "dom") {
10164
- 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");
10165
10093
  domMonitor = await createDomShareMonitor(page, {
10166
10094
  prefix: share.prefix,
10167
10095
  selectors: domSelectors,
@@ -10176,17 +10104,17 @@ var Share = {
10176
10104
  });
10177
10105
  }
10178
10106
  if (share.mode === "response") {
10179
- 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)}`);
10180
10108
  page.on("response", onResponse);
10181
10109
  }
10182
10110
  if (share.mode === "custom") {
10183
- 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");
10184
10112
  }
10185
10113
  const deadline = timeoutDisabled ? Infinity : Date.now() + timeoutMs;
10186
10114
  const getRemainingMs = () => timeoutDisabled ? Infinity : Math.max(0, deadline - Date.now());
10187
10115
  try {
10188
10116
  const actionTimeout = getRemainingMs();
10189
- 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`}`);
10190
10118
  let actionValue;
10191
10119
  if (!isAborted() && actionTimeout > 0) {
10192
10120
  let timer = null;
@@ -10199,30 +10127,30 @@ var Share = {
10199
10127
  ]);
10200
10128
  if (timer) clearTimeout(timer);
10201
10129
  if (actionResult.type === "error") {
10202
- logger16.fail("captureLink.performActions", actionResult.error);
10130
+ logger15.fail("captureLink.performActions", actionResult.error);
10203
10131
  throw actionResult.error;
10204
10132
  }
10205
10133
  if (actionResult.type === "timeout") {
10206
10134
  stats.actionTimedOut = true;
10207
- 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`);
10208
10136
  } else {
10209
10137
  actionValue = actionResult.result;
10210
- logger16.success("captureLink.performActions", "\u6267\u884C\u52A8\u4F5C\u5B8C\u6210");
10138
+ logger15.success("captureLink.performActions", "\u6267\u884C\u52A8\u4F5C\u5B8C\u6210");
10211
10139
  }
10212
10140
  }
10213
10141
  if (share.mode === "custom") {
10214
10142
  const customLink = typeof actionValue === "string" ? actionValue : actionValue?.link || actionValue?.payloadText;
10215
10143
  const customPayloadText = typeof actionValue === "string" ? actionValue : actionValue?.payloadText;
10216
10144
  if (setCandidate("custom", customLink, customPayloadText)) {
10217
- 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}`);
10218
10146
  } else {
10219
- 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");
10220
10148
  }
10221
10149
  }
10222
10150
  let nextProgressLogTs = Date.now() + 3e3;
10223
10151
  while (true) {
10224
10152
  if (isAborted()) {
10225
- logger16.warning(`captureLink \u5DF2\u53D6\u6D88: ${abortReason()}`);
10153
+ logger15.warning(`captureLink \u5DF2\u53D6\u6D88: ${abortReason()}`);
10226
10154
  return {
10227
10155
  link: null,
10228
10156
  payloadText: "",
@@ -10232,7 +10160,7 @@ var Share = {
10232
10160
  }
10233
10161
  const selected = candidates[share.mode];
10234
10162
  if (selected?.link) {
10235
- 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}`);
10236
10164
  return {
10237
10165
  link: selected.link,
10238
10166
  payloadText: selected.payloadText,
@@ -10245,7 +10173,7 @@ var Share = {
10245
10173
  if (remaining <= 0) break;
10246
10174
  const now = Date.now();
10247
10175
  if (now >= nextProgressLogTs) {
10248
- logger16.info(
10176
+ logger15.info(
10249
10177
  `captureLink \u7B49\u5F85\u4E2D: remaining=${timeoutDisabled ? "disabled" : `${remaining}ms`}, domMutationCount=${stats.domMutationCount}, responseMatched=${stats.responseMatched}`
10250
10178
  );
10251
10179
  nextProgressLogTs = now + 5e3;
@@ -10253,11 +10181,11 @@ var Share = {
10253
10181
  await delay5(Math.max(0, Math.min(DEFAULT_POLL_INTERVAL_MS, remaining)));
10254
10182
  }
10255
10183
  if (!timeoutDisabled && share.mode === "response" && stats.responseMatched === 0) {
10256
- logger16.warning(
10184
+ logger15.warning(
10257
10185
  `\u63A5\u53E3\u76D1\u542C\u672A\u547D\u4E2D: apiMatchers=${toJsonInline(apiMatchers, 220)}, \u54CD\u5E94\u6837\u672CURLs=${toJsonInline(stats.responseSampleUrls, 420)}`
10258
10186
  );
10259
10187
  }
10260
- logger16.warning(
10188
+ logger15.warning(
10261
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"}`
10262
10190
  );
10263
10191
  return {
@@ -10269,7 +10197,7 @@ var Share = {
10269
10197
  } finally {
10270
10198
  if (share.mode === "response") {
10271
10199
  page.off("response", onResponse);
10272
- logger16.info("response \u76D1\u542C\u5DF2\u5378\u8F7D");
10200
+ logger15.info("response \u76D1\u542C\u5DF2\u5378\u8F7D");
10273
10201
  }
10274
10202
  await stopDomMonitor();
10275
10203
  }