@skrillex1224/playwright-toolkit 3.0.4 → 3.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +45 -9
- package/dist/index.cjs.map +2 -2
- package/dist/index.js +45 -9
- package/dist/index.js.map +2 -2
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../entrys/node.js", "../src/constants.js", "../src/internals/logger.js", "../src/internals/screenshot.js", "../src/internals/constants.js", "../src/internals/viewport.js", "../src/errors.js", "../src/apify-kit.js", "../src/internals/proxy-meter-runtime.js", "../src/runtime-env.js", "../src/internals/utils.js", "../src/utils.js", "../src/internals/context.js", "../src/internals/reflect.js", "../src/internals/anti-cheat/default.js", "../src/internals/anti-cheat/cloak.js", "../src/anti-cheat.js", "../src/device-input.js", "../src/device-view.js", "../src/internals/humanize/index.js", "../src/internals/humanize/desktop.js", "../src/internals/humanize/shared.js", "../src/internals/humanize/mobile.js", "../src/internals/humanize/default.js", "../src/internals/humanize/cloak.js", "../src/humanize.js", "../src/internals/launch/default.js", "../src/proxy-bypass.js", "../src/internals/launch/traffic.js", "../src/internals/launch/cloak.js", "../src/launch.js", "../src/live-view.js", "../src/chaptcha.js", "../src/internals/captcha/bytedance.js", "../src/internals/captcha/shared.js", "../src/mutation.js", "../src/display.js", "../src/logger.js", "../src/share.js", "../src/internals/watermarkify.js", "../src/internals/compression.js"],
|
|
4
|
-
"sourcesContent": ["import { log as crawleeLog } from 'crawlee';\nimport { ApifyKit } from '../src/apify-kit.js';\nimport { Utils } from '../src/utils.js';\nimport { AntiCheat } from '../src/anti-cheat.js';\nimport { DeviceInput } from '../src/device-input.js';\nimport { DeviceView } from '../src/device-view.js';\nimport { Humanize } from '../src/humanize.js';\nimport { Launch } from '../src/launch.js';\nimport { LiveView } from '../src/live-view.js';\nimport { Captcha } from '../src/chaptcha.js';\nimport { Mutation } from '../src/mutation.js';\nimport { Display } from '../src/display.js';\nimport * as Constants from '../src/constants.js';\nimport * as Errors from '../src/errors.js';\nimport { Logger, LOG_TEMPLATES, stripAnsi } from '../src/logger.js';\nimport { Share } from '../src/share.js';\nimport { ByPass } from '../src/proxy-bypass.js';\nimport { RuntimeEnv } from '../src/runtime-env.js';\nimport { setToolkitMode } from '../src/internals/context.js';\n\n// \u4FEE\u6539\u9ED8\u8BA4logger \u4ECEconsole.log \u5230 crawleeLog\nLogger.setLogger(crawleeLog);\n\n// Unified Entry Point\nexport const usePlaywrightToolKit = (mode = 'default') => {\n setToolkitMode(mode);\n\n const toolkit = {\n ApifyKit,\n AntiCheat,\n DeviceInput,\n DeviceView,\n Humanize,\n Launch,\n LiveView,\n Constants,\n Utils,\n RuntimeEnv,\n Captcha,\n Errors,\n Mutation,\n Display,\n Logger,\n Share,\n ByPass,\n $Internals: { LOG_TEMPLATES, stripAnsi }\n };\n\n return toolkit;\n};\n", "export const Code = {\n Success: 0,\n UnknownError: -1,\n NotLogin: 30000001,\n Chaptcha: 30000002,\n Timeout: 30000003,\n InitialTimeout: 30000004,\n OverallTimeout: 30000005,\n}\n\nexport const Status = {\n Success: 'SUCCESS',\n Failed: 'FAILED'\n}\n\nexport const PresetOfLiveViewKey = 'LIVE_VIEW_SCREENSHOT';\n\nexport const Device = Object.freeze({\n Desktop: 'desktop',\n Mobile: 'mobile',\n});\n\nexport const Mode = Object.freeze({\n Default: 'default',\n Cloak: 'cloak',\n});\n\nexport const normalizeDevice = (value, fallback = Device.Desktop) => {\n const normalizedFallback = String(fallback || '').trim().toLowerCase() === Device.Mobile\n ? Device.Mobile\n : Device.Desktop;\n const raw = String(value || '').trim().toLowerCase();\n if (raw === Device.Mobile) return Device.Mobile;\n if (raw === Device.Desktop) return Device.Desktop;\n return normalizedFallback;\n};\n\nexport const normalizeMode = (value, fallback = Mode.Default) => {\n const normalizedFallback = String(fallback || '').trim().toLowerCase() === Mode.Cloak\n ? Mode.Cloak\n : Mode.Default;\n const raw = String(value || '').trim().toLowerCase();\n if (raw === Mode.Cloak) return Mode.Cloak;\n if (raw === Mode.Default) return Mode.Default;\n return normalizedFallback;\n};\n\nconst createActorInfo = (info) => {\n const normalizeDomain = (value) => {\n if (!value) return '';\n return String(value).trim().replace(/^https?:\\/\\//, '').replace(/\\/.*$/, '');\n };\n\n const normalizePath = (value) => {\n if (!value) return '/';\n const raw = String(value).trim();\n if (!raw) return '/';\n return raw.startsWith('/') ? raw : `/${raw}`;\n };\n\n const normalizeShare = (value) => {\n const raw = value && typeof value === 'object' ? value : {};\n\n const modeRaw = String(raw.mode || 'dom').trim().toLowerCase();\n const mode = ['dom', 'response', 'custom'].includes(modeRaw) ? modeRaw : 'dom';\n\n const prefix = String(raw.prefix || '').trim();\n\n const rawXurl = Array.isArray(raw.xurl)\n ? raw.xurl\n : [];\n\n const normalizeMatcherList = (input) => {\n if (Array.isArray(input)) {\n return input\n .map((item) => String(item || '').trim().replace(/\\.+$/, ''))\n .filter(Boolean);\n }\n\n const single = String(input || '').trim().replace(/\\.+$/, '');\n return single ? [single] : [];\n };\n\n const normalizeSegments = (input) => {\n if (Array.isArray(input)) {\n return input\n .map((item) => String(item || '').trim().replace(/\\.+$/, ''))\n .filter(Boolean);\n }\n\n const rawPath = String(input || '').trim();\n if (!rawPath) return [];\n\n return rawPath\n .split('.')\n .map((segment) => String(segment || '').trim().replace(/\\.+$/, ''))\n .filter(Boolean);\n };\n\n const xurl = [];\n\n const matcherList = normalizeMatcherList(rawXurl[0]);\n if (matcherList.length > 0) {\n xurl.push(matcherList);\n }\n\n const flatPath = [];\n const extraPaths = [];\n\n rawXurl.slice(1).forEach((item) => {\n if (Array.isArray(item)) {\n const segments = normalizeSegments(item);\n if (segments.length > 0) {\n extraPaths.push(segments);\n }\n return;\n }\n\n const segments = normalizeSegments(item);\n if (segments.length > 0) {\n flatPath.push(...segments);\n }\n });\n\n if (flatPath.length > 0) {\n xurl.push(flatPath);\n }\n\n if (extraPaths.length > 0) {\n xurl.push(...extraPaths);\n }\n\n return {\n mode,\n prefix,\n xurl,\n };\n };\n\n const buildLandingUrl = ({protocol, domain, path}) => {\n const safeProtocol = String(protocol).trim();\n const safeDomain = normalizeDomain(domain);\n const safePath = normalizePath(path);\n return `${safeProtocol}://${safeDomain}${safePath}`;\n };\n\n const buildIcon = ({key}) => {\n return `https://static.heartbitai.com/general/actors/${key}.png`;\n }\n\n\n const protocol = info.protocol || 'https';\n const domain = normalizeDomain(info.domain);\n const path = normalizePath(info.path);\n const share = normalizeShare(info.share);\n const device = normalizeDevice(info.device);\n\n return {\n ...info,\n protocol,\n domain,\n path,\n share,\n device,\n get icon() {\n if (info.icon) return info.icon;\n return buildIcon(this);\n },\n get landingUrl() {\n return buildLandingUrl(this);\n },\n };\n};\n\nexport const ActorInfo = {\n qbot: createActorInfo({\n key: 'qbot',\n name: 'QQ\u6D4F\u89C8\u5668AI\u641C',\n domain: 'sogou.com',\n path: '/web',\n share: {\n mode: 'dom',\n prefix: '',\n xurl: [],\n },\n }),\n douyin: createActorInfo({\n key: 'douyin',\n name: '\u6296\u97F3AI\u641C',\n domain: 'so.douyin.com',\n path: '/',\n share: {\n mode: 'dom',\n prefix: '',\n xurl: [\n ],\n },\n }),\n lingguang: createActorInfo({\n key: 'lingguang',\n name: '\u7075\u5149',\n domain: 'www.lingguang.com',\n path: '/',\n share: {\n mode: 'response',\n prefix: 'https://www.lingguang.com/share/',\n xurl: [\n '/chat/shareChat.json',\n 'result',\n ],\n },\n }),\n doubao: createActorInfo({\n key: 'doubao',\n name: '\u8C46\u5305',\n domain: 'www.doubao.com',\n path: '/',\n device: Device.Desktop,\n share: {\n mode: 'response',\n prefix: 'https://www.doubao.com/thread/',\n xurl: [\n '/samantha/thread/share/save',\n 'data', 'share_id',\n ],\n },\n }),\n deepseek: createActorInfo({\n key: 'deepseek',\n name: 'DeepSeek',\n domain: 'chat.deepseek.com',\n path: '/',\n share: {\n mode: 'response',\n prefix: 'https://chat.deepseek.com/share/',\n xurl: [\n '/api/v0/share/create',\n 'data', 'biz_data', 'share_id',\n ],\n },\n }),\n erine: createActorInfo({\n key: 'erine',\n name: '\u6587\u5FC3\u4E00\u8A00',\n domain: 'wenxin.baidu.com',\n path: '/',\n device: Device.Mobile,\n share: {\n mode: 'custom',\n prefix: '',\n xurl: [],\n },\n }),\n wenxin: createActorInfo({\n key: 'wenxin',\n name: '\u6587\u5FC3\u52A9\u624B',\n domain: 'chat.baidu.com',\n path: '/',\n device: Device.Mobile,\n share: {\n mode: 'response',\n prefix: 'https://chat.baidu.com/csaitab/history/share?v=2&share_id=',\n xurl: [\n '/aichat/api/getShareToken',\n 'data', 'token',\n ],\n },\n }),\n baidu: createActorInfo({\n key: 'baidu',\n name: '\u767E\u5EA6AI\u641C',\n domain: 'www.baidu.com',\n path: '/s',\n share: {\n mode: 'dom',\n prefix: '',\n xurl: [],\n },\n }),\n yuanbao: createActorInfo({\n key: 'yuanbao',\n name: '\u5143\u5B9D',\n domain: 'yuanbao.tencent.com',\n path: '/chat/',\n device: Device.Mobile,\n share: {\n mode: 'response',\n prefix: 'https://yb.tencent.com/s/',\n xurl: [\n '/api/conversations/v2/share', 'shareId',\n ],\n },\n }),\n kimi: createActorInfo({\n key: 'kimi',\n name: 'Kimi',\n domain: 'www.kimi.com',\n path: '/',\n device: Device.Mobile,\n share: {\n mode: 'response',\n prefix: 'https://www.kimi.com/share/',\n xurl: [\n '/kimi.gateway.chat.v1.ChatService/CreateChatShare', 'share', 'id'\n ],\n },\n }),\n qwen: createActorInfo({\n key: 'qwen',\n name: '\u901A\u4E49\u5343\u95EE',\n domain: 'www.qianwen.com',\n path: '/chat',\n device: Device.Mobile,\n share: {\n mode: 'response',\n prefix: 'https://www.qianwen.com/share/chat/',\n xurl: [\n '/api/v1/share/create', 'data', 'share_id'\n ],\n },\n }),\n nano: createActorInfo({\n key: 'nano',\n name: '\u7EB3\u7C73',\n domain: 'www.n.cn',\n path: '/',\n share: {\n mode: 'response',\n prefix: 'https://www.n.cn/share/mcp?id=',\n xurl: [\n '/api/share/gen', 'data', 'id'\n ],\n },\n }),\n quark: createActorInfo({\n key: 'quark',\n name: '\u5938\u514B',\n domain: 'ai.quark.cn',\n path: '/s',\n share: {\n mode: 'dom',\n prefix: '',\n xurl: [],\n },\n }),\n}\n", "\n// =============================================================================\n// Core Helpers & State\n// =============================================================================\n\nconst pad = (value, size = 2) => String(value).padStart(size, '0');\n\nconst FORCED_TIMEZONE_OFFSET_MINUTES = -8 * 60;\n\nconst formatTimestamp = (date = new Date()) => {\n const source = date instanceof Date ? date : new Date(date);\n const forcedDate = new Date(source.getTime() - (FORCED_TIMEZONE_OFFSET_MINUTES * 60 * 1000));\n\n const year = forcedDate.getUTCFullYear();\n const month = pad(forcedDate.getUTCMonth() + 1);\n const day = pad(forcedDate.getUTCDate());\n const hours = pad(forcedDate.getUTCHours());\n const minutes = pad(forcedDate.getUTCMinutes());\n const seconds = pad(forcedDate.getUTCSeconds());\n const millis = pad(forcedDate.getUTCMilliseconds(), 3);\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}.${millis}`;\n};\n\nconst formatLine = (prefix, icon, message) => {\n const parts = [];\n if (prefix) parts.push(`[${prefix}]`);\n if (icon) parts.push(icon);\n if (message) parts.push(message);\n return parts.join(' ').trim();\n};\n\nconst fallbackLog = {\n info: (...args) => console.log(...args),\n warning: (...args) => (console.warn ? console.warn(...args) : console.log(...args)),\n error: (...args) => console.error(...args),\n debug: (...args) => (console.debug ? console.debug(...args) : console.log(...args)),\n};\n\nconst resolveLogMethod = (logger, name) => {\n if (logger && typeof logger[name] === 'function') {\n return logger[name].bind(logger);\n }\n if (name === 'warning' && logger && typeof logger.warn === 'function') {\n return logger.warn.bind(logger);\n }\n return fallbackLog[name];\n};\n\nlet defaultLogger = null;\n\nexport const setDefaultLogger = (logger) => {\n defaultLogger = logger;\n};\n\n// Lazy resolver: always checks current state\nconst resolveLogger = (explicitLogger) => {\n if (explicitLogger && typeof explicitLogger.info === 'function') {\n return explicitLogger;\n }\n if (defaultLogger && typeof defaultLogger.info === 'function') {\n return defaultLogger;\n }\n return fallbackLog;\n};\n\nconst ANSI = {\n reset: '\\x1b[0m',\n gray: '\\x1b[90m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n cyan: '\\x1b[36m',\n};\n\nconst colorize = (text, color) => {\n if (!text || !color) return text;\n return `${color}${text}${ANSI.reset}`;\n};\n\nexport const createBaseLogger = (prefix = '', explicitLogger) => {\n const name = prefix ? String(prefix) : '';\n\n const dispatch = (methodName, icon, message, color) => {\n const logger = resolveLogger(explicitLogger);\n const logFn = resolveLogMethod(logger, methodName);\n const timestamp = colorize(`[${formatTimestamp()}]`, ANSI.gray);\n const line = formatLine(name, icon, message);\n const coloredLine = colorize(line, color);\n logFn(`${timestamp} ${coloredLine}`.trim());\n };\n\n return {\n info: (message) => dispatch('info', '\uD83D\uDCD6', message, ANSI.cyan),\n success: (message) => dispatch('info', '\u2705', message, ANSI.green),\n warning: (message) => dispatch('warning', '\u26A0\uFE0F', message, ANSI.yellow),\n warn: (message) => dispatch('warning', '\u26A0\uFE0F', message, ANSI.yellow),\n error: (message) => dispatch('error', '\u274C', message, ANSI.red),\n debug: (message) => dispatch('debug', '\uD83D\uDD39', message, ANSI.gray),\n start: (message) => dispatch('info', '\uD83D\uDD37', message, ANSI.blue),\n };\n};\n\n/**\n * \u521B\u5EFA\u6A21\u5757\u7EA7\u65E5\u5FD7\u5668\n * @param {string} moduleName - \u6A21\u5757\u540D\u79F0\n * @param {object} [logger] - \u53EF\u9009\u7684\u663E\u5F0F\u65E5\u5FD7\u5668\uFF0C\u901A\u5E38\u4E0D\u9700\u8981\u4F20\uFF0C\u4F1A\u81EA\u52A8\u4F7F\u7528 setDefaultLogger \u8BBE\u7F6E\u7684\u5168\u5C40\u65E5\u5FD7\u5668\n */\nexport function createInternalLogger(moduleName, explicitLogger) {\n const baseLogger = createBaseLogger(moduleName, explicitLogger);\n\n return {\n start(methodName, params = '') {\n const paramStr = params ? ` (${params})` : '';\n baseLogger.start(`${methodName} \u5F00\u59CB${paramStr}`);\n },\n success(methodName, result = '') {\n const resultStr = result ? ` (${result})` : '';\n baseLogger.success(`${methodName} \u5B8C\u6210${resultStr}`);\n },\n fail(methodName, error) {\n const message = error instanceof Error ? error.message : error;\n baseLogger.error(`${methodName} \u5931\u8D25: ${message}`);\n },\n debug(message) {\n baseLogger.debug(message);\n },\n warn(message) {\n baseLogger.warning(message);\n },\n warning(message) {\n baseLogger.warning(message);\n },\n info(message) {\n baseLogger.info(message);\n },\n error(message) {\n baseLogger.error(message);\n }\n };\n}\n", "import delay from 'delay';\nimport { Device, normalizeDevice } from '../constants.js';\nimport { PageRuntimeStateKey } from './constants.js';\nimport { createInternalLogger } from './logger.js';\nimport { resolveCurrentViewportSize } from './viewport.js';\n\nconst logger = createInternalLogger('Screenshot');\n\nconst DEFAULT_TIMEOUT_MS = 5000;\nconst FORCED_FULLPAGE_TYPE = 'jpeg';\nconst FORCED_FULLPAGE_QUALITY = 50;\nconst SUPPORTED_TYPES = new Set(['png', 'jpeg', 'webp']);\nconst EXPANDED_SCROLLABLE_CLASS = '__pk_expanded__';\nconst DEFAULT_MAX_HEIGHT = 8000;\nconst DEFAULT_SETTLE_MS = 1000;\nconst DEFAULT_MOBILE_SETTLE_MS = 50;\n\nconst toPositiveNumber = (value, fallback = 0) => {\n const n = Number(value);\n if (!Number.isFinite(n) || n <= 0) return fallback;\n return n;\n};\n\nconst toPositiveInteger = (value, fallback = 0) => {\n const number = Math.round(Number(value) || 0);\n return number > 0 ? number : fallback;\n};\n\nconst normalizeType = (value) => {\n const raw = String(value || 'png').trim().toLowerCase();\n if (!SUPPORTED_TYPES.has(raw)) return 'png';\n return raw;\n};\n\nconst normalizeQuality = (value, type) => {\n if (type !== 'jpeg' && type !== 'webp') return undefined;\n const n = Number(value);\n if (!Number.isFinite(n)) return undefined;\n const rounded = Math.round(n);\n if (rounded < 0 || rounded > 100) return undefined;\n return rounded;\n};\n\nconst resolvePageDevice = (page) => normalizeDevice(page?.[PageRuntimeStateKey]?.device);\n\nconst buildFullPageClip = (metrics, viewport, maxClipHeight) => {\n const contentSize = metrics && typeof metrics === 'object'\n ? metrics.contentSize || null\n : null;\n\n const width = Math.max(1, Math.ceil(viewport.width || contentSize?.width || 1));\n let height = Math.max(1, Math.ceil(contentSize?.height || viewport.height || 1));\n\n if (maxClipHeight > 0) {\n height = Math.min(height, maxClipHeight);\n }\n\n return {\n x: 0,\n y: 0,\n width,\n height,\n scale: 1,\n };\n};\n\nconst expandScrollableContent = async (page, options = {}) => {\n // \u53EA\u5C55\u5F00\u5F53\u524D\u201C\u53EF\u89C1\u201D\u7684\u6EDA\u52A8\u5BB9\u5668\uFF0C\u907F\u514D\u628A\u9690\u85CF\u9762\u677F / \u6298\u53E0\u533A\u57DF\u4E5F\u7B97\u8FDB\u622A\u56FE\u9AD8\u5EA6\u3002\n return await page.evaluate(({ className, forceScrollableHeight, visibleOnly, expandDocumentElements }) => {\n const body = document.body;\n const root = document.documentElement;\n const scrollingElement = document.scrollingElement;\n const candidates = [];\n const seen = new Set();\n let maxHeight = window.innerHeight || 0;\n\n const pushCandidate = (el) => {\n if (!el || seen.has(el)) return;\n seen.add(el);\n candidates.push(el);\n };\n\n pushCandidate(scrollingElement);\n pushCandidate(root);\n pushCandidate(body);\n document.querySelectorAll('*').forEach(pushCandidate);\n\n const scrollableOverflow = new Set(['auto', 'scroll', 'overlay']);\n const clippingOverflow = new Set(['hidden', 'clip']);\n const isDocumentElement = (el) => el === root || el === body || el === scrollingElement;\n\n const isVisible = (el, style, rect) => {\n if (!el || !style || !rect) return false;\n if (style.display === 'none' || style.visibility === 'hidden' || style.visibility === 'collapse') {\n return false;\n }\n if (Number(style.opacity) === 0) return false;\n return rect.width > 0 && rect.height > 0;\n };\n\n const hasOverflowValue = (style, values) => {\n const overflowY = String(style?.overflowY || '').toLowerCase();\n const overflow = String(style?.overflow || '').toLowerCase();\n return values.has(overflowY) || values.has(overflow);\n };\n\n const isLargeVerticalClipper = (el, rect) => {\n if (!el || !rect) return false;\n\n const viewportHeight = window.innerHeight || 0;\n const visibleHeight = Math.ceil(rect.height || 0);\n const clientHeight = Math.ceil(el.clientHeight || 0);\n const boxHeight = Math.max(visibleHeight, clientHeight);\n\n // hidden/clip \u901A\u5E38\u662F\u56FE\u7247\u3001\u89C6\u9891\u3001\u5361\u7247\u7684\u89C6\u89C9\u88C1\u526A\uFF0C\u4E0D\u80FD\u9ED8\u8BA4\u653E\u5F00\u3002\n // \u53EA\u6709\u63A5\u8FD1 viewport \u7684\u7EB5\u5411\u5E03\u5C40\u58F3\uFF0C\u624D\u8BA4\u4E3A\u662F app shell \u7C7B\u88C1\u526A\u5C42\u3002\n return boxHeight >= Math.max(320, viewportHeight * 0.45);\n };\n\n const hasLargeVerticalOverflow = (el, rect) => {\n if (!isLargeVerticalClipper(el, rect)) return false;\n\n const viewportHeight = window.innerHeight || 0;\n const scrollHeight = Math.ceil(el.scrollHeight || 0);\n const clientHeight = Math.ceil(el.clientHeight || 0);\n const overflowDelta = scrollHeight - clientHeight;\n\n return overflowDelta >= Math.max(160, viewportHeight * 0.18);\n };\n\n const rememberOriginalBoxStyles = (el, { includeDocumentElement = false } = {}) => {\n if (!el || (!includeDocumentElement && isDocumentElement(el)) || el.classList.contains(className)) {\n return;\n }\n\n el.dataset.pkOrigOverflow = el.style.overflow;\n el.dataset.pkOrigOverflowPriority = el.style.getPropertyPriority('overflow') || '';\n el.dataset.pkOrigHeight = el.style.height;\n el.dataset.pkOrigHeightPriority = el.style.getPropertyPriority('height') || '';\n el.dataset.pkOrigMinHeight = el.style.minHeight;\n el.dataset.pkOrigMinHeightPriority = el.style.getPropertyPriority('min-height') || '';\n el.dataset.pkOrigMaxHeight = el.style.maxHeight;\n el.dataset.pkOrigMaxHeightPriority = el.style.getPropertyPriority('max-height') || '';\n el.classList.add(className);\n };\n\n const expandDocumentElementsToHeight = (height) => {\n if (!expandDocumentElements) return;\n\n const targetHeight = Math.ceil(Number(height) || 0);\n if (targetHeight <= 0) return;\n\n [root, body, scrollingElement].forEach((el) => {\n if (!el) return;\n\n // \u79FB\u52A8\u7AEF\u4FDD\u7559\u771F\u5B9E viewport \u622A\u957F\u56FE\u65F6\uFF0Chtml/body \u5E38\u89C1\u7684 100% + overflow:hidden\n // \u4ECD\u4F1A\u88C1\u6389\u5DF2\u5C55\u5F00\u7684\u5185\u5BB9\u533A\uFF1B\u8FD9\u91CC\u628A\u6587\u6863\u5C42\u88C1\u526A\u58F3\u4E5F\u7EB3\u5165\u53EF\u6062\u590D\u7684\u5C55\u5F00\u8303\u56F4\u3002\n rememberOriginalBoxStyles(el, { includeDocumentElement: true });\n el.style.setProperty('overflow', 'visible', 'important');\n el.style.setProperty('height', `${targetHeight}px`, 'important');\n el.style.setProperty('min-height', `${targetHeight}px`, 'important');\n el.style.setProperty('max-height', 'none', 'important');\n });\n };\n\n const isScrollableY = (el, style, rect) => {\n if (!el || el.scrollHeight <= el.clientHeight + 1) {\n return false;\n }\n\n if (isDocumentElement(el)) {\n return true;\n }\n\n if (hasOverflowValue(style, scrollableOverflow)) {\n return true;\n }\n\n return hasOverflowValue(style, clippingOverflow) && hasLargeVerticalOverflow(el, rect);\n };\n\n const measureNeededHeight = (el) => {\n if (!el) return 0;\n const scrollHeight = Math.ceil(el.scrollHeight || 0);\n if (scrollHeight <= 0) return 0;\n\n if (isDocumentElement(el)) {\n return scrollHeight;\n }\n\n const rect = el.getBoundingClientRect();\n if (!rect || rect.width <= 0 || rect.height <= 0) {\n return 0;\n }\n\n const documentTop = Math.max(0, Math.ceil(rect.top + (window.scrollY || window.pageYOffset || 0)));\n return documentTop + scrollHeight;\n };\n\n const scrollableElements = [];\n const expandedAncestors = [];\n\n const expandElementToScrollHeight = (el) => {\n if (!el || isDocumentElement(el)) return;\n const scrollHeight = Math.ceil(el.scrollHeight || 0);\n if (scrollHeight <= 0) return;\n\n rememberOriginalBoxStyles(el);\n el.style.setProperty('overflow', 'visible', 'important');\n el.style.setProperty('height', `${scrollHeight}px`, 'important');\n el.style.setProperty('min-height', `${scrollHeight}px`, 'important');\n el.style.setProperty('max-height', 'none', 'important');\n };\n\n const expandClippingAncestors = (el) => {\n for (let node = el?.parentElement; node && !isDocumentElement(node); node = node.parentElement) {\n const style = window.getComputedStyle(node);\n const rect = node.getBoundingClientRect();\n if (!isVisible(node, style, rect)) continue;\n\n const scrollableClip = hasOverflowValue(style, scrollableOverflow);\n const visualClip = hasOverflowValue(style, clippingOverflow);\n if (!scrollableClip && (!visualClip || !isLargeVerticalClipper(node, rect))) continue;\n\n rememberOriginalBoxStyles(node);\n node.style.setProperty('overflow', 'visible', 'important');\n node.style.setProperty('max-height', 'none', 'important');\n expandedAncestors.push(node);\n }\n };\n\n const expandAncestorsToCurrentScrollHeight = () => {\n // \u5B50\u6EDA\u52A8\u533A\u5C55\u5F00\u540E\uFF0C100vh / flex \u5916\u58F3\u7684 scrollHeight \u624D\u4F1A\u53D8\u5927\uFF1B\u4ECE\u5185\u5230\u5916\u6491\u5F00\u53EF\u907F\u514D\u7236\u7EA7\u7EE7\u7EED\u88C1\u526A\u3002\n const ancestors = [...new Set(expandedAncestors)];\n for (let pass = 0; pass < 2; pass += 1) {\n ancestors.forEach((node) => {\n if (!node || isDocumentElement(node)) return;\n const scrollHeight = Math.ceil(node.scrollHeight || 0);\n if (scrollHeight <= node.clientHeight + 1) return;\n\n rememberOriginalBoxStyles(node);\n node.style.setProperty('height', `${scrollHeight}px`, 'important');\n node.style.setProperty('min-height', `${scrollHeight}px`, 'important');\n node.style.setProperty('max-height', 'none', 'important');\n });\n }\n };\n\n const measureExpandedRenderedBottom = () => {\n let renderedBottom = maxHeight;\n const scrollY = window.scrollY || window.pageYOffset || 0;\n\n candidates.forEach((el) => {\n if (!el || isDocumentElement(el)) return;\n if (!el.classList.contains(className) && !el.closest(`.${className}`)) return;\n\n const style = window.getComputedStyle(el);\n const rect = el.getBoundingClientRect();\n if (!isVisible(el, style, rect)) return;\n\n renderedBottom = Math.max(renderedBottom, Math.ceil(rect.bottom + scrollY));\n });\n\n return renderedBottom;\n };\n\n const measureDocumentScrollHeight = () => {\n return Math.max(\n maxHeight,\n Math.ceil(root?.scrollHeight || 0),\n Math.ceil(body?.scrollHeight || 0),\n Math.ceil(scrollingElement?.scrollHeight || 0),\n );\n };\n\n candidates.forEach((el) => {\n const style = window.getComputedStyle(el);\n const rect = el.getBoundingClientRect();\n\n if (visibleOnly && !isVisible(el, style, rect)) {\n return;\n }\n\n if (!isScrollableY(el, style, rect)) {\n return;\n }\n\n const neededHeight = measureNeededHeight(el);\n if (neededHeight <= 0) {\n return;\n }\n\n if (neededHeight > maxHeight) {\n maxHeight = neededHeight;\n }\n\n scrollableElements.push(el);\n\n if (isDocumentElement(el)) {\n return;\n }\n\n expandClippingAncestors(el);\n\n if (forceScrollableHeight) {\n expandElementToScrollHeight(el);\n return;\n }\n\n rememberOriginalBoxStyles(el);\n el.style.overflow = 'visible';\n el.style.height = 'auto';\n el.style.maxHeight = 'none';\n });\n\n expandAncestorsToCurrentScrollHeight();\n\n // \u5C55\u5F00\u5B50\u5BB9\u5668\u540E\uFF0C\u7236\u7EA7/\u6587\u6863\u9AD8\u5EA6\u53EF\u80FD\u968F\u5E03\u5C40\u91CD\u65B0\u8BA1\u7B97\uFF1B\u8FD9\u91CC\u518D\u6D4B\u4E00\u8F6E\u907F\u514D\u4F4E\u4F30\u3002\n scrollableElements.forEach((el) => {\n const neededHeight = measureNeededHeight(el);\n if (neededHeight > maxHeight) {\n maxHeight = neededHeight;\n }\n });\n\n maxHeight = Math.max(maxHeight, measureDocumentScrollHeight(), measureExpandedRenderedBottom());\n\n if (expandDocumentElements) {\n for (let pass = 0; pass < 2; pass += 1) {\n expandDocumentElementsToHeight(maxHeight);\n maxHeight = Math.max(maxHeight, measureDocumentScrollHeight(), measureExpandedRenderedBottom());\n }\n }\n\n return Math.ceil(maxHeight);\n }, {\n className: EXPANDED_SCROLLABLE_CLASS,\n forceScrollableHeight: options.forceScrollableHeight !== false,\n visibleOnly: options.visibleOnly !== false,\n expandDocumentElements: options.expandDocumentElements === true,\n });\n};\n\nconst adjustAffixedElementsForExpandedScreenshot = async (page, options = {}) => {\n return await page.evaluate(({ className, targetHeight }) => {\n const viewportWidth = window.innerWidth\n || document.documentElement?.clientWidth\n || document.body?.clientWidth\n || 0;\n const viewportHeight = window.innerHeight\n || document.documentElement?.clientHeight\n || document.body?.clientHeight\n || 0;\n const scrollY = window.scrollY || window.pageYOffset || 0;\n const safeTargetHeight = Math.ceil(Number(targetHeight) || 0);\n\n if (safeTargetHeight <= viewportHeight + 1) {\n return 0;\n }\n\n const hasOwn = (source, key) => Object.prototype.hasOwnProperty.call(source, key);\n const isVisible = (el, style, rect) => {\n if (!el || !style || !rect) return false;\n if (style.display === 'none' || style.visibility === 'hidden' || style.visibility === 'collapse') {\n return false;\n }\n if (Number(style.opacity) === 0) return false;\n return rect.width > 0 && rect.height > 0;\n };\n\n const edgeThreshold = Math.max(24, Math.min(96, viewportHeight * 0.12));\n const maxAffixedHeight = Math.max(56, viewportHeight * 0.65);\n const candidates = [];\n\n document.querySelectorAll('*').forEach((el) => {\n const style = window.getComputedStyle(el);\n const position = String(style.position || '').toLowerCase();\n if (position !== 'fixed' && position !== 'sticky') return;\n\n const rect = el.getBoundingClientRect();\n if (!isVisible(el, style, rect)) return;\n if (rect.height > maxAffixedHeight) return;\n if (rect.width < viewportWidth * 0.25 && rect.height < 80) return;\n\n const top = Number.parseFloat(style.top);\n const bottom = Number.parseFloat(style.bottom);\n const hasTopRule = Number.isFinite(top) && top <= Math.max(160, viewportHeight * 0.25);\n const hasBottomRule = Number.isFinite(bottom) && bottom <= Math.max(160, viewportHeight * 0.25);\n const isNearViewportTop = rect.top <= edgeThreshold;\n const isNearViewportBottom = rect.bottom >= viewportHeight - edgeThreshold;\n const edge = (hasBottomRule || isNearViewportBottom) && !(hasTopRule || isNearViewportTop)\n ? 'bottom'\n : 'top';\n\n if (position === 'fixed' && edge === 'top' && !hasTopRule && !isNearViewportTop) return;\n if (position === 'fixed' && edge === 'bottom' && !hasBottomRule && !isNearViewportBottom) return;\n if (position === 'sticky' && !hasTopRule && !hasBottomRule && !isNearViewportTop && !isNearViewportBottom) return;\n\n candidates.push({ el, position, edge });\n });\n\n const candidateSet = new Set(candidates.map(({ el }) => el));\n const topLevelCandidates = candidates.filter(({ el }) => {\n for (let parent = el.parentElement; parent; parent = parent.parentElement) {\n if (candidateSet.has(parent)) return false;\n }\n return true;\n });\n\n topLevelCandidates.forEach(({ el, position, edge }) => {\n if (!hasOwn(el.dataset, 'pkAffixedAdjusted')) {\n el.dataset.pkAffixedAdjusted = '1';\n el.dataset.pkOrigPosition = el.style.getPropertyValue('position') || '';\n el.dataset.pkOrigPositionPriority = el.style.getPropertyPriority('position') || '';\n el.dataset.pkOrigTop = el.style.getPropertyValue('top') || '';\n el.dataset.pkOrigTopPriority = el.style.getPropertyPriority('top') || '';\n el.dataset.pkOrigBottom = el.style.getPropertyValue('bottom') || '';\n el.dataset.pkOrigBottomPriority = el.style.getPropertyPriority('bottom') || '';\n el.dataset.pkOrigTranslate = el.style.getPropertyValue('translate') || '';\n el.dataset.pkOrigTranslatePriority = el.style.getPropertyPriority('translate') || '';\n }\n\n el.classList.add(className);\n if (position === 'fixed') {\n // CDP \u957F\u622A\u56FE\u4F1A\u628A fixed \u5143\u7D20\u753B\u5728\u5F53\u524D viewport \u5BF9\u5E94\u7684\u6587\u6863 y \u4E0A\u3002\n // \u6309 scrollY \u6295\u5F71\u56DE\u6574\u5F20\u622A\u56FE\u7684\u9876\u90E8/\u5E95\u90E8\uFF0C\u907F\u514D\u5B83\u6F02\u5728\u5F53\u524D\u6EDA\u52A8\u4F4D\u7F6E\u3002\n const deltaY = edge === 'bottom'\n ? safeTargetHeight - viewportHeight - scrollY\n : -scrollY;\n if (Math.abs(deltaY) > 1) {\n el.style.setProperty('translate', `0 ${Math.round(deltaY)}px`, 'important');\n }\n return;\n }\n\n // sticky \u5143\u7D20\u672C\u6765\u5728\u6587\u6863\u6D41\u91CC\uFF1B\u957F\u622A\u56FE\u91CC\u4E0D\u5E94\u6309\u5F53\u524D viewport \u7C98\u4F4F\u3002\n // \u4E34\u65F6\u89E3 sticky\uFF0C\u8BA9\u5B83\u56DE\u5230\u81EA\u7136\u6587\u6863\u4F4D\u7F6E\uFF0C\u907F\u514D\u4E2D\u95F4\u60AC\u6D6E\u6216\u5E95\u90E8\u91CD\u590D\u3002\n el.style.setProperty('position', 'relative', 'important');\n el.style.setProperty('top', 'auto', 'important');\n el.style.setProperty('bottom', 'auto', 'important');\n });\n\n return topLevelCandidates.length;\n }, {\n className: EXPANDED_SCROLLABLE_CLASS,\n targetHeight: options.targetHeight,\n });\n};\n\nconst restoreAffixedElementsForExpandedScreenshot = async (page) => {\n await page.evaluate((className) => {\n const hasOwn = (source, key) => Object.prototype.hasOwnProperty.call(source, key);\n const expansionKeys = [\n 'pkOrigOverflow',\n 'pkOrigHeight',\n 'pkOrigMinHeight',\n 'pkOrigMaxHeight',\n ];\n\n document.querySelectorAll('[data-pk-affixed-adjusted=\"1\"]').forEach((el) => {\n if (hasOwn(el.dataset, 'pkOrigPosition')) {\n el.style.setProperty('position', el.dataset.pkOrigPosition || '', el.dataset.pkOrigPositionPriority || '');\n delete el.dataset.pkOrigPosition;\n delete el.dataset.pkOrigPositionPriority;\n }\n if (hasOwn(el.dataset, 'pkOrigTop')) {\n el.style.setProperty('top', el.dataset.pkOrigTop || '', el.dataset.pkOrigTopPriority || '');\n delete el.dataset.pkOrigTop;\n delete el.dataset.pkOrigTopPriority;\n }\n if (hasOwn(el.dataset, 'pkOrigBottom')) {\n el.style.setProperty('bottom', el.dataset.pkOrigBottom || '', el.dataset.pkOrigBottomPriority || '');\n delete el.dataset.pkOrigBottom;\n delete el.dataset.pkOrigBottomPriority;\n }\n if (hasOwn(el.dataset, 'pkOrigTranslate')) {\n el.style.setProperty('translate', el.dataset.pkOrigTranslate || '', el.dataset.pkOrigTranslatePriority || '');\n delete el.dataset.pkOrigTranslate;\n delete el.dataset.pkOrigTranslatePriority;\n }\n\n delete el.dataset.pkAffixedAdjusted;\n\n const stillExpanded = expansionKeys.some((key) => hasOwn(el.dataset, key));\n if (!stillExpanded) {\n el.classList.remove(className);\n }\n });\n }, EXPANDED_SCROLLABLE_CLASS);\n};\n\nconst prepareExpandedFullPageScreenshot = async (page, options = {}) => {\n const originalViewport = await resolveCurrentViewportSize(page);\n const maxHeight = toPositiveInteger(options.maxHeight, DEFAULT_MAX_HEIGHT);\n const preserveViewport = options.preserveViewport ?? resolvePageDevice(page) === Device.Mobile;\n const defaultSettleMs = preserveViewport ? DEFAULT_MOBILE_SETTLE_MS : DEFAULT_SETTLE_MS;\n const requestedSettleMs = Math.max(0, Number(options.settleMs ?? defaultSettleMs) || 0);\n const settleMs = preserveViewport\n ? Math.min(requestedSettleMs, DEFAULT_MOBILE_SETTLE_MS)\n : requestedSettleMs;\n\n // \u5148\u628A\u53EF\u89C1\u6EDA\u52A8\u533A\u57DF\u6491\u5F00\uFF0C\u518D\u4EA4\u7ED9\u7EDF\u4E00\u7684 CDP screenshot \u539F\u8BED\u3002\n // \u684C\u9762\u7AEF\u6CBF\u7528\u5386\u53F2\u884C\u4E3A\uFF1A\u628A viewport \u8C03\u9AD8\uFF0C\u517C\u5BB9\u4F9D\u8D56 100%/100vh \u81EA\u7136\u91CD\u6392\u7684\u9875\u9762\u3002\n // \u79FB\u52A8\u7AEF\u4FDD\u7559\u771F\u5B9E viewport\uFF1A\u79FB\u52A8\u7AD9\u5E38\u5728 resize \u540E\u91CD\u7B97\u865A\u62DF\u5217\u8868\u6216 app shell\uFF0C\n // \u5982\u679C\u628A viewport \u62C9\u5230\u51E0\u5343\u50CF\u7D20\uFF0C\u5BB9\u6613\u53EA\u5269\u9996\u5C4F\u5185\u5BB9\u3001\u4E0B\u65B9\u53D8\u767D\u3002\n // \u540C\u65F6\u79FB\u52A8\u7AEF CDP \u957F\u622A\u56FE\u7B49\u5F85\u8FC7\u4E45\u4F1A\u77ED\u6682\u66B4\u9732 1x1 visualViewport\uFF1B\n // \u654F\u611F\u9875\u9762\u7684 resize handler \u4F1A\u628A\u6B63\u6587\u538B\u6210\u7A84\u5217\uFF0C\u6240\u4EE5\u79FB\u52A8\u7AEF settle \u9700\u8981\u77ED\u7A97\u53E3\u3002\n const maxScrollHeight = await expandScrollableContent(page, {\n forceScrollableHeight: options.forceScrollableHeight,\n visibleOnly: options.visibleOnly !== false,\n expandDocumentElements: preserveViewport,\n });\n const targetHeight = Math.min(maxScrollHeight, maxHeight);\n\n let viewportResized = false;\n if (!preserveViewport) {\n await page.setViewportSize({\n width: originalViewport.width,\n height: targetHeight,\n });\n viewportResized = true;\n } else {\n await adjustAffixedElementsForExpandedScreenshot(page, { targetHeight }).catch((error) => {\n logger.warning(`\u79FB\u52A8\u7AEF\u5438\u9644\u5143\u7D20\u91CD\u5B9A\u4F4D\u5931\u8D25: ${error?.message || error}`);\n });\n }\n\n if (settleMs > 0) {\n await delay(settleMs);\n }\n\n return {\n originalViewport,\n maxScrollHeight,\n targetHeight,\n preserveViewport,\n viewportResized,\n };\n};\n\nconst restoreExpandedFullPageScreenshot = async (page, state = {}) => {\n // \u8FD8\u539F\u65F6\u53EA\u64A4\u9500\u672C\u6B21\u6CE8\u5165\u7684 inline \u6837\u5F0F\u548C\u6807\u8BB0\u7C7B\uFF0C\u4E0D\u78B0\u9875\u9762\u81EA\u5DF1\u7684\u771F\u5B9E\u6837\u5F0F\u6765\u6E90\u3002\n await page.evaluate((className) => {\n const targets = new Set([\n ...document.querySelectorAll(`.${className}`),\n document.documentElement,\n document.body,\n document.scrollingElement,\n ].filter((el) => el?.classList?.contains(className)));\n\n targets.forEach((el) => {\n el.style.setProperty('overflow', el.dataset.pkOrigOverflow || '', el.dataset.pkOrigOverflowPriority || '');\n el.style.setProperty('height', el.dataset.pkOrigHeight || '', el.dataset.pkOrigHeightPriority || '');\n el.style.setProperty('min-height', el.dataset.pkOrigMinHeight || '', el.dataset.pkOrigMinHeightPriority || '');\n el.style.setProperty('max-height', el.dataset.pkOrigMaxHeight || '', el.dataset.pkOrigMaxHeightPriority || '');\n\n delete el.dataset.pkOrigOverflow;\n delete el.dataset.pkOrigOverflowPriority;\n delete el.dataset.pkOrigHeight;\n delete el.dataset.pkOrigHeightPriority;\n delete el.dataset.pkOrigMinHeight;\n delete el.dataset.pkOrigMinHeightPriority;\n delete el.dataset.pkOrigMaxHeight;\n delete el.dataset.pkOrigMaxHeightPriority;\n el.classList.remove(className);\n });\n }, EXPANDED_SCROLLABLE_CLASS);\n\n if (state?.originalViewport && state?.viewportResized) {\n await page.setViewportSize(state.originalViewport);\n }\n};\n\nexport const capturePageScreenshot = async (page, options = {}) => {\n // \u8FD9\u662F\u5E95\u5C42\u622A\u56FE\u539F\u8BED\uFF1A\u4F18\u5148\u8D70 CDP\uFF0C\u5931\u8D25\u540E\u56DE\u9000\u5230 page.screenshot\u3002\n // \u4E0A\u5C42\u662F\u5426\u5C55\u5F00\u6EDA\u52A8\u3001\u662F\u5426 fullPage\uFF0C\u7531\u8C03\u7528\u65B9\u81EA\u5DF1\u51B3\u5B9A\u3002\n const fullPage = Boolean(options.fullPage);\n const type = fullPage ? FORCED_FULLPAGE_TYPE : normalizeType(options.type);\n const quality = fullPage\n ? FORCED_FULLPAGE_QUALITY\n : normalizeQuality(options.quality, type);\n const timeout = toPositiveNumber(options.timeout, DEFAULT_TIMEOUT_MS);\n const maxClipHeight = Math.round(toPositiveNumber(options.maxClipHeight, 0));\n\n const fallbackOptions = {\n type: type === 'webp' ? 'png' : type,\n fullPage,\n };\n if (quality !== undefined && fallbackOptions.type === 'jpeg') {\n fallbackOptions.quality = quality;\n }\n if (timeout > 0) {\n fallbackOptions.timeout = timeout;\n }\n\n try {\n const context = page && typeof page.context === 'function' ? page.context() : null;\n if (!context || typeof context.newCDPSession !== 'function') {\n throw new Error('CDP session is not available');\n }\n\n const session = await context.newCDPSession(page);\n try {\n const metrics = await session.send('Page.getLayoutMetrics');\n const viewport = await resolveCurrentViewportSize(page);\n\n const captureParams = {\n format: type,\n fromSurface: true,\n captureBeyondViewport: fullPage,\n optimizeForSpeed: true,\n };\n\n if (quality !== undefined) {\n captureParams.quality = quality;\n }\n\n if (fullPage) {\n captureParams.clip = buildFullPageClip(metrics, viewport, maxClipHeight);\n }\n\n const result = await session.send('Page.captureScreenshot', captureParams);\n if (!result || typeof result.data !== 'string' || !result.data) {\n throw new Error('CDP returned empty screenshot data');\n }\n\n return Buffer.from(result.data, 'base64');\n } finally {\n if (typeof session.detach === 'function') {\n await session.detach().catch(() => { });\n }\n }\n } catch (error) {\n logger.warning(`CDP \u622A\u56FE\u5931\u8D25\uFF0C\u56DE\u9000 page.screenshot: ${error?.message || error}`);\n return await page.screenshot(fallbackOptions);\n }\n};\n\nexport const captureExpandedFullPageScreenshot = async (page, options = {}) => {\n // \u8FD9\u4E2A\u5305\u88C5\u5668\u53EA\u8D1F\u8D23\u201C\u5148\u5C55\u5F00\uFF0C\u518D\u622A\u56FE\uFF0C\u518D\u53EF\u9009\u6062\u590D\u201D\u3002\n const state = await prepareExpandedFullPageScreenshot(page, options);\n\n try {\n return await capturePageScreenshot(page, {\n fullPage: true,\n type: options.type || 'png',\n quality: options.quality,\n timeout: options.timeout,\n maxClipHeight: state.targetHeight,\n });\n } finally {\n await restoreAffixedElementsForExpandedScreenshot(page).catch((error) => {\n logger.warning(`\u79FB\u52A8\u7AEF\u5438\u9644\u5143\u7D20\u6062\u590D\u5931\u8D25: ${error?.message || error}`);\n });\n\n if (options.restore) {\n await restoreExpandedFullPageScreenshot(page, state);\n }\n }\n};\n", "export const PageRuntimeStateKey = '__playwright_toolkit_runtime_state__';\n", "const toPositiveInt = (value) => {\n const number = Math.round(Number(value) || 0);\n return number > 0 ? number : 0;\n};\n\nexport const resolveCurrentViewportSize = async (page, fallback = {}) => {\n const directViewport = page?.viewportSize?.();\n const directWidth = toPositiveInt(directViewport?.width);\n const directHeight = toPositiveInt(directViewport?.height);\n\n if (directWidth && directHeight) {\n return {\n width: directWidth,\n height: directHeight,\n };\n }\n\n const measuredViewport = await page?.evaluate?.(() => ({\n width: window.innerWidth\n || document.documentElement?.clientWidth\n || document.body?.clientWidth\n || 0,\n height: window.innerHeight\n || document.documentElement?.clientHeight\n || document.body?.clientHeight\n || 0,\n })).catch(() => null);\n\n const fallbackWidth = toPositiveInt(fallback?.width);\n const fallbackHeight = toPositiveInt(fallback?.height);\n\n return {\n width: toPositiveInt(measuredViewport?.width) || fallbackWidth || 1,\n height: toPositiveInt(measuredViewport?.height) || fallbackHeight || 1,\n };\n};\n", "/**\n * \u722C\u866B\u81EA\u5B9A\u4E49\u9519\u8BEF\u7C7B\n * \u7528\u4E8E\u643A\u5E26\u4E0A\u4E0B\u6587\u4FE1\u606F\uFF0C\u5728 pushFailed \u65F6\u81EA\u52A8\u89E3\u6790\n */\n\nimport { serializeError } from \"serialize-error\";\nimport { Code } from \"./constants\";\n\n/**\n * CrawlerError - \u81EA\u5B9A\u4E49\u722C\u866B\u9519\u8BEF\u7C7B\n * \n * @example\n * // \u7B80\u5355\u7528\u6CD5 (\u53EA\u6709 message)\n * throw new CrawlerError('\u672A\u6355\u83B7 Feed \u63A5\u53E3\u54CD\u5E94');\n * \n * @example\n * // \u5B8C\u6574\u7528\u6CD5 (\u5E26 code \u548C context)\n * throw new CrawlerError({\n * message: '\u767B\u5F55\u5931\u8D25',\n * code: ErrorKeygen.NotLogin,\n * context: { url: currentUrl, userId: '123' }\n * });\n */\nexport class CrawlerError extends Error {\n /**\n * @param {string|Object} info - \u9519\u8BEF\u4FE1\u606F\u5B57\u7B26\u4E32\u6216\u914D\u7F6E\u5BF9\u8C61\n * @param {string} info.message - \u9519\u8BEF\u4FE1\u606F\n * @param {number} [info.code] - ErrorKeygen \u679A\u4E3E\u503C\uFF08\u7528\u4E8E\u9519\u8BEF\u5206\u7C7B\uFF09\n * @param {Object} [info.context] - \u4E0A\u4E0B\u6587\u4FE1\u606F\u5BF9\u8C61\n */\n constructor(info) {\n // \u517C\u5BB9 string\n if (typeof info === 'string') {\n info = { message: info };\n }\n\n // \u26A0\uFE0F super() \u5FC5\u987B\u5728\u8BBF\u95EE this \u4E4B\u524D\u8C03\u7528\n super(info.message);\n\n this.name = 'CrawlerError';\n this.code = info.code ?? Code.UnknownError;\n this.context = info.context ?? {};\n this.timestamp = new Date().toISOString();\n\n // \u7EF4\u62A4\u6B63\u786E\u7684\u5806\u6808\u8DDF\u8E2A\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, CrawlerError);\n }\n }\n\n /**\n * \u8F6C\u6362\u4E3A\u53EF\u63A8\u9001\u7684\u6570\u636E\u5BF9\u8C61\n * @returns {Object}\n */\n toJSON() {\n return serializeError(this)\n }\n\n /**\n * \u68C0\u67E5\u4E00\u4E2A error \u662F\u5426\u662F CrawlerError\n * @param {Error} error\n * @returns {boolean}\n */\n static isCrawlerError(error) {\n return error instanceof CrawlerError || error?.name === 'CrawlerError';\n }\n\n /**\n * \u4ECE\u666E\u901A Error \u521B\u5EFA CrawlerError\n * @param {Error} error - \u539F\u59CB\u9519\u8BEF\n * @param {Object} [options={}] - \u9009\u9879\u5BF9\u8C61 (\u5305\u542B code \u548C context)\n * @returns {CrawlerError}\n */\n static from(error, options = {}) {\n const crawlerError = new CrawlerError({\n message: error.message,\n ...options\n });\n crawlerError.stack = error.stack;\n return crawlerError;\n }\n}\n\n\n", "import { Status, Code } from './constants';\nimport { createInternalLogger } from './internals/logger';\nimport { capturePageScreenshot } from './internals/screenshot';\nimport { CrawlerError } from './errors';\nimport { serializeError } from 'serialize-error';\nimport { ProxyMeterRuntime } from './internals/proxy-meter-runtime';\nimport { RuntimeEnv } from './runtime-env';\n\nconst logger = createInternalLogger('ApifyKit');\n\nconst resolveRuntimeContext = (input) => {\n const rememberedState = RuntimeEnv.peekRememberedState();\n const state = rememberedState || RuntimeEnv.parseInput(input || {});\n const envPatch = RuntimeEnv.buildEnvPatch(state) || null;\n\n return {\n actor: state.actor,\n runtime: state.runtime,\n envPatch,\n };\n};\n\nconst isPageLike = (value) => {\n if (!value || typeof value !== 'object') return false;\n return typeof value.evaluate === 'function' && typeof value.context === 'function';\n};\n\nconst pickPage = (...candidates) => {\n for (const candidate of candidates) {\n if (isPageLike(candidate)) {\n return candidate;\n }\n }\n return null;\n};\n\nconst toSerializable = (value, depth = 0, seen = new WeakSet()) => {\n if (depth > 6) return '[MaxDepth]';\n if (value == null) return value;\n\n const valueType = typeof value;\n if (valueType === 'string' || valueType === 'number' || valueType === 'boolean') {\n return value;\n }\n if (valueType === 'bigint') {\n return value.toString();\n }\n if (valueType === 'function' || valueType === 'symbol') {\n return undefined;\n }\n if (value instanceof Error) {\n return serializeError(value);\n }\n if (Array.isArray(value)) {\n return value\n .map((item) => toSerializable(item, depth + 1, seen))\n .filter((item) => item !== undefined);\n }\n if (valueType !== 'object') {\n return String(value);\n }\n\n if (seen.has(value)) {\n return '[Circular]';\n }\n seen.add(value);\n\n const ctorName = String(value?.constructor?.name || '');\n if (\n ctorName === 'Page' ||\n ctorName === 'BrowserContext' ||\n ctorName === 'Browser' ||\n ctorName === 'Frame' ||\n ctorName === 'ElementHandle' ||\n ctorName === 'JSHandle'\n ) {\n return `[${ctorName}]`;\n }\n\n const output = {};\n Object.entries(value).forEach(([key, item]) => {\n const safeValue = toSerializable(item, depth + 1, seen);\n if (safeValue !== undefined) {\n output[key] = safeValue;\n }\n });\n return output;\n};\n\nconst sanitizeMeta = (meta) => {\n if (!meta || typeof meta !== 'object' || Array.isArray(meta)) {\n return {};\n }\n const result = toSerializable(meta) || {};\n if (result && typeof result === 'object' && !Array.isArray(result)) {\n delete result.page;\n }\n return result;\n};\n\nconst captureAutoEnvPatch = async (page, runtimeContext) => {\n const currentPage = pickPage(page);\n if (!currentPage) return null;\n try {\n return await RuntimeEnv.captureEnvPatch(\n currentPage,\n {\n actor: runtimeContext.actor,\n runtime: runtimeContext.runtime,\n },\n { actor: runtimeContext.actor },\n );\n } catch (error) {\n logger.warn(`\u81EA\u52A8\u91C7\u96C6 env_patch \u5931\u8D25: ${error?.message || error}`);\n return null;\n }\n};\n\n/**\n * \u521B\u5EFA ApifyKit \u5B9E\u4F8B\n * \u5982\u679C apify \u53EF\u7528\uFF0C\u8FD4\u56DE\u5B8C\u6574\u529F\u80FD\u7684 ApifyKit\n * \u5982\u679C apify \u4E0D\u53EF\u7528\uFF0C\u8FD4\u56DE\u964D\u7EA7\u7248\u672C\uFF08\u975E apify \u76F8\u5173\u529F\u80FD\u4ECD\u53EF\u7528\uFF09\n */\nasync function createApifyKit() {\n let apify = null;\n\n // \u5C1D\u8BD5\u52A0\u8F7D apify\n try {\n apify = await import('apify');\n } catch (error) {\n // apify \u4E0D\u53EF\u7528\uFF0C\u5C06\u4F7F\u7528\u964D\u7EA7\u7248\u672C\n throw new Error('\u26A0\uFE0F apify \u5E93\u672A\u5B89\u88C5\uFF0CApifyKit \u7684 Actor \u76F8\u5173\u529F\u80FD\u4E0D\u53EF\u7528')\n }\n\n const { Actor } = apify;\n const actorInput = (await Actor.getInput()) || {};\n let lastPage = null;\n const getRuntimeContext = () => resolveRuntimeContext(actorInput);\n\n return {\n /**\n * \u6838\u5FC3\u5C01\u88C5\uFF1A\u6267\u884C\u6B65\u9AA4\uFF0C\u5E26\u81EA\u52A8\u65E5\u5FD7\u786E\u8BA4\u3001\u5931\u8D25\u622A\u56FE\u5904\u7406\u548C\u91CD\u8BD5\u673A\u5236\n * \n * @param {string} step - \u6B65\u9AA4\u540D\u79F0\n * @param {import('playwright').Page} page - Playwright page \u5BF9\u8C61\n * @param {Function} actionFn - \u6267\u884C\u7684\u5F02\u6B65\u64CD\u4F5C\n * @param {Object} [options] - \u914D\u7F6E\u9009\u9879\n * @param {boolean} [options.failActor=true] - \u5931\u8D25\u65F6\u662F\u5426\u8C03\u7528 Actor.fail\n * @param {Object} [options.retry] - \u91CD\u8BD5\u914D\u7F6E\n * @param {number} [options.retry.times=0] - \u91CD\u8BD5\u6B21\u6570\n * @param {'direct'|'refresh'} [options.retry.mode='direct'] - \u91CD\u8BD5\u6A21\u5F0F\n * @param {Function} [options.retry.before] - \u91CD\u8BD5\u524D\u94A9\u5B50\uFF0C\u53EF\u8986\u76D6\u9ED8\u8BA4\u7B49\u5F85\u884C\u4E3A\n */\n async runStep(step, page, actionFn, options = {}) {\n if (isPageLike(page)) {\n lastPage = page;\n }\n const { failActor = true, retry = {} } = options;\n const { times: retryTimes = 0, mode: retryMode = 'direct', before: beforeRetry } = retry;\n\n // \u5185\u90E8\u6267\u884C\u51FD\u6570\n const executeAction = async (attemptNumber) => {\n const attemptLabel = attemptNumber > 0 ? ` (\u91CD\u8BD5 #${attemptNumber})` : '';\n logger.start(`[Step] ${step}${attemptLabel}`);\n\n try {\n const result = await actionFn();\n logger.success(`[Step] ${step}${attemptLabel}`);\n return { success: true, result };\n } catch (error) {\n logger.fail(`[Step] ${step}${attemptLabel}`, error);\n return { success: false, error };\n }\n };\n\n // \u91CD\u8BD5\u524D\u7684\u51C6\u5907\u64CD\u4F5C\n const prepareForRetry = async (attemptNumber) => {\n if (typeof beforeRetry === 'function') {\n // \u4F7F\u7528\u81EA\u5B9A\u4E49\u94A9\u5B50\n logger.start(`[RetryStep] \u6267\u884C\u81EA\u5B9A\u4E49 before \u94A9\u5B50 (\u7B2C ${attemptNumber} \u6B21\u91CD\u8BD5)`);\n await beforeRetry(page, attemptNumber);\n logger.success(`[RetryStep] before \u94A9\u5B50\u5B8C\u6210`);\n } else if (retryMode === 'refresh') {\n // \u5237\u65B0\u6A21\u5F0F\uFF1A\u5237\u65B0\u9875\u9762\u5E76\u7B49\u5F85\u5BFC\u822A commit\uFF0C\u540E\u7EED\u6B65\u9AA4\u81EA\u884C\u505A\u4EA4\u4E92\u5C31\u7EEA\u68C0\u67E5\n logger.start(`[RetryStep] \u5237\u65B0\u9875\u9762 (\u7B2C ${attemptNumber} \u6B21\u91CD\u8BD5)`);\n await page.reload({ waitUntil: 'commit' });\n logger.success(`[RetryStep] \u9875\u9762\u5237\u65B0\u5B8C\u6210`);\n } else {\n // direct \u6A21\u5F0F\uFF1A\u9ED8\u8BA4\u7B49\u5F85 3 \u79D2\n logger.start(`[RetryStep] \u7B49\u5F85 3 \u79D2 (\u7B2C ${attemptNumber} \u6B21\u91CD\u8BD5)`);\n await new Promise(resolve => setTimeout(resolve, 3000));\n logger.success(`[RetryStep] \u7B49\u5F85\u5B8C\u6210`);\n }\n };\n\n // \u9996\u6B21\u6267\u884C\n let lastResult = await executeAction(0);\n\n // \u5982\u679C\u9996\u6B21\u6210\u529F\uFF0C\u76F4\u63A5\u8FD4\u56DE\n if (lastResult.success) {\n return lastResult.result;\n }\n\n // \u91CD\u8BD5\u903B\u8F91\n for (let attempt = 1; attempt <= retryTimes; attempt++) {\n logger.start(`[RetryStep] \u51C6\u5907\u7B2C ${attempt}/${retryTimes} \u6B21\u91CD\u8BD5: ${step}`);\n\n try {\n await prepareForRetry(attempt);\n } catch (prepareError) {\n logger.warn(`[RetryStep] \u91CD\u8BD5\u51C6\u5907\u5931\u8D25: ${prepareError.message}`);\n // \u51C6\u5907\u5931\u8D25\uFF0C\u7EE7\u7EED\u5C1D\u8BD5\u4E0B\u4E00\u6B21\u91CD\u8BD5\n continue;\n }\n\n lastResult = await executeAction(attempt);\n if (lastResult.success) {\n return lastResult.result;\n }\n }\n\n // \u6240\u6709\u91CD\u8BD5\u90FD\u5931\u8D25\uFF0C\u5904\u7406\u6700\u7EC8\u9519\u8BEF\n const finalError = lastResult.error;\n if (failActor) {\n let base64 = '\u622A\u56FE\u5931\u8D25';\n try {\n if (page) {\n const buffer = await capturePageScreenshot(page, {\n fullPage: true,\n type: 'jpeg',\n quality: 60,\n });\n base64 = `data:image/jpeg;base64,${buffer.toString('base64')}`;\n }\n } catch (snapErr) {\n logger.warn(`\u622A\u56FE\u751F\u6210\u5931\u8D25: ${snapErr.message}`);\n }\n\n await this.pushFailed(\n finalError,\n {\n step,\n base64,\n retryAttempts: retryTimes,\n },\n {\n page,\n options,\n },\n );\n await Actor.fail(`Run Step ${step} \u5931\u8D25 (\u5DF2\u91CD\u8BD5 ${retryTimes} \u6B21): ${finalError.message} | url: ${page.url()}`);\n } else {\n throw finalError;\n }\n },\n\n /**\n * \u5BBD\u677E\u7248runStep\uFF1A\u5931\u8D25\u65F6\u4E0D\u8C03\u7528Actor.fail\uFF0C\u53EA\u629B\u51FA\u5F02\u5E38\n * \u652F\u6301\u900F\u4F20 retry \u7B49\u9009\u9879\uFF08failActor \u59CB\u7EC8\u56FA\u5B9A\u4E3A false\uFF09\n *\n * @param {string} step - \u6B65\u9AA4\u540D\u79F0\n * @param {import('playwright').Page} page - Playwright page \u5BF9\u8C61\n * @param {Function} fn - \u6267\u884C\u7684\u5F02\u6B65\u64CD\u4F5C\n * @param {Object} [options] - \u914D\u7F6E\u9009\u9879\uFF08\u652F\u6301 retry\uFF09\n */\n async runStepLoose(step, page, fn, options = {}) {\n return await this.runStep(step, page, fn, {\n ...options,\n failActor: false,\n });\n },\n\n /**\n * \u63A8\u9001\u6210\u529F\u6570\u636E\u7684\u901A\u7528\u65B9\u6CD5\u3002\n * \u8FD9\u91CC\u4F1A\u81EA\u52A8\u505A\u4E09\u4EF6\u4E8B\uFF1A\n * 1. \u91C7\u96C6\u5F53\u524D\u9875\u9762\u7684 env_patch\uFF1B\n * 2. \u5408\u5E76\u663E\u5F0F\u4F20\u5165\u7684 env_patch\uFF1B\n * 3. \u4E00\u5E76\u5199\u5165 dataset\uFF0C\u4F9B\u540E\u7AEF\u56DE\u5199 runtime_env_json\u3002\n * @param {Object} data - \u8981\u63A8\u9001\u7684\u6570\u636E\u5BF9\u8C61\n */\n async pushSuccess(data, options = {}) {\n const runtimeContext = getRuntimeContext();\n const page = pickPage(options?.page, data?.page, lastPage);\n if (page) {\n lastPage = page;\n }\n\n let payloadData = data;\n let explicitPatch = null;\n if (data && typeof data === 'object' && !Array.isArray(data)) {\n payloadData = { ...data };\n explicitPatch = payloadData.env_patch;\n delete payloadData.env_patch;\n delete payloadData.page;\n }\n\n const capturedPatch = await captureAutoEnvPatch(page, runtimeContext);\n const envPatch = RuntimeEnv.mergeEnvPatches(runtimeContext.envPatch, capturedPatch, explicitPatch);\n const traffic = await ProxyMeterRuntime.getProxyMeterSnapshot({ finalize: true });\n const payload = {\n code: Code.Success,\n status: Status.Success,\n ...(traffic ? { traffic } : {}),\n timestamp: new Date().toISOString(),\n data: payloadData,\n };\n if (envPatch) {\n payload.env_patch = envPatch;\n }\n await Actor.pushData({\n ...payload,\n });\n logger.success('pushSuccess', 'Data pushed');\n },\n\n /**\n * \u63A8\u9001\u5931\u8D25\u6570\u636E\u7684\u901A\u7528\u65B9\u6CD5\uFF08\u79C1\u6709\u65B9\u6CD5\uFF0C\u4EC5\u4F9B runStep \u5185\u90E8\u4F7F\u7528\uFF09\u3002\n * \u5373\u4FBF\u4EFB\u52A1\u5931\u8D25\uFF0C\u8FD9\u91CC\u4E5F\u4F1A\u81EA\u52A8\u56DE\u6536 env_patch\uFF0C\u786E\u4FDD cookies/storage \u7684\u6700\u65B0\u72B6\u6001\u4E0D\u4F1A\u4E22\u3002\n * @param {Error|CrawlerError} error - \u9519\u8BEF\u5BF9\u8C61\n * @param {Object} [meta] - \u989D\u5916\u7684\u6570\u636E\uFF08\u5982 failedStep\u3001screenshotBase64 \u7B49\uFF09\n * @param {Object} [options] - \u9644\u52A0\u9009\u9879\uFF08\u5982 page\uFF09\n * @private\n */\n async pushFailed(error, meta = {}, options = {}) {\n const runtimeContext = getRuntimeContext();\n const page = pickPage(options?.page, meta?.page, lastPage);\n if (page) {\n lastPage = page;\n }\n const capturedPatch = await captureAutoEnvPatch(page, runtimeContext);\n const explicitPatch = meta?.env_patch;\n const envPatch = RuntimeEnv.mergeEnvPatches(runtimeContext.envPatch, capturedPatch, explicitPatch);\n const safeMeta = sanitizeMeta(meta);\n delete safeMeta.env_patch;\n\n // \u5982\u679C\u662F CrawlerError\uFF0C\u63D0\u53D6\u5176 key \u548C context\n const isCrawlerError = CrawlerError.isCrawlerError(error);\n const code = isCrawlerError ? error.code : Code.UnknownError;\n const context = isCrawlerError ? error.context : {};\n const traffic = await ProxyMeterRuntime.getProxyMeterSnapshot({ finalize: true });\n const payload = {\n // \u5982\u679C\u662F CrawlerError\uFF0C\u4F7F\u7528\u5176 code\uFF0C\u5426\u5219\u4F7F\u7528\u9ED8\u8BA4 Failed code\n code,\n status: Status.Failed,\n ...(traffic ? { traffic } : {}),\n error: serializeError(error),\n meta: safeMeta,\n context,\n timestamp: new Date().toISOString(),\n };\n if (envPatch) {\n payload.env_patch = envPatch;\n }\n\n await Actor.pushData({\n ...payload,\n });\n logger.success('pushFailed', 'Error data pushed');\n }\n };\n}\n\n// \u61D2\u52A0\u8F7D\u5355\u4F8B\nlet instance = null;\n\n/**\n * \u83B7\u53D6 ApifyKit \u5B9E\u4F8B\uFF08\u61D2\u52A0\u8F7D\uFF09\n * @returns {Promise<Object>} ApifyKit \u5B9E\u4F8B\n */\nasync function useApifyKit() {\n if (!instance) {\n instance = await createApifyKit();\n }\n return instance;\n}\n\n// \u4E5F\u5BFC\u51FA\u521D\u59CB\u5316\u51FD\u6570\uFF0C\u4F9B\u9700\u8981\u7684\u7528\u6237\u4F7F\u7528\nexport const ApifyKit = {\n useApifyKit\n};\n", "import { spawn, spawnSync } from 'child_process';\nimport { existsSync, mkdirSync, readFileSync, rmSync } from 'fs';\nimport { tmpdir } from 'os';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport { createInternalLogger } from './logger.js';\n\nconst logger = createInternalLogger('ProxyMeter');\n\nconst MAX_TOP_DOMAINS = 20;\nconst FLUSH_INTERVAL_MS = 2000;\nconst DEFAULT_DEBUG_MAX_EVENTS = 400;\n\nlet runtime = null;\nlet cleanupInstalled = false;\nlet observedDomainResourceTypes = new Map();\n\nconst toSafeInt = (value) => {\n const num = Number(value);\n if (!Number.isFinite(num) || num <= 0) return 0;\n return Math.round(num);\n};\n\nconst toSafeFloat = (value) => {\n const num = Number(value);\n if (!Number.isFinite(num)) return 0;\n return num;\n};\n\nconst normalizeResourceType = (value) => {\n const type = String(value || '').trim().toLowerCase();\n if (!type) return 'other';\n return type;\n};\n\nconst resolveHostname = (requestUrl) => {\n const raw = String(requestUrl || '').trim();\n if (!raw) return '';\n try {\n return String(new URL(raw).hostname || '').trim().toLowerCase();\n } catch {\n return '';\n }\n};\n\nconst recordDomainResourceType = (domain, resourceType) => {\n const host = String(domain || '').trim().toLowerCase();\n if (!host) return;\n const type = normalizeResourceType(resourceType);\n let byType = observedDomainResourceTypes.get(host);\n if (!byType) {\n byType = new Map();\n observedDomainResourceTypes.set(host, byType);\n }\n byType.set(type, (byType.get(type) || 0) + 1);\n};\n\nconst resolveResourceTypeMeta = (domain) => {\n const host = String(domain || '').trim().toLowerCase();\n if (!host) return { resourceType: '', resourceTypeCounts: undefined };\n const byType = observedDomainResourceTypes.get(host);\n if (!byType || byType.size === 0) {\n return { resourceType: '', resourceTypeCounts: undefined };\n }\n const entries = Array.from(byType.entries())\n .filter(([type, count]) => type && Number(count) > 0)\n .sort((a, b) => {\n if (Number(b[1]) !== Number(a[1])) return Number(b[1]) - Number(a[1]);\n return String(a[0]).localeCompare(String(b[0]));\n });\n if (entries.length === 0) {\n return { resourceType: '', resourceTypeCounts: undefined };\n }\n return {\n resourceType: entries[0][0],\n resourceTypeCounts: Object.fromEntries(entries.map(([type, count]) => [type, toSafeInt(count)])),\n };\n};\n\nconst resolveScriptPath = () => {\n const baseDir = typeof __dirname !== 'undefined'\n ? __dirname\n : path.dirname(fileURLToPath(import.meta.url));\n const internalCandidate = path.join(baseDir, 'internals', 'proxy-meter.js');\n if (existsSync(internalCandidate)) {\n return internalCandidate;\n }\n return path.join(baseDir, 'proxy-meter.js');\n};\n\nconst pickFreePort = () => {\n const script = [\n 'const net=require(\"net\");',\n 'const server=net.createServer();',\n 'server.listen(0,\"127.0.0.1\",()=>{',\n 'const port=server.address().port;',\n 'server.close(()=>{console.log(port);});',\n '});',\n ].join('');\n const result = spawnSync(process.execPath, ['-e', script], { encoding: 'utf8' });\n const port = Number(String(result.stdout || '').trim());\n if (result.status === 0 && Number.isFinite(port) && port > 0) {\n return port;\n }\n return 20000 + Math.floor(Math.random() * 20000);\n};\n\nconst resolveLogDir = () => {\n const storageDir = process.env.APIFY_STORAGE_DIR || process.env.APIFY_LOCAL_STORAGE_DIR || '';\n if (storageDir) {\n return path.join(storageDir, 'proxy-meter');\n }\n return path.join(tmpdir(), 'proxy-meter');\n};\n\nconst ensureLogPath = () => {\n const baseDir = resolveLogDir();\n if (!existsSync(baseDir)) {\n try {\n mkdirSync(baseDir, { recursive: true });\n } catch {}\n }\n const runId = String(process.env.APIFY_ACTOR_RUN_ID || '').trim();\n const suffix = `${Date.now()}-${Math.floor(Math.random() * 1000000)}`;\n const label = runId ? `proxy-meter-${runId}-${suffix}.json` : `proxy-meter-${process.pid}-${suffix}.json`;\n return path.join(baseDir, label);\n};\n\nconst readSnapshot = (logPath) => {\n if (!logPath || !existsSync(logPath)) return null;\n try {\n const raw = readFileSync(logPath, 'utf8');\n if (!raw) return null;\n return JSON.parse(raw);\n } catch {\n return null;\n }\n};\n\nconst normalizeDomainRows = (hosts) => {\n const rows = [];\n let requestCount = 0;\n let connectCount = 0;\n\n for (const [domain, stat] of Object.entries(hosts || {})) {\n if (!stat || typeof stat !== 'object') continue;\n const inBytes = toSafeInt(stat.inBytes);\n const outBytes = toSafeInt(stat.outBytes);\n const requests = toSafeInt(stat.requests);\n const connections = toSafeInt(stat.connections);\n const totalBytes = inBytes + outBytes;\n requestCount += requests;\n connectCount += connections;\n if (totalBytes <= 0 && requests <= 0 && connections <= 0) continue;\n const resourceTypeMeta = resolveResourceTypeMeta(domain);\n rows.push({\n domain,\n inBytes,\n outBytes,\n totalBytes,\n requests,\n connections,\n resourceType: resourceTypeMeta.resourceType || undefined,\n resourceTypeCounts: resourceTypeMeta.resourceTypeCounts || undefined,\n });\n }\n\n rows.sort((a, b) => {\n if (b.totalBytes !== a.totalBytes) return b.totalBytes - a.totalBytes;\n if (b.requests !== a.requests) return b.requests - a.requests;\n return String(a.domain).localeCompare(String(b.domain));\n });\n\n return {\n topDomains: rows.slice(0, MAX_TOP_DOMAINS),\n requestCount,\n connectCount,\n };\n};\n\nconst normalizeDebugRows = (rows, type) => {\n if (!Array.isArray(rows) || rows.length === 0) return undefined;\n const normalized = rows\n .map((row) => {\n if (!row || typeof row !== 'object') return null;\n return {\n domain: String(row.domain || '').trim(),\n status: String(row.status || '').trim(),\n count: toSafeInt(row.count),\n failedCount: toSafeInt(row.failedCount),\n inBytes: toSafeInt(row.inBytes),\n outBytes: toSafeInt(row.outBytes),\n totalBytes: toSafeInt(row.totalBytes),\n avgDurationMs: toSafeFloat(row.avgDurationMs),\n reconnectCount: toSafeInt(row.reconnectCount),\n largeResponseCount: toSafeInt(row.largeResponseCount),\n failureRatePct: toSafeFloat(row.failureRatePct),\n type,\n };\n })\n .filter((row) => row && row.domain && row.count > 0);\n return normalized.length > 0 ? normalized : undefined;\n};\n\nconst normalizeDebugEvent = (row) => {\n if (!row || typeof row !== 'object') return null;\n const host = String(row.host || '').trim();\n if (!host) return null;\n return {\n ts: String(row.ts || ''),\n runId: String(row.runId || ''),\n channel: String(row.channel || ''),\n host,\n method: String(row.method || ''),\n path: String(row.path || ''),\n statusCode: toSafeInt(row.statusCode),\n durationMs: toSafeInt(row.durationMs),\n inBytes: toSafeInt(row.inBytes),\n outBytes: toSafeInt(row.outBytes),\n totalBytes: toSafeInt(row.totalBytes),\n error: String(row.error || ''),\n };\n};\n\nconst normalizeDebugSummary = (debug) => {\n if (!debug || typeof debug !== 'object' || !debug.summary || typeof debug.summary !== 'object') {\n return null;\n }\n const summary = debug.summary;\n const domainStatus = normalizeDebugRows(summary.domainStatus, 'domain_status');\n const topFailureDomains = normalizeDebugRows(summary.topFailureDomains, 'top_failure');\n const topLargeDomains = normalizeDebugRows(summary.topLargeDomains, 'top_large');\n const topReconnectDomains = normalizeDebugRows(summary.topReconnectDomains, 'top_reconnect');\n\n return {\n enabled: Boolean(debug.enabled),\n sampledEvents: toSafeInt(debug.sampledEvents),\n droppedEvents: toSafeInt(debug.droppedEvents),\n totalEvents: toSafeInt(debug.totalEvents),\n largeResponseThresholdBytes: toSafeInt(summary.largeResponseThresholdBytes),\n requestCount: toSafeInt(summary.requestCount),\n failedCount: toSafeInt(summary.failedCount),\n failureRatePct: toSafeFloat(summary.failureRatePct),\n largeResponseCount: toSafeInt(summary.largeResponseCount),\n reconnectCount: toSafeInt(summary.reconnectCount),\n domainStatus,\n topFailureDomains,\n topLargeDomains,\n topReconnectDomains,\n };\n};\n\nconst normalizeSnapshot = (raw) => {\n if (!raw || typeof raw !== 'object') return null;\n const totalIn = toSafeInt(raw.totalInBytes);\n const totalOut = toSafeInt(raw.totalOutBytes);\n const domains = normalizeDomainRows(raw.hosts && typeof raw.hosts === 'object' ? raw.hosts : {});\n\n const normalized = {\n meter: 'proxy-meter-v1',\n totalBytes: totalIn + totalOut,\n uploadBytes: totalOut,\n downloadBytes: totalIn,\n requestCount: domains.requestCount,\n connectCount: domains.connectCount,\n topDomains: domains.topDomains,\n };\n\n const debug = raw.debug && typeof raw.debug === 'object' ? raw.debug : null;\n const summary = normalizeDebugSummary(debug);\n const events = Array.isArray(debug?.events)\n ? debug.events.map(normalizeDebugEvent).filter(Boolean)\n : [];\n if (summary) {\n normalized.trafficDebugSummary = summary;\n }\n if (events.length > 0) {\n normalized.trafficDebugEvents = events;\n }\n\n const hasSignal = normalized.totalBytes > 0\n || normalized.uploadBytes > 0\n || normalized.downloadBytes > 0\n || normalized.requestCount > 0\n || normalized.connectCount > 0\n || (normalized.topDomains && normalized.topDomains.length > 0)\n || Boolean(summary)\n || events.length > 0;\n\n if (!hasSignal) return null;\n return normalized;\n};\n\nconst registerCleanup = () => {\n if (cleanupInstalled) return;\n cleanupInstalled = true;\n const shutdown = () => {\n if (!runtime || !runtime.proc) return;\n try { runtime.proc.kill('SIGTERM'); } catch {}\n };\n process.once('exit', shutdown);\n process.once('SIGINT', shutdown);\n process.once('SIGTERM', shutdown);\n};\n\nconst startProxyMeter = (options = {}) => {\n const upstreamUrl = String(options.proxyUrl || '').trim();\n if (!upstreamUrl) return null;\n\n if (runtime && runtime.proc) {\n try { runtime.proc.kill('SIGTERM'); } catch {}\n runtime = null;\n }\n observedDomainResourceTypes = new Map();\n\n const port = pickFreePort();\n const logPath = ensureLogPath();\n const scriptPath = resolveScriptPath();\n const debugMode = Boolean(options.debugMode);\n const debugMaxEvents = Math.max(10, toSafeInt(options.debugMaxEvents) || DEFAULT_DEBUG_MAX_EVENTS);\n const env = {\n ...process.env,\n PROXY_METER_PORT: String(port),\n PROXY_METER_LOG: logPath,\n PROXY_METER_UPSTREAM: upstreamUrl,\n PROXY_METER_FLUSH_MS: String(FLUSH_INTERVAL_MS),\n PROXY_METER_DEBUG: debugMode ? '1' : '0',\n PROXY_METER_DEBUG_MAX_EVENTS: String(debugMaxEvents),\n };\n\n const child = spawn(process.execPath, [scriptPath], {\n env,\n stdio: ['ignore', 'ignore', 'ignore'],\n });\n\n child.once('exit', (code) => {\n if (code && code !== 0) {\n logger.warn(`[proxy-meter] exited with code ${code}`);\n }\n });\n\n runtime = {\n proc: child,\n port,\n logPath,\n startedAt: Date.now(),\n };\n\n registerCleanup();\n return { server: `http://127.0.0.1:${port}` };\n};\n\nconst recordProxyMeterResourceType = (requestUrl, resourceType) => {\n if (!runtime) return;\n const host = resolveHostname(requestUrl);\n if (!host) return;\n recordDomainResourceType(host, resourceType);\n};\n\nconst stopProxyMeter = async () => {\n if (!runtime) return null;\n const { proc, logPath } = runtime;\n if (!proc || proc.killed) {\n runtime = null;\n return logPath || null;\n }\n\n await new Promise((resolve) => {\n const timeout = setTimeout(() => {\n try { proc.kill('SIGKILL'); } catch {}\n resolve();\n }, 2000);\n proc.once('exit', () => {\n clearTimeout(timeout);\n resolve();\n });\n try { proc.kill('SIGTERM'); } catch { resolve(); }\n });\n\n runtime = null;\n return logPath || null;\n};\n\nconst getProxyMeterSnapshot = async (options = {}) => {\n if (!runtime) return null;\n const finalize = Boolean(options.finalize);\n const logPath = finalize ? await stopProxyMeter() : runtime.logPath;\n const raw = readSnapshot(logPath);\n const snapshot = normalizeSnapshot(raw);\n if (finalize && logPath) {\n try { rmSync(logPath, { force: true }); } catch {}\n }\n return snapshot;\n};\n\nexport const ProxyMeterRuntime = {\n startProxyMeter,\n recordProxyMeterResourceType,\n stopProxyMeter,\n getProxyMeterSnapshot,\n};\n", "import { PageRuntimeStateKey } from './internals/constants.js';\nimport { ActorInfo, Device, normalizeDevice } from './constants.js';\n\nconst BROWSER_PROFILE_SCHEMA_VERSION = 1;\n\nlet rememberedRuntimeState = null;\n\nconst isPlainObject = (value) => value && typeof value === 'object' && !Array.isArray(value);\n\nconst normalizeKnownDevice = (value) => {\n const raw = String(value || '').trim().toLowerCase();\n if (raw === Device.Mobile) return Device.Mobile;\n if (raw === Device.Desktop) return Device.Desktop;\n return '';\n};\n\n// \u8FD0\u884C\u6001\u5FEB\u7167\u5728 visitor / toolkit / \u540E\u7AEF\u4E4B\u95F4\u6765\u56DE\u4F20\u9012\uFF0C\n// \u6240\u4EE5\u6240\u6709\u5165\u53E3\u90FD\u5148\u8D70 deepClone\uFF0C\u907F\u514D\u5171\u4EAB\u5F15\u7528\u5F15\u53D1\u201C\u8FB9\u8DD1\u8FB9\u6539\u201D\u7684\u9690\u5F0F\u526F\u4F5C\u7528\u3002\nconst deepClone = (value) => {\n if (value == null) return value;\n try {\n return JSON.parse(JSON.stringify(value));\n } catch {\n return value;\n\t}\n};\n\n// \u5C1D\u8BD5\u628A runtime / browser_profile \u4E4B\u7C7B\u7684 JSON \u5B57\u6BB5\u89E3\u6790\u6210\u5BF9\u8C61\u3002\nconst tryParseJSON = (value) => {\n if (value == null) return null;\n if (typeof value === 'object') return value;\n const raw = String(value || '').trim();\n if (!raw) return null;\n try {\n return JSON.parse(raw);\n } catch {\n return null;\n\t}\n};\n\n// local/session \u7684\u89C4\u8303\u5316\u76EE\u6807\u53EA\u6709\u4E00\u4E2A\uFF1A\u8FC7\u6EE4\u7A7A\u503C\uFF0C\u7EDF\u4E00\u8F6C\u6210\u5B57\u7B26\u4E32\u3002\nconst normalizeLocalStorage = (value) => {\n const source = value && typeof value === 'object' && !Array.isArray(value) ? value : {};\n return Object.entries(source).reduce((acc, [key, item]) => {\n const safeKey = String(key || '').trim();\n const safeValue = String(item ?? '').trim();\n if (!safeKey || !safeValue || safeValue === '<nil>') return acc;\n acc[safeKey] = safeValue;\n return acc;\n }, {});\n};\n\nconst normalizeSessionStorage = (value) => {\n const source = value && typeof value === 'object' && !Array.isArray(value) ? value : {};\n return Object.entries(source).reduce((acc, [key, item]) => {\n const safeKey = String(key || '').trim();\n const safeValue = String(item ?? '').trim();\n if (!safeKey || !safeValue || safeValue === '<nil>') return acc;\n acc[safeKey] = safeValue;\n return acc;\n }, {});\n};\n\nconst normalizeCookieSameSite = (value) => {\n const raw = String(value || '').trim().toLowerCase();\n if (!raw) return '';\n\n switch (raw) {\n case 'strict':\n return 'Strict';\n case 'lax':\n return 'Lax';\n case 'none':\n case 'no_restriction':\n return 'None';\n case 'unspecified':\n default:\n return '';\n }\n};\n\nconst normalizeCookieExpires = (raw = {}) => {\n const source = raw && typeof raw === 'object' ? raw : {};\n const session = Boolean(source.session);\n if (session) return null;\n\n const expiresCandidate = Number(source.expires);\n if (Number.isFinite(expiresCandidate) && expiresCandidate > 0) {\n return expiresCandidate;\n }\n\n const expirationDateCandidate = Number(source.expirationDate);\n if (Number.isFinite(expirationDateCandidate) && expirationDateCandidate > 0) {\n return expirationDateCandidate;\n }\n\n return null;\n};\n\nconst normalizeCookies = (value) => {\n if (!Array.isArray(value)) return [];\n return value\n .map((item) => {\n const raw = item && typeof item === 'object' ? item : {};\n const name = String(raw.name || '').trim();\n const cookieValue = String(raw.value ?? '').trim();\n if (!name || !cookieValue || cookieValue === '<nil>') return null;\n const domain = String(raw.domain || '').trim();\n const url = normalizeHttpUrl(raw.url);\n const path = String(raw.path || '').trim() || '/';\n const sameSite = normalizeCookieSameSite(raw.sameSite);\n const expires = normalizeCookieExpires(raw);\n const secure = Boolean(raw.secure);\n const httpOnly = Boolean(raw.httpOnly);\n const partitionKey = typeof raw.partitionKey === 'string' ? String(raw.partitionKey).trim() : '';\n\n // \u7EDF\u4E00\u8F93\u51FA Playwright \u53EF\u63A5\u53D7\u7684 Cookie \u7ED3\u6784\uFF0C\u907F\u514D\u628A Chrome \u6269\u5C55\u4FA7\u5B57\u6BB5\u539F\u6837\u900F\u4F20\u8FC7\u53BB\u3002\n const normalized = {\n name,\n value: cookieValue,\n path,\n ...(domain ? { domain } : {}),\n ...(!domain && url ? { url } : {}),\n ...(sameSite ? { sameSite } : {}),\n ...(secure ? { secure: true } : {}),\n ...(httpOnly ? { httpOnly: true } : {}),\n ...(expires !== null ? { expires } : {}),\n ...(partitionKey ? { partitionKey } : {}),\n };\n\n if (!normalized.domain && !normalized.url) {\n return null;\n }\n\n return {\n ...normalized,\n };\n })\n .filter(Boolean);\n};\n\nconst buildCookieMap = (cookies) => cookies.reduce((acc, item) => {\n\tacc[item.name] = item.value;\n\treturn acc;\n}, {});\n\n// \u7EDF\u4E00\u628A\u539F\u59CB URL \u5FEB\u7167\u8FC7\u6EE4\u6210 http/https\uFF0C\u907F\u514D browser/runtime \u4E24\u7AEF\u5404\u81EA\u505A\u4E00\u5957\u5224\u65AD\u3002\nconst normalizeHttpUrl = (value) => {\n const raw = String(value || '').trim();\n if (!raw) return '';\n try {\n const parsed = new URL(raw);\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') return '';\n parsed.hash = '';\n return parsed.toString();\n } catch {\n return '';\n }\n};\n\nconst uniqueStrings = (value) => {\n const list = Array.isArray(value) ? value : [];\n const seen = new Set();\n const result = [];\n list.forEach((item) => {\n const normalized = String(item || '').trim();\n if (!normalized || seen.has(normalized)) return;\n seen.add(normalized);\n result.push(normalized);\n });\n return result;\n};\n\nconst normalizeHttpUrlList = (value) => uniqueStrings(\n (Array.isArray(value) ? value : [value])\n .map((item) => normalizeHttpUrl(item))\n .filter(Boolean),\n);\n\nconst normalizeCookieDomain = (value) => String(value || '').trim().replace(/^\\./, '').toLowerCase();\n\nconst normalizeCookiePath = (value) => {\n const raw = String(value || '').trim();\n if (!raw) return '/';\n return raw.startsWith('/') ? raw : `/${raw}`;\n};\n\nconst doesCookieMatchUrl = (cookie, url) => {\n if (!cookie || !url) return false;\n try {\n const parsed = new URL(url);\n const host = String(parsed.hostname || '').trim().toLowerCase();\n const pathname = String(parsed.pathname || '/').trim() || '/';\n const cookieDomain = normalizeCookieDomain(cookie.domain);\n const cookiePath = normalizeCookiePath(cookie.path);\n if (!host || !cookieDomain) return false;\n const domainMatched = host === cookieDomain || host.endsWith(`.${cookieDomain}`);\n if (!domainMatched) return false;\n if (cookie.secure && parsed.protocol !== 'https:') return false;\n return pathname.startsWith(cookiePath);\n } catch {\n return false;\n }\n};\n\nconst normalizeRawSnapshot = (value = {}) => {\n const source = isPlainObject(value) ? value : {};\n const pageUrl = normalizeHttpUrl(source.page_url ?? source.pageUrl);\n const frameUrls = normalizeHttpUrlList(source.frame_urls ?? source.frameUrls);\n const resourceUrls = normalizeHttpUrlList(source.resource_urls ?? source.resourceUrls);\n const browserProfileObservedSource =\n source.browser_profile_observed\n ?? source.browserProfileObserved\n ?? source.browser_profile?.observed\n ?? source.browserProfile?.observed\n ?? source.browserProfile;\n\n return {\n page_url: pageUrl,\n frame_urls: frameUrls,\n resource_urls: resourceUrls,\n cookies: Array.isArray(source.cookies) ? deepClone(source.cookies) : [],\n local_storage: normalizeLocalStorage(source.local_storage ?? source.localStorage),\n session_storage: normalizeSessionStorage(source.session_storage ?? source.sessionStorage),\n browser_profile_observed: normalizeObservedBrowserProfile(browserProfileObservedSource),\n };\n};\n\nconst collectCookieUrlsFromSnapshot = (snapshot = {}) => {\n const normalized = normalizeRawSnapshot(snapshot);\n return uniqueStrings([\n normalized.page_url,\n ...normalized.frame_urls,\n ...normalized.resource_urls,\n ].filter(Boolean));\n};\n\nconst filterCookiesBySnapshot = (cookies = [], snapshot = {}) => {\n const normalizedCookies = normalizeCookies(cookies);\n const cookieUrls = collectCookieUrlsFromSnapshot(snapshot);\n if (cookieUrls.length === 0) {\n return normalizedCookies;\n }\n return normalizedCookies.filter((cookie) => cookieUrls.some((url) => doesCookieMatchUrl(cookie, url)));\n};\n\nconst buildEnvPayloadFromSnapshot = (snapshot = {}, options = {}) => {\n const normalized = normalizeRawSnapshot(snapshot);\n const cookies = filterCookiesBySnapshot(snapshot?.cookies || normalized.cookies, normalized);\n const localStorage = normalized.local_storage;\n const sessionStorage = normalized.session_storage;\n const browserProfileCore = normalizeBrowserProfileCore(\n options.browserProfileCore\n ?? snapshot?.browser_profile?.core\n ?? snapshot?.browserProfile?.core,\n );\n const browserProfile = buildBrowserProfilePayload(browserProfileCore, normalized.browser_profile_observed);\n\n const payload = {\n ...(cookies.length > 0 ? { cookies } : {}),\n ...(Object.keys(localStorage).length > 0 ? { local_storage: localStorage } : {}),\n ...(Object.keys(sessionStorage).length > 0 ? { session_storage: sessionStorage } : {}),\n ...(Object.keys(browserProfile).length > 0 ? { browser_profile: browserProfile } : {}),\n };\n return Object.keys(payload).length > 0 ? payload : null;\n};\n\nconst captureRawSnapshotFromPage = async (page) => {\n const frameUrls = typeof page?.frames === 'function'\n ? page.frames().map((frame) => {\n try {\n return frame.url();\n } catch {\n return '';\n }\n })\n : [];\n\n const snapshot = await page.evaluate(() => {\n const localStorage = {};\n const sessionStorage = {};\n const resourceUrls = [];\n const frameUrls = [];\n\n try {\n for (let i = 0; i < window.localStorage.length; i += 1) {\n const key = window.localStorage.key(i);\n if (!key) continue;\n const value = window.localStorage.getItem(key);\n if (value !== null) localStorage[key] = value;\n }\n } catch {\n // ignore\n }\n\n try {\n for (let i = 0; i < window.sessionStorage.length; i += 1) {\n const key = window.sessionStorage.key(i);\n if (!key) continue;\n const value = window.sessionStorage.getItem(key);\n if (value !== null) sessionStorage[key] = value;\n }\n } catch {\n // ignore\n }\n\n try {\n const perfEntries = performance.getEntriesByType('resource') || [];\n perfEntries.forEach((entry) => {\n const name = String(entry?.name || '').trim();\n if (name) resourceUrls.push(name);\n });\n } catch {\n // ignore\n }\n\n try {\n document.querySelectorAll('iframe,frame').forEach((node) => {\n const src = String(node?.src || '').trim();\n if (src) frameUrls.push(src);\n });\n } catch {\n // ignore\n }\n\n const nav = window.navigator || {};\n const screen = window.screen || {};\n const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone || '';\n\n return {\n page_url: window.location.href || '',\n frame_urls: frameUrls,\n resource_urls: resourceUrls,\n local_storage: localStorage,\n session_storage: sessionStorage,\n browser_profile_observed: {\n user_agent: nav.userAgent || '',\n platform: nav.platform || '',\n language: nav.language || '',\n languages: Array.isArray(nav.languages) ? nav.languages : [],\n hardware_concurrency: Number(nav.hardwareConcurrency || 0),\n device_memory: Number(nav.deviceMemory || 0),\n timezone,\n viewport: {\n width: Number(window.innerWidth || 0),\n height: Number(window.innerHeight || 0),\n },\n screen: {\n width: Number(screen.width || 0),\n height: Number(screen.height || 0),\n avail_width: Number(screen.availWidth || 0),\n avail_height: Number(screen.availHeight || 0),\n color_depth: Number(screen.colorDepth || 0),\n pixel_depth: Number(screen.pixelDepth || 0),\n },\n },\n };\n });\n\n return normalizeRawSnapshot({\n ...snapshot,\n frame_urls: [...frameUrls, ...(snapshot?.frame_urls || [])],\n });\n};\n\n// observed \u53EA\u4FDD\u5B58\u201C\u8FD0\u884C\u540E\u770B\u5230\u7684\u6D4F\u89C8\u5668\u8868\u73B0\u201D\uFF0C\u5B83\u4E0D\u662F\u542F\u52A8\u771F\u6E90\u3002\nconst normalizeObservedBrowserProfile = (value) => {\n const source = isPlainObject(value) ? value : {};\n const profile = {};\n\n const stringFields = {\n user_agent: source.user_agent,\n platform: source.platform,\n language: source.language,\n timezone: source.timezone,\n };\n Object.entries(stringFields).forEach(([key, item]) => {\n const safeValue = String(item || '').trim();\n if (safeValue) {\n profile[key] = safeValue;\n }\n });\n\n if (Array.isArray(source.languages)) {\n const languages = source.languages\n .map((item) => String(item || '').trim())\n .filter(Boolean);\n if (languages.length > 0) {\n profile.languages = languages;\n }\n }\n\n const numericFields = {\n hardware_concurrency: Number(source.hardware_concurrency || 0),\n device_memory: Number(source.device_memory || 0),\n };\n Object.entries(numericFields).forEach(([key, item]) => {\n if (Number.isFinite(item) && item > 0) {\n profile[key] = item;\n }\n });\n\n if (isPlainObject(source.viewport)) {\n const width = Number(source.viewport.width || 0);\n const height = Number(source.viewport.height || 0);\n if (width > 0 && height > 0) {\n profile.viewport = { width, height };\n }\n }\n\n if (isPlainObject(source.screen)) {\n const screenProfile = {};\n const screenFields = {\n width: Number(source.screen.width || 0),\n height: Number(source.screen.height || 0),\n avail_width: Number(source.screen.avail_width || 0),\n avail_height: Number(source.screen.avail_height || 0),\n color_depth: Number(source.screen.color_depth || 0),\n pixel_depth: Number(source.screen.pixel_depth || 0),\n };\n Object.entries(screenFields).forEach(([key, item]) => {\n if (Number.isFinite(item) && item > 0) {\n screenProfile[key] = item;\n }\n });\n if (Object.keys(screenProfile).length > 0) {\n profile.screen = screenProfile;\n }\n }\n\n\treturn profile;\n};\n\n// core \u662F\u6D4F\u89C8\u5668\u73AF\u5883\u7684\u552F\u4E00\u771F\u6E90\uFF1A\n// fingerprint / device / timezone_id / locale / browser_major_version \u90FD\u5728\u8FD9\u91CC\uFF0C\n// \u4E5F\u5C31\u662F\u8BF4 mobile/desktop \u4E0D\u80FD\u9760\u8FD0\u884C\u65F6\u5C0F\u4FEE\u8865\u7ED5\u8FC7\u53BB\uFF0C\u5FC5\u987B\u8BA9 core \u672C\u8EAB\u5BF9\u9F50\u3002\nconst normalizeBrowserProfileCore = (value) => {\n const source = isPlainObject(value) ? value : {};\n const profile = {};\n\n const device = normalizeKnownDevice(source.device);\n if (device) {\n profile.device = device;\n }\n\n if (isPlainObject(source.fingerprint) && Object.keys(source.fingerprint).length > 0) {\n profile.fingerprint = deepClone(source.fingerprint);\n }\n\n const timezoneId = String(source.timezone_id || '').trim();\n if (timezoneId) {\n profile.timezone_id = timezoneId;\n }\n\n const locale = String(source.locale || '').trim();\n if (locale) {\n profile.locale = locale;\n }\n\n const browserMajorVersion = Number(source.browser_major_version || 0);\n if (Number.isFinite(browserMajorVersion) && browserMajorVersion > 0) {\n profile.browser_major_version = browserMajorVersion;\n }\n\n const schemaVersion = Number(source.schema_version || 0);\n if (Number.isFinite(schemaVersion) && schemaVersion > 0) {\n profile.schema_version = schemaVersion;\n } else if (Object.keys(profile).length > 0) {\n profile.schema_version = BROWSER_PROFILE_SCHEMA_VERSION;\n }\n\n\treturn profile;\n};\n\n// buildBrowserProfilePayload \u4FDD\u8BC1 browser_profile \u6C38\u8FDC\u53EA\u66B4\u9732 core / observed \u4E24\u5C42\u7ED3\u6784\u3002\nconst buildBrowserProfilePayload = (core = {}, observed = {}) => {\n const payload = {};\n if (isPlainObject(core) && Object.keys(core).length > 0) {\n payload.core = core;\n }\n if (isPlainObject(observed) && Object.keys(observed).length > 0) {\n payload.observed = observed;\n }\n return payload;\n};\n\nconst mergePlainObject = (target = {}, source = {}) => {\n const next = isPlainObject(target) ? deepClone(target) : {};\n if (!isPlainObject(source)) return next;\n\n Object.entries(source).forEach(([key, value]) => {\n if (!key) return;\n if (isPlainObject(value) && isPlainObject(next[key])) {\n next[key] = mergePlainObject(next[key], value);\n return;\n }\n next[key] = deepClone(value);\n });\n\n\treturn next;\n};\n\n// mergeBrowserProfilePayload \u7684\u6838\u5FC3\u89C4\u5219\uFF1A\n// 1. core \u53EA\u5728\u5F53\u524D\u4E3A\u7A7A\u3001device \u51B2\u7A81\u3001\u6216\u6D4F\u89C8\u5668\u5927\u7248\u672C\u51B2\u7A81\u65F6\u624D\u66FF\u6362\uFF1B\n// 2. observed \u6BCF\u6B21\u90FD\u5141\u8BB8\u8986\u76D6\u66F4\u65B0\uFF1B\n// 3. \u8FD9\u4FDD\u8BC1\u4E86\u201C\u770B\u8D77\u6765\u5207\u4E86 device\uFF0C\u5B9E\u9645\u4E0A core \u8FD8\u5728\u8DD1\u65E7\u6307\u7EB9\u201D\u4E0D\u4F1A\u957F\u671F\u5B58\u5728\u3002\nconst mergeBrowserProfilePayload = (target = {}, source = {}) => {\n const current = isPlainObject(target) ? target : {};\n const incoming = isPlainObject(source) ? source : {};\n const currentCore = normalizeBrowserProfileCore(current.core);\n const incomingCore = normalizeBrowserProfileCore(incoming.core);\n const currentObserved = normalizeObservedBrowserProfile(current.observed);\n const incomingObserved = normalizeObservedBrowserProfile(incoming.observed);\n\n let mergedCore = currentCore;\n if (Object.keys(mergedCore).length === 0 && Object.keys(incomingCore).length > 0) {\n mergedCore = incomingCore;\n } else if (Object.keys(incomingCore).length > 0) {\n const currentDevice = normalizeKnownDevice(currentCore.device);\n const incomingDevice = normalizeKnownDevice(incomingCore.device);\n const currentVersion = Number(currentCore.browser_major_version || 0);\n const incomingVersion = Number(incomingCore.browser_major_version || 0);\n if (\n (incomingDevice && currentDevice !== incomingDevice)\n || (currentVersion > 0 && incomingVersion > 0 && currentVersion !== incomingVersion)\n ) {\n mergedCore = incomingCore;\n }\n }\n\n const mergedObserved = mergePlainObject(currentObserved, incomingObserved);\n\treturn buildBrowserProfilePayload(mergedCore, mergedObserved);\n};\n\n// mergeEnvPatchObjects \u662F visitor \u6210\u529F/\u5931\u8D25\u81EA\u52A8\u56DE\u5199 env_patch \u7684\u5408\u5E76\u5165\u53E3\u3002\nconst mergeEnvPatchObjects = (...patches) => {\n const merged = {};\n\n patches.forEach((patch) => {\n if (!isPlainObject(patch)) return;\n Object.entries(patch).forEach(([key, value]) => {\n if (!key) return;\n if (key === 'browser_profile') {\n const browserProfile = mergeBrowserProfilePayload(merged.browser_profile, value);\n if (Object.keys(browserProfile).length > 0) {\n merged.browser_profile = browserProfile;\n }\n return;\n }\n if (isPlainObject(value) && isPlainObject(merged[key])) {\n merged[key] = mergePlainObject(merged[key], value);\n return;\n }\n merged[key] = deepClone(value);\n });\n });\n\n return Object.keys(merged).length > 0 ? merged : null;\n};\n\nconst normalizeBrowserProfile = (value) => {\n const source = isPlainObject(value) ? value : {};\n const coreSource = isPlainObject(source.core) ? source.core : {};\n const observedSource = isPlainObject(source.observed) ? source.observed : {};\n const core = normalizeBrowserProfileCore(coreSource);\n const observed = normalizeObservedBrowserProfile(observedSource);\n return {\n core,\n observed,\n payload: buildBrowserProfilePayload(core, observed),\n };\n};\n\nconst rememberRuntimeState = (state) => {\n rememberedRuntimeState = deepClone(state);\n return rememberedRuntimeState;\n};\n\nconst normalizeRuntimeState = (source = {}, actor = '') => {\n if (\n source &&\n typeof source === 'object' &&\n source.runtime &&\n typeof source.runtime === 'object' &&\n !Array.isArray(source.runtime) &&\n Object.prototype.hasOwnProperty.call(source, 'browserProfileCore')\n ) {\n return source;\n }\n return RuntimeEnv.parseInput(source, actor);\n};\n\nconst resolveInputDevice = (input = {}, runtime = {}, actor = '') => {\n const actorDevice = ActorInfo?.[actor]?.device;\n return normalizeDevice(actorDevice ?? input?.device ?? runtime?.device);\n};\n\nexport const RuntimeEnv = {\n tryParseJSON,\n normalizeDevice,\n normalizeCookies,\n normalizeLocalStorage,\n normalizeSessionStorage,\n normalizeBrowserProfileCore,\n normalizeObservedBrowserProfile,\n normalizeSnapshot(snapshot = {}) {\n return normalizeRawSnapshot(snapshot);\n },\n collectCookieUrls(snapshot = {}) {\n return collectCookieUrlsFromSnapshot(snapshot);\n },\n buildRuntimeEnvFromSnapshot(snapshot = {}, options = {}) {\n return buildEnvPayloadFromSnapshot(snapshot, options);\n },\n buildEnvPatchFromSnapshot(snapshot = {}, options = {}) {\n return buildEnvPayloadFromSnapshot(snapshot, options);\n },\n mergeEnvPatches(...patches) {\n return mergeEnvPatchObjects(...patches);\n },\n\n // parseInput \u628A Actor \u8F93\u5165\u91CC\u7684 runtime \u5B57\u6BB5\u6807\u51C6\u5316\u6210 toolkit \u5185\u90E8\u7EDF\u4E00\u7ED3\u6784\u3002\n // \u540E\u7EED visitor \u53EA\u548C\u8FD9\u4E2A state \u4EA4\u4E92\uFF0C\u4E0D\u518D\u81EA\u5DF1\u62FC token/cookie \u903B\u8F91\u3002\n parseInput(input = {}, actor = '') {\n const runtime = tryParseJSON(input?.runtime) || {};\n const resolvedActor = String(actor || input?.actor || '').trim();\n const device = resolveInputDevice(input, runtime, resolvedActor);\n const query = String(input?.query || '').trim();\n const cookies = normalizeCookies(runtime?.cookies);\n const cookieMap = buildCookieMap(cookies);\n const localStorage = normalizeLocalStorage(runtime?.local_storage);\n const sessionStorage = normalizeSessionStorage(runtime?.session_storage);\n const browserProfile = normalizeBrowserProfile(runtime?.browser_profile);\n const envId = String(input?.env_id || '').trim();\n\n const normalizedRuntime = {\n ...(cookies.length > 0 ? { cookies } : {}),\n ...(Object.keys(localStorage).length > 0 ? { local_storage: localStorage } : {}),\n ...(Object.keys(sessionStorage).length > 0 ? { session_storage: sessionStorage } : {}),\n };\n if (Object.keys(browserProfile.payload).length > 0) {\n normalizedRuntime.browser_profile = browserProfile.payload;\n } else {\n delete normalizedRuntime.browser_profile;\n }\n\n const state = {\n actor: resolvedActor,\n device,\n runtime: normalizedRuntime,\n envId,\n query,\n cookies,\n cookieMap,\n localStorage,\n sessionStorage,\n browserProfile: browserProfile.payload,\n browserProfileCore: browserProfile.core,\n browserProfileObserved: browserProfile.observed,\n };\n rememberRuntimeState(state);\n return state;\n },\n\n // buildEnvPatch \u53EA\u6784\u9020\u5141\u8BB8\u56DE\u5199\u5230\u540E\u7AEF env \u7684\u5B57\u6BB5\u96C6\u5408\u3002\n buildEnvPatch(source = {}, actor = '') {\n const state = normalizeRuntimeState(source, actor);\n const browserProfile = buildBrowserProfilePayload(state.browserProfileCore, state.browserProfileObserved);\n const envPatch = {\n ...(Array.isArray(state.cookies) && state.cookies.length > 0 ? { cookies: state.cookies } : {}),\n ...(Object.keys(state.localStorage || {}).length > 0 ? { local_storage: state.localStorage } : {}),\n ...(Object.keys(state.sessionStorage || {}).length > 0 ? { session_storage: state.sessionStorage } : {}),\n ...(Object.keys(browserProfile).length > 0 ? { browser_profile: browserProfile } : {}),\n };\n return Object.keys(envPatch).length > 0 ? envPatch : null;\n },\n\n // hasLoginState \u53EA\u5224\u65AD runtime \u662F\u5426\u5B58\u5728\u6709\u6548\u8F7D\u8377\uFF0C\u4E0D\u518D\u533A\u5206\u5177\u4F53\u5B57\u6BB5\u6765\u6E90\u3002\n hasLoginState(source = {}, actor = '') {\n const state = normalizeRuntimeState(source, actor);\n return isPlainObject(state.runtime) && Object.keys(state.runtime || {}).length > 0;\n },\n\n rememberState(source = {}) {\n const state = normalizeRuntimeState(source);\n rememberRuntimeState(state);\n return RuntimeEnv.peekRememberedState();\n },\n\n peekRememberedState() {\n return rememberedRuntimeState ? deepClone(rememberedRuntimeState) : null;\n },\n\n getBrowserProfileCore(source = {}, actor = '') {\n const state = normalizeRuntimeState(source, actor);\n return deepClone(state.browserProfileCore || {});\n },\n\n setBrowserProfileCore(source = {}, core = {}, actor = '') {\n const state = normalizeRuntimeState(source, actor);\n const normalizedCore = normalizeBrowserProfileCore({\n ...core,\n device: normalizeKnownDevice(core?.device) || state.device,\n });\n state.browserProfileCore = normalizedCore;\n state.browserProfile = buildBrowserProfilePayload(normalizedCore, state.browserProfileObserved);\n if (Object.keys(state.browserProfile).length > 0) {\n state.runtime.browser_profile = state.browserProfile;\n } else {\n delete state.runtime.browser_profile;\n }\n rememberRuntimeState(state);\n return state;\n },\n\n // applyToPage \u53EA\u8D1F\u8D23\u628A\u767B\u5F55\u6001\u76F8\u5173\u5B57\u6BB5\u6CE8\u5165\u9875\u9762\uFF1A\n // cookies / localStorage / sessionStorage\u3002\n // \u6307\u7EB9\u3001\u65F6\u533A\u3001UA\u3001viewport \u7684\u56DE\u653E\u53D1\u751F\u5728 launch.js \u542F\u52A8\u9636\u6BB5\uFF0C\u4E0D\u5728\u8FD9\u91CC\u505A\u3002\n async applyToPage(page, source = {}, options = {}) {\n if (!page) return;\n let state = normalizeRuntimeState(source, options?.actor || '');\n if (typeof options?.preapply === 'function') {\n state = await options.preapply(state) || state;\n rememberRuntimeState(state);\n }\n Object.defineProperty(page, PageRuntimeStateKey, {\n configurable: true,\n enumerable: false,\n writable: true,\n value: state,\n });\n const localStorage = state.localStorage || {};\n const sessionStorage = state.sessionStorage || {};\n const cookies = (state.cookies || [])\n .map((cookie) => {\n const normalized = { ...cookie };\n if (!normalized.path) {\n normalized.path = '/';\n }\n if (!normalized.domain && !normalized.url) {\n return null;\n }\n return normalized;\n })\n .filter(Boolean);\n\n if (cookies.length > 0) {\n await page.context().addCookies(cookies);\n }\n if (Object.keys(localStorage).length > 0) {\n await page.addInitScript((payload) => {\n try {\n Object.entries(payload || {}).forEach(([key, value]) => {\n if (!key) return;\n window.localStorage.setItem(key, String(value ?? ''));\n });\n } catch (error) {\n // no-op\n }\n }, localStorage);\n }\n if (Object.keys(sessionStorage).length > 0) {\n await page.addInitScript((payload) => {\n try {\n Object.entries(payload || {}).forEach(([key, value]) => {\n if (!key) return;\n window.sessionStorage.setItem(key, String(value ?? ''));\n });\n } catch (error) {\n // no-op\n }\n }, sessionStorage);\n }\n },\n\n // captureEnvPatch \u5728\u4EFB\u52A1\u7ED3\u675F\u65F6\u91C7\u96C6\u6700\u65B0\u73AF\u5883\u5FEB\u7167\uFF0C\u7528\u4E8E pushSuccess / pushFailed \u81EA\u52A8\u56DE\u5199\u3002\n async captureEnvPatch(page, source = {}, options = {}) {\n const state = normalizeRuntimeState(source, options?.actor || '');\n const baseline = RuntimeEnv.buildEnvPatch(state) || {};\n if (!page || typeof page.evaluate !== 'function' || typeof page.context !== 'function') {\n return Object.keys(baseline).length > 0 ? baseline : null;\n }\n\n try {\n const rawSnapshot = await captureRawSnapshotFromPage(page);\n const cookieUrls = collectCookieUrlsFromSnapshot(rawSnapshot);\n let cookies = [];\n try {\n cookies = cookieUrls.length > 0\n ? await page.context().cookies(cookieUrls)\n : await page.context().cookies();\n } catch {\n cookies = [];\n }\n const capturedPatch = RuntimeEnv.buildEnvPatchFromSnapshot(\n {\n ...rawSnapshot,\n cookies,\n },\n {\n browserProfileCore: state.browserProfileCore,\n },\n );\n return RuntimeEnv.mergeEnvPatches(baseline, capturedPatch);\n } catch {\n // ignore\n }\n return Object.keys(baseline).length > 0 ? baseline : null;\n },\n};\n", "import { createInternalLogger } from './logger.js';\n\nconst logger = createInternalLogger('InternalUtils');\n\n/**\n * \u89E3\u6790 Cookie \u5B57\u7B26\u4E32\u4E3A Playwright \u683C\u5F0F\u7684 Cookie \u6570\u7EC4\n * @param {string} cookieString - Cookie \u5B57\u7B26\u4E32\n * @param {string} [domain] - Cookie \u57DF\u540D (\u53EF\u9009)\n * @returns {Array} Cookie \u6570\u7EC4\n */\nexport const parseCookies = (cookieString, domain) => {\n const cookies = [];\n const pairs = cookieString.split(';').map(c => c.trim());\n\n for (const pair of pairs) {\n const [name, ...valueParts] = pair.split('=');\n if (name && valueParts.length > 0) {\n const cookie = {\n name: name.trim(),\n value: valueParts.join('=').trim(),\n path: '/',\n };\n if (domain) {\n cookie.domain = domain;\n }\n cookies.push(cookie);\n }\n }\n logger.success('parseCookies', `parsed ${cookies.length} cookies`);\n return cookies;\n};\n", "import { parseCookies as internalParseCookies } from './internals/utils.js';\n\nexport const Utils = {\n /**\n * \u89E3\u6790 Cookie \u5B57\u7B26\u4E32\u4E3A Playwright \u683C\u5F0F\u7684 Cookie \u6570\u7EC4\n * @param {string} cookieString - Cookie \u5B57\u7B26\u4E32\n * @param {string} [domain] - Cookie \u57DF\u540D (\u53EF\u9009)\n * @returns {Array} Cookie \u6570\u7EC4\n */\n parseCookies(cookieString, domain) {\n return internalParseCookies(cookieString, domain);\n },\n\n /**\n * \u4ECE\u5B57\u7B26\u4E32\u4E2D\u63D0\u53D6 URL \u94FE\u63A5\n * @param {string} text\n * @param {Object} [options]\n * @param {string} [options.prefix] - \u4EC5\u8FD4\u56DE\u6B64\u524D\u7F00\u5F00\u5934\uFF0C\u4E14\u524D\u7F00\u540E\u81F3\u5C11 1 \u4F4D\u5B57\u7B26\u7684\u94FE\u63A5\n * @returns {string[]}\n */\n parseLinks(text, options = {}) {\n const raw = String(text || '');\n if (!raw) return [];\n\n const opts = options && typeof options === 'object' ? options : {};\n const prefix = String(opts.prefix || '').trim();\n\n const matched = raw.match(/https?:\\/\\/[\\w\\-._~:/?#[\\]@!$&'()*+,;=%]+/g) || [];\n const unique = new Set();\n\n for (const item of matched) {\n const link = String(item || '').trim().replace(/[\"'\u201C\u201D\u2018\u2019>\\].,\uFF0C\u3002\uFF1B;!\uFF01?\uFF1F]+$/, '');\n if (!link || !/^https?:\\/\\//i.test(link)) continue;\n\n if (prefix) {\n if (!link.startsWith(prefix)) continue;\n if (link.length <= prefix.length) continue;\n }\n\n unique.add(link);\n }\n\n return Array.from(unique);\n },\n}\n", "import { Mode, normalizeMode } from '../constants.js';\n\nconst state = {\n mode: Mode.Default,\n};\n\nconst normalizeStrategies = (strategies) => (\n strategies && typeof strategies === 'object'\n ? strategies\n : {}\n);\n\nexport const ToolkitContext = {\n get mode() {\n return state.mode;\n },\n\n setMode(mode = Mode.Default) {\n state.mode = normalizeMode(mode, Mode.Default);\n return state.mode;\n },\n};\n\nexport const getToolkitContext = () => ({ mode: state.mode });\n\nexport const getToolkitMode = () => state.mode;\n\nexport const setToolkitMode = (mode = Mode.Default) => ToolkitContext.setMode(mode);\n\nexport const resolveModeStrategy = (strategies = {}, mode = getToolkitMode(), fallbackMode = Mode.Default) => {\n const normalizedStrategies = normalizeStrategies(strategies);\n const normalizedMode = normalizeMode(mode, fallbackMode);\n const strategy = normalizedStrategies[normalizedMode]\n ?? normalizedStrategies[fallbackMode]\n ?? Object.values(normalizedStrategies).find(Boolean)\n ?? null;\n\n return {\n mode: normalizedMode,\n strategy,\n };\n};\n", "import { resolveModeStrategy } from './context.js';\n\nconst normalizeStrategies = (strategies) => (\n strategies && typeof strategies === 'object'\n ? strategies\n : {}\n);\n\nconst collectFunctionNames = (strategies = []) => {\n const names = new Set();\n for (const strategy of strategies) {\n if (!strategy || typeof strategy !== 'object') continue;\n for (const name of Reflect.ownKeys(strategy)) {\n if (typeof name === 'string' && typeof strategy[name] === 'function') {\n names.add(name);\n }\n }\n }\n return names;\n};\n\nconst methodDescriptor = (namespace, name, resolveTarget) => ({\n enumerable: true,\n configurable: true,\n writable: true,\n value: (...args) => {\n const { mode, strategy } = resolveTarget(args);\n const method = strategy?.[name];\n if (typeof method !== 'function') {\n throw new Error(`${namespace}.${name} is not available in ${mode} mode`);\n }\n return method.apply(strategy, args);\n },\n});\n\nexport const withModeReflect = (namespace, strategies = {}) => {\n const normalizedStrategies = normalizeStrategies(strategies);\n const baseStrategy = normalizedStrategies.default ?? Object.values(normalizedStrategies).find(Boolean);\n const names = collectFunctionNames([baseStrategy]);\n const descriptors = {};\n\n for (const name of names) {\n descriptors[name] = methodDescriptor(namespace, name, () => (\n resolveModeStrategy(normalizedStrategies)\n ));\n }\n\n return Object.defineProperties({}, descriptors);\n};\n\nexport const withPageReflect = (namespace, resolveStrategy, strategies = []) => {\n const names = collectFunctionNames(strategies);\n const descriptors = {};\n\n for (const name of names) {\n descriptors[name] = methodDescriptor(namespace, name, ([page]) => ({\n mode: 'page',\n strategy: resolveStrategy(page),\n }));\n }\n\n return Object.defineProperties({}, descriptors);\n};\n", "import { Device, normalizeDevice } from '../../constants.js';\n\nconst BASE_CONFIG = Object.freeze({\n locale: 'zh-CN',\n acceptLanguage: 'zh-CN,zh;q=0.9',\n timezoneId: 'Asia/Shanghai',\n timezoneOffset: -480,\n geolocation: null,\n});\n\n// \u6700\u5C0F\u5316\u542F\u52A8\u53C2\u6570\uFF0C\u4F9D\u8D56 Crawlee/Playwright \u9ED8\u8BA4\u884C\u4E3A\nconst DEFAULT_LAUNCH_ARGS = [\n // '--disable-blink-features=AutomationControlled', // Crawlee \u53EF\u80FD\u4F1A\u81EA\u52A8\u5904\u7406\uFF0C\u8FC7\u591A\u5E72\u9884\u53CD\u800C\u4F1A\u88AB\u8BC6\u522B\n '--no-sandbox',\n '--disable-setuid-sandbox',\n '--window-position=0,0',\n];\n\nfunction buildFingerprintOptions({ locale = BASE_CONFIG.locale, browserMajorVersion = 0, device = Device.Desktop } = {}) {\n const resolvedDevice = normalizeDevice(device);\n const normalizedBrowserMajorVersion = Number(browserMajorVersion || 0);\n const browserDescriptor = normalizedBrowserMajorVersion > 0\n ? [{ name: 'chrome', minVersion: normalizedBrowserMajorVersion, maxVersion: normalizedBrowserMajorVersion }]\n : [{ name: 'chrome', minVersion: 110 }];\n\n const options = {\n browsers: browserDescriptor,\n devices: [resolvedDevice],\n operatingSystems: resolvedDevice === Device.Mobile\n ? ['android']\n : ['windows', 'macos', 'linux'],\n locales: [locale],\n strict: true,\n };\n\n if (resolvedDevice === Device.Mobile) {\n options.screen = {\n minWidth: 320,\n maxWidth: 480,\n minHeight: 640,\n maxHeight: 1100,\n };\n }\n\n return options;\n}\n\nexport const DefaultAntiCheat = {\n /**\n * \u83B7\u53D6\u7EDF\u4E00\u7684\u57FA\u7840\u914D\u7F6E\n */\n getBaseConfig() {\n return { ...BASE_CONFIG };\n },\n\n /**\n * \u7528\u4E8E Crawlee fingerprint generator \u7684\u7EDF\u4E00\u914D\u7F6E\u3002\n */\n getFingerprintGeneratorOptions(options = {}) {\n return buildFingerprintOptions(options);\n },\n\n /**\n * \u83B7\u53D6\u57FA\u7840\u542F\u52A8\u53C2\u6570\u3002\n */\n getLaunchArgs(options = {}) {\n const locale = String(options?.locale || BASE_CONFIG.locale).trim() || BASE_CONFIG.locale;\n return [...DEFAULT_LAUNCH_ARGS, `--lang=${locale}`];\n },\n\n /**\n * \u4E3A got-scraping \u751F\u6210\u4E0E\u6D4F\u89C8\u5668\u4E00\u81F4\u7684 TLS \u6307\u7EB9\u914D\u7F6E\u3002\n */\n getTlsFingerprintOptions(userAgent = '', acceptLanguage = '', options = {}) {\n // \u7B80\u5316\u903B\u8F91\uFF0C\u4E0D\u518D\u89E3\u6790 acceptLanguage\uFF0C\u4EC5\u63D0\u4F9B\u57FA\u7840\u6307\u7EB9\u914D\u7F6E\n return buildFingerprintOptions(options);\n },\n\n /**\n * \u89C4\u8303\u5316\u8BF7\u6C42\u5934\n */\n applyLocaleHeaders(headers, acceptLanguage = '') {\n if (!headers['accept-language']) {\n headers['accept-language'] = acceptLanguage || BASE_CONFIG.acceptLanguage;\n }\n return headers;\n },\n};\n\nexport const AntiCheat = DefaultAntiCheat;\n", "const CLOAK_BASE_CONFIG = Object.freeze({\n locale: '',\n acceptLanguage: '',\n timezoneId: '',\n timezoneOffset: null,\n geolocation: null,\n});\n\nconst normalizeHeaders = (headers) => (\n headers && typeof headers === 'object'\n ? headers\n : {}\n);\n\nexport const CloakAntiCheat = {\n /**\n * Cloak \u81EA\u8EAB\u4F1A\u8D1F\u8D23\u6D4F\u89C8\u5668\u6307\u7EB9\uFF0Ctoolkit \u5728\u8BE5\u6A21\u5F0F\u4E0B\u5C3D\u91CF\u4E0D\u518D\u6CE8\u5165\u989D\u5916\u53CD\u68C0\u6D4B\u914D\u7F6E\u3002\n */\n getBaseConfig() {\n return { ...CLOAK_BASE_CONFIG };\n },\n\n getFingerprintGeneratorOptions() {\n return {};\n },\n\n getLaunchArgs() {\n return [];\n },\n\n getTlsFingerprintOptions() {\n return {};\n },\n\n applyLocaleHeaders(headers, acceptLanguage = '') {\n const normalizedHeaders = normalizeHeaders(headers);\n if (acceptLanguage && !normalizedHeaders['accept-language']) {\n normalizedHeaders['accept-language'] = acceptLanguage;\n }\n return normalizedHeaders;\n },\n};\n", "import { Mode } from './constants.js';\nimport { withModeReflect } from './internals/reflect.js';\nimport { CloakAntiCheat, DefaultAntiCheat } from './internals/anti-cheat/index.js';\n\nconst antiCheatStrategies = {\n [Mode.Default]: DefaultAntiCheat,\n [Mode.Cloak]: CloakAntiCheat,\n};\n\nexport const AntiCheat = withModeReflect('AntiCheat', antiCheatStrategies);\n", "import { Device, normalizeDevice } from './constants.js';\nimport { PageRuntimeStateKey } from './internals/constants.js';\n\n/**\n * DeviceInput \u662F\u673A\u68B0\u8F93\u5165\u7684\u552F\u4E00\u9002\u914D\u5C42\u3002\n *\n * \u4F7F\u7528\u8FB9\u754C\uFF1A\n * - visitor / captcha / toolkit \u975E\u62DF\u4EBA\u5316\u8DEF\u5F84\u8981\u8C03\u7528\u8FD9\u91CC\uFF0C\u4E0D\u76F4\u63A5\u8C03\u7528 page.mouse / page.touchscreen / locator.click\u3002\n * - Humanize \u4ECD\u7136\u8D1F\u8D23\u201C\u62DF\u4EBA\u5316\u884C\u4E3A\u201D\uFF0C\u5B83\u5185\u90E8\u53EF\u4EE5\u4FDD\u7559\u81EA\u5DF1\u7684\u8F68\u8FF9\u3001\u6EDA\u52A8\u548C\u8282\u594F\u5B9E\u73B0\u3002\n * - DOM click \u53EA\u4F5C\u4E3A\u517C\u5BB9\u515C\u5E95\uFF1B\u79FB\u52A8\u7AEF\u771F\u5B9E\u70B9\u51FB\u4F18\u5148\u8D70 tap/touch\uFF0C\u684C\u9762\u7AEF\u8D70 click/mouse\u3002\n */\nconst resolveDeviceFromPage = (page) => normalizeDevice(page?.[PageRuntimeStateKey]?.device);\n\nconst assertPage = (page, method) => {\n if (!page || typeof page !== 'object') {\n throw new Error(`DeviceInput.${method} requires a Playwright page`);\n }\n};\n\nconst isPoint = (value) => (\n value\n && typeof value === 'object'\n && Number.isFinite(Number(value.x))\n && Number.isFinite(Number(value.y))\n);\n\nconst pointFromArgs = (pointOrX, maybeY) => {\n if (isPoint(pointOrX)) {\n return { x: Number(pointOrX.x), y: Number(pointOrX.y) };\n }\n return { x: Number(pointOrX), y: Number(maybeY) };\n};\n\nconst resolveNativeTarget = (page, target) => {\n if (!target) return null;\n if (typeof target === 'string') return page.locator(target);\n return target;\n};\n\nconst normalizeSelectorOptions = (options = {}) => ({\n targetParent: Boolean(options.targetParent ?? options.parent ?? false),\n pick: options.pick === 'last' || options.last ? 'last' : 'first',\n visibleOnly: options.visibleOnly !== false,\n fallbackDomClick: Boolean(options.fallbackDomClick),\n forceMouse: Boolean(options.forceMouse),\n forceClick: Boolean(options.forceClick),\n mouseOptions: options.mouseOptions || {},\n clickOptions: options.clickOptions || {},\n tapOptions: options.tapOptions || {},\n});\n\nconst waitFor = (page, timeout) => {\n if (!timeout) return Promise.resolve();\n if (page && typeof page.waitForTimeout === 'function') {\n return page.waitForTimeout(timeout);\n }\n return new Promise((resolve) => setTimeout(resolve, timeout));\n};\n\nconst getTargetBoundingBox = async (target) => {\n if (!target) return null;\n if (typeof target.boundingBox === 'function') return target.boundingBox();\n if (typeof target.elementHandle === 'function') {\n const handle = await target.elementHandle();\n try {\n return await handle?.boundingBox?.();\n } finally {\n if (handle && typeof handle.dispose === 'function') {\n await handle.dispose().catch(() => {});\n }\n }\n }\n return null;\n};\n\nconst assertPoint = (point) => {\n if (!Number.isFinite(point.x) || !Number.isFinite(point.y)) {\n throw new Error(`Invalid input point: ${JSON.stringify(point)}`);\n }\n};\n\nconst toFiniteNumber = (value, fallback = 0) => {\n const number = Number(value);\n return Number.isFinite(number) ? number : fallback;\n};\n\n// \u9F20\u6807\u539F\u8BED\u53EA\u5728\u6A21\u5757\u5185\u90E8\u4F7F\u7528\uFF1B\u8C03\u7528\u65B9\u7EDF\u4E00\u8D70 DeviceInput.drag()/click() \u7B49\u8BED\u4E49\u65B9\u6CD5\uFF0C\n// \u8FD9\u6837\u79FB\u52A8\u7AEF\u9875\u9762\u4F1A\u6536\u5230 touch/tap \u4E8B\u4EF6\uFF0C\u800C\u4E0D\u662F\u88F8 mouse \u4E8B\u4EF6\u3002\nconst dispatchMouseMove = (page, point, options = {}) => page.mouse.move(point.x, point.y, options);\nconst dispatchMouseStart = (page, options = {}) => page.mouse.down(options);\nconst dispatchMouseEnd = (page, options = {}) => page.mouse.up(options);\n\nconst dragWithMouse = async (page, points, options = {}) => {\n await dispatchMouseMove(page, points.start, { steps: 8 });\n await waitFor(page, options.initialDelayMs ?? 250);\n await dispatchMouseStart(page);\n await waitFor(page, options.holdDelayMs ?? 350);\n\n await dispatchMouseMove(page, points.lift, { steps: 6 });\n await waitFor(page, options.liftDelayMs ?? 250);\n\n for (let step = 1; step <= points.steps; step += 1) {\n const progress = step / points.steps;\n const easedProgress = 1 - ((1 - progress) * (1 - progress));\n await dispatchMouseMove(page, {\n x: points.lift.x + ((points.end.x - points.lift.x) * easedProgress),\n y: points.lift.y + ((points.end.y - points.lift.y) * easedProgress),\n }, { steps: 2 });\n await waitFor(page, options.stepDelayMs ?? 90);\n }\n\n const finalMoveRepeats = Math.max(0, Math.floor(toFiniteNumber(options.finalMoveRepeats)));\n for (let repeat = 0; repeat < finalMoveRepeats; repeat += 1) {\n await dispatchMouseMove(page, points.end, { steps: 1 });\n await waitFor(page, options.finalMoveDelayMs ?? 35);\n }\n\n await waitFor(page, options.beforeReleaseDelayMs ?? 100);\n await dispatchMouseEnd(page);\n await waitFor(page, options.afterReleaseDelayMs ?? 100);\n return true;\n};\n\nconst dragWithTouch = async (page, points, options = {}) => {\n let client = null;\n try {\n client = await page.context().newCDPSession(page);\n await waitFor(page, options.initialDelayMs ?? 250);\n await client.send('Input.dispatchTouchEvent', {\n type: 'touchStart',\n touchPoints: [{ x: points.start.x, y: points.start.y, id: 1 }],\n });\n await waitFor(page, options.holdDelayMs ?? 350);\n\n const totalSteps = points.steps + 1;\n for (let step = 1; step <= totalSteps; step += 1) {\n const progress = step / totalSteps;\n const easedProgress = 1 - ((1 - progress) * (1 - progress));\n const from = step === 1 ? points.start : points.lift;\n const to = points.end;\n await client.send('Input.dispatchTouchEvent', {\n type: 'touchMove',\n touchPoints: [{\n x: from.x + ((to.x - from.x) * easedProgress),\n y: from.y + ((to.y - from.y) * easedProgress),\n id: 1,\n }],\n });\n await waitFor(page, options.stepDelayMs ?? 90);\n }\n\n const finalMoveRepeats = Math.max(0, Math.floor(toFiniteNumber(options.finalMoveRepeats)));\n for (let repeat = 0; repeat < finalMoveRepeats; repeat += 1) {\n await client.send('Input.dispatchTouchEvent', {\n type: 'touchMove',\n touchPoints: [{ x: points.end.x, y: points.end.y, id: 1 }],\n });\n await waitFor(page, options.finalMoveDelayMs ?? 35);\n }\n\n await waitFor(page, options.beforeReleaseDelayMs ?? 100);\n await client.send('Input.dispatchTouchEvent', {\n type: 'touchEnd',\n touchPoints: [],\n });\n await waitFor(page, options.afterReleaseDelayMs ?? 100);\n return true;\n } finally {\n if (client && typeof client.detach === 'function') {\n await client.detach().catch(() => {});\n }\n }\n};\n\nconst clickTargetWithDevice = async (page, target, options = {}) => {\n const normalizedOptions = normalizeSelectorOptions(options);\n const resolvedDevice = resolveDeviceFromPage(page);\n\n // \u79FB\u52A8\u7AEF\u7684 locator.click() \u4ECD\u662F mouse \u8BED\u4E49\uFF1B\u8FD9\u91CC\u4F18\u5148\u5207\u5230 tap/touch\u3002\n if (\n target\n && resolvedDevice === Device.Mobile\n && !normalizedOptions.forceClick\n && !normalizedOptions.forceMouse\n ) {\n if (typeof target.tap === 'function') {\n await target.tap(normalizedOptions.tapOptions);\n return true;\n }\n\n const box = await getTargetBoundingBox(target);\n if (box) {\n await DeviceInput.clickPoint(page, {\n x: box.x + box.width / 2,\n y: box.y + box.height / 2,\n }, normalizedOptions);\n return true;\n }\n }\n\n if (!target || typeof target.click !== 'function') {\n throw new Error('DeviceInput click target does not expose click()');\n }\n\n await target.click(normalizedOptions.clickOptions || options);\n return true;\n};\n\nexport const DeviceInput = {\n device(page) {\n return resolveDeviceFromPage(page);\n },\n\n isMobile(page) {\n return resolveDeviceFromPage(page) === Device.Mobile;\n },\n\n async clickPoint(page, pointOrX, maybeY, options = {}) {\n assertPage(page, 'clickPoint');\n const clickOptions = isPoint(pointOrX) && maybeY && typeof maybeY === 'object'\n ? maybeY\n : options;\n const point = pointFromArgs(pointOrX, maybeY);\n assertPoint(point);\n\n if (\n resolveDeviceFromPage(page) === Device.Mobile\n && !clickOptions.forceMouse\n && page.touchscreen\n && typeof page.touchscreen.tap === 'function'\n ) {\n await page.touchscreen.tap(point.x, point.y);\n return true;\n }\n\n await page.mouse.click(point.x, point.y, clickOptions.mouseOptions || {});\n return true;\n },\n\n async tapPoint(page, pointOrX, maybeY, options = {}) {\n return DeviceInput.clickPoint(page, pointOrX, maybeY, options);\n },\n\n async click(page, target, options = {}) {\n assertPage(page, 'click');\n if (isPoint(target)) {\n return DeviceInput.clickPoint(page, target, undefined, options);\n }\n\n const nativeTarget = resolveNativeTarget(page, target);\n return clickTargetWithDevice(page, nativeTarget, options);\n },\n\n async tap(page, target, options = {}) {\n return DeviceInput.click(page, target, options);\n },\n\n async move(page, pointOrX, maybeY, options = {}) {\n assertPage(page, 'move');\n const moveOptions = isPoint(pointOrX) && maybeY && typeof maybeY === 'object'\n ? maybeY\n : options;\n const point = pointFromArgs(pointOrX, maybeY);\n assertPoint(point);\n\n // \u79FB\u52A8\u7AEF\u6CA1\u6709\u9F20\u6807 hover/move \u8BED\u4E49\uFF1B\u666E\u901A move \u89C6\u4E3A no-op\u3002\n if (resolveDeviceFromPage(page) === Device.Mobile && !moveOptions.forceMouse) {\n return true;\n }\n\n await page.mouse.move(point.x, point.y, moveOptions.mouseOptions || moveOptions);\n return true;\n },\n\n async focus(page, target, options = {}) {\n assertPage(page, 'focus');\n const nativeTarget = resolveNativeTarget(page, target);\n if (!nativeTarget || typeof nativeTarget.focus !== 'function') {\n throw new Error('DeviceInput focus target does not expose focus()');\n }\n\n await nativeTarget.focus(options);\n return true;\n },\n\n async fill(page, target, value, options = {}) {\n assertPage(page, 'fill');\n const nativeTarget = resolveNativeTarget(page, target);\n if (!nativeTarget || typeof nativeTarget.fill !== 'function') {\n throw new Error('DeviceInput fill target does not expose fill()');\n }\n\n await nativeTarget.fill(value, options);\n return true;\n },\n\n async keyboardType(page, text, options = {}) {\n assertPage(page, 'keyboardType');\n await page.keyboard.type(text, options);\n return true;\n },\n\n async type(page, targetOrText, maybeText, options = {}) {\n assertPage(page, 'type');\n if (maybeText == null || (typeof maybeText === 'object' && !Array.isArray(maybeText))) {\n return DeviceInput.keyboardType(page, targetOrText, maybeText || options);\n }\n\n const nativeTarget = resolveNativeTarget(page, targetOrText);\n if (!nativeTarget || typeof nativeTarget.type !== 'function') {\n throw new Error('DeviceInput type target does not expose type()');\n }\n\n await nativeTarget.type(maybeText, options);\n return true;\n },\n\n async press(page, targetOrKey, maybeKey, options = {}) {\n assertPage(page, 'press');\n const hasTarget = typeof maybeKey === 'string';\n const key = hasTarget ? maybeKey : targetOrKey;\n const pressOptions = hasTarget ? options : (maybeKey || options);\n\n if (hasTarget) {\n await DeviceInput.click(page, targetOrKey, pressOptions.clickOptions || {});\n }\n\n await page.keyboard.press(key, pressOptions.keyboardOptions || pressOptions);\n return true;\n },\n\n async selectorCenterPoint(page, selector, options = {}) {\n assertPage(page, 'selectorCenterPoint');\n const normalizedOptions = normalizeSelectorOptions(options);\n return page.evaluate(({ innerSelector, innerOptions }) => {\n const nodes = Array.from(document.querySelectorAll(innerSelector));\n const ordered = innerOptions.pick === 'last' ? nodes.reverse() : nodes;\n let rect = null;\n for (const node of ordered) {\n if (!node) continue;\n const target = innerOptions.targetParent ? (node.parentElement || node) : node;\n rect = target.getBoundingClientRect?.() || null;\n const isVisible = Boolean(rect && rect.width > 0 && rect.height > 0);\n if (innerOptions.visibleOnly && !isVisible) continue;\n break;\n }\n if (!rect || rect.width <= 0 || rect.height <= 0) return null;\n return {\n x: rect.left + rect.width / 2,\n y: rect.top + rect.height / 2,\n };\n }, { innerSelector: selector, innerOptions: normalizedOptions });\n },\n\n async domClick(page, selector, options = {}) {\n assertPage(page, 'domClick');\n // \u53EA\u7528\u4E8E\u6781\u7AEF\u517C\u5BB9\u515C\u5E95\uFF1A\u4E0D\u4F1A\u4EA7\u751F\u771F\u5B9E touch/mouse \u4E8B\u4EF6\u5E8F\u5217\u3002\n const normalizedOptions = normalizeSelectorOptions(options);\n return page.evaluate(({ innerSelector, innerOptions }) => {\n const nodes = Array.from(document.querySelectorAll(innerSelector));\n const ordered = innerOptions.pick === 'last' ? nodes.reverse() : nodes;\n let target = null;\n for (const node of ordered) {\n if (!node) continue;\n const candidate = innerOptions.targetParent ? (node.parentElement || node) : node;\n const rect = candidate.getBoundingClientRect?.() || null;\n const isVisible = Boolean(rect && rect.width > 0 && rect.height > 0);\n if (innerOptions.visibleOnly && !isVisible) continue;\n target = candidate;\n break;\n }\n if (!target || typeof target.click !== 'function') return false;\n target.click();\n return true;\n }, { innerSelector: selector, innerOptions: normalizedOptions });\n },\n\n async clickSelectorCenter(page, selector, options = {}) {\n assertPage(page, 'clickSelectorCenter');\n const normalizedOptions = normalizeSelectorOptions(options);\n\n try {\n const point = await DeviceInput.selectorCenterPoint(page, selector, normalizedOptions);\n if (point) {\n await DeviceInput.clickPoint(page, point, undefined, normalizedOptions);\n return true;\n }\n } catch (error) {\n if (!normalizedOptions.fallbackDomClick) throw error;\n }\n\n if (normalizedOptions.fallbackDomClick) {\n return DeviceInput.domClick(page, selector, normalizedOptions);\n }\n\n return false;\n },\n\n async clickText(frameOrPage, texts, options = {}) {\n for (const text of texts || []) {\n if (!text) continue;\n const candidates = [\n frameOrPage.getByText(text, { exact: false }).first(),\n frameOrPage.locator(`text=${text}`).first(),\n ];\n\n for (const candidate of candidates) {\n const isVisible = await candidate.isVisible({\n timeout: options.visibleTimeoutMs ?? options.actionVisibleTimeoutMs ?? 1500,\n }).catch(() => false);\n if (!isVisible) continue;\n\n const page = options.page\n || (frameOrPage && typeof frameOrPage.context === 'function' ? frameOrPage : null)\n || candidate.page?.();\n if (!page) {\n throw new Error('DeviceInput.clickText requires options.page when used with a frame locator');\n }\n await DeviceInput.click(page, candidate, options);\n return true;\n }\n }\n\n return false;\n },\n\n async drag(page, sourceLocator, targetLocator, options = {}) {\n assertPage(page, 'drag');\n const sourceBox = await sourceLocator.boundingBox();\n const targetBox = await targetLocator.boundingBox();\n\n if (!sourceBox || !targetBox) {\n throw new Error('Unable to resolve drag coordinates.');\n }\n\n const steps = options.steps || 10;\n const sourceOffsetX = toFiniteNumber(options.sourceOffsetX);\n const sourceOffsetY = toFiniteNumber(options.sourceOffsetY);\n const targetOffsetX = toFiniteNumber(options.targetOffsetX);\n const targetOffsetY = toFiniteNumber(options.targetOffsetY);\n const sourceCenterX = sourceBox.x + sourceBox.width / 2 + sourceOffsetX;\n const sourceCenterY = sourceBox.y + sourceBox.height / 2 + sourceOffsetY;\n const liftOffsetX = Math.min(18, Math.max(8, sourceBox.width * 0.12));\n const liftOffsetY = Math.min(12, Math.max(4, sourceBox.height * 0.08));\n const points = {\n start: {\n x: sourceCenterX,\n y: sourceCenterY,\n },\n lift: {\n x: sourceCenterX + liftOffsetX,\n y: sourceCenterY + liftOffsetY,\n },\n end: {\n x: targetBox.x + targetBox.width / 2 + targetOffsetX,\n y: targetBox.y + targetBox.height / 2 + targetOffsetY,\n },\n steps,\n };\n\n // drag \u662F\u8BBE\u5907\u8BED\u4E49\uFF1A\u79FB\u52A8\u7AEF\u53D1 touch drag\uFF0C\u684C\u9762\u7AEF\u53D1 mouse drag\u3002\n if (resolveDeviceFromPage(page) === Device.Mobile && !options.forceMouse) {\n try {\n return await dragWithTouch(page, points, options);\n } catch (error) {\n if (options.allowMouseFallback === false) throw error;\n }\n }\n\n return dragWithMouse(page, points, options);\n },\n};\n", "import { devices } from 'playwright';\nimport { Device, normalizeDevice } from './constants.js';\nimport { PageRuntimeStateKey } from './internals/constants.js';\n\nconst DEFAULT_MOBILE_DESCRIPTOR = 'Pixel 7';\n\nconst clonePlain = (value) => {\n if (!value || typeof value !== 'object') return value;\n try {\n return JSON.parse(JSON.stringify(value));\n } catch {\n return { ...value };\n }\n};\n\nconst resolveDescriptor = (descriptor, device) => {\n if (descriptor && typeof descriptor === 'object') {\n return descriptor;\n }\n\n const name = String(descriptor || (device === Device.Mobile ? DEFAULT_MOBILE_DESCRIPTOR : '')).trim();\n if (!name) return null;\n\n const resolved = devices[name];\n if (!resolved) {\n throw new Error(`DeviceView.withPageDevice unknown Playwright device descriptor: ${name}`);\n }\n return resolved;\n};\n\nconst attachRuntimeState = (page, state) => {\n Object.defineProperty(page, PageRuntimeStateKey, {\n configurable: true,\n enumerable: false,\n writable: true,\n value: state,\n });\n};\n\nconst restoreRuntimeState = (page, snapshot) => {\n if (snapshot.hadRuntimeState) {\n attachRuntimeState(page, snapshot.runtimeState);\n return;\n }\n delete page[PageRuntimeStateKey];\n};\n\nconst waitFor = (page, timeout) => {\n if (!timeout) return Promise.resolve();\n if (page && typeof page.waitForTimeout === 'function') {\n return page.waitForTimeout(timeout);\n }\n return new Promise((resolve) => setTimeout(resolve, timeout));\n};\n\nconst dispatchTouchTap = async (client, page, x, y) => {\n await client.send('Input.dispatchTouchEvent', {\n type: 'touchStart',\n touchPoints: [{ x, y, id: 1 }],\n });\n await waitFor(page, 30);\n await client.send('Input.dispatchTouchEvent', {\n type: 'touchEnd',\n touchPoints: [],\n });\n};\n\nconst installScopedTouchscreenTap = (page, client, enabled) => {\n if (!enabled || !page?.touchscreen || typeof page.touchscreen.tap !== 'function') {\n return () => {};\n }\n\n const originalTap = page.touchscreen.tap;\n page.touchscreen.tap = async (x, y) => {\n try {\n return await originalTap.call(page.touchscreen, x, y);\n } catch (error) {\n if (!String(error?.message || error).includes('hasTouch must be enabled')) {\n throw error;\n }\n return await dispatchTouchTap(client, page, x, y);\n }\n };\n\n return () => {\n page.touchscreen.tap = originalTap;\n };\n};\n\nconst buildScopedRuntimeState = (page, runtimeState, device) => ({\n ...(clonePlain(runtimeState || page?.[PageRuntimeStateKey] || {}) || {}),\n device,\n});\n\nconst applyDeviceEmulation = async (page, descriptor, device, options = {}) => {\n if (!descriptor) return { client: null, restoreTouchscreenTap: () => {} };\n\n const client = await page.context().newCDPSession(page);\n const viewport = descriptor.viewport || null;\n const isMobile = device === Device.Mobile || descriptor.isMobile === true;\n const hasTouch = device === Device.Mobile || descriptor.hasTouch === true;\n const deviceScaleFactor = Number(descriptor.deviceScaleFactor || 1);\n\n if (descriptor.userAgent) {\n await client.send('Emulation.setUserAgentOverride', {\n userAgent: descriptor.userAgent,\n platform: options.platform || (isMobile ? 'Android' : undefined),\n });\n }\n\n if (viewport?.width > 0 && viewport?.height > 0) {\n await page.setViewportSize({\n width: viewport.width,\n height: viewport.height,\n });\n await client.send('Emulation.setDeviceMetricsOverride', {\n width: viewport.width,\n height: viewport.height,\n deviceScaleFactor,\n mobile: isMobile,\n screenWidth: descriptor.screen?.width || viewport.width,\n screenHeight: descriptor.screen?.height || viewport.height,\n });\n }\n\n await client.send('Emulation.setTouchEmulationEnabled', {\n enabled: hasTouch,\n maxTouchPoints: hasTouch ? Number(options.maxTouchPoints || 5) : 0,\n });\n\n return {\n client,\n restoreTouchscreenTap: installScopedTouchscreenTap(page, client, hasTouch),\n };\n};\n\nconst restoreDeviceEmulation = async (page, emulation, snapshot) => {\n const client = emulation?.client;\n emulation?.restoreTouchscreenTap?.();\n if (!client) return;\n\n await client.send('Emulation.setTouchEmulationEnabled', { enabled: false }).catch(() => {});\n await client.send('Emulation.clearDeviceMetricsOverride').catch(() => {});\n\n if (snapshot.userAgent) {\n await client.send('Emulation.setUserAgentOverride', {\n userAgent: snapshot.userAgent,\n platform: snapshot.platform || undefined,\n }).catch(() => {});\n }\n\n if (snapshot.viewport) {\n await page.setViewportSize(snapshot.viewport).catch(() => {});\n }\n\n await client.detach().catch(() => {});\n};\n\nexport const DeviceView = {\n async withPageDevice(page, options = {}, callback) {\n if (!page || typeof page !== 'object') {\n throw new Error('DeviceView.withPageDevice requires a Playwright page');\n }\n if (typeof callback !== 'function') {\n throw new Error('DeviceView.withPageDevice requires a callback');\n }\n\n const device = normalizeDevice(options.device);\n const descriptor = resolveDescriptor(options.descriptor, device);\n const snapshot = {\n hadRuntimeState: Object.prototype.hasOwnProperty.call(page, PageRuntimeStateKey),\n runtimeState: clonePlain(page[PageRuntimeStateKey]),\n viewport: page.viewportSize?.() || null,\n userAgent: await page.evaluate(() => navigator.userAgent).catch(() => ''),\n platform: await page.evaluate(() => navigator.platform).catch(() => ''),\n };\n const runtimeState = buildScopedRuntimeState(page, options.runtimeState, device);\n let emulation = null;\n\n attachRuntimeState(page, runtimeState);\n try {\n emulation = await applyDeviceEmulation(page, descriptor, device, options);\n return await callback({\n page,\n device,\n descriptor,\n runtimeState,\n });\n } finally {\n restoreRuntimeState(page, snapshot);\n await restoreDeviceEmulation(page, emulation, snapshot);\n }\n },\n};\n", "import delay from 'delay';\nimport { DefaultHumanizeDevice } from './default.js';\nimport { CloakHumanizeInput } from './cloak.js';\nimport { jitterMs as sharedJitterMs } from './shared.js';\n\nexport const HumanizeCommon = {\n jitterMs(base, jitterPercent = 0.3) {\n return sharedJitterMs(base, jitterPercent);\n },\n\n async randomSleep(pageOrBaseMs, maybeBaseMs, maybeJitterPercent) {\n const hasPage = pageOrBaseMs && typeof pageOrBaseMs === 'object' && typeof pageOrBaseMs.evaluate === 'function';\n const baseMs = hasPage ? maybeBaseMs : pageOrBaseMs;\n const jitterPercent = hasPage ? maybeJitterPercent : maybeBaseMs;\n await delay(sharedJitterMs(baseMs, jitterPercent ?? 0.3));\n },\n};\n\nexport const DefaultHumanize = Object.assign({}, DefaultHumanizeDevice, HumanizeCommon);\nexport const CloakHumanize = Object.assign({}, CloakHumanizeInput, HumanizeCommon);\n", "import delay from 'delay';\nimport { createCursor } from 'ghost-cursor-playwright';\nimport { createInternalLogger } from '../logger.js';\n\nconst logger = createInternalLogger('Humanize');\n\n// \u5185\u90E8 cursor \u5B9E\u4F8B\u7F13\u5B58 (\u6BCF\u4E2A page \u4E00\u4E2A) - \u4E0D\u5BF9\u5916\u66B4\u9732\nconst $CursorWeakMap = new WeakMap();\n\n/**\n * \u5185\u90E8\u65B9\u6CD5\uFF1A\u83B7\u53D6\u9875\u9762\u7684 cursor\uFF0C\u5982\u679C\u4E0D\u5B58\u5728\u5219\u629B\u51FA\u9519\u8BEF\n */\nfunction $GetCursor(page) {\n const cursor = $CursorWeakMap.get(page);\n if (!cursor) {\n throw new Error('Cursor \u672A\u521D\u59CB\u5316\uFF0C\u8BF7\u5148\u8C03\u7528 Humanize.initializeCursor(page)');\n }\n return cursor;\n}\n\nexport const Humanize = {\n /**\n * \u751F\u6210\u5E26\u6296\u52A8\u7684\u6BEB\u79D2\u6570 - \u57FA\u4E8E\u57FA\u7840\u503C\u6DFB\u52A0\u968F\u673A\u6D6E\u52A8 (\u00B130% \u9ED8\u8BA4)\n * @param {number} base - \u57FA\u7840\u5EF6\u8FDF (ms)\n * @param {number} [jitterPercent=0.3] - \u6296\u52A8\u767E\u5206\u6BD4 (0.3 = \u00B130%)\n * @returns {number} \u6296\u52A8\u540E\u7684\u6BEB\u79D2\u6570\n */\n jitterMs(base, jitterPercent = 0.3) {\n const jitter = base * jitterPercent * (Math.random() * 2 - 1);\n return Math.max(10, Math.round(base + jitter));\n },\n\n /**\n * \u521D\u59CB\u5316\u9875\u9762\u7684 Ghost Cursor\uFF08\u5FC5\u987B\u5728\u4F7F\u7528\u5176\u4ED6 cursor \u76F8\u5173\u65B9\u6CD5\u524D\u8C03\u7528\uFF09\n *\n * @param {import('playwright').Page} page\n * @returns {Promise<void>}\n */\n async initializeCursor(page) {\n if ($CursorWeakMap.has(page)) {\n logger.debug('initializeCursor: cursor already exists, skipping');\n return;\n }\n logger.start('initializeCursor', 'creating cursor');\n const cursor = await createCursor(page);\n $CursorWeakMap.set(page, cursor);\n logger.success('initializeCursor', 'cursor initialized');\n },\n\n /**\n * \u4EBA\u7C7B\u5316\u9F20\u6807\u79FB\u52A8 - \u4F7F\u7528 ghost-cursor \u79FB\u52A8\u5230\u6307\u5B9A\u4F4D\u7F6E\u6216\u5143\u7D20\n *\n * @param {import('playwright').Page} page\n * @param {string|{x: number, y: number}|import('playwright').ElementHandle} target - CSS\u9009\u62E9\u5668\u3001\u5750\u6807\u5BF9\u8C61\u6216\u5143\u7D20\u53E5\u67C4\n */\n async humanMove(page, target) {\n const cursor = $GetCursor(page);\n logger.start('humanMove', `target=${typeof target === 'string' ? target : 'element/coords'}`);\n try {\n if (typeof target === 'string') {\n // \u684C\u9762\u7AEF\u79FB\u52A8\u4ECD\u7136\u8D70\u771F\u5B9E\u9F20\u6807\u8F68\u8FF9\uFF0C\u53EA\u662F\u5148\u628A\u9009\u62E9\u5668\u6362\u7B97\u6210\u5143\u7D20\u51E0\u4F55\u4E2D\u5FC3\u3002\n const element = await page.$(target);\n if (!element) {\n logger.warn(`humanMove: \u5143\u7D20\u4E0D\u5B58\u5728 ${target}`);\n return false;\n }\n const box = await element.boundingBox();\n if (!box) {\n logger.warn(`humanMove: \u65E0\u6CD5\u83B7\u53D6\u4F4D\u7F6E ${target}`);\n return false;\n }\n const x = box.x + box.width / 2 + (Math.random() - 0.5) * box.width * 0.2;\n const y = box.y + box.height / 2 + (Math.random() - 0.5) * box.height * 0.2;\n await cursor.actions.move({ x, y });\n } else if (target && typeof target.x === 'number' && typeof target.y === 'number') {\n // \u7EAF\u5750\u6807\u76EE\u6807\u4E0D\u518D\u505A\u989D\u5916\u8BED\u4E49\u5904\u7406\u3002\n await cursor.actions.move(target);\n } else if (target && typeof target.boundingBox === 'function') {\n // ElementHandle \u540C\u6837\u53EA\u505A\u51E0\u4F55\u6362\u7B97\uFF0C\u4E0D\u6539\u5199\u539F\u59CB\u4EA4\u4E92\u542B\u4E49\u3002\n const box = await target.boundingBox();\n if (box) {\n const x = box.x + box.width / 2 + (Math.random() - 0.5) * box.width * 0.2;\n const y = box.y + box.height / 2 + (Math.random() - 0.5) * box.height * 0.2;\n await cursor.actions.move({ x, y });\n }\n }\n logger.success('humanMove');\n return true;\n } catch (error) {\n logger.fail('humanMove', error);\n throw error;\n }\n },\n\n /**\n * \u6E10\u8FDB\u5F0F\u6EDA\u52A8\u5230\u5143\u7D20\u53EF\u89C1\uFF08\u4EC5\u5904\u7406 Y \u8F74\u6EDA\u52A8\uFF09\n * \u8FD4\u56DE restore \u65B9\u6CD5\uFF0C\u7528\u4E8E\u5C06\u6EDA\u52A8\u5BB9\u5668\u6062\u590D\u5230\u539F\u4F4D\u7F6E\n *\n * @param {import('playwright').Page} page\n * @param {string|import('playwright').ElementHandle} target - CSS \u9009\u62E9\u5668\u6216\u5143\u7D20\u53E5\u67C4\n * @param {Object} [options]\n * @param {number} [options.maxSteps=20] - \u6700\u5927\u6EDA\u52A8\u6B65\u6570\n * @param {number} [options.minStep=260] - \u5355\u6B21\u6EDA\u52A8\u6700\u5C0F\u6B65\u957F\n * @param {number} [options.maxStep=800] - \u5355\u6B21\u6EDA\u52A8\u6700\u5927\u6B65\u957F\n * @param {number} [options.maxDurationMs] - \u6700\u957F\u8017\u65F6\u4E0A\u9650 (\u9ED8\u8BA4\u968F maxSteps \u4F30\u7B97)\n */\n async humanScroll(page, target, options = {}) {\n const {\n maxSteps = 20,\n minStep = 260,\n maxStep = 800,\n maxDurationMs = maxSteps * 220 + 800\n } = options;\n const targetDesc = typeof target === 'string' ? target : 'ElementHandle';\n\n logger.start('humanScroll', `target=${targetDesc}`);\n\n let element;\n if (typeof target === 'string') {\n element = await page.$(target);\n if (!element) {\n logger.warn(`humanScroll | \u5143\u7D20\u672A\u627E\u5230: ${target}`);\n return { element: null, didScroll: false };\n }\n } else {\n element = target;\n }\n\n const cursor = $GetCursor(page);\n let didScroll = false;\n\n // \u684C\u9762\u7AEF\u5148\u786E\u8BA4\u201C\u662F\u5426\u771F\u9700\u8981\u6EDA\u201D\uFF0C\u907F\u514D\u628A\u56FA\u5B9A\u5BB9\u5668\u6216\u5DF2\u7ECF\u53EF\u89C1\u7684\u5143\u7D20\u6EDA\u4E71\u3002\n const checkVisibility = async () => {\n return await element.evaluate((el) => {\n const rect = el.getBoundingClientRect();\n if (!rect || rect.width === 0 || rect.height === 0) {\n return { code: 'ZERO_DIMENSIONS', reason: '\u5C3A\u5BF8\u4E3A\u96F6' };\n }\n\n const cx = rect.left + rect.width / 2;\n const cy = rect.top + rect.height / 2;\n const viewH = window.innerHeight;\n const viewW = window.innerWidth;\n let isFixed = false;\n\n for (let node = el; node && node !== document.body; node = node.parentElement) {\n const style = window.getComputedStyle(node);\n if (style && style.position === 'fixed') {\n isFixed = true;\n break;\n }\n }\n\n // 1. \u5148\u770B\u51E0\u4F55\u4F4D\u7F6E\u662F\u5426\u5DF2\u7ECF\u843D\u5728\u89C6\u53E3\u91CC\u3002\n if (cy < 0 || cy > viewH || cx < 0 || cx > viewW) {\n // \u9700\u8981\u6EDA\u52A8\u65F6\uFF0C\u5148\u6839\u636E\u4E2D\u5FC3\u70B9\u4F4D\u7F6E\u63A8\u65AD\u65B9\u5411\u3002\n const direction = cy < 0 ? 'up' : (cy > viewH ? 'down' : 'unknown');\n return { code: 'OUT_OF_VIEWPORT', reason: '\u4E0D\u5728\u89C6\u53E3\u5185', direction, cy, viewH, isFixed };\n }\n\n // 2. \u518D\u68C0\u67E5\u4E2D\u5FC3\u70B9\u662F\u5426\u88AB\u522B\u7684\u5143\u7D20\u76D6\u4F4F\u3002\n const pointElement = document.elementFromPoint(cx, cy);\n if (pointElement && !el.contains(pointElement) && !pointElement.contains(el)) {\n return {\n code: 'OBSTRUCTED',\n reason: '\u88AB\u906E\u6321',\n obstruction: {\n tag: pointElement.tagName,\n id: pointElement.id,\n className: pointElement.className\n },\n cy, // Return Center Y for smart direction calculation\n viewH,\n isFixed\n };\n }\n\n return { code: 'VISIBLE', isFixed };\n });\n };\n\n const getScrollableRect = async () => {\n // \u53EA\u5728\u76EE\u6807\u7956\u5148\u94FE\u91CC\u627E\u771F\u6B63\u53EF\u6EDA\u52A8\u7684\u5BB9\u5668\uFF0C\u4E0D\u628A\u6574\u4E2A window \u5F53\u6210\u9ED8\u8BA4\u7B54\u6848\u3002\n return await element.evaluate((el) => {\n const isScrollable = (node) => {\n const style = window.getComputedStyle(node);\n if (!style) return false;\n const overflowY = style.overflowY;\n if (!['auto', 'scroll', 'overlay'].includes(overflowY)) return false;\n return node.scrollHeight > node.clientHeight + 1;\n };\n\n let current = el;\n while (current && current !== document.body) {\n if (isScrollable(current)) {\n const rect = current.getBoundingClientRect();\n if (rect && rect.width > 0 && rect.height > 0) {\n return { x: rect.x, y: rect.y, width: rect.width, height: rect.height };\n }\n }\n current = current.parentElement;\n }\n\n return null;\n });\n };\n\n const startTime = Date.now();\n\n try {\n for (let i = 0; i < maxSteps; i++) {\n if (Date.now() - startTime > maxDurationMs) {\n logger.warn(`humanScroll | \u8D85\u65F6\u4FDD\u62A4\u89E6\u53D1 (${maxDurationMs}ms)`);\n return { element, didScroll };\n }\n\n const status = await checkVisibility();\n\n if (status.code === 'VISIBLE') {\n if (status.isFixed) {\n logger.info('humanScroll | fixed \u5BB9\u5668\u5185\uFF0C\u8DF3\u8FC7\u6EDA\u52A8');\n } else {\n logger.debug('humanScroll | \u5143\u7D20\u53EF\u89C1\u4E14\u65E0\u906E\u6321');\n }\n logger.success('humanScroll', didScroll ? '\u5DF2\u6EDA\u52A8' : '\u65E0\u9700\u6EDA\u52A8');\n return { element, didScroll };\n }\n\n logger.debug(`humanScroll | \u6B65\u9AA4 ${i + 1}/${maxSteps}: ${status.reason} ${status.direction ? `(${status.direction})` : ''}`);\n\n if (status.code === 'OBSTRUCTED' && status.obstruction) {\n logger.debug(`humanScroll | \u88AB\u4EE5\u4E0B\u5143\u7D20\u906E\u6321 <${status.obstruction.tag} id=\"${status.obstruction.id}\">`);\n }\n\n const scrollRect = await getScrollableRect();\n if (!scrollRect && status.isFixed) {\n logger.warn('humanScroll | fixed \u5BB9\u5668\u5185\u4E14\u65E0\u53EF\u6EDA\u52A8\u7956\u5148\uFF0C\u8DF3\u8FC7\u6EDA\u52A8');\n return { element, didScroll };\n }\n\n const stepMin = scrollRect ? Math.min(minStep, Math.max(60, scrollRect.height * 0.4)) : minStep;\n const stepMax = scrollRect ? Math.min(maxStep, Math.max(stepMin + 40, scrollRect.height * 0.8)) : maxStep;\n\n // \u6839\u636E\u201C\u51FA\u89C6\u53E3 / \u906E\u6321\u201D\u4E24\u79CD\u72B6\u6001\u5206\u522B\u51B3\u5B9A\u6EDA\u52A8\u65B9\u5411\u548C\u8DDD\u79BB\u3002\n let deltaY = 0;\n if (status.code === 'OUT_OF_VIEWPORT') {\n if (status.direction === 'down') {\n deltaY = stepMin + Math.random() * (stepMax - stepMin);\n } else if (status.direction === 'up') {\n deltaY = -(stepMin + Math.random() * (stepMax - stepMin));\n } else {\n // \u6C34\u5E73\u95EE\u9898\u6216\u5947\u602A\u72B6\u6001\uFF0C\u5C1D\u8BD5\u5411\u4E0B\u6EDA\u52A8\u4E00\u70B9\n deltaY = 100;\n }\n } else if (status.code === 'OBSTRUCTED') {\n // \u906E\u6321\u573A\u666F\u4F18\u5148\u6839\u636E\u5143\u7D20\u843D\u70B9\u63A8\u65B9\u5411\uFF0C\u5C3D\u91CF\u6A21\u62DF\u4EBA\u5DE5\u201C\u5F80\u66F4\u53EF\u80FD\u9732\u51FA\u7684\u65B9\u5411\u518D\u8BD5\u4E00\u6B21\u201D\u3002\n const halfY = scrollRect ? (scrollRect.y + scrollRect.height / 2) : (status.viewH / 2);\n const isBottomHalf = status.cy > halfY;\n const direction = isBottomHalf ? 1 : -1;\n\n // \u57FA\u7840\u6EDA\u52A8\u91CF\u518D\u53E0\u4E00\u70B9\u968F\u673A\u6CE2\u52A8\uFF0C\u4FDD\u6301\u884C\u4E3A\u4E0D\u90A3\u4E48\u673A\u68B0\u3002\n deltaY = direction * (stepMin + Math.random() * 50);\n }\n\n // \u9996\u6B21\u6EDA\u52A8\u524D\u628A\u9F20\u6807\u653E\u5230\u66F4\u53EF\u80FD\u63A5\u6536\u6EDA\u8F6E\u4E8B\u4EF6\u7684\u4F4D\u7F6E\u3002\n if (i === 0) {\n const viewSize = page.viewportSize();\n if (scrollRect) {\n const safeX = scrollRect.x + scrollRect.width * 0.5 + (Math.random() - 0.5) * Math.min(80, scrollRect.width * 0.4);\n const safeY = scrollRect.y + scrollRect.height * 0.5 + (Math.random() - 0.5) * Math.min(80, scrollRect.height * 0.4);\n await cursor.actions.move({ x: safeX, y: safeY });\n } else if (viewSize) {\n const safeX = viewSize.width * 0.5 + (Math.random() - 0.5) * 80;\n const safeY = viewSize.height * 0.5 + (Math.random() - 0.5) * 80;\n await cursor.actions.move({ x: safeX, y: safeY });\n }\n }\n\n // \u6267\u884C\u6EDA\u52A8\n await page.mouse.wheel(0, deltaY);\n didScroll = true;\n\n // \u7B49\u5F85\u6EDA\u52A8\u7A33\u5B9A - \u7D27\u51D1\u8282\u594F (20ms - 60ms)\n await delay(this.jitterMs(20 + Math.random() * 40, 0.2));\n }\n\n logger.warn(`humanScroll | \u5728 ${maxSteps} \u6B65\u540E\u65E0\u6CD5\u786E\u4FDD\u53EF\u89C1\u6027`);\n return { element, didScroll };\n\n } catch (error) {\n logger.fail('humanScroll', error);\n throw error;\n }\n },\n\n /**\n * \u4EBA\u7C7B\u5316\u70B9\u51FB - \u4F7F\u7528 ghost-cursor \u6A21\u62DF\u4EBA\u7C7B\u9F20\u6807\u79FB\u52A8\u8F68\u8FF9\u5E76\u70B9\u51FB\n *\n * @param {import('playwright').Page} page\n * @param {string|import('playwright').ElementHandle} [target] - CSS \u9009\u62E9\u5668\u6216\u5143\u7D20\u53E5\u67C4\u3002\u5982\u679C\u4E3A\u7A7A\uFF0C\u5219\u70B9\u51FB\u5F53\u524D\u9F20\u6807\u4F4D\u7F6E\n * @param {Object} [options]\n * @param {number} [options.reactionDelay=250] - \u53CD\u5E94\u5EF6\u8FDF\u57FA\u7840\u503C (ms)\uFF0C\u5B9E\u9645 \u00B130% \u6296\u52A8\n * @param {boolean} [options.throwOnMissing=true] - \u5143\u7D20\u4E0D\u5B58\u5728\u65F6\u662F\u5426\u629B\u51FA\u9519\u8BEF\n * @param {boolean} [options.scrollIfNeeded=true] - \u5143\u7D20\u4E0D\u5728\u89C6\u53E3\u65F6\u662F\u5426\u81EA\u52A8\u6EDA\u52A8\n */\n async humanClick(page, target, options = {}) {\n const cursor = $GetCursor(page);\n\n // \u589E\u52A0 restore \u9009\u9879\uFF0C\u9ED8\u8BA4 false (\u4E0D\u8FD8\u539F\u6EDA\u52A8\u4F4D\u7F6E)\n const { reactionDelay = 250, throwOnMissing = true, scrollIfNeeded = true, restore = false } = options;\n\n const targetDesc = target == null ? 'Current Position' : (typeof target === 'string' ? target : 'ElementHandle');\n logger.start('humanClick', `target=${targetDesc}`);\n\n\n const restoreOnce = async () => {\n if (restoreOnce.restored) return;\n restoreOnce.restored = true;\n\n if (typeof restoreOnce.do !== 'function') return;\n try {\n await delay(this.jitterMs(1000));\n await restoreOnce.do();\n } catch (restoreError) {\n logger.warn(`humanClick: \u6062\u590D\u6EDA\u52A8\u4F4D\u7F6E\u5931\u8D25: ${restoreError.message}`);\n }\n };\n\n\n try {\n // Case 1: \u70B9\u51FB\u5F53\u524D\u4F4D\u7F6E (target \u4E3A null/undefined)\n if (target == null) {\n // \u4EC5\u6267\u884C\u53CD\u5E94\u5EF6\u8FDF + \u70B9\u51FB\n await delay(this.jitterMs(reactionDelay, 0.4));\n await cursor.actions.click();\n logger.success('humanClick', 'Clicked current position');\n return true;\n }\n\n // Case 2: \u70B9\u51FB\u6307\u5B9A\u76EE\u6807\n let element;\n if (typeof target === 'string') {\n element = await page.$(target);\n if (!element) {\n if (throwOnMissing) {\n throw new Error(`\u627E\u4E0D\u5230\u5143\u7D20 ${target}`);\n }\n logger.warn(`humanClick: \u5143\u7D20\u4E0D\u5B58\u5728\uFF0C\u8DF3\u8FC7\u70B9\u51FB ${target}`);\n return false;\n }\n } else {\n element = target;\n }\n\n if (scrollIfNeeded) {\n const { restore: restoreFn, didScroll } = await this.humanScroll(page, element);\n // \u4EC5\u5728 didScroll \u4E3A true \u4E14 options.restore \u4E3A true \u65F6\u624D\u8FD8\u539F\n restoreOnce.do = (didScroll && restore) ? restoreFn : null;\n }\n\n const box = await element.boundingBox();\n if (!box) {\n await restoreOnce();\n if (throwOnMissing) {\n throw new Error('\u65E0\u6CD5\u83B7\u53D6\u5143\u7D20\u4F4D\u7F6E');\n }\n logger.warn('humanClick: \u65E0\u6CD5\u83B7\u53D6\u4F4D\u7F6E\uFF0C\u8DF3\u8FC7\u70B9\u51FB');\n return false;\n }\n\n const x = box.x + box.width / 2 + (Math.random() - 0.5) * box.width * 0.3;\n const y = box.y + box.height / 2 + (Math.random() - 0.5) * box.height * 0.3;\n\n await cursor.actions.move({ x, y });\n await delay(this.jitterMs(reactionDelay, 0.4));\n await cursor.actions.click();\n\n await restoreOnce();\n\n logger.success('humanClick');\n return true;\n } catch (error) {\n await restoreOnce();\n logger.fail('humanClick', error);\n throw error;\n }\n },\n\n /**\n * \u968F\u673A\u5EF6\u8FDF\u4E00\u6BB5\u6BEB\u79D2\u6570\uFF08\u5E26 \u00B130% \u6296\u52A8\uFF09\n * @param {number} baseMs - \u57FA\u7840\u5EF6\u8FDF\u6BEB\u79D2\u6570\n * @param {number} [jitterPercent=0.3] - \u6296\u52A8\u767E\u5206\u6BD4\n */\n async randomSleep(baseMs, jitterPercent = 0.3) {\n const ms = this.jitterMs(baseMs, jitterPercent);\n logger.start('randomSleep', `base=${baseMs}, actual=${ms}ms`);\n await delay(ms);\n logger.success('randomSleep');\n },\n\n /**\n * \u6A21\u62DF\u4EBA\u7C7B\"\u6CE8\u89C6\"\u6216\"\u9605\u8BFB\"\u884C\u4E3A\uFF1A\u9F20\u6807\u5728\u9875\u9762\u4E0A\u968F\u673A\u5FAE\u52A8\n * @param {import('playwright').Page} page\n * @param {number} [baseDurationMs=2500] - \u57FA\u7840\u6301\u7EED\u65F6\u95F4 (\u00B140% \u6296\u52A8)\n */\n async simulateGaze(page, baseDurationMs = 2500) {\n const cursor = $GetCursor(page);\n const durationMs = this.jitterMs(baseDurationMs, 0.4);\n logger.start('simulateGaze', `duration=${durationMs}ms`);\n const startTime = Date.now();\n const viewportSize = page.viewportSize() || { width: 1920, height: 1080 };\n\n while (Date.now() - startTime < durationMs) {\n // \u5728\u89C6\u53E3\u8303\u56F4\u5185\u968F\u673A\u79FB\u52A8\n const x = 100 + Math.random() * (viewportSize.width - 200);\n const y = 100 + Math.random() * (viewportSize.height - 200);\n await cursor.actions.move({ x, y });\n // \u6CE8\u89C6\u505C\u7559 300-1200ms\n await delay(this.jitterMs(600, 0.5));\n }\n logger.success('simulateGaze');\n },\n\n /**\n * \u4EBA\u7C7B\u5316\u8F93\u5165 - \u5E26\u8282\u594F\u53D8\u5316\uFF08\u5FEB-\u6162-\u505C\u987F-\u5076\u5C14\u52A0\u901F\uFF09\n * @param {import('playwright').Page} page\n * @param {string} selector - \u8F93\u5165\u6846\u9009\u62E9\u5668\n * @param {string} text - \u8981\u8F93\u5165\u7684\u6587\u672C\n * @param {Object} [options]\n * @param {number} [options.baseDelay=180] - \u57FA\u7840\u6309\u952E\u5EF6\u8FDF (ms)\uFF0C\u5B9E\u9645 \u00B140% \u6296\u52A8\n * @param {number} [options.pauseProbability=0.08] - \u505C\u987F\u6982\u7387 (0-1)\n * @param {number} [options.pauseBase=800] - \u505C\u987F\u65F6\u957F\u57FA\u7840\u503C (ms)\uFF0C\u5B9E\u9645 \u00B150% \u6296\u52A8\n */\n async humanType(page, selector, text, options = {}) {\n logger.start('humanType', `selector=${selector}, textLen=${text.length}`);\n const {\n baseDelay = 180,\n pauseProbability = 0.08,\n pauseBase = 800\n } = options;\n\n try {\n const locator = page.locator(selector);\n await Humanize.humanClick(page, locator);\n\n // \u70B9\u51FB\u540E\u601D\u8003\u5EF6\u8FDF\n await delay(this.jitterMs(200, 0.4));\n\n for (let i = 0; i < text.length; i++) {\n const char = text[i];\n let charDelay;\n\n if (char === ' ') {\n // \u7A7A\u683C\u952E\u7A0D\u5FEB\n charDelay = this.jitterMs(baseDelay * 0.6, 0.3);\n } else if (/[,.!?;:\uFF0C\u3002\uFF01\uFF1F\uFF1B\uFF1A]/.test(char)) {\n // \u6807\u70B9\u7B26\u53F7\u540E\u7A0D\u6162\uFF08\u6A21\u62DF\u601D\u8003\uFF09\n charDelay = this.jitterMs(baseDelay * 1.5, 0.4);\n } else {\n // \u666E\u901A\u5B57\u7B26\n charDelay = this.jitterMs(baseDelay, 0.4);\n }\n\n await page.keyboard.type(char);\n await delay(charDelay);\n\n // \u968F\u673A\u505C\u987F\uFF08\u6A21\u62DF\u601D\u8003/\u56DE\u987E\uFF09\n if (Math.random() < pauseProbability && i < text.length - 1) {\n const pauseTime = this.jitterMs(pauseBase, 0.5);\n logger.debug(`\u505C\u987F ${pauseTime}ms...`);\n await delay(pauseTime);\n }\n }\n logger.success('humanType');\n } catch (error) {\n logger.fail('humanType', error);\n throw error;\n }\n },\n\n /**\n * \u4EBA\u7C7B\u5316\u6309\u952E - \u6A21\u62DF\u7528\u6237\u5728\u5F53\u524D\u7126\u70B9\u6216\u6307\u5B9A\u76EE\u6807\u4E0A\u6309\u4E0B\u4E00\u6B21\u952E\u3002\n * @param {import('playwright').Page} page\n * @param {string|import('playwright').ElementHandle|import('playwright').Locator} targetOrKey - \u76EE\u6807\u6216\u6309\u952E\n * @param {string|Object} [maybeKey] - \u6309\u952E\u6216\u9009\u9879\n * @param {Object} [options]\n */\n async humanPress(page, targetOrKey, maybeKey, options = {}) {\n const hasTarget = typeof maybeKey === 'string';\n const key = hasTarget ? maybeKey : targetOrKey;\n const pressOptions = hasTarget ? options : (maybeKey || options);\n const {\n reactionDelay = 180,\n holdDelay = 45,\n focusDelay = 180,\n scrollIfNeeded = true,\n throwOnMissing = true,\n keyboardOptions = {},\n } = pressOptions || {};\n const targetDesc = hasTarget\n ? (typeof targetOrKey === 'string' ? targetOrKey : 'ElementHandle')\n : 'current focus';\n\n logger.start('humanPress', `key=${key}, target=${targetDesc}`);\n\n try {\n if (hasTarget) {\n await this.humanClick(page, targetOrKey, { reactionDelay: focusDelay, scrollIfNeeded, throwOnMissing });\n }\n\n await delay(this.jitterMs(reactionDelay, 0.45));\n await page.keyboard.press(key, {\n ...keyboardOptions,\n delay: this.jitterMs(holdDelay, 0.5),\n });\n logger.success('humanPress');\n return true;\n } catch (error) {\n logger.fail('humanPress', error);\n throw error;\n }\n },\n\n /**\n * \u4EBA\u7C7B\u5316\u6E05\u7A7A\u8F93\u5165\u6846 - \u6A21\u62DF\u4EBA\u7C7B\u5220\u9664\u6587\u672C\u7684\u884C\u4E3A\n * @param {import('playwright').Page} page\n * @param {string} selector - \u8F93\u5165\u6846\u9009\u62E9\u5668\n */\n async humanClear(page, selector) {\n logger.start('humanClear', `selector=${selector}`);\n try {\n const locator = page.locator(selector);\n await locator.click();\n await delay(this.jitterMs(200, 0.4));\n\n const currentValue = await locator.inputValue();\n if (!currentValue || currentValue.length === 0) {\n logger.success('humanClear', 'already empty');\n return;\n }\n\n // \u5168\u9009 + \u5220\u9664\n await page.keyboard.press('Meta+A');\n await delay(this.jitterMs(100, 0.4));\n await page.keyboard.press('Backspace');\n\n logger.success('humanClear');\n } catch (error) {\n logger.fail('humanClear', error);\n throw error;\n }\n },\n\n /**\n * \u9875\u9762\u9884\u70ED\u6D4F\u89C8 - \u6A21\u62DF\u4EBA\u7C7B\u8FDB\u5165\u9875\u9762\u540E\u7684\u63A2\u7D22\u884C\u4E3A\n * @param {import('playwright').Page} page\n * @param {number} [baseDuration=3500] - \u9884\u70ED\u65F6\u957F\u57FA\u7840\u503C (\u00B140% \u6296\u52A8)\n */\n async warmUpBrowsing(page, baseDuration = 3500) {\n const cursor = $GetCursor(page);\n const durationMs = this.jitterMs(baseDuration, 0.4);\n\n logger.start('warmUpBrowsing', `duration=${durationMs}ms`);\n const startTime = Date.now();\n const viewportSize = page.viewportSize() || { width: 1920, height: 1080 };\n\n try {\n while (Date.now() - startTime < durationMs) {\n const action = Math.random();\n\n if (action < 0.4) {\n // \u9F20\u6807\u79FB\u52A8\n const x = 100 + Math.random() * (viewportSize.width - 200);\n const y = 100 + Math.random() * (viewportSize.height - 200);\n await cursor.actions.move({ x, y });\n await delay(this.jitterMs(350, 0.4));\n } else if (action < 0.7) {\n // \u6EDA\u52A8\n const scrollY = (Math.random() - 0.5) * 200;\n await page.mouse.wheel(0, scrollY);\n await delay(this.jitterMs(500, 0.4));\n } else {\n // \u505C\u987F/\u6CE8\u89C6\n await delay(this.jitterMs(800, 0.5));\n }\n }\n logger.success('warmUpBrowsing');\n } catch (error) {\n logger.fail('warmUpBrowsing', error);\n throw error;\n }\n },\n\n /**\n * \u81EA\u7136\u6EDA\u52A8 - \u5E26\u60EF\u6027\u3001\u51CF\u901F\u6548\u679C\u548C\u968F\u673A\u6296\u52A8\n * @param {import('playwright').Page} page\n * @param {'up' | 'down'} [direction='down'] - \u6EDA\u52A8\u65B9\u5411\n * @param {number} [distance=300] - \u603B\u6EDA\u52A8\u8DDD\u79BB\u57FA\u7840\u503C (px)\uFF0C\u00B115% \u6296\u52A8\n * @param {number} [baseSteps=5] - \u5206\u51E0\u6B65\u5B8C\u6210\u57FA\u7840\u503C\uFF0C\u00B11 \u968F\u673A\n */\n async naturalScroll(page, direction = 'down', distance = 300, baseSteps = 5) {\n // steps \u52A0\u968F\u673A\u6D6E\u52A8 \u00B11\n const steps = Math.max(3, baseSteps + Math.floor(Math.random() * 3) - 1);\n // distance \u52A0\u6296\u52A8\n const actualDistance = this.jitterMs(distance, 0.15);\n\n logger.start('naturalScroll', `dir=${direction}, dist=${actualDistance}, steps=${steps}`);\n const sign = direction === 'down' ? 1 : -1;\n const stepDistance = actualDistance / steps;\n\n try {\n for (let i = 0; i < steps; i++) {\n // \u60EF\u6027\u51CF\u901F\u56E0\u5B50\n const factor = 1 - (i / steps) * 0.5;\n // \u6BCF\u6B65\u52A0 \u00B110% \u6296\u52A8\n const jitter = 0.9 + Math.random() * 0.2;\n const scrollAmount = stepDistance * factor * sign * jitter;\n\n await page.mouse.wheel(0, scrollAmount);\n\n // \u5EF6\u8FDF\u4E5F\u5E26\u6296\u52A8\n const baseDelay = 60 + i * 25;\n await delay(this.jitterMs(baseDelay, 0.3));\n }\n logger.success('naturalScroll');\n } catch (error) {\n logger.fail('naturalScroll', error);\n throw error;\n }\n }\n}\n", "import delay from 'delay';\n\nexport const jitterMs = (base, jitterPercent = 0.3) => {\n const jitter = Number(base || 0) * Number(jitterPercent || 0) * (Math.random() * 2 - 1);\n return Math.max(10, Math.round(Number(base || 0) + jitter));\n};\n\nexport const randomPointInBox = (box, paddingRatio = 0.24) => {\n const safePaddingX = Math.max(2, Math.min(box.width * paddingRatio, box.width / 2));\n const safePaddingY = Math.max(2, Math.min(box.height * paddingRatio, box.height / 2));\n const x = box.x + safePaddingX + Math.random() * Math.max(1, box.width - safePaddingX * 2);\n const y = box.y + safePaddingY + Math.random() * Math.max(1, box.height - safePaddingY * 2);\n return { x, y };\n};\n\nexport const resolveElement = async (page, target, { throwOnMissing = true } = {}) => {\n if (target == null) return null;\n\n let element = target;\n if (typeof target === 'string') {\n element = await page.$(target);\n }\n\n if (!element) {\n if (throwOnMissing) {\n throw new Error(`\u627E\u4E0D\u5230\u5143\u7D20 ${String(target)}`);\n }\n return null;\n }\n\n return element;\n};\n\nexport const waitJitter = (base, jitterPercent = 0.3) => delay(jitterMs(base, jitterPercent));\n", "import { createInternalLogger } from '../logger.js';\nimport {\n jitterMs,\n resolveElement,\n waitJitter,\n} from './shared.js';\n\nconst logger = createInternalLogger('Humanize.Mobile');\n\nconst initializedPages = new WeakSet();\nconst DEFAULT_TAP_TIMEOUT_MS = 2500;\nconst DEFAULT_MOUSE_TAP_FALLBACK_TIMEOUT_MS = 1200;\nconst DEFAULT_ACTIVATE_FALLBACK_TIMEOUT_MS = 900;\n\nconst clamp = (value, min, max) => Math.min(max, Math.max(min, value));\n\n// \u79FB\u52A8\u7AEF\u5206\u652F\u9ED8\u8BA4\u4EE5\u5F53\u524D\u9875\u9762\u89C6\u53E3\u4E3A\u51C6\uFF0C\u53EA\u6709\u7F3A\u5931\u65F6\u624D\u56DE\u843D\u5230\u5E38\u89C1\u624B\u673A\u5C3A\u5BF8\u3002\nconst resolveViewport = (page) => page?.viewportSize?.() || { width: 390, height: 844 };\n\nconst describeTarget = (target) => {\n if (target == null) return 'Current Position';\n return typeof target === 'string' ? target : 'ElementHandle';\n};\n\nconst clipBoxToViewport = (box, viewport) => {\n if (!box || !viewport) return box;\n const left = clamp(box.x, 0, viewport.width);\n const top = clamp(box.y, 0, viewport.height);\n const right = clamp(box.x + box.width, 0, viewport.width);\n const bottom = clamp(box.y + box.height, 0, viewport.height);\n if (right - left > 1 && bottom - top > 1) {\n return {\n x: left,\n y: top,\n width: right - left,\n height: bottom - top,\n };\n }\n return box;\n};\n\nconst centerPointInBox = (box) => ({\n x: box.x + box.width / 2,\n y: box.y + box.height / 2,\n});\n\nconst withTimeout = async (operation, timeoutMs, label) => {\n const safeTimeoutMs = Math.max(50, Number(timeoutMs || 0));\n let timeoutId = null;\n try {\n return await Promise.race([\n Promise.resolve().then(operation),\n new Promise((_, reject) => {\n timeoutId = setTimeout(() => {\n reject(new Error(`${label} timeout after ${safeTimeoutMs}ms`));\n }, safeTimeoutMs);\n }),\n ]);\n } finally {\n if (timeoutId) clearTimeout(timeoutId);\n }\n};\n\nconst checkElementVisibility = async (element) => {\n return element.evaluate((el) => {\n const targetStyle = window.getComputedStyle(el);\n if (\n !targetStyle\n || targetStyle.display === 'none'\n || targetStyle.visibility === 'hidden'\n || targetStyle.visibility === 'collapse'\n ) {\n return { code: 'NOT_INTERACTABLE', reason: '\u5143\u7D20\u4E0D\u53EF\u89C1', direction: 'down' };\n }\n\n const rect = el.getBoundingClientRect();\n if (!rect || rect.width <= 0 || rect.height <= 0) {\n return { code: 'ZERO_DIMENSIONS', reason: '\u5C3A\u5BF8\u4E3A\u96F6', direction: 'down' };\n }\n\n const viewW = window.innerWidth;\n const viewH = window.innerHeight;\n const centerY = rect.top + rect.height / 2;\n let clipLeft = 0;\n let clipRight = viewW;\n let clipTop = 0;\n let clipBottom = viewH;\n let isFixed = false;\n let positioning = null;\n\n for (let node = el; node && node !== document.body; node = node.parentElement) {\n const style = window.getComputedStyle(node);\n if (style && (style.position === 'fixed' || style.position === 'sticky')) {\n isFixed = true;\n positioning = style.position;\n break;\n }\n }\n\n for (let node = el.parentElement; node && node !== document.body; node = node.parentElement) {\n const style = window.getComputedStyle(node);\n if (!style) continue;\n const clipsY = ['auto', 'scroll', 'overlay', 'hidden', 'clip'].includes(style.overflowY);\n const clipsX = ['auto', 'scroll', 'overlay', 'hidden', 'clip'].includes(style.overflowX);\n if (!clipsX && !clipsY) continue;\n const nodeRect = node.getBoundingClientRect();\n if (!nodeRect || nodeRect.width <= 0 || nodeRect.height <= 0) continue;\n if (clipsX) {\n clipLeft = Math.max(clipLeft, nodeRect.left);\n clipRight = Math.min(clipRight, nodeRect.right);\n }\n if (clipsY) {\n clipTop = Math.max(clipTop, nodeRect.top);\n clipBottom = Math.min(clipBottom, nodeRect.bottom);\n }\n }\n\n // \u53EA\u8BA1\u7B97\u201C\u5728\u5F53\u524D\u88C1\u526A\u5BB9\u5668\u5185\u771F\u5B9E\u9732\u51FA\u7684\u90E8\u5206\u201D\uFF0C\u907F\u514D\u88AB\u5916\u5C42 overflow \u88C1\u6389\u7684\u533A\u57DF\u8BEF\u5BFC\u540E\u7EED tap \u70B9\u3002\n const visibleLeft = Math.max(clipLeft, Math.min(clipRight, rect.left));\n const visibleRight = Math.max(clipLeft, Math.min(clipRight, rect.right));\n const visibleTop = Math.max(clipTop, Math.min(clipBottom, rect.top));\n const visibleBottom = Math.max(clipTop, Math.min(clipBottom, rect.bottom));\n const visibleWidth = visibleRight - visibleLeft;\n const visibleHeight = visibleBottom - visibleTop;\n const cx = visibleLeft + visibleWidth / 2;\n const cy = visibleTop + visibleHeight / 2;\n\n if (visibleWidth <= 1 || visibleHeight <= 1) {\n return {\n code: 'OUT_OF_VIEWPORT',\n reason: '\u4E0D\u5728\u89C6\u53E3\u5185',\n direction: centerY < clipTop ? 'up' : 'down',\n cy: centerY,\n viewH,\n isFixed,\n positioning,\n };\n }\n\n const isRootNode = (node) => (\n !node\n || node === document\n || node === document.body\n || node === document.documentElement\n );\n const commonAncestor = (a, b) => {\n for (let current = a; current && !isRootNode(current); current = current.parentElement) {\n if (current.contains(b)) return current;\n }\n return null;\n };\n const sameTapTarget = (pointElement) => {\n if (!pointElement) return false;\n if (pointElement === el || el.contains(pointElement) || pointElement.contains(el)) {\n return true;\n }\n\n const common = commonAncestor(el, pointElement);\n if (!common) return false;\n const commonRect = common.getBoundingClientRect?.();\n if (!commonRect || commonRect.width <= 0 || commonRect.height <= 0) return false;\n\n const commonArea = commonRect.width * commonRect.height;\n const targetArea = Math.max(1, rect.width * rect.height);\n const maxSharedRegionArea = Math.max(targetArea * 12, 4096);\n if (commonArea > maxSharedRegionArea) return false;\n if (\n commonRect.width > Math.max(rect.width * 8, 120)\n || commonRect.height > Math.max(rect.height * 8, 120)\n ) {\n return false;\n }\n\n return common.contains(el) && common.contains(pointElement);\n };\n\n const describeElement = (node) => {\n if (!node) return null;\n const className = typeof node.className === 'string'\n ? node.className\n : (node.className && typeof node.className.baseVal === 'string' ? node.className.baseVal : '');\n const rect = node.getBoundingClientRect?.();\n const style = window.getComputedStyle(node);\n return {\n tag: node.tagName,\n id: node.id || '',\n className,\n isFixed: Boolean(style && (style.position === 'fixed' || style.position === 'sticky')),\n positioning: style?.position || '',\n top: rect ? rect.top : null,\n bottom: rect ? rect.bottom : null,\n left: rect ? rect.left : null,\n right: rect ? rect.right : null,\n };\n };\n\n // \u53EA\u770B\u4E2D\u5FC3\u70B9\u4F1A\u8BA9\u5F88\u591A\u79FB\u52A8\u7AEF\u5143\u7D20\u88AB\u8BEF\u5224\uFF1B\u591A\u91C7\u6837\u51E0\u4E2A\u70B9\u66F4\u63A5\u8FD1\u771F\u5B9E tap \u8F68\u8FF9\u3002\n const samplePoints = [\n { x: cx, y: cy },\n { x: visibleLeft + Math.min(8, Math.max(1, visibleWidth * 0.25)), y: cy },\n { x: visibleRight - Math.min(8, Math.max(1, visibleWidth * 0.25)), y: cy },\n { x: cx, y: visibleTop + Math.min(8, Math.max(1, visibleHeight * 0.25)) },\n { x: cx, y: visibleBottom - Math.min(8, Math.max(1, visibleHeight * 0.25)) },\n ];\n\n let obstruction = null;\n for (const point of samplePoints) {\n const pointElement = document.elementFromPoint(point.x, point.y);\n if (sameTapTarget(pointElement)) {\n return { code: 'VISIBLE', isFixed, positioning };\n }\n obstruction = obstruction || describeElement(pointElement);\n }\n\n if (obstruction) {\n return {\n code: 'OBSTRUCTED',\n reason: '\u88AB\u906E\u6321',\n direction: cy > viewH / 2 ? 'down' : 'up',\n obstruction,\n cy,\n viewH,\n isFixed,\n positioning,\n };\n }\n\n return { code: 'VISIBLE', isFixed, positioning };\n });\n};\n\nconst activateElementFallback = async (element, point = null, options = {}) => {\n return element.evaluate((el, { innerOptions }) => {\n const isEditable = (node) => {\n if (!node || node.nodeType !== Node.ELEMENT_NODE) return false;\n if (node.isContentEditable) return true;\n if (node instanceof HTMLTextAreaElement) return !node.disabled && !node.readOnly;\n if (node instanceof HTMLInputElement) {\n return !node.disabled && !node.readOnly && typeof node.select === 'function';\n }\n return false;\n };\n const findEditable = (node) => {\n for (let current = node; current && current !== document.body; current = current.parentElement) {\n if (isEditable(current)) return current;\n }\n return null;\n };\n const editable = findEditable(el);\n if (editable && typeof editable.focus === 'function') {\n editable.focus({ preventScroll: true });\n if (innerOptions.editableOnly) {\n return { activated: true, method: 'focus', tag: editable.tagName || '' };\n }\n }\n\n if (innerOptions.editableOnly) {\n return { activated: false, method: 'none', tag: el?.tagName || '' };\n }\n\n if (typeof el.focus === 'function') {\n el.focus({ preventScroll: true });\n }\n if (typeof el.click === 'function') {\n el.click();\n return { activated: true, method: 'dom-click', tag: el.tagName || '' };\n }\n if (typeof el.dispatchEvent === 'function') {\n el.dispatchEvent(new MouseEvent('click', {\n bubbles: true,\n cancelable: true,\n view: window,\n }));\n return { activated: true, method: 'dispatch-click', tag: el.tagName || '' };\n }\n\n return {\n activated: Boolean(editable),\n method: editable ? 'focus' : 'none',\n tag: el?.tagName || '',\n };\n }, {\n innerOptions: options || {},\n });\n};\n\nconst getScrollableRect = async (element) => {\n return element.evaluate((el) => {\n const isScrollable = (node) => {\n const style = window.getComputedStyle(node);\n if (!style) return false;\n const overflowY = style.overflowY;\n if (!['auto', 'scroll', 'overlay'].includes(overflowY)) return false;\n return node.scrollHeight > node.clientHeight + 1;\n };\n\n let current = el;\n while (current && current !== document.body) {\n if (isScrollable(current)) {\n const rect = current.getBoundingClientRect();\n if (rect && rect.width > 0 && rect.height > 0) {\n return {\n x: rect.x,\n y: rect.y,\n width: rect.width,\n height: rect.height,\n };\n }\n }\n current = current.parentElement;\n }\n\n return null;\n });\n};\n\nconst scrollScrollableAncestor = async (element, deltaY) => {\n return element.evaluate((el, amount) => {\n const isScrollable = (node) => {\n const style = window.getComputedStyle(node);\n if (!style) return false;\n const overflowY = style.overflowY;\n if (!['auto', 'scroll', 'overlay'].includes(overflowY)) return false;\n return node.scrollHeight > node.clientHeight + 1;\n };\n\n let current = el;\n while (current && current !== document.body) {\n if (isScrollable(current)) {\n const beforeTop = current.scrollTop;\n current.scrollTop = beforeTop + amount;\n return {\n scroller: true,\n moved: current.scrollTop !== beforeTop,\n scrollTop: current.scrollTop,\n };\n }\n current = current.parentElement;\n }\n\n const beforeTop = window.scrollY;\n window.scrollBy(0, amount);\n return {\n scroller: null,\n moved: window.scrollY !== beforeTop,\n scrollTop: window.scrollY,\n };\n }, deltaY);\n};\n\nconst scrollAwayFromObstruction = async (element, status) => {\n return element.evaluate((el, innerStatus) => {\n const isScrollable = (node) => {\n const style = window.getComputedStyle(node);\n if (!style) return false;\n const overflowY = style.overflowY;\n if (!['auto', 'scroll', 'overlay'].includes(overflowY)) return false;\n return node.scrollHeight > node.clientHeight + 1;\n };\n\n let scroller = el;\n while (scroller && scroller !== document.body) {\n if (isScrollable(scroller)) break;\n scroller = scroller.parentElement;\n }\n if (!scroller || scroller === document.body) {\n return { moved: false, scrollTop: 0, deltaY: 0 };\n }\n\n const rect = el.getBoundingClientRect();\n const scrollerRect = scroller.getBoundingClientRect();\n const obstruction = innerStatus?.obstruction || {};\n const obstructionTop = Number(obstruction.top);\n const obstructionBottom = Number(obstruction.bottom);\n const obstructionMiddle = Number.isFinite(obstructionTop) && Number.isFinite(obstructionBottom)\n ? (obstructionTop + obstructionBottom) / 2\n : scrollerRect.top + scrollerRect.height / 2;\n const scrollerMiddle = scrollerRect.top + scrollerRect.height / 2;\n const padding = 18;\n\n let deltaY = 0;\n if (\n Number.isFinite(obstructionTop)\n && rect.bottom > obstructionTop\n && obstructionTop >= scrollerRect.top\n && obstructionTop <= scrollerRect.bottom\n && obstructionMiddle >= scrollerMiddle\n ) {\n deltaY = rect.bottom - obstructionTop + padding;\n } else if (\n Number.isFinite(obstructionBottom)\n && rect.top < obstructionBottom\n && obstructionBottom >= scrollerRect.top\n && obstructionBottom <= scrollerRect.bottom\n && obstructionMiddle < scrollerMiddle\n ) {\n deltaY = rect.top - obstructionBottom - padding;\n } else {\n const fallbackDistance = Math.max(48, Math.min(180, scrollerRect.height * 0.45));\n deltaY = obstructionMiddle >= scrollerMiddle ? fallbackDistance : -fallbackDistance;\n }\n\n const beforeTop = scroller.scrollTop;\n scroller.scrollTop = beforeTop + deltaY;\n return {\n moved: Math.abs(scroller.scrollTop - beforeTop) > 2,\n scrollTop: scroller.scrollTop,\n deltaY,\n };\n }, status);\n};\n\nconst getElementViewportSnapshot = async (element) => {\n return element.evaluate((el) => {\n const rect = el.getBoundingClientRect();\n return {\n top: rect.top,\n bottom: rect.bottom,\n left: rect.left,\n right: rect.right,\n width: rect.width,\n height: rect.height,\n scrollX: window.scrollX,\n scrollY: window.scrollY,\n };\n });\n};\n\nconst isTargetImmobileAfterScroll = (before, after) => {\n if (!before || !after) return false;\n const rectDeltaY = Number(after.top || 0) - Number(before.top || 0);\n const rectDeltaX = Number(after.left || 0) - Number(before.left || 0);\n const scrollDeltaY = Number(after.scrollY || 0) - Number(before.scrollY || 0);\n const scrollDeltaX = Number(after.scrollX || 0) - Number(before.scrollX || 0);\n const rectMoved = Math.abs(rectDeltaY) > 3 || Math.abs(rectDeltaX) > 3;\n const pageMoved = Math.abs(scrollDeltaY) > 3 || Math.abs(scrollDeltaX) > 3;\n\n if (!rectMoved && !pageMoved) return true;\n if (pageMoved && !rectMoved) return true;\n\n // Normal document content moves opposite the page scroll. Anything much smaller\n // behaves like a viewport-anchored app-shell element even if CSS position is relative.\n if (Math.abs(scrollDeltaY) > 12 && Math.abs(rectDeltaY) < Math.min(12, Math.abs(scrollDeltaY) * 0.2)) {\n return true;\n }\n return false;\n};\n\nconst restoreWindowFromSnapshot = async (page, before, after) => {\n if (!before || !after) return;\n if (\n Math.abs(Number(after.scrollX || 0) - Number(before.scrollX || 0)) <= 2\n && Math.abs(Number(after.scrollY || 0) - Number(before.scrollY || 0)) <= 2\n ) {\n return;\n }\n\n await page.evaluate(\n (state) => window.scrollTo(state.x, state.y),\n { x: Number(before.scrollX || 0), y: Number(before.scrollY || 0) },\n ).catch(() => {});\n};\n\nconst dispatchTouchSwipe = async (page, deltaY, options = {}) => {\n const viewport = resolveViewport(page);\n const rawRect = options.rect || null;\n const rect = rawRect\n ? {\n x: clamp(rawRect.x, 0, viewport.width),\n y: clamp(rawRect.y, 0, viewport.height),\n width: clamp(rawRect.width, 0, viewport.width),\n height: clamp(rawRect.height, 0, viewport.height),\n }\n : null;\n const area = rect && rect.width > 24 && rect.height > 48\n ? {\n left: rect.x,\n right: Math.min(viewport.width, rect.x + rect.width),\n top: rect.y,\n bottom: Math.min(viewport.height, rect.y + rect.height),\n }\n : {\n left: 0,\n right: viewport.width,\n top: 0,\n bottom: viewport.height,\n };\n const areaWidth = Math.max(1, area.right - area.left);\n const areaHeight = Math.max(1, area.bottom - area.top);\n const maxDistance = rect\n ? Math.max(60, areaHeight * 0.72)\n : Math.max(120, viewport.height * 0.72);\n const distance = clamp(Math.abs(deltaY), Math.min(80, maxDistance), maxDistance);\n const direction = deltaY >= 0 ? 1 : -1;\n const startX = clamp(\n area.left + areaWidth * (0.45 + Math.random() * 0.1),\n 24,\n viewport.width - 24,\n );\n const startY = direction > 0\n ? clamp(area.top + areaHeight * (0.72 + Math.random() * 0.1), area.top + 24, area.bottom - 16)\n : clamp(area.top + areaHeight * (0.28 + Math.random() * 0.1), area.top + 16, area.bottom - 24);\n const endY = clamp(startY - direction * distance, Math.max(16, area.top + 12), Math.min(viewport.height - 16, area.bottom - 12));\n const steps = Math.max(4, Math.round(Number(options.steps || 6)));\n const durationMs = jitterMs(options.durationMs || 320, 0.35);\n\n let client = null;\n const scrollBefore = await page.evaluate(() => ({ x: window.scrollX, y: window.scrollY })).catch(() => null);\n try {\n if (page.context && typeof page.context().newCDPSession === 'function') {\n client = await page.context().newCDPSession(page);\n }\n if (!client) throw new Error('CDP session unavailable');\n\n await client.send('Input.synthesizeScrollGesture', {\n x: startX,\n y: startY,\n yDistance: -direction * distance,\n xOverscroll: (Math.random() - 0.5) * 4,\n yOverscroll: (Math.random() - 0.5) * 8,\n speed: 700 + Math.round(Math.random() * 350),\n gestureSourceType: 'touch',\n });\n await waitJitter(160, 0.35);\n const scrollAfterSynth = await page.evaluate(() => ({ x: window.scrollX, y: window.scrollY })).catch(() => null);\n if (\n scrollBefore\n && scrollAfterSynth\n && (Math.abs(scrollAfterSynth.y - scrollBefore.y) > 2 || Math.abs(scrollAfterSynth.x - scrollBefore.x) > 2)\n ) {\n return true;\n }\n\n await client.send('Input.dispatchTouchEvent', {\n type: 'touchStart',\n touchPoints: [{ x: startX, y: startY, id: 1 }],\n });\n\n for (let i = 1; i <= steps; i += 1) {\n const progress = i / steps;\n const eased = 1 - Math.pow(1 - progress, 2);\n const x = startX + (Math.random() - 0.5) * 3;\n const y = startY + (endY - startY) * eased + (Math.random() - 0.5) * 5;\n await waitJitter(durationMs / steps, 0.25);\n await client.send('Input.dispatchTouchEvent', {\n type: 'touchMove',\n touchPoints: [{ x, y, id: 1 }],\n });\n }\n\n await client.send('Input.dispatchTouchEvent', {\n type: 'touchEnd',\n touchPoints: [],\n });\n await waitJitter(120, 0.35);\n const scrollAfterTouch = await page.evaluate(() => ({ x: window.scrollX, y: window.scrollY })).catch(() => null);\n if (\n scrollBefore\n && scrollAfterTouch\n && Math.abs(scrollAfterTouch.y - scrollBefore.y) <= 2\n && Math.abs(scrollAfterTouch.x - scrollBefore.x) <= 2\n ) {\n await page.evaluate((amount) => window.scrollBy(0, amount), deltaY);\n await waitJitter(120, 0.35);\n }\n return true;\n } catch (error) {\n logger.debug(`touch swipe fallback: ${error?.message || error}`);\n try {\n await page.evaluate((amount) => window.scrollBy(0, amount), deltaY);\n await waitJitter(120, 0.35);\n return true;\n } catch {\n await page.mouse.wheel(0, deltaY);\n await waitJitter(120, 0.35);\n return true;\n }\n } finally {\n if (client && typeof client.detach === 'function') {\n try {\n await client.detach();\n } catch {\n // ignore\n }\n }\n }\n};\n\nconst tapPoint = async (page, point, options = {}) => {\n const {\n timeoutMs = DEFAULT_TAP_TIMEOUT_MS,\n mouseFallbackTimeoutMs = DEFAULT_MOUSE_TAP_FALLBACK_TIMEOUT_MS,\n allowMouseFallback = true,\n } = options;\n\n if (page.touchscreen && typeof page.touchscreen.tap === 'function') {\n try {\n await withTimeout(\n () => page.touchscreen.tap(point.x, point.y),\n timeoutMs,\n 'touchscreen.tap',\n );\n return { method: 'touchscreen' };\n } catch (error) {\n logger.warn(`tapPoint | touchscreen.tap \u5931\u8D25\u6216\u8D85\u65F6\uFF0C\u5C1D\u8BD5\u9F20\u6807\u515C\u5E95: ${error?.message || error}`);\n if (!allowMouseFallback) throw error;\n }\n }\n await withTimeout(\n () => page.mouse.click(point.x, point.y),\n mouseFallbackTimeoutMs,\n 'mouse.click fallback',\n );\n return { method: 'mouse' };\n};\n\nexport const MobileHumanize = {\n jitterMs,\n\n async initializeCursor(page) {\n if (initializedPages.has(page)) return;\n initializedPages.add(page);\n logger.debug('initializeCursor: mobile mode uses touch gestures, cursor init skipped');\n },\n\n async humanMove(page, target) {\n logger.debug(`humanMove: mobile no-op target=${typeof target === 'string' ? target : 'element/coords'}`);\n if (typeof target === 'string' || (target && typeof target.boundingBox === 'function')) {\n const element = await resolveElement(page, target, { throwOnMissing: false });\n if (!element) {\n return false;\n }\n }\n await waitJitter(80, 0.4);\n return true;\n },\n\n async humanScroll(page, target, options = {}) {\n const {\n maxSteps = 20,\n minStep = 180,\n maxStep = 520,\n maxDurationMs = maxSteps * 280 + 1200,\n throwOnMissing = false,\n } = options;\n const targetDesc = describeTarget(target);\n\n logger.start('humanScroll', `target=${targetDesc}`);\n\n const element = await resolveElement(page, target, { throwOnMissing });\n if (!element) {\n logger.warn(`humanScroll | \u5143\u7D20\u672A\u627E\u5230: ${targetDesc}`);\n return { element: null, didScroll: false, restore: null };\n }\n\n const startTime = Date.now();\n let didScroll = false;\n for (let i = 0; i < maxSteps; i += 1) {\n const status = await checkElementVisibility(element);\n if (status.code === 'VISIBLE') {\n if (status.isFixed) {\n logger.info('humanScroll | fixed/sticky \u5BB9\u5668\u5185\uFF0C\u8DF3\u8FC7\u6EDA\u52A8');\n } else {\n logger.debug('humanScroll | \u5143\u7D20\u53EF\u89C1\u4E14\u65E0\u906E\u6321');\n }\n logger.success('humanScroll', didScroll ? '\u5DF2\u6EDA\u52A8' : '\u65E0\u9700\u6EDA\u52A8');\n return { element, didScroll, restore: null };\n }\n\n if (status.code === 'ZERO_DIMENSIONS' || status.code === 'NOT_INTERACTABLE') {\n logger.warn(`humanScroll | \u5143\u7D20\u4E0D\u53EF\u6EDA\u52A8\u81F3\u53EF\u70B9\u51FB\u72B6\u6001: ${status.reason || status.code}`);\n return { element, didScroll, restore: null };\n }\n\n // \u53EA\u6709\u627E\u5230\u53EF\u6EDA\u52A8\u7956\u5148\u65F6\u624D\u7EE7\u7EED\u6EDA\uFF0C\u5426\u5219\u56FA\u5B9A\u5BB9\u5668\u91CC\u7684\u5143\u7D20\u76F4\u63A5\u8D70\u539F\u5730\u5224\u5B9A\u3002\n const scrollRect = await getScrollableRect(element);\n if (!scrollRect && status.isFixed && status.code === 'OUT_OF_VIEWPORT') {\n logger.warn(`humanScroll | fixed/sticky \u76EE\u6807\u4E0D\u5728\u89C6\u53E3\u5185\uFF0C\u9875\u9762\u6EDA\u52A8\u65E0\u6CD5\u6539\u53D8\u5176\u4F4D\u7F6E (direction=${status.direction || 'unknown'})`);\n return { element, didScroll, restore: null, unscrollable: true };\n }\n if (!scrollRect && status.isFixed && status.code === 'OBSTRUCTED') {\n logger.warn(`humanScroll | fixed/sticky \u76EE\u6807\u88AB\u906E\u6321\uFF0C\u6EDA\u52A8\u65E0\u6CD5\u89E3\u9664 (${status.obstruction?.tag || 'unknown'})`);\n return { element, didScroll, restore: null, unscrollable: true };\n }\n\n if (scrollRect && status.code === 'OBSTRUCTED' && status.obstruction?.isFixed) {\n const moved = await scrollAwayFromObstruction(element, status);\n if (moved.moved) {\n logger.debug(`humanScroll | sticky/fixed \u906E\u6321\u8865\u507F\u6EDA\u52A8 top=${Math.round(moved.scrollTop || 0)}`);\n await waitJitter(90, 0.3);\n didScroll = true;\n continue;\n }\n }\n\n if (Date.now() - startTime > maxDurationMs) {\n logger.warn(`humanScroll | mobile timeout (${maxDurationMs}ms, status=${status.code}, direction=${status.direction || 'unknown'}, fixed=${Boolean(status.isFixed)})`);\n return { element, didScroll, restore: null };\n }\n\n const stepMin = scrollRect ? Math.min(minStep, Math.max(60, scrollRect.height * 0.4)) : minStep;\n const stepMax = scrollRect ? Math.min(maxStep, Math.max(stepMin + 40, scrollRect.height * 0.8)) : maxStep;\n logger.debug(`humanScroll | \u6B65\u9AA4 ${i + 1}/${maxSteps}: ${status.reason || status.code} ${status.direction ? `(${status.direction})` : ''}`);\n const distance = stepMin + Math.random() * Math.max(1, stepMax - stepMin);\n let deltaY = status.direction === 'up' ? -distance : distance;\n if (status.code === 'OBSTRUCTED') {\n if (status.obstruction?.isFixed && status.obstruction.top != null) {\n const obstructionMiddle = (\n Number(status.obstruction.top || 0)\n + Number(status.obstruction.bottom || status.obstruction.top || 0)\n ) / 2;\n const visibleMiddle = scrollRect\n ? scrollRect.y + scrollRect.height / 2\n : status.viewH / 2;\n deltaY = obstructionMiddle < visibleMiddle ? -distance : distance;\n } else {\n const halfY = scrollRect ? (scrollRect.y + scrollRect.height / 2) : (status.viewH / 2);\n deltaY = status.cy > halfY ? distance : -distance;\n }\n }\n const beforeWindowState = scrollRect\n ? await page.evaluate(() => ({ x: window.scrollX, y: window.scrollY }))\n : null;\n const beforeElementSnapshot = await getElementViewportSnapshot(element).catch(() => null);\n const beforeState = scrollRect\n ? await element.evaluate((el) => {\n const isScrollable = (node) => {\n const style = window.getComputedStyle(node);\n if (!style) return false;\n const overflowY = style.overflowY;\n if (!['auto', 'scroll', 'overlay'].includes(overflowY)) return false;\n return node.scrollHeight > node.clientHeight + 1;\n };\n\n let current = el;\n while (current && current !== document.body) {\n if (isScrollable(current)) {\n return {\n kind: 'element',\n top: current.scrollTop,\n left: current.scrollLeft,\n };\n }\n current = current.parentElement;\n }\n return { kind: 'window', top: window.scrollY, left: window.scrollX };\n })\n : null;\n await dispatchTouchSwipe(page, deltaY, { rect: scrollRect });\n if (scrollRect && beforeWindowState) {\n const afterWindowState = await page.evaluate(() => ({ x: window.scrollX, y: window.scrollY }));\n if (\n Math.abs(afterWindowState.x - beforeWindowState.x) > 2\n || Math.abs(afterWindowState.y - beforeWindowState.y) > 2\n ) {\n await page.evaluate((state) => window.scrollTo(state.x, state.y), beforeWindowState);\n logger.debug(`humanScroll | \u7A97\u53E3\u6EDA\u52A8\u56DE\u6536 from=${Math.round(afterWindowState.y)} to=${Math.round(beforeWindowState.y)}`);\n }\n }\n let afterElementSnapshot = null;\n const readAfterElementSnapshot = async () => {\n if (!afterElementSnapshot) {\n afterElementSnapshot = await getElementViewportSnapshot(element).catch(() => null);\n }\n return afterElementSnapshot;\n };\n if (!scrollRect && beforeElementSnapshot) {\n const afterSnapshot = await readAfterElementSnapshot();\n if (isTargetImmobileAfterScroll(beforeElementSnapshot, afterSnapshot)) {\n await restoreWindowFromSnapshot(page, beforeElementSnapshot, afterSnapshot);\n logger.warn(`humanScroll | \u76EE\u6807\u4E0D\u968F\u9875\u9762\u6EDA\u52A8\u79FB\u52A8\uFF0C\u9875\u9762\u6EDA\u52A8\u65E0\u6CD5\u6539\u53D8\u5176\u4F4D\u7F6E (status=${status.code}, direction=${status.direction || 'unknown'})`);\n return { element, didScroll, restore: null, unscrollable: true };\n }\n }\n if (scrollRect && beforeState) {\n const afterState = await element.evaluate((el) => {\n const isScrollable = (node) => {\n const style = window.getComputedStyle(node);\n if (!style) return false;\n const overflowY = style.overflowY;\n if (!['auto', 'scroll', 'overlay'].includes(overflowY)) return false;\n return node.scrollHeight > node.clientHeight + 1;\n };\n\n let current = el;\n while (current && current !== document.body) {\n if (isScrollable(current)) {\n return {\n kind: 'element',\n top: current.scrollTop,\n left: current.scrollLeft,\n };\n }\n current = current.parentElement;\n }\n return { kind: 'window', top: window.scrollY, left: window.scrollX };\n });\n\n const topDelta = Number(afterState.top || 0) - Number(beforeState.top || 0);\n const leftDelta = Number(afterState.left || 0) - Number(beforeState.left || 0);\n const expectedDelta = Number(deltaY || 0);\n const moved = beforeState.kind !== afterState.kind\n || Math.abs(topDelta) > 2\n || Math.abs(leftDelta) > 2;\n\n if (!moved) {\n const fallback = await scrollScrollableAncestor(element, deltaY);\n logger.debug(`humanScroll | \u5BB9\u5668\u89E6\u6478\u65E0\u6548\uFF0C\u76F4\u63A5\u6EDA\u52A8 fallback=${fallback.scroller ? 'ancestor' : 'window'} top=${Math.round(fallback.scrollTop || 0)}`);\n } else if (\n beforeState.kind === afterState.kind\n && Math.abs(expectedDelta) > 24\n && Math.sign(topDelta || expectedDelta) === Math.sign(expectedDelta)\n && Math.abs(topDelta) < Math.min(Math.abs(expectedDelta) * 0.45, 96)\n ) {\n const residualDelta = expectedDelta - topDelta;\n if (Math.sign(residualDelta) === Math.sign(expectedDelta) && Math.abs(residualDelta) > 24) {\n const fallback = await scrollScrollableAncestor(element, residualDelta);\n logger.debug(`humanScroll | \u5BB9\u5668\u89E6\u6478\u8DDD\u79BB\u4E0D\u8DB3\uFF0C\u8865\u507F\u6EDA\u52A8 fallback=${fallback.scroller ? 'ancestor' : 'window'} top=${Math.round(fallback.scrollTop || 0)}`);\n }\n }\n }\n if (scrollRect && beforeElementSnapshot) {\n const afterSnapshot = await getElementViewportSnapshot(element).catch(() => null);\n if (isTargetImmobileAfterScroll(beforeElementSnapshot, afterSnapshot)) {\n await restoreWindowFromSnapshot(page, beforeElementSnapshot, afterSnapshot);\n logger.warn(`humanScroll | \u76EE\u6807\u4E0D\u968F\u6EDA\u52A8\u5BB9\u5668\u79FB\u52A8\uFF0C\u6EDA\u52A8\u65E0\u6CD5\u6539\u53D8\u5176\u4F4D\u7F6E (status=${status.code}, direction=${status.direction || 'unknown'})`);\n return { element, didScroll, restore: null, unscrollable: true };\n }\n }\n didScroll = true;\n }\n\n try {\n await element.scrollIntoViewIfNeeded?.();\n await waitJitter(80, 0.3);\n const finalStatus = await checkElementVisibility(element);\n if (finalStatus.code === 'VISIBLE') {\n logger.info('humanScroll | \u539F\u751F scrollIntoViewIfNeeded \u515C\u5E95\u6210\u529F');\n logger.success('humanScroll', didScroll ? '\u5DF2\u6EDA\u52A8' : '\u65E0\u9700\u6EDA\u52A8');\n return { element, didScroll: true, restore: null };\n }\n } catch (fallbackError) {\n logger.debug(`humanScroll | native fallback failed: ${fallbackError?.message || fallbackError}`);\n }\n\n logger.warn(`humanScroll | \u5728 ${maxSteps} \u6B65\u540E\u65E0\u6CD5\u786E\u4FDD\u53EF\u89C1\u6027`);\n return { element, didScroll, restore: null };\n },\n\n async humanClick(page, target, options = {}) {\n const {\n reactionDelay = 220,\n throwOnMissing = true,\n scrollIfNeeded = true,\n tapTimeoutMs = DEFAULT_TAP_TIMEOUT_MS,\n mouseFallbackTimeoutMs = DEFAULT_MOUSE_TAP_FALLBACK_TIMEOUT_MS,\n activateFallbackTimeoutMs = DEFAULT_ACTIVATE_FALLBACK_TIMEOUT_MS,\n fallbackDomClick = true,\n fallbackDomClickOnTapError = true,\n } = options;\n const targetDesc = describeTarget(target);\n\n logger.start('humanClick', `target=${targetDesc}`);\n\n try {\n if (target == null) {\n const viewport = resolveViewport(page);\n await waitJitter(reactionDelay, 0.45);\n await tapPoint(page, {\n x: viewport.width * (0.45 + Math.random() * 0.1),\n y: viewport.height * (0.48 + Math.random() * 0.12),\n }, {\n timeoutMs: tapTimeoutMs,\n mouseFallbackTimeoutMs,\n });\n logger.success('humanClick', 'Tapped current position');\n return true;\n }\n\n const element = await resolveElement(page, target, { throwOnMissing });\n if (!element) {\n logger.warn(`humanClick: \u5143\u7D20\u4E0D\u5B58\u5728\uFF0C\u8DF3\u8FC7\u70B9\u51FB ${targetDesc}`);\n return false;\n }\n\n const scrollResult = scrollIfNeeded\n ? await MobileHumanize.humanScroll(page, element, { throwOnMissing })\n : null;\n\n const status = await checkElementVisibility(element).catch(() => null);\n if (status && status.code !== 'VISIBLE') {\n if (\n fallbackDomClick\n && (status.code === 'OUT_OF_VIEWPORT' || status.code === 'OBSTRUCTED')\n && (status.isFixed || scrollResult?.unscrollable)\n ) {\n let fallback = await withTimeout(\n () => activateElementFallback(element, null, {\n editableOnly: true,\n }),\n activateFallbackTimeoutMs,\n 'focus fallback',\n ).catch(() => null);\n if (!fallback?.activated) {\n fallback = await withTimeout(\n () => activateElementFallback(element, null, {\n editableOnly: false,\n }),\n activateFallbackTimeoutMs,\n 'activation fallback',\n ).catch(() => null);\n }\n if (fallback?.activated) {\n logger.warn(`humanClick: \u4E0D\u53EF\u6EDA\u52A8\u76EE\u6807\u4E0D\u53EF\u7269\u7406\u70B9\u51FB\uFF0C\u5DF2\u7528 ${fallback.method} \u6FC0\u6D3B`);\n return true;\n }\n }\n\n const message = `\u5143\u7D20\u4E0D\u53EF\u70B9\u51FB: ${status.reason || status.code}`;\n if (throwOnMissing) throw new Error(message);\n logger.warn(`humanClick: ${message}\uFF0C\u8DF3\u8FC7\u70B9\u51FB`);\n return false;\n }\n\n const box = await element.boundingBox();\n if (!box) {\n if (throwOnMissing) throw new Error('\u65E0\u6CD5\u83B7\u53D6\u5143\u7D20\u4F4D\u7F6E');\n logger.warn('humanClick: \u65E0\u6CD5\u83B7\u53D6\u4F4D\u7F6E\uFF0C\u8DF3\u8FC7\u70B9\u51FB');\n return false;\n }\n\n await waitJitter(reactionDelay, 0.45);\n const visibleBox = clipBoxToViewport(box, resolveViewport(page));\n const tapTarget = centerPointInBox(visibleBox);\n try {\n await tapPoint(page, tapTarget, {\n timeoutMs: tapTimeoutMs,\n mouseFallbackTimeoutMs,\n });\n } catch (tapError) {\n if (!fallbackDomClickOnTapError) throw tapError;\n const fallback = await withTimeout(\n () => activateElementFallback(element, tapTarget, {\n editableOnly: false,\n }),\n activateFallbackTimeoutMs,\n 'activation fallback',\n ).catch(() => null);\n if (!fallback?.activated) throw tapError;\n logger.warn(`humanClick: tap \u5931\u8D25\u540E\u5DF2\u7528 ${fallback.method} \u515C\u5E95: ${tapError?.message || tapError}`);\n }\n await waitJitter(120, 0.35);\n logger.success('humanClick');\n return true;\n } catch (error) {\n logger.fail('humanClick', error);\n throw error;\n }\n },\n\n async randomSleep(baseMs, jitterPercent = 0.3) {\n await waitJitter(baseMs, jitterPercent);\n },\n\n async simulateGaze(page, baseDurationMs = 2500) {\n const durationMs = jitterMs(baseDurationMs, 0.4);\n const startTime = Date.now();\n while (Date.now() - startTime < durationMs) {\n if (Math.random() < 0.28) {\n const distance = 70 + Math.random() * 120;\n await dispatchTouchSwipe(page, Math.random() < 0.7 ? distance : -distance, {\n durationMs: 180,\n steps: 4,\n });\n } else {\n await waitJitter(420, 0.55);\n }\n }\n },\n\n async humanType(page, selector, text, options = {}) {\n const {\n baseDelay = 160,\n pauseProbability = 0.08,\n pauseBase = 700,\n } = options;\n\n await MobileHumanize.humanClick(page, selector, { scrollIfNeeded: true });\n await waitJitter(220, 0.45);\n\n for (let i = 0; i < String(text).length; i += 1) {\n const char = String(text)[i];\n const charDelay = /[,.!?;:\uFF0C\u3002\uFF01\uFF1F\uFF1B\uFF1A]/.test(char)\n ? jitterMs(baseDelay * 1.45, 0.4)\n : jitterMs(char === ' ' ? baseDelay * 0.65 : baseDelay, 0.4);\n await page.keyboard.type(char);\n await waitJitter(charDelay, 0.15);\n\n if (Math.random() < pauseProbability && i < String(text).length - 1) {\n await waitJitter(pauseBase, 0.5);\n }\n }\n },\n\n async humanPress(page, targetOrKey, maybeKey, options = {}) {\n const hasTarget = typeof maybeKey === 'string';\n const key = hasTarget ? maybeKey : targetOrKey;\n const pressOptions = hasTarget ? options : (maybeKey || options);\n const {\n reactionDelay = 170,\n holdDelay = 42,\n focusDelay = 180,\n scrollIfNeeded = true,\n throwOnMissing = true,\n keyboardOptions = {},\n } = pressOptions || {};\n const targetDesc = hasTarget ? describeTarget(targetOrKey) : 'current focus';\n\n logger.start('humanPress', `key=${key}, target=${targetDesc}`);\n\n try {\n if (hasTarget) {\n await MobileHumanize.humanClick(page, targetOrKey, {\n reactionDelay: focusDelay,\n scrollIfNeeded,\n throwOnMissing,\n });\n }\n\n await waitJitter(reactionDelay, 0.45);\n await page.keyboard.press(key, {\n ...keyboardOptions,\n delay: jitterMs(holdDelay, 0.5),\n });\n logger.success('humanPress');\n return true;\n } catch (error) {\n logger.fail('humanPress', error);\n throw error;\n }\n },\n\n async humanClear(page, selector) {\n const locator = page.locator(selector);\n await MobileHumanize.humanClick(page, locator, { scrollIfNeeded: true });\n await waitJitter(160, 0.4);\n const readValue = async () => {\n try {\n return await locator.inputValue({ timeout: 600 });\n } catch {\n return await locator.evaluate((el) => (\n 'value' in el ? String(el.value || '') : String(el.textContent || '')\n )).catch(() => '');\n }\n };\n\n const currentValue = await readValue();\n if (!currentValue) return;\n\n await page.keyboard.press('ControlOrMeta+A');\n await waitJitter(90, 0.35);\n await page.keyboard.press('Backspace');\n await waitJitter(120, 0.35);\n if (!(await readValue())) return;\n\n await locator.evaluate((el) => {\n if ('value' in el) {\n el.value = '';\n el.dispatchEvent(new Event('input', { bubbles: true }));\n el.dispatchEvent(new Event('change', { bubbles: true }));\n return;\n }\n el.textContent = '';\n el.dispatchEvent(new Event('input', { bubbles: true }));\n });\n },\n\n async warmUpBrowsing(page, baseDuration = 3500) {\n const durationMs = jitterMs(baseDuration, 0.4);\n const startTime = Date.now();\n while (Date.now() - startTime < durationMs) {\n const action = Math.random();\n if (action < 0.5) {\n await dispatchTouchSwipe(page, 120 + Math.random() * 220, {\n durationMs: 240,\n steps: 5,\n });\n } else if (action < 0.7) {\n await dispatchTouchSwipe(page, -(80 + Math.random() * 160), {\n durationMs: 220,\n steps: 4,\n });\n } else {\n await waitJitter(560, 0.55);\n }\n }\n },\n\n async naturalScroll(page, direction = 'down', distance = 300, baseSteps = 5) {\n const steps = Math.max(3, baseSteps + Math.floor(Math.random() * 3) - 1);\n const actualDistance = jitterMs(distance, 0.15);\n const sign = direction === 'down' ? 1 : -1;\n for (let i = 0; i < steps; i += 1) {\n const factor = 1 - (i / steps) * 0.45;\n await dispatchTouchSwipe(page, (actualDistance / steps) * factor * sign, {\n durationMs: 150 + i * 20,\n steps: 4,\n });\n }\n },\n};\n", "import { Device, normalizeDevice } from '../../constants.js';\nimport { PageRuntimeStateKey } from '../constants.js';\nimport { withPageReflect } from '../reflect.js';\nimport { Humanize as DesktopHumanize } from './desktop.js';\nimport { MobileHumanize } from './mobile.js';\n\nconst resolveDeviceFromPage = (page) => normalizeDevice(page?.[PageRuntimeStateKey]?.device);\n\n// \u540C\u4E00\u5957 Humanize API \u4F1A\u6839\u636E page \u4E0A\u7684 device \u81EA\u52A8\u5206\u6D41\u5230\u684C\u9762/\u79FB\u52A8\u5B9E\u73B0\u3002\nconst resolveDelegate = (page) => {\n return resolveDeviceFromPage(page) === Device.Mobile\n ? MobileHumanize\n : DesktopHumanize;\n};\n\nexport const DefaultHumanizeDevice = withPageReflect(\n 'DefaultHumanize',\n resolveDelegate,\n [DesktopHumanize, MobileHumanize],\n);\n\nexport const Humanize = DefaultHumanizeDevice;\n", "import { DeviceInput } from '../../device-input.js';\n\nconst FORCE_CLICK = Object.freeze({\n forceClick: true,\n clickOptions: { force: true },\n});\n\nconst pointOrNull = async (target) => {\n if (!target || typeof target.boundingBox !== 'function') return null;\n const box = await target.boundingBox().catch(() => null);\n return box\n ? { x: box.x + box.width / 2, y: box.y + box.height / 2 }\n : null;\n};\n\nexport const CloakHumanizeInput = {\n async initializeCursor(page) {\n return Boolean(page);\n },\n\n async humanMove(page, target) {\n const point = target?.x != null && target?.y != null\n ? target\n : await pointOrNull(typeof target === 'string' ? page.locator(target).first() : target);\n return point ? await DeviceInput.move(page, point, { forceMouse: true }) : false;\n },\n\n async humanScroll(page, target) {\n const element = typeof target === 'string' ? page.locator(target).first() : target;\n if (!element) return { element: null, didScroll: false, restore: null };\n await element.scrollIntoViewIfNeeded?.();\n return { element, didScroll: true, restore: null };\n },\n\n async humanClick(page, target) {\n return await DeviceInput.click(page, target, FORCE_CLICK);\n },\n\n async humanType(page, selector, text) {\n await DeviceInput.click(page, selector, FORCE_CLICK);\n return await DeviceInput.keyboardType(page, text);\n },\n\n async humanPress(page, targetOrKey, maybeKey) {\n return await DeviceInput.press(page, targetOrKey, maybeKey, {\n clickOptions: FORCE_CLICK,\n keyboardOptions: {},\n });\n },\n\n async humanClear(page, selector) {\n return await DeviceInput.fill(page, selector, '', { force: true });\n },\n\n async simulateGaze(page) {\n return await DeviceInput.move(page, { x: 0, y: 0 }, { forceMouse: true });\n },\n\n async warmUpBrowsing(page) {\n return await this.simulateGaze(page);\n },\n\n async naturalScroll(page, direction = 'down', distance = 300) {\n const sign = direction === 'down' ? 1 : -1;\n await page.mouse.wheel(0, Number(distance || 0) * sign);\n },\n};\n", "import { Mode } from './constants.js';\nimport { withModeReflect } from './internals/reflect.js';\nimport { CloakHumanize, DefaultHumanize } from './internals/humanize/index.js';\n\nconst humanizeStrategies = {\n [Mode.Default]: DefaultHumanize,\n [Mode.Cloak]: CloakHumanize,\n};\n\nexport const Humanize = withModeReflect('Humanize', humanizeStrategies);\n", "// \u96C6\u4E2D\u7BA1\u7406\u542F\u52A8\u914D\u7F6E\uFF0C\u53CD\u722C\u53C2\u6570\u4E0E\u6307\u7EB9\u914D\u7F6E\u7EDF\u4E00\u7531 AntiCheat \u63D0\u4F9B\nimport { execFileSync } from 'node:child_process';\nimport { FingerprintGenerator } from 'fingerprint-generator';\nimport { FingerprintInjector } from 'fingerprint-injector';\nimport { DefaultAntiCheat as AntiCheat } from '../anti-cheat/default.js';\nimport { Device, normalizeDevice } from '../../constants.js';\nimport { createInternalLogger } from '../logger.js';\nimport { RuntimeEnv } from '../../runtime-env.js';\nimport {\n createLaunchTrafficHook,\n logLaunchTraffic,\n resolveLaunchTraffic,\n} from './traffic.js';\n\nconst logger = createInternalLogger('Launch');\nconst injectedContexts = new WeakSet();\nconst browserMajorVersionCache = new Map();\n\nconst DEFAULT_BROWSER_PROFILE_SCHEMA_VERSION = 1;\nconst DEFAULT_LOCALE = 'zh-CN';\n\nconst DEFAULT_CRAWLER_BASE_OPTIONS = Object.freeze({\n maxConcurrency: 1,\n maxRequestRetries: 0,\n requestHandlerTimeoutSecs: 240,\n navigationTimeoutSecs: 120,\n});\n\nconst fingerprintInjector = new FingerprintInjector();\n\nconst parseChromeMajorVersion = (rawValue = '') => {\n const match = String(rawValue || '').match(/(?:Chrome|Chromium)(?:\\/|\\s+(?:for Testing\\s+)?)(\\d+)/i);\n return match ? Number(match[1] || 0) : 0;\n};\n\nconst resolveLauncherExecutablePath = (launcher) => {\n if (!launcher || typeof launcher !== 'object') return '';\n if (typeof launcher.executablePath === 'function') {\n try {\n return String(launcher.executablePath() || '').trim();\n } catch {\n return '';\n }\n }\n return '';\n};\n\nconst detectBrowserMajorVersion = (launcher) => {\n\tconst executablePath = resolveLauncherExecutablePath(launcher);\n if (!executablePath) return 0;\n if (browserMajorVersionCache.has(executablePath)) {\n return browserMajorVersionCache.get(executablePath);\n }\n\n let detectedVersion = 0;\n try {\n const rawVersion = execFileSync(executablePath, ['--version'], {\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'ignore'],\n });\n detectedVersion = parseChromeMajorVersion(rawVersion);\n } catch (error) {\n logger.warn(`\u8BFB\u53D6\u6D4F\u89C8\u5668\u7248\u672C\u5931\u8D25: ${error?.message || error}`);\n }\n\n\tbrowserMajorVersionCache.set(executablePath, detectedVersion);\n\treturn detectedVersion;\n};\n\nconst resolveRuntimeDevice = (runtimeState = {}) => normalizeDevice(runtimeState?.device);\n\nconst resolveCoreDevice = (core = {}) => {\n const raw = String(core?.device || '').trim().toLowerCase();\n if (raw === Device.Mobile) return Device.Mobile;\n if (raw === Device.Desktop) return Device.Desktop;\n return '';\n};\n\n// buildFingerprintGenerator \u53EA\u5728\u201C\u6CA1\u6709\u53EF\u590D\u7528 core.fingerprint\u201D\u65F6\u515C\u5E95\u751F\u6210\u4E00\u6B21\u3002\nconst buildFingerprintGenerator = ({ locale, browserMajorVersion, device }) => {\n\treturn new FingerprintGenerator(\n AntiCheat.getFingerprintGeneratorOptions({\n locale,\n browserMajorVersion,\n device,\n }),\n\t);\n};\n\nconst generateFingerprintForCore = ({ locale, browserMajorVersion, device }) => {\n const requestedBrowserMajorVersion = Number(browserMajorVersion || 0);\n const generator = buildFingerprintGenerator({\n locale,\n browserMajorVersion: requestedBrowserMajorVersion,\n device,\n });\n\n try {\n return {\n fingerprint: generator.getFingerprint(),\n exactBrowserMajorVersion: requestedBrowserMajorVersion > 0,\n };\n } catch (error) {\n if (requestedBrowserMajorVersion <= 0) {\n throw error;\n }\n logger.warn(\n `\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}`,\n );\n }\n\n const fallbackGenerator = buildFingerprintGenerator({\n locale,\n browserMajorVersion: 0,\n device,\n });\n return {\n fingerprint: fallbackGenerator.getFingerprint(),\n exactBrowserMajorVersion: false,\n };\n};\n\n// buildReplayableBrowserProfile \u8D1F\u8D23\u628A\u201C\u767B\u5F55\u6001 env\u201D\u63D0\u5347\u6210\u201C\u53EF\u8DE8\u673A\u5668\u590D\u7528\u7684\u6D4F\u89C8\u5668\u771F\u6E90\u201D\u3002\n// \u89C4\u5219\u662F\uFF1A\n// 1. \u6CA1\u6709\u767B\u5F55\u6001\u65F6\uFF0C\u4E0D\u5F3A\u6C42\u751F\u6210\u6301\u4E45\u5316\u6307\u7EB9\uFF1B\n// 2. \u6709\u767B\u5F55\u6001\u4F46\u6CA1\u6709 core.fingerprint \u65F6\uFF0C\u9996\u6B21\u751F\u6210\u5E76\u5199\u56DE runtimeState\uFF1B\n// 3. \u6D4F\u89C8\u5668\u5927\u7248\u672C\u6216 device \u53D8\u5316\u65F6\uFF0C\u5141\u8BB8\u91CD\u5EFA core\uFF0C\u907F\u514D\u65E7\u771F\u6E90\u4E0E\u65B0\u8FD0\u884C\u65F6\u4E0D\u517C\u5BB9\u3002\nconst buildReplayableBrowserProfile = (runtimeState, launcher) => {\n const device = resolveRuntimeDevice(runtimeState);\n if (!runtimeState || !RuntimeEnv.hasLoginState(runtimeState)) {\n return { runtimeState, browserProfileCore: null };\n }\n\n let nextState = RuntimeEnv.rememberState(runtimeState);\n let browserProfileCore = RuntimeEnv.getBrowserProfileCore(nextState);\n const timezoneId = String(browserProfileCore?.timezone_id || '').trim() || AntiCheat.getBaseConfig().timezoneId;\n const locale = DEFAULT_LOCALE;\n const currentBrowserMajorVersion = detectBrowserMajorVersion(launcher);\n const storedBrowserMajorVersion = Number(browserProfileCore?.browser_major_version || 0);\n const storedDevice = resolveCoreDevice(browserProfileCore);\n // core \u662F\u201C\u6307\u7EB9\u771F\u6E90\u201D\uFF0Cdevice / browser major \u53D8\u5316\u65F6\u5FC5\u987B\u91CD\u5EFA\uFF1B\n // \u5426\u5219 runtime \u8868\u9762\u5DF2\u7ECF\u5207\u6362\uFF0C\u5E95\u5C42 still \u53EF\u80FD\u6CBF\u7528\u65E7\u684C\u9762\u6307\u7EB9\u3002\n const needsDeviceRebuild = storedDevice\n ? storedDevice !== device\n : device === Device.Mobile;\n const needsRebuild = !browserProfileCore?.fingerprint\n || Object.keys(browserProfileCore.fingerprint || {}).length === 0\n || needsDeviceRebuild\n || (currentBrowserMajorVersion > 0 && storedBrowserMajorVersion > 0 && storedBrowserMajorVersion !== currentBrowserMajorVersion);\n\n if (needsRebuild) {\n const generated = generateFingerprintForCore({\n locale,\n browserMajorVersion: currentBrowserMajorVersion,\n device,\n });\n const fingerprint = generated.fingerprint;\n const fingerprintBrowserMajorVersion = parseChromeMajorVersion(fingerprint?.fingerprint?.navigator?.userAgent || '');\n browserProfileCore = {\n fingerprint,\n device,\n timezone_id: timezoneId,\n locale,\n browser_major_version: currentBrowserMajorVersion > 0 ? currentBrowserMajorVersion : fingerprintBrowserMajorVersion,\n schema_version: DEFAULT_BROWSER_PROFILE_SCHEMA_VERSION,\n };\n nextState = RuntimeEnv.setBrowserProfileCore(nextState, browserProfileCore);\n logger.info(\n `\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}`,\n );\n return { runtimeState: nextState, browserProfileCore };\n }\n\n const normalizedBrowserProfileCore = {\n ...browserProfileCore,\n device,\n timezone_id: timezoneId,\n locale,\n schema_version: Number(browserProfileCore.schema_version || 0) > 0\n ? Number(browserProfileCore.schema_version || 0)\n : DEFAULT_BROWSER_PROFILE_SCHEMA_VERSION,\n browser_major_version: currentBrowserMajorVersion > 0\n ? currentBrowserMajorVersion\n : Number(browserProfileCore.browser_major_version || 0),\n };\n\n const currentCoreRaw = JSON.stringify(browserProfileCore || {});\n const nextCoreRaw = JSON.stringify(normalizedBrowserProfileCore);\n if (currentCoreRaw !== nextCoreRaw) {\n nextState = RuntimeEnv.setBrowserProfileCore(nextState, normalizedBrowserProfileCore);\n }\n\n return {\n runtimeState: nextState,\n browserProfileCore: normalizedBrowserProfileCore,\n\t};\n};\n\nconst applyFingerprintPageOptions = (pageOptions = {}, { fingerprintWithHeaders = null, locale = '', timezoneId = '' } = {}) => {\n if (!pageOptions || typeof pageOptions !== 'object') return;\n const fingerprint = fingerprintWithHeaders?.fingerprint || fingerprintWithHeaders;\n if (!fingerprint || typeof fingerprint !== 'object') return;\n\n const screen = fingerprint?.screen || {};\n const navigatorFingerprint = fingerprint?.navigator || {};\n const headers = fingerprintWithHeaders?.headers || {};\n const userAgent = String(navigatorFingerprint.userAgent || headers['user-agent'] || '').trim();\n const width = Number(screen.width || 0);\n const height = Number(screen.height || 0);\n const dpr = Number(screen.devicePixelRatio || 0);\n const maxTouchPoints = Number(navigatorFingerprint.maxTouchPoints || 0);\n const isMobile = navigatorFingerprint.userAgentData?.mobile === true || headers['sec-ch-ua-mobile'] === '?1' || /Mobile|Android/i.test(userAgent);\n\n if (userAgent) {\n pageOptions.userAgent = userAgent;\n }\n if (width > 0 && height > 0) {\n pageOptions.viewport = { width, height };\n pageOptions.screen = { width, height };\n }\n pageOptions.isMobile = isMobile;\n pageOptions.hasTouch = maxTouchPoints > 0;\n if (dpr > 0) {\n pageOptions.deviceScaleFactor = dpr;\n }\n if (locale) {\n pageOptions.locale = locale;\n }\n if (timezoneId) {\n pageOptions.timezoneId = timezoneId;\n }\n};\n\n// buildReplayBrowserPoolOptions \u8BA9 BrowserPool / Playwright / FingerprintInjector\n// \u90FD\u4ECE\u540C\u4E00\u4EFD core.fingerprint \u6D3E\u751F\u53C2\u6570\uFF0C\u907F\u514D UA / viewport / JS \u6307\u7EB9\u591A\u771F\u6E90\u51B2\u7A81\u3002\nconst buildReplayBrowserPoolOptions = (browserProfileCore) => {\n const fingerprintWithHeaders = browserProfileCore?.fingerprint;\n const fingerprint = fingerprintWithHeaders?.fingerprint;\n if (!fingerprintWithHeaders || !fingerprint) {\n return null;\n }\n\n return {\n useFingerprints: false,\n prePageCreateHooks: [\n (_pageId, _browserController, pageOptions = {}) => {\n if (!pageOptions || typeof pageOptions !== 'object') return;\n applyFingerprintPageOptions(pageOptions, {\n fingerprintWithHeaders,\n locale: browserProfileCore.locale,\n timezoneId: browserProfileCore.timezone_id,\n });\n },\n ],\n postPageCreateHooks: [\n async (page) => {\n const context = page?.context?.();\n if (!context) return;\n if (!injectedContexts.has(context)) {\n await fingerprintInjector.attachFingerprintToPlaywright(context, fingerprintWithHeaders);\n injectedContexts.add(context);\n }\n },\n ],\n };\n};\n\nexport const DefaultLaunch = {\n getPlaywrightCrawlerOptions(options = {}) {\n const normalizedOptions = Array.isArray(options) ? { customArgs: options } : (options || {});\n const {\n customArgs = [],\n proxyConfiguration = {},\n log: logOptions = null,\n runInHeadfulMode = false,\n debugMode = false,\n isRunningOnApify = false,\n launcher = null,\n preNavigationHooks = [],\n postNavigationHooks = [],\n runtimeState = null,\n } = normalizedOptions;\n const device = resolveRuntimeDevice(runtimeState);\n\n const enableByPassLogger = Boolean(logOptions && logOptions.enable);\n const traffic = resolveLaunchTraffic({ proxyConfiguration, debugMode });\n const trafficHook = createLaunchTrafficHook({\n ...traffic,\n enabled: enableByPassLogger,\n });\n\n\t\t// \u542F\u52A8\u524D\u5148\u786E\u5B9A\u662F\u5426\u8D70\u201C\u7A33\u5B9A\u56DE\u653E\u6A21\u5F0F\u201D\u3002\n\t\tconst replayContext = buildReplayableBrowserProfile(runtimeState, launcher);\n\t\tconst replayBrowserPoolOptions = buildReplayBrowserPoolOptions(replayContext.browserProfileCore);\n\t\tconst launchLocale = String(replayContext.browserProfileCore?.locale || DEFAULT_LOCALE).trim() || DEFAULT_LOCALE;\n\n const launchOptions = {\n args: [\n ...AntiCheat.getLaunchArgs({ locale: launchLocale }),\n ...customArgs,\n ],\n ignoreDefaultArgs: ['--enable-automation'],\n };\n\n if (traffic.launchProxy) {\n launchOptions.proxy = traffic.launchProxy;\n }\n\n logLaunchTraffic({\n ...traffic,\n debugMode,\n enabled: enableByPassLogger,\n });\n\n const onPageCreated = (page) => {\n const recommendedGotoOptions = {\n waitUntil: 'commit',\n };\n\n if (!page || typeof page.on !== 'function') {\n return recommendedGotoOptions;\n }\n trafficHook(page);\n return recommendedGotoOptions;\n };\n\n const launchContext = {\n useIncognitoPages: true,\n launchOptions,\n };\n if (launcher) {\n launchContext.launcher = launcher;\n }\n\n const crawlerBaseOptions = {\n ...DEFAULT_CRAWLER_BASE_OPTIONS,\n headless: !runInHeadfulMode || isRunningOnApify,\n\t\t\t// \u6709 core.fingerprint \u65F6\u8D70\u56FA\u5B9A\u56DE\u653E\uFF1B\u5426\u5219\u9000\u56DE Crawlee \u9ED8\u8BA4\u6307\u7EB9\u6A21\u5F0F\u3002\n\t\t\tbrowserPoolOptions: replayBrowserPoolOptions || {\n\t\t\t\tuseFingerprints: true,\n\t\t\t\tfingerprintOptions: {\n fingerprintGeneratorOptions: AntiCheat.getFingerprintGeneratorOptions({\n locale: launchLocale,\n device,\n }),\n },\n prePageCreateHooks: [\n (_pageId, browserController, pageOptions = {}) => {\n const fingerprintWithHeaders = browserController?.launchContext?.fingerprint;\n const timezoneId = AntiCheat.getBaseConfig().timezoneId;\n applyFingerprintPageOptions(pageOptions, {\n fingerprintWithHeaders,\n locale: launchLocale,\n timezoneId,\n });\n },\n ],\n },\n launchContext,\n };\n\n const normalizedPreNavigationHooks = Array.isArray(preNavigationHooks) ? preNavigationHooks : [];\n const normalizedPostNavigationHooks = Array.isArray(postNavigationHooks) ? postNavigationHooks : [];\n\n const internalPreNavigationHook = async ({ page }, gotoOptions = {}) => {\n const recommendedGotoOptions = onPageCreated(page);\n if (recommendedGotoOptions && typeof recommendedGotoOptions === 'object') {\n Object.assign(gotoOptions, recommendedGotoOptions);\n }\n };\n\n return {\n ...crawlerBaseOptions,\n preNavigationHooks: [internalPreNavigationHook, ...normalizedPreNavigationHooks],\n ...(normalizedPostNavigationHooks.length > 0\n ? { postNavigationHooks: normalizedPostNavigationHooks }\n : {}),\n };\n },\n};\n\nexport const Launch = DefaultLaunch;\n", "import picomatch from 'picomatch';\n\nconst normalizeByPassDomains = (domains) => {\n if (!Array.isArray(domains)) return [];\n return domains\n .map((item) => String(item || '').trim())\n .filter(Boolean);\n};\n\nconst normalizeHostname = (value = '') => String(value || '').trim().toLowerCase();\n\nconst buildByPassDomainRule = (rawPattern) => {\n const pattern = String(rawPattern || '').trim().toLowerCase();\n if (!pattern) return null;\n\n let matcher;\n try {\n matcher = picomatch(pattern, { nocase: true });\n } catch {\n return null;\n }\n\n return {\n pattern,\n test: (hostname) => matcher(String(hostname || '').toLowerCase()),\n };\n};\n\nconst buildByPassDomainRules = (domains = []) => {\n return normalizeByPassDomains(domains)\n .map((domain) => buildByPassDomainRule(domain))\n .filter(Boolean);\n};\n\nconst findMatchedByPassRule = (rules = [], requestUrl = '') => {\n let hostname = '';\n try {\n hostname = normalizeHostname(new URL(String(requestUrl || '')).hostname);\n } catch {\n return null;\n }\n\n for (const rule of rules) {\n if (rule && typeof rule.test === 'function' && rule.test(hostname)) {\n return {\n rule,\n hostname,\n };\n }\n }\n\n return {\n rule: null,\n hostname,\n };\n};\n\nconst isDomainCoveredByByPass = (domain = '', rules = []) => {\n const hostname = normalizeHostname(domain);\n if (!hostname) return false;\n\n for (const rule of rules || []) {\n if (!rule || typeof rule.test !== 'function') continue;\n if (rule.test(hostname)) return true;\n }\n\n return false;\n};\n\nconst resolveRouteByProxy = ({\n requestUrl = '',\n enableProxy = false,\n byPassRules = [],\n}) => {\n if (!enableProxy) {\n return { route: 'direct', matchedRule: null, hostname: '' };\n }\n\n const matched = findMatchedByPassRule(byPassRules, requestUrl);\n if (!matched) {\n return { route: 'proxy', matchedRule: null, hostname: '' };\n }\n\n if (matched.rule) {\n return { route: 'direct', matchedRule: matched.rule, hostname: matched.hostname };\n }\n\n return { route: 'proxy', matchedRule: null, hostname: matched.hostname };\n};\n\nexport const ByPass = {\n normalizeByPassDomains,\n normalizeHostname,\n buildByPassDomainRule,\n buildByPassDomainRules,\n findMatchedByPassRule,\n isDomainCoveredByByPass,\n resolveRouteByProxy,\n};\n", "import { ByPass } from '../../proxy-bypass.js';\nimport { createInternalLogger } from '../logger.js';\nimport { ProxyMeterRuntime } from '../proxy-meter-runtime.js';\n\nconst logger = createInternalLogger('Launch');\n\nconst normalizeObject = (value) => {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return {};\n }\n\n return value;\n};\n\nconst parseProxyConfiguration = (proxyConfiguration = {}) => {\n const config = normalizeObject(proxyConfiguration);\n const proxyUrl = String(config.proxy_url || '').trim();\n const enableProxy = typeof config.enable_proxy === 'boolean'\n ? config.enable_proxy\n : proxyUrl !== '';\n const byPassDomains = enableProxy && proxyUrl\n ? ByPass.normalizeByPassDomains(config.by_pass_domains)\n : [];\n\n return {\n byPassDomains,\n enableProxy,\n proxyUrl,\n };\n};\n\nexport const resolveLaunchTraffic = ({\n proxyConfiguration = {},\n debugMode = false,\n useMeter = true,\n} = {}) => {\n const { byPassDomains, enableProxy, proxyUrl } = parseProxyConfiguration(proxyConfiguration);\n const byPassRules = ByPass.buildByPassDomainRules(byPassDomains);\n const proxyMeter = useMeter && enableProxy && proxyUrl\n ? ProxyMeterRuntime.startProxyMeter({ proxyUrl, debugMode })\n : null;\n const launchProxy = proxyMeter ? { server: proxyMeter.server } : null;\n\n if (launchProxy && byPassDomains.length > 0) {\n launchProxy.bypass = byPassDomains.join(',');\n }\n\n return {\n byPassDomains,\n byPassRules,\n enableProxy,\n proxyUrl,\n launchProxy,\n };\n};\n\nexport const logLaunchTraffic = ({\n byPassDomains = [],\n debugMode = false,\n enabled = false,\n enableProxy = false,\n explicitProxy = false,\n launchProxy = null,\n proxyUrl = '',\n} = {}) => {\n if (!enabled) return;\n\n if (explicitProxy) {\n logger.info('[\u4EE3\u7406\u5DF2\u542F\u7528] \u4F7F\u7528\u663E\u5F0F proxy \u914D\u7F6E\uFF0C\u8DF3\u8FC7 toolkit \u672C\u5730\u6D41\u91CF\u89C2\u6D4B');\n return;\n }\n\n if (launchProxy) {\n let upstreamLabel = '';\n try {\n const parsedProxyUrl = new URL(proxyUrl.includes('://') ? proxyUrl : `http://${proxyUrl}`);\n upstreamLabel = `${parsedProxyUrl.protocol}//${parsedProxyUrl.host}`;\n } catch {}\n logger.info(\n `[\u4EE3\u7406\u5DF2\u542F\u7528] \u672C\u5730=${launchProxy.server} \u4E0A\u6E38=${upstreamLabel || '-'} \u76F4\u8FDE\u57DF\u540D=${byPassDomains.join(',')}`,\n );\n logger.info(`[\u6D41\u91CF\u89C2\u6D4B] \u9010\u8BF7\u6C42\u8C03\u8BD5=${Boolean(debugMode) ? '\u5F00\u542F' : '\u5173\u95ED'}\uFF08\u6C47\u603B\u59CB\u7EC8\u5F00\u542F\uFF09`);\n return;\n }\n\n if (enableProxy) {\n logger.info('[\u4EE3\u7406\u672A\u542F\u7528] enable_proxy=true \u4F46 proxy_url \u4E3A\u7A7A');\n } else if (proxyUrl) {\n logger.info('[\u4EE3\u7406\u672A\u542F\u7528] enable_proxy=false \u4E14 proxy_url \u5DF2\u914D\u7F6E');\n }\n logger.info(`[\u6D41\u91CF\u89C2\u6D4B] \u9010\u8BF7\u6C42\u8C03\u8BD5=${Boolean(debugMode) ? '\u5F00\u542F' : '\u5173\u95ED'}\uFF08\u6C47\u603B\u59CB\u7EC8\u5F00\u542F\uFF09`);\n};\n\nexport const createLaunchTrafficHook = ({\n byPassDomains = [],\n byPassRules = [],\n enabled = false,\n launchProxy = null,\n} = {}) => {\n const patchedPages = new WeakSet();\n\n return (page) => {\n if (!page || typeof page.on !== 'function' || patchedPages.has(page)) {\n return;\n }\n\n patchedPages.add(page);\n page.on('request', (req) => {\n const requestUrl = req.url();\n const resourceType = req.resourceType();\n const matched = byPassDomains.length > 0\n ? ByPass.findMatchedByPassRule(byPassRules, requestUrl)\n : null;\n\n if (launchProxy) {\n ProxyMeterRuntime.recordProxyMeterResourceType(requestUrl, resourceType);\n }\n if (!enabled || byPassDomains.length === 0) return;\n if (!matched || !matched.rule) return;\n\n logger.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}`);\n });\n };\n};\n", "import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nimport { createInternalLogger } from '../logger.js';\nimport { ByPass } from '../../proxy-bypass.js';\nimport {\n createLaunchTrafficHook,\n logLaunchTraffic,\n resolveLaunchTraffic,\n} from './traffic.js';\n\nconst logger = createInternalLogger('Launch');\nconst execFileAsync = promisify(execFile);\n\nconst DEFAULT_CLOAK_CRAWLER_BASE_OPTIONS = Object.freeze({\n maxConcurrency: 1,\n maxRequestRetries: 0,\n requestHandlerTimeoutSecs: 240,\n navigationTimeoutSecs: 120,\n});\n\nconst DEFAULT_CLOAK_HUMANIZE_OPTIONS = Object.freeze({\n humanize: true,\n});\n\nconst DEFAULT_CLOAK_GOTO_OPTIONS = Object.freeze({\n waitUntil: 'commit',\n});\n\nlet cachedCloakModulePromise = null;\n\nconst hasOwn = (target, key) => Object.prototype.hasOwnProperty.call(target, key);\n\nconst loadCloakModule = async () => {\n if (!cachedCloakModulePromise) {\n cachedCloakModulePromise = import('cloakbrowser').catch((error) => {\n cachedCloakModulePromise = null;\n throw new Error('Cloak \u6A21\u5757\u52A0\u8F7D\u5931\u8D25\uFF0C\u8BF7\u786E\u8BA4\u5F53\u524D\u8FD0\u884C\u73AF\u5883\u5DF2\u5B89\u88C5 cloakbrowser\u3002', {\n cause: error,\n });\n });\n }\n\n return cachedCloakModulePromise;\n};\n\nconst buildCloakLaunchOptions = async (options = {}) => {\n const { buildLaunchOptions } = await loadCloakModule();\n return await buildLaunchOptions(normalizeObject(options));\n};\n\nconst normalizeObject = (value) => {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return {};\n }\n\n return value;\n};\n\nconst normalizeStringArray = (value) => {\n if (!Array.isArray(value)) {\n return [];\n }\n\n return value.map((item) => String(item || '').trim()).filter(Boolean);\n};\n\nconst resolveCloakProxy = (proxyConfiguration = {}) => {\n const config = normalizeObject(proxyConfiguration);\n const proxyUrl = String(config.proxy_url || '').trim();\n const enableProxy = typeof config.enable_proxy === 'boolean' ? config.enable_proxy : proxyUrl !== '';\n\n if (!enableProxy || !proxyUrl) {\n return null;\n }\n\n const byPassDomains = ByPass.normalizeByPassDomains(config.by_pass_domains);\n if (byPassDomains.length === 0) {\n return proxyUrl;\n }\n\n const parsedProxyUrl = new URL(proxyUrl.includes('://') ? proxyUrl : `http://${proxyUrl}`);\n return {\n server: `${parsedProxyUrl.protocol}//${parsedProxyUrl.host}`,\n username: decodeURIComponent(parsedProxyUrl.username || ''),\n password: decodeURIComponent(parsedProxyUrl.password || ''),\n bypass: byPassDomains.join(','),\n };\n};\n\nconst extractFingerprintArg = (launchOptions = {}) => {\n const args = Array.isArray(launchOptions?.args) ? launchOptions.args : [];\n return args.find((value) => String(value || '').startsWith('--fingerprint=')) || '';\n};\n\nconst createStableGotoHook = (recommendedGotoOptions = DEFAULT_CLOAK_GOTO_OPTIONS) => {\n const normalizedRecommendedGotoOptions = normalizeObject(recommendedGotoOptions);\n const fallbackGotoOptions = Object.keys(normalizedRecommendedGotoOptions).length > 0\n ? normalizedRecommendedGotoOptions\n : DEFAULT_CLOAK_GOTO_OPTIONS;\n\n return async (_crawlingContext, gotoOptions = {}) => {\n for (const [key, value] of Object.entries(fallbackGotoOptions)) {\n if (gotoOptions[key] == null) {\n gotoOptions[key] = value;\n }\n }\n };\n};\n\nconst attachCloakHumanizeHook = ({\n browserPoolOptions = {},\n activeBrowsers,\n patchedBrowsers,\n humanizeOptions = DEFAULT_CLOAK_HUMANIZE_OPTIONS,\n} = {}) => {\n const normalizedBrowserPoolOptions = normalizeObject(browserPoolOptions);\n const shouldHumanize = humanizeOptions !== false;\n const normalizedHumanizeOptions = shouldHumanize\n ? {\n ...DEFAULT_CLOAK_HUMANIZE_OPTIONS,\n ...normalizeObject(humanizeOptions),\n }\n : null;\n\n return {\n ...normalizedBrowserPoolOptions,\n useFingerprints: false,\n postLaunchHooks: [\n ...(Array.isArray(normalizedBrowserPoolOptions.postLaunchHooks)\n ? normalizedBrowserPoolOptions.postLaunchHooks\n : []),\n async (_pageId, browserController) => {\n const browser = browserController?.browser;\n if (!browser || typeof browser.contexts !== 'function') {\n return;\n }\n\n activeBrowsers.add(browser);\n if (typeof browser.once === 'function') {\n browser.once('disconnected', () => {\n activeBrowsers.delete(browser);\n });\n }\n\n if (!shouldHumanize || patchedBrowsers.has(browser)) {\n return;\n }\n\n const { humanizeBrowser } = await loadCloakModule();\n await humanizeBrowser(browser, normalizedHumanizeOptions);\n patchedBrowsers.add(browser);\n },\n ],\n };\n};\n\nconst closeTrackedBrowsers = async (activeBrowsers) => {\n const browsers = Array.from(activeBrowsers || []);\n activeBrowsers?.clear?.();\n\n await Promise.allSettled(\n browsers.map(async (browser) => {\n if (!browser || typeof browser.isConnected !== 'function' || !browser.isConnected()) {\n return;\n }\n\n await browser.close().catch(() => {});\n }),\n );\n};\n\nconst forceTerminateBrowsersByFingerprintArg = async (fingerprintArg) => {\n if (!fingerprintArg) {\n return;\n }\n\n await execFileAsync('pkill', ['-f', '--', fingerprintArg]).catch((error) => {\n if (error?.code === 1 || error?.code === 'ENOENT') {\n return;\n }\n\n logger.info(`\u5F3A\u5236\u5173\u95ED Cloak \u8FDB\u7A0B\u5931\u8D25\uFF08\u5FFD\u7565\uFF09: ${error?.message || String(error)}`);\n });\n};\n\nexport const CloakLaunch = {\n resolveProxyConfiguration(proxyConfiguration = {}) {\n return resolveCloakProxy(proxyConfiguration);\n },\n\n extractFingerprintArg(launchOptions = {}) {\n return extractFingerprintArg(launchOptions);\n },\n\n createStableGotoHook(recommendedGotoOptions = DEFAULT_CLOAK_GOTO_OPTIONS) {\n return createStableGotoHook(recommendedGotoOptions);\n },\n\n async getPlaywrightCrawlerOptions(options = {}) {\n const runtime = await CloakLaunch.createPlaywrightCrawlerRuntime(options);\n return Object.defineProperties(runtime.crawlerOptions, {\n cleanup: {\n enumerable: false,\n value: runtime.cleanup,\n },\n closeActiveBrowsers: {\n enumerable: false,\n value: runtime.closeActiveBrowsers,\n },\n forceTerminateActiveProcesses: {\n enumerable: false,\n value: runtime.forceTerminateActiveProcesses,\n },\n });\n },\n\n async buildLaunchOptions(options = {}) {\n return await buildCloakLaunchOptions(options);\n },\n\n async createPlaywrightCrawlerRuntime(options = {}) {\n const normalizedOptions = normalizeObject(options);\n const {\n proxyConfiguration = {},\n log: logOptions = null,\n debugMode = false,\n runInHeadfulMode = false,\n isRunningOnApify = false,\n launcher = null,\n cloakOptions = {},\n humanizeOptions = DEFAULT_CLOAK_HUMANIZE_OPTIONS,\n crawlerBaseOptions = {},\n browserPoolOptions = {},\n launchContext = {},\n preNavigationHooks = [],\n postNavigationHooks = [],\n recommendedGotoOptions = DEFAULT_CLOAK_GOTO_OPTIONS,\n } = normalizedOptions;\n\n const normalizedCloakOptions = normalizeObject(cloakOptions);\n const activeBrowsers = new Set();\n const patchedBrowsers = new WeakSet();\n const defaultArgs = isRunningOnApify ? ['--no-sandbox', '--disable-setuid-sandbox'] : [];\n const extraArgs = normalizeStringArray(normalizedCloakOptions.args);\n const hasExplicitProxy = hasOwn(normalizedCloakOptions, 'proxy');\n const proxyLaunchState = hasExplicitProxy\n ? resolveLaunchTraffic({ proxyConfiguration, debugMode, useMeter: false })\n : resolveLaunchTraffic({ proxyConfiguration, debugMode });\n const proxy = hasExplicitProxy ? normalizedCloakOptions.proxy : proxyLaunchState.launchProxy;\n const headless = hasOwn(normalizedCloakOptions, 'headless')\n ? normalizedCloakOptions.headless\n : (!runInHeadfulMode || isRunningOnApify);\n const enableByPassLogger = Boolean(logOptions && logOptions.enable);\n\n const mergedCloakOptions = {\n ...normalizedCloakOptions,\n headless,\n proxy,\n args: [...defaultArgs, ...extraArgs],\n };\n\n const launchOptions = await buildCloakLaunchOptions(mergedCloakOptions);\n const fingerprintArg = extractFingerprintArg(launchOptions);\n const internalPreNavigationHook = createStableGotoHook(recommendedGotoOptions);\n const trafficHook = createLaunchTrafficHook({\n byPassDomains: proxyLaunchState.byPassDomains,\n byPassRules: proxyLaunchState.byPassRules,\n enabled: enableByPassLogger,\n launchProxy: proxyLaunchState.launchProxy,\n });\n const normalizedPreNavigationHooks = Array.isArray(preNavigationHooks) ? preNavigationHooks : [];\n const normalizedPostNavigationHooks = Array.isArray(postNavigationHooks) ? postNavigationHooks : [];\n\n logLaunchTraffic({\n ...proxyLaunchState,\n debugMode,\n enabled: enableByPassLogger,\n explicitProxy: hasExplicitProxy,\n });\n\n const crawlerOptions = {\n ...DEFAULT_CLOAK_CRAWLER_BASE_OPTIONS,\n ...normalizeObject(crawlerBaseOptions),\n headless,\n launchContext: {\n useIncognitoPages: true,\n ...normalizeObject(launchContext),\n ...(launcher ? { launcher } : {}),\n launchOptions,\n },\n browserPoolOptions: attachCloakHumanizeHook({\n browserPoolOptions,\n activeBrowsers,\n patchedBrowsers,\n humanizeOptions,\n }),\n preNavigationHooks: [\n async (crawlingContext, gotoOptions = {}) => {\n trafficHook(crawlingContext?.page);\n await internalPreNavigationHook(crawlingContext, gotoOptions);\n },\n ...normalizedPreNavigationHooks,\n ],\n ...(normalizedPostNavigationHooks.length > 0\n ? { postNavigationHooks: normalizedPostNavigationHooks }\n : {}),\n };\n\n const closeActiveBrowsers = async () => {\n await closeTrackedBrowsers(activeBrowsers);\n };\n\n const forceTerminateActiveProcesses = async () => {\n await forceTerminateBrowsersByFingerprintArg(fingerprintArg);\n };\n\n const cleanup = async () => {\n await closeActiveBrowsers();\n await forceTerminateActiveProcesses();\n };\n\n return {\n headless,\n launchOptions,\n fingerprintArg,\n crawlerOptions,\n closeActiveBrowsers,\n forceTerminateActiveProcesses,\n cleanup,\n };\n },\n};\n", "import { Mode } from './constants.js';\nimport { withModeReflect } from './internals/reflect.js';\nimport { CloakLaunch, DefaultLaunch } from './internals/launch/index.js';\n\nconst launchStrategies = {\n [Mode.Default]: DefaultLaunch,\n [Mode.Cloak]: CloakLaunch,\n};\n\nexport const Launch = withModeReflect('Launch', launchStrategies);\n", "import express from 'express';\nimport { Actor } from 'apify';\nimport { PresetOfLiveViewKey } from './constants';\nimport { createInternalLogger } from './internals/logger';\nimport { capturePageScreenshot } from './internals/screenshot';\n\nconst logger = createInternalLogger('LiveView');\n\n/**\n * \u542F\u52A8\u4E00\u4E2A Web \u670D\u52A1\u5668\u4EE5\u5728 Live View \u9009\u9879\u5361\u4E2D\u663E\u793A\u6700\u65B0\u7684\u5C4F\u5E55\u622A\u56FE\u3002\n */\nasync function startLiveViewServer(liveViewKey) {\n const app = express();\n\n app.get('/', async (req, res) => {\n try {\n // \u4ECE\u9ED8\u8BA4\u7684 Key-Value Store \u4E2D\u8BFB\u53D6\u6700\u65B0\u7684\u5C4F\u5E55\u622A\u56FE\n const screenshotBuffer = await Actor.getValue(liveViewKey);\n\n if (!screenshotBuffer) {\n // \u5982\u679C\u8FD8\u6CA1\u6709\u622A\u56FE\uFF0C\u53D1\u9001\u4E00\u4E2A\u81EA\u52A8\u5237\u65B0\u7684\u5360\u4F4D\u9875\u9762\n res.send('<html><head><meta http-equiv=\"refresh\" content=\"2\"></head><body>\u7B49\u5F85\u7B2C\u4E00\u4E2A\u5C4F\u5E55\u622A\u56FE...</body></html>');\n return;\n }\n\n // \u5C06 Buffer \u8F6C\u6362\u4E3A Base64 \u5B57\u7B26\u4E32\n const screenshotBase64 = screenshotBuffer.toString('base64');\n\n // \u53D1\u9001\u4E00\u4E2A HTML \u9875\u9762\uFF0C\u8BE5\u9875\u9762\u6BCF 1 \u79D2\u81EA\u52A8\u5237\u65B0\u4E00\u6B21\uFF0C\u5E76\u663E\u793A\u622A\u56FE\n res.send(`\n <html>\n <head>\n <title>Live View (\u622A\u56FE)</title>\n <meta http-equiv=\"refresh\" content=\"1\">\n </head>\n <body style=\"margin:0; padding:0;\">\n <img src=\"data:image/png;base64,${screenshotBase64}\" \n alt=\"Live View Screenshot\" \n style=\"width: 100%; height: auto;\" />\n </body>\n </html>\n `);\n } catch (error) {\n logger.fail('Live View Server', error);\n res.status(500).send(`\u65E0\u6CD5\u52A0\u8F7D\u5C4F\u5E55\u622A\u56FE: ${error.message}`);\n }\n });\n\n // \u76D1\u542C Apify \u5BB9\u5668\u7AEF\u53E3 \n const port = process.env.APIFY_CONTAINER_PORT || 4321;\n app.listen(port, () => { logger.success('startLiveViewServer', `\u76D1\u542C\u7AEF\u53E3 ${port}`); });\n}\n\n/**\n * \u62CD\u6444\u5F53\u524D\u9875\u9762\u7684\u5C4F\u5E55\u622A\u56FE\u5E76\u5C06\u5176\u4FDD\u5B58\u5230 Key-Value Store\u3002\n * @param {import('playwright').Page} page\n * @param {string} [logMessage] - \u53EF\u9009\u7684\u65E5\u5FD7\u6D88\u606F\u3002\n */\nasync function takeLiveScreenshot(liveViewKey, page, logMessage) {\n try {\n const buffer = await capturePageScreenshot(page, { type: 'png' });\n await Actor.setValue(liveViewKey, buffer, { contentType: 'image/png' });\n if (logMessage) {\n logger.info(`(\u622A\u56FE): ${logMessage}`);\n }\n } catch (e) {\n logger.warn(`\u65E0\u6CD5\u6355\u83B7 Live View \u5C4F\u5E55\u622A\u56FE: ${e.message}`);\n }\n}\n\nconst useLiveView = (liveViewKey = PresetOfLiveViewKey) => {\n return {\n takeLiveScreenshot: async (page, logMessage) => {\n return await takeLiveScreenshot(liveViewKey, page, logMessage)\n },\n startLiveViewServer: async () => {\n return await startLiveViewServer(liveViewKey);\n }\n }\n}\n\nexport const LiveView = {\n useLiveView,\n};\n", "import { v4 as uuidv4 } from 'uuid';\nimport { createInternalLogger } from './internals/logger.js';\nimport { sloveCaptcha as solveBytedanceCaptchaStrategy } from './internals/captcha/bytedance.js';\n\nconst logger = createInternalLogger('Captcha');\nconst DEFAULT_CAPTCHA_RECOGNITION_OPTIONS = Object.freeze({\n token: 'eKJvBfwfN0YRav0-VD_44E2VBSfm7l0YtddUQ7cFySI',\n apiUrl: 'https://api.jfbym.com/api/YmServer/customApi',\n});\n\nconst CAPTCHA_STRATEGIES = Object.freeze({\n bytedance: {\n sloveCaptcha: solveBytedanceCaptchaStrategy,\n },\n});\n\nconst mergeDefinedOptions = (...sources) => {\n const merged = {};\n\n for (const source of sources) {\n for (const [key, value] of Object.entries(source || {})) {\n if (value !== undefined) {\n merged[key] = value;\n }\n }\n }\n\n return merged;\n};\n\n/**\n * \u521B\u5EFA\u9A8C\u8BC1\u7801\u76D1\u63A7\u5668\uFF0C\u652F\u6301\u57FA\u4E8E DOM \u6216 URL \u7684\u9A8C\u8BC1\u7801\u68C0\u6D4B\u3002\n *\n * @param {import('playwright').Page} page\n * @param {Object} options\n * @param {string} [options.domSelector]\n * @param {string} [options.urlPattern]\n * @param {() => Promise<void>} options.onDetected\n */\nexport function useCaptchaMonitor(page, options) {\n const { domSelector, urlPattern, onDetected } = options;\n\n if (!domSelector && !urlPattern) {\n throw new Error('[CaptchaMonitor] \u5FC5\u987B\u63D0\u4F9B domSelector \u6216 urlPattern\u3002');\n }\n\n if (!onDetected || typeof onDetected !== 'function') {\n throw new Error('[CaptchaMonitor] onDetected \u5FC5\u987B\u662F\u51FD\u6570\u3002');\n }\n\n let isStopped = false;\n let isHandling = false;\n let frameHandler = null;\n let exposedFunctionName = null;\n\n const triggerDetected = async () => {\n if (isStopped || isHandling) return;\n isHandling = true;\n try {\n await onDetected();\n } finally {\n isHandling = false;\n }\n };\n\n const cleanupFns = [];\n\n if (domSelector) {\n exposedFunctionName = `__c_d_${uuidv4().replace(/-/g, '_')}`;\n const cleanerName = `__c_cleaner_${uuidv4().replace(/-/g, '_')}`;\n\n page.exposeFunction(exposedFunctionName, triggerDetected).catch(() => {\n // \u5FFD\u7565\u9875\u9762\u751F\u547D\u5468\u671F\u8FB9\u754C\u5BFC\u81F4\u7684\u91CD\u590D\u66B4\u9732\u9519\u8BEF\u3002\n });\n\n page.addInitScript(({ selector, callbackName, cleanerName: cleanupName }) => {\n (() => {\n /** @type {MutationObserver | null} */\n let observer = null;\n\n const checkAndReport = () => {\n const element = document.querySelector(selector);\n if (!element) {\n return false;\n }\n\n if (window[callbackName]) {\n window[callbackName]();\n }\n return true;\n };\n\n checkAndReport();\n\n observer = new MutationObserver((mutations) => {\n const shouldCheck = mutations.some((mutation) => mutation.addedNodes.length > 0);\n if (shouldCheck && observer) {\n checkAndReport();\n }\n });\n\n const mountObserver = () => {\n const target = document.documentElement;\n if (target && observer) {\n observer.observe(target, { childList: true, subtree: true });\n }\n };\n\n if (document.readyState === 'loading') {\n window.addEventListener('DOMContentLoaded', mountObserver);\n } else {\n mountObserver();\n }\n\n window[cleanupName] = () => {\n if (observer) {\n observer.disconnect();\n observer = null;\n }\n };\n })();\n }, { selector: domSelector, callbackName: exposedFunctionName, cleanerName });\n\n logger.success('useCaptchaMonitor', `DOM \u76D1\u63A7\u5DF2\u542F\u7528\uFF1A${domSelector}`);\n\n cleanupFns.push(async () => {\n try {\n await page.evaluate((name) => {\n if (window[name]) {\n window[name]();\n delete window[name];\n }\n }, cleanerName);\n } catch {\n // \u5BFC\u822A\u6216\u9875\u9762\u5173\u95ED\u540E\u7684\u6E05\u7406\u9519\u8BEF\u53EF\u4EE5\u5FFD\u7565\u3002\n }\n });\n }\n\n if (urlPattern) {\n frameHandler = async (frame) => {\n if (frame !== page.mainFrame()) {\n return;\n }\n\n const currentUrl = page.url();\n if (currentUrl.includes(urlPattern)) {\n await triggerDetected();\n }\n };\n\n page.on('framenavigated', frameHandler);\n logger.success('useCaptchaMonitor', `URL \u76D1\u63A7\u5DF2\u542F\u7528\uFF1A${urlPattern}`);\n\n cleanupFns.push(async () => {\n page.off('framenavigated', frameHandler);\n });\n }\n\n return {\n stop: async () => {\n logger.info('\u6B63\u5728\u505C\u6B62\u9A8C\u8BC1\u7801\u76D1\u63A7...');\n for (const fn of cleanupFns) {\n await fn();\n }\n isStopped = true;\n },\n };\n}\n\nexport const callCaptchaRecognitionApi = async (requestParams = {}) => {\n const { apiUrl, ...payload } = mergeDefinedOptions(\n DEFAULT_CAPTCHA_RECOGNITION_OPTIONS,\n requestParams,\n );\n\n if (!apiUrl) {\n throw new Error('[Captcha] \u7F3A\u5C11\u9A8C\u8BC1\u7801\u8BC6\u522B\u63A5\u53E3\u5730\u5740 apiUrl\u3002');\n }\n\n const response = await fetch(apiUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(`Captcha API request failed with status ${response.status}`);\n }\n\n return await response.json();\n};\n\nexport async function solveCaptchaWithStrategy(strategyName, page, options = {}) {\n const strategy = CAPTCHA_STRATEGIES[strategyName];\n\n if (!strategy?.sloveCaptcha) {\n throw new Error(`[Captcha] \u672A\u627E\u5230\u9A8C\u8BC1\u7801\u7B56\u7565\uFF1A${strategyName}`);\n }\n\n const resolvedOptions = mergeDefinedOptions(\n DEFAULT_CAPTCHA_RECOGNITION_OPTIONS,\n options,\n );\n\n return strategy.sloveCaptcha(page, resolvedOptions, {\n callCaptchaRecognitionApi,\n logger,\n });\n}\n\nexport const Captcha = {\n useCaptchaMonitor,\n solveCaptchaWithStrategy,\n};\n", "import { mkdir, writeFile } from 'fs/promises';\nimport path from 'path';\nimport { DeviceInput } from '../../device-input.js';\nimport { createInternalLogger } from '../logger.js';\nimport {\n clickCaptchaAction,\n dragCaptchaAction,\n isAnyCaptchaTextVisible,\n waitForVisible,\n} from './shared.js';\n\nconst logger = createInternalLogger('Captcha');\n\nconst DEFAULT_BYTEDANCE_CAPTCHA_OPTIONS = Object.freeze({\n apiType: '31234',\n maxRetries: 3,\n containerSelector: '#captcha_container',\n iframeSelector: 'iframe[src*=\"verifycenter\"]',\n iframeFallbackSelector: 'iframe',\n sourceImageSelector: '.img-container .canvas-container',\n dropTargetContainerSelector: '.drag-area',\n dropTargetTexts: ['\u62D6\u62FD\u5230\u8FD9\u91CC'],\n refreshTexts: ['\u5237\u65B0'],\n submitTexts: ['\u63D0\u4EA4'],\n guideMaskSelector: '.play-guide-mask',\n recognitionSuccessCode: 10000,\n containerVisibleTimeoutMs: 2000,\n iframeVisibleTimeoutMs: 12000,\n iframeFallbackVisibleTimeoutMs: 4000,\n contentFrameResolveRetries: 5,\n contentFrameResolveDelayMs: 500,\n actionVisibleTimeoutMs: 1500,\n sourceImageVisibleTimeoutMs: 3000,\n challengeReadyTimeoutMs: 15000,\n challengeReadyRefreshTimeoutMs: 20000,\n challengeReadyPollMs: 300,\n loadingIndicatorVisibleTimeoutMs: 200,\n loadingTexts: ['\u52A0\u8F7D\u4E2D', '\u52A0\u8F7D\u4E2D...'],\n errorTexts: [\n '\u68C0\u6D4B\u5230\u60A8\u7684\u7F51\u7EDC\u73AF\u5883\u8F83\u5DEE',\n '\u7F51\u7EDC\u73AF\u5883\u8F83\u5DEE',\n '\u8BF7\u66F4\u6362\u7F51\u7EDC\u6216\u8005\u7A0D\u540E\u518D\u8BD5',\n '\u8BF7\u66F4\u6362\u7F51\u7EDC\u6216\u7A0D\u540E\u518D\u8BD5',\n '\u7A0D\u540E\u518D\u8BD5',\n ],\n recognitionDelayMs: 2000,\n refreshWaitMs: 3000,\n submitWaitMs: 5000,\n submitReadyTimeoutMs: 2500,\n retryDelayBaseMs: 2000,\n retryDelayStepMs: 1000,\n sourceImageRowTolerancePx: 24,\n dragBetweenWaitMs: 250,\n promptBadgeCountSelector: '.drag-area .photo-badge .badge span',\n promptSubmitButtonSelector: '.vc-captcha-verify-mobile-button',\n promptSelectedSourceSelector: '.img-container .canvas-container.selected',\n promptActiveSourceSelector: '.img-container .canvas-container.active',\n promptDragMoveSteps: 16,\n promptDragStepDelayMs: 55,\n promptDragHoldDelayMs: 240,\n promptDragBeforeReleaseDelayMs: 180,\n promptDragAfterReleaseDelayMs: 240,\n promptDragFinalMoveRepeats: 3,\n promptDragRetryDelayMs: 250,\n debugArtifacts: false,\n});\n\nconst PROMPT_CAPTCHA_DRAG_PLANS = Object.freeze([\n { name: 'lower-middle', endXRatio: 0.5, endYRatio: 0.72 },\n { name: 'center-middle', endXRatio: 0.5, endYRatio: 0.56 },\n { name: 'upper-middle', endXRatio: 0.5, endYRatio: 0.4 },\n]);\n\nconst resolveCaptchaDebugDir = () => path.resolve(process.cwd(), 'storage', 'captcha-debug');\n\nconst rectOf = (rect) => {\n if (!rect) {\n return null;\n }\n\n return {\n x: Number(rect.x.toFixed(2)),\n y: Number(rect.y.toFixed(2)),\n width: Number(rect.width.toFixed(2)),\n height: Number(rect.height.toFixed(2)),\n };\n};\n\nconst collectCaptchaDebugInfo = async (page, frame, iframeLocator, attempt, phase, extra = null) => {\n const timestamp = Date.now();\n const debugDir = resolveCaptchaDebugDir();\n await mkdir(debugDir, { recursive: true });\n\n const baseName = `bytedance-${timestamp}-attempt${attempt}-${phase}`;\n const iframeScreenshotPath = path.join(debugDir, `${baseName}-iframe.png`);\n const pageScreenshotPath = path.join(debugDir, `${baseName}-page.png`);\n const htmlPath = path.join(debugDir, `${baseName}-iframe.html`);\n const infoPath = path.join(debugDir, `${baseName}-info.json`);\n\n await iframeLocator.screenshot({ path: iframeScreenshotPath }).catch(() => {});\n await page.screenshot({ path: pageScreenshotPath, fullPage: true }).catch(() => {});\n\n const html = await frame.evaluate(() => document.documentElement.outerHTML).catch(() => '');\n if (html) {\n await writeFile(htmlPath, html, 'utf8');\n }\n\n const info = await frame.evaluate(() => {\n const toRect = (element) => {\n const rect = element.getBoundingClientRect();\n return {\n x: Number(rect.x.toFixed(2)),\n y: Number(rect.y.toFixed(2)),\n width: Number(rect.width.toFixed(2)),\n height: Number(rect.height.toFixed(2)),\n };\n };\n\n const toItem = (element, index) => ({\n index,\n tag: element.tagName,\n id: element.id || '',\n className: typeof element.className === 'string' ? element.className : '',\n text: String(element.textContent || '').trim(),\n rect: toRect(element),\n });\n\n const visibleNodes = Array.from(document.querySelectorAll('body *'))\n .map(toItem)\n .filter((item) => item.rect.width > 0 && item.rect.height > 0);\n\n return {\n title: document.title,\n bodyText: String(document.body?.innerText || '').trim(),\n canvasContainers: visibleNodes.filter((item) => item.className.includes('canvas-container')),\n canvasNodes: visibleNodes.filter((item) => item.tag === 'CANVAS'),\n captchaNodes: visibleNodes.filter((item) => (\n item.id.startsWith('captcha_')\n || item.className.includes('captcha')\n || item.className.includes('verify')\n || /\u62D6\u62FD\u5230\u8FD9\u91CC|\u5237\u65B0|\u63D0\u4EA4/.test(item.text)\n )),\n visibleTextNodes: visibleNodes.filter((item) => item.text).slice(0, 300),\n };\n }).catch(() => null);\n\n if (info) {\n const payload = {\n capturedAt: new Date(timestamp).toISOString(),\n pageUrl: page.url(),\n attempt,\n phase,\n iframeScreenshotPath,\n pageScreenshotPath,\n htmlPath,\n info,\n };\n\n if (extra != null) {\n payload.extra = extra;\n }\n\n await writeFile(infoPath, JSON.stringify(payload, null, 2), 'utf8');\n }\n\n logger.info(`\u5DF2\u5199\u51FA\u9A8C\u8BC1\u7801\u8C03\u8BD5\u4EA7\u7269\uFF1A${debugDir}`);\n};\n\nconst maybeCollectCaptchaDebugInfo = async (\n page,\n frame,\n iframeLocator,\n attempt,\n phase,\n options,\n extra = null,\n) => {\n if (!options.debugArtifacts) {\n return;\n }\n\n await collectCaptchaDebugInfo(page, frame, iframeLocator, attempt, phase, extra);\n};\n\nconst extractCaptchaSerialNumbers = (apiResponse) => {\n const serialNumbers = apiResponse?.data?.data?.serial_number;\n if (!Array.isArray(serialNumbers)) {\n return [];\n }\n\n return serialNumbers\n .map((value) => Number(value))\n .filter((value) => Number.isInteger(value) && value >= 0);\n};\n\nconst resolveContentFrame = async (page, iframeLocator, options) => {\n for (let attempt = 1; attempt <= options.contentFrameResolveRetries; attempt += 1) {\n const iframeHandle = await iframeLocator.elementHandle();\n const frame = await iframeHandle?.contentFrame();\n if (frame) {\n return frame;\n }\n\n if (attempt < options.contentFrameResolveRetries) {\n await page.waitForTimeout(options.contentFrameResolveDelayMs);\n }\n }\n\n return null;\n};\n\nconst getVerifycenterCaptchaContext = async (page, options) => {\n const captchaContainer = page.locator(options.containerSelector).first();\n const isContainerVisible = await waitForVisible(\n captchaContainer,\n options.containerVisibleTimeoutMs,\n );\n\n if (!isContainerVisible) {\n return null;\n }\n\n logger.info('\u68C0\u6D4B\u5230\u9A8C\u8BC1\u7801\u5BB9\u5668\uFF0C\u5F00\u59CB\u7B49\u5F85 iframe \u52A0\u8F7D\u3002');\n\n let iframeLocator = page.locator(options.iframeSelector).first();\n let isIframeVisible = await waitForVisible(\n iframeLocator,\n options.iframeVisibleTimeoutMs,\n );\n\n if (!isIframeVisible) {\n logger.warn('\u672A\u5728\u9884\u671F\u9009\u62E9\u5668\u4E2D\u627E\u5230 verifycenter iframe\uFF0C\u5C1D\u8BD5\u5BB9\u5668\u5185\u4EFB\u610F iframe\u3002');\n iframeLocator = captchaContainer.locator(options.iframeFallbackSelector).first();\n isIframeVisible = await waitForVisible(\n iframeLocator,\n options.iframeFallbackVisibleTimeoutMs,\n );\n }\n\n if (!isIframeVisible) {\n throw new Error('verifycenter iframe not found inside captcha container.');\n }\n\n logger.info('\u9A8C\u8BC1\u7801 iframe \u5DF2\u53EF\u89C1\uFF0C\u5F00\u59CB\u89E3\u6790\u5185\u5BB9 frame\u3002');\n const frame = await resolveContentFrame(page, iframeLocator, options);\n if (!frame) {\n throw new Error('Failed to resolve verifycenter iframe content frame.');\n }\n\n return { iframeLocator, frame };\n};\n\nconst findCaptchaDropTarget = async (frame, options) => {\n const directTarget = frame.locator(options.dropTargetContainerSelector).first();\n if (await waitForVisible(directTarget, options.actionVisibleTimeoutMs)) {\n return directTarget;\n }\n\n for (const text of options.dropTargetTexts) {\n const candidates = [\n frame.getByText(text, { exact: false }).first(),\n frame.locator(`text=${text}`).first(),\n ];\n\n for (const candidate of candidates) {\n const isVisible = await waitForVisible(candidate, options.actionVisibleTimeoutMs);\n if (isVisible) {\n return candidate;\n }\n }\n }\n\n return null;\n};\n\nconst readPromptCaptchaState = async (frame, options) => frame.evaluate((selectors) => {\n const toRect = (element) => {\n if (!element) {\n return null;\n }\n\n const rect = element.getBoundingClientRect();\n return {\n x: Number(rect.x.toFixed(2)),\n y: Number(rect.y.toFixed(2)),\n width: Number(rect.width.toFixed(2)),\n height: Number(rect.height.toFixed(2)),\n };\n };\n\n const badgeNode = document.querySelector(selectors.badgeCountSelector);\n const submitButton = document.querySelector(selectors.submitButtonSelector);\n const dragArea = document.querySelector(selectors.dragAreaSelector);\n\n const badgeCount = badgeNode\n ? Number.parseInt(String(badgeNode.textContent || '').trim(), 10)\n : 0;\n\n return {\n badgeCount: Number.isFinite(badgeCount) ? badgeCount : 0,\n selectedCount: document.querySelectorAll(selectors.selectedSourceSelector).length,\n activeCount: document.querySelectorAll(selectors.activeSourceSelector).length,\n submitDisabled: submitButton ? submitButton.classList.contains('disable') : null,\n dragAreaActive: dragArea ? dragArea.classList.contains('active') : false,\n dragAreaRect: toRect(dragArea),\n };\n}, {\n badgeCountSelector: options.promptBadgeCountSelector,\n submitButtonSelector: options.promptSubmitButtonSelector,\n selectedSourceSelector: options.promptSelectedSourceSelector,\n activeSourceSelector: options.promptActiveSourceSelector,\n dragAreaSelector: options.dropTargetContainerSelector,\n}).catch(() => ({\n badgeCount: 0,\n selectedCount: 0,\n activeCount: 0,\n submitDisabled: null,\n dragAreaActive: false,\n dragAreaRect: null,\n}));\n\nconst normalizeCaptchaImageIndexes = (serialNumbers, imageCount) => {\n if (!Array.isArray(serialNumbers) || imageCount <= 0) {\n return [];\n }\n\n const areAllOneBased = serialNumbers.every((value) => value >= 1 && value <= imageCount);\n if (areAllOneBased) {\n return serialNumbers.map((value) => value - 1);\n }\n\n const areAllZeroBased = serialNumbers.every((value) => value >= 0 && value < imageCount);\n if (areAllZeroBased) {\n return [...serialNumbers];\n }\n\n return serialNumbers\n .map((value) => {\n if (value >= 1 && value <= imageCount) {\n return value - 1;\n }\n\n if (value >= 0 && value < imageCount) {\n return value;\n }\n\n return null;\n })\n .filter((value) => Number.isInteger(value));\n};\n\nconst resolveCaptchaSourceImagesInVisualOrder = async (frame, options) => {\n const sourceImages = frame.locator(options.sourceImageSelector);\n const imageCount = await sourceImages.count().catch(() => 0);\n const sources = [];\n\n for (let domIndex = 0; domIndex < imageCount; domIndex += 1) {\n const locator = sourceImages.nth(domIndex);\n const box = await locator.boundingBox().catch(() => null);\n\n if (!box || box.width <= 0 || box.height <= 0) {\n continue;\n }\n\n sources.push({\n domIndex,\n locator,\n box,\n });\n }\n\n sources.sort((left, right) => {\n const deltaY = left.box.y - right.box.y;\n if (Math.abs(deltaY) > options.sourceImageRowTolerancePx) {\n return deltaY;\n }\n\n return left.box.x - right.box.x;\n });\n\n return sources;\n};\n\nconst refreshCaptcha = async (page, frame, options) => {\n const clicked = await clickCaptchaAction(frame, options.refreshTexts, {\n ...options,\n page,\n logger,\n forceMouse: true,\n }).catch(() => false);\n\n if (!clicked) {\n logger.warn('Refresh button not found.');\n return false;\n }\n\n await page.waitForTimeout(options.refreshWaitMs);\n return true;\n};\n\nconst waitForCaptchaChallengeReady = async (page, frame, options) => {\n const deadline = Date.now() + options.challengeReadyTimeoutMs;\n let refreshDeadline = Date.now() + options.challengeReadyRefreshTimeoutMs;\n let hasSeenLoading = false;\n let hasSeenGuideMask = false;\n let hasLoggedGuideMask = false;\n\n while (Date.now() < deadline) {\n const isLoadingVisible = await isAnyCaptchaTextVisible(\n frame,\n options.loadingTexts,\n options.loadingIndicatorVisibleTimeoutMs,\n );\n const hasErrorTextVisible = await isAnyCaptchaTextVisible(\n frame,\n options.errorTexts,\n options.loadingIndicatorVisibleTimeoutMs,\n );\n\n hasSeenLoading = hasSeenLoading || isLoadingVisible;\n\n const sourceImages = frame.locator(options.sourceImageSelector);\n const imageCount = await sourceImages.count().catch(() => 0);\n const hasVisibleSourceImage = imageCount > 0\n ? await sourceImages.first().isVisible({ timeout: options.loadingIndicatorVisibleTimeoutMs }).catch(() => false)\n : false;\n const hasVisibleDropTarget = await frame.locator(options.dropTargetContainerSelector)\n .first()\n .isVisible({ timeout: options.loadingIndicatorVisibleTimeoutMs })\n .catch(() => false);\n const hasGuideMaskVisible = options.guideMaskSelector\n ? await frame.locator(options.guideMaskSelector)\n .first()\n .isVisible({ timeout: options.loadingIndicatorVisibleTimeoutMs })\n .catch(() => false)\n : false;\n\n hasSeenGuideMask = hasSeenGuideMask || hasGuideMaskVisible;\n\n if (hasGuideMaskVisible && !hasLoggedGuideMask) {\n logger.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');\n hasLoggedGuideMask = true;\n }\n\n if (!isLoadingVisible && hasVisibleSourceImage && hasVisibleDropTarget && !hasGuideMaskVisible) {\n logger.info(\n hasSeenGuideMask\n ? '\u9A8C\u8BC1\u7801\u56FE\u7247\u548C\u62D6\u62FD\u533A\u57DF\u5DF2\u5C31\u7EEA\uFF0C\u5F15\u5BFC\u5C42\u5DF2\u6D88\u5931\u3002'\n : (hasSeenLoading ? '\u9A8C\u8BC1\u7801\u56FE\u7247\u5DF2\u52A0\u8F7D\u5B8C\u6210\u3002' : '\u9A8C\u8BC1\u7801\u56FE\u7247\u5DF2\u5C31\u7EEA\u3002'),\n );\n return;\n }\n\n if (hasErrorTextVisible) {\n logger.warn('\u9A8C\u8BC1\u7801\u9762\u677F\u51FA\u73B0\u7F51\u7EDC\u5F02\u5E38\u6587\u6848\uFF0C\u5C1D\u8BD5\u7ACB\u5373\u5237\u65B0\u9898\u76EE\u3002');\n await refreshCaptcha(page, frame, options);\n refreshDeadline = Date.now() + options.challengeReadyRefreshTimeoutMs;\n hasSeenLoading = false;\n continue;\n }\n\n if ((!hasVisibleSourceImage || !hasVisibleDropTarget) && Date.now() >= refreshDeadline) {\n logger.warn(`\u9A8C\u8BC1\u7801\u9898\u76EE\u8D85\u8FC7 ${options.challengeReadyRefreshTimeoutMs}ms \u4ECD\u672A\u51C6\u5907\u597D\uFF0C\u5C1D\u8BD5\u5237\u65B0\u9898\u76EE\u3002`);\n await refreshCaptcha(page, frame, options);\n refreshDeadline = Date.now() + options.challengeReadyRefreshTimeoutMs;\n hasSeenLoading = false;\n continue;\n }\n\n await page.waitForTimeout(options.challengeReadyPollMs);\n }\n\n throw new Error('Captcha challenge is still loading and did not become ready in time.');\n};\n\nconst dragPromptCaptchaImage = async (\n page,\n frame,\n iframeLocator,\n sourceLocator,\n dropTarget,\n options,\n {\n attempt,\n visualIndex,\n },\n) => {\n const baselineState = await readPromptCaptchaState(frame, options);\n const dragAttempts = [];\n\n for (const plan of PROMPT_CAPTCHA_DRAG_PLANS) {\n const sourceBox = await sourceLocator.boundingBox().catch(() => null);\n const targetBox = await dropTarget.boundingBox().catch(() => null);\n\n if (!sourceBox || !targetBox) {\n throw new Error('Unable to resolve prompt captcha drag coordinates.');\n }\n\n const targetOffsetX = (plan.endXRatio - 0.5) * targetBox.width;\n const targetOffsetY = (plan.endYRatio - 0.5) * targetBox.height;\n\n await dragCaptchaAction(page, sourceLocator, dropTarget, {\n forceMouse: true,\n targetOffsetX,\n targetOffsetY,\n steps: options.promptDragMoveSteps,\n holdDelayMs: options.promptDragHoldDelayMs,\n stepDelayMs: options.promptDragStepDelayMs,\n beforeReleaseDelayMs: options.promptDragBeforeReleaseDelayMs,\n afterReleaseDelayMs: options.promptDragAfterReleaseDelayMs,\n finalMoveRepeats: options.promptDragFinalMoveRepeats,\n });\n\n const afterState = await readPromptCaptchaState(frame, options);\n const accepted = (\n afterState.badgeCount > baselineState.badgeCount\n || afterState.selectedCount > baselineState.selectedCount\n );\n\n const attemptInfo = {\n planName: plan.name,\n sourceRect: rectOf(sourceBox),\n targetRect: rectOf(targetBox),\n targetOffsetX: Number(targetOffsetX.toFixed(2)),\n targetOffsetY: Number(targetOffsetY.toFixed(2)),\n beforeState: baselineState,\n afterState,\n accepted,\n };\n\n dragAttempts.push(attemptInfo);\n logger.info(\n `\u9A8C\u8BC1\u7801\u62D6\u62FD\u7B2C ${visualIndex + 1} \u5F20\uFF0C\u65B9\u6848 ${plan.name}\uFF0C` +\n `badge ${baselineState.badgeCount} -> ${afterState.badgeCount}\uFF0C` +\n `selected ${baselineState.selectedCount} -> ${afterState.selectedCount}`,\n );\n\n if (accepted) {\n return {\n accepted: true,\n dragAttempts,\n };\n }\n\n if (options.promptDragRetryDelayMs > 0) {\n await page.waitForTimeout(options.promptDragRetryDelayMs);\n }\n }\n\n await maybeCollectCaptchaDebugInfo(page, frame, iframeLocator, attempt, `drag-${visualIndex + 1}-failed`, options, {\n visualIndex,\n dragAttempts,\n finalState: await readPromptCaptchaState(frame, options),\n }).catch((error) => {\n logger.warn(`\u9A8C\u8BC1\u7801\u62D6\u62FD\u5931\u8D25\u8C03\u8BD5\u6293\u53D6\u5931\u8D25\uFF1A${error?.message || error}`);\n });\n\n return {\n accepted: false,\n dragAttempts,\n };\n};\n\n/**\n * @param {import('playwright').Page} page\n * @param {Object} [options]\n * @param {{ callCaptchaRecognitionApi?: (requestParams: Record<string, any>) => Promise<any> }} [dependencies]\n * @returns {Promise<boolean>}\n */\nexport async function solveCaptcha(page, options = {}, dependencies = {}) {\n const { callCaptchaRecognitionApi } = dependencies;\n\n if (typeof callCaptchaRecognitionApi !== 'function') {\n throw new Error('[Captcha] \u7F3A\u5C11\u901A\u7528\u8BC6\u522B\u8BF7\u6C42\u51FD\u6570 callCaptchaRecognitionApi\u3002');\n }\n\n const config = {\n ...DEFAULT_BYTEDANCE_CAPTCHA_OPTIONS,\n ...options,\n };\n\n if (!config.token) {\n logger.warn('\u7F3A\u5C11\u9A8C\u8BC1\u7801 token\uFF0C\u8DF3\u8FC7\u81EA\u52A8\u8BC6\u522B\u3002');\n return false;\n }\n\n logger.info('\u5F53\u524D\u4F7F\u7528\u672Ctool\u2014\u2014\u6D4B\u8BD5\u7248\u672C');\n\n for (let attempt = 1; attempt <= config.maxRetries; attempt += 1) {\n logger.info(`\u5F00\u59CB\u7B2C ${attempt}/${config.maxRetries} \u6B21 verifycenter \u9A8C\u8BC1\u7801\u8BC6\u522B\u3002`);\n\n try {\n const captchaContext = await getVerifycenterCaptchaContext(page, config);\n if (!captchaContext) {\n logger.info('Captcha container is not visible anymore.');\n return true;\n }\n\n const { iframeLocator, frame } = captchaContext;\n await waitForCaptchaChallengeReady(page, frame, config);\n await maybeCollectCaptchaDebugInfo(\n page,\n frame,\n iframeLocator,\n attempt,\n 'ready',\n config,\n ).catch((error) => {\n logger.warn(`\u9A8C\u8BC1\u7801\u8C03\u8BD5\u6293\u53D6\u5931\u8D25\uFF1A${error?.message || error}`);\n });\n await page.waitForTimeout(config.recognitionDelayMs);\n\n const screenshotBuffer = await iframeLocator.screenshot();\n const apiResponse = await callCaptchaRecognitionApi({\n apiUrl: config.apiUrl,\n type: config.apiType,\n image: screenshotBuffer.toString('base64'),\n token: config.token,\n });\n const serialNumbers = extractCaptchaSerialNumbers(apiResponse);\n\n if (apiResponse?.code !== config.recognitionSuccessCode || serialNumbers.length === 0) {\n logger.warn(\n `\u9A8C\u8BC1\u7801\u8BC6\u522B\u5931\u8D25\u3002code=${apiResponse?.code}, msg=${apiResponse?.msg || 'unknown'}`,\n );\n await refreshCaptcha(page, frame, config);\n continue;\n }\n\n logger.info(`\u9A8C\u8BC1\u7801\u8BC6\u522B\u6210\u529F\uFF0C\u5E8F\u53F7\uFF1A${serialNumbers.join(', ')}`);\n\n const dropTarget = await findCaptchaDropTarget(frame, config);\n if (!dropTarget) {\n logger.warn('\u672A\u627E\u5230\u9A8C\u8BC1\u7801\u62D6\u62FD\u76EE\u6807\u533A\u57DF\u3002');\n await refreshCaptcha(page, frame, config);\n continue;\n }\n\n const orderedSourceImages = await resolveCaptchaSourceImagesInVisualOrder(frame, config);\n const normalizedIndexes = normalizeCaptchaImageIndexes(serialNumbers, orderedSourceImages.length);\n\n if (normalizedIndexes.length !== serialNumbers.length) {\n throw new Error(\n `Captcha image indexes could not be normalized. raw=${serialNumbers.join(', ')}, count=${orderedSourceImages.length}`,\n );\n }\n\n logger.info(`\u9A8C\u8BC1\u7801\u89C6\u89C9\u4F4D\u5E8F\u6620\u5C04\uFF1A${normalizedIndexes.map((index) => index + 1).join(', ')}`);\n\n for (const imageIndex of normalizedIndexes) {\n if (imageIndex < 0 || imageIndex >= orderedSourceImages.length) {\n throw new Error(\n `Captcha image index ${imageIndex} is out of range. count=${orderedSourceImages.length}`,\n );\n }\n\n const sourceImage = orderedSourceImages[imageIndex].locator;\n await sourceImage.waitFor({\n state: 'visible',\n timeout: config.sourceImageVisibleTimeoutMs,\n });\n\n const dragResult = await dragPromptCaptchaImage(\n page,\n frame,\n iframeLocator,\n sourceImage,\n dropTarget,\n config,\n {\n attempt,\n visualIndex: imageIndex,\n },\n );\n\n if (!dragResult.accepted) {\n throw new Error(`Captcha prompt drag was not accepted for visual index ${imageIndex + 1}.`);\n }\n\n if (config.dragBetweenWaitMs > 0) {\n await page.waitForTimeout(config.dragBetweenWaitMs);\n }\n }\n\n const beforeSubmitState = await readPromptCaptchaState(frame, config);\n logger.info(\n `\u63D0\u4EA4\u524D\u9A8C\u8BC1\u7801\u72B6\u6001\uFF1Abadge=${beforeSubmitState.badgeCount}, ` +\n `selected=${beforeSubmitState.selectedCount}, ` +\n `submitDisabled=${beforeSubmitState.submitDisabled}`,\n );\n\n const submitted = await clickCaptchaAction(frame, config.submitTexts, {\n ...config,\n page,\n logger,\n forceMouse: true,\n actionVisibleTimeoutMs: config.submitReadyTimeoutMs,\n }).catch(() => false);\n\n if (!submitted) {\n logger.warn('\u672A\u627E\u5230\u63D0\u4EA4\u6309\u94AE\uFF0C\u53EF\u80FD\u4F1A\u81EA\u52A8\u63D0\u4EA4\u3002');\n }\n\n await page.waitForTimeout(config.submitWaitMs);\n\n const afterSubmitState = await readPromptCaptchaState(frame, config);\n logger.info(\n `\u63D0\u4EA4\u540E\u9A8C\u8BC1\u7801\u72B6\u6001\uFF1Abadge=${afterSubmitState.badgeCount}, ` +\n `selected=${afterSubmitState.selectedCount}, ` +\n `submitDisabled=${afterSubmitState.submitDisabled}`,\n );\n\n const stillVisible = await iframeLocator\n .isVisible({ timeout: config.containerVisibleTimeoutMs })\n .catch(() => false);\n\n if (!stillVisible) {\n logger.info('\u9A8C\u8BC1\u7801\u8BC6\u522B\u5E76\u63D0\u4EA4\u6210\u529F\u3002');\n return true;\n }\n\n await maybeCollectCaptchaDebugInfo(page, frame, iframeLocator, attempt, 'submit-still-visible', config, {\n beforeSubmitState,\n afterSubmitState,\n }).catch((error) => {\n logger.warn(`\u63D0\u4EA4\u540E\u9A8C\u8BC1\u7801\u8C03\u8BD5\u6293\u53D6\u5931\u8D25\uFF1A${error?.message || error}`);\n });\n\n logger.warn('\u63D0\u4EA4\u540E\u9A8C\u8BC1\u7801 iframe \u4ECD\u7136\u53EF\u89C1\uFF0C\u51C6\u5907\u5237\u65B0\u540E\u91CD\u8BD5\u3002');\n await page.waitForTimeout(2000);\n await refreshCaptcha(page, frame, config);\n } catch (error) {\n logger.error(`\u7B2C ${attempt}/${config.maxRetries} \u6B21\u9A8C\u8BC1\u7801\u8BC6\u522B\u5931\u8D25\uFF1A${error?.message || error}`);\n }\n\n if (attempt < config.maxRetries) {\n await page.waitForTimeout(config.retryDelayBaseMs + (attempt * config.retryDelayStepMs));\n }\n }\n\n logger.error(`\u91CD\u8BD5 ${config.maxRetries} \u6B21\u540E\uFF0C\u9A8C\u8BC1\u7801\u4ECD\u672A\u8BC6\u522B\u6210\u529F\u3002`);\n return false;\n}\n\nexport const sloveCaptcha = solveCaptcha;\n", "import { DeviceInput } from '../../device-input.js';\n\nexport const waitForVisible = async (locator, timeout) => {\n try {\n await locator.waitFor({\n state: 'visible',\n timeout,\n });\n return true;\n } catch {\n return false;\n }\n};\n\nexport const isAnyCaptchaTextVisible = async (frame, texts, timeout) => {\n for (const text of texts || []) {\n if (!text) {\n continue;\n }\n\n const textLocator = frame.getByText(text, { exact: false });\n const locatorText = frame.locator(`text=${text}`);\n const candidateGroups = [textLocator, locatorText];\n\n for (const candidateGroup of candidateGroups) {\n const candidateCount = await candidateGroup.count().catch(() => 0);\n\n for (let index = 0; index < candidateCount; index += 1) {\n const candidate = candidateGroup.nth(index);\n const isVisible = await candidate.isVisible({ timeout }).catch(() => false);\n if (isVisible) {\n return true;\n }\n }\n }\n }\n\n return false;\n};\n\nconst collectVisibleCandidateIndexes = async (candidateGroup, count, timeout) => {\n const visibleIndexes = [];\n\n for (let index = 0; index < count; index += 1) {\n const candidate = candidateGroup.nth(index);\n const isVisible = await candidate.isVisible({ timeout }).catch(() => false);\n if (isVisible) {\n visibleIndexes.push(index);\n }\n }\n\n return visibleIndexes;\n};\n\nexport const clickCaptchaAction = async (frame, texts, options) => {\n for (const text of texts || []) {\n const textLocator = frame.getByText(text, { exact: false });\n const locatorText = frame.locator(`text=${text}`);\n const [getByTextCount, locatorTextCount] = await Promise.all([\n textLocator.count().catch(() => 0),\n locatorText.count().catch(() => 0),\n ]);\n const [getByTextVisibleIndexes, locatorTextVisibleIndexes] = await Promise.all([\n collectVisibleCandidateIndexes(textLocator, getByTextCount, options.actionVisibleTimeoutMs),\n collectVisibleCandidateIndexes(locatorText, locatorTextCount, options.actionVisibleTimeoutMs),\n ]);\n\n options.logger?.info(\n `[CaptchaAction] \u6587\u672C \"${text}\" \u547D\u4E2D\u6570\u91CF\uFF1A` +\n `getByText=${getByTextCount} (visible=${getByTextVisibleIndexes.length}), ` +\n `locator=${locatorTextCount} (visible=${locatorTextVisibleIndexes.length})`,\n );\n\n const candidateGroups = [\n { label: 'getByText', locator: textLocator, count: getByTextCount },\n { label: 'locator', locator: locatorText, count: locatorTextCount },\n ];\n\n for (const candidateGroup of candidateGroups) {\n for (let index = 0; index < candidateGroup.count; index += 1) {\n const candidate = candidateGroup.locator.nth(index);\n const isVisible = await waitForVisible(candidate, options.actionVisibleTimeoutMs);\n\n if (!isVisible) {\n continue;\n }\n\n options.logger?.info(\n `[CaptchaAction] \u6587\u672C \"${text}\" \u9009\u62E9 ${candidateGroup.label}[${index}] \u4F5C\u4E3A\u7B2C\u4E00\u4E2A\u53EF\u89C1\u8282\u70B9\u6267\u884C\u70B9\u51FB\u3002`,\n );\n await DeviceInput.click(options.page, candidate, options);\n return true;\n }\n }\n }\n\n return false;\n};\n\nexport const dragCaptchaAction = async (page, sourceLocator, targetLocator, options = {}) => {\n await DeviceInput.drag(page, sourceLocator, targetLocator, options);\n};\n", "import { createHash } from 'node:crypto';\nimport { v4 as uuidv4 } from 'uuid';\nimport { createInternalLogger } from './internals/logger.js';\n\nconst logger = createInternalLogger('Mutation');\n\nconst MUTATION_MONITOR_MODE = Object.freeze({\n Added: 'added',\n Changed: 'changed',\n All: 'all',\n});\n\n/**\n * \u751F\u6210\u552F\u4E00\u7684 key \u540D\u79F0\uFF0C\u907F\u514D\u51B2\u7A81\n * @returns {string}\n */\nfunction generateKey(prefix) {\n return `__${prefix}_${uuidv4().replace(/-/g, '_')}`;\n}\n\nexport const Mutation = {\n Mode: MUTATION_MONITOR_MODE,\n /**\n * \u7B49\u5F85 DOM \u5143\u7D20\u7A33\u5B9A\uFF08\u65E0\u53D8\u5316\uFF09\n * \u4F7F\u7528 MutationObserver \u76D1\u63A7\u6307\u5B9A\u5143\u7D20\uFF0C\u5F53\u5143\u7D20\u6301\u7EED\u4E00\u6BB5\u65F6\u95F4\u65E0\u53D8\u5316\u65F6 resolve\n * \n * @param {import('playwright').Page} page - Playwright page \u5BF9\u8C61\n * @param {string | string[]} selectors - \u8981\u76D1\u63A7\u7684 CSS \u9009\u62E9\u5668\uFF0C\u5355\u4E2A\u6216\u591A\u4E2A\n * @param {Object} [options] - \u914D\u7F6E\u9009\u9879\n * @param {number} [options.initialTimeout] - \u7B49\u5F85\u5143\u7D20\u51FA\u73B0\u7684\u8D85\u65F6 (\u6BEB\u79D2, \u9ED8\u8BA4: 30000)\n * @param {number} [options.stableTime] - \u65E0\u53D8\u5316\u6301\u7EED\u65F6\u95F4\u540E resolve (\u6BEB\u79D2, \u9ED8\u8BA4: 5000)\n * @param {number} [options.timeout] - \u6574\u4F53\u8D85\u65F6\u65F6\u95F4 (\u6BEB\u79D2, \u9ED8\u8BA4: 120000)\n * @param {Function} [options.onMutation] - \u53D8\u5316\u65F6\u7684\u56DE\u8C03\u94A9\u5B50\n * \u7B7E\u540D: ({ mutationCount, html, text, mutationNodes }) => any\n * \u8FD4\u56DE null/undefined: \u6B63\u5E38\u91CD\u7F6E\u7A33\u5B9A\u8BA1\u65F6\n * \u8FD4\u56DE\u5176\u4ED6\u503C: \u6682\u505C\u7A33\u5B9A\u8BA1\u65F6\uFF08timeout \u4ECD\u7136\u751F\u6548\uFF09\n * @returns {Promise<{ mutationCount: number, stableTime: number, wasPaused: boolean }>}\n */\n async waitForStable(page, selectors, options = {}) {\n const selectorList = Array.isArray(selectors) ? selectors : [selectors];\n const initialTimeout = options.initialTimeout ?? 30 * 1000;\n const stableTime = options.stableTime ?? 5 * 1000;\n const timeout = options.timeout ?? 120 * 1000;\n const onMutation = options.onMutation;\n\n logger.start('waitForStable', `\u76D1\u63A7 ${selectorList.length} \u4E2A\u9009\u62E9\u5668, \u7A33\u5B9A\u65F6\u95F4=${stableTime}ms`);\n\n if (initialTimeout > 0) {\n const selectorQuery = selectorList.join(',');\n try {\n await page.waitForSelector(selectorQuery, { timeout: initialTimeout });\n logger.info(`waitForStable \u5DF2\u68C0\u6D4B\u5230\u5143\u7D20: ${selectorQuery}`);\n } catch (e) {\n logger.warning(`waitForStable \u521D\u59CB\u7B49\u5F85\u8D85\u65F6 (${initialTimeout}ms): ${selectorQuery}`);\n throw e;\n }\n }\n\n // \u751F\u6210\u552F\u4E00\u7684\u56DE\u8C03\u540D\n const callbackName = generateKey('pk_mut_cb');\n\n // \u5982\u679C\u6709 onMutation \u56DE\u8C03\uFF0C\u66B4\u9732\u51FD\u6570\u5E76\u8FD4\u56DE\u7ED3\u679C\n if (onMutation) {\n try {\n await page.exposeFunction(callbackName, async (context) => {\n try {\n const result = await onMutation(context);\n const paused = !(result === null || result === undefined);\n // \u8FD4\u56DE null/undefined \u8868\u793A\u6B63\u5E38\u8BA1\u65F6\uFF0C\u5176\u4ED6\u503C\u8868\u793A\u6682\u505C\n return paused ? '__PAUSE__' : '__CONTINUE__';\n } catch (e) {\n // \u56DE\u8C03\u51FA\u9519\u65F6\u9ED8\u8BA4\u7EE7\u7EED\u8BA1\u65F6\n return '__CONTINUE__';\n }\n });\n logger.info('waitForStable \u5DF2\u542F\u7528 onMutation \u56DE\u8C03');\n } catch (e) {\n // \u53EF\u80FD\u5DF2\u7ECF\u66B4\u9732\u8FC7\uFF0C\u5FFD\u7565\n }\n }\n\n const result = await page.evaluate(\n async ({ selectorList, stableTime, timeout, callbackName, hasCallback }) => {\n return new Promise((resolve, reject) => {\n let mutationCount = 0;\n let stableTimer = null;\n let timeoutTimer = null;\n let isPaused = false;\n let wasPaused = false;\n const observers = [];\n\n // \u6E05\u7406\u51FD\u6570\n const cleanup = () => {\n observers.forEach(obs => obs.disconnect());\n if (stableTimer) clearTimeout(stableTimer);\n if (timeoutTimer) clearTimeout(timeoutTimer);\n };\n\n // \u91CD\u7F6E\u7A33\u5B9A\u8BA1\u65F6\u5668\n const resetStableTimer = () => {\n if (stableTimer) clearTimeout(stableTimer);\n if (isPaused) return;\n stableTimer = setTimeout(() => {\n cleanup();\n resolve({ mutationCount, stableTime, wasPaused });\n }, stableTime);\n };\n\n const setPaused = (nextPaused) => {\n if (isPaused === nextPaused) return;\n isPaused = nextPaused;\n if (isPaused) {\n if (stableTimer) clearTimeout(stableTimer);\n stableTimer = null;\n wasPaused = true;\n return;\n }\n resetStableTimer();\n };\n\n // \u6574\u4F53\u8D85\u65F6\uFF08\u59CB\u7EC8\u751F\u6548\uFF0C\u4E0D\u53D7\u6682\u505C\u5F71\u54CD\uFF09\n timeoutTimer = setTimeout(() => {\n cleanup();\n reject(new Error(`waitForStable \u8D85\u65F6 (${timeout}ms), \u5DF2\u68C0\u6D4B\u5230 ${mutationCount} \u6B21\u53D8\u5316, isPaused=${isPaused}`));\n }, timeout);\n\n // \u4E3A\u6BCF\u4E2A\u9009\u62E9\u5668\u521B\u5EFA MutationObserver\n selectorList.forEach(selector => {\n const elements = document.querySelectorAll(selector);\n elements.forEach(element => {\n const observer = new MutationObserver(async (mutations) => {\n mutationCount += mutations.length;\n\n if (hasCallback && window[callbackName]) {\n // \u83B7\u53D6\u5143\u7D20\u5185\u5BB9\n const html = element.outerHTML || '';\n const text = element.innerText || element.textContent || '';\n const mutationNodes = [{ html, text, mutationType: 'stable' }];\n\n try {\n const signal = await window[callbackName]({\n mutationCount,\n html,\n text,\n mutationNodes\n });\n\n const shouldPause = signal === '__PAUSE__';\n setPaused(shouldPause);\n if (!shouldPause) {\n resetStableTimer();\n }\n } catch (e) {\n // \u56DE\u8C03\u51FA\u9519\u65F6\u7EE7\u7EED\u8BA1\u65F6\n setPaused(false);\n resetStableTimer();\n }\n } else {\n // \u6CA1\u6709\u56DE\u8C03\uFF0C\u4FDD\u6301\u539F\u6709\u884C\u4E3A\n resetStableTimer();\n }\n });\n\n observer.observe(element, {\n childList: true,\n subtree: true,\n characterData: true,\n attributes: true\n });\n\n observers.push(observer);\n });\n });\n\n // \u5982\u679C\u6CA1\u6709\u627E\u5230\u4EFB\u4F55\u5143\u7D20\uFF0C\u76F4\u63A5\u8FD4\u56DE\n if (observers.length === 0) {\n cleanup();\n resolve({ mutationCount: 0, stableTime: 0, wasPaused: false });\n return;\n }\n\n // \u521D\u59CB\u68C0\u67E5\uFF1A\u6302\u8F7D\u540E\u7ACB\u5373\u6267\u884C\u4E00\u6B21\u56DE\u8C03\uFF0C\u5224\u65AD\u662F\u5426\u9700\u8981\u6682\u505C\n const runInitialCheck = async () => {\n if (hasCallback && window[callbackName]) {\n // \u83B7\u53D6\u7B2C\u4E00\u4E2A\u76D1\u63A7\u5143\u7D20\u7684\u5185\u5BB9\n const firstSelector = selectorList[0];\n const firstElement = document.querySelector(firstSelector);\n if (firstElement) {\n const html = firstElement.outerHTML || '';\n const text = firstElement.innerText || firstElement.textContent || '';\n const mutationNodes = [{ html, text, mutationType: 'stable' }];\n\n try {\n const signal = await window[callbackName]({\n mutationCount: 0,\n html,\n text,\n mutationNodes\n });\n\n if (signal === '__PAUSE__') {\n setPaused(true);\n return; // \u6682\u505C\u65F6\u4E0D\u542F\u52A8\u521D\u59CB\u8BA1\u65F6\n }\n } catch (e) {\n // \u56DE\u8C03\u51FA\u9519\u65F6\u7EE7\u7EED\n }\n }\n }\n // \u542F\u52A8\u521D\u59CB\u7A33\u5B9A\u8BA1\u65F6\u5668\n resetStableTimer();\n };\n\n runInitialCheck();\n });\n },\n { selectorList, stableTime, timeout, callbackName, hasCallback: !!onMutation }\n );\n\n if (result.mutationCount === 0 && result.stableTime === 0) {\n logger.warning('waitForStable \u672A\u627E\u5230\u53EF\u76D1\u63A7\u7684\u5143\u7D20');\n }\n logger.success('waitForStable', `DOM \u7A33\u5B9A, \u603B\u5171 ${result.mutationCount} \u6B21\u53D8\u5316${result.wasPaused ? ', \u66FE\u6682\u505C\u8BA1\u65F6' : ''}`);\n return result;\n },\n /**\n * \u7B49\u5F85\u8DE8 root DOM \u5143\u7D20\u7A33\u5B9A\uFF08\u4E3B\u6587\u6863 + iframe \u5185\u5BB9\uFF09\n * \u901A\u8FC7\u8F6E\u8BE2\u5FEB\u7167\u68C0\u6D4B\u53D8\u5316\uFF0C\u9002\u914D iframe / shadow \u573A\u666F\n *\n * @param {import('playwright').Page} page - Playwright page \u5BF9\u8C61\n * @param {string | string[]} selectors - \u8981\u76D1\u63A7\u7684 CSS \u9009\u62E9\u5668\uFF0C\u5355\u4E2A\u6216\u591A\u4E2A\uFF08\u5EFA\u8BAE\u4F20 iframe \u9009\u62E9\u5668\uFF09\n * @param {Object} [options] - \u914D\u7F6E\u9009\u9879\uFF08\u7B7E\u540D\u4E0E waitForStable \u4FDD\u6301\u4E00\u81F4\uFF09\n * @param {number} [options.initialTimeout] - \u7B49\u5F85\u5143\u7D20\u51FA\u73B0\u7684\u8D85\u65F6 (\u6BEB\u79D2, \u9ED8\u8BA4: 60000)\n * @param {number} [options.stableTime] - \u65E0\u53D8\u5316\u6301\u7EED\u65F6\u95F4\u540E resolve (\u6BEB\u79D2, \u9ED8\u8BA4: 10000)\n * @param {number} [options.timeout] - \u6574\u4F53\u8D85\u65F6\u65F6\u95F4 (\u6BEB\u79D2, \u9ED8\u8BA4: 180000)\n * @param {Function} [options.onMutation] - \u53D8\u5316\u65F6\u7684\u56DE\u8C03\u94A9\u5B50\n * @returns {Promise<{ mutationCount: number, stableTime: number, wasPaused: boolean }>}\n */\n async waitForStableAcrossRoots(page, selectors, options = {}) {\n const selectorList = Array.isArray(selectors) ? selectors : [selectors];\n const selectorQuery = selectorList.join(',');\n const initialTimeout = options.initialTimeout ?? 60 * 1000;\n const waitForStableTime = options.stableTime ?? 10 * 1000;\n const overallTimeout = options.timeout ?? 180 * 1000;\n const onMutation = options.onMutation;\n const pollInterval = 500;\n\n const sleep = (ms) => new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n\n const truncate = (value, max = 800) => {\n const text = String(value || '');\n if (text.length <= max) return text;\n return `${text.slice(0, max)}...`;\n };\n\n const normalizeText = (value) => String(value || '').replace(/\\s+/g, ' ').trim();\n const normalizeHtml = (value) => String(value || '').trim();\n const hashSnapshot = (value) => createHash('sha256').update(String(value || '')).digest('hex');\n\n const buildState = async () => {\n const items = [];\n const describeElement = async (elementHandle) => {\n return await elementHandle.evaluate((node) => {\n const tagName = String(node?.tagName || '').toUpperCase();\n return {\n tagName,\n id: String(node?.id || '').trim(),\n name: String(node?.getAttribute?.('name') || '').trim(),\n };\n });\n };\n\n const readElementSnapshot = async (elementHandle) => {\n return await elementHandle.evaluate((node) => {\n const text = String(node?.innerText || node?.textContent || '');\n const html = String(node?.innerHTML || node?.outerHTML || '');\n return {\n text,\n html,\n };\n });\n };\n\n const readFrameSnapshot = async (frame) => {\n return await frame.evaluate(() => {\n const root = document.documentElement || document.body;\n const text = String(root?.innerText || root?.textContent || '');\n const html = String(root?.innerHTML || '');\n return {\n text,\n html,\n url: window.location.href,\n readyState: document.readyState,\n };\n });\n };\n\n for (const selector of selectorList) {\n let handles = [];\n try {\n handles = await page.locator(selector).elementHandles();\n } catch {\n continue;\n }\n\n for (let index = 0; index < handles.length; index += 1) {\n const handle = handles[index];\n try {\n const descriptor = await describeElement(handle);\n const tagName = descriptor?.tagName || '';\n const isFrameElement = tagName === 'IFRAME' || tagName === 'FRAME';\n const nodeName = descriptor?.id || descriptor?.name || 'no-id';\n let source = 'main';\n let path = `${selector}[${index}]`;\n let text = '';\n let html = '';\n let frameUrl = '';\n let readyState = '';\n\n if (isFrameElement) {\n source = 'iframe';\n path = `${selector}[${index}]::iframe(${nodeName})`;\n\n const frame = await handle.contentFrame();\n if (frame) {\n try {\n const frameSnapshot = await readFrameSnapshot(frame);\n text = normalizeText(frameSnapshot?.text || '');\n html = normalizeHtml(frameSnapshot?.html || '');\n frameUrl = String(frameSnapshot?.url || '').trim();\n readyState = String(frameSnapshot?.readyState || '').trim();\n } catch (error) {\n source = 'iframe-unreadable';\n readyState = error?.name || 'unreadable';\n }\n } else {\n source = 'iframe-detached';\n }\n } else {\n try {\n const elementSnapshot = await readElementSnapshot(handle);\n text = normalizeText(elementSnapshot?.text || '');\n html = normalizeHtml(elementSnapshot?.html || '');\n } catch (error) {\n source = 'main-unreadable';\n readyState = error?.name || 'unreadable';\n }\n }\n\n const snapshot = text;\n items.push({\n selector,\n source,\n path,\n text,\n html,\n frameUrl,\n readyState,\n snapshot,\n });\n } finally {\n await handle.dispose().catch(() => { });\n }\n }\n }\n\n const serializedSnapshot = items\n .map((item) => JSON.stringify({\n path: item.path,\n source: item.source,\n frameUrl: item.frameUrl,\n readyState: item.readyState,\n snapshot: item.snapshot,\n }))\n .join('||');\n const summaryText = items.map((item) => item.text).join('\\n').trim();\n const summaryHtml = items.map((item) => item.html).join('\\n');\n const hasMatched = items.length > 0;\n const primary = items.length > 0 ? items[items.length - 1] : null;\n\n return {\n hasMatched,\n snapshotKey: hashSnapshot(serializedSnapshot),\n text: summaryText,\n html: summaryHtml,\n snapshotLength: serializedSnapshot.length,\n itemCount: items.length,\n primaryPath: primary?.path || '',\n mutationNodes: items.map((item) => ({\n html: item.html,\n text: item.text,\n mutationType: item.source,\n frameUrl: item.frameUrl,\n readyState: item.readyState,\n })),\n };\n };\n\n const invokeMutationCallback = async (context) => {\n if (!onMutation) return '__CONTINUE__';\n try {\n const result = await onMutation(context);\n return (result === null || result === undefined) ? '__CONTINUE__' : '__PAUSE__';\n } catch {\n return '__CONTINUE__';\n }\n };\n\n logger.start(\n 'waitForStableAcrossRoots',\n `\u76D1\u63A7 ${selectorList.length} \u4E2A\u9009\u62E9\u5668(\u8DE8 root), \u7A33\u5B9A\u65F6\u95F4=${waitForStableTime}ms`\n );\n\n if (initialTimeout > 0) {\n try {\n await page.waitForSelector(selectorQuery, { timeout: initialTimeout });\n logger.info(`waitForStableAcrossRoots \u5DF2\u68C0\u6D4B\u5230\u5143\u7D20: ${selectorQuery}`);\n } catch (e) {\n logger.warning(`waitForStableAcrossRoots \u521D\u59CB\u7B49\u5F85\u8D85\u65F6 (${initialTimeout}ms): ${selectorQuery}`);\n throw e;\n }\n }\n\n let state = await buildState();\n if (!state?.hasMatched) {\n logger.warning('waitForStableAcrossRoots \u672A\u627E\u5230\u53EF\u76D1\u63A7\u7684\u5143\u7D20');\n return { mutationCount: 0, stableTime: 0, wasPaused: false };\n }\n\n let mutationCount = 0;\n let stableSince = 0;\n let isPaused = false;\n let wasPaused = false;\n let lastSnapshotKey = state.snapshotKey;\n\n const applyPauseSignal = (signal) => {\n const nextPaused = signal === '__PAUSE__';\n if (nextPaused) {\n if (!isPaused) wasPaused = true;\n isPaused = true;\n stableSince = 0;\n return;\n }\n\n isPaused = false;\n stableSince = Date.now();\n };\n\n const initialSignal = await invokeMutationCallback({\n mutationCount: 0,\n html: state.html || '',\n text: state.text || '',\n mutationNodes: state.mutationNodes || [],\n });\n applyPauseSignal(initialSignal);\n\n const deadline = Date.now() + overallTimeout;\n let lastState = state;\n\n while (Date.now() < deadline) {\n await sleep(pollInterval);\n lastState = await buildState();\n\n if (!lastState?.hasMatched) {\n continue;\n }\n\n if (lastState.snapshotKey !== lastSnapshotKey) {\n lastSnapshotKey = lastState.snapshotKey;\n mutationCount += 1;\n\n logger.info(\n `waitForStableAcrossRoots \u53D8\u5316#${mutationCount}, len=${lastState.snapshotLength}, path=${lastState.primaryPath || 'unknown'}, preview=\"${truncate(lastState.text, 120)}\"`\n );\n\n const signal = await invokeMutationCallback({\n mutationCount,\n html: lastState.html || '',\n text: lastState.text || '',\n mutationNodes: lastState.mutationNodes || [],\n });\n applyPauseSignal(signal);\n continue;\n }\n\n if (!isPaused && stableSince > 0 && (Date.now() - stableSince) >= waitForStableTime) {\n logger.success('waitForStableAcrossRoots', `DOM \u7A33\u5B9A, \u603B\u5171 ${mutationCount} \u6B21\u53D8\u5316${wasPaused ? ', \u66FE\u6682\u505C\u8BA1\u65F6' : ''}`);\n return {\n mutationCount,\n stableTime: waitForStableTime,\n wasPaused,\n };\n }\n }\n\n throw new Error(`waitForStableAcrossRoots \u8D85\u65F6 (${overallTimeout}ms), \u5DF2\u68C0\u6D4B\u5230 ${mutationCount} \u6B21\u53D8\u5316, isPaused=${isPaused}`);\n },\n\n /**\n * \u521B\u5EFA\u4E00\u4E2A\u6301\u7EED\u76D1\u63A7 DOM \u53D8\u5316\u7684\u76D1\u63A7\u5668\uFF08\u9ED8\u8BA4\u4EC5\u76D1\u542C\u65B0\u589E DOM\uFF09\n *\n * @param {import('playwright').Page} page - Playwright page \u5BF9\u8C61\n * @param {string | string[]} selectors - \u8981\u76D1\u63A7\u7684 CSS \u9009\u62E9\u5668\uFF0C\u652F\u6301 'document.documentElement'\n * @param {Object} [options] - \u914D\u7F6E\u9009\u9879\n * @param {Function} [options.onMutation] - \u53D8\u5316\u65F6\u7684\u56DE\u8C03\n * \u7B7E\u540D: ({ mutationCount, html, text, mutationNodes }) => void\n * \u6240\u6709\u6A21\u5F0F\u90FD\u8FD4\u56DE\u672C\u6B21\u5168\u90E8\u53D8\u5316\u8282\u70B9\u5FEB\u7167 mutationNodes\n * @param {'added' | 'changed' | 'all'} [options.mode='added'] - \u76D1\u63A7\u6A21\u5F0F\n * @returns {Promise<{ stop: () => Promise<{ totalMutations: number }> }>} - \u8FD4\u56DE\u505C\u6B62\u51FD\u6570\n */\n async useMonitor(page, selectors, options = {}) {\n const selectorList = Array.isArray(selectors) ? selectors : [selectors];\n const onMutation = options.onMutation;\n const rawMode = String(options.mode || MUTATION_MONITOR_MODE.Added).toLowerCase();\n const mode = [MUTATION_MONITOR_MODE.Added, MUTATION_MONITOR_MODE.Changed, MUTATION_MONITOR_MODE.All].includes(rawMode)\n ? rawMode\n : MUTATION_MONITOR_MODE.Added;\n\n logger.start('useMonitor', `\u76D1\u63A7 ${selectorList.length} \u4E2A\u9009\u62E9\u5668, mode=${mode}`);\n\n const monitorKey = generateKey('pk_mon');\n const callbackName = generateKey('pk_mon_cb');\n const cleanerName = generateKey('pk_mon_clean');\n\n if (onMutation) {\n try {\n await page.exposeFunction(callbackName, (payload) => {\n try {\n onMutation(payload);\n } catch (e) {\n // \u5FFD\u7565\u56DE\u8C03\u9519\u8BEF\n }\n });\n } catch (e) {\n // \u53EF\u80FD\u5DF2\u7ECF\u66B4\u9732\u8FC7\uFF0C\u5FFD\u7565\n }\n }\n\n await page.evaluate(({ selectorList, monitorKey, callbackName, cleanerName, hasCallback, mode }) => {\n const monitor = {\n observers: [],\n totalMutations: 0,\n running: true,\n };\n\n const resolveTargets = (selector) => {\n const key = String(selector || '').trim();\n if (!key) return [];\n\n if (key === 'document.documentElement' || key === 'documentElement' || key === 'document') {\n return document.documentElement ? [document.documentElement] : [];\n }\n\n if (key === 'document.body') {\n return document.body ? [document.body] : [];\n }\n\n return Array.from(document.querySelectorAll(key));\n };\n\n const serializeNode = (node, mutationType = 'unknown') => {\n if (!node) {\n return { html: '', text: '', mutationType };\n }\n\n if (node.nodeType === Node.ELEMENT_NODE) {\n return {\n html: node.outerHTML || '',\n text: node.innerText || node.textContent || '',\n mutationType,\n };\n }\n\n if (node.nodeType === Node.TEXT_NODE) {\n const text = node.textContent || '';\n return { html: text, text, mutationType };\n }\n\n if (node.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n const nodes = Array.from(node.childNodes || []);\n const html = nodes\n .map(item => item?.nodeType === Node.ELEMENT_NODE ? (item.outerHTML || '') : (item?.textContent || ''))\n .join('\\n');\n const text = node.textContent || '';\n return { html: html || text, text, mutationType };\n }\n\n const text = node.textContent || '';\n return { html: text, text, mutationType };\n };\n\n const collectMutationNodes = (mutations) => {\n const mutationNodes = [];\n\n for (const mutation of mutations) {\n if (mode === 'added') {\n if (mutation.type !== 'childList') continue;\n const added = Array.from(mutation.addedNodes || []);\n for (const node of added) {\n mutationNodes.push(serializeNode(node, 'added'));\n }\n continue;\n }\n\n if (mode === 'changed') {\n if (mutation.type === 'attributes' || mutation.type === 'characterData') {\n mutationNodes.push(serializeNode(mutation.target, mutation.type));\n } else if (mutation.type === 'childList') {\n const added = Array.from(mutation.addedNodes || []);\n const removed = Array.from(mutation.removedNodes || []);\n\n for (const node of added) {\n mutationNodes.push(serializeNode(node, 'added'));\n }\n for (const node of removed) {\n mutationNodes.push(serializeNode(node, 'removed'));\n }\n\n if (added.length === 0 && removed.length === 0) {\n mutationNodes.push(serializeNode(mutation.target, 'childList'));\n }\n }\n continue;\n }\n\n if (mutation.type === 'childList') {\n const added = Array.from(mutation.addedNodes || []);\n const removed = Array.from(mutation.removedNodes || []);\n\n for (const node of added) {\n mutationNodes.push(serializeNode(node, 'added'));\n }\n for (const node of removed) {\n mutationNodes.push(serializeNode(node, 'removed'));\n }\n\n if (added.length === 0 && removed.length === 0) {\n mutationNodes.push(serializeNode(mutation.target, 'childList'));\n }\n } else if (mutation.type === 'attributes' || mutation.type === 'characterData') {\n mutationNodes.push(serializeNode(mutation.target, mutation.type));\n } else {\n mutationNodes.push(serializeNode(mutation.target, mutation.type || 'unknown'));\n }\n }\n\n return mutationNodes;\n };\n\n selectorList.forEach(selector => {\n const elements = resolveTargets(selector);\n elements.forEach(element => {\n const observer = new MutationObserver((mutations) => {\n if (!monitor.running) return;\n\n const mutationNodes = collectMutationNodes(mutations);\n if (mutationNodes.length <= 0) return;\n\n monitor.totalMutations += mutationNodes.length;\n\n if (hasCallback && window[callbackName]) {\n const html = mutationNodes.map(item => item.html || '').join('\\n');\n const text = mutationNodes.map(item => item.text || '').join('\\n');\n\n window[callbackName]({\n mutationCount: monitor.totalMutations,\n html,\n text,\n mutationNodes,\n });\n }\n });\n\n observer.observe(element, {\n childList: true,\n subtree: true,\n characterData: mode !== 'added',\n attributes: mode !== 'added',\n });\n\n monitor.observers.push(observer);\n });\n });\n\n window[monitorKey] = monitor;\n window[cleanerName] = () => {\n monitor.running = false;\n monitor.observers.forEach(obs => obs.disconnect());\n const total = monitor.totalMutations;\n delete window[monitorKey];\n delete window[cleanerName];\n return total;\n };\n }, { selectorList, monitorKey, callbackName, cleanerName, hasCallback: !!onMutation, mode });\n\n logger.success('useMonitor', '\u76D1\u63A7\u5668\u5DF2\u542F\u52A8');\n\n return {\n stop: async () => {\n let totalMutations = 0;\n try {\n totalMutations = await page.evaluate((cleanerName) => {\n if (window[cleanerName]) {\n return window[cleanerName]();\n }\n return 0;\n }, cleanerName);\n } catch (e) {\n // \u9875\u9762\u53EF\u80FD\u5DF2\u5173\u95ED\uFF0C\u5FFD\u7565\n }\n logger.success('useMonitor.stop', `\u76D1\u63A7\u5DF2\u505C\u6B62, \u5171 ${totalMutations} \u6B21\u53D8\u5316`);\n return { totalMutations };\n }\n };\n }\n};\n", "export const Display = {\n parseTokenDisplayName(value) {\n if (!value) {\n return { owner: '', envType: '', note: '' };\n }\n const parts = String(value).split(':');\n const owner = (parts[0] || '').trim();\n const envType = (parts[1] || '').trim();\n const note = parts.length > 2 ? parts.slice(2).join(':').trim() : '';\n return { owner, envType, note };\n },\n\n parseEnvDisplayName(value) {\n if (!value) {\n return { env: '', owner: '', envType: '', note: '' };\n }\n const parts = String(value).split(':');\n const env = (parts[0] || '').trim();\n const owner = (parts[1] || '').trim();\n const envType = (parts[2] || '').trim();\n const note = parts.length > 3 ? parts.slice(3).join(':').trim() : '';\n return { env, owner, envType, note };\n },\n\n buildTokenDisplayName({ owner, envType, note } = {}) {\n const trimmedOwner = owner?.trim() || '';\n const trimmedType = envType?.trim() || '';\n const trimmedNote = note?.trim() || '';\n const parts = [trimmedOwner, trimmedType];\n if (trimmedNote) {\n parts.push(trimmedNote);\n }\n return parts.filter(Boolean).join(':');\n },\n\n shortId(value, max = 8) {\n const clean = String(value || '').trim();\n if (!clean) return '';\n if (clean.length <= max) return clean;\n return clean.slice(0, max);\n },\n\n resolveTokenIdentity(displayName, tokenId) {\n const cleanName = String(displayName || '').trim();\n const cleanId = String(tokenId || '').trim();\n const short = this.shortId(cleanId, 8);\n const hasName = cleanName !== '' && cleanName !== cleanId;\n const primary = hasName ? cleanName : (short || '-');\n const secondary = hasName && short ? short : '';\n return { primary, secondary, fullId: cleanId, shortId: short };\n },\n\n resolveEnvIdentity(displayName, envId) {\n const parts = this.parseEnvDisplayName(displayName);\n const cleanId = String(envId || '').trim();\n const short = this.shortId(cleanId, 8);\n const hasName = parts.env !== '' && parts.env !== cleanId;\n const primary = hasName ? parts.env : (short || '-');\n const secondary = hasName && short ? short : '';\n return { primary, secondary, parts, fullId: cleanId, shortId: short };\n },\n};\n", "import { createBaseLogger, setDefaultLogger } from './internals/logger.js';\n\nexport const stripAnsi = (input) => {\n if (!input) return '';\n return String(input).replace(/\\x1b\\[[0-9;]*m/g, '');\n};\n\n// =============================================================================\n// Log Templates & Definitions\n// =============================================================================\n\nconst STEP_PREFIX = '\u6B65\u9AA4:';\nconst STEP_SEPARATOR = ' | ';\nconst STEP_EMOJIS = [\n { match: '\u4EFB\u52A1', emoji: '\uD83E\uDDED' },\n { match: '\u8FD0\u884C\u6A21\u5F0F', emoji: '\uD83E\uDDE9' },\n { match: '\u6A21\u677F\u8BC6\u522B', emoji: '\uD83E\uDDF1' },\n { match: '\u767B\u5F55', emoji: '\uD83D\uDD10' },\n { match: '\u73AF\u5883', emoji: '\uD83E\uDDEA' },\n { match: '\u8F93\u5165', emoji: '\u2328\uFE0F' },\n { match: '\u53D1\u9001', emoji: '\uD83D\uDCE4' },\n { match: '\u54CD\u5E94\u76D1\u542C', emoji: '\uD83D\uDCE1' },\n { match: '\u7B49\u5F85\u54CD\u5E94', emoji: '\u23F3' },\n { match: '\u6D41\u5F0F', emoji: '\uD83E\uDDF5' },\n { match: '\u5F15\u7528', emoji: '\uD83D\uDCCE' },\n { match: '\u622A\u56FE', emoji: '\uD83D\uDDBC\uFE0F' },\n { match: '\u5206\u4EAB\u94FE\u63A5', emoji: '\uD83D\uDD17' },\n { match: '\u6570\u636E\u63A8\u9001', emoji: '\uD83D\uDCE6' },\n { match: '\u5F39\u7A97', emoji: '\uD83E\uDE9F' },\n];\nconst STATUS_EMOJIS = [\n { match: '\u5F00\u59CB', emoji: '\uD83D\uDE80' },\n { match: '\u5B8C\u6210', emoji: '\u2705' },\n { match: '\u6210\u529F', emoji: '\u2705' },\n { match: '\u5931\u8D25', emoji: '\u274C' },\n { match: '\u8DF3\u8FC7', emoji: '\u23ED\uFE0F' },\n { match: '\u8D85\u65F6', emoji: '\u23F1\uFE0F' },\n { match: '\u91CD\u8BD5', emoji: '\uD83D\uDD01' },\n { match: '\u7ED3\u675F', emoji: '\uD83C\uDFC1' },\n { match: '\u5DF2\u914D\u7F6E', emoji: '\uD83E\uDDF7' },\n { match: '\u5DF2\u68C0\u6D4B', emoji: '\uD83D\uDD0E' },\n];\n\nconst toErrorMessage = (error) => {\n if (!error) return '';\n if (error instanceof Error) return error.message;\n if (typeof error === 'string') return error;\n try {\n return JSON.stringify(error);\n } catch {\n return String(error);\n }\n};\n\nconst decorateLabel = (label, mappings) => {\n if (!label) return '';\n const mapping = mappings.find((item) => label.includes(item.match));\n if (!mapping) return label;\n return `${mapping.emoji} ${label}`;\n};\n\nconst normalizeSnippet = (snippet, maxLen = 120) => {\n if (!snippet) return '';\n const text = String(snippet).replace(/\\s+/g, ' ').trim();\n if (!text) return '';\n const cleaned = text.replace(/\"/g, \"'\");\n if (cleaned.length <= maxLen) return cleaned;\n return `${cleaned.slice(0, maxLen)}...`;\n};\n\nconst LOG_TAG_PREFIX = '[#log:';\nconst LOG_TAG_SUFFIX = ']';\n\nconst buildLogTag = (key) => `${LOG_TAG_PREFIX}${key}${LOG_TAG_SUFFIX}`;\n\nconst escapeRegExp = (value) => String(value).replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\nconst buildStepPattern = (step, status) => {\n if (!step) return null;\n let pattern = `\u6B65\u9AA4: .*${escapeRegExp(step)}`;\n if (status) {\n pattern += `.*${escapeRegExp(status)}`;\n }\n return new RegExp(pattern);\n};\n\nconst buildDefinitionPatterns = (definition) => {\n const patterns = [new RegExp(`\\\\[#log:${escapeRegExp(definition.key)}\\\\]`)];\n const fallback = buildStepPattern(definition.step, definition.status);\n if (fallback) patterns.push(fallback);\n if (Array.isArray(definition.extraPatterns)) {\n patterns.push(...definition.extraPatterns);\n }\n return patterns;\n};\n\nconst ATTENTION_RANK = {\n low: 1,\n medium: 2,\n high: 3,\n critical: 4,\n};\nconst DEFAULT_ATTENTION_RANK = ATTENTION_RANK.high;\n\nconst LOG_DEFINITIONS = [\n {\n key: 'task_start',\n method: 'taskStart',\n label: '\u4EFB\u52A1\u5F00\u59CB',\n group: '\u4EFB\u52A1',\n step: '\u4EFB\u52A1',\n status: '\u5F00\u59CB',\n level: 'start',\n attention: 'low',\n buildDetails: (url) => [url ? `url=${url}` : ''],\n },\n {\n key: 'task_success',\n method: 'taskSuccess',\n label: '\u4EFB\u52A1\u5B8C\u6210',\n group: '\u4EFB\u52A1',\n step: '\u4EFB\u52A1',\n status: '\u5B8C\u6210',\n level: 'success',\n attention: 'high',\n },\n {\n key: 'task_fail',\n method: 'taskFail',\n label: '\u4EFB\u52A1\u5931\u8D25',\n group: '\u4EFB\u52A1',\n step: '\u4EFB\u52A1',\n status: '\u5931\u8D25',\n level: 'error',\n attention: 'critical',\n buildDetails: (url, err) => [\n url ? `url=${url}` : '',\n err ? `err=${toErrorMessage(err)}` : ''\n ],\n },\n {\n key: 'runtime_headless',\n method: 'runtimeHeadless',\n label: '\u8FD0\u884C\u6A21\u5F0F\u5F3A\u5236\u65E0\u5934',\n group: '\u8FD0\u884C\u6A21\u5F0F',\n step: '\u8FD0\u884C\u6A21\u5F0F',\n status: 'Apify \u73AF\u5883\u5F3A\u5236\u65E0\u5934',\n level: 'warning',\n attention: 'medium',\n },\n {\n key: 'login_inject_success',\n method: 'loginInjectSuccess',\n label: '\u767B\u5F55\u6001\u6CE8\u5165\u6210\u529F',\n group: '\u767B\u5F55',\n step: '\u767B\u5F55\u6001\u6CE8\u5165',\n status: '\u6210\u529F',\n level: 'success',\n attention: 'medium',\n buildDetails: (detail) => [detail ? `detail=${detail}` : ''],\n },\n {\n key: 'login_inject_skip',\n method: 'loginInjectSkip',\n label: '\u767B\u5F55\u6001\u6CE8\u5165\u8DF3\u8FC7',\n group: '\u767B\u5F55',\n step: '\u767B\u5F55\u6001\u6CE8\u5165',\n status: '\u8DF3\u8FC7',\n level: 'warning',\n attention: 'medium',\n buildDetails: (reason) => [reason ? `\u539F\u56E0=${reason}` : ''],\n },\n {\n key: 'login_inject_fail',\n method: 'loginInjectFail',\n label: '\u767B\u5F55\u6001\u6CE8\u5165\u5931\u8D25',\n group: '\u767B\u5F55',\n step: '\u767B\u5F55\u6001\u6CE8\u5165',\n status: '\u5931\u8D25',\n level: 'error',\n attention: 'high',\n buildDetails: (err) => [err ? `err=${toErrorMessage(err)}` : ''],\n },\n {\n key: 'login_verify_success',\n method: 'loginVerifySuccess',\n label: '\u767B\u5F55\u9A8C\u8BC1\u6210\u529F',\n group: '\u767B\u5F55',\n step: '\u767B\u5F55\u9A8C\u8BC1',\n status: '\u6210\u529F',\n level: 'success',\n attention: 'high',\n buildDetails: (detail) => [detail ? `detail=${detail}` : ''],\n },\n {\n key: 'login_verify_skip',\n method: 'loginVerifySkip',\n label: '\u767B\u5F55\u9A8C\u8BC1\u8DF3\u8FC7',\n group: '\u767B\u5F55',\n step: '\u767B\u5F55\u9A8C\u8BC1',\n status: '\u8DF3\u8FC7',\n level: 'warning',\n attention: 'medium',\n buildDetails: (reason) => [reason ? `\u539F\u56E0=${reason}` : ''],\n },\n {\n key: 'login_verify_fail',\n method: 'loginVerifyFail',\n label: '\u767B\u5F55\u9A8C\u8BC1\u5931\u8D25',\n group: '\u767B\u5F55',\n step: '\u767B\u5F55\u9A8C\u8BC1',\n status: '\u5931\u8D25',\n level: 'error',\n attention: 'critical',\n buildDetails: (err) => [err ? `err=${toErrorMessage(err)}` : ''],\n },\n {\n key: 'env_check_success',\n method: 'envCheckSuccess',\n label: '\u73AF\u5883\u68C0\u67E5\u6210\u529F',\n group: '\u73AF\u5883',\n step: '\u73AF\u5883\u68C0\u67E5',\n status: '\u6210\u529F',\n level: 'success',\n attention: 'medium',\n buildDetails: (detail) => [detail ? `detail=${detail}` : ''],\n },\n {\n key: 'env_check_fail',\n method: 'envCheckFail',\n label: '\u73AF\u5883\u68C0\u67E5\u5931\u8D25',\n group: '\u73AF\u5883',\n step: '\u73AF\u5883\u68C0\u67E5',\n status: '\u5931\u8D25',\n level: 'error',\n attention: 'high',\n buildDetails: (err) => [err ? `err=${toErrorMessage(err)}` : ''],\n },\n {\n key: 'input_query_start',\n method: 'inputQuery',\n label: '\u8F93\u5165\u67E5\u8BE2\u5F00\u59CB',\n group: '\u8F93\u5165',\n step: '\u8F93\u5165\u67E5\u8BE2',\n status: '\u5F00\u59CB',\n level: 'start',\n attention: 'low',\n buildDetails: (query) => [query ? `query=${query}` : ''],\n },\n {\n key: 'send_action',\n method: 'sendAction',\n label: '\u53D1\u9001\u8BF7\u6C42',\n group: '\u53D1\u9001',\n step: '\u53D1\u9001\u8BF7\u6C42',\n status: '\u70B9\u51FB\u53D1\u9001',\n level: 'info',\n attention: 'low',\n },\n {\n key: 'response_listen_start',\n method: 'responseListenStart',\n label: '\u54CD\u5E94\u76D1\u542C\u5F00\u59CB',\n group: '\u54CD\u5E94\u76D1\u542C',\n step: '\u54CD\u5E94\u76D1\u542C',\n status: '\u5F00\u59CB',\n level: 'start',\n attention: 'low',\n buildDetails: (label, timeoutSec) => [\n label ? `\u76EE\u6807=${label}` : '',\n timeoutSec ? `timeout=${timeoutSec}s` : ''\n ],\n },\n {\n key: 'response_listen_ready',\n method: 'responseListenReady',\n label: '\u54CD\u5E94\u76D1\u542C\u5DF2\u914D\u7F6E',\n group: '\u54CD\u5E94\u76D1\u542C',\n step: '\u54CD\u5E94\u76D1\u542C',\n status: '\u5DF2\u914D\u7F6E',\n level: 'info',\n attention: 'medium',\n buildDetails: (label) => [label ? `\u76EE\u6807=${label}` : ''],\n },\n {\n key: 'response_listen_detected',\n method: 'responseListenDetected',\n label: '\u54CD\u5E94\u76D1\u542C\u5DF2\u68C0\u6D4B',\n group: '\u54CD\u5E94\u76D1\u542C',\n step: '\u54CD\u5E94\u76D1\u542C',\n status: '\u5DF2\u68C0\u6D4B',\n level: 'success',\n attention: 'medium',\n buildDetails: (label) => [label ? `\u76EE\u6807=${label}` : ''],\n },\n {\n key: 'response_listen_timeout',\n method: 'responseListenTimeout',\n label: '\u54CD\u5E94\u76D1\u542C\u8D85\u65F6',\n group: '\u54CD\u5E94\u76D1\u542C',\n step: '\u54CD\u5E94\u76D1\u542C',\n status: '\u8D85\u65F6',\n level: 'error',\n attention: 'high',\n buildDetails: (label, err) => [\n label ? `\u76EE\u6807=${label}` : '',\n err ? `err=${toErrorMessage(err)}` : ''\n ],\n },\n {\n key: 'response_listen_end',\n method: 'responseListenEnd',\n label: '\u54CD\u5E94\u76D1\u542C\u7ED3\u675F',\n group: '\u54CD\u5E94\u76D1\u542C',\n step: '\u54CD\u5E94\u76D1\u542C',\n status: '\u7ED3\u675F',\n level: 'info',\n attention: 'low',\n buildDetails: (label) => [label ? `\u76EE\u6807=${label}` : ''],\n },\n {\n key: 'response_wait_start',\n method: 'responseWaitStart',\n label: '\u7B49\u5F85\u54CD\u5E94\u5F00\u59CB',\n group: '\u7B49\u5F85\u54CD\u5E94',\n step: '\u7B49\u5F85\u54CD\u5E94',\n status: '\u5F00\u59CB',\n level: 'start',\n attention: 'low',\n buildDetails: (label) => [label ? `\u76EE\u6807=${label}` : ''],\n },\n {\n key: 'response_wait_success',\n method: 'responseWaitSuccess',\n label: '\u7B49\u5F85\u54CD\u5E94\u5B8C\u6210',\n group: '\u7B49\u5F85\u54CD\u5E94',\n step: '\u7B49\u5F85\u54CD\u5E94',\n status: '\u5B8C\u6210',\n level: 'success',\n attention: 'medium',\n buildDetails: (label) => [label ? `\u76EE\u6807=${label}` : ''],\n },\n {\n key: 'response_wait_fail',\n method: 'responseWaitFail',\n label: '\u7B49\u5F85\u54CD\u5E94\u5931\u8D25',\n group: '\u7B49\u5F85\u54CD\u5E94',\n step: '\u7B49\u5F85\u54CD\u5E94',\n status: '\u5931\u8D25',\n level: 'warning',\n attention: 'high',\n buildDetails: (label, err) => [\n label ? `\u76EE\u6807=${label}` : '',\n err ? `err=${toErrorMessage(err)}` : ''\n ],\n },\n {\n key: 'response_wait_retry',\n method: 'responseWaitRetry',\n label: '\u7B49\u5F85\u54CD\u5E94\u91CD\u8BD5',\n group: '\u7B49\u5F85\u54CD\u5E94',\n step: '\u7B49\u5F85\u54CD\u5E94',\n status: '\u91CD\u8BD5',\n level: 'warning',\n attention: 'medium',\n buildDetails: (label, attempt) => [\n label ? `\u76EE\u6807=${label}` : '',\n attempt !== undefined ? `\u5C1D\u8BD5=${attempt}` : ''\n ],\n },\n {\n key: 'dom_wait_start',\n method: 'domWaitStart',\n label: 'DOM\u7A33\u5B9A\u7B49\u5F85\u5F00\u59CB',\n group: 'DOM',\n step: 'DOM\u7A33\u5B9A',\n status: '\u5F00\u59CB',\n level: 'start',\n attention: 'low',\n buildDetails: (label) => [label ? `\u76EE\u6807=${label}` : ''],\n },\n {\n key: 'dom_wait_fail',\n method: 'domWaitFail',\n label: 'DOM\u7A33\u5B9A\u7B49\u5F85\u5931\u8D25',\n group: 'DOM',\n step: 'DOM\u7A33\u5B9A',\n status: '\u5931\u8D25',\n level: 'warning',\n attention: 'high',\n buildDetails: (label, err) => [\n label ? `\u76EE\u6807=${label}` : '',\n err ? `err=${toErrorMessage(err)}` : ''\n ],\n },\n {\n key: 'dom_chunk',\n method: 'domChunk',\n label: 'DOM\u7247\u6BB5',\n group: 'DOM',\n step: 'DOM\u7247\u6BB5',\n status: '',\n level: 'info',\n attention: 'low',\n throttleKey: 'dom-chunk',\n throttleMs: 2000,\n buildDetails: (length, snippet, paused) => [\n length !== undefined ? `len=${length}` : '',\n snippet ? `preview=\"${normalizeSnippet(snippet)}\"` : '',\n paused ? 'paused=1' : ''\n ],\n },\n {\n key: 'dom_wait_success',\n method: 'domWaitSuccess',\n label: 'DOM\u7A33\u5B9A\u7B49\u5F85\u5B8C\u6210',\n group: 'DOM',\n step: 'DOM\u7A33\u5B9A',\n status: '\u5B8C\u6210',\n level: 'success',\n attention: 'medium',\n buildDetails: (mutationCount, stableTime, wasPaused) => [\n mutationCount !== undefined ? `mutations=${mutationCount}` : '',\n stableTime !== undefined ? `stableTime=${stableTime}ms` : '',\n wasPaused ? 'paused=1' : ''\n ],\n },\n {\n key: 'stream_chunk',\n method: 'streamChunk',\n label: '\u6D41\u5F0F\u7247\u6BB5',\n group: '\u6D41\u5F0F',\n step: '\u6D41\u5F0F\u7247\u6BB5',\n status: '',\n level: 'info',\n attention: 'low',\n throttleKey: 'stream-chunk',\n throttleMs: 2000,\n buildDetails: (length, snippet) => [\n length !== undefined ? `len=${length}` : '',\n snippet ? `preview=\"${normalizeSnippet(snippet)}\"` : ''\n ],\n },\n {\n key: 'stream_events_parsed',\n method: 'streamEventsParsed',\n label: '\u6D41\u5F0F\u4E8B\u4EF6\u89E3\u6790\u5B8C\u6210',\n group: '\u6D41\u5F0F',\n step: '\u6D41\u5F0F\u4E8B\u4EF6\u89E3\u6790',\n status: '\u5B8C\u6210',\n level: 'info',\n attention: 'low',\n throttleKey: 'stream-events',\n throttleMs: 4000,\n buildDetails: (count) => [count !== undefined ? `count=${count}` : ''],\n },\n {\n key: 'stream_complete_event',\n method: 'streamCompleteEvent',\n label: '\u6D41\u5F0F\u5B8C\u6210\u4E8B\u4EF6\u6355\u83B7',\n group: '\u6D41\u5F0F',\n step: '\u6D41\u5F0F\u4E8B\u4EF6',\n status: '\u5B8C\u6210\u4E8B\u4EF6\u5DF2\u6355\u83B7',\n level: 'success',\n attention: 'medium',\n },\n {\n key: 'stream_end',\n method: 'streamEnd',\n label: '\u6D41\u5F0F\u54CD\u5E94\u7ED3\u675F',\n group: '\u6D41\u5F0F',\n step: '\u6D41\u5F0F\u54CD\u5E94',\n status: '\u7ED3\u675F',\n level: 'info',\n attention: 'low',\n },\n {\n key: 'reference_expand_start',\n method: 'referenceExpandStart',\n label: '\u5F15\u7528\u5C55\u5F00\u5F00\u59CB',\n group: '\u5F15\u7528',\n step: '\u5F15\u7528\u5C55\u5F00',\n status: '\u5F00\u59CB',\n level: 'start',\n attention: 'low',\n buildDetails: (label) => [label ? `\u76EE\u6807=${label}` : ''],\n },\n {\n key: 'reference_expand_fail',\n method: 'referenceExpandFail',\n label: '\u5F15\u7528\u5C55\u5F00\u5931\u8D25',\n group: '\u5F15\u7528',\n step: '\u5F15\u7528\u5C55\u5F00',\n status: '\u5931\u8D25',\n level: 'warning',\n attention: 'medium',\n buildDetails: (err) => [err ? `err=${toErrorMessage(err)}` : ''],\n },\n {\n key: 'screenshot_start',\n method: 'screenshotStart',\n label: '\u622A\u56FE\u5F00\u59CB',\n group: '\u622A\u56FE',\n step: '\u622A\u56FE',\n status: '\u5F00\u59CB',\n level: 'start',\n attention: 'low',\n },\n {\n key: 'screenshot_success',\n method: 'screenshotSuccess',\n label: '\u622A\u56FE\u6210\u529F',\n group: '\u622A\u56FE',\n step: '\u622A\u56FE',\n status: '\u6210\u529F',\n level: 'success',\n attention: 'high',\n },\n {\n key: 'screenshot_fail',\n method: 'screenshotFail',\n label: '\u622A\u56FE\u5931\u8D25',\n group: '\u622A\u56FE',\n step: '\u622A\u56FE',\n status: '\u5931\u8D25',\n level: 'warning',\n attention: 'high',\n buildDetails: (err) => [err ? `err=${toErrorMessage(err)}` : ''],\n },\n {\n key: 'share_start',\n method: 'shareStart',\n label: '\u5206\u4EAB\u94FE\u63A5\u5F00\u59CB',\n group: '\u5206\u4EAB',\n step: '\u5206\u4EAB\u94FE\u63A5',\n status: '\u5F00\u59CB',\n level: 'start',\n attention: 'low',\n },\n {\n key: 'share_progress',\n method: 'shareProgress',\n label: '\u5206\u4EAB\u94FE\u63A5\u6B65\u9AA4',\n group: '\u5206\u4EAB',\n step: '\u5206\u4EAB\u94FE\u63A5',\n status: '\u6B65\u9AA4',\n level: 'info',\n attention: 'low',\n buildDetails: (label) => [label ? `\u6B65\u9AA4=${label}` : ''],\n },\n {\n key: 'share_dom_hit',\n method: 'shareDomHit',\n label: '\u5206\u4EAB\u94FE\u63A5DOM\u547D\u4E2D',\n group: '\u5206\u4EAB',\n step: '\u5206\u4EAB\u94FE\u63A5',\n status: 'DOM\u547D\u4E2D',\n level: 'info',\n attention: 'low',\n buildDetails: (link, domSnapshot) => [\n link ? `\u94FE\u63A5=${link}` : '',\n domSnapshot ? `DOM=${normalizeSnippet(domSnapshot, 220)}` : ''\n ],\n },\n {\n key: 'share_source',\n method: 'shareSource',\n label: '\u5206\u4EAB\u94FE\u63A5\u6765\u6E90',\n group: '\u5206\u4EAB',\n step: '\u5206\u4EAB\u94FE\u63A5',\n status: '\u6765\u6E90',\n level: 'info',\n attention: 'low',\n buildDetails: (source, link, domSnapshot) => [\n source ? `\u6765\u6E90=${source}` : '',\n link ? `\u94FE\u63A5=${link}` : '',\n source === 'dom' && domSnapshot ? `DOM=${normalizeSnippet(domSnapshot, 220)}` : ''\n ],\n },\n {\n key: 'share_success',\n method: 'shareSuccess',\n label: '\u5206\u4EAB\u94FE\u63A5\u6210\u529F',\n group: '\u5206\u4EAB',\n step: '\u5206\u4EAB\u94FE\u63A5',\n status: '\u6210\u529F',\n level: 'success',\n attention: 'high',\n buildDetails: (link) => [link ? `\u94FE\u63A5=${link}` : ''],\n },\n {\n key: 'share_fail',\n method: 'shareFail',\n label: '\u5206\u4EAB\u94FE\u63A5\u5931\u8D25',\n group: '\u5206\u4EAB',\n step: '\u5206\u4EAB\u94FE\u63A5',\n status: '\u5931\u8D25',\n level: 'warning',\n attention: 'high',\n buildDetails: (err) => [err ? `err=${toErrorMessage(err)}` : ''],\n },\n {\n key: 'share_skip',\n method: 'shareSkip',\n label: '\u5206\u4EAB\u94FE\u63A5\u8DF3\u8FC7',\n group: '\u5206\u4EAB',\n step: '\u5206\u4EAB\u94FE\u63A5',\n status: '\u8DF3\u8FC7',\n level: 'warning',\n attention: 'medium',\n buildDetails: (reason) => [reason ? `\u539F\u56E0=${reason}` : ''],\n },\n {\n key: 'ai_search_card_detect_attempt',\n method: 'aiSearchCardDetectAttempt',\n label: 'AI Search \u5361\u7247\u8BC6\u522B\u5C1D\u8BD5',\n group: 'AI Search',\n step: 'AI Search \u5361\u7247\u8BC6\u522B',\n status: '\u5C1D\u8BD5',\n level: 'info',\n attention: 'low',\n buildDetails: (attempt = 1, maxAttempts = 1, url = '') => [\n `attempt=${attempt}/${maxAttempts}`,\n url ? `url=${url}` : '',\n ],\n },\n {\n key: 'ai_search_card_detect_success',\n method: 'aiSearchCardDetectSuccess',\n label: 'AI Search \u5361\u7247\u8BC6\u522B\u6210\u529F',\n group: 'AI Search',\n step: 'AI Search \u5361\u7247\u8BC6\u522B',\n status: '\u6210\u529F',\n level: 'success',\n attention: 'high',\n buildDetails: (cardType = '', attempts = 1, refreshCount = 0, url = '') => [\n cardType ? `cardType=${cardType}` : '',\n `attempts=${attempts}`,\n `refreshCount=${refreshCount}`,\n url ? `url=${url}` : '',\n ],\n },\n {\n key: 'ai_search_card_empty_result_success',\n method: 'aiSearchCardEmptyResultSuccess',\n label: 'AI Search \u7A7A\u7ED3\u679C\u6210\u529F',\n group: 'AI Search',\n step: 'AI Search \u7A7A\u7ED3\u679C',\n status: '\u6210\u529F',\n level: 'success',\n attention: 'high',\n buildDetails: (contentLeftTpls = [], targetTpls = [], url = '', attempts = 0, refreshCount = 0) => [\n Array.isArray(contentLeftTpls) ? `contentLeftTpls=${normalizeSnippet(contentLeftTpls.join(','), 200)}` : '',\n Array.isArray(targetTpls) ? `targetTpls=${normalizeSnippet(targetTpls.join(','), 200)}` : '',\n `attempts=${attempts}`,\n `refreshCount=${refreshCount}`,\n url ? `url=${url}` : '',\n ],\n },\n {\n key: 'data_push_success',\n method: 'dataPushSuccess',\n label: '\u6570\u636E\u63A8\u9001\u6210\u529F',\n group: '\u6570\u636E\u63A8\u9001',\n step: '\u6570\u636E\u63A8\u9001',\n status: '\u6210\u529F',\n level: 'success',\n attention: 'medium',\n buildDetails: (label) => [label ? `\u8BF4\u660E=${label}` : ''],\n },\n {\n key: 'data_push_fail',\n method: 'dataPushFail',\n label: '\u6570\u636E\u63A8\u9001\u5931\u8D25',\n group: '\u6570\u636E\u63A8\u9001',\n step: '\u6570\u636E\u63A8\u9001',\n status: '\u5931\u8D25',\n level: 'error',\n attention: 'high',\n buildDetails: (err) => [err ? `err=${toErrorMessage(err)}` : ''],\n },\n {\n key: 'popup_detected',\n method: 'popupDetected',\n label: '\u5F39\u7A97\u68C0\u6D4B',\n group: '\u5F39\u7A97',\n step: '\u5F39\u7A97\u5904\u7406',\n status: '\u68C0\u6D4B\u5230\u906E\u7F69',\n level: 'warning',\n attention: 'medium',\n buildDetails: (detail) => [detail ? `detail=${detail}` : ''],\n },\n {\n key: 'popup_close_attempt',\n method: 'popupCloseAttempt',\n label: '\u5F39\u7A97\u5173\u95ED\u5C1D\u8BD5',\n group: '\u5F39\u7A97',\n step: '\u5F39\u7A97\u5904\u7406',\n status: '\u5C1D\u8BD5\u5173\u95ED',\n level: 'info',\n attention: 'low',\n buildDetails: (detail) => [detail ? `detail=${detail}` : ''],\n },\n {\n key: 'popup_close_success',\n method: 'popupCloseSuccess',\n label: '\u5F39\u7A97\u5173\u95ED\u5B8C\u6210',\n group: '\u5F39\u7A97',\n step: '\u5F39\u7A97\u5904\u7406',\n status: '\u5173\u95ED\u5B8C\u6210',\n level: 'success',\n attention: 'medium',\n },\n {\n key: 'popup_close_fail',\n method: 'popupCloseFail',\n label: '\u5F39\u7A97\u5173\u95ED\u5931\u8D25',\n group: '\u5F39\u7A97',\n step: '\u5F39\u7A97\u5904\u7406',\n status: '\u5173\u95ED\u5931\u8D25',\n level: 'warning',\n attention: 'medium',\n buildDetails: (err) => [err ? `err=${toErrorMessage(err)}` : ''],\n },\n];\n\nexport const LOG_TEMPLATES = LOG_DEFINITIONS.map((definition) => {\n const attention = definition.attention || 'medium';\n const attentionRank = ATTENTION_RANK[attention] || ATTENTION_RANK.medium;\n const defaultSelected = attentionRank >= DEFAULT_ATTENTION_RANK;\n return {\n key: definition.key,\n label: definition.label,\n group: definition.group,\n attention,\n patterns: buildDefinitionPatterns(definition),\n defaultSelected,\n };\n});\n\nconst buildStepLine = (step, status, details = []) => {\n const parts = [];\n const decoratedStep = step ? decorateLabel(step, STEP_EMOJIS) : '';\n const base = decoratedStep ? `${STEP_PREFIX} ${decoratedStep}` : STEP_PREFIX;\n parts.push(base.trim());\n if (status) parts.push(decorateLabel(status, STATUS_EMOJIS));\n const detailParts = details.filter(Boolean);\n if (detailParts.length > 0) {\n parts.push(...detailParts);\n }\n return parts.join(STEP_SEPARATOR);\n};\n\nconst createThrottle = () => {\n const lastMap = new Map();\n return (key, intervalMs, fn) => {\n const now = Date.now();\n const last = lastMap.get(key) || 0;\n if (now - last >= intervalMs) {\n lastMap.set(key, now);\n fn();\n }\n };\n};\n\nexport const createTemplateLogger = (baseLogger = createBaseLogger()) => {\n const throttle = createThrottle();\n\n const info = (line) => baseLogger.info(line);\n const success = (line) => baseLogger.success(line);\n const warning = (line) => baseLogger.warning(line);\n const error = (line) => baseLogger.error(line);\n const debug = (line) => baseLogger.debug(line);\n const start = (line) => baseLogger.start(line);\n\n const stepInfo = (step, status, details = []) => info(buildStepLine(step, status, details));\n const stepSuccess = (step, status, details = []) => success(buildStepLine(step, status, details));\n const stepWarn = (step, status, details = []) => warning(buildStepLine(step, status, details));\n const stepError = (step, status, details = []) => error(buildStepLine(step, status, details));\n const stepStart = (step, status, details = []) => start(buildStepLine(step, status, details));\n\n const stepHandlers = {\n info: stepInfo,\n success: stepSuccess,\n warning: stepWarn,\n error: stepError,\n start: stepStart,\n };\n\n const logFromDefinition = (definition, details = []) => {\n const handler = stepHandlers[definition.level] || stepInfo;\n const payload = [...details, buildLogTag(definition.key)];\n const emit = () => handler(definition.step, definition.status, payload);\n if (definition.throttleMs) {\n throttle(definition.throttleKey || definition.key, definition.throttleMs, emit);\n return;\n }\n emit();\n };\n\n const definitionMethods = {};\n LOG_DEFINITIONS.forEach((definition) => {\n if (!definition.method) return;\n definitionMethods[definition.method] = (...args) => {\n const details = definition.buildDetails ? definition.buildDetails(...args) : [];\n logFromDefinition(definition, details);\n };\n });\n\n return {\n step: (step, status, details, level = 'info') => {\n if (level === 'error') return stepError(step, status, details);\n if (level === 'warn' || level === 'warning') return stepWarn(step, status, details);\n if (level === 'start') return stepStart(step, status, details);\n if (level === 'success') return stepSuccess(step, status, details);\n return stepInfo(step, status, details);\n },\n info: (message) => info(message),\n success: (message) => success(message),\n warning: (message) => warning(message),\n warn: (message) => warning(message),\n error: (message) => error(message),\n debug: (message) => debug(message),\n start: (message) => start(message),\n ...definitionMethods,\n };\n};\n\nconst getDefaultBaseLogger = () => createBaseLogger('');\n\nexport const Logger = {\n setLogger: (logger) => setDefaultLogger(logger),\n info: (message) => getDefaultBaseLogger().info(message),\n success: (message) => getDefaultBaseLogger().success(message),\n warning: (message) => getDefaultBaseLogger().warning(message),\n warn: (message) => getDefaultBaseLogger().warning(message),\n error: (message) => getDefaultBaseLogger().error(message),\n debug: (message) => getDefaultBaseLogger().debug(message),\n start: (message) => getDefaultBaseLogger().start(message),\n useTemplate: (logger) => {\n if (logger) return createTemplateLogger(createBaseLogger('', logger));\n return createTemplateLogger();\n },\n};\n", "import delay from 'delay';\nimport { Utils } from './utils.js';\nimport { Mutation } from './mutation.js';\nimport { PageRuntimeStateKey } from './internals/constants.js';\nimport {\n normalizeScreenshotWatermarkify,\n resolveScreenshotWatermarkifyMeta,\n watermarkifyScreenshotBuffer,\n} from './internals/watermarkify.js';\nimport { createInternalLogger } from './internals/logger.js';\nimport {\n compressImageBufferToBase64,\n resolveImageCompression,\n} from './internals/compression.js';\nimport { captureExpandedFullPageScreenshot } from './internals/screenshot.js';\n\nconst logger = createInternalLogger('Share');\n\nconst DEFAULT_TIMEOUT_MS = 50 * 1000;\nconst DEFAULT_PAYLOAD_SNAPSHOT_MAX_LEN = 500;\nconst DEFAULT_POLL_INTERVAL_MS = 120;\n\nconst normalizePrefix = (value) => value == null ? undefined : String(value).trim();\n\nconst toSnapshot = (value, maxLen) => {\n const text = String(value || '');\n if (!text) return '';\n return text.replace(/\\s+/g, ' ').trim().slice(0, maxLen);\n};\n\nconst toInline = (value, maxLen = 200) => {\n const text = String(value || '');\n if (!text) return '';\n return text.replace(/\\s+/g, ' ').trim().slice(0, maxLen);\n};\n\nconst toJsonInline = (value, maxLen = 260) => {\n try {\n return toInline(JSON.stringify(value), maxLen);\n } catch {\n return '[\u4E0D\u53EF\u5E8F\u5217\u5316]';\n }\n};\n\nconst normalizeXurl = (value) => {\n if (!Array.isArray(value)) return [];\n\n const normalizeMatcherList = (input) => {\n if (Array.isArray(input)) {\n return input\n .map((item) => String(item || '').trim().replace(/\\.+$/, ''))\n .filter(Boolean);\n }\n\n const single = String(input || '').trim().replace(/\\.+$/, '');\n return single ? [single] : [];\n };\n\n const normalizeSegments = (input) => {\n if (Array.isArray(input)) {\n return input\n .map((item) => String(item || '').trim().replace(/\\.+$/, ''))\n .filter(Boolean);\n }\n\n const raw = String(input || '').trim();\n if (!raw) return [];\n\n return raw\n .split('.')\n .map((item) => String(item || '').trim().replace(/\\.+$/, ''))\n .filter(Boolean);\n };\n\n const normalized = [];\n\n const apiMatchers = normalizeMatcherList(value[0]);\n if (apiMatchers.length > 0) {\n normalized.push(apiMatchers);\n }\n\n const flattenedPath = [];\n const extraPaths = [];\n\n value.slice(1).forEach((item) => {\n if (Array.isArray(item)) {\n const segments = normalizeSegments(item);\n if (segments.length > 0) {\n extraPaths.push(segments);\n }\n return;\n }\n\n const segments = normalizeSegments(item);\n if (segments.length > 0) {\n flattenedPath.push(...segments);\n }\n });\n\n if (flattenedPath.length > 0) {\n normalized.push(flattenedPath);\n }\n\n if (extraPaths.length > 0) {\n normalized.push(...extraPaths);\n }\n\n return normalized;\n};\n\nconst normalizeShare = (share) => {\n const source = share && typeof share === 'object' ? share : {};\n const modeRaw = String(source.mode || 'dom').trim().toLowerCase();\n const mode = ['dom', 'response', 'custom'].includes(modeRaw) ? modeRaw : 'dom';\n\n return {\n mode,\n prefix: normalizePrefix(source.prefix),\n xurl: normalizeXurl(source.xurl),\n };\n};\n\nconst resolveCaptureScreenWatermarkify = (page, optionValue) => {\n if (optionValue === false) {\n return normalizeScreenshotWatermarkify(false);\n }\n\n const runtimeQuery = String(page?.[PageRuntimeStateKey]?.query || '').trim();\n if (optionValue == null || optionValue === true) {\n return normalizeScreenshotWatermarkify(runtimeQuery ? { query: runtimeQuery } : true);\n }\n\n const optionSource = optionValue && typeof optionValue === 'object' ? optionValue : {};\n return normalizeScreenshotWatermarkify({\n ...(runtimeQuery ? { query: runtimeQuery } : {}),\n ...optionSource,\n });\n};\n\nconst getByPathSegments = (source, pathSegments) => {\n if (!Array.isArray(pathSegments) || pathSegments.length === 0) return undefined;\n\n let current = source;\n\n for (const rawSegment of pathSegments) {\n const segment = String(rawSegment || '').trim();\n if (!segment) return undefined;\n if (current == null) return undefined;\n\n if (Array.isArray(current) && /^\\d+$/.test(segment)) {\n current = current[Number(segment)];\n continue;\n }\n\n current = current[segment];\n }\n\n return current;\n};\n\nconst buildShareLink = (prefix, value) => {\n const raw = String(value || '').trim();\n if (!raw) return '';\n\n if (/^https?:\\/\\//i.test(raw)) {\n return raw;\n }\n\n const safePrefix = normalizePrefix(prefix);\n if (!safePrefix) return '';\n\n const valueNoSlash = raw.replace(/^\\/+/, '');\n\n if (/[?&=]$/.test(safePrefix)) {\n return `${safePrefix}${valueNoSlash}`;\n }\n\n const prefixNoSlash = safePrefix.replace(/\\/+$/, '');\n return `${prefixNoSlash}/${valueNoSlash}`;\n};\n\nconst parseJsonSafely = (text) => {\n const raw = String(text || '').trim();\n if (!raw) return null;\n\n try {\n return JSON.parse(raw);\n } catch {\n return null;\n }\n};\n\nconst createDomShareMonitor = async (page, options = {}) => {\n const prefix = normalizePrefix(options.prefix);\n const selectors = options.selectors ?? 'html';\n const mode = options.mode ?? Mutation.Mode.All;\n const onMatch = typeof options.onMatch === 'function' ? options.onMatch : null;\n const onTelemetry = typeof options.onTelemetry === 'function' ? options.onTelemetry : null;\n\n let matched = false;\n\n logger.info(`DOM \u76D1\u542C\u51C6\u5907\u6302\u8F7D: selectors=${toJsonInline(selectors, 120)}, mode=${mode}`);\n\n const monitor = await Mutation.useMonitor(page, selectors, {\n mode,\n onMutation: (context = {}) => {\n if (matched) return;\n\n const mutationCount = Number(context.mutationCount || 0);\n const mutationNodes = Array.isArray(context.mutationNodes) ? context.mutationNodes : [];\n const html = String(context.html || '');\n const text = String(context.text || '');\n const rawDom = `${html}\\n${text}`;\n\n if (onTelemetry) {\n onTelemetry({\n mutationCount,\n mutationNodesCount: mutationNodes.length,\n });\n }\n\n if (mutationCount <= 5 || mutationCount % 50 === 0) {\n logger.info(`DOM \u53D8\u5316\u5DF2\u6355\u83B7: mutationCount=${mutationCount}, mutationNodes=${mutationNodes.length}`);\n }\n\n const [candidate] = Utils.parseLinks(rawDom, { prefix }) || [];\n if (!candidate) return;\n\n matched = true;\n logger.success('captureLink.domHit', `DOM \u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: mutationCount=${mutationCount}, link=${candidate}`);\n\n if (onMatch) {\n onMatch({\n link: candidate,\n rawDom,\n mutationCount,\n html,\n text,\n mutationNodes,\n });\n }\n },\n });\n\n return {\n stop: async () => {\n const result = await monitor.stop();\n logger.info(`DOM \u76D1\u542C\u5DF2\u505C\u6B62: totalMutations=${result?.totalMutations || 0}`);\n return result;\n },\n };\n};\n\nexport const Share = {\n /**\n * \u6355\u83B7\u5206\u4EAB\u94FE\u63A5\uFF08\u5355\u6A21\u5F0F\uFF09\n * - mode='dom': \u4EC5 DOM \u76D1\u542C\n * - mode='response': \u4EC5\u63A5\u53E3\u76D1\u542C\n * - mode='custom': \u4F7F\u7528 performActions \u8FD4\u56DE\u503C\u4F5C\u4E3A\u94FE\u63A5\n *\n * @param {import('playwright').Page} page\n * @param {Object} [options]\n * @param {{ mode?: 'dom' | 'response' | 'custom', prefix: string, xurl?: Array<string | string[]> }} options.share\n * @param {number} [options.timeoutMs=50000] \u4F20 0 \u8868\u793A\u5173\u95ED\u8D85\u65F6\uFF0C\u76F4\u5230\u6355\u83B7\u6210\u529F\u6216 signal.abort()\n * @param {number} [options.payloadSnapshotMaxLen=500]\n * @param {string | string[]} [options.domSelectors='html']\n * @param {'added' | 'changed' | 'all'} [options.domMode='all']\n * @param {() => void | string | { link?: string | null; payloadText?: string } | Promise<void | string | { link?: string | null; payloadText?: string }>} [options.performActions]\n * @returns {Promise<{ link: string | null; payloadText: string; payloadSnapshot: string; source: 'dom' | 'response' | 'custom' | 'none' }>}\n */\n async captureLink(page, options = {}) {\n const share = normalizeShare(options.share);\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const timeoutDisabled = timeoutMs === 0;\n const payloadSnapshotMaxLen = options.payloadSnapshotMaxLen ?? DEFAULT_PAYLOAD_SNAPSHOT_MAX_LEN;\n const domSelectors = options.domSelectors ?? 'html';\n const domMode = options.domMode ?? Mutation.Mode.All;\n const performActions = typeof options.performActions === 'function' ? options.performActions : async () => { };\n const signal = options.signal;\n const isAborted = () => Boolean(signal?.aborted);\n const abortReason = () => {\n const reason = signal?.reason;\n if (reason instanceof Error) return reason.message;\n return reason ? String(reason) : 'aborted';\n };\n\n if (share.prefix === undefined) {\n throw new Error('Share.captureLink requires options.share.prefix');\n }\n\n if (share.mode !== 'dom' && share.mode !== 'response' && share.mode !== 'custom') {\n throw new Error(`Share.captureLink unsupported share.mode: ${share.mode}`);\n }\n\n const apiMatchers = share.mode === 'response' ? (share.xurl[0] || []) : [];\n const fieldPaths = share.mode === 'response' ? share.xurl.slice(1) : [];\n\n if (share.mode === 'response' && apiMatchers.length === 0) {\n throw new Error('Share.captureLink requires share.xurl[0] api matcher when mode=response');\n }\n\n logger.start('captureLink', `mode=${share.mode}, timeoutMs=${timeoutDisabled ? 'disabled' : timeoutMs}, prefix=${share.prefix}`);\n logger.info(`captureLink \u914D\u7F6E: xurl=${toJsonInline(share.xurl)}, domMode=${domMode}, domSelectors=${toJsonInline(domSelectors, 120)}`);\n\n const stats = {\n actionTimedOut: false,\n domMutationCount: 0,\n domMutationNodes: 0,\n responseObserved: 0,\n responseMatched: 0,\n responseResolved: 0,\n lastMatchedUrl: '',\n responseSampleUrls: [],\n };\n\n if (isAborted()) {\n logger.warning(`captureLink \u5DF2\u53D6\u6D88: ${abortReason()}`);\n return {\n link: null,\n payloadText: '',\n payloadSnapshot: abortReason(),\n source: 'none',\n };\n }\n\n const candidates = {\n dom: null,\n response: null,\n custom: null,\n };\n\n const setCandidate = (source, link, payloadText = '') => {\n const safe = String(link || '').trim();\n if (!safe) return false;\n\n const [validated] = Utils.parseLinks(safe, { prefix: share.prefix }) || [];\n if (!validated) return false;\n\n if (candidates[source]?.link) return false;\n\n candidates[source] = {\n link: validated,\n payloadText: String(payloadText || ''),\n };\n\n logger.info(`\u5019\u9009\u94FE\u63A5\u5DF2\u786E\u8BA4: source=${source}, link=${validated}`);\n return true;\n };\n\n const resolveResponseCandidate = (responseText) => {\n const rawText = String(responseText || '');\n if (!rawText) return null;\n\n const [direct] = Utils.parseLinks(rawText, { prefix: share.prefix }) || [];\n if (direct) {\n return { link: direct, payloadText: rawText };\n }\n\n if (fieldPaths.length === 0) return null;\n\n const payload = parseJsonSafely(rawText);\n if (!payload || typeof payload !== 'object') return null;\n\n for (const pathSegments of fieldPaths) {\n const value = getByPathSegments(payload, pathSegments);\n if (value == null || value === '') continue;\n\n const composed = buildShareLink(share.prefix, value);\n if (!composed) continue;\n\n const [validated] = Utils.parseLinks(composed, { prefix: share.prefix }) || [];\n if (!validated) continue;\n\n return {\n link: validated,\n payloadText: rawText,\n };\n }\n\n return null;\n };\n\n let domMonitor = null;\n\n const stopDomMonitor = async () => {\n if (!domMonitor) return;\n const monitor = domMonitor;\n domMonitor = null;\n try {\n await monitor.stop();\n } catch (error) {\n logger.warning(`\u505C\u6B62 DOM \u76D1\u542C\u5931\u8D25: ${error instanceof Error ? error.message : String(error)}`);\n }\n };\n\n const onResponse = async (response) => {\n if (share.mode !== 'response') return;\n if (candidates.response?.link) return;\n\n stats.responseObserved += 1;\n\n try {\n if (isAborted()) return;\n\n const url = String(response.url() || '');\n\n if (url && stats.responseSampleUrls.length < 8 && !stats.responseSampleUrls.includes(url)) {\n stats.responseSampleUrls.push(url);\n }\n\n if (stats.responseObserved <= 5) {\n logger.info(`\u63A5\u53E3\u54CD\u5E94\u91C7\u6837(${stats.responseObserved}): ${url}`);\n }\n\n if (!apiMatchers.some((matcher) => url.includes(matcher))) return;\n\n stats.responseMatched += 1;\n stats.lastMatchedUrl = url;\n logger.info(`\u63A5\u53E3\u547D\u4E2D\u5339\u914D(${stats.responseMatched}): ${url}`);\n\n const text = await response.text();\n const hit = resolveResponseCandidate(text);\n if (!hit?.link) {\n if (stats.responseMatched <= 3) {\n logger.info(`\u63A5\u53E3\u89E3\u6790\u5B8C\u6210\u4F46\u672A\u63D0\u53D6\u5230\u5206\u4EAB\u94FE\u63A5: payloadSize=${text.length}`);\n }\n return;\n }\n\n stats.responseResolved += 1;\n logger.success('captureLink.responseHit', `\u63A5\u53E3\u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: url=${url}, link=${hit.link}`);\n setCandidate('response', hit.link, hit.payloadText);\n } catch (error) {\n logger.warning(`\u63A5\u53E3\u54CD\u5E94\u5904\u7406\u5F02\u5E38: ${error instanceof Error ? error.message : String(error)}`);\n }\n };\n\n if (share.mode === 'dom') {\n logger.info('\u5F53\u524D\u4E3A DOM \u6A21\u5F0F\uFF0C\u4EC5\u542F\u7528 DOM \u76D1\u542C');\n domMonitor = await createDomShareMonitor(page, {\n prefix: share.prefix,\n selectors: domSelectors,\n mode: domMode,\n onTelemetry: ({ mutationCount, mutationNodesCount }) => {\n stats.domMutationCount = mutationCount;\n stats.domMutationNodes = mutationNodesCount;\n },\n onMatch: ({ link, rawDom }) => {\n setCandidate('dom', link, rawDom);\n },\n });\n }\n\n if (share.mode === 'response') {\n logger.info(`\u5F53\u524D\u4E3A\u63A5\u53E3\u6A21\u5F0F\uFF0C\u6302\u8F7D response \u76D1\u542C: apiMatchers=${toJsonInline(apiMatchers, 160)}`);\n page.on('response', onResponse);\n }\n\n if (share.mode === 'custom') {\n logger.info('\u5F53\u524D\u4E3A custom \u6A21\u5F0F\uFF0C\u5C06\u4F7F\u7528 performActions \u8FD4\u56DE\u503C');\n }\n\n const deadline = timeoutDisabled ? Infinity : Date.now() + timeoutMs;\n const getRemainingMs = () => timeoutDisabled ? Infinity : Math.max(0, deadline - Date.now());\n\n try {\n const actionTimeout = getRemainingMs();\n logger.start('captureLink.performActions', `\u6267\u884C\u52A8\u4F5C\u9884\u7B97=${timeoutDisabled ? 'disabled' : `${actionTimeout}ms`}`);\n let actionValue;\n\n if (!isAborted() && actionTimeout > 0) {\n let timer = null;\n\n const actionPromise = Promise.resolve()\n .then(() => performActions())\n .then((result) => ({ type: 'done', result }))\n .catch((error) => ({ type: 'error', error }));\n\n const actionResult = timeoutDisabled\n ? await actionPromise\n : await Promise.race([\n actionPromise,\n new Promise((resolve) => {\n timer = setTimeout(() => resolve({ type: 'timeout' }), actionTimeout);\n }),\n ]);\n if (timer) clearTimeout(timer);\n\n if (actionResult.type === 'error') {\n logger.fail('captureLink.performActions', actionResult.error);\n throw actionResult.error;\n }\n\n if (actionResult.type === 'timeout') {\n stats.actionTimedOut = true;\n logger.warning(`performActions \u5DF2\u8D85\u65F6 (${actionTimeout}ms)\uFF0C\u52A8\u4F5C\u53EF\u80FD\u4ECD\u5728\u5F02\u6B65\u6267\u884C`);\n } else {\n actionValue = actionResult.result;\n logger.success('captureLink.performActions', '\u6267\u884C\u52A8\u4F5C\u5B8C\u6210');\n }\n }\n\n if (share.mode === 'custom') {\n const customLink = typeof actionValue === 'string'\n ? actionValue\n : actionValue?.link || actionValue?.payloadText;\n const customPayloadText = typeof actionValue === 'string'\n ? actionValue\n : actionValue?.payloadText;\n\n if (setCandidate('custom', customLink, customPayloadText)) {\n logger.success('captureLink.customResult', `custom \u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: link=${candidates.custom.link}`);\n } else {\n logger.warning('performActions \u6267\u884C\u5B8C\u6210\u4F46\u672A\u8FD4\u56DE\u6709\u6548\u5206\u4EAB\u94FE\u63A5');\n }\n }\n\n let nextProgressLogTs = Date.now() + 3000;\n\n while (true) {\n if (isAborted()) {\n logger.warning(`captureLink \u5DF2\u53D6\u6D88: ${abortReason()}`);\n return {\n link: null,\n payloadText: '',\n payloadSnapshot: abortReason(),\n source: 'none',\n };\n }\n\n const selected = candidates[share.mode];\n if (selected?.link) {\n logger.success('captureLink', `\u6355\u83B7\u6210\u529F: source=${share.mode}, link=${selected.link}`);\n return {\n link: selected.link,\n payloadText: selected.payloadText,\n payloadSnapshot: toSnapshot(selected.payloadText, payloadSnapshotMaxLen),\n source: share.mode,\n };\n }\n\n if (share.mode === 'custom') break;\n\n const remaining = getRemainingMs();\n if (remaining <= 0) break;\n\n const now = Date.now();\n if (now >= nextProgressLogTs) {\n logger.info(\n `captureLink \u7B49\u5F85\u4E2D: remaining=${timeoutDisabled ? 'disabled' : `${remaining}ms`}, domMutationCount=${stats.domMutationCount}, responseMatched=${stats.responseMatched}`\n );\n nextProgressLogTs = now + 5000;\n }\n\n await delay(Math.max(0, Math.min(DEFAULT_POLL_INTERVAL_MS, remaining)));\n }\n\n if (!timeoutDisabled && share.mode === 'response' && stats.responseMatched === 0) {\n logger.warning(\n `\u63A5\u53E3\u76D1\u542C\u672A\u547D\u4E2D: apiMatchers=${toJsonInline(apiMatchers, 220)}, \u54CD\u5E94\u6837\u672CURLs=${toJsonInline(stats.responseSampleUrls, 420)}`\n );\n }\n\n logger.warning(\n `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'}`\n );\n\n return {\n link: null,\n payloadText: '',\n payloadSnapshot: '',\n source: 'none',\n };\n } finally {\n if (share.mode === 'response') {\n page.off('response', onResponse);\n logger.info('response \u76D1\u542C\u5DF2\u5378\u8F7D');\n }\n await stopDomMonitor();\n }\n },\n\n\n /**\n * \u5168\u9875\u9762\u6EDA\u52A8\u622A\u56FE\uFF08\u57FA\u7840\u80FD\u529B\uFF09\n *\n * @param {import('playwright').Page} page\n * @param {Object} [options]\n * @param {boolean} [options.restore]\n * @param {number} [options.maxHeight]\n * @param {number} [options.maxBytes] \u9ED8\u8BA4 5MiB\uFF0C\u8FD4\u56DE base64 \u8D85\u8FC7\u540E\u4F1A\u538B\u7F29\n * @param {'jpeg'|'jpg'} [options.type] \u538B\u7F29\u8F93\u51FA\u683C\u5F0F\uFF0C\u9ED8\u8BA4 jpeg\n * @param {boolean|Object} [options.compression] \u4F20 false \u53EF\u5173\u95ED\u538B\u7F29\n * @param {'default'|'cloak'} [options.mode] \u622A\u56FE\u6C34\u5370\u5408\u6210\u6A21\u5F0F\uFF0C\u9ED8\u8BA4 default\n * @returns {Promise<string>} base64 image\n */\n async captureScreen(page, options = {}) {\n const restore = options.restore ?? false;\n const screenshotWatermarkify = resolveCaptureScreenWatermarkify(page, options.watermarkify);\n const compression = resolveImageCompression(options);\n const captureOptions = {\n restore,\n maxHeight: options.maxHeight,\n type: 'png',\n visibleOnly: true,\n };\n\n const capturedAt = new Date();\n const rawBuffer = await captureExpandedFullPageScreenshot(page, captureOptions);\n\n let outputBuffer = rawBuffer;\n\n if (screenshotWatermarkify.enabled) {\n const watermarkifyMeta = await resolveScreenshotWatermarkifyMeta(page, {\n ...screenshotWatermarkify,\n capturedAt,\n });\n outputBuffer = await watermarkifyScreenshotBuffer(rawBuffer, watermarkifyMeta, page, {\n mode: options.mode\n });\n }\n\n return await compressImageBufferToBase64(outputBuffer, compression);\n },\n};\n", "import { Device, normalizeDevice } from '../constants.js';\nimport { PageRuntimeStateKey } from './constants.js';\nimport { createInternalLogger } from './logger.js';\n\nconst DEFAULT_TIMEZONE_OFFSET = 8;\nconst DEFAULT_RESOLVER_TIMEOUT_MS = 180;\nconst DEFAULT_IP_LOOKUP_TIMEOUT_MS = 10000;\nconst DEFAULT_WATERMARK_OPACITY = 0.156;\nconst DEFAULT_WATERMARK_ROTATE_DEG = -16;\nconst DEFAULT_WATERMARK_CELL_WIDTH = 860;\nconst DEFAULT_WATERMARK_CELL_HEIGHT = 330;\nconst DEFAULT_STRIP_LOGO_URL = 'https://static.heartbitai.com/geo/icon/favicon.png';\nconst DEFAULT_IP_LOOKUP_URL = 'https://myip.ipip.net/json';\nconst DEFAULT_LOGO_FETCH_TIMEOUT_MS = 2500;\nconst DEFAULT_STRIP_ONE_LINE_HEIGHT = 78;\nconst DEFAULT_STRIP_WRAPPED_MIN_HEIGHT = 108;\nconst DEFAULT_STRIP_PADDING_LEFT = 22;\nconst DEFAULT_STRIP_PADDING_RIGHT = 28;\nconst DEFAULT_STRIP_GAP = 18;\nconst DEFAULT_STRIP_LABEL_WIDTH = 56;\nconst DEFAULT_STRIP_PROMPT_MAX_SAFE_CHARS = 180;\nconst DEFAULT_STRIP_PROMPT_MIN_TOTAL_WIDTH = 320;\nconst DEFAULT_STRIP_PROMPT_PREFERRED_WIDTH_RATIO = 0.58;\nconst DEFAULT_STRIP_ZONE_GAP = 18;\nconst DEFAULT_STRIP_PROMPT_TRAILING_PADDING = 16;\nconst DEFAULT_STRIP_LABEL_FONT_SIZE = 14.5;\nconst DEFAULT_STRIP_VALUE_FONT_SIZE = 15.5;\nconst DEFAULT_STRIP_VALUE_PADDING = 10;\nconst DEFAULT_STRIP_LABEL_PADDING = 14;\nconst DEFAULT_STRIP_SECTION_GAP = DEFAULT_STRIP_GAP + 16;\nconst DEFAULT_STRIP_LINE_HEIGHT_RATIO = 1.28;\nconst DEFAULT_STRIP_PROMPT_MAX_LINES = 3;\nconst DEFAULT_STRIP_CONTENT_SAFE_PADDING_X = 12;\nconst DEFAULT_STRIP_TEXT_WIDTH_SAFETY = 10;\nconst DEFAULT_BROWSER_COMPOSITOR_VIEWPORT_HEIGHT = 1200;\nconst MOBILE_STRIP_HEIGHT = 78;\nconst MOBILE_STRIP_PADDING_X = 14;\nconst MOBILE_STRIP_PADDING_Y = 13;\nconst MOBILE_STRIP_ROW_HEIGHT = 22;\nconst MOBILE_STRIP_ROW_GAP = 8;\nconst MOBILE_STRIP_LABEL_FONT_SIZE = 12.5;\nconst MOBILE_STRIP_VALUE_FONT_SIZE = 13.5;\nconst MOBILE_STRIP_META_GAP = 16;\nconst MOBILE_STRIP_VALUE_WIDTH_SAFETY = 10;\n\nconst WEAK_LOCATION_VALUES = new Set(['cn', '\u4E2D\u56FD']);\nconst LOCATION_NETWORK_SUFFIX_PATTERNS = [\n /(?:\u4E2D\u56FD)?\u79FB\u52A8$/i,\n /(?:\u4E2D\u56FD)?\u8054\u901A$/i,\n /(?:\u4E2D\u56FD)?\u7535\u4FE1$/i,\n /\u94C1\u901A$/i,\n /\u6559\u80B2\u7F51$/i,\n /\u5E7F\u7535$/i,\n /\u9E4F\u535A\u58EB$/i,\n /\u963F\u91CC\u4E91$/i,\n /\u817E\u8BAF\u4E91$/i,\n /\u767E\u5EA6\u4E91$/i,\n /\u534E\u4E3A\u4E91$/i,\n /cloudflare$/i,\n /amazon$/i,\n /aws$/i,\n /azure$/i,\n /google$/i,\n /oracle$/i,\n /linode$/i,\n /vultr$/i,\n /digitalocean$/i,\n];\n\nlet cachedStripLogoSrcPromise = null;\nconst cachedEnrichmentByContext = new WeakMap();\nconst logger = createInternalLogger('Watermarkify');\n\nconst normalizeText = (value) => String(value || '').trim();\n\nconst toInline = (value, maxLen = 200) => {\n const text = normalizeText(value);\n if (!text) return '';\n return text.replace(/\\s+/g, ' ').trim().slice(0, maxLen);\n};\n\nconst shortenTail = (value, maxLen = 80) => {\n const text = toInline(value, Math.max(maxLen * 2, maxLen + 8));\n if (!text || text.length <= maxLen) return text;\n return `${text.slice(0, Math.max(0, maxLen - 1)).trimEnd()}\u2026`;\n};\n\nconst shortenByCharacters = (value, maxChars = 80) => {\n const text = normalizeWhitespace(value);\n if (!text) return '';\n\n const chars = Array.from(text);\n if (chars.length <= maxChars) {\n return text;\n }\n\n return `${chars.slice(0, Math.max(0, maxChars - 1)).join('').trimEnd()}\u2026`;\n};\n\nconst padDatePart = (value) => String(value).padStart(2, '0');\n\nconst formatUtcOffsetLabel = (offsetHours = DEFAULT_TIMEZONE_OFFSET) => {\n const sign = offsetHours >= 0 ? '+' : '-';\n const absolute = Math.abs(offsetHours);\n const hours = Math.trunc(absolute);\n const minutes = Math.round((absolute - hours) * 60);\n\n if (!minutes) {\n return `UTC${sign}${hours}`;\n }\n\n return `UTC${sign}${hours}:${padDatePart(minutes)}`;\n};\n\nconst formatTimestampForUtcOffset = (date, offsetHours = DEFAULT_TIMEZONE_OFFSET) => {\n const source = date instanceof Date ? date : new Date(date || Date.now());\n const shifted = new Date(source.getTime() + offsetHours * 60 * 60 * 1000);\n\n return [\n `${shifted.getUTCFullYear()}-${padDatePart(shifted.getUTCMonth() + 1)}-${padDatePart(shifted.getUTCDate())}`,\n `${padDatePart(shifted.getUTCHours())}:${padDatePart(shifted.getUTCMinutes())}:${padDatePart(shifted.getUTCSeconds())}`,\n formatUtcOffsetLabel(offsetHours),\n ].join(' ');\n};\n\nconst normalizeWhitespace = (value) => String(value || '')\n .replace(/\\u00a0/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim();\n\nconst stripLocationNetworkSuffix = (value) => {\n const parts = normalizeWhitespace(value).split(' ').filter(Boolean);\n if (parts.length <= 1) {\n return normalizeWhitespace(value);\n }\n\n const last = parts[parts.length - 1];\n if (!LOCATION_NETWORK_SUFFIX_PATTERNS.some((pattern) => pattern.test(last))) {\n return parts.join(' ');\n }\n\n return parts.slice(0, -1).join(' ').trim();\n};\n\nconst isWeakLocationValue = (value) => {\n const text = normalizeWhitespace(value).toLowerCase();\n if (!text) return true;\n if (WEAK_LOCATION_VALUES.has(text)) return true;\n return /^[a-z]{2,3}$/i.test(text);\n};\n\nconst pickHeaderValue = async (response, names = []) => {\n if (!response || typeof response.headerValue !== 'function') return '';\n\n for (const name of names) {\n const value = await response.headerValue(name).catch(() => null);\n const text = normalizeText(value);\n if (text) return text;\n }\n\n return '';\n};\n\nconst parseIpIpJsonResponse = (rawText) => {\n const text = normalizeWhitespace(rawText);\n if (!text || (!text.startsWith('{') && !text.startsWith('['))) {\n return null;\n }\n\n try {\n const payload = JSON.parse(text);\n const ip = toInline(payload?.data?.ip || payload?.ip, 80);\n const locationParts = Array.isArray(payload?.data?.location)\n ? payload.data.location.map((item) => normalizeWhitespace(item)).filter(Boolean)\n : [];\n const location = toInline(\n stripLocationNetworkSuffix(locationParts.join(' ')),\n 80,\n );\n\n if (!ip && !location) {\n return null;\n }\n\n return { ip, location };\n } catch {\n return null;\n }\n};\n\nconst fillEnrichment = (target, source) => {\n if (!target || !source || typeof source !== 'object') {\n return target;\n }\n\n if (!target.ip && source.ip) {\n target.ip = toInline(source.ip, 80);\n }\n if (!target.location && source.location) {\n target.location = toInline(source.location, 80);\n }\n\n return target;\n};\n\nconst readCachedEnrichment = (page) => {\n const context = page && typeof page.context === 'function'\n ? page.context()\n : null;\n if (!context) {\n return null;\n }\n\n const cached = cachedEnrichmentByContext.get(context);\n return cached && typeof cached === 'object' ? cached : null;\n};\n\nconst writeCachedEnrichment = (page, source) => {\n const context = page && typeof page.context === 'function'\n ? page.context()\n : null;\n if (!context || !source || typeof source !== 'object') {\n return;\n }\n\n const current = cachedEnrichmentByContext.get(context) || {};\n const next = {\n ip: toInline(source.ip || current.ip, 80),\n location: toInline(source.location || current.location, 80),\n };\n\n if (!next.ip && !next.location) {\n return;\n }\n\n cachedEnrichmentByContext.set(context, next);\n};\n\nconst getHostname = (url) => {\n try {\n const parsed = new URL(url);\n return parsed.hostname || parsed.host || '\u672C\u5730\u9875\u9762';\n } catch {\n if (/^https?:\\/\\//i.test(url)) {\n return url;\n }\n\n return '\u672C\u5730\u9875\u9762';\n }\n};\n\nconst withTimeout = async (promise, timeoutMs) => {\n const safeTimeoutMs = Math.max(0, Number(timeoutMs) || 0);\n if (!safeTimeoutMs) {\n return promise;\n }\n\n let timer = null;\n try {\n return await Promise.race([\n promise,\n new Promise((resolve) => {\n timer = setTimeout(() => resolve(null), safeTimeoutMs);\n }),\n ]);\n } finally {\n if (timer) clearTimeout(timer);\n }\n};\n\nconst fetchAsDataUrl = async (url, timeoutMs = DEFAULT_LOGO_FETCH_TIMEOUT_MS) => {\n if (typeof fetch !== 'function') {\n return '';\n }\n\n const controller = typeof AbortController === 'function'\n ? new AbortController()\n : null;\n const safeTimeoutMs = Math.max(300, Number(timeoutMs) || DEFAULT_LOGO_FETCH_TIMEOUT_MS);\n const timer = controller\n ? setTimeout(() => controller.abort(), safeTimeoutMs)\n : null;\n\n try {\n const response = await fetch(url, {\n redirect: 'follow',\n signal: controller?.signal,\n });\n\n if (!response?.ok) {\n return '';\n }\n\n const contentType = normalizeText(response.headers?.get?.('content-type')) || 'image/png';\n if (!/^image\\//i.test(contentType)) {\n return '';\n }\n\n const buffer = Buffer.from(await response.arrayBuffer());\n if (!buffer.length) {\n return '';\n }\n\n return `data:${contentType};base64,${buffer.toString('base64')}`;\n } catch {\n return '';\n } finally {\n if (timer) clearTimeout(timer);\n }\n};\n\nconst resolveStripLogoSrc = async () => {\n if (!cachedStripLogoSrcPromise) {\n cachedStripLogoSrcPromise = (async () => {\n const dataUrl = await fetchAsDataUrl(DEFAULT_STRIP_LOGO_URL);\n return dataUrl || DEFAULT_STRIP_LOGO_URL;\n })();\n }\n\n const resolved = await cachedStripLogoSrcPromise.catch(() => DEFAULT_STRIP_LOGO_URL);\n return normalizeText(resolved) || DEFAULT_STRIP_LOGO_URL;\n};\n\nconst normalizeLayer = (value, defaults) => {\n if (value === false) {\n return {\n ...defaults,\n enabled: false,\n };\n }\n\n if (value && typeof value === 'object') {\n return {\n ...defaults,\n ...value,\n enabled: value.enabled !== false,\n };\n }\n\n return {\n ...defaults,\n enabled: true,\n };\n};\n\nconst resolveWithCustomResolver = async (page, baseMeta, options = {}) => {\n const resolver = typeof options.resolver === 'function'\n ? options.resolver\n : null;\n if (!resolver) {\n return null;\n }\n\n const response = options.response && typeof options.response === 'object'\n ? options.response\n : null;\n const serverAddr = response && typeof response.serverAddr === 'function'\n ? await response.serverAddr().catch(() => null)\n : null;\n const controller = typeof AbortController === 'function'\n ? new AbortController()\n : null;\n\n try {\n const resolved = await withTimeout(\n Promise.resolve(resolver({\n page,\n response,\n url: baseMeta.url,\n hostname: baseMeta.hostname,\n title: baseMeta.title,\n prompt: baseMeta.prompt,\n query: baseMeta.query,\n serverAddr,\n signal: controller?.signal,\n })).catch(() => null),\n options.resolverTimeoutMs ?? DEFAULT_RESOLVER_TIMEOUT_MS,\n );\n\n if (!resolved || typeof resolved !== 'object') {\n return null;\n }\n\n const enrichment = {\n ip: toInline(resolved.ip, 80),\n location: toInline(resolved.location, 80),\n };\n if (enrichment.ip || enrichment.location) {\n logger.info(`\u81EA\u5B9A\u4E49 resolver \u547D\u4E2D: ip=${enrichment.ip || '-'}, loc=${enrichment.location || '-'}`);\n } else {\n logger.warning('\u81EA\u5B9A\u4E49 resolver \u5DF2\u6267\u884C\uFF0C\u4F46\u672A\u8FD4\u56DE IP/Loc');\n }\n\n return enrichment;\n } finally {\n controller?.abort();\n }\n};\n\nconst openProbePage = async (page) => {\n if (!page || typeof page.context !== 'function') {\n return null;\n }\n\n const context = page.context();\n if (!context) {\n return null;\n }\n\n const browser = typeof context.browser === 'function'\n ? context.browser()\n : null;\n\n if (browser && typeof browser.newContext === 'function') {\n const probeContext = await browser.newContext().catch(() => null);\n if (probeContext && typeof probeContext.newPage === 'function') {\n const probePage = await probeContext.newPage().catch(async () => {\n await probeContext.close().catch(() => { });\n return null;\n });\n if (probePage) {\n return {\n page: probePage,\n close: async () => {\n await probeContext.close().catch(() => { });\n },\n };\n }\n } else {\n await probeContext?.close?.().catch(() => { });\n }\n }\n\n if (typeof context.newPage === 'function') {\n try {\n const probePage = await context.newPage();\n return {\n page: probePage,\n close: async () => {\n await probePage.close().catch(() => { });\n },\n };\n } catch {\n // \u67D0\u4E9B\u6258\u7BA1\u4E0A\u4E0B\u6587\u4E0D\u5141\u8BB8\u76F4\u63A5 newPage\uFF0C\u8FD9\u91CC\u8FD4\u56DE null \u8BA9\u4E0A\u5C42\u9000\u5316\u3002\n }\n }\n\n return null;\n};\n\nconst readPngDimensions = (buffer) => {\n if (!Buffer.isBuffer(buffer) || buffer.length < 24) {\n return { width: 0, height: 0 };\n }\n\n const pngSignature = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];\n for (let index = 0; index < pngSignature.length; index += 1) {\n if (buffer[index] !== pngSignature[index]) {\n return { width: 0, height: 0 };\n }\n }\n\n return {\n width: buffer.readUInt32BE(16),\n height: buffer.readUInt32BE(20),\n };\n};\n\nconst readJpegDimensions = (buffer) => {\n if (!Buffer.isBuffer(buffer) || buffer.length < 4 || buffer[0] !== 0xff || buffer[1] !== 0xd8) {\n return { width: 0, height: 0 };\n }\n\n let offset = 2;\n while (offset + 9 <= buffer.length) {\n if (buffer[offset] !== 0xff) {\n offset += 1;\n continue;\n }\n\n const marker = buffer[offset + 1];\n offset += 2;\n\n if (marker === 0xd8 || marker === 0xd9) {\n continue;\n }\n\n if (marker === 0xda) {\n break;\n }\n\n if (offset + 2 > buffer.length) {\n break;\n }\n\n const segmentLength = buffer.readUInt16BE(offset);\n if (segmentLength < 2 || offset + segmentLength > buffer.length) {\n break;\n }\n\n const isStartOfFrame = (\n marker >= 0xc0\n && marker <= 0xcf\n && marker !== 0xc4\n && marker !== 0xc8\n && marker !== 0xcc\n );\n\n if (isStartOfFrame && offset + 7 <= buffer.length) {\n return {\n height: buffer.readUInt16BE(offset + 3),\n width: buffer.readUInt16BE(offset + 5),\n };\n }\n\n offset += segmentLength;\n }\n\n return { width: 0, height: 0 };\n};\n\nconst readImageInfo = (buffer) => {\n const png = readPngDimensions(buffer);\n if (png.width && png.height) {\n return {\n mimeType: 'image/png',\n width: png.width,\n height: png.height,\n };\n }\n\n const jpeg = readJpegDimensions(buffer);\n if (jpeg.width && jpeg.height) {\n return {\n mimeType: 'image/jpeg',\n width: jpeg.width,\n height: jpeg.height,\n };\n }\n\n return {\n mimeType: '',\n width: 0,\n height: 0,\n };\n};\n\nconst buildWatermarkifyRenderHtml = ({ imageSrc, overlaySvg, width, height, imageHeight }) => {\n const safeWidth = Math.max(1, Number(width) || 1);\n const safeHeight = Math.max(1, Number(height) || 1);\n const safeImageHeight = Math.max(1, Number(imageHeight || height) || 1);\n\n return `\n <!doctype html>\n <html lang=\"zh-CN\">\n <head>\n <meta charset=\"utf-8\" />\n <style>\n html, body {\n margin: 0;\n padding: 0;\n width: ${safeWidth}px;\n height: ${safeHeight}px;\n overflow: hidden;\n background: #ffffff;\n }\n\n body {\n position: relative;\n }\n\n #pk-stage {\n position: relative;\n width: ${safeWidth}px;\n height: ${safeHeight}px;\n overflow: hidden;\n }\n\n #pk-base-image {\n position: absolute;\n top: 0;\n left: 0;\n display: block;\n width: ${safeWidth}px;\n height: ${safeImageHeight}px;\n }\n\n #pk-overlay {\n position: absolute;\n inset: 0;\n width: ${safeWidth}px;\n height: ${safeHeight}px;\n pointer-events: none;\n }\n </style>\n </head>\n <body>\n <div id=\"pk-stage\">\n <img id=\"pk-base-image\" src=\"${escapeHtmlAttribute(imageSrc)}\" alt=\"\" />\n <div id=\"pk-overlay\">${overlaySvg}</div>\n </div>\n </body>\n </html>\n `;\n};\n\nconst normalizeWatermarkifyRenderMode = (value) => {\n return String(value || 'default').trim().toLowerCase() === 'cloak'\n ? 'cloak'\n : 'default';\n};\n\nconst composeScreenshotBufferWithBrowser = async (page, buffer, overlaySvg, imageInfo = {}, options = {}) => {\n if (!page || typeof page.context !== 'function') {\n logger.warning('watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u8DF3\u8FC7: \u7F3A\u5C11\u53EF\u7528 page');\n return buffer;\n }\n\n const renderScope = await openProbePage(page);\n if (!renderScope?.page) {\n logger.warning('watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u8DF3\u8FC7: \u65E0\u6CD5\u521B\u5EFA render page');\n return buffer;\n }\n\n try {\n const renderPage = renderScope.page;\n const safeWidth = Math.max(1, Number(imageInfo.width) || 1);\n const safeImageHeight = Math.max(1, Number(imageInfo.imageHeight || imageInfo.height) || 1);\n const safeHeight = Math.max(safeImageHeight, Number(imageInfo.height) || safeImageHeight);\n const viewportHeight = Math.max(\n 1,\n Math.min(safeHeight, DEFAULT_BROWSER_COMPOSITOR_VIEWPORT_HEIGHT),\n );\n\n await renderPage.setViewportSize({\n width: safeWidth,\n height: viewportHeight,\n }).catch(() => { });\n\n const renderMode = normalizeWatermarkifyRenderMode(options.mode);\n\n if (renderMode === 'cloak') {\n const renderHtml = buildWatermarkifyRenderHtml({\n imageSrc: `data:${imageInfo.mimeType || 'image/png'};base64,${buffer.toString('base64')}`,\n overlaySvg,\n width: safeWidth,\n height: safeHeight,\n imageHeight: safeImageHeight,\n });\n\n await renderPage.goto('about:blank', {\n waitUntil: 'commit',\n }).catch(() => { });\n\n await renderPage.evaluate((html) => {\n document.open();\n document.write(html);\n document.close();\n }, renderHtml);\n } else {\n await renderPage.setContent(buildWatermarkifyRenderHtml({\n imageSrc: `data:${imageInfo.mimeType || 'image/png'};base64,${buffer.toString('base64')}`,\n overlaySvg,\n width: safeWidth,\n height: safeHeight,\n imageHeight: safeImageHeight,\n }), {\n waitUntil: 'load',\n });\n }\n\n await renderPage.waitForFunction(() => {\n const image = document.getElementById('pk-base-image');\n return image instanceof HTMLImageElement\n && image.complete\n && image.naturalWidth > 0\n && image.naturalHeight > 0;\n }, {\n timeout: 5000,\n }).catch(() => { });\n\n await renderPage.evaluate(async () => {\n if (document.fonts?.ready) {\n await document.fonts.ready.catch(() => { });\n }\n }).catch(() => { });\n\n const composed = await renderPage.screenshot({\n type: 'png',\n fullPage: true,\n animations: 'disabled',\n }).catch((error) => {\n logger.warning(`watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u5931\u8D25: ${error instanceof Error ? error.message : String(error)}`);\n return null;\n });\n\n if (Buffer.isBuffer(composed) && composed.length > 0) {\n return composed;\n }\n\n logger.warning('watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u5931\u8D25: \u672A\u5F97\u5230\u6709\u6548\u622A\u56FE\u7ED3\u679C');\n return buffer;\n } finally {\n await renderScope.close().catch(() => { });\n }\n};\n\nconst resolveWithIpLookup = async (page, options = {}) => {\n if (!page || typeof page.context !== 'function' || options.ipLookup === false) {\n return null;\n }\n\n const probeScope = await openProbePage(page);\n if (!probeScope?.page) {\n logger.warning('ipLookup \u8DF3\u8FC7: \u65E0\u6CD5\u521B\u5EFA probe page');\n return null;\n }\n\n const timeoutMs = Math.max(\n 300,\n Number(options.ipLookupTimeoutMs) || DEFAULT_IP_LOOKUP_TIMEOUT_MS,\n );\n try {\n const probePage = probeScope.page;\n logger.info(`ipLookup \u5C1D\u8BD5: url=${DEFAULT_IP_LOOKUP_URL}, timeoutMs=${timeoutMs}`);\n\n const response = await probePage.goto(DEFAULT_IP_LOOKUP_URL, {\n waitUntil: 'commit',\n timeout: timeoutMs,\n }).catch((error) => {\n logger.warning(`ipLookup \u8BF7\u6C42\u5931\u8D25: url=${DEFAULT_IP_LOOKUP_URL}, error=${error instanceof Error ? error.message : String(error)}`);\n return null;\n });\n\n const status = response && typeof response.status === 'function'\n ? response.status()\n : 0;\n const contentType = normalizeText(await pickHeaderValue(response, ['content-type']));\n let rawText = '';\n\n if (response && typeof response.text === 'function') {\n rawText = String(await withTimeout(\n response.text().catch(() => ''),\n timeoutMs,\n ) || '');\n }\n\n if (!rawText) {\n rawText = String(await withTimeout(\n probePage.evaluate(() => {\n return document.body?.innerText\n || document.documentElement?.innerText\n || '';\n }).catch(() => ''),\n Math.min(timeoutMs, 500),\n ) || '');\n }\n\n const parsed = parseIpIpJsonResponse(rawText);\n if (parsed?.ip || parsed?.location) {\n logger.info(`ipLookup \u6210\u529F: url=${DEFAULT_IP_LOOKUP_URL}, status=${status || '-'}, contentType=${contentType || '-'}, ip=${parsed.ip || '-'}, loc=${parsed.location || '-'}`);\n return parsed;\n }\n\n logger.warning(`ipLookup \u672A\u89E3\u6790\u51FA IP/Loc: url=${DEFAULT_IP_LOOKUP_URL}, status=${status || '-'}, contentType=${contentType || '-'}, preview=${shortenTail(rawText, 120) || '[empty]'}`);\n return null;\n } catch (error) {\n logger.warning(`ipLookup \u6267\u884C\u5F02\u5E38\uFF0C\u672A\u83B7\u5F97 IP/Loc: ${error instanceof Error ? error.message : String(error)}`);\n return null;\n } finally {\n await probeScope.close().catch(() => { });\n }\n};\n\nconst resolveEnrichment = async (page, baseMeta, options) => {\n const response = options.response && typeof options.response === 'object'\n ? options.response\n : null;\n const cached = readCachedEnrichment(page);\n\n const merged = {\n ip: toInline(options.ip, 80),\n location: toInline(options.location, 80),\n };\n\n logger.info(`enrichment \u5F00\u59CB: host=${baseMeta.hostname || '-'}, hasPresetIp=${Boolean(merged.ip)}, hasPresetLoc=${Boolean(merged.location)}, ipLookup=${options.ipLookup !== false}`);\n\n if (!merged.ip || !merged.location) {\n if (cached?.ip || cached?.location) {\n logger.info(`enrichment \u547D\u4E2D\u4E0A\u4E0B\u6587\u7F13\u5B58: ip=${cached.ip || '-'}, loc=${cached.location || '-'}`);\n }\n fillEnrichment(merged, cached);\n }\n\n if (!merged.ip || !merged.location) {\n fillEnrichment(\n merged,\n await resolveWithCustomResolver(page, baseMeta, options),\n );\n }\n\n if ((!merged.ip || !merged.location) && options.ipLookup !== false) {\n fillEnrichment(\n merged,\n await resolveWithIpLookup(page, options),\n );\n }\n\n if (!merged.location || isWeakLocationValue(merged.location)) {\n const headerLocation = toInline(await pickHeaderValue(response, [\n 'cf-ipcountry',\n 'x-vercel-ip-country',\n 'x-country-code',\n 'x-geo-country',\n ]), 80);\n if (!merged.location || (isWeakLocationValue(merged.location) && headerLocation)) {\n logger.info(`enrichment \u4F7F\u7528\u54CD\u5E94\u5934\u8865\u5145 Loc: ${headerLocation || '-'}`);\n merged.location = headerLocation || merged.location;\n }\n }\n\n writeCachedEnrichment(page, merged);\n if (merged.ip || merged.location) {\n logger.info(`enrichment \u5B8C\u6210: ip=${merged.ip || '-'}, loc=${merged.location || '-'}`);\n } else {\n logger.warning('enrichment \u5B8C\u6210: \u672A\u83B7\u5F97 IP/Loc');\n }\n\n return merged;\n};\n\nconst buildWatermarkStamp = ({ prompt, captureTime, ip, location }) => {\n const parts = [\n `Prompt ${shortenTail(prompt, 40) || '-'}`,\n `Time ${captureTime}`,\n `Loc ${shortenTail(location, 20) || '-'}`,\n `IP ${toInline(ip, 24) || '-'}`,\n ];\n\n return parts.join(' | ');\n};\n\nconst buildStripSegments = ({ prompt, captureTime, ip, location }) => {\n const promptValue = shortenByCharacters(\n normalizeWhitespace(prompt) || '-',\n DEFAULT_STRIP_PROMPT_MAX_SAFE_CHARS,\n ) || '-';\n const ipValue = normalizeWhitespace(ip) || '-';\n const locationValue = normalizeWhitespace(location) || '-';\n\n return [\n {\n kind: 'prompt',\n label: 'Prompt',\n value: promptValue,\n rawValue: promptValue,\n },\n {\n kind: 'time',\n label: 'Time',\n value: captureTime,\n rawValue: captureTime,\n },\n {\n kind: 'location',\n label: 'Loc',\n value: locationValue,\n rawValue: locationValue,\n },\n {\n kind: 'ip',\n label: 'IP',\n value: ipValue,\n rawValue: ipValue,\n },\n ];\n};\n\nconst escapeXml = (value) => String(value || '')\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n\nconst escapeHtmlAttribute = (value) => String(value || '')\n .replace(/&/g, '&')\n .replace(/\"/g, '"')\n .replace(/</g, '<')\n .replace(/>/g, '>');\n\nconst estimateTextWidth = (value, fontSize = 16) => {\n const text = String(value || '');\n let width = 0;\n\n for (const char of text) {\n if (/\\s/.test(char)) {\n width += fontSize * 0.34;\n } else if (/[\\u4e00-\\u9fff\\u3400-\\u4dbf\\u3040-\\u30ff\\uac00-\\ud7af]/.test(char)) {\n width += fontSize * 0.92;\n } else if (/[A-Z0-9]/.test(char)) {\n width += fontSize * 0.62;\n } else {\n width += fontSize * 0.56;\n }\n }\n\n return Math.ceil(width);\n};\n\nconst resolvePromptFields = (options = {}, fallbackTitle = '') => {\n const query = normalizeText(options.query);\n const prompt = query\n || normalizeText(options.prompt)\n || normalizeText(fallbackTitle)\n || '\u672A\u63D0\u4F9B Prompt';\n\n return {\n prompt,\n query: query || prompt,\n };\n};\n\nconst createBaseWatermarkifyOptions = () => ({\n enabled: true,\n timezoneOffsetHours: DEFAULT_TIMEZONE_OFFSET,\n response: null,\n ip: '',\n location: '',\n prompt: '',\n query: '',\n ipLookup: true,\n ipLookupTimeoutMs: DEFAULT_IP_LOOKUP_TIMEOUT_MS,\n resolver: null,\n resolverTimeoutMs: DEFAULT_RESOLVER_TIMEOUT_MS,\n watermark: normalizeLayer(undefined, {\n opacity: DEFAULT_WATERMARK_OPACITY,\n rotateDeg: DEFAULT_WATERMARK_ROTATE_DEG,\n cellWidth: DEFAULT_WATERMARK_CELL_WIDTH,\n cellHeight: DEFAULT_WATERMARK_CELL_HEIGHT,\n }),\n strip: normalizeLayer(undefined, {}),\n});\n\nconst createDisabledWatermarkifyOptions = () => ({\n ...createBaseWatermarkifyOptions(),\n enabled: false,\n watermark: normalizeLayer(false, {\n opacity: DEFAULT_WATERMARK_OPACITY,\n rotateDeg: DEFAULT_WATERMARK_ROTATE_DEG,\n cellWidth: DEFAULT_WATERMARK_CELL_WIDTH,\n cellHeight: DEFAULT_WATERMARK_CELL_HEIGHT,\n }),\n strip: normalizeLayer(false, {}),\n});\n\nexport const normalizeScreenshotWatermarkify = (value) => {\n const base = createBaseWatermarkifyOptions();\n\n if (value === false) {\n return createDisabledWatermarkifyOptions();\n }\n\n if (value == null || value === true) {\n return base;\n }\n\n const source = value && typeof value === 'object' ? value : {};\n const timezoneOffsetHoursRaw = Number(source.timezoneOffsetHours);\n const ipLookupTimeoutMsRaw = Number(source.ipLookupTimeoutMs);\n const resolverTimeoutMsRaw = Number(source.resolverTimeoutMs);\n\n return {\n ...base,\n enabled: source.enabled !== false,\n timezoneOffsetHours: Number.isFinite(timezoneOffsetHoursRaw)\n ? timezoneOffsetHoursRaw\n : DEFAULT_TIMEZONE_OFFSET,\n response: source.response ?? null,\n ip: normalizeText(source.ip),\n location: normalizeText(source.location),\n prompt: normalizeWhitespace(source.prompt),\n query: normalizeWhitespace(source.query),\n ipLookup: source.ipLookup !== false,\n ipLookupTimeoutMs: Number.isFinite(ipLookupTimeoutMsRaw)\n ? ipLookupTimeoutMsRaw\n : DEFAULT_IP_LOOKUP_TIMEOUT_MS,\n resolver: typeof source.resolver === 'function' ? source.resolver : null,\n resolverTimeoutMs: Number.isFinite(resolverTimeoutMsRaw)\n ? resolverTimeoutMsRaw\n : DEFAULT_RESOLVER_TIMEOUT_MS,\n watermark: normalizeLayer(source.watermark, {\n opacity: DEFAULT_WATERMARK_OPACITY,\n rotateDeg: DEFAULT_WATERMARK_ROTATE_DEG,\n cellWidth: DEFAULT_WATERMARK_CELL_WIDTH,\n cellHeight: DEFAULT_WATERMARK_CELL_HEIGHT,\n }),\n strip: normalizeLayer(source.strip, {}),\n };\n};\n\nexport const resolveScreenshotWatermarkifyMeta = async (page, options = {}) => {\n const timezoneOffsetHours = options.timezoneOffsetHours ?? DEFAULT_TIMEZONE_OFFSET;\n const url = normalizeText(page?.url?.()) || 'about:blank';\n const title = normalizeText(await page.title().catch(() => '')) || '\u672A\u547D\u540D\u9875\u9762';\n const hostname = getHostname(url);\n const { prompt, query } = resolvePromptFields(options, title);\n const capturedAt = options.capturedAt instanceof Date\n ? options.capturedAt\n : new Date(options.capturedAt || Date.now());\n const captureTime = formatTimestampForUtcOffset(capturedAt, timezoneOffsetHours);\n\n const [enrichment, stripLogoSrc] = await Promise.all([\n resolveEnrichment(page, {\n url,\n hostname,\n title,\n prompt,\n query,\n }, options),\n resolveStripLogoSrc(),\n ]);\n\n const ip = enrichment.ip || '-';\n const location = enrichment.location || '-';\n\n return {\n watermarkText: buildWatermarkStamp({\n prompt,\n captureTime,\n ip,\n location,\n }),\n stripSegments: buildStripSegments({\n prompt,\n captureTime,\n ip,\n location,\n }),\n watermark: options.watermark,\n strip: options.strip,\n stripLogoSrc,\n device: resolvePageDevice(page),\n };\n};\n\nconst buildFontFamily = () => 'MiSans, \"SF Pro Display\", \"PingFang SC\", \"Helvetica Neue\", Arial, sans-serif';\n\nconst resolvePageDevice = (page) => normalizeDevice(page?.[PageRuntimeStateKey]?.device);\n\nconst findStripSegment = (segments, kind) => {\n const found = Array.isArray(segments)\n ? segments.find((segment) => segment?.kind === kind)\n : null;\n return found && typeof found === 'object' ? found : {};\n};\n\nconst buildStripSegmentLayout = (segment, options = {}) => {\n const label = normalizeWhitespace(segment?.label || '');\n const rawValue = normalizeWhitespace(segment?.rawValue || segment?.value || '-') || '-';\n const labelFontSize = DEFAULT_STRIP_LABEL_FONT_SIZE;\n const valueFontSize = DEFAULT_STRIP_VALUE_FONT_SIZE;\n const labelWidth = Math.max(\n DEFAULT_STRIP_LABEL_WIDTH,\n estimateTextWidth(label, labelFontSize) + DEFAULT_STRIP_LABEL_PADDING,\n );\n const rawValueWidth = Math.max(\n 24,\n estimateTextWidth(rawValue, valueFontSize) + DEFAULT_STRIP_VALUE_PADDING,\n );\n const maxValueWidth = Math.max(0, Number(options.valueMaxWidth) || 0);\n const renderValue = maxValueWidth > 0\n ? fitTextWithEllipsis(rawValue, Math.max(18, maxValueWidth - DEFAULT_STRIP_VALUE_PADDING), valueFontSize)\n : rawValue;\n const valueWidth = maxValueWidth > 0\n ? Math.max(24, Math.min(maxValueWidth, estimateTextWidth(renderValue, valueFontSize) + DEFAULT_STRIP_VALUE_PADDING))\n : rawValueWidth;\n\n return {\n ...segment,\n label,\n rawValue,\n renderValue,\n labelFontSize,\n valueFontSize,\n labelWidth,\n valueWidth,\n segmentWidth: labelWidth + valueWidth,\n rowHeight: Math.round(Math.max(labelFontSize, valueFontSize) * 1.42),\n };\n};\n\nconst buildStripRowLayout = (segments, overrides = {}) => {\n const safeSegments = Array.isArray(segments) ? segments : [];\n const sectionGap = DEFAULT_STRIP_SECTION_GAP;\n const layouts = safeSegments.map((segment, index) => buildStripSegmentLayout(segment, {\n valueMaxWidth: overrides?.valueMaxWidths?.[index],\n }));\n const totalWidth = layouts.reduce((sum, segment) => sum + segment.segmentWidth, 0)\n + Math.max(0, layouts.length - 1) * sectionGap;\n const rowHeight = layouts.reduce((max, segment) => Math.max(max, segment.rowHeight || 0), 0);\n\n return {\n sectionGap,\n layouts,\n totalWidth,\n rowHeight,\n };\n};\n\nconst fitTextWithEllipsis = (chars, maxWidth, fontSize) => {\n const safeChars = Array.isArray(chars) ? chars.slice() : Array.from(String(chars || ''));\n if (!safeChars.length) {\n return '-';\n }\n\n if (estimateTextWidth(safeChars.join(''), fontSize) <= maxWidth) {\n return safeChars.join('').trim() || '-';\n }\n\n while (safeChars.length > 1 && estimateTextWidth(`${safeChars.join('').trimEnd()}\u2026`, fontSize) > maxWidth) {\n safeChars.pop();\n }\n\n return `${safeChars.join('').trimEnd()}\u2026` || '\u2026';\n};\n\nconst splitTextToLines = (value, maxWidth, fontSize, maxLines = 2) => {\n const chars = Array.from(normalizeWhitespace(value) || '-');\n const safeMaxWidth = Math.max(18, maxWidth - DEFAULT_STRIP_TEXT_WIDTH_SAFETY);\n if (!chars.length) {\n return { lines: ['-'], truncated: false };\n }\n\n const lines = [];\n let cursor = 0;\n let truncated = false;\n\n while (cursor < chars.length && lines.length < maxLines) {\n while (cursor < chars.length && chars[cursor] === ' ') {\n cursor += 1;\n }\n\n if (cursor >= chars.length) {\n break;\n }\n\n const isLastLine = lines.length === maxLines - 1;\n const lineChars = [];\n\n while (cursor < chars.length) {\n const nextChars = [...lineChars, chars[cursor]];\n const remaining = cursor < chars.length - 1;\n const previewText = nextChars.join('') + (isLastLine && remaining ? '\u2026' : '');\n\n if (estimateTextWidth(previewText, fontSize) <= safeMaxWidth || lineChars.length === 0) {\n lineChars.push(chars[cursor]);\n cursor += 1;\n continue;\n }\n\n break;\n }\n\n while (cursor < chars.length && chars[cursor] === ' ') {\n cursor += 1;\n }\n\n if (isLastLine && cursor < chars.length) {\n lines.push(fitTextWithEllipsis([...lineChars, ...chars.slice(cursor)], safeMaxWidth, fontSize));\n truncated = true;\n cursor = chars.length;\n continue;\n }\n\n lines.push(lineChars.join('').trim() || '-');\n }\n\n return {\n lines: lines.length > 0 ? lines : ['-'],\n truncated,\n };\n};\n\nconst resolveMetadataMinValueWidth = (segment) => {\n switch (segment?.kind) {\n case 'time':\n return Math.max(148, estimateTextWidth('2026-04-23 21:27:16 UTC+8', DEFAULT_STRIP_VALUE_FONT_SIZE) + 8);\n case 'ip':\n return Math.max(108, estimateTextWidth('255.255.255.255', DEFAULT_STRIP_VALUE_FONT_SIZE) + 8);\n case 'location':\n return 76;\n default:\n return 56;\n }\n};\n\nconst buildMetadataRowLayout = (segments, contentWidth) => {\n const safeSegments = Array.isArray(segments) ? segments.filter(Boolean) : [];\n const naturalRow = buildStripRowLayout(safeSegments);\n\n if (!safeSegments.length || naturalRow.totalWidth <= contentWidth) {\n return naturalRow;\n }\n\n const sectionGap = naturalRow.sectionGap;\n const totalLabelWidth = naturalRow.layouts.reduce((sum, segment) => sum + segment.labelWidth, 0);\n const availableValueWidth = Math.max(\n 72,\n Math.floor(contentWidth - totalLabelWidth - Math.max(0, safeSegments.length - 1) * sectionGap),\n );\n const minValueWidths = naturalRow.layouts.map((segment) => resolveMetadataMinValueWidth(segment));\n const naturalValueWidths = naturalRow.layouts.map((segment) => segment.valueWidth);\n const valueWidths = naturalValueWidths.slice();\n let overflow = naturalRow.totalWidth - contentWidth;\n const shrinkOrder = ['location', 'ip', 'time'];\n\n shrinkOrder.forEach((kind) => {\n if (overflow <= 0) return;\n\n naturalRow.layouts.forEach((segment, index) => {\n if (overflow <= 0 || segment.kind !== kind) return;\n const minWidth = minValueWidths[index];\n const reducible = Math.max(0, valueWidths[index] - minWidth);\n if (!reducible) return;\n const reduction = Math.min(reducible, overflow);\n valueWidths[index] -= reduction;\n overflow -= reduction;\n });\n });\n\n if (overflow > 0) {\n const minTotalWidth = minValueWidths.reduce((sum, width) => sum + width, 0);\n if (minTotalWidth > availableValueWidth) {\n const flexibleIndexes = naturalRow.layouts\n .map((segment, index) => ({ segment, index }))\n .filter(({ segment }) => segment.kind !== 'time');\n let extraOverflow = minTotalWidth - availableValueWidth;\n\n flexibleIndexes.forEach(({ index }) => {\n if (extraOverflow <= 0) return;\n const minFloor = 40;\n const reducible = Math.max(0, minValueWidths[index] - minFloor);\n if (!reducible) return;\n const reduction = Math.min(reducible, extraOverflow);\n valueWidths[index] -= reduction;\n extraOverflow -= reduction;\n });\n }\n }\n\n return buildStripRowLayout(safeSegments, {\n valueMaxWidths: valueWidths,\n });\n};\n\nconst buildPromptWrapLayout = (segment, contentWidth) => {\n const label = normalizeWhitespace(segment?.label || 'Prompt') || 'Prompt';\n const rawValue = normalizeWhitespace(segment?.rawValue || segment?.value || '-') || '-';\n const labelFontSize = DEFAULT_STRIP_LABEL_FONT_SIZE;\n const valueFontSize = DEFAULT_STRIP_VALUE_FONT_SIZE;\n const labelWidth = Math.max(\n DEFAULT_STRIP_LABEL_WIDTH,\n estimateTextWidth(label, labelFontSize) + DEFAULT_STRIP_LABEL_PADDING,\n );\n const safeTotalWidth = Math.max(labelWidth + 56, Number(contentWidth) || 0);\n const valueWidth = Math.max(\n 56,\n safeTotalWidth - labelWidth - DEFAULT_STRIP_CONTENT_SAFE_PADDING_X,\n );\n const result = splitTextToLines(rawValue, valueWidth, valueFontSize, DEFAULT_STRIP_PROMPT_MAX_LINES);\n const lineHeight = Math.max(18, Math.round(valueFontSize * DEFAULT_STRIP_LINE_HEIGHT_RATIO));\n const lineWidths = result.lines.map((line) => estimateTextWidth(line, valueFontSize) + DEFAULT_STRIP_VALUE_PADDING);\n const measuredValueWidth = Math.min(\n valueWidth,\n Math.max(56, ...lineWidths),\n );\n const rowHeight = Math.round(Math.max(labelFontSize, valueFontSize) * 1.42);\n\n return {\n mode: result.lines.length === 1 ? 'single' : 'wrapped',\n label,\n rawValue,\n labelFontSize,\n labelWidth,\n valueFontSize,\n valueWidth,\n lines: result.lines,\n truncated: result.truncated,\n lineHeight,\n blockHeight: result.lines.length === 1\n ? rowHeight\n : Math.max(lineHeight, result.lines.length * lineHeight),\n totalWidth: labelWidth + measuredValueWidth,\n };\n};\n\nconst buildStripLayout = (segments, contentWidth) => {\n const safeSegments = Array.isArray(segments) ? segments.filter(Boolean) : [];\n const promptSegment = safeSegments.find((segment) => segment.kind === 'prompt') || safeSegments[0] || null;\n const metadataSegments = safeSegments.filter((segment) => segment !== promptSegment);\n const zoneGap = DEFAULT_STRIP_ZONE_GAP;\n let metadataRow = buildMetadataRowLayout(\n metadataSegments,\n Math.max(220, contentWidth),\n );\n let metadataStartX = Math.max(0, contentWidth - (metadataRow?.totalWidth || 0));\n let promptAvailableWidth = Math.max(\n 220,\n metadataStartX - zoneGap - DEFAULT_STRIP_PROMPT_TRAILING_PADDING,\n );\n\n if (promptAvailableWidth < DEFAULT_STRIP_PROMPT_MIN_TOTAL_WIDTH && metadataSegments.length > 0) {\n const tighterMetadataWidth = Math.max(180, contentWidth - DEFAULT_STRIP_PROMPT_MIN_TOTAL_WIDTH - zoneGap);\n metadataRow = buildMetadataRowLayout(metadataSegments, tighterMetadataWidth);\n metadataStartX = Math.max(0, contentWidth - (metadataRow?.totalWidth || 0));\n promptAvailableWidth = Math.max(\n 220,\n metadataStartX - zoneGap - DEFAULT_STRIP_PROMPT_TRAILING_PADDING,\n );\n }\n\n const preferredPromptWidth = Math.min(\n promptAvailableWidth,\n Math.max(280, Math.round(contentWidth * DEFAULT_STRIP_PROMPT_PREFERRED_WIDTH_RATIO)),\n );\n let promptRow = buildPromptWrapLayout(promptSegment, preferredPromptWidth);\n\n if (promptRow?.truncated && promptAvailableWidth > preferredPromptWidth + 24) {\n promptRow = buildPromptWrapLayout(promptSegment, promptAvailableWidth);\n }\n\n const contentHeight = Math.max(\n promptRow?.blockHeight || 0,\n metadataRow?.rowHeight || 0,\n 24,\n );\n const verticalPadding = contentHeight > (metadataRow?.rowHeight || 0) ? 18 : 16;\n const stripHeight = Math.max(\n contentHeight > (metadataRow?.rowHeight || 0)\n ? DEFAULT_STRIP_WRAPPED_MIN_HEIGHT\n : DEFAULT_STRIP_ONE_LINE_HEIGHT,\n Math.ceil(contentHeight + verticalPadding * 2),\n );\n\n return {\n mode: 'zoned',\n height: stripHeight,\n contentHeight,\n promptRow,\n promptStartX: 0,\n metadataRow,\n metadataStartX,\n };\n};\n\nconst renderStripRow = (row, options = {}) => {\n const startX = Number(options.startX) || 0;\n const centerY = Number(options.centerY) || 0;\n const fontFamily = String(options.fontFamily || '');\n const showDividers = options.showDividers !== false;\n const layouts = Array.isArray(row?.layouts) ? row.layouts : [];\n\n if (!layouts.length) {\n return '';\n }\n\n const rowHeight = Math.max(18, Number(row?.rowHeight) || 18);\n const dividerHalfHeight = Math.max(12, Math.round(rowHeight * 0.56));\n const sectionGap = Math.max(0, Number(row?.sectionGap) || 0);\n const svgSegments = [];\n let currentX = startX;\n\n layouts.forEach((segment, index) => {\n const label = escapeXml(segment.label || '');\n const value = escapeXml(segment.renderValue || '-');\n const labelX = currentX;\n const valueX = currentX + segment.labelWidth;\n\n svgSegments.push(`\n <text\n x=\"${labelX}\"\n y=\"${centerY}\"\n fill=\"#111111\"\n fill-opacity=\"0.54\"\n font-family=\"${fontFamily}\"\n font-size=\"${segment.labelFontSize}\"\n font-weight=\"650\"\n dominant-baseline=\"middle\"\n >${label}</text>\n <text\n x=\"${valueX}\"\n y=\"${centerY}\"\n fill=\"#111111\"\n font-family=\"${fontFamily}\"\n font-size=\"${segment.valueFontSize}\"\n font-weight=\"${segment.kind === 'prompt' ? 760 : 710}\"\n dominant-baseline=\"middle\"\n >${value}</text>\n `);\n\n currentX += segment.segmentWidth;\n\n if (showDividers && index < layouts.length - 1) {\n const lineX = currentX + Math.round(sectionGap / 2);\n svgSegments.push(`\n <line\n x1=\"${lineX}\"\n y1=\"${centerY - dividerHalfHeight}\"\n x2=\"${lineX}\"\n y2=\"${centerY + dividerHalfHeight}\"\n stroke=\"#94a3b8\"\n stroke-opacity=\"0.34\"\n stroke-width=\"1\"\n />\n `);\n currentX += sectionGap;\n }\n });\n\n return svgSegments.join('');\n};\n\nconst renderStripDivider = (x, centerY, height) => {\n const safeX = Number(x) || 0;\n const safeCenterY = Number(centerY) || 0;\n const safeHeight = Math.max(18, Number(height) || 18);\n const halfHeight = Math.max(12, Math.round(safeHeight * 0.56));\n\n return `\n <line\n x1=\"${safeX}\"\n y1=\"${safeCenterY - halfHeight}\"\n x2=\"${safeX}\"\n y2=\"${safeCenterY + halfHeight}\"\n stroke=\"#94a3b8\"\n stroke-opacity=\"0.34\"\n stroke-width=\"1\"\n />\n `;\n};\n\nconst renderMobileStripText = ({\n label,\n value,\n labelX,\n valueX,\n y,\n valueWidth,\n fontFamily,\n}) => {\n const safeLabel = normalizeWhitespace(label) || '-';\n const safeValue = fitTextWithEllipsis(\n Array.from(normalizeWhitespace(value) || '-'),\n Math.max(18, valueWidth - MOBILE_STRIP_VALUE_WIDTH_SAFETY),\n MOBILE_STRIP_VALUE_FONT_SIZE,\n );\n\n return `\n <text\n x=\"${labelX}\"\n y=\"${y}\"\n fill=\"#111111\"\n fill-opacity=\"0.54\"\n font-family=\"${fontFamily}\"\n font-size=\"${MOBILE_STRIP_LABEL_FONT_SIZE}\"\n font-weight=\"650\"\n dominant-baseline=\"middle\"\n >${escapeXml(safeLabel)}</text>\n <text\n x=\"${valueX}\"\n y=\"${y}\"\n fill=\"#111111\"\n font-family=\"${fontFamily}\"\n font-size=\"${MOBILE_STRIP_VALUE_FONT_SIZE}\"\n font-weight=\"730\"\n dominant-baseline=\"middle\"\n >${escapeXml(safeValue)}</text>\n `;\n};\n\nconst renderMobileStrip = ({ meta, width, baseHeight, fontFamily }) => {\n const stripHeight = MOBILE_STRIP_HEIGHT;\n const stripY = baseHeight;\n const contentX = MOBILE_STRIP_PADDING_X;\n const contentWidth = Math.max(1, width - MOBILE_STRIP_PADDING_X * 2);\n const prompt = findStripSegment(meta.stripSegments, 'prompt');\n const time = findStripSegment(meta.stripSegments, 'time');\n const location = findStripSegment(meta.stripSegments, 'location');\n const ip = findStripSegment(meta.stripSegments, 'ip');\n // \u79FB\u52A8\u7AEF\u4FE1\u606F\u6761\u8FFD\u52A0\u5728\u539F\u56FE\u4E0B\u65B9\uFF0C\u907F\u514D\u8986\u76D6\u9875\u9762\u5E95\u90E8\u8F93\u5165\u533A\u3002\n const row1Y = stripY + MOBILE_STRIP_PADDING_Y + MOBILE_STRIP_ROW_HEIGHT / 2;\n const row2Y = row1Y + MOBILE_STRIP_ROW_HEIGHT + MOBILE_STRIP_ROW_GAP;\n const rightColumnX = Math.min(\n width - MOBILE_STRIP_PADDING_X - 112,\n Math.max(\n contentX + 200,\n contentX + Math.round(contentWidth * 0.62),\n ),\n );\n const leftValueX = contentX + 48;\n const rightValueX = rightColumnX + 28;\n const promptValueWidth = Math.max(\n 28,\n rightColumnX - leftValueX - MOBILE_STRIP_META_GAP,\n );\n const timeValueWidth = Math.max(\n 28,\n rightColumnX - leftValueX - MOBILE_STRIP_META_GAP,\n );\n const locValueWidth = Math.max(\n 28,\n width - MOBILE_STRIP_PADDING_X - rightValueX,\n );\n const ipValueWidth = Math.max(\n 28,\n width - MOBILE_STRIP_PADDING_X - rightValueX,\n );\n\n return `\n <g id=\"strip\">\n <rect x=\"0\" y=\"${stripY}\" width=\"${width}\" height=\"${stripHeight}\" fill=\"#ffffff\" fill-opacity=\"0.985\" />\n <rect x=\"0\" y=\"${stripY}\" width=\"${width}\" height=\"1\" fill=\"#111111\" fill-opacity=\"0.10\" />\n <rect x=\"${contentX}\" y=\"${stripY}\" width=\"${Math.max(96, Math.round(width * 0.34))}\" height=\"2\" fill=\"url(#stripAccent)\" />\n ${renderMobileStripText({\n label: 'Prompt',\n value: prompt.rawValue || prompt.value || '-',\n labelX: contentX,\n valueX: leftValueX,\n y: row1Y,\n valueWidth: promptValueWidth,\n fontFamily,\n })}\n ${renderMobileStripText({\n label: 'Loc',\n value: location.rawValue || location.value || '-',\n labelX: rightColumnX,\n valueX: rightValueX,\n y: row1Y,\n valueWidth: locValueWidth,\n fontFamily,\n })}\n ${renderMobileStripText({\n label: 'Time',\n value: time.rawValue || time.value || '-',\n labelX: contentX,\n valueX: leftValueX,\n y: row2Y,\n valueWidth: timeValueWidth,\n fontFamily,\n })}\n ${renderMobileStripText({\n label: 'IP',\n value: ip.rawValue || ip.value || '-',\n labelX: rightColumnX,\n valueX: rightValueX,\n y: row2Y,\n valueWidth: ipValueWidth,\n fontFamily,\n })}\n </g>\n `;\n};\n\nconst buildWatermarkifySvg = (meta, imageWidth, imageHeight) => {\n const hasWatermark = meta?.watermark?.enabled !== false && normalizeText(meta?.watermarkText);\n const hasStrip = meta?.strip?.enabled !== false && Array.isArray(meta?.stripSegments) && meta.stripSegments.length > 0;\n\n if (!hasWatermark && !hasStrip) {\n return '';\n }\n\n const width = Math.max(1, Number(imageWidth) || 1);\n const baseHeight = Math.max(1, Number(imageHeight) || 1);\n const canvasHeight = normalizeDevice(meta.device) === Device.Mobile && hasStrip\n ? baseHeight + MOBILE_STRIP_HEIGHT\n : baseHeight;\n const fontFamily = escapeXml(buildFontFamily());\n const parts = [];\n\n if (hasWatermark) {\n const stampText = escapeXml(normalizeText(meta.watermarkText));\n const cellWidth = Math.max(680, Number(meta.watermark?.cellWidth) || DEFAULT_WATERMARK_CELL_WIDTH);\n const cellHeight = Math.max(260, Number(meta.watermark?.cellHeight) || DEFAULT_WATERMARK_CELL_HEIGHT);\n const rotateDeg = Number(meta.watermark?.rotateDeg) || DEFAULT_WATERMARK_ROTATE_DEG;\n const opacity = Math.min(0.22, Math.max(0.05, Number(meta.watermark?.opacity) || DEFAULT_WATERMARK_OPACITY));\n const rowOffset = Math.round(cellWidth * 0.24);\n const startX = -Math.round(cellWidth * 0.16);\n const startY = -Math.round(cellHeight * 0.12);\n const cols = Math.ceil((width + cellWidth * 1.1) / cellWidth) + 1;\n const rows = Math.ceil((baseHeight + cellHeight * 0.9) / cellHeight) + 1;\n const stamps = [];\n\n for (let row = 0; row < rows; row += 1) {\n for (let col = 0; col < cols; col += 1) {\n const x = startX + col * cellWidth + (row % 2 ? rowOffset : 0);\n const y = startY + row * cellHeight + (row % 2 ? 14 : -8);\n stamps.push(`\n <g transform=\"translate(${x} ${y}) rotate(${rotateDeg})\">\n <text\n x=\"0\"\n y=\"0\"\n fill=\"#111111\"\n fill-opacity=\"${opacity}\"\n stroke=\"#ffffff\"\n stroke-opacity=\"0.12\"\n stroke-width=\"0.22\"\n font-family=\"${fontFamily}\"\n font-size=\"19\"\n font-weight=\"720\"\n letter-spacing=\"0.6\"\n >${stampText}</text>\n </g>\n `);\n }\n }\n\n parts.push(`<g id=\"watermarks\">${stamps.join('')}</g>`);\n }\n\n if (hasStrip) {\n if (normalizeDevice(meta.device) === Device.Mobile) {\n parts.push(renderMobileStrip({\n meta,\n width,\n baseHeight,\n fontFamily,\n }));\n return `\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${canvasHeight}\" viewBox=\"0 0 ${width} ${canvasHeight}\">\n <defs>\n <linearGradient id=\"stripAccent\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\">\n <stop offset=\"0%\" stop-color=\"#111111\" stop-opacity=\"0.98\" />\n <stop offset=\"24%\" stop-color=\"#111111\" stop-opacity=\"0.68\" />\n <stop offset=\"58%\" stop-color=\"#111111\" stop-opacity=\"0.08\" />\n <stop offset=\"100%\" stop-color=\"#111111\" stop-opacity=\"0\" />\n </linearGradient>\n </defs>\n ${parts.join('')}\n </svg>\n `;\n }\n\n const logoSize = 28;\n const logoX = DEFAULT_STRIP_PADDING_LEFT;\n const contentStartX = logoX + logoSize + DEFAULT_STRIP_GAP;\n const contentWidth = width - contentStartX - DEFAULT_STRIP_PADDING_RIGHT;\n const stripLayout = buildStripLayout(meta.stripSegments, contentWidth);\n const stripHeight = stripLayout.height;\n const stripY = baseHeight - stripHeight;\n const logoY = Number((stripY + ((stripHeight - logoSize) / 2)).toFixed(2));\n let stripContentSvg = '';\n const centerY = stripY + stripHeight / 2 + 1;\n const promptRow = stripLayout.promptRow;\n const metadataRow = stripLayout.metadataRow;\n const promptParts = [];\n const hasPrompt = Boolean(promptRow?.label);\n const hasMetadata = Array.isArray(metadataRow?.layouts) && metadataRow.layouts.length > 0;\n const zoneDividerX = hasPrompt && hasMetadata\n ? contentStartX + stripLayout.metadataStartX - (DEFAULT_STRIP_ZONE_GAP / 2)\n : null;\n\n if (promptRow?.mode === 'single') {\n promptParts.push(renderStripRow({\n layouts: [\n {\n kind: 'prompt',\n label: promptRow.label,\n renderValue: promptRow.lines[0] || '-',\n labelFontSize: promptRow.labelFontSize,\n valueFontSize: promptRow.valueFontSize,\n labelWidth: promptRow.labelWidth,\n segmentWidth: promptRow.labelWidth + promptRow.valueWidth,\n },\n ],\n sectionGap: 0,\n rowHeight: promptRow.blockHeight,\n }, {\n startX: contentStartX + stripLayout.promptStartX,\n centerY,\n fontFamily,\n showDividers: false,\n }));\n } else if (promptRow) {\n const promptStartX = contentStartX + stripLayout.promptStartX;\n const labelX = promptStartX;\n const valueX = promptStartX + promptRow.labelWidth;\n const blockTop = centerY - (promptRow.blockHeight / 2);\n const labelY = centerY;\n\n promptParts.push(`\n <text\n x=\"${labelX}\"\n y=\"${labelY}\"\n fill=\"#111111\"\n fill-opacity=\"0.54\"\n font-family=\"${fontFamily}\"\n font-size=\"${promptRow.labelFontSize}\"\n font-weight=\"650\"\n dominant-baseline=\"middle\"\n >${escapeXml(promptRow.label)}</text>\n `);\n\n promptRow.lines.forEach((line, index) => {\n const lineY = blockTop + (index * promptRow.lineHeight) + (promptRow.lineHeight / 2);\n promptParts.push(`\n <text\n x=\"${valueX}\"\n y=\"${lineY}\"\n fill=\"#111111\"\n font-family=\"${fontFamily}\"\n font-size=\"${promptRow.valueFontSize}\"\n font-weight=\"760\"\n dominant-baseline=\"middle\"\n >${escapeXml(line)}</text>\n `);\n });\n }\n\n stripContentSvg = [\n promptParts.join(''),\n zoneDividerX == null\n ? ''\n : renderStripDivider(\n zoneDividerX,\n centerY,\n Math.max(promptRow?.blockHeight || 0, metadataRow?.rowHeight || 0),\n ),\n renderStripRow(metadataRow, {\n startX: contentStartX + stripLayout.metadataStartX,\n centerY,\n fontFamily,\n showDividers: true,\n }),\n ].join('');\n\n parts.push(`\n <g id=\"strip\">\n <rect x=\"0\" y=\"${stripY}\" width=\"${width}\" height=\"${stripHeight}\" fill=\"#ffffff\" fill-opacity=\"0.985\" />\n <rect x=\"0\" y=\"${stripY}\" width=\"${width}\" height=\"1\" fill=\"#111111\" fill-opacity=\"0.10\" />\n <rect x=\"${DEFAULT_STRIP_PADDING_LEFT}\" y=\"${stripY}\" width=\"${Math.max(120, Math.round(width * 0.42))}\" height=\"2\" fill=\"url(#stripAccent)\" />\n ${meta.stripLogoSrc ? `<image href=\"${escapeXml(meta.stripLogoSrc)}\" x=\"${logoX}\" y=\"${logoY}\" width=\"${logoSize}\" height=\"${logoSize}\" />` : ''}\n ${stripContentSvg}\n </g>\n `);\n }\n\n return `\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${canvasHeight}\" viewBox=\"0 0 ${width} ${canvasHeight}\">\n <defs>\n <linearGradient id=\"stripAccent\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\">\n <stop offset=\"0%\" stop-color=\"#111111\" stop-opacity=\"0.98\" />\n <stop offset=\"24%\" stop-color=\"#111111\" stop-opacity=\"0.68\" />\n <stop offset=\"58%\" stop-color=\"#111111\" stop-opacity=\"0.08\" />\n <stop offset=\"100%\" stop-color=\"#111111\" stop-opacity=\"0\" />\n </linearGradient>\n </defs>\n ${parts.join('')}\n </svg>\n `;\n};\n\nexport const watermarkifyScreenshotBuffer = async (buffer, meta, page = null, options = {}) => {\n const hasWatermark = meta?.watermark?.enabled !== false && normalizeText(meta?.watermarkText);\n const hasStrip = meta?.strip?.enabled !== false && Array.isArray(meta?.stripSegments) && meta.stripSegments.length > 0;\n\n if (!Buffer.isBuffer(buffer) || !meta || (!hasWatermark && !hasStrip)) {\n return buffer;\n }\n\n const imageInfo = readImageInfo(buffer);\n if (!imageInfo.width || !imageInfo.height || !imageInfo.mimeType) {\n logger.warning('watermarkify \u8DF3\u8FC7: \u65E0\u6CD5\u89E3\u6790\u622A\u56FE\u5C3A\u5BF8\u6216\u683C\u5F0F');\n return buffer;\n }\n\n const isMobileStrip = normalizeDevice(meta.device) === Device.Mobile && hasStrip;\n const outputImageInfo = isMobileStrip\n ? {\n ...imageInfo,\n imageHeight: imageInfo.height,\n height: imageInfo.height + MOBILE_STRIP_HEIGHT,\n }\n : imageInfo;\n const overlaySvg = buildWatermarkifySvg(meta, imageInfo.width, imageInfo.height);\n if (!overlaySvg) {\n return buffer;\n }\n\n return await composeScreenshotBufferWithBrowser(page, buffer, overlaySvg, outputImageInfo, options);\n};\n", "import { Jimp, JimpMime, ResizeStrategy } from 'jimp';\nimport { createInternalLogger } from './logger.js';\n\nconst logger = createInternalLogger('Compression');\n\nconst DEFAULT_SCREENSHOT_MAX_BYTES = 5 * 1024 * 1024;\nconst DEFAULT_SCREENSHOT_OUTPUT_TYPE = 'jpeg';\nconst DEFAULT_SCREENSHOT_QUALITY = 0.72;\nconst DEFAULT_SCREENSHOT_MIN_QUALITY = 0.38;\nconst DEFAULT_SCREENSHOT_MIN_SCALE = 0.25;\nconst SUPPORTED_SCREENSHOT_OUTPUT_TYPES = new Set(['jpeg']);\n\nconst toPositiveInteger = (value, fallback = 0) => {\n const number = Math.floor(Number(value) || 0);\n return number > 0 ? number : fallback;\n};\n\nconst normalizeQuality = (value, fallback) => {\n const number = Number(value);\n if (!Number.isFinite(number) || number <= 0) return fallback;\n const normalized = number > 1 ? number / 100 : number;\n return Math.min(1, Math.max(0.01, normalized));\n};\n\nconst normalizeScale = (value, fallback) => {\n const number = Number(value);\n if (!Number.isFinite(number) || number <= 0) return fallback;\n return Math.min(1, Math.max(0.05, number));\n};\n\nconst normalizeScreenshotOutputType = (value) => {\n const raw = String(value || DEFAULT_SCREENSHOT_OUTPUT_TYPE).trim().toLowerCase();\n const normalized = raw === 'jpg' ? 'jpeg' : raw;\n return SUPPORTED_SCREENSHOT_OUTPUT_TYPES.has(normalized)\n ? normalized\n : DEFAULT_SCREENSHOT_OUTPUT_TYPE;\n};\n\nconst getBase64BytesFromBuffer = (buffer) => Math.ceil(buffer.length / 3) * 4;\n\nconst toJpegQuality = (value) => Math.round(normalizeQuality(value, DEFAULT_SCREENSHOT_QUALITY) * 100);\n\nexport const resolveImageCompression = (options = {}) => {\n const explicit = options.compression;\n const source = explicit && typeof explicit === 'object' && !Array.isArray(explicit)\n ? explicit\n : {};\n\n const enabled = explicit !== false\n && source.enabled !== false\n && options.compress !== false;\n\n const quality = normalizeQuality(\n source.quality ?? options.quality,\n DEFAULT_SCREENSHOT_QUALITY,\n );\n const minQuality = Math.min(\n quality,\n normalizeQuality(source.minQuality ?? options.minQuality, DEFAULT_SCREENSHOT_MIN_QUALITY),\n );\n\n return {\n enabled,\n maxBytes: toPositiveInteger(\n source.maxBytes\n ?? source.maxBase64Bytes\n ?? options.maxBytes\n ?? options.maxBase64Bytes,\n DEFAULT_SCREENSHOT_MAX_BYTES,\n ),\n outputType: normalizeScreenshotOutputType(\n source.type\n ?? source.outputType\n ?? options.type\n ?? options.outputType,\n ),\n quality,\n minQuality,\n minScale: normalizeScale(\n source.minScale ?? options.minScale,\n DEFAULT_SCREENSHOT_MIN_SCALE,\n ),\n };\n};\n\nconst encodeJpeg = async (sourceImage, compression, scale, quality) => {\n const width = Math.max(1, Math.round(sourceImage.bitmap.width * scale));\n const height = Math.max(1, Math.round(sourceImage.bitmap.height * scale));\n const image = sourceImage.clone();\n\n if (scale < 0.999) {\n image.resize({\n w: width,\n h: height,\n mode: ResizeStrategy.BILINEAR,\n });\n }\n\n const buffer = await image.getBuffer(JimpMime.jpeg, { quality });\n return {\n buffer,\n bytes: getBase64BytesFromBuffer(buffer),\n width,\n height,\n quality,\n scale: Number(scale.toFixed(3)),\n format: compression.outputType,\n };\n};\n\nconst compressImageBuffer = async (buffer, compression) => {\n const sourceImage = await Jimp.read(buffer);\n const maxQuality = toJpegQuality(compression.quality);\n const minQuality = Math.min(maxQuality, toJpegQuality(compression.minQuality));\n let quality = maxQuality;\n let scale = 1;\n let smallest = null;\n\n for (let attempt = 0; attempt < 12; attempt += 1) {\n const candidate = await encodeJpeg(sourceImage, compression, scale, quality);\n if (!smallest || candidate.bytes < smallest.bytes) {\n smallest = candidate;\n }\n if (candidate.bytes <= compression.maxBytes) {\n return { ...candidate, withinLimit: true };\n }\n\n if (quality > minQuality) {\n quality = Math.max(minQuality, Math.floor(quality * 0.75));\n continue;\n }\n\n const ratio = Math.sqrt(compression.maxBytes / Math.max(1, candidate.bytes));\n const nextScale = Math.max(\n compression.minScale,\n Math.min(scale * 0.85, scale * ratio * 0.94),\n );\n\n if (nextScale >= scale * 0.99 || scale <= compression.minScale) {\n break;\n }\n\n scale = nextScale;\n }\n\n const finalCandidate = await encodeJpeg(sourceImage, compression, compression.minScale, minQuality);\n const fallback = !smallest || finalCandidate.bytes < smallest.bytes\n ? finalCandidate\n : smallest;\n return { ...fallback, withinLimit: fallback.bytes <= compression.maxBytes };\n};\n\nexport const compressImageBufferToBase64 = async (buffer, compression) => {\n const originalBytes = getBase64BytesFromBuffer(buffer);\n if (!compression.enabled || originalBytes <= compression.maxBytes) {\n return buffer.toString('base64');\n }\n\n const result = await compressImageBuffer(buffer, compression).catch((error) => {\n logger.warning(`captureScreen \u538B\u7F29\u5931\u8D25\uFF0C\u8FD4\u56DE\u539F\u56FE: ${error instanceof Error ? error.message : String(error)}`);\n return null;\n });\n\n if (!result?.buffer) {\n return buffer.toString('base64');\n }\n\n if (result.withinLimit) {\n logger.info(\n `captureScreen \u5DF2\u538B\u7F29: ${originalBytes} -> ${result.bytes} bytes, `\n + `format=${result.format}, quality=${result.quality}, scale=${result.scale}, size=${result.width}x${result.height}`,\n );\n } else {\n logger.warning(\n `captureScreen \u538B\u7F29\u540E\u4ECD\u8D85\u8FC7\u76EE\u6807: ${originalBytes} -> ${result.bytes} bytes, `\n + `maxBytes=${compression.maxBytes}, format=${result.format}, quality=${result.quality}, scale=${result.scale}`,\n );\n }\n\n return result.buffer.toString('base64');\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { log as crawleeLog } from 'crawlee';\nimport { ApifyKit } from '../src/apify-kit.js';\nimport { Utils } from '../src/utils.js';\nimport { AntiCheat } from '../src/anti-cheat.js';\nimport { DeviceInput } from '../src/device-input.js';\nimport { DeviceView } from '../src/device-view.js';\nimport { Humanize } from '../src/humanize.js';\nimport { Launch } from '../src/launch.js';\nimport { LiveView } from '../src/live-view.js';\nimport { Captcha } from '../src/chaptcha.js';\nimport { Mutation } from '../src/mutation.js';\nimport { Display } from '../src/display.js';\nimport * as Constants from '../src/constants.js';\nimport * as Errors from '../src/errors.js';\nimport { Logger, LOG_TEMPLATES, stripAnsi } from '../src/logger.js';\nimport { Share } from '../src/share.js';\nimport { ByPass } from '../src/proxy-bypass.js';\nimport { RuntimeEnv } from '../src/runtime-env.js';\nimport { setToolkitMode } from '../src/internals/context.js';\n\n// \u4FEE\u6539\u9ED8\u8BA4logger \u4ECEconsole.log \u5230 crawleeLog\nLogger.setLogger(crawleeLog);\n\n// Unified Entry Point\nexport const usePlaywrightToolKit = (mode = 'default') => {\n setToolkitMode(mode);\n\n const toolkit = {\n ApifyKit,\n AntiCheat,\n DeviceInput,\n DeviceView,\n Humanize,\n Launch,\n LiveView,\n Constants,\n Utils,\n RuntimeEnv,\n Captcha,\n Errors,\n Mutation,\n Display,\n Logger,\n Share,\n ByPass,\n $Internals: { LOG_TEMPLATES, stripAnsi }\n };\n\n return toolkit;\n};\n", "export const Code = {\n Success: 0,\n UnknownError: -1,\n NotLogin: 30000001,\n Chaptcha: 30000002,\n Timeout: 30000003,\n InitialTimeout: 30000004,\n OverallTimeout: 30000005,\n}\n\nexport const Status = {\n Success: 'SUCCESS',\n Failed: 'FAILED'\n}\n\nexport const PresetOfLiveViewKey = 'LIVE_VIEW_SCREENSHOT';\n\nexport const Device = Object.freeze({\n Desktop: 'desktop',\n Mobile: 'mobile',\n});\n\nexport const Mode = Object.freeze({\n Default: 'default',\n Cloak: 'cloak',\n});\n\nexport const normalizeDevice = (value, fallback = Device.Desktop) => {\n const normalizedFallback = String(fallback || '').trim().toLowerCase() === Device.Mobile\n ? Device.Mobile\n : Device.Desktop;\n const raw = String(value || '').trim().toLowerCase();\n if (raw === Device.Mobile) return Device.Mobile;\n if (raw === Device.Desktop) return Device.Desktop;\n return normalizedFallback;\n};\n\nexport const normalizeMode = (value, fallback = Mode.Default) => {\n const normalizedFallback = String(fallback || '').trim().toLowerCase() === Mode.Cloak\n ? Mode.Cloak\n : Mode.Default;\n const raw = String(value || '').trim().toLowerCase();\n if (raw === Mode.Cloak) return Mode.Cloak;\n if (raw === Mode.Default) return Mode.Default;\n return normalizedFallback;\n};\n\nconst createActorInfo = (info) => {\n const normalizeDomain = (value) => {\n if (!value) return '';\n return String(value).trim().replace(/^https?:\\/\\//, '').replace(/\\/.*$/, '');\n };\n\n const normalizePath = (value) => {\n if (!value) return '/';\n const raw = String(value).trim();\n if (!raw) return '/';\n return raw.startsWith('/') ? raw : `/${raw}`;\n };\n\n const normalizeShare = (value) => {\n const raw = value && typeof value === 'object' ? value : {};\n\n const modeRaw = String(raw.mode || 'dom').trim().toLowerCase();\n const mode = ['dom', 'response', 'custom'].includes(modeRaw) ? modeRaw : 'dom';\n\n const prefix = String(raw.prefix || '').trim();\n\n const rawXurl = Array.isArray(raw.xurl)\n ? raw.xurl\n : [];\n\n const normalizeMatcherList = (input) => {\n if (Array.isArray(input)) {\n return input\n .map((item) => String(item || '').trim().replace(/\\.+$/, ''))\n .filter(Boolean);\n }\n\n const single = String(input || '').trim().replace(/\\.+$/, '');\n return single ? [single] : [];\n };\n\n const normalizeSegments = (input) => {\n if (Array.isArray(input)) {\n return input\n .map((item) => String(item || '').trim().replace(/\\.+$/, ''))\n .filter(Boolean);\n }\n\n const rawPath = String(input || '').trim();\n if (!rawPath) return [];\n\n return rawPath\n .split('.')\n .map((segment) => String(segment || '').trim().replace(/\\.+$/, ''))\n .filter(Boolean);\n };\n\n const xurl = [];\n\n const matcherList = normalizeMatcherList(rawXurl[0]);\n if (matcherList.length > 0) {\n xurl.push(matcherList);\n }\n\n const flatPath = [];\n const extraPaths = [];\n\n rawXurl.slice(1).forEach((item) => {\n if (Array.isArray(item)) {\n const segments = normalizeSegments(item);\n if (segments.length > 0) {\n extraPaths.push(segments);\n }\n return;\n }\n\n const segments = normalizeSegments(item);\n if (segments.length > 0) {\n flatPath.push(...segments);\n }\n });\n\n if (flatPath.length > 0) {\n xurl.push(flatPath);\n }\n\n if (extraPaths.length > 0) {\n xurl.push(...extraPaths);\n }\n\n return {\n mode,\n prefix,\n xurl,\n };\n };\n\n const buildLandingUrl = ({protocol, domain, path}) => {\n const safeProtocol = String(protocol).trim();\n const safeDomain = normalizeDomain(domain);\n const safePath = normalizePath(path);\n return `${safeProtocol}://${safeDomain}${safePath}`;\n };\n\n const buildIcon = ({key}) => {\n return `https://static.heartbitai.com/general/actors/${key}.png`;\n }\n\n\n const protocol = info.protocol || 'https';\n const domain = normalizeDomain(info.domain);\n const path = normalizePath(info.path);\n const share = normalizeShare(info.share);\n const device = normalizeDevice(info.device);\n\n return {\n ...info,\n protocol,\n domain,\n path,\n share,\n device,\n get icon() {\n if (info.icon) return info.icon;\n return buildIcon(this);\n },\n get landingUrl() {\n return buildLandingUrl(this);\n },\n };\n};\n\nexport const ActorInfo = {\n qbot: createActorInfo({\n key: 'qbot',\n name: 'QQ\u6D4F\u89C8\u5668AI\u641C',\n domain: 'sogou.com',\n path: '/web',\n share: {\n mode: 'dom',\n prefix: '',\n xurl: [],\n },\n }),\n douyin: createActorInfo({\n key: 'douyin',\n name: '\u6296\u97F3AI\u641C',\n domain: 'so.douyin.com',\n path: '/',\n share: {\n mode: 'dom',\n prefix: '',\n xurl: [\n ],\n },\n }),\n lingguang: createActorInfo({\n key: 'lingguang',\n name: '\u7075\u5149',\n domain: 'www.lingguang.com',\n path: '/',\n share: {\n mode: 'response',\n prefix: 'https://www.lingguang.com/share/',\n xurl: [\n '/chat/shareChat.json',\n 'result',\n ],\n },\n }),\n doubao: createActorInfo({\n key: 'doubao',\n name: '\u8C46\u5305',\n domain: 'www.doubao.com',\n path: '/',\n device: Device.Desktop,\n share: {\n mode: 'response',\n prefix: 'https://www.doubao.com/thread/',\n xurl: [\n '/samantha/thread/share/save',\n 'data', 'share_id',\n ],\n },\n }),\n deepseek: createActorInfo({\n key: 'deepseek',\n name: 'DeepSeek',\n domain: 'chat.deepseek.com',\n path: '/',\n share: {\n mode: 'response',\n prefix: 'https://chat.deepseek.com/share/',\n xurl: [\n '/api/v0/share/create',\n 'data', 'biz_data', 'share_id',\n ],\n },\n }),\n erine: createActorInfo({\n key: 'erine',\n name: '\u6587\u5FC3\u4E00\u8A00',\n domain: 'wenxin.baidu.com',\n path: '/',\n device: Device.Mobile,\n share: {\n mode: 'custom',\n prefix: '',\n xurl: [],\n },\n }),\n wenxin: createActorInfo({\n key: 'wenxin',\n name: '\u6587\u5FC3\u52A9\u624B',\n domain: 'chat.baidu.com',\n path: '/',\n device: Device.Mobile,\n share: {\n mode: 'response',\n prefix: 'https://chat.baidu.com/csaitab/history/share?v=2&share_id=',\n xurl: [\n '/aichat/api/getShareToken',\n 'data', 'token',\n ],\n },\n }),\n baidu: createActorInfo({\n key: 'baidu',\n name: '\u767E\u5EA6AI\u641C',\n domain: 'www.baidu.com',\n path: '/s',\n share: {\n mode: 'dom',\n prefix: '',\n xurl: [],\n },\n }),\n yuanbao: createActorInfo({\n key: 'yuanbao',\n name: '\u5143\u5B9D',\n domain: 'yuanbao.tencent.com',\n path: '/chat/',\n device: Device.Mobile,\n share: {\n mode: 'response',\n prefix: 'https://yb.tencent.com/s/',\n xurl: [\n '/api/conversations/v2/share', 'shareId',\n ],\n },\n }),\n kimi: createActorInfo({\n key: 'kimi',\n name: 'Kimi',\n domain: 'www.kimi.com',\n path: '/',\n device: Device.Mobile,\n share: {\n mode: 'response',\n prefix: 'https://www.kimi.com/share/',\n xurl: [\n '/kimi.gateway.chat.v1.ChatService/CreateChatShare', 'share', 'id'\n ],\n },\n }),\n qwen: createActorInfo({\n key: 'qwen',\n name: '\u901A\u4E49\u5343\u95EE',\n domain: 'www.qianwen.com',\n path: '/chat',\n device: Device.Mobile,\n share: {\n mode: 'response',\n prefix: 'https://www.qianwen.com/share/chat/',\n xurl: [\n '/api/v1/share/create', 'data', 'share_id'\n ],\n },\n }),\n nano: createActorInfo({\n key: 'nano',\n name: '\u7EB3\u7C73',\n domain: 'www.n.cn',\n path: '/',\n share: {\n mode: 'response',\n prefix: 'https://www.n.cn/share/mcp?id=',\n xurl: [\n '/api/share/gen', 'data', 'id'\n ],\n },\n }),\n quark: createActorInfo({\n key: 'quark',\n name: '\u5938\u514B',\n domain: 'ai.quark.cn',\n path: '/s',\n share: {\n mode: 'dom',\n prefix: '',\n xurl: [],\n },\n }),\n}\n", "\n// =============================================================================\n// Core Helpers & State\n// =============================================================================\n\nconst pad = (value, size = 2) => String(value).padStart(size, '0');\n\nconst FORCED_TIMEZONE_OFFSET_MINUTES = -8 * 60;\n\nconst formatTimestamp = (date = new Date()) => {\n const source = date instanceof Date ? date : new Date(date);\n const forcedDate = new Date(source.getTime() - (FORCED_TIMEZONE_OFFSET_MINUTES * 60 * 1000));\n\n const year = forcedDate.getUTCFullYear();\n const month = pad(forcedDate.getUTCMonth() + 1);\n const day = pad(forcedDate.getUTCDate());\n const hours = pad(forcedDate.getUTCHours());\n const minutes = pad(forcedDate.getUTCMinutes());\n const seconds = pad(forcedDate.getUTCSeconds());\n const millis = pad(forcedDate.getUTCMilliseconds(), 3);\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}.${millis}`;\n};\n\nconst formatLine = (prefix, icon, message) => {\n const parts = [];\n if (prefix) parts.push(`[${prefix}]`);\n if (icon) parts.push(icon);\n if (message) parts.push(message);\n return parts.join(' ').trim();\n};\n\nconst fallbackLog = {\n info: (...args) => console.log(...args),\n warning: (...args) => (console.warn ? console.warn(...args) : console.log(...args)),\n error: (...args) => console.error(...args),\n debug: (...args) => (console.debug ? console.debug(...args) : console.log(...args)),\n};\n\nconst resolveLogMethod = (logger, name) => {\n if (logger && typeof logger[name] === 'function') {\n return logger[name].bind(logger);\n }\n if (name === 'warning' && logger && typeof logger.warn === 'function') {\n return logger.warn.bind(logger);\n }\n return fallbackLog[name];\n};\n\nlet defaultLogger = null;\n\nexport const setDefaultLogger = (logger) => {\n defaultLogger = logger;\n};\n\n// Lazy resolver: always checks current state\nconst resolveLogger = (explicitLogger) => {\n if (explicitLogger && typeof explicitLogger.info === 'function') {\n return explicitLogger;\n }\n if (defaultLogger && typeof defaultLogger.info === 'function') {\n return defaultLogger;\n }\n return fallbackLog;\n};\n\nconst ANSI = {\n reset: '\\x1b[0m',\n gray: '\\x1b[90m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n cyan: '\\x1b[36m',\n};\n\nconst colorize = (text, color) => {\n if (!text || !color) return text;\n return `${color}${text}${ANSI.reset}`;\n};\n\nexport const createBaseLogger = (prefix = '', explicitLogger) => {\n const name = prefix ? String(prefix) : '';\n\n const dispatch = (methodName, icon, message, color) => {\n const logger = resolveLogger(explicitLogger);\n const logFn = resolveLogMethod(logger, methodName);\n const timestamp = colorize(`[${formatTimestamp()}]`, ANSI.gray);\n const line = formatLine(name, icon, message);\n const coloredLine = colorize(line, color);\n logFn(`${timestamp} ${coloredLine}`.trim());\n };\n\n return {\n info: (message) => dispatch('info', '\uD83D\uDCD6', message, ANSI.cyan),\n success: (message) => dispatch('info', '\u2705', message, ANSI.green),\n warning: (message) => dispatch('warning', '\u26A0\uFE0F', message, ANSI.yellow),\n warn: (message) => dispatch('warning', '\u26A0\uFE0F', message, ANSI.yellow),\n error: (message) => dispatch('error', '\u274C', message, ANSI.red),\n debug: (message) => dispatch('debug', '\uD83D\uDD39', message, ANSI.gray),\n start: (message) => dispatch('info', '\uD83D\uDD37', message, ANSI.blue),\n };\n};\n\n/**\n * \u521B\u5EFA\u6A21\u5757\u7EA7\u65E5\u5FD7\u5668\n * @param {string} moduleName - \u6A21\u5757\u540D\u79F0\n * @param {object} [logger] - \u53EF\u9009\u7684\u663E\u5F0F\u65E5\u5FD7\u5668\uFF0C\u901A\u5E38\u4E0D\u9700\u8981\u4F20\uFF0C\u4F1A\u81EA\u52A8\u4F7F\u7528 setDefaultLogger \u8BBE\u7F6E\u7684\u5168\u5C40\u65E5\u5FD7\u5668\n */\nexport function createInternalLogger(moduleName, explicitLogger) {\n const baseLogger = createBaseLogger(moduleName, explicitLogger);\n\n return {\n start(methodName, params = '') {\n const paramStr = params ? ` (${params})` : '';\n baseLogger.start(`${methodName} \u5F00\u59CB${paramStr}`);\n },\n success(methodName, result = '') {\n const resultStr = result ? ` (${result})` : '';\n baseLogger.success(`${methodName} \u5B8C\u6210${resultStr}`);\n },\n fail(methodName, error) {\n const message = error instanceof Error ? error.message : error;\n baseLogger.error(`${methodName} \u5931\u8D25: ${message}`);\n },\n debug(message) {\n baseLogger.debug(message);\n },\n warn(message) {\n baseLogger.warning(message);\n },\n warning(message) {\n baseLogger.warning(message);\n },\n info(message) {\n baseLogger.info(message);\n },\n error(message) {\n baseLogger.error(message);\n }\n };\n}\n", "import delay from 'delay';\nimport { Device, normalizeDevice } from '../constants.js';\nimport { PageRuntimeStateKey } from './constants.js';\nimport { createInternalLogger } from './logger.js';\nimport { resolveCurrentViewportSize } from './viewport.js';\n\nconst logger = createInternalLogger('Screenshot');\n\nconst DEFAULT_TIMEOUT_MS = 5000;\nconst FORCED_FULLPAGE_TYPE = 'jpeg';\nconst FORCED_FULLPAGE_QUALITY = 50;\nconst SUPPORTED_TYPES = new Set(['png', 'jpeg', 'webp']);\nconst EXPANDED_SCROLLABLE_CLASS = '__pk_expanded__';\nconst DEFAULT_MAX_HEIGHT = 8000;\nconst DEFAULT_SETTLE_MS = 1000;\nconst DEFAULT_MOBILE_SETTLE_MS = 50;\n\nconst toPositiveNumber = (value, fallback = 0) => {\n const n = Number(value);\n if (!Number.isFinite(n) || n <= 0) return fallback;\n return n;\n};\n\nconst toPositiveInteger = (value, fallback = 0) => {\n const number = Math.round(Number(value) || 0);\n return number > 0 ? number : fallback;\n};\n\nconst normalizeType = (value) => {\n const raw = String(value || 'png').trim().toLowerCase();\n if (!SUPPORTED_TYPES.has(raw)) return 'png';\n return raw;\n};\n\nconst normalizeQuality = (value, type) => {\n if (type !== 'jpeg' && type !== 'webp') return undefined;\n const n = Number(value);\n if (!Number.isFinite(n)) return undefined;\n const rounded = Math.round(n);\n if (rounded < 0 || rounded > 100) return undefined;\n return rounded;\n};\n\nconst resolvePageDevice = (page) => normalizeDevice(page?.[PageRuntimeStateKey]?.device);\n\nconst buildFullPageClip = (metrics, viewport, maxClipHeight) => {\n const contentSize = metrics && typeof metrics === 'object'\n ? metrics.contentSize || null\n : null;\n\n const width = Math.max(1, Math.ceil(viewport.width || contentSize?.width || 1));\n let height = Math.max(1, Math.ceil(contentSize?.height || viewport.height || 1));\n\n if (maxClipHeight > 0) {\n height = Math.min(height, maxClipHeight);\n }\n\n return {\n x: 0,\n y: 0,\n width,\n height,\n scale: 1,\n };\n};\n\nconst expandScrollableContent = async (page, options = {}) => {\n // \u53EA\u5C55\u5F00\u5F53\u524D\u201C\u53EF\u89C1\u201D\u7684\u6EDA\u52A8\u5BB9\u5668\uFF0C\u907F\u514D\u628A\u9690\u85CF\u9762\u677F / \u6298\u53E0\u533A\u57DF\u4E5F\u7B97\u8FDB\u622A\u56FE\u9AD8\u5EA6\u3002\n return await page.evaluate(({ className, forceScrollableHeight, visibleOnly, expandDocumentElements }) => {\n const body = document.body;\n const root = document.documentElement;\n const scrollingElement = document.scrollingElement;\n const candidates = [];\n const seen = new Set();\n let maxHeight = window.innerHeight || 0;\n\n const pushCandidate = (el) => {\n if (!el || seen.has(el)) return;\n seen.add(el);\n candidates.push(el);\n };\n\n pushCandidate(scrollingElement);\n pushCandidate(root);\n pushCandidate(body);\n document.querySelectorAll('*').forEach(pushCandidate);\n\n const scrollableOverflow = new Set(['auto', 'scroll', 'overlay']);\n const clippingOverflow = new Set(['hidden', 'clip']);\n const isDocumentElement = (el) => el === root || el === body || el === scrollingElement;\n\n const isVisible = (el, style, rect) => {\n if (!el || !style || !rect) return false;\n if (style.display === 'none' || style.visibility === 'hidden' || style.visibility === 'collapse') {\n return false;\n }\n if (Number(style.opacity) === 0) return false;\n return rect.width > 0 && rect.height > 0;\n };\n\n const hasOverflowValue = (style, values) => {\n const overflowY = String(style?.overflowY || '').toLowerCase();\n const overflow = String(style?.overflow || '').toLowerCase();\n return values.has(overflowY) || values.has(overflow);\n };\n\n const isLargeVerticalClipper = (el, rect) => {\n if (!el || !rect) return false;\n\n const viewportHeight = window.innerHeight || 0;\n const visibleHeight = Math.ceil(rect.height || 0);\n const clientHeight = Math.ceil(el.clientHeight || 0);\n const boxHeight = Math.max(visibleHeight, clientHeight);\n\n // hidden/clip \u901A\u5E38\u662F\u56FE\u7247\u3001\u89C6\u9891\u3001\u5361\u7247\u7684\u89C6\u89C9\u88C1\u526A\uFF0C\u4E0D\u80FD\u9ED8\u8BA4\u653E\u5F00\u3002\n // \u53EA\u6709\u63A5\u8FD1 viewport \u7684\u7EB5\u5411\u5E03\u5C40\u58F3\uFF0C\u624D\u8BA4\u4E3A\u662F app shell \u7C7B\u88C1\u526A\u5C42\u3002\n return boxHeight >= Math.max(320, viewportHeight * 0.45);\n };\n\n const hasLargeVerticalOverflow = (el, rect) => {\n if (!isLargeVerticalClipper(el, rect)) return false;\n\n const viewportHeight = window.innerHeight || 0;\n const scrollHeight = Math.ceil(el.scrollHeight || 0);\n const clientHeight = Math.ceil(el.clientHeight || 0);\n const overflowDelta = scrollHeight - clientHeight;\n\n return overflowDelta >= Math.max(160, viewportHeight * 0.18);\n };\n\n const rememberOriginalBoxStyles = (el, { includeDocumentElement = false } = {}) => {\n if (!el || (!includeDocumentElement && isDocumentElement(el)) || el.classList.contains(className)) {\n return;\n }\n\n el.dataset.pkOrigOverflow = el.style.overflow;\n el.dataset.pkOrigOverflowPriority = el.style.getPropertyPriority('overflow') || '';\n el.dataset.pkOrigHeight = el.style.height;\n el.dataset.pkOrigHeightPriority = el.style.getPropertyPriority('height') || '';\n el.dataset.pkOrigMinHeight = el.style.minHeight;\n el.dataset.pkOrigMinHeightPriority = el.style.getPropertyPriority('min-height') || '';\n el.dataset.pkOrigMaxHeight = el.style.maxHeight;\n el.dataset.pkOrigMaxHeightPriority = el.style.getPropertyPriority('max-height') || '';\n el.classList.add(className);\n };\n\n const expandDocumentElementsToHeight = (height) => {\n if (!expandDocumentElements) return;\n\n const targetHeight = Math.ceil(Number(height) || 0);\n if (targetHeight <= 0) return;\n\n [root, body, scrollingElement].forEach((el) => {\n if (!el) return;\n\n // \u79FB\u52A8\u7AEF\u4FDD\u7559\u771F\u5B9E viewport \u622A\u957F\u56FE\u65F6\uFF0Chtml/body \u5E38\u89C1\u7684 100% + overflow:hidden\n // \u4ECD\u4F1A\u88C1\u6389\u5DF2\u5C55\u5F00\u7684\u5185\u5BB9\u533A\uFF1B\u8FD9\u91CC\u628A\u6587\u6863\u5C42\u88C1\u526A\u58F3\u4E5F\u7EB3\u5165\u53EF\u6062\u590D\u7684\u5C55\u5F00\u8303\u56F4\u3002\n rememberOriginalBoxStyles(el, { includeDocumentElement: true });\n el.style.setProperty('overflow', 'visible', 'important');\n el.style.setProperty('height', `${targetHeight}px`, 'important');\n el.style.setProperty('min-height', `${targetHeight}px`, 'important');\n el.style.setProperty('max-height', 'none', 'important');\n });\n };\n\n const isScrollableY = (el, style, rect) => {\n if (!el || el.scrollHeight <= el.clientHeight + 1) {\n return false;\n }\n\n if (isDocumentElement(el)) {\n return true;\n }\n\n if (hasOverflowValue(style, scrollableOverflow)) {\n return true;\n }\n\n return hasOverflowValue(style, clippingOverflow) && hasLargeVerticalOverflow(el, rect);\n };\n\n const measureNeededHeight = (el) => {\n if (!el) return 0;\n const scrollHeight = Math.ceil(el.scrollHeight || 0);\n if (scrollHeight <= 0) return 0;\n\n if (isDocumentElement(el)) {\n return scrollHeight;\n }\n\n const rect = el.getBoundingClientRect();\n if (!rect || rect.width <= 0 || rect.height <= 0) {\n return 0;\n }\n\n const documentTop = Math.max(0, Math.ceil(rect.top + (window.scrollY || window.pageYOffset || 0)));\n return documentTop + scrollHeight;\n };\n\n const scrollableElements = [];\n const expandedAncestors = [];\n\n const expandElementToScrollHeight = (el) => {\n if (!el || isDocumentElement(el)) return;\n const scrollHeight = Math.ceil(el.scrollHeight || 0);\n if (scrollHeight <= 0) return;\n\n rememberOriginalBoxStyles(el);\n el.style.setProperty('overflow', 'visible', 'important');\n el.style.setProperty('height', `${scrollHeight}px`, 'important');\n el.style.setProperty('min-height', `${scrollHeight}px`, 'important');\n el.style.setProperty('max-height', 'none', 'important');\n };\n\n const expandClippingAncestors = (el) => {\n for (let node = el?.parentElement; node && !isDocumentElement(node); node = node.parentElement) {\n const style = window.getComputedStyle(node);\n const rect = node.getBoundingClientRect();\n if (!isVisible(node, style, rect)) continue;\n\n const scrollableClip = hasOverflowValue(style, scrollableOverflow);\n const visualClip = hasOverflowValue(style, clippingOverflow);\n if (!scrollableClip && (!visualClip || !isLargeVerticalClipper(node, rect))) continue;\n\n rememberOriginalBoxStyles(node);\n node.style.setProperty('overflow', 'visible', 'important');\n node.style.setProperty('max-height', 'none', 'important');\n expandedAncestors.push(node);\n }\n };\n\n const expandAncestorsToCurrentScrollHeight = () => {\n // \u5B50\u6EDA\u52A8\u533A\u5C55\u5F00\u540E\uFF0C100vh / flex \u5916\u58F3\u7684 scrollHeight \u624D\u4F1A\u53D8\u5927\uFF1B\u4ECE\u5185\u5230\u5916\u6491\u5F00\u53EF\u907F\u514D\u7236\u7EA7\u7EE7\u7EED\u88C1\u526A\u3002\n const ancestors = [...new Set(expandedAncestors)];\n for (let pass = 0; pass < 2; pass += 1) {\n ancestors.forEach((node) => {\n if (!node || isDocumentElement(node)) return;\n const scrollHeight = Math.ceil(node.scrollHeight || 0);\n if (scrollHeight <= node.clientHeight + 1) return;\n\n rememberOriginalBoxStyles(node);\n node.style.setProperty('height', `${scrollHeight}px`, 'important');\n node.style.setProperty('min-height', `${scrollHeight}px`, 'important');\n node.style.setProperty('max-height', 'none', 'important');\n });\n }\n };\n\n const measureExpandedRenderedBottom = () => {\n let renderedBottom = maxHeight;\n const scrollY = window.scrollY || window.pageYOffset || 0;\n\n candidates.forEach((el) => {\n if (!el || isDocumentElement(el)) return;\n if (!el.classList.contains(className) && !el.closest(`.${className}`)) return;\n\n const style = window.getComputedStyle(el);\n const rect = el.getBoundingClientRect();\n if (!isVisible(el, style, rect)) return;\n\n renderedBottom = Math.max(renderedBottom, Math.ceil(rect.bottom + scrollY));\n });\n\n return renderedBottom;\n };\n\n const measureDocumentScrollHeight = () => {\n return Math.max(\n maxHeight,\n Math.ceil(root?.scrollHeight || 0),\n Math.ceil(body?.scrollHeight || 0),\n Math.ceil(scrollingElement?.scrollHeight || 0),\n );\n };\n\n candidates.forEach((el) => {\n const style = window.getComputedStyle(el);\n const rect = el.getBoundingClientRect();\n\n if (visibleOnly && !isVisible(el, style, rect)) {\n return;\n }\n\n if (!isScrollableY(el, style, rect)) {\n return;\n }\n\n const neededHeight = measureNeededHeight(el);\n if (neededHeight <= 0) {\n return;\n }\n\n if (neededHeight > maxHeight) {\n maxHeight = neededHeight;\n }\n\n scrollableElements.push(el);\n\n if (isDocumentElement(el)) {\n return;\n }\n\n expandClippingAncestors(el);\n\n if (forceScrollableHeight) {\n expandElementToScrollHeight(el);\n return;\n }\n\n rememberOriginalBoxStyles(el);\n el.style.overflow = 'visible';\n el.style.height = 'auto';\n el.style.maxHeight = 'none';\n });\n\n expandAncestorsToCurrentScrollHeight();\n\n // \u5C55\u5F00\u5B50\u5BB9\u5668\u540E\uFF0C\u7236\u7EA7/\u6587\u6863\u9AD8\u5EA6\u53EF\u80FD\u968F\u5E03\u5C40\u91CD\u65B0\u8BA1\u7B97\uFF1B\u8FD9\u91CC\u518D\u6D4B\u4E00\u8F6E\u907F\u514D\u4F4E\u4F30\u3002\n scrollableElements.forEach((el) => {\n const neededHeight = measureNeededHeight(el);\n if (neededHeight > maxHeight) {\n maxHeight = neededHeight;\n }\n });\n\n maxHeight = Math.max(maxHeight, measureDocumentScrollHeight(), measureExpandedRenderedBottom());\n\n if (expandDocumentElements) {\n for (let pass = 0; pass < 2; pass += 1) {\n expandDocumentElementsToHeight(maxHeight);\n maxHeight = Math.max(maxHeight, measureDocumentScrollHeight(), measureExpandedRenderedBottom());\n }\n }\n\n return Math.ceil(maxHeight);\n }, {\n className: EXPANDED_SCROLLABLE_CLASS,\n forceScrollableHeight: options.forceScrollableHeight !== false,\n visibleOnly: options.visibleOnly !== false,\n expandDocumentElements: options.expandDocumentElements === true,\n });\n};\n\nconst adjustAffixedElementsForExpandedScreenshot = async (page, options = {}) => {\n return await page.evaluate(({ className, targetHeight }) => {\n const viewportWidth = window.innerWidth\n || document.documentElement?.clientWidth\n || document.body?.clientWidth\n || 0;\n const viewportHeight = window.innerHeight\n || document.documentElement?.clientHeight\n || document.body?.clientHeight\n || 0;\n const scrollY = window.scrollY || window.pageYOffset || 0;\n const safeTargetHeight = Math.ceil(Number(targetHeight) || 0);\n\n if (safeTargetHeight <= viewportHeight + 1) {\n return 0;\n }\n\n const hasOwn = (source, key) => Object.prototype.hasOwnProperty.call(source, key);\n const isVisible = (el, style, rect) => {\n if (!el || !style || !rect) return false;\n if (style.display === 'none' || style.visibility === 'hidden' || style.visibility === 'collapse') {\n return false;\n }\n if (Number(style.opacity) === 0) return false;\n return rect.width > 0 && rect.height > 0;\n };\n\n const edgeThreshold = Math.max(24, Math.min(96, viewportHeight * 0.12));\n const maxAffixedHeight = Math.max(56, viewportHeight * 0.65);\n const candidates = [];\n\n document.querySelectorAll('*').forEach((el) => {\n const style = window.getComputedStyle(el);\n const position = String(style.position || '').toLowerCase();\n if (position !== 'fixed' && position !== 'sticky') return;\n\n const rect = el.getBoundingClientRect();\n if (!isVisible(el, style, rect)) return;\n if (rect.height > maxAffixedHeight) return;\n if (rect.width < viewportWidth * 0.25 && rect.height < 80) return;\n\n const top = Number.parseFloat(style.top);\n const bottom = Number.parseFloat(style.bottom);\n const hasTopRule = Number.isFinite(top) && top <= Math.max(160, viewportHeight * 0.25);\n const hasBottomRule = Number.isFinite(bottom) && bottom <= Math.max(160, viewportHeight * 0.25);\n const isNearViewportTop = rect.top <= edgeThreshold;\n const isNearViewportBottom = rect.bottom >= viewportHeight - edgeThreshold;\n const edge = (hasBottomRule || isNearViewportBottom) && !(hasTopRule || isNearViewportTop)\n ? 'bottom'\n : 'top';\n\n if (position === 'fixed' && edge === 'top' && !hasTopRule && !isNearViewportTop) return;\n if (position === 'fixed' && edge === 'bottom' && !hasBottomRule && !isNearViewportBottom) return;\n if (position === 'sticky' && !hasTopRule && !hasBottomRule && !isNearViewportTop && !isNearViewportBottom) return;\n\n candidates.push({ el, position, edge });\n });\n\n const candidateSet = new Set(candidates.map(({ el }) => el));\n const topLevelCandidates = candidates.filter(({ el }) => {\n for (let parent = el.parentElement; parent; parent = parent.parentElement) {\n if (candidateSet.has(parent)) return false;\n }\n return true;\n });\n\n topLevelCandidates.forEach(({ el, position, edge }) => {\n if (!hasOwn(el.dataset, 'pkAffixedAdjusted')) {\n el.dataset.pkAffixedAdjusted = '1';\n el.dataset.pkOrigPosition = el.style.getPropertyValue('position') || '';\n el.dataset.pkOrigPositionPriority = el.style.getPropertyPriority('position') || '';\n el.dataset.pkOrigTop = el.style.getPropertyValue('top') || '';\n el.dataset.pkOrigTopPriority = el.style.getPropertyPriority('top') || '';\n el.dataset.pkOrigBottom = el.style.getPropertyValue('bottom') || '';\n el.dataset.pkOrigBottomPriority = el.style.getPropertyPriority('bottom') || '';\n el.dataset.pkOrigTranslate = el.style.getPropertyValue('translate') || '';\n el.dataset.pkOrigTranslatePriority = el.style.getPropertyPriority('translate') || '';\n }\n\n el.classList.add(className);\n if (position === 'fixed') {\n // CDP \u957F\u622A\u56FE\u4F1A\u628A fixed \u5143\u7D20\u753B\u5728\u5F53\u524D viewport \u5BF9\u5E94\u7684\u6587\u6863 y \u4E0A\u3002\n // \u6309 scrollY \u6295\u5F71\u56DE\u6574\u5F20\u622A\u56FE\u7684\u9876\u90E8/\u5E95\u90E8\uFF0C\u907F\u514D\u5B83\u6F02\u5728\u5F53\u524D\u6EDA\u52A8\u4F4D\u7F6E\u3002\n const deltaY = edge === 'bottom'\n ? safeTargetHeight - viewportHeight - scrollY\n : -scrollY;\n if (Math.abs(deltaY) > 1) {\n el.style.setProperty('translate', `0 ${Math.round(deltaY)}px`, 'important');\n }\n return;\n }\n\n // sticky \u5143\u7D20\u672C\u6765\u5728\u6587\u6863\u6D41\u91CC\uFF1B\u957F\u622A\u56FE\u91CC\u4E0D\u5E94\u6309\u5F53\u524D viewport \u7C98\u4F4F\u3002\n // \u4E34\u65F6\u89E3 sticky\uFF0C\u8BA9\u5B83\u56DE\u5230\u81EA\u7136\u6587\u6863\u4F4D\u7F6E\uFF0C\u907F\u514D\u4E2D\u95F4\u60AC\u6D6E\u6216\u5E95\u90E8\u91CD\u590D\u3002\n el.style.setProperty('position', 'relative', 'important');\n el.style.setProperty('top', 'auto', 'important');\n el.style.setProperty('bottom', 'auto', 'important');\n });\n\n return topLevelCandidates.length;\n }, {\n className: EXPANDED_SCROLLABLE_CLASS,\n targetHeight: options.targetHeight,\n });\n};\n\nconst restoreAffixedElementsForExpandedScreenshot = async (page) => {\n await page.evaluate((className) => {\n const hasOwn = (source, key) => Object.prototype.hasOwnProperty.call(source, key);\n const expansionKeys = [\n 'pkOrigOverflow',\n 'pkOrigHeight',\n 'pkOrigMinHeight',\n 'pkOrigMaxHeight',\n ];\n\n document.querySelectorAll('[data-pk-affixed-adjusted=\"1\"]').forEach((el) => {\n if (hasOwn(el.dataset, 'pkOrigPosition')) {\n el.style.setProperty('position', el.dataset.pkOrigPosition || '', el.dataset.pkOrigPositionPriority || '');\n delete el.dataset.pkOrigPosition;\n delete el.dataset.pkOrigPositionPriority;\n }\n if (hasOwn(el.dataset, 'pkOrigTop')) {\n el.style.setProperty('top', el.dataset.pkOrigTop || '', el.dataset.pkOrigTopPriority || '');\n delete el.dataset.pkOrigTop;\n delete el.dataset.pkOrigTopPriority;\n }\n if (hasOwn(el.dataset, 'pkOrigBottom')) {\n el.style.setProperty('bottom', el.dataset.pkOrigBottom || '', el.dataset.pkOrigBottomPriority || '');\n delete el.dataset.pkOrigBottom;\n delete el.dataset.pkOrigBottomPriority;\n }\n if (hasOwn(el.dataset, 'pkOrigTranslate')) {\n el.style.setProperty('translate', el.dataset.pkOrigTranslate || '', el.dataset.pkOrigTranslatePriority || '');\n delete el.dataset.pkOrigTranslate;\n delete el.dataset.pkOrigTranslatePriority;\n }\n\n delete el.dataset.pkAffixedAdjusted;\n\n const stillExpanded = expansionKeys.some((key) => hasOwn(el.dataset, key));\n if (!stillExpanded) {\n el.classList.remove(className);\n }\n });\n }, EXPANDED_SCROLLABLE_CLASS);\n};\n\nconst prepareExpandedFullPageScreenshot = async (page, options = {}) => {\n const originalViewport = await resolveCurrentViewportSize(page);\n const maxHeight = toPositiveInteger(options.maxHeight, DEFAULT_MAX_HEIGHT);\n const preserveViewport = options.preserveViewport ?? resolvePageDevice(page) === Device.Mobile;\n const defaultSettleMs = preserveViewport ? DEFAULT_MOBILE_SETTLE_MS : DEFAULT_SETTLE_MS;\n const requestedSettleMs = Math.max(0, Number(options.settleMs ?? defaultSettleMs) || 0);\n const settleMs = preserveViewport\n ? Math.min(requestedSettleMs, DEFAULT_MOBILE_SETTLE_MS)\n : requestedSettleMs;\n\n // \u5148\u628A\u53EF\u89C1\u6EDA\u52A8\u533A\u57DF\u6491\u5F00\uFF0C\u518D\u4EA4\u7ED9\u7EDF\u4E00\u7684 CDP screenshot \u539F\u8BED\u3002\n // \u684C\u9762\u7AEF\u6CBF\u7528\u5386\u53F2\u884C\u4E3A\uFF1A\u628A viewport \u8C03\u9AD8\uFF0C\u517C\u5BB9\u4F9D\u8D56 100%/100vh \u81EA\u7136\u91CD\u6392\u7684\u9875\u9762\u3002\n // \u79FB\u52A8\u7AEF\u4FDD\u7559\u771F\u5B9E viewport\uFF1A\u79FB\u52A8\u7AD9\u5E38\u5728 resize \u540E\u91CD\u7B97\u865A\u62DF\u5217\u8868\u6216 app shell\uFF0C\n // \u5982\u679C\u628A viewport \u62C9\u5230\u51E0\u5343\u50CF\u7D20\uFF0C\u5BB9\u6613\u53EA\u5269\u9996\u5C4F\u5185\u5BB9\u3001\u4E0B\u65B9\u53D8\u767D\u3002\n // \u540C\u65F6\u79FB\u52A8\u7AEF CDP \u957F\u622A\u56FE\u7B49\u5F85\u8FC7\u4E45\u4F1A\u77ED\u6682\u66B4\u9732 1x1 visualViewport\uFF1B\n // \u654F\u611F\u9875\u9762\u7684 resize handler \u4F1A\u628A\u6B63\u6587\u538B\u6210\u7A84\u5217\uFF0C\u6240\u4EE5\u79FB\u52A8\u7AEF settle \u9700\u8981\u77ED\u7A97\u53E3\u3002\n const maxScrollHeight = await expandScrollableContent(page, {\n forceScrollableHeight: options.forceScrollableHeight,\n visibleOnly: options.visibleOnly !== false,\n expandDocumentElements: preserveViewport,\n });\n const targetHeight = Math.min(maxScrollHeight, maxHeight);\n\n let viewportResized = false;\n if (!preserveViewport) {\n await page.setViewportSize({\n width: originalViewport.width,\n height: targetHeight,\n });\n viewportResized = true;\n } else {\n await adjustAffixedElementsForExpandedScreenshot(page, { targetHeight }).catch((error) => {\n logger.warning(`\u79FB\u52A8\u7AEF\u5438\u9644\u5143\u7D20\u91CD\u5B9A\u4F4D\u5931\u8D25: ${error?.message || error}`);\n });\n }\n\n if (settleMs > 0) {\n await delay(settleMs);\n }\n\n return {\n originalViewport,\n maxScrollHeight,\n targetHeight,\n preserveViewport,\n viewportResized,\n };\n};\n\nconst restoreExpandedFullPageScreenshot = async (page, state = {}) => {\n // \u8FD8\u539F\u65F6\u53EA\u64A4\u9500\u672C\u6B21\u6CE8\u5165\u7684 inline \u6837\u5F0F\u548C\u6807\u8BB0\u7C7B\uFF0C\u4E0D\u78B0\u9875\u9762\u81EA\u5DF1\u7684\u771F\u5B9E\u6837\u5F0F\u6765\u6E90\u3002\n await page.evaluate((className) => {\n const targets = new Set([\n ...document.querySelectorAll(`.${className}`),\n document.documentElement,\n document.body,\n document.scrollingElement,\n ].filter((el) => el?.classList?.contains(className)));\n\n targets.forEach((el) => {\n el.style.setProperty('overflow', el.dataset.pkOrigOverflow || '', el.dataset.pkOrigOverflowPriority || '');\n el.style.setProperty('height', el.dataset.pkOrigHeight || '', el.dataset.pkOrigHeightPriority || '');\n el.style.setProperty('min-height', el.dataset.pkOrigMinHeight || '', el.dataset.pkOrigMinHeightPriority || '');\n el.style.setProperty('max-height', el.dataset.pkOrigMaxHeight || '', el.dataset.pkOrigMaxHeightPriority || '');\n\n delete el.dataset.pkOrigOverflow;\n delete el.dataset.pkOrigOverflowPriority;\n delete el.dataset.pkOrigHeight;\n delete el.dataset.pkOrigHeightPriority;\n delete el.dataset.pkOrigMinHeight;\n delete el.dataset.pkOrigMinHeightPriority;\n delete el.dataset.pkOrigMaxHeight;\n delete el.dataset.pkOrigMaxHeightPriority;\n el.classList.remove(className);\n });\n }, EXPANDED_SCROLLABLE_CLASS);\n\n if (state?.originalViewport && state?.viewportResized) {\n await page.setViewportSize(state.originalViewport);\n }\n};\n\nexport const capturePageScreenshot = async (page, options = {}) => {\n // \u8FD9\u662F\u5E95\u5C42\u622A\u56FE\u539F\u8BED\uFF1A\u4F18\u5148\u8D70 CDP\uFF0C\u5931\u8D25\u540E\u56DE\u9000\u5230 page.screenshot\u3002\n // \u4E0A\u5C42\u662F\u5426\u5C55\u5F00\u6EDA\u52A8\u3001\u662F\u5426 fullPage\uFF0C\u7531\u8C03\u7528\u65B9\u81EA\u5DF1\u51B3\u5B9A\u3002\n const fullPage = Boolean(options.fullPage);\n const type = fullPage ? FORCED_FULLPAGE_TYPE : normalizeType(options.type);\n const quality = fullPage\n ? FORCED_FULLPAGE_QUALITY\n : normalizeQuality(options.quality, type);\n const timeout = toPositiveNumber(options.timeout, DEFAULT_TIMEOUT_MS);\n const maxClipHeight = Math.round(toPositiveNumber(options.maxClipHeight, 0));\n\n const fallbackOptions = {\n type: type === 'webp' ? 'png' : type,\n fullPage,\n };\n if (quality !== undefined && fallbackOptions.type === 'jpeg') {\n fallbackOptions.quality = quality;\n }\n if (timeout > 0) {\n fallbackOptions.timeout = timeout;\n }\n\n try {\n const context = page && typeof page.context === 'function' ? page.context() : null;\n if (!context || typeof context.newCDPSession !== 'function') {\n throw new Error('CDP session is not available');\n }\n\n const session = await context.newCDPSession(page);\n try {\n const metrics = await session.send('Page.getLayoutMetrics');\n const viewport = await resolveCurrentViewportSize(page);\n\n const captureParams = {\n format: type,\n fromSurface: true,\n captureBeyondViewport: fullPage,\n optimizeForSpeed: true,\n };\n\n if (quality !== undefined) {\n captureParams.quality = quality;\n }\n\n if (fullPage) {\n captureParams.clip = buildFullPageClip(metrics, viewport, maxClipHeight);\n }\n\n const result = await session.send('Page.captureScreenshot', captureParams);\n if (!result || typeof result.data !== 'string' || !result.data) {\n throw new Error('CDP returned empty screenshot data');\n }\n\n return Buffer.from(result.data, 'base64');\n } finally {\n if (typeof session.detach === 'function') {\n await session.detach().catch(() => { });\n }\n }\n } catch (error) {\n logger.warning(`CDP \u622A\u56FE\u5931\u8D25\uFF0C\u56DE\u9000 page.screenshot: ${error?.message || error}`);\n return await page.screenshot(fallbackOptions);\n }\n};\n\nexport const captureExpandedFullPageScreenshot = async (page, options = {}) => {\n // \u8FD9\u4E2A\u5305\u88C5\u5668\u53EA\u8D1F\u8D23\u201C\u5148\u5C55\u5F00\uFF0C\u518D\u622A\u56FE\uFF0C\u518D\u53EF\u9009\u6062\u590D\u201D\u3002\n const state = await prepareExpandedFullPageScreenshot(page, options);\n\n try {\n return await capturePageScreenshot(page, {\n fullPage: true,\n type: options.type || 'png',\n quality: options.quality,\n timeout: options.timeout,\n maxClipHeight: state.targetHeight,\n });\n } finally {\n await restoreAffixedElementsForExpandedScreenshot(page).catch((error) => {\n logger.warning(`\u79FB\u52A8\u7AEF\u5438\u9644\u5143\u7D20\u6062\u590D\u5931\u8D25: ${error?.message || error}`);\n });\n\n if (options.restore) {\n await restoreExpandedFullPageScreenshot(page, state);\n }\n }\n};\n", "export const PageRuntimeStateKey = '__playwright_toolkit_runtime_state__';\n", "const toPositiveInt = (value) => {\n const number = Math.round(Number(value) || 0);\n return number > 0 ? number : 0;\n};\n\nexport const resolveCurrentViewportSize = async (page, fallback = {}) => {\n const directViewport = page?.viewportSize?.();\n const directWidth = toPositiveInt(directViewport?.width);\n const directHeight = toPositiveInt(directViewport?.height);\n\n if (directWidth && directHeight) {\n return {\n width: directWidth,\n height: directHeight,\n };\n }\n\n const measuredViewport = await page?.evaluate?.(() => ({\n width: window.innerWidth\n || document.documentElement?.clientWidth\n || document.body?.clientWidth\n || 0,\n height: window.innerHeight\n || document.documentElement?.clientHeight\n || document.body?.clientHeight\n || 0,\n })).catch(() => null);\n\n const fallbackWidth = toPositiveInt(fallback?.width);\n const fallbackHeight = toPositiveInt(fallback?.height);\n\n return {\n width: toPositiveInt(measuredViewport?.width) || fallbackWidth || 1,\n height: toPositiveInt(measuredViewport?.height) || fallbackHeight || 1,\n };\n};\n", "/**\n * \u722C\u866B\u81EA\u5B9A\u4E49\u9519\u8BEF\u7C7B\n * \u7528\u4E8E\u643A\u5E26\u4E0A\u4E0B\u6587\u4FE1\u606F\uFF0C\u5728 pushFailed \u65F6\u81EA\u52A8\u89E3\u6790\n */\n\nimport { serializeError } from \"serialize-error\";\nimport { Code } from \"./constants\";\n\n/**\n * CrawlerError - \u81EA\u5B9A\u4E49\u722C\u866B\u9519\u8BEF\u7C7B\n * \n * @example\n * // \u7B80\u5355\u7528\u6CD5 (\u53EA\u6709 message)\n * throw new CrawlerError('\u672A\u6355\u83B7 Feed \u63A5\u53E3\u54CD\u5E94');\n * \n * @example\n * // \u5B8C\u6574\u7528\u6CD5 (\u5E26 code \u548C context)\n * throw new CrawlerError({\n * message: '\u767B\u5F55\u5931\u8D25',\n * code: ErrorKeygen.NotLogin,\n * context: { url: currentUrl, userId: '123' }\n * });\n */\nexport class CrawlerError extends Error {\n /**\n * @param {string|Object} info - \u9519\u8BEF\u4FE1\u606F\u5B57\u7B26\u4E32\u6216\u914D\u7F6E\u5BF9\u8C61\n * @param {string} info.message - \u9519\u8BEF\u4FE1\u606F\n * @param {number} [info.code] - ErrorKeygen \u679A\u4E3E\u503C\uFF08\u7528\u4E8E\u9519\u8BEF\u5206\u7C7B\uFF09\n * @param {Object} [info.context] - \u4E0A\u4E0B\u6587\u4FE1\u606F\u5BF9\u8C61\n */\n constructor(info) {\n // \u517C\u5BB9 string\n if (typeof info === 'string') {\n info = { message: info };\n }\n\n // \u26A0\uFE0F super() \u5FC5\u987B\u5728\u8BBF\u95EE this \u4E4B\u524D\u8C03\u7528\n super(info.message);\n\n this.name = 'CrawlerError';\n this.code = info.code ?? Code.UnknownError;\n this.context = info.context ?? {};\n this.timestamp = new Date().toISOString();\n\n // \u7EF4\u62A4\u6B63\u786E\u7684\u5806\u6808\u8DDF\u8E2A\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, CrawlerError);\n }\n }\n\n /**\n * \u8F6C\u6362\u4E3A\u53EF\u63A8\u9001\u7684\u6570\u636E\u5BF9\u8C61\n * @returns {Object}\n */\n toJSON() {\n return serializeError(this)\n }\n\n /**\n * \u68C0\u67E5\u4E00\u4E2A error \u662F\u5426\u662F CrawlerError\n * @param {Error} error\n * @returns {boolean}\n */\n static isCrawlerError(error) {\n return error instanceof CrawlerError || error?.name === 'CrawlerError';\n }\n\n /**\n * \u4ECE\u666E\u901A Error \u521B\u5EFA CrawlerError\n * @param {Error} error - \u539F\u59CB\u9519\u8BEF\n * @param {Object} [options={}] - \u9009\u9879\u5BF9\u8C61 (\u5305\u542B code \u548C context)\n * @returns {CrawlerError}\n */\n static from(error, options = {}) {\n const crawlerError = new CrawlerError({\n message: error.message,\n ...options\n });\n crawlerError.stack = error.stack;\n return crawlerError;\n }\n}\n\n\n", "import { Status, Code } from './constants';\nimport { createInternalLogger } from './internals/logger';\nimport { capturePageScreenshot } from './internals/screenshot';\nimport { CrawlerError } from './errors';\nimport { serializeError } from 'serialize-error';\nimport { ProxyMeterRuntime } from './internals/proxy-meter-runtime';\nimport { RuntimeEnv } from './runtime-env';\n\nconst logger = createInternalLogger('ApifyKit');\n\nconst resolveRuntimeContext = (input) => {\n const rememberedState = RuntimeEnv.peekRememberedState();\n const state = rememberedState || RuntimeEnv.parseInput(input || {});\n const envPatch = RuntimeEnv.buildEnvPatch(state) || null;\n\n return {\n actor: state.actor,\n runtime: state.runtime,\n envPatch,\n };\n};\n\nconst isPageLike = (value) => {\n if (!value || typeof value !== 'object') return false;\n return typeof value.evaluate === 'function' && typeof value.context === 'function';\n};\n\nconst pickPage = (...candidates) => {\n for (const candidate of candidates) {\n if (isPageLike(candidate)) {\n return candidate;\n }\n }\n return null;\n};\n\nconst toSerializable = (value, depth = 0, seen = new WeakSet()) => {\n if (depth > 6) return '[MaxDepth]';\n if (value == null) return value;\n\n const valueType = typeof value;\n if (valueType === 'string' || valueType === 'number' || valueType === 'boolean') {\n return value;\n }\n if (valueType === 'bigint') {\n return value.toString();\n }\n if (valueType === 'function' || valueType === 'symbol') {\n return undefined;\n }\n if (value instanceof Error) {\n return serializeError(value);\n }\n if (Array.isArray(value)) {\n return value\n .map((item) => toSerializable(item, depth + 1, seen))\n .filter((item) => item !== undefined);\n }\n if (valueType !== 'object') {\n return String(value);\n }\n\n if (seen.has(value)) {\n return '[Circular]';\n }\n seen.add(value);\n\n const ctorName = String(value?.constructor?.name || '');\n if (\n ctorName === 'Page' ||\n ctorName === 'BrowserContext' ||\n ctorName === 'Browser' ||\n ctorName === 'Frame' ||\n ctorName === 'ElementHandle' ||\n ctorName === 'JSHandle'\n ) {\n return `[${ctorName}]`;\n }\n\n const output = {};\n Object.entries(value).forEach(([key, item]) => {\n const safeValue = toSerializable(item, depth + 1, seen);\n if (safeValue !== undefined) {\n output[key] = safeValue;\n }\n });\n return output;\n};\n\nconst sanitizeMeta = (meta) => {\n if (!meta || typeof meta !== 'object' || Array.isArray(meta)) {\n return {};\n }\n const result = toSerializable(meta) || {};\n if (result && typeof result === 'object' && !Array.isArray(result)) {\n delete result.page;\n }\n return result;\n};\n\nconst captureAutoEnvPatch = async (page, runtimeContext) => {\n const currentPage = pickPage(page);\n if (!currentPage) return null;\n try {\n return await RuntimeEnv.captureEnvPatch(\n currentPage,\n {\n actor: runtimeContext.actor,\n runtime: runtimeContext.runtime,\n },\n { actor: runtimeContext.actor },\n );\n } catch (error) {\n logger.warn(`\u81EA\u52A8\u91C7\u96C6 env_patch \u5931\u8D25: ${error?.message || error}`);\n return null;\n }\n};\n\n/**\n * \u521B\u5EFA ApifyKit \u5B9E\u4F8B\n * \u5982\u679C apify \u53EF\u7528\uFF0C\u8FD4\u56DE\u5B8C\u6574\u529F\u80FD\u7684 ApifyKit\n * \u5982\u679C apify \u4E0D\u53EF\u7528\uFF0C\u8FD4\u56DE\u964D\u7EA7\u7248\u672C\uFF08\u975E apify \u76F8\u5173\u529F\u80FD\u4ECD\u53EF\u7528\uFF09\n */\nasync function createApifyKit() {\n let apify = null;\n\n // \u5C1D\u8BD5\u52A0\u8F7D apify\n try {\n apify = await import('apify');\n } catch (error) {\n // apify \u4E0D\u53EF\u7528\uFF0C\u5C06\u4F7F\u7528\u964D\u7EA7\u7248\u672C\n throw new Error('\u26A0\uFE0F apify \u5E93\u672A\u5B89\u88C5\uFF0CApifyKit \u7684 Actor \u76F8\u5173\u529F\u80FD\u4E0D\u53EF\u7528')\n }\n\n const { Actor } = apify;\n const actorInput = (await Actor.getInput()) || {};\n let lastPage = null;\n const getRuntimeContext = () => resolveRuntimeContext(actorInput);\n\n return {\n /**\n * \u6838\u5FC3\u5C01\u88C5\uFF1A\u6267\u884C\u6B65\u9AA4\uFF0C\u5E26\u81EA\u52A8\u65E5\u5FD7\u786E\u8BA4\u3001\u5931\u8D25\u622A\u56FE\u5904\u7406\u548C\u91CD\u8BD5\u673A\u5236\n * \n * @param {string} step - \u6B65\u9AA4\u540D\u79F0\n * @param {import('playwright').Page} page - Playwright page \u5BF9\u8C61\n * @param {Function} actionFn - \u6267\u884C\u7684\u5F02\u6B65\u64CD\u4F5C\n * @param {Object} [options] - \u914D\u7F6E\u9009\u9879\n * @param {boolean} [options.failActor=true] - \u5931\u8D25\u65F6\u662F\u5426\u8C03\u7528 Actor.fail\n * @param {Object} [options.retry] - \u91CD\u8BD5\u914D\u7F6E\n * @param {number} [options.retry.times=0] - \u91CD\u8BD5\u6B21\u6570\n * @param {'direct'|'refresh'} [options.retry.mode='direct'] - \u91CD\u8BD5\u6A21\u5F0F\n * @param {Function} [options.retry.before] - \u91CD\u8BD5\u524D\u94A9\u5B50\uFF0C\u53EF\u8986\u76D6\u9ED8\u8BA4\u7B49\u5F85\u884C\u4E3A\n */\n async runStep(step, page, actionFn, options = {}) {\n if (isPageLike(page)) {\n lastPage = page;\n }\n const { failActor = true, retry = {} } = options;\n const { times: retryTimes = 0, mode: retryMode = 'direct', before: beforeRetry } = retry;\n\n // \u5185\u90E8\u6267\u884C\u51FD\u6570\n const executeAction = async (attemptNumber) => {\n const attemptLabel = attemptNumber > 0 ? ` (\u91CD\u8BD5 #${attemptNumber})` : '';\n logger.start(`[Step] ${step}${attemptLabel}`);\n\n try {\n const result = await actionFn();\n logger.success(`[Step] ${step}${attemptLabel}`);\n return { success: true, result };\n } catch (error) {\n logger.fail(`[Step] ${step}${attemptLabel}`, error);\n return { success: false, error };\n }\n };\n\n // \u91CD\u8BD5\u524D\u7684\u51C6\u5907\u64CD\u4F5C\n const prepareForRetry = async (attemptNumber) => {\n if (typeof beforeRetry === 'function') {\n // \u4F7F\u7528\u81EA\u5B9A\u4E49\u94A9\u5B50\n logger.start(`[RetryStep] \u6267\u884C\u81EA\u5B9A\u4E49 before \u94A9\u5B50 (\u7B2C ${attemptNumber} \u6B21\u91CD\u8BD5)`);\n await beforeRetry(page, attemptNumber);\n logger.success(`[RetryStep] before \u94A9\u5B50\u5B8C\u6210`);\n } else if (retryMode === 'refresh') {\n // \u5237\u65B0\u6A21\u5F0F\uFF1A\u5237\u65B0\u9875\u9762\u5E76\u7B49\u5F85\u5BFC\u822A commit\uFF0C\u540E\u7EED\u6B65\u9AA4\u81EA\u884C\u505A\u4EA4\u4E92\u5C31\u7EEA\u68C0\u67E5\n logger.start(`[RetryStep] \u5237\u65B0\u9875\u9762 (\u7B2C ${attemptNumber} \u6B21\u91CD\u8BD5)`);\n await page.reload({ waitUntil: 'commit' });\n logger.success(`[RetryStep] \u9875\u9762\u5237\u65B0\u5B8C\u6210`);\n } else {\n // direct \u6A21\u5F0F\uFF1A\u9ED8\u8BA4\u7B49\u5F85 3 \u79D2\n logger.start(`[RetryStep] \u7B49\u5F85 3 \u79D2 (\u7B2C ${attemptNumber} \u6B21\u91CD\u8BD5)`);\n await new Promise(resolve => setTimeout(resolve, 3000));\n logger.success(`[RetryStep] \u7B49\u5F85\u5B8C\u6210`);\n }\n };\n\n // \u9996\u6B21\u6267\u884C\n let lastResult = await executeAction(0);\n\n // \u5982\u679C\u9996\u6B21\u6210\u529F\uFF0C\u76F4\u63A5\u8FD4\u56DE\n if (lastResult.success) {\n return lastResult.result;\n }\n\n // \u91CD\u8BD5\u903B\u8F91\n for (let attempt = 1; attempt <= retryTimes; attempt++) {\n logger.start(`[RetryStep] \u51C6\u5907\u7B2C ${attempt}/${retryTimes} \u6B21\u91CD\u8BD5: ${step}`);\n\n try {\n await prepareForRetry(attempt);\n } catch (prepareError) {\n logger.warn(`[RetryStep] \u91CD\u8BD5\u51C6\u5907\u5931\u8D25: ${prepareError.message}`);\n // \u51C6\u5907\u5931\u8D25\uFF0C\u7EE7\u7EED\u5C1D\u8BD5\u4E0B\u4E00\u6B21\u91CD\u8BD5\n continue;\n }\n\n lastResult = await executeAction(attempt);\n if (lastResult.success) {\n return lastResult.result;\n }\n }\n\n // \u6240\u6709\u91CD\u8BD5\u90FD\u5931\u8D25\uFF0C\u5904\u7406\u6700\u7EC8\u9519\u8BEF\n const finalError = lastResult.error;\n if (failActor) {\n let base64 = '\u622A\u56FE\u5931\u8D25';\n try {\n if (page) {\n const buffer = await capturePageScreenshot(page, {\n fullPage: true,\n type: 'jpeg',\n quality: 60,\n });\n base64 = `data:image/jpeg;base64,${buffer.toString('base64')}`;\n }\n } catch (snapErr) {\n logger.warn(`\u622A\u56FE\u751F\u6210\u5931\u8D25: ${snapErr.message}`);\n }\n\n await this.pushFailed(\n finalError,\n {\n step,\n base64,\n retryAttempts: retryTimes,\n },\n {\n page,\n options,\n },\n );\n await Actor.fail(`Run Step ${step} \u5931\u8D25 (\u5DF2\u91CD\u8BD5 ${retryTimes} \u6B21): ${finalError.message} | url: ${page.url()}`);\n } else {\n throw finalError;\n }\n },\n\n /**\n * \u5BBD\u677E\u7248runStep\uFF1A\u5931\u8D25\u65F6\u4E0D\u8C03\u7528Actor.fail\uFF0C\u53EA\u629B\u51FA\u5F02\u5E38\n * \u652F\u6301\u900F\u4F20 retry \u7B49\u9009\u9879\uFF08failActor \u59CB\u7EC8\u56FA\u5B9A\u4E3A false\uFF09\n *\n * @param {string} step - \u6B65\u9AA4\u540D\u79F0\n * @param {import('playwright').Page} page - Playwright page \u5BF9\u8C61\n * @param {Function} fn - \u6267\u884C\u7684\u5F02\u6B65\u64CD\u4F5C\n * @param {Object} [options] - \u914D\u7F6E\u9009\u9879\uFF08\u652F\u6301 retry\uFF09\n */\n async runStepLoose(step, page, fn, options = {}) {\n return await this.runStep(step, page, fn, {\n ...options,\n failActor: false,\n });\n },\n\n /**\n * \u63A8\u9001\u6210\u529F\u6570\u636E\u7684\u901A\u7528\u65B9\u6CD5\u3002\n * \u8FD9\u91CC\u4F1A\u81EA\u52A8\u505A\u4E09\u4EF6\u4E8B\uFF1A\n * 1. \u91C7\u96C6\u5F53\u524D\u9875\u9762\u7684 env_patch\uFF1B\n * 2. \u5408\u5E76\u663E\u5F0F\u4F20\u5165\u7684 env_patch\uFF1B\n * 3. \u4E00\u5E76\u5199\u5165 dataset\uFF0C\u4F9B\u540E\u7AEF\u56DE\u5199 runtime_env_json\u3002\n * @param {Object} data - \u8981\u63A8\u9001\u7684\u6570\u636E\u5BF9\u8C61\n */\n async pushSuccess(data, options = {}) {\n const runtimeContext = getRuntimeContext();\n const page = pickPage(options?.page, data?.page, lastPage);\n if (page) {\n lastPage = page;\n }\n\n let payloadData = data;\n let explicitPatch = null;\n if (data && typeof data === 'object' && !Array.isArray(data)) {\n payloadData = { ...data };\n explicitPatch = payloadData.env_patch;\n delete payloadData.env_patch;\n delete payloadData.page;\n }\n\n const capturedPatch = await captureAutoEnvPatch(page, runtimeContext);\n const envPatch = RuntimeEnv.mergeEnvPatches(runtimeContext.envPatch, capturedPatch, explicitPatch);\n const traffic = await ProxyMeterRuntime.getProxyMeterSnapshot({ finalize: true });\n const payload = {\n code: Code.Success,\n status: Status.Success,\n ...(traffic ? { traffic } : {}),\n timestamp: new Date().toISOString(),\n data: payloadData,\n };\n if (envPatch) {\n payload.env_patch = envPatch;\n }\n await Actor.pushData({\n ...payload,\n });\n logger.success('pushSuccess', 'Data pushed');\n },\n\n /**\n * \u63A8\u9001\u5931\u8D25\u6570\u636E\u7684\u901A\u7528\u65B9\u6CD5\uFF08\u79C1\u6709\u65B9\u6CD5\uFF0C\u4EC5\u4F9B runStep \u5185\u90E8\u4F7F\u7528\uFF09\u3002\n * \u5373\u4FBF\u4EFB\u52A1\u5931\u8D25\uFF0C\u8FD9\u91CC\u4E5F\u4F1A\u81EA\u52A8\u56DE\u6536 env_patch\uFF0C\u786E\u4FDD cookies/storage \u7684\u6700\u65B0\u72B6\u6001\u4E0D\u4F1A\u4E22\u3002\n * @param {Error|CrawlerError} error - \u9519\u8BEF\u5BF9\u8C61\n * @param {Object} [meta] - \u989D\u5916\u7684\u6570\u636E\uFF08\u5982 failedStep\u3001screenshotBase64 \u7B49\uFF09\n * @param {Object} [options] - \u9644\u52A0\u9009\u9879\uFF08\u5982 page\uFF09\n * @private\n */\n async pushFailed(error, meta = {}, options = {}) {\n const runtimeContext = getRuntimeContext();\n const page = pickPage(options?.page, meta?.page, lastPage);\n if (page) {\n lastPage = page;\n }\n const capturedPatch = await captureAutoEnvPatch(page, runtimeContext);\n const explicitPatch = meta?.env_patch;\n const envPatch = RuntimeEnv.mergeEnvPatches(runtimeContext.envPatch, capturedPatch, explicitPatch);\n const safeMeta = sanitizeMeta(meta);\n delete safeMeta.env_patch;\n\n // \u5982\u679C\u662F CrawlerError\uFF0C\u63D0\u53D6\u5176 key \u548C context\n const isCrawlerError = CrawlerError.isCrawlerError(error);\n const code = isCrawlerError ? error.code : Code.UnknownError;\n const context = isCrawlerError ? error.context : {};\n const traffic = await ProxyMeterRuntime.getProxyMeterSnapshot({ finalize: true });\n const payload = {\n // \u5982\u679C\u662F CrawlerError\uFF0C\u4F7F\u7528\u5176 code\uFF0C\u5426\u5219\u4F7F\u7528\u9ED8\u8BA4 Failed code\n code,\n status: Status.Failed,\n ...(traffic ? { traffic } : {}),\n error: serializeError(error),\n meta: safeMeta,\n context,\n timestamp: new Date().toISOString(),\n };\n if (envPatch) {\n payload.env_patch = envPatch;\n }\n\n await Actor.pushData({\n ...payload,\n });\n logger.success('pushFailed', 'Error data pushed');\n }\n };\n}\n\n// \u61D2\u52A0\u8F7D\u5355\u4F8B\nlet instance = null;\n\n/**\n * \u83B7\u53D6 ApifyKit \u5B9E\u4F8B\uFF08\u61D2\u52A0\u8F7D\uFF09\n * @returns {Promise<Object>} ApifyKit \u5B9E\u4F8B\n */\nasync function useApifyKit() {\n if (!instance) {\n instance = await createApifyKit();\n }\n return instance;\n}\n\n// \u4E5F\u5BFC\u51FA\u521D\u59CB\u5316\u51FD\u6570\uFF0C\u4F9B\u9700\u8981\u7684\u7528\u6237\u4F7F\u7528\nexport const ApifyKit = {\n useApifyKit\n};\n", "import { spawn, spawnSync } from 'child_process';\nimport { existsSync, mkdirSync, readFileSync, rmSync } from 'fs';\nimport { tmpdir } from 'os';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport { createInternalLogger } from './logger.js';\n\nconst logger = createInternalLogger('ProxyMeter');\n\nconst MAX_TOP_DOMAINS = 20;\nconst FLUSH_INTERVAL_MS = 2000;\nconst DEFAULT_DEBUG_MAX_EVENTS = 400;\n\nlet runtime = null;\nlet cleanupInstalled = false;\nlet observedDomainResourceTypes = new Map();\n\nconst toSafeInt = (value) => {\n const num = Number(value);\n if (!Number.isFinite(num) || num <= 0) return 0;\n return Math.round(num);\n};\n\nconst toSafeFloat = (value) => {\n const num = Number(value);\n if (!Number.isFinite(num)) return 0;\n return num;\n};\n\nconst normalizeResourceType = (value) => {\n const type = String(value || '').trim().toLowerCase();\n if (!type) return 'other';\n return type;\n};\n\nconst resolveHostname = (requestUrl) => {\n const raw = String(requestUrl || '').trim();\n if (!raw) return '';\n try {\n return String(new URL(raw).hostname || '').trim().toLowerCase();\n } catch {\n return '';\n }\n};\n\nconst recordDomainResourceType = (domain, resourceType) => {\n const host = String(domain || '').trim().toLowerCase();\n if (!host) return;\n const type = normalizeResourceType(resourceType);\n let byType = observedDomainResourceTypes.get(host);\n if (!byType) {\n byType = new Map();\n observedDomainResourceTypes.set(host, byType);\n }\n byType.set(type, (byType.get(type) || 0) + 1);\n};\n\nconst resolveResourceTypeMeta = (domain) => {\n const host = String(domain || '').trim().toLowerCase();\n if (!host) return { resourceType: '', resourceTypeCounts: undefined };\n const byType = observedDomainResourceTypes.get(host);\n if (!byType || byType.size === 0) {\n return { resourceType: '', resourceTypeCounts: undefined };\n }\n const entries = Array.from(byType.entries())\n .filter(([type, count]) => type && Number(count) > 0)\n .sort((a, b) => {\n if (Number(b[1]) !== Number(a[1])) return Number(b[1]) - Number(a[1]);\n return String(a[0]).localeCompare(String(b[0]));\n });\n if (entries.length === 0) {\n return { resourceType: '', resourceTypeCounts: undefined };\n }\n return {\n resourceType: entries[0][0],\n resourceTypeCounts: Object.fromEntries(entries.map(([type, count]) => [type, toSafeInt(count)])),\n };\n};\n\nconst resolveScriptPath = () => {\n const baseDir = typeof __dirname !== 'undefined'\n ? __dirname\n : path.dirname(fileURLToPath(import.meta.url));\n const internalCandidate = path.join(baseDir, 'internals', 'proxy-meter.js');\n if (existsSync(internalCandidate)) {\n return internalCandidate;\n }\n return path.join(baseDir, 'proxy-meter.js');\n};\n\nconst pickFreePort = () => {\n const script = [\n 'const net=require(\"net\");',\n 'const server=net.createServer();',\n 'server.listen(0,\"127.0.0.1\",()=>{',\n 'const port=server.address().port;',\n 'server.close(()=>{console.log(port);});',\n '});',\n ].join('');\n const result = spawnSync(process.execPath, ['-e', script], { encoding: 'utf8' });\n const port = Number(String(result.stdout || '').trim());\n if (result.status === 0 && Number.isFinite(port) && port > 0) {\n return port;\n }\n return 20000 + Math.floor(Math.random() * 20000);\n};\n\nconst resolveLogDir = () => {\n const storageDir = process.env.APIFY_STORAGE_DIR || process.env.APIFY_LOCAL_STORAGE_DIR || '';\n if (storageDir) {\n return path.join(storageDir, 'proxy-meter');\n }\n return path.join(tmpdir(), 'proxy-meter');\n};\n\nconst ensureLogPath = () => {\n const baseDir = resolveLogDir();\n if (!existsSync(baseDir)) {\n try {\n mkdirSync(baseDir, { recursive: true });\n } catch {}\n }\n const runId = String(process.env.APIFY_ACTOR_RUN_ID || '').trim();\n const suffix = `${Date.now()}-${Math.floor(Math.random() * 1000000)}`;\n const label = runId ? `proxy-meter-${runId}-${suffix}.json` : `proxy-meter-${process.pid}-${suffix}.json`;\n return path.join(baseDir, label);\n};\n\nconst readSnapshot = (logPath) => {\n if (!logPath || !existsSync(logPath)) return null;\n try {\n const raw = readFileSync(logPath, 'utf8');\n if (!raw) return null;\n return JSON.parse(raw);\n } catch {\n return null;\n }\n};\n\nconst normalizeDomainRows = (hosts) => {\n const rows = [];\n let requestCount = 0;\n let connectCount = 0;\n\n for (const [domain, stat] of Object.entries(hosts || {})) {\n if (!stat || typeof stat !== 'object') continue;\n const inBytes = toSafeInt(stat.inBytes);\n const outBytes = toSafeInt(stat.outBytes);\n const requests = toSafeInt(stat.requests);\n const connections = toSafeInt(stat.connections);\n const totalBytes = inBytes + outBytes;\n requestCount += requests;\n connectCount += connections;\n if (totalBytes <= 0 && requests <= 0 && connections <= 0) continue;\n const resourceTypeMeta = resolveResourceTypeMeta(domain);\n rows.push({\n domain,\n inBytes,\n outBytes,\n totalBytes,\n requests,\n connections,\n resourceType: resourceTypeMeta.resourceType || undefined,\n resourceTypeCounts: resourceTypeMeta.resourceTypeCounts || undefined,\n });\n }\n\n rows.sort((a, b) => {\n if (b.totalBytes !== a.totalBytes) return b.totalBytes - a.totalBytes;\n if (b.requests !== a.requests) return b.requests - a.requests;\n return String(a.domain).localeCompare(String(b.domain));\n });\n\n return {\n topDomains: rows.slice(0, MAX_TOP_DOMAINS),\n requestCount,\n connectCount,\n };\n};\n\nconst normalizeDebugRows = (rows, type) => {\n if (!Array.isArray(rows) || rows.length === 0) return undefined;\n const normalized = rows\n .map((row) => {\n if (!row || typeof row !== 'object') return null;\n return {\n domain: String(row.domain || '').trim(),\n status: String(row.status || '').trim(),\n count: toSafeInt(row.count),\n failedCount: toSafeInt(row.failedCount),\n inBytes: toSafeInt(row.inBytes),\n outBytes: toSafeInt(row.outBytes),\n totalBytes: toSafeInt(row.totalBytes),\n avgDurationMs: toSafeFloat(row.avgDurationMs),\n reconnectCount: toSafeInt(row.reconnectCount),\n largeResponseCount: toSafeInt(row.largeResponseCount),\n failureRatePct: toSafeFloat(row.failureRatePct),\n type,\n };\n })\n .filter((row) => row && row.domain && row.count > 0);\n return normalized.length > 0 ? normalized : undefined;\n};\n\nconst normalizeDebugEvent = (row) => {\n if (!row || typeof row !== 'object') return null;\n const host = String(row.host || '').trim();\n if (!host) return null;\n return {\n ts: String(row.ts || ''),\n runId: String(row.runId || ''),\n channel: String(row.channel || ''),\n host,\n method: String(row.method || ''),\n path: String(row.path || ''),\n statusCode: toSafeInt(row.statusCode),\n durationMs: toSafeInt(row.durationMs),\n inBytes: toSafeInt(row.inBytes),\n outBytes: toSafeInt(row.outBytes),\n totalBytes: toSafeInt(row.totalBytes),\n error: String(row.error || ''),\n };\n};\n\nconst normalizeDebugSummary = (debug) => {\n if (!debug || typeof debug !== 'object' || !debug.summary || typeof debug.summary !== 'object') {\n return null;\n }\n const summary = debug.summary;\n const domainStatus = normalizeDebugRows(summary.domainStatus, 'domain_status');\n const topFailureDomains = normalizeDebugRows(summary.topFailureDomains, 'top_failure');\n const topLargeDomains = normalizeDebugRows(summary.topLargeDomains, 'top_large');\n const topReconnectDomains = normalizeDebugRows(summary.topReconnectDomains, 'top_reconnect');\n\n return {\n enabled: Boolean(debug.enabled),\n sampledEvents: toSafeInt(debug.sampledEvents),\n droppedEvents: toSafeInt(debug.droppedEvents),\n totalEvents: toSafeInt(debug.totalEvents),\n largeResponseThresholdBytes: toSafeInt(summary.largeResponseThresholdBytes),\n requestCount: toSafeInt(summary.requestCount),\n failedCount: toSafeInt(summary.failedCount),\n failureRatePct: toSafeFloat(summary.failureRatePct),\n largeResponseCount: toSafeInt(summary.largeResponseCount),\n reconnectCount: toSafeInt(summary.reconnectCount),\n domainStatus,\n topFailureDomains,\n topLargeDomains,\n topReconnectDomains,\n };\n};\n\nconst normalizeSnapshot = (raw) => {\n if (!raw || typeof raw !== 'object') return null;\n const totalIn = toSafeInt(raw.totalInBytes);\n const totalOut = toSafeInt(raw.totalOutBytes);\n const domains = normalizeDomainRows(raw.hosts && typeof raw.hosts === 'object' ? raw.hosts : {});\n\n const normalized = {\n meter: 'proxy-meter-v1',\n totalBytes: totalIn + totalOut,\n uploadBytes: totalOut,\n downloadBytes: totalIn,\n requestCount: domains.requestCount,\n connectCount: domains.connectCount,\n topDomains: domains.topDomains,\n };\n\n const debug = raw.debug && typeof raw.debug === 'object' ? raw.debug : null;\n const summary = normalizeDebugSummary(debug);\n const events = Array.isArray(debug?.events)\n ? debug.events.map(normalizeDebugEvent).filter(Boolean)\n : [];\n if (summary) {\n normalized.trafficDebugSummary = summary;\n }\n if (events.length > 0) {\n normalized.trafficDebugEvents = events;\n }\n\n const hasSignal = normalized.totalBytes > 0\n || normalized.uploadBytes > 0\n || normalized.downloadBytes > 0\n || normalized.requestCount > 0\n || normalized.connectCount > 0\n || (normalized.topDomains && normalized.topDomains.length > 0)\n || Boolean(summary)\n || events.length > 0;\n\n if (!hasSignal) return null;\n return normalized;\n};\n\nconst registerCleanup = () => {\n if (cleanupInstalled) return;\n cleanupInstalled = true;\n const shutdown = () => {\n if (!runtime || !runtime.proc) return;\n try { runtime.proc.kill('SIGTERM'); } catch {}\n };\n process.once('exit', shutdown);\n process.once('SIGINT', shutdown);\n process.once('SIGTERM', shutdown);\n};\n\nconst startProxyMeter = (options = {}) => {\n const upstreamUrl = String(options.proxyUrl || '').trim();\n if (!upstreamUrl) return null;\n\n if (runtime && runtime.proc) {\n try { runtime.proc.kill('SIGTERM'); } catch {}\n runtime = null;\n }\n observedDomainResourceTypes = new Map();\n\n const port = pickFreePort();\n const logPath = ensureLogPath();\n const scriptPath = resolveScriptPath();\n const debugMode = Boolean(options.debugMode);\n const debugMaxEvents = Math.max(10, toSafeInt(options.debugMaxEvents) || DEFAULT_DEBUG_MAX_EVENTS);\n const env = {\n ...process.env,\n PROXY_METER_PORT: String(port),\n PROXY_METER_LOG: logPath,\n PROXY_METER_UPSTREAM: upstreamUrl,\n PROXY_METER_FLUSH_MS: String(FLUSH_INTERVAL_MS),\n PROXY_METER_DEBUG: debugMode ? '1' : '0',\n PROXY_METER_DEBUG_MAX_EVENTS: String(debugMaxEvents),\n };\n\n const child = spawn(process.execPath, [scriptPath], {\n env,\n stdio: ['ignore', 'ignore', 'ignore'],\n });\n\n child.once('exit', (code) => {\n if (code && code !== 0) {\n logger.warn(`[proxy-meter] exited with code ${code}`);\n }\n });\n\n runtime = {\n proc: child,\n port,\n logPath,\n startedAt: Date.now(),\n };\n\n registerCleanup();\n return { server: `http://127.0.0.1:${port}` };\n};\n\nconst recordProxyMeterResourceType = (requestUrl, resourceType) => {\n if (!runtime) return;\n const host = resolveHostname(requestUrl);\n if (!host) return;\n recordDomainResourceType(host, resourceType);\n};\n\nconst stopProxyMeter = async () => {\n if (!runtime) return null;\n const { proc, logPath } = runtime;\n if (!proc || proc.killed) {\n runtime = null;\n return logPath || null;\n }\n\n await new Promise((resolve) => {\n const timeout = setTimeout(() => {\n try { proc.kill('SIGKILL'); } catch {}\n resolve();\n }, 2000);\n proc.once('exit', () => {\n clearTimeout(timeout);\n resolve();\n });\n try { proc.kill('SIGTERM'); } catch { resolve(); }\n });\n\n runtime = null;\n return logPath || null;\n};\n\nconst getProxyMeterSnapshot = async (options = {}) => {\n if (!runtime) return null;\n const finalize = Boolean(options.finalize);\n const logPath = finalize ? await stopProxyMeter() : runtime.logPath;\n const raw = readSnapshot(logPath);\n const snapshot = normalizeSnapshot(raw);\n if (finalize && logPath) {\n try { rmSync(logPath, { force: true }); } catch {}\n }\n return snapshot;\n};\n\nexport const ProxyMeterRuntime = {\n startProxyMeter,\n recordProxyMeterResourceType,\n stopProxyMeter,\n getProxyMeterSnapshot,\n};\n", "import { PageRuntimeStateKey } from './internals/constants.js';\nimport { ActorInfo, Device, normalizeDevice } from './constants.js';\n\nconst BROWSER_PROFILE_SCHEMA_VERSION = 1;\n\nlet rememberedRuntimeState = null;\n\nconst isPlainObject = (value) => value && typeof value === 'object' && !Array.isArray(value);\n\nconst normalizeKnownDevice = (value) => {\n const raw = String(value || '').trim().toLowerCase();\n if (raw === Device.Mobile) return Device.Mobile;\n if (raw === Device.Desktop) return Device.Desktop;\n return '';\n};\n\n// \u8FD0\u884C\u6001\u5FEB\u7167\u5728 visitor / toolkit / \u540E\u7AEF\u4E4B\u95F4\u6765\u56DE\u4F20\u9012\uFF0C\n// \u6240\u4EE5\u6240\u6709\u5165\u53E3\u90FD\u5148\u8D70 deepClone\uFF0C\u907F\u514D\u5171\u4EAB\u5F15\u7528\u5F15\u53D1\u201C\u8FB9\u8DD1\u8FB9\u6539\u201D\u7684\u9690\u5F0F\u526F\u4F5C\u7528\u3002\nconst deepClone = (value) => {\n if (value == null) return value;\n try {\n return JSON.parse(JSON.stringify(value));\n } catch {\n return value;\n\t}\n};\n\n// \u5C1D\u8BD5\u628A runtime / browser_profile \u4E4B\u7C7B\u7684 JSON \u5B57\u6BB5\u89E3\u6790\u6210\u5BF9\u8C61\u3002\nconst tryParseJSON = (value) => {\n if (value == null) return null;\n if (typeof value === 'object') return value;\n const raw = String(value || '').trim();\n if (!raw) return null;\n try {\n return JSON.parse(raw);\n } catch {\n return null;\n\t}\n};\n\n// local/session \u7684\u89C4\u8303\u5316\u76EE\u6807\u53EA\u6709\u4E00\u4E2A\uFF1A\u8FC7\u6EE4\u7A7A\u503C\uFF0C\u7EDF\u4E00\u8F6C\u6210\u5B57\u7B26\u4E32\u3002\nconst normalizeLocalStorage = (value) => {\n const source = value && typeof value === 'object' && !Array.isArray(value) ? value : {};\n return Object.entries(source).reduce((acc, [key, item]) => {\n const safeKey = String(key || '').trim();\n const safeValue = String(item ?? '').trim();\n if (!safeKey || !safeValue || safeValue === '<nil>') return acc;\n acc[safeKey] = safeValue;\n return acc;\n }, {});\n};\n\nconst normalizeSessionStorage = (value) => {\n const source = value && typeof value === 'object' && !Array.isArray(value) ? value : {};\n return Object.entries(source).reduce((acc, [key, item]) => {\n const safeKey = String(key || '').trim();\n const safeValue = String(item ?? '').trim();\n if (!safeKey || !safeValue || safeValue === '<nil>') return acc;\n acc[safeKey] = safeValue;\n return acc;\n }, {});\n};\n\nconst normalizeCookieSameSite = (value) => {\n const raw = String(value || '').trim().toLowerCase();\n if (!raw) return '';\n\n switch (raw) {\n case 'strict':\n return 'Strict';\n case 'lax':\n return 'Lax';\n case 'none':\n case 'no_restriction':\n return 'None';\n case 'unspecified':\n default:\n return '';\n }\n};\n\nconst normalizeCookieExpires = (raw = {}) => {\n const source = raw && typeof raw === 'object' ? raw : {};\n const session = Boolean(source.session);\n if (session) return null;\n\n const expiresCandidate = Number(source.expires);\n if (Number.isFinite(expiresCandidate) && expiresCandidate > 0) {\n return expiresCandidate;\n }\n\n const expirationDateCandidate = Number(source.expirationDate);\n if (Number.isFinite(expirationDateCandidate) && expirationDateCandidate > 0) {\n return expirationDateCandidate;\n }\n\n return null;\n};\n\nconst normalizeCookies = (value) => {\n if (!Array.isArray(value)) return [];\n return value\n .map((item) => {\n const raw = item && typeof item === 'object' ? item : {};\n const name = String(raw.name || '').trim();\n const cookieValue = String(raw.value ?? '').trim();\n if (!name || !cookieValue || cookieValue === '<nil>') return null;\n const domain = String(raw.domain || '').trim();\n const url = normalizeHttpUrl(raw.url);\n const path = String(raw.path || '').trim() || '/';\n const sameSite = normalizeCookieSameSite(raw.sameSite);\n const expires = normalizeCookieExpires(raw);\n const secure = Boolean(raw.secure);\n const httpOnly = Boolean(raw.httpOnly);\n const partitionKey = typeof raw.partitionKey === 'string' ? String(raw.partitionKey).trim() : '';\n\n // \u7EDF\u4E00\u8F93\u51FA Playwright \u53EF\u63A5\u53D7\u7684 Cookie \u7ED3\u6784\uFF0C\u907F\u514D\u628A Chrome \u6269\u5C55\u4FA7\u5B57\u6BB5\u539F\u6837\u900F\u4F20\u8FC7\u53BB\u3002\n const normalized = {\n name,\n value: cookieValue,\n path,\n ...(domain ? { domain } : {}),\n ...(!domain && url ? { url } : {}),\n ...(sameSite ? { sameSite } : {}),\n ...(secure ? { secure: true } : {}),\n ...(httpOnly ? { httpOnly: true } : {}),\n ...(expires !== null ? { expires } : {}),\n ...(partitionKey ? { partitionKey } : {}),\n };\n\n if (!normalized.domain && !normalized.url) {\n return null;\n }\n\n return {\n ...normalized,\n };\n })\n .filter(Boolean);\n};\n\nconst buildCookieMap = (cookies) => cookies.reduce((acc, item) => {\n\tacc[item.name] = item.value;\n\treturn acc;\n}, {});\n\n// \u7EDF\u4E00\u628A\u539F\u59CB URL \u5FEB\u7167\u8FC7\u6EE4\u6210 http/https\uFF0C\u907F\u514D browser/runtime \u4E24\u7AEF\u5404\u81EA\u505A\u4E00\u5957\u5224\u65AD\u3002\nconst normalizeHttpUrl = (value) => {\n const raw = String(value || '').trim();\n if (!raw) return '';\n try {\n const parsed = new URL(raw);\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') return '';\n parsed.hash = '';\n return parsed.toString();\n } catch {\n return '';\n }\n};\n\nconst uniqueStrings = (value) => {\n const list = Array.isArray(value) ? value : [];\n const seen = new Set();\n const result = [];\n list.forEach((item) => {\n const normalized = String(item || '').trim();\n if (!normalized || seen.has(normalized)) return;\n seen.add(normalized);\n result.push(normalized);\n });\n return result;\n};\n\nconst normalizeHttpUrlList = (value) => uniqueStrings(\n (Array.isArray(value) ? value : [value])\n .map((item) => normalizeHttpUrl(item))\n .filter(Boolean),\n);\n\nconst normalizeCookieDomain = (value) => String(value || '').trim().replace(/^\\./, '').toLowerCase();\n\nconst normalizeCookiePath = (value) => {\n const raw = String(value || '').trim();\n if (!raw) return '/';\n return raw.startsWith('/') ? raw : `/${raw}`;\n};\n\nconst doesCookieMatchUrl = (cookie, url) => {\n if (!cookie || !url) return false;\n try {\n const parsed = new URL(url);\n const host = String(parsed.hostname || '').trim().toLowerCase();\n const pathname = String(parsed.pathname || '/').trim() || '/';\n const cookieDomain = normalizeCookieDomain(cookie.domain);\n const cookiePath = normalizeCookiePath(cookie.path);\n if (!host || !cookieDomain) return false;\n const domainMatched = host === cookieDomain || host.endsWith(`.${cookieDomain}`);\n if (!domainMatched) return false;\n if (cookie.secure && parsed.protocol !== 'https:') return false;\n return pathname.startsWith(cookiePath);\n } catch {\n return false;\n }\n};\n\nconst normalizeRawSnapshot = (value = {}) => {\n const source = isPlainObject(value) ? value : {};\n const pageUrl = normalizeHttpUrl(source.page_url ?? source.pageUrl);\n const frameUrls = normalizeHttpUrlList(source.frame_urls ?? source.frameUrls);\n const resourceUrls = normalizeHttpUrlList(source.resource_urls ?? source.resourceUrls);\n const browserProfileObservedSource =\n source.browser_profile_observed\n ?? source.browserProfileObserved\n ?? source.browser_profile?.observed\n ?? source.browserProfile?.observed\n ?? source.browserProfile;\n\n return {\n page_url: pageUrl,\n frame_urls: frameUrls,\n resource_urls: resourceUrls,\n cookies: Array.isArray(source.cookies) ? deepClone(source.cookies) : [],\n local_storage: normalizeLocalStorage(source.local_storage ?? source.localStorage),\n session_storage: normalizeSessionStorage(source.session_storage ?? source.sessionStorage),\n browser_profile_observed: normalizeObservedBrowserProfile(browserProfileObservedSource),\n };\n};\n\nconst collectCookieUrlsFromSnapshot = (snapshot = {}) => {\n const normalized = normalizeRawSnapshot(snapshot);\n return uniqueStrings([\n normalized.page_url,\n ...normalized.frame_urls,\n ...normalized.resource_urls,\n ].filter(Boolean));\n};\n\nconst filterCookiesBySnapshot = (cookies = [], snapshot = {}) => {\n const normalizedCookies = normalizeCookies(cookies);\n const cookieUrls = collectCookieUrlsFromSnapshot(snapshot);\n if (cookieUrls.length === 0) {\n return normalizedCookies;\n }\n return normalizedCookies.filter((cookie) => cookieUrls.some((url) => doesCookieMatchUrl(cookie, url)));\n};\n\nconst buildEnvPayloadFromSnapshot = (snapshot = {}, options = {}) => {\n const normalized = normalizeRawSnapshot(snapshot);\n const cookies = filterCookiesBySnapshot(snapshot?.cookies || normalized.cookies, normalized);\n const localStorage = normalized.local_storage;\n const sessionStorage = normalized.session_storage;\n const browserProfileCore = normalizeBrowserProfileCore(\n options.browserProfileCore\n ?? snapshot?.browser_profile?.core\n ?? snapshot?.browserProfile?.core,\n );\n const browserProfile = buildBrowserProfilePayload(browserProfileCore, normalized.browser_profile_observed);\n\n const payload = {\n ...(cookies.length > 0 ? { cookies } : {}),\n ...(Object.keys(localStorage).length > 0 ? { local_storage: localStorage } : {}),\n ...(Object.keys(sessionStorage).length > 0 ? { session_storage: sessionStorage } : {}),\n ...(Object.keys(browserProfile).length > 0 ? { browser_profile: browserProfile } : {}),\n };\n return Object.keys(payload).length > 0 ? payload : null;\n};\n\nconst captureRawSnapshotFromPage = async (page) => {\n const frameUrls = typeof page?.frames === 'function'\n ? page.frames().map((frame) => {\n try {\n return frame.url();\n } catch {\n return '';\n }\n })\n : [];\n\n const snapshot = await page.evaluate(() => {\n const localStorage = {};\n const sessionStorage = {};\n const resourceUrls = [];\n const frameUrls = [];\n\n try {\n for (let i = 0; i < window.localStorage.length; i += 1) {\n const key = window.localStorage.key(i);\n if (!key) continue;\n const value = window.localStorage.getItem(key);\n if (value !== null) localStorage[key] = value;\n }\n } catch {\n // ignore\n }\n\n try {\n for (let i = 0; i < window.sessionStorage.length; i += 1) {\n const key = window.sessionStorage.key(i);\n if (!key) continue;\n const value = window.sessionStorage.getItem(key);\n if (value !== null) sessionStorage[key] = value;\n }\n } catch {\n // ignore\n }\n\n try {\n const perfEntries = performance.getEntriesByType('resource') || [];\n perfEntries.forEach((entry) => {\n const name = String(entry?.name || '').trim();\n if (name) resourceUrls.push(name);\n });\n } catch {\n // ignore\n }\n\n try {\n document.querySelectorAll('iframe,frame').forEach((node) => {\n const src = String(node?.src || '').trim();\n if (src) frameUrls.push(src);\n });\n } catch {\n // ignore\n }\n\n const nav = window.navigator || {};\n const screen = window.screen || {};\n const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone || '';\n\n return {\n page_url: window.location.href || '',\n frame_urls: frameUrls,\n resource_urls: resourceUrls,\n local_storage: localStorage,\n session_storage: sessionStorage,\n browser_profile_observed: {\n user_agent: nav.userAgent || '',\n platform: nav.platform || '',\n language: nav.language || '',\n languages: Array.isArray(nav.languages) ? nav.languages : [],\n hardware_concurrency: Number(nav.hardwareConcurrency || 0),\n device_memory: Number(nav.deviceMemory || 0),\n timezone,\n viewport: {\n width: Number(window.innerWidth || 0),\n height: Number(window.innerHeight || 0),\n },\n screen: {\n width: Number(screen.width || 0),\n height: Number(screen.height || 0),\n avail_width: Number(screen.availWidth || 0),\n avail_height: Number(screen.availHeight || 0),\n color_depth: Number(screen.colorDepth || 0),\n pixel_depth: Number(screen.pixelDepth || 0),\n },\n },\n };\n });\n\n return normalizeRawSnapshot({\n ...snapshot,\n frame_urls: [...frameUrls, ...(snapshot?.frame_urls || [])],\n });\n};\n\n// observed \u53EA\u4FDD\u5B58\u201C\u8FD0\u884C\u540E\u770B\u5230\u7684\u6D4F\u89C8\u5668\u8868\u73B0\u201D\uFF0C\u5B83\u4E0D\u662F\u542F\u52A8\u771F\u6E90\u3002\nconst normalizeObservedBrowserProfile = (value) => {\n const source = isPlainObject(value) ? value : {};\n const profile = {};\n\n const stringFields = {\n user_agent: source.user_agent,\n platform: source.platform,\n language: source.language,\n timezone: source.timezone,\n };\n Object.entries(stringFields).forEach(([key, item]) => {\n const safeValue = String(item || '').trim();\n if (safeValue) {\n profile[key] = safeValue;\n }\n });\n\n if (Array.isArray(source.languages)) {\n const languages = source.languages\n .map((item) => String(item || '').trim())\n .filter(Boolean);\n if (languages.length > 0) {\n profile.languages = languages;\n }\n }\n\n const numericFields = {\n hardware_concurrency: Number(source.hardware_concurrency || 0),\n device_memory: Number(source.device_memory || 0),\n };\n Object.entries(numericFields).forEach(([key, item]) => {\n if (Number.isFinite(item) && item > 0) {\n profile[key] = item;\n }\n });\n\n if (isPlainObject(source.viewport)) {\n const width = Number(source.viewport.width || 0);\n const height = Number(source.viewport.height || 0);\n if (width > 0 && height > 0) {\n profile.viewport = { width, height };\n }\n }\n\n if (isPlainObject(source.screen)) {\n const screenProfile = {};\n const screenFields = {\n width: Number(source.screen.width || 0),\n height: Number(source.screen.height || 0),\n avail_width: Number(source.screen.avail_width || 0),\n avail_height: Number(source.screen.avail_height || 0),\n color_depth: Number(source.screen.color_depth || 0),\n pixel_depth: Number(source.screen.pixel_depth || 0),\n };\n Object.entries(screenFields).forEach(([key, item]) => {\n if (Number.isFinite(item) && item > 0) {\n screenProfile[key] = item;\n }\n });\n if (Object.keys(screenProfile).length > 0) {\n profile.screen = screenProfile;\n }\n }\n\n\treturn profile;\n};\n\n// core \u662F\u6D4F\u89C8\u5668\u73AF\u5883\u7684\u552F\u4E00\u771F\u6E90\uFF1A\n// fingerprint / device / timezone_id / locale / browser_major_version \u90FD\u5728\u8FD9\u91CC\uFF0C\n// \u4E5F\u5C31\u662F\u8BF4 mobile/desktop \u4E0D\u80FD\u9760\u8FD0\u884C\u65F6\u5C0F\u4FEE\u8865\u7ED5\u8FC7\u53BB\uFF0C\u5FC5\u987B\u8BA9 core \u672C\u8EAB\u5BF9\u9F50\u3002\nconst normalizeBrowserProfileCore = (value) => {\n const source = isPlainObject(value) ? value : {};\n const profile = {};\n\n const device = normalizeKnownDevice(source.device);\n if (device) {\n profile.device = device;\n }\n\n if (isPlainObject(source.fingerprint) && Object.keys(source.fingerprint).length > 0) {\n profile.fingerprint = deepClone(source.fingerprint);\n }\n\n const timezoneId = String(source.timezone_id || '').trim();\n if (timezoneId) {\n profile.timezone_id = timezoneId;\n }\n\n const locale = String(source.locale || '').trim();\n if (locale) {\n profile.locale = locale;\n }\n\n const browserMajorVersion = Number(source.browser_major_version || 0);\n if (Number.isFinite(browserMajorVersion) && browserMajorVersion > 0) {\n profile.browser_major_version = browserMajorVersion;\n }\n\n const schemaVersion = Number(source.schema_version || 0);\n if (Number.isFinite(schemaVersion) && schemaVersion > 0) {\n profile.schema_version = schemaVersion;\n } else if (Object.keys(profile).length > 0) {\n profile.schema_version = BROWSER_PROFILE_SCHEMA_VERSION;\n }\n\n\treturn profile;\n};\n\n// buildBrowserProfilePayload \u4FDD\u8BC1 browser_profile \u6C38\u8FDC\u53EA\u66B4\u9732 core / observed \u4E24\u5C42\u7ED3\u6784\u3002\nconst buildBrowserProfilePayload = (core = {}, observed = {}) => {\n const payload = {};\n if (isPlainObject(core) && Object.keys(core).length > 0) {\n payload.core = core;\n }\n if (isPlainObject(observed) && Object.keys(observed).length > 0) {\n payload.observed = observed;\n }\n return payload;\n};\n\nconst mergePlainObject = (target = {}, source = {}) => {\n const next = isPlainObject(target) ? deepClone(target) : {};\n if (!isPlainObject(source)) return next;\n\n Object.entries(source).forEach(([key, value]) => {\n if (!key) return;\n if (isPlainObject(value) && isPlainObject(next[key])) {\n next[key] = mergePlainObject(next[key], value);\n return;\n }\n next[key] = deepClone(value);\n });\n\n\treturn next;\n};\n\n// mergeBrowserProfilePayload \u7684\u6838\u5FC3\u89C4\u5219\uFF1A\n// 1. core \u53EA\u5728\u5F53\u524D\u4E3A\u7A7A\u3001device \u51B2\u7A81\u3001\u6216\u6D4F\u89C8\u5668\u5927\u7248\u672C\u51B2\u7A81\u65F6\u624D\u66FF\u6362\uFF1B\n// 2. observed \u6BCF\u6B21\u90FD\u5141\u8BB8\u8986\u76D6\u66F4\u65B0\uFF1B\n// 3. \u8FD9\u4FDD\u8BC1\u4E86\u201C\u770B\u8D77\u6765\u5207\u4E86 device\uFF0C\u5B9E\u9645\u4E0A core \u8FD8\u5728\u8DD1\u65E7\u6307\u7EB9\u201D\u4E0D\u4F1A\u957F\u671F\u5B58\u5728\u3002\nconst mergeBrowserProfilePayload = (target = {}, source = {}) => {\n const current = isPlainObject(target) ? target : {};\n const incoming = isPlainObject(source) ? source : {};\n const currentCore = normalizeBrowserProfileCore(current.core);\n const incomingCore = normalizeBrowserProfileCore(incoming.core);\n const currentObserved = normalizeObservedBrowserProfile(current.observed);\n const incomingObserved = normalizeObservedBrowserProfile(incoming.observed);\n\n let mergedCore = currentCore;\n if (Object.keys(mergedCore).length === 0 && Object.keys(incomingCore).length > 0) {\n mergedCore = incomingCore;\n } else if (Object.keys(incomingCore).length > 0) {\n const currentDevice = normalizeKnownDevice(currentCore.device);\n const incomingDevice = normalizeKnownDevice(incomingCore.device);\n const currentVersion = Number(currentCore.browser_major_version || 0);\n const incomingVersion = Number(incomingCore.browser_major_version || 0);\n if (\n (incomingDevice && currentDevice !== incomingDevice)\n || (currentVersion > 0 && incomingVersion > 0 && currentVersion !== incomingVersion)\n ) {\n mergedCore = incomingCore;\n }\n }\n\n const mergedObserved = mergePlainObject(currentObserved, incomingObserved);\n\treturn buildBrowserProfilePayload(mergedCore, mergedObserved);\n};\n\n// mergeEnvPatchObjects \u662F visitor \u6210\u529F/\u5931\u8D25\u81EA\u52A8\u56DE\u5199 env_patch \u7684\u5408\u5E76\u5165\u53E3\u3002\nconst mergeEnvPatchObjects = (...patches) => {\n const merged = {};\n\n patches.forEach((patch) => {\n if (!isPlainObject(patch)) return;\n Object.entries(patch).forEach(([key, value]) => {\n if (!key) return;\n if (key === 'browser_profile') {\n const browserProfile = mergeBrowserProfilePayload(merged.browser_profile, value);\n if (Object.keys(browserProfile).length > 0) {\n merged.browser_profile = browserProfile;\n }\n return;\n }\n if (isPlainObject(value) && isPlainObject(merged[key])) {\n merged[key] = mergePlainObject(merged[key], value);\n return;\n }\n merged[key] = deepClone(value);\n });\n });\n\n return Object.keys(merged).length > 0 ? merged : null;\n};\n\nconst normalizeBrowserProfile = (value) => {\n const source = isPlainObject(value) ? value : {};\n const coreSource = isPlainObject(source.core) ? source.core : {};\n const observedSource = isPlainObject(source.observed) ? source.observed : {};\n const core = normalizeBrowserProfileCore(coreSource);\n const observed = normalizeObservedBrowserProfile(observedSource);\n return {\n core,\n observed,\n payload: buildBrowserProfilePayload(core, observed),\n };\n};\n\nconst rememberRuntimeState = (state) => {\n rememberedRuntimeState = deepClone(state);\n return rememberedRuntimeState;\n};\n\nconst normalizeRuntimeState = (source = {}, actor = '') => {\n if (\n source &&\n typeof source === 'object' &&\n source.runtime &&\n typeof source.runtime === 'object' &&\n !Array.isArray(source.runtime) &&\n Object.prototype.hasOwnProperty.call(source, 'browserProfileCore')\n ) {\n return source;\n }\n return RuntimeEnv.parseInput(source, actor);\n};\n\nconst resolveInputDevice = (input = {}, runtime = {}, actor = '') => {\n const actorDevice = ActorInfo?.[actor]?.device;\n return normalizeDevice(actorDevice ?? input?.device ?? runtime?.device);\n};\n\nexport const RuntimeEnv = {\n tryParseJSON,\n normalizeDevice,\n normalizeCookies,\n normalizeLocalStorage,\n normalizeSessionStorage,\n normalizeBrowserProfileCore,\n normalizeObservedBrowserProfile,\n normalizeSnapshot(snapshot = {}) {\n return normalizeRawSnapshot(snapshot);\n },\n collectCookieUrls(snapshot = {}) {\n return collectCookieUrlsFromSnapshot(snapshot);\n },\n buildRuntimeEnvFromSnapshot(snapshot = {}, options = {}) {\n return buildEnvPayloadFromSnapshot(snapshot, options);\n },\n buildEnvPatchFromSnapshot(snapshot = {}, options = {}) {\n return buildEnvPayloadFromSnapshot(snapshot, options);\n },\n mergeEnvPatches(...patches) {\n return mergeEnvPatchObjects(...patches);\n },\n\n // parseInput \u628A Actor \u8F93\u5165\u91CC\u7684 runtime \u5B57\u6BB5\u6807\u51C6\u5316\u6210 toolkit \u5185\u90E8\u7EDF\u4E00\u7ED3\u6784\u3002\n // \u540E\u7EED visitor \u53EA\u548C\u8FD9\u4E2A state \u4EA4\u4E92\uFF0C\u4E0D\u518D\u81EA\u5DF1\u62FC token/cookie \u903B\u8F91\u3002\n parseInput(input = {}, actor = '') {\n const runtime = tryParseJSON(input?.runtime) || {};\n const resolvedActor = String(actor || input?.actor || '').trim();\n const device = resolveInputDevice(input, runtime, resolvedActor);\n const query = String(input?.query || '').trim();\n const cookies = normalizeCookies(runtime?.cookies);\n const cookieMap = buildCookieMap(cookies);\n const localStorage = normalizeLocalStorage(runtime?.local_storage);\n const sessionStorage = normalizeSessionStorage(runtime?.session_storage);\n const browserProfile = normalizeBrowserProfile(runtime?.browser_profile);\n const envId = String(input?.env_id || '').trim();\n\n const normalizedRuntime = {\n ...(cookies.length > 0 ? { cookies } : {}),\n ...(Object.keys(localStorage).length > 0 ? { local_storage: localStorage } : {}),\n ...(Object.keys(sessionStorage).length > 0 ? { session_storage: sessionStorage } : {}),\n };\n if (Object.keys(browserProfile.payload).length > 0) {\n normalizedRuntime.browser_profile = browserProfile.payload;\n } else {\n delete normalizedRuntime.browser_profile;\n }\n\n const state = {\n actor: resolvedActor,\n device,\n runtime: normalizedRuntime,\n envId,\n query,\n cookies,\n cookieMap,\n localStorage,\n sessionStorage,\n browserProfile: browserProfile.payload,\n browserProfileCore: browserProfile.core,\n browserProfileObserved: browserProfile.observed,\n };\n rememberRuntimeState(state);\n return state;\n },\n\n // buildEnvPatch \u53EA\u6784\u9020\u5141\u8BB8\u56DE\u5199\u5230\u540E\u7AEF env \u7684\u5B57\u6BB5\u96C6\u5408\u3002\n buildEnvPatch(source = {}, actor = '') {\n const state = normalizeRuntimeState(source, actor);\n const browserProfile = buildBrowserProfilePayload(state.browserProfileCore, state.browserProfileObserved);\n const envPatch = {\n ...(Array.isArray(state.cookies) && state.cookies.length > 0 ? { cookies: state.cookies } : {}),\n ...(Object.keys(state.localStorage || {}).length > 0 ? { local_storage: state.localStorage } : {}),\n ...(Object.keys(state.sessionStorage || {}).length > 0 ? { session_storage: state.sessionStorage } : {}),\n ...(Object.keys(browserProfile).length > 0 ? { browser_profile: browserProfile } : {}),\n };\n return Object.keys(envPatch).length > 0 ? envPatch : null;\n },\n\n // hasLoginState \u53EA\u5224\u65AD runtime \u662F\u5426\u5B58\u5728\u6709\u6548\u8F7D\u8377\uFF0C\u4E0D\u518D\u533A\u5206\u5177\u4F53\u5B57\u6BB5\u6765\u6E90\u3002\n hasLoginState(source = {}, actor = '') {\n const state = normalizeRuntimeState(source, actor);\n return isPlainObject(state.runtime) && Object.keys(state.runtime || {}).length > 0;\n },\n\n rememberState(source = {}) {\n const state = normalizeRuntimeState(source);\n rememberRuntimeState(state);\n return RuntimeEnv.peekRememberedState();\n },\n\n peekRememberedState() {\n return rememberedRuntimeState ? deepClone(rememberedRuntimeState) : null;\n },\n\n getBrowserProfileCore(source = {}, actor = '') {\n const state = normalizeRuntimeState(source, actor);\n return deepClone(state.browserProfileCore || {});\n },\n\n setBrowserProfileCore(source = {}, core = {}, actor = '') {\n const state = normalizeRuntimeState(source, actor);\n const normalizedCore = normalizeBrowserProfileCore({\n ...core,\n device: normalizeKnownDevice(core?.device) || state.device,\n });\n state.browserProfileCore = normalizedCore;\n state.browserProfile = buildBrowserProfilePayload(normalizedCore, state.browserProfileObserved);\n if (Object.keys(state.browserProfile).length > 0) {\n state.runtime.browser_profile = state.browserProfile;\n } else {\n delete state.runtime.browser_profile;\n }\n rememberRuntimeState(state);\n return state;\n },\n\n // applyToPage \u53EA\u8D1F\u8D23\u628A\u767B\u5F55\u6001\u76F8\u5173\u5B57\u6BB5\u6CE8\u5165\u9875\u9762\uFF1A\n // cookies / localStorage / sessionStorage\u3002\n // \u6307\u7EB9\u3001\u65F6\u533A\u3001UA\u3001viewport \u7684\u56DE\u653E\u53D1\u751F\u5728 launch.js \u542F\u52A8\u9636\u6BB5\uFF0C\u4E0D\u5728\u8FD9\u91CC\u505A\u3002\n async applyToPage(page, source = {}, options = {}) {\n if (!page) return;\n let state = normalizeRuntimeState(source, options?.actor || '');\n if (typeof options?.preapply === 'function') {\n state = await options.preapply(state) || state;\n rememberRuntimeState(state);\n }\n Object.defineProperty(page, PageRuntimeStateKey, {\n configurable: true,\n enumerable: false,\n writable: true,\n value: state,\n });\n const localStorage = state.localStorage || {};\n const sessionStorage = state.sessionStorage || {};\n const cookies = (state.cookies || [])\n .map((cookie) => {\n const normalized = { ...cookie };\n if (!normalized.path) {\n normalized.path = '/';\n }\n if (!normalized.domain && !normalized.url) {\n return null;\n }\n return normalized;\n })\n .filter(Boolean);\n\n if (cookies.length > 0) {\n await page.context().addCookies(cookies);\n }\n if (Object.keys(localStorage).length > 0) {\n await page.addInitScript((payload) => {\n try {\n Object.entries(payload || {}).forEach(([key, value]) => {\n if (!key) return;\n window.localStorage.setItem(key, String(value ?? ''));\n });\n } catch (error) {\n // no-op\n }\n }, localStorage);\n }\n if (Object.keys(sessionStorage).length > 0) {\n await page.addInitScript((payload) => {\n try {\n Object.entries(payload || {}).forEach(([key, value]) => {\n if (!key) return;\n window.sessionStorage.setItem(key, String(value ?? ''));\n });\n } catch (error) {\n // no-op\n }\n }, sessionStorage);\n }\n },\n\n // captureEnvPatch \u5728\u4EFB\u52A1\u7ED3\u675F\u65F6\u91C7\u96C6\u6700\u65B0\u73AF\u5883\u5FEB\u7167\uFF0C\u7528\u4E8E pushSuccess / pushFailed \u81EA\u52A8\u56DE\u5199\u3002\n async captureEnvPatch(page, source = {}, options = {}) {\n const state = normalizeRuntimeState(source, options?.actor || '');\n const baseline = RuntimeEnv.buildEnvPatch(state) || {};\n if (!page || typeof page.evaluate !== 'function' || typeof page.context !== 'function') {\n return Object.keys(baseline).length > 0 ? baseline : null;\n }\n\n try {\n const rawSnapshot = await captureRawSnapshotFromPage(page);\n const cookieUrls = collectCookieUrlsFromSnapshot(rawSnapshot);\n let cookies = [];\n try {\n cookies = cookieUrls.length > 0\n ? await page.context().cookies(cookieUrls)\n : await page.context().cookies();\n } catch {\n cookies = [];\n }\n const capturedPatch = RuntimeEnv.buildEnvPatchFromSnapshot(\n {\n ...rawSnapshot,\n cookies,\n },\n {\n browserProfileCore: state.browserProfileCore,\n },\n );\n return RuntimeEnv.mergeEnvPatches(baseline, capturedPatch);\n } catch {\n // ignore\n }\n return Object.keys(baseline).length > 0 ? baseline : null;\n },\n};\n", "import { createInternalLogger } from './logger.js';\n\nconst logger = createInternalLogger('InternalUtils');\n\n/**\n * \u89E3\u6790 Cookie \u5B57\u7B26\u4E32\u4E3A Playwright \u683C\u5F0F\u7684 Cookie \u6570\u7EC4\n * @param {string} cookieString - Cookie \u5B57\u7B26\u4E32\n * @param {string} [domain] - Cookie \u57DF\u540D (\u53EF\u9009)\n * @returns {Array} Cookie \u6570\u7EC4\n */\nexport const parseCookies = (cookieString, domain) => {\n const cookies = [];\n const pairs = cookieString.split(';').map(c => c.trim());\n\n for (const pair of pairs) {\n const [name, ...valueParts] = pair.split('=');\n if (name && valueParts.length > 0) {\n const cookie = {\n name: name.trim(),\n value: valueParts.join('=').trim(),\n path: '/',\n };\n if (domain) {\n cookie.domain = domain;\n }\n cookies.push(cookie);\n }\n }\n logger.success('parseCookies', `parsed ${cookies.length} cookies`);\n return cookies;\n};\n", "import { parseCookies as internalParseCookies } from './internals/utils.js';\n\nexport const Utils = {\n /**\n * \u89E3\u6790 Cookie \u5B57\u7B26\u4E32\u4E3A Playwright \u683C\u5F0F\u7684 Cookie \u6570\u7EC4\n * @param {string} cookieString - Cookie \u5B57\u7B26\u4E32\n * @param {string} [domain] - Cookie \u57DF\u540D (\u53EF\u9009)\n * @returns {Array} Cookie \u6570\u7EC4\n */\n parseCookies(cookieString, domain) {\n return internalParseCookies(cookieString, domain);\n },\n\n /**\n * \u4ECE\u5B57\u7B26\u4E32\u4E2D\u63D0\u53D6 URL \u94FE\u63A5\n * @param {string} text\n * @param {Object} [options]\n * @param {string} [options.prefix] - \u4EC5\u8FD4\u56DE\u6B64\u524D\u7F00\u5F00\u5934\uFF0C\u4E14\u524D\u7F00\u540E\u81F3\u5C11 1 \u4F4D\u5B57\u7B26\u7684\u94FE\u63A5\n * @returns {string[]}\n */\n parseLinks(text, options = {}) {\n const raw = String(text || '');\n if (!raw) return [];\n\n const opts = options && typeof options === 'object' ? options : {};\n const prefix = String(opts.prefix || '').trim();\n\n const matched = raw.match(/https?:\\/\\/[\\w\\-._~:/?#[\\]@!$&'()*+,;=%]+/g) || [];\n const unique = new Set();\n\n for (const item of matched) {\n const link = String(item || '').trim().replace(/[\"'\u201C\u201D\u2018\u2019>\\].,\uFF0C\u3002\uFF1B;!\uFF01?\uFF1F]+$/, '');\n if (!link || !/^https?:\\/\\//i.test(link)) continue;\n\n if (prefix) {\n if (!link.startsWith(prefix)) continue;\n if (link.length <= prefix.length) continue;\n }\n\n unique.add(link);\n }\n\n return Array.from(unique);\n },\n}\n", "import { Mode, normalizeMode } from '../constants.js';\n\nconst state = {\n mode: Mode.Default,\n};\n\nconst normalizeStrategies = (strategies) => (\n strategies && typeof strategies === 'object'\n ? strategies\n : {}\n);\n\nexport const ToolkitContext = {\n get mode() {\n return state.mode;\n },\n\n setMode(mode = Mode.Default) {\n state.mode = normalizeMode(mode, Mode.Default);\n return state.mode;\n },\n};\n\nexport const getToolkitContext = () => ({ mode: state.mode });\n\nexport const getToolkitMode = () => state.mode;\n\nexport const setToolkitMode = (mode = Mode.Default) => ToolkitContext.setMode(mode);\n\nexport const resolveModeStrategy = (strategies = {}, mode = getToolkitMode(), fallbackMode = Mode.Default) => {\n const normalizedStrategies = normalizeStrategies(strategies);\n const normalizedMode = normalizeMode(mode, fallbackMode);\n const strategy = normalizedStrategies[normalizedMode]\n ?? normalizedStrategies[fallbackMode]\n ?? Object.values(normalizedStrategies).find(Boolean)\n ?? null;\n\n return {\n mode: normalizedMode,\n strategy,\n };\n};\n", "import { resolveModeStrategy } from './context.js';\n\nconst normalizeStrategies = (strategies) => (\n strategies && typeof strategies === 'object'\n ? strategies\n : {}\n);\n\nconst collectFunctionNames = (strategies = []) => {\n const names = new Set();\n for (const strategy of strategies) {\n if (!strategy || typeof strategy !== 'object') continue;\n for (const name of Reflect.ownKeys(strategy)) {\n if (typeof name === 'string' && typeof strategy[name] === 'function') {\n names.add(name);\n }\n }\n }\n return names;\n};\n\nconst methodDescriptor = (namespace, name, resolveTarget) => ({\n enumerable: true,\n configurable: true,\n writable: true,\n value: (...args) => {\n const { mode, strategy } = resolveTarget(args);\n const method = strategy?.[name];\n if (typeof method !== 'function') {\n throw new Error(`${namespace}.${name} is not available in ${mode} mode`);\n }\n return method.apply(strategy, args);\n },\n});\n\nexport const withModeReflect = (namespace, strategies = {}) => {\n const normalizedStrategies = normalizeStrategies(strategies);\n const baseStrategy = normalizedStrategies.default ?? Object.values(normalizedStrategies).find(Boolean);\n const names = collectFunctionNames([baseStrategy]);\n const descriptors = {};\n\n for (const name of names) {\n descriptors[name] = methodDescriptor(namespace, name, () => (\n resolveModeStrategy(normalizedStrategies)\n ));\n }\n\n return Object.defineProperties({}, descriptors);\n};\n\nexport const withPageReflect = (namespace, resolveStrategy, strategies = []) => {\n const names = collectFunctionNames(strategies);\n const descriptors = {};\n\n for (const name of names) {\n descriptors[name] = methodDescriptor(namespace, name, ([page]) => ({\n mode: 'page',\n strategy: resolveStrategy(page),\n }));\n }\n\n return Object.defineProperties({}, descriptors);\n};\n", "import { Device, normalizeDevice } from '../../constants.js';\n\nconst BASE_CONFIG = Object.freeze({\n locale: 'zh-CN',\n acceptLanguage: 'zh-CN,zh;q=0.9',\n timezoneId: 'Asia/Shanghai',\n timezoneOffset: -480,\n geolocation: null,\n});\n\n// \u6700\u5C0F\u5316\u542F\u52A8\u53C2\u6570\uFF0C\u4F9D\u8D56 Crawlee/Playwright \u9ED8\u8BA4\u884C\u4E3A\nconst DEFAULT_LAUNCH_ARGS = [\n // '--disable-blink-features=AutomationControlled', // Crawlee \u53EF\u80FD\u4F1A\u81EA\u52A8\u5904\u7406\uFF0C\u8FC7\u591A\u5E72\u9884\u53CD\u800C\u4F1A\u88AB\u8BC6\u522B\n '--no-sandbox',\n '--disable-setuid-sandbox',\n '--window-position=0,0',\n];\n\nfunction buildFingerprintOptions({ locale = BASE_CONFIG.locale, browserMajorVersion = 0, device = Device.Desktop } = {}) {\n const resolvedDevice = normalizeDevice(device);\n const normalizedBrowserMajorVersion = Number(browserMajorVersion || 0);\n const browserDescriptor = normalizedBrowserMajorVersion > 0\n ? [{ name: 'chrome', minVersion: normalizedBrowserMajorVersion, maxVersion: normalizedBrowserMajorVersion }]\n : [{ name: 'chrome', minVersion: 110 }];\n\n const options = {\n browsers: browserDescriptor,\n devices: [resolvedDevice],\n operatingSystems: resolvedDevice === Device.Mobile\n ? ['android']\n : ['windows', 'macos', 'linux'],\n locales: [locale],\n strict: true,\n };\n\n if (resolvedDevice === Device.Mobile) {\n options.screen = {\n minWidth: 320,\n maxWidth: 480,\n minHeight: 640,\n maxHeight: 1100,\n };\n }\n\n return options;\n}\n\nexport const DefaultAntiCheat = {\n /**\n * \u83B7\u53D6\u7EDF\u4E00\u7684\u57FA\u7840\u914D\u7F6E\n */\n getBaseConfig() {\n return { ...BASE_CONFIG };\n },\n\n /**\n * \u7528\u4E8E Crawlee fingerprint generator \u7684\u7EDF\u4E00\u914D\u7F6E\u3002\n */\n getFingerprintGeneratorOptions(options = {}) {\n return buildFingerprintOptions(options);\n },\n\n /**\n * \u83B7\u53D6\u57FA\u7840\u542F\u52A8\u53C2\u6570\u3002\n */\n getLaunchArgs(options = {}) {\n const locale = String(options?.locale || BASE_CONFIG.locale).trim() || BASE_CONFIG.locale;\n return [...DEFAULT_LAUNCH_ARGS, `--lang=${locale}`];\n },\n\n /**\n * \u4E3A got-scraping \u751F\u6210\u4E0E\u6D4F\u89C8\u5668\u4E00\u81F4\u7684 TLS \u6307\u7EB9\u914D\u7F6E\u3002\n */\n getTlsFingerprintOptions(userAgent = '', acceptLanguage = '', options = {}) {\n // \u7B80\u5316\u903B\u8F91\uFF0C\u4E0D\u518D\u89E3\u6790 acceptLanguage\uFF0C\u4EC5\u63D0\u4F9B\u57FA\u7840\u6307\u7EB9\u914D\u7F6E\n return buildFingerprintOptions(options);\n },\n\n /**\n * \u89C4\u8303\u5316\u8BF7\u6C42\u5934\n */\n applyLocaleHeaders(headers, acceptLanguage = '') {\n if (!headers['accept-language']) {\n headers['accept-language'] = acceptLanguage || BASE_CONFIG.acceptLanguage;\n }\n return headers;\n },\n};\n\nexport const AntiCheat = DefaultAntiCheat;\n", "const CLOAK_BASE_CONFIG = Object.freeze({\n locale: '',\n acceptLanguage: '',\n timezoneId: '',\n timezoneOffset: null,\n geolocation: null,\n});\n\nconst normalizeHeaders = (headers) => (\n headers && typeof headers === 'object'\n ? headers\n : {}\n);\n\nexport const CloakAntiCheat = {\n /**\n * Cloak \u81EA\u8EAB\u4F1A\u8D1F\u8D23\u6D4F\u89C8\u5668\u6307\u7EB9\uFF0Ctoolkit \u5728\u8BE5\u6A21\u5F0F\u4E0B\u5C3D\u91CF\u4E0D\u518D\u6CE8\u5165\u989D\u5916\u53CD\u68C0\u6D4B\u914D\u7F6E\u3002\n */\n getBaseConfig() {\n return { ...CLOAK_BASE_CONFIG };\n },\n\n getFingerprintGeneratorOptions() {\n return {};\n },\n\n getLaunchArgs() {\n return [];\n },\n\n getTlsFingerprintOptions() {\n return {};\n },\n\n applyLocaleHeaders(headers, acceptLanguage = '') {\n const normalizedHeaders = normalizeHeaders(headers);\n if (acceptLanguage && !normalizedHeaders['accept-language']) {\n normalizedHeaders['accept-language'] = acceptLanguage;\n }\n return normalizedHeaders;\n },\n};\n", "import { Mode } from './constants.js';\nimport { withModeReflect } from './internals/reflect.js';\nimport { CloakAntiCheat, DefaultAntiCheat } from './internals/anti-cheat/index.js';\n\nconst antiCheatStrategies = {\n [Mode.Default]: DefaultAntiCheat,\n [Mode.Cloak]: CloakAntiCheat,\n};\n\nexport const AntiCheat = withModeReflect('AntiCheat', antiCheatStrategies);\n", "import { Device, normalizeDevice } from './constants.js';\nimport { PageRuntimeStateKey } from './internals/constants.js';\n\n/**\n * DeviceInput \u662F\u673A\u68B0\u8F93\u5165\u7684\u552F\u4E00\u9002\u914D\u5C42\u3002\n *\n * \u4F7F\u7528\u8FB9\u754C\uFF1A\n * - visitor / captcha / toolkit \u975E\u62DF\u4EBA\u5316\u8DEF\u5F84\u8981\u8C03\u7528\u8FD9\u91CC\uFF0C\u4E0D\u76F4\u63A5\u8C03\u7528 page.mouse / page.touchscreen / locator.click\u3002\n * - Humanize \u4ECD\u7136\u8D1F\u8D23\u201C\u62DF\u4EBA\u5316\u884C\u4E3A\u201D\uFF0C\u5B83\u5185\u90E8\u53EF\u4EE5\u4FDD\u7559\u81EA\u5DF1\u7684\u8F68\u8FF9\u3001\u6EDA\u52A8\u548C\u8282\u594F\u5B9E\u73B0\u3002\n * - DOM click \u53EA\u4F5C\u4E3A\u517C\u5BB9\u515C\u5E95\uFF1B\u79FB\u52A8\u7AEF\u771F\u5B9E\u70B9\u51FB\u4F18\u5148\u8D70 tap/touch\uFF0C\u684C\u9762\u7AEF\u8D70 click/mouse\u3002\n */\nconst resolveDeviceFromPage = (page) => normalizeDevice(page?.[PageRuntimeStateKey]?.device);\n\nconst assertPage = (page, method) => {\n if (!page || typeof page !== 'object') {\n throw new Error(`DeviceInput.${method} requires a Playwright page`);\n }\n};\n\nconst isPoint = (value) => (\n value\n && typeof value === 'object'\n && Number.isFinite(Number(value.x))\n && Number.isFinite(Number(value.y))\n);\n\nconst pointFromArgs = (pointOrX, maybeY) => {\n if (isPoint(pointOrX)) {\n return { x: Number(pointOrX.x), y: Number(pointOrX.y) };\n }\n return { x: Number(pointOrX), y: Number(maybeY) };\n};\n\nconst resolveNativeTarget = (page, target) => {\n if (!target) return null;\n if (typeof target === 'string') return page.locator(target);\n return target;\n};\n\nconst normalizeSelectorOptions = (options = {}) => ({\n targetParent: Boolean(options.targetParent ?? options.parent ?? false),\n pick: options.pick === 'last' || options.last ? 'last' : 'first',\n visibleOnly: options.visibleOnly !== false,\n fallbackDomClick: Boolean(options.fallbackDomClick),\n forceMouse: Boolean(options.forceMouse),\n forceClick: Boolean(options.forceClick),\n mouseOptions: options.mouseOptions || {},\n clickOptions: options.clickOptions || {},\n tapOptions: options.tapOptions || {},\n});\n\nconst waitFor = (page, timeout) => {\n if (!timeout) return Promise.resolve();\n if (page && typeof page.waitForTimeout === 'function') {\n return page.waitForTimeout(timeout);\n }\n return new Promise((resolve) => setTimeout(resolve, timeout));\n};\n\nconst getTargetBoundingBox = async (target) => {\n if (!target) return null;\n if (typeof target.boundingBox === 'function') return target.boundingBox();\n if (typeof target.elementHandle === 'function') {\n const handle = await target.elementHandle();\n try {\n return await handle?.boundingBox?.();\n } finally {\n if (handle && typeof handle.dispose === 'function') {\n await handle.dispose().catch(() => {});\n }\n }\n }\n return null;\n};\n\nconst assertPoint = (point) => {\n if (!Number.isFinite(point.x) || !Number.isFinite(point.y)) {\n throw new Error(`Invalid input point: ${JSON.stringify(point)}`);\n }\n};\n\nconst toFiniteNumber = (value, fallback = 0) => {\n const number = Number(value);\n return Number.isFinite(number) ? number : fallback;\n};\n\n// \u9F20\u6807\u539F\u8BED\u53EA\u5728\u6A21\u5757\u5185\u90E8\u4F7F\u7528\uFF1B\u8C03\u7528\u65B9\u7EDF\u4E00\u8D70 DeviceInput.drag()/click() \u7B49\u8BED\u4E49\u65B9\u6CD5\uFF0C\n// \u8FD9\u6837\u79FB\u52A8\u7AEF\u9875\u9762\u4F1A\u6536\u5230 touch/tap \u4E8B\u4EF6\uFF0C\u800C\u4E0D\u662F\u88F8 mouse \u4E8B\u4EF6\u3002\nconst dispatchMouseMove = (page, point, options = {}) => page.mouse.move(point.x, point.y, options);\nconst dispatchMouseStart = (page, options = {}) => page.mouse.down(options);\nconst dispatchMouseEnd = (page, options = {}) => page.mouse.up(options);\n\nconst dragWithMouse = async (page, points, options = {}) => {\n await dispatchMouseMove(page, points.start, { steps: 8 });\n await waitFor(page, options.initialDelayMs ?? 250);\n await dispatchMouseStart(page);\n await waitFor(page, options.holdDelayMs ?? 350);\n\n await dispatchMouseMove(page, points.lift, { steps: 6 });\n await waitFor(page, options.liftDelayMs ?? 250);\n\n for (let step = 1; step <= points.steps; step += 1) {\n const progress = step / points.steps;\n const easedProgress = 1 - ((1 - progress) * (1 - progress));\n await dispatchMouseMove(page, {\n x: points.lift.x + ((points.end.x - points.lift.x) * easedProgress),\n y: points.lift.y + ((points.end.y - points.lift.y) * easedProgress),\n }, { steps: 2 });\n await waitFor(page, options.stepDelayMs ?? 90);\n }\n\n const finalMoveRepeats = Math.max(0, Math.floor(toFiniteNumber(options.finalMoveRepeats)));\n for (let repeat = 0; repeat < finalMoveRepeats; repeat += 1) {\n await dispatchMouseMove(page, points.end, { steps: 1 });\n await waitFor(page, options.finalMoveDelayMs ?? 35);\n }\n\n await waitFor(page, options.beforeReleaseDelayMs ?? 100);\n await dispatchMouseEnd(page);\n await waitFor(page, options.afterReleaseDelayMs ?? 100);\n return true;\n};\n\nconst dragWithTouch = async (page, points, options = {}) => {\n let client = null;\n try {\n client = await page.context().newCDPSession(page);\n await waitFor(page, options.initialDelayMs ?? 250);\n await client.send('Input.dispatchTouchEvent', {\n type: 'touchStart',\n touchPoints: [{ x: points.start.x, y: points.start.y, id: 1 }],\n });\n await waitFor(page, options.holdDelayMs ?? 350);\n\n const totalSteps = points.steps + 1;\n for (let step = 1; step <= totalSteps; step += 1) {\n const progress = step / totalSteps;\n const easedProgress = 1 - ((1 - progress) * (1 - progress));\n const from = step === 1 ? points.start : points.lift;\n const to = points.end;\n await client.send('Input.dispatchTouchEvent', {\n type: 'touchMove',\n touchPoints: [{\n x: from.x + ((to.x - from.x) * easedProgress),\n y: from.y + ((to.y - from.y) * easedProgress),\n id: 1,\n }],\n });\n await waitFor(page, options.stepDelayMs ?? 90);\n }\n\n const finalMoveRepeats = Math.max(0, Math.floor(toFiniteNumber(options.finalMoveRepeats)));\n for (let repeat = 0; repeat < finalMoveRepeats; repeat += 1) {\n await client.send('Input.dispatchTouchEvent', {\n type: 'touchMove',\n touchPoints: [{ x: points.end.x, y: points.end.y, id: 1 }],\n });\n await waitFor(page, options.finalMoveDelayMs ?? 35);\n }\n\n await waitFor(page, options.beforeReleaseDelayMs ?? 100);\n await client.send('Input.dispatchTouchEvent', {\n type: 'touchEnd',\n touchPoints: [],\n });\n await waitFor(page, options.afterReleaseDelayMs ?? 100);\n return true;\n } finally {\n if (client && typeof client.detach === 'function') {\n await client.detach().catch(() => {});\n }\n }\n};\n\nconst clickTargetWithDevice = async (page, target, options = {}) => {\n const normalizedOptions = normalizeSelectorOptions(options);\n const resolvedDevice = resolveDeviceFromPage(page);\n\n // \u79FB\u52A8\u7AEF\u7684 locator.click() \u4ECD\u662F mouse \u8BED\u4E49\uFF1B\u8FD9\u91CC\u4F18\u5148\u5207\u5230 tap/touch\u3002\n if (\n target\n && resolvedDevice === Device.Mobile\n && !normalizedOptions.forceClick\n && !normalizedOptions.forceMouse\n ) {\n if (typeof target.tap === 'function') {\n await target.tap(normalizedOptions.tapOptions);\n return true;\n }\n\n const box = await getTargetBoundingBox(target);\n if (box) {\n await DeviceInput.clickPoint(page, {\n x: box.x + box.width / 2,\n y: box.y + box.height / 2,\n }, normalizedOptions);\n return true;\n }\n }\n\n if (!target || typeof target.click !== 'function') {\n throw new Error('DeviceInput click target does not expose click()');\n }\n\n await target.click(normalizedOptions.clickOptions || options);\n return true;\n};\n\nexport const DeviceInput = {\n device(page) {\n return resolveDeviceFromPage(page);\n },\n\n isMobile(page) {\n return resolveDeviceFromPage(page) === Device.Mobile;\n },\n\n async clickPoint(page, pointOrX, maybeY, options = {}) {\n assertPage(page, 'clickPoint');\n const clickOptions = isPoint(pointOrX) && maybeY && typeof maybeY === 'object'\n ? maybeY\n : options;\n const point = pointFromArgs(pointOrX, maybeY);\n assertPoint(point);\n\n if (\n resolveDeviceFromPage(page) === Device.Mobile\n && !clickOptions.forceMouse\n && page.touchscreen\n && typeof page.touchscreen.tap === 'function'\n ) {\n await page.touchscreen.tap(point.x, point.y);\n return true;\n }\n\n await page.mouse.click(point.x, point.y, clickOptions.mouseOptions || {});\n return true;\n },\n\n async tapPoint(page, pointOrX, maybeY, options = {}) {\n return DeviceInput.clickPoint(page, pointOrX, maybeY, options);\n },\n\n async click(page, target, options = {}) {\n assertPage(page, 'click');\n if (isPoint(target)) {\n return DeviceInput.clickPoint(page, target, undefined, options);\n }\n\n const nativeTarget = resolveNativeTarget(page, target);\n return clickTargetWithDevice(page, nativeTarget, options);\n },\n\n async tap(page, target, options = {}) {\n return DeviceInput.click(page, target, options);\n },\n\n async move(page, pointOrX, maybeY, options = {}) {\n assertPage(page, 'move');\n const moveOptions = isPoint(pointOrX) && maybeY && typeof maybeY === 'object'\n ? maybeY\n : options;\n const point = pointFromArgs(pointOrX, maybeY);\n assertPoint(point);\n\n // \u79FB\u52A8\u7AEF\u6CA1\u6709\u9F20\u6807 hover/move \u8BED\u4E49\uFF1B\u666E\u901A move \u89C6\u4E3A no-op\u3002\n if (resolveDeviceFromPage(page) === Device.Mobile && !moveOptions.forceMouse) {\n return true;\n }\n\n await page.mouse.move(point.x, point.y, moveOptions.mouseOptions || moveOptions);\n return true;\n },\n\n async focus(page, target, options = {}) {\n assertPage(page, 'focus');\n const nativeTarget = resolveNativeTarget(page, target);\n if (!nativeTarget || typeof nativeTarget.focus !== 'function') {\n throw new Error('DeviceInput focus target does not expose focus()');\n }\n\n await nativeTarget.focus(options);\n return true;\n },\n\n async fill(page, target, value, options = {}) {\n assertPage(page, 'fill');\n const nativeTarget = resolveNativeTarget(page, target);\n if (!nativeTarget || typeof nativeTarget.fill !== 'function') {\n throw new Error('DeviceInput fill target does not expose fill()');\n }\n\n await nativeTarget.fill(value, options);\n return true;\n },\n\n async keyboardType(page, text, options = {}) {\n assertPage(page, 'keyboardType');\n await page.keyboard.type(text, options);\n return true;\n },\n\n async type(page, targetOrText, maybeText, options = {}) {\n assertPage(page, 'type');\n if (maybeText == null || (typeof maybeText === 'object' && !Array.isArray(maybeText))) {\n return DeviceInput.keyboardType(page, targetOrText, maybeText || options);\n }\n\n const nativeTarget = resolveNativeTarget(page, targetOrText);\n if (!nativeTarget || typeof nativeTarget.type !== 'function') {\n throw new Error('DeviceInput type target does not expose type()');\n }\n\n await nativeTarget.type(maybeText, options);\n return true;\n },\n\n async press(page, targetOrKey, maybeKey, options = {}) {\n assertPage(page, 'press');\n const hasTarget = typeof maybeKey === 'string';\n const key = hasTarget ? maybeKey : targetOrKey;\n const pressOptions = hasTarget ? options : (maybeKey || options);\n\n if (hasTarget) {\n await DeviceInput.click(page, targetOrKey, pressOptions.clickOptions || {});\n }\n\n await page.keyboard.press(key, pressOptions.keyboardOptions || pressOptions);\n return true;\n },\n\n async selectorCenterPoint(page, selector, options = {}) {\n assertPage(page, 'selectorCenterPoint');\n const normalizedOptions = normalizeSelectorOptions(options);\n return page.evaluate(({ innerSelector, innerOptions }) => {\n const nodes = Array.from(document.querySelectorAll(innerSelector));\n const ordered = innerOptions.pick === 'last' ? nodes.reverse() : nodes;\n let rect = null;\n for (const node of ordered) {\n if (!node) continue;\n const target = innerOptions.targetParent ? (node.parentElement || node) : node;\n rect = target.getBoundingClientRect?.() || null;\n const isVisible = Boolean(rect && rect.width > 0 && rect.height > 0);\n if (innerOptions.visibleOnly && !isVisible) continue;\n break;\n }\n if (!rect || rect.width <= 0 || rect.height <= 0) return null;\n return {\n x: rect.left + rect.width / 2,\n y: rect.top + rect.height / 2,\n };\n }, { innerSelector: selector, innerOptions: normalizedOptions });\n },\n\n async domClick(page, selector, options = {}) {\n assertPage(page, 'domClick');\n // \u53EA\u7528\u4E8E\u6781\u7AEF\u517C\u5BB9\u515C\u5E95\uFF1A\u4E0D\u4F1A\u4EA7\u751F\u771F\u5B9E touch/mouse \u4E8B\u4EF6\u5E8F\u5217\u3002\n const normalizedOptions = normalizeSelectorOptions(options);\n return page.evaluate(({ innerSelector, innerOptions }) => {\n const nodes = Array.from(document.querySelectorAll(innerSelector));\n const ordered = innerOptions.pick === 'last' ? nodes.reverse() : nodes;\n let target = null;\n for (const node of ordered) {\n if (!node) continue;\n const candidate = innerOptions.targetParent ? (node.parentElement || node) : node;\n const rect = candidate.getBoundingClientRect?.() || null;\n const isVisible = Boolean(rect && rect.width > 0 && rect.height > 0);\n if (innerOptions.visibleOnly && !isVisible) continue;\n target = candidate;\n break;\n }\n if (!target || typeof target.click !== 'function') return false;\n target.click();\n return true;\n }, { innerSelector: selector, innerOptions: normalizedOptions });\n },\n\n async clickSelectorCenter(page, selector, options = {}) {\n assertPage(page, 'clickSelectorCenter');\n const normalizedOptions = normalizeSelectorOptions(options);\n\n try {\n const point = await DeviceInput.selectorCenterPoint(page, selector, normalizedOptions);\n if (point) {\n await DeviceInput.clickPoint(page, point, undefined, normalizedOptions);\n return true;\n }\n } catch (error) {\n if (!normalizedOptions.fallbackDomClick) throw error;\n }\n\n if (normalizedOptions.fallbackDomClick) {\n return DeviceInput.domClick(page, selector, normalizedOptions);\n }\n\n return false;\n },\n\n async clickText(frameOrPage, texts, options = {}) {\n for (const text of texts || []) {\n if (!text) continue;\n const candidates = [\n frameOrPage.getByText(text, { exact: false }).first(),\n frameOrPage.locator(`text=${text}`).first(),\n ];\n\n for (const candidate of candidates) {\n const isVisible = await candidate.isVisible({\n timeout: options.visibleTimeoutMs ?? options.actionVisibleTimeoutMs ?? 1500,\n }).catch(() => false);\n if (!isVisible) continue;\n\n const page = options.page\n || (frameOrPage && typeof frameOrPage.context === 'function' ? frameOrPage : null)\n || candidate.page?.();\n if (!page) {\n throw new Error('DeviceInput.clickText requires options.page when used with a frame locator');\n }\n await DeviceInput.click(page, candidate, options);\n return true;\n }\n }\n\n return false;\n },\n\n async drag(page, sourceLocator, targetLocator, options = {}) {\n assertPage(page, 'drag');\n const sourceBox = await sourceLocator.boundingBox();\n const targetBox = await targetLocator.boundingBox();\n\n if (!sourceBox || !targetBox) {\n throw new Error('Unable to resolve drag coordinates.');\n }\n\n const steps = options.steps || 10;\n const sourceOffsetX = toFiniteNumber(options.sourceOffsetX);\n const sourceOffsetY = toFiniteNumber(options.sourceOffsetY);\n const targetOffsetX = toFiniteNumber(options.targetOffsetX);\n const targetOffsetY = toFiniteNumber(options.targetOffsetY);\n const sourceCenterX = sourceBox.x + sourceBox.width / 2 + sourceOffsetX;\n const sourceCenterY = sourceBox.y + sourceBox.height / 2 + sourceOffsetY;\n const liftOffsetX = Math.min(18, Math.max(8, sourceBox.width * 0.12));\n const liftOffsetY = Math.min(12, Math.max(4, sourceBox.height * 0.08));\n const points = {\n start: {\n x: sourceCenterX,\n y: sourceCenterY,\n },\n lift: {\n x: sourceCenterX + liftOffsetX,\n y: sourceCenterY + liftOffsetY,\n },\n end: {\n x: targetBox.x + targetBox.width / 2 + targetOffsetX,\n y: targetBox.y + targetBox.height / 2 + targetOffsetY,\n },\n steps,\n };\n\n // drag \u662F\u8BBE\u5907\u8BED\u4E49\uFF1A\u79FB\u52A8\u7AEF\u53D1 touch drag\uFF0C\u684C\u9762\u7AEF\u53D1 mouse drag\u3002\n if (resolveDeviceFromPage(page) === Device.Mobile && !options.forceMouse) {\n try {\n return await dragWithTouch(page, points, options);\n } catch (error) {\n if (options.allowMouseFallback === false) throw error;\n }\n }\n\n return dragWithMouse(page, points, options);\n },\n};\n", "import { devices } from 'playwright';\nimport { Device, normalizeDevice } from './constants.js';\nimport { PageRuntimeStateKey } from './internals/constants.js';\n\nconst DEFAULT_MOBILE_DESCRIPTOR = 'Pixel 7';\n\nconst clonePlain = (value) => {\n if (!value || typeof value !== 'object') return value;\n try {\n return JSON.parse(JSON.stringify(value));\n } catch {\n return { ...value };\n }\n};\n\nconst resolveDescriptor = (descriptor, device) => {\n if (descriptor && typeof descriptor === 'object') {\n return descriptor;\n }\n\n const name = String(descriptor || (device === Device.Mobile ? DEFAULT_MOBILE_DESCRIPTOR : '')).trim();\n if (!name) return null;\n\n const resolved = devices[name];\n if (!resolved) {\n throw new Error(`DeviceView.withPageDevice unknown Playwright device descriptor: ${name}`);\n }\n return resolved;\n};\n\nconst attachRuntimeState = (page, state) => {\n Object.defineProperty(page, PageRuntimeStateKey, {\n configurable: true,\n enumerable: false,\n writable: true,\n value: state,\n });\n};\n\nconst restoreRuntimeState = (page, snapshot) => {\n if (snapshot.hadRuntimeState) {\n attachRuntimeState(page, snapshot.runtimeState);\n return;\n }\n delete page[PageRuntimeStateKey];\n};\n\nconst waitFor = (page, timeout) => {\n if (!timeout) return Promise.resolve();\n if (page && typeof page.waitForTimeout === 'function') {\n return page.waitForTimeout(timeout);\n }\n return new Promise((resolve) => setTimeout(resolve, timeout));\n};\n\nconst dispatchTouchTap = async (client, page, x, y) => {\n await client.send('Input.dispatchTouchEvent', {\n type: 'touchStart',\n touchPoints: [{ x, y, id: 1 }],\n });\n await waitFor(page, 30);\n await client.send('Input.dispatchTouchEvent', {\n type: 'touchEnd',\n touchPoints: [],\n });\n};\n\nconst installScopedTouchscreenTap = (page, client, enabled) => {\n if (!enabled || !page?.touchscreen || typeof page.touchscreen.tap !== 'function') {\n return () => {};\n }\n\n const originalTap = page.touchscreen.tap;\n page.touchscreen.tap = async (x, y) => {\n try {\n return await originalTap.call(page.touchscreen, x, y);\n } catch (error) {\n if (!String(error?.message || error).includes('hasTouch must be enabled')) {\n throw error;\n }\n return await dispatchTouchTap(client, page, x, y);\n }\n };\n\n return () => {\n page.touchscreen.tap = originalTap;\n };\n};\n\nconst buildScopedRuntimeState = (page, runtimeState, device) => ({\n ...(clonePlain(runtimeState || page?.[PageRuntimeStateKey] || {}) || {}),\n device,\n});\n\nconst applyDeviceEmulation = async (page, descriptor, device, options = {}) => {\n if (!descriptor) return { client: null, restoreTouchscreenTap: () => {} };\n\n const client = await page.context().newCDPSession(page);\n const viewport = descriptor.viewport || null;\n const isMobile = device === Device.Mobile || descriptor.isMobile === true;\n const hasTouch = device === Device.Mobile || descriptor.hasTouch === true;\n const deviceScaleFactor = Number(descriptor.deviceScaleFactor || 1);\n\n if (descriptor.userAgent) {\n await client.send('Emulation.setUserAgentOverride', {\n userAgent: descriptor.userAgent,\n platform: options.platform || (isMobile ? 'Android' : undefined),\n });\n }\n\n if (viewport?.width > 0 && viewport?.height > 0) {\n await page.setViewportSize({\n width: viewport.width,\n height: viewport.height,\n });\n await client.send('Emulation.setDeviceMetricsOverride', {\n width: viewport.width,\n height: viewport.height,\n deviceScaleFactor,\n mobile: isMobile,\n screenWidth: descriptor.screen?.width || viewport.width,\n screenHeight: descriptor.screen?.height || viewport.height,\n });\n }\n\n await client.send('Emulation.setTouchEmulationEnabled', {\n enabled: hasTouch,\n maxTouchPoints: hasTouch ? Number(options.maxTouchPoints || 5) : 0,\n });\n\n return {\n client,\n restoreTouchscreenTap: installScopedTouchscreenTap(page, client, hasTouch),\n };\n};\n\nconst restoreDeviceEmulation = async (page, emulation, snapshot) => {\n const client = emulation?.client;\n emulation?.restoreTouchscreenTap?.();\n if (!client) return;\n\n await client.send('Emulation.setTouchEmulationEnabled', { enabled: false }).catch(() => {});\n await client.send('Emulation.clearDeviceMetricsOverride').catch(() => {});\n\n if (snapshot.userAgent) {\n await client.send('Emulation.setUserAgentOverride', {\n userAgent: snapshot.userAgent,\n platform: snapshot.platform || undefined,\n }).catch(() => {});\n }\n\n if (snapshot.viewport) {\n await page.setViewportSize(snapshot.viewport).catch(() => {});\n }\n\n await client.detach().catch(() => {});\n};\n\nexport const DeviceView = {\n async withPageDevice(page, options = {}, callback) {\n if (!page || typeof page !== 'object') {\n throw new Error('DeviceView.withPageDevice requires a Playwright page');\n }\n if (typeof callback !== 'function') {\n throw new Error('DeviceView.withPageDevice requires a callback');\n }\n\n const device = normalizeDevice(options.device);\n const descriptor = resolveDescriptor(options.descriptor, device);\n const snapshot = {\n hadRuntimeState: Object.prototype.hasOwnProperty.call(page, PageRuntimeStateKey),\n runtimeState: clonePlain(page[PageRuntimeStateKey]),\n viewport: page.viewportSize?.() || null,\n userAgent: await page.evaluate(() => navigator.userAgent).catch(() => ''),\n platform: await page.evaluate(() => navigator.platform).catch(() => ''),\n };\n const runtimeState = buildScopedRuntimeState(page, options.runtimeState, device);\n let emulation = null;\n\n attachRuntimeState(page, runtimeState);\n try {\n emulation = await applyDeviceEmulation(page, descriptor, device, options);\n return await callback({\n page,\n device,\n descriptor,\n runtimeState,\n });\n } finally {\n restoreRuntimeState(page, snapshot);\n await restoreDeviceEmulation(page, emulation, snapshot);\n }\n },\n};\n", "import delay from 'delay';\nimport { DefaultHumanizeDevice } from './default.js';\nimport { CloakHumanizeInput } from './cloak.js';\nimport { jitterMs as sharedJitterMs } from './shared.js';\n\nexport const HumanizeCommon = {\n jitterMs(base, jitterPercent = 0.3) {\n return sharedJitterMs(base, jitterPercent);\n },\n\n async randomSleep(pageOrBaseMs, maybeBaseMs, maybeJitterPercent) {\n const hasPage = pageOrBaseMs && typeof pageOrBaseMs === 'object' && typeof pageOrBaseMs.evaluate === 'function';\n const baseMs = hasPage ? maybeBaseMs : pageOrBaseMs;\n const jitterPercent = hasPage ? maybeJitterPercent : maybeBaseMs;\n await delay(sharedJitterMs(baseMs, jitterPercent ?? 0.3));\n },\n};\n\nexport const DefaultHumanize = Object.assign({}, DefaultHumanizeDevice, HumanizeCommon);\nexport const CloakHumanize = Object.assign({}, CloakHumanizeInput, HumanizeCommon);\n", "import delay from 'delay';\nimport { createCursor } from 'ghost-cursor-playwright';\nimport { createInternalLogger } from '../logger.js';\n\nconst logger = createInternalLogger('Humanize');\n\n// \u5185\u90E8 cursor \u5B9E\u4F8B\u7F13\u5B58 (\u6BCF\u4E2A page \u4E00\u4E2A) - \u4E0D\u5BF9\u5916\u66B4\u9732\nconst $CursorWeakMap = new WeakMap();\n\n/**\n * \u5185\u90E8\u65B9\u6CD5\uFF1A\u83B7\u53D6\u9875\u9762\u7684 cursor\uFF0C\u5982\u679C\u4E0D\u5B58\u5728\u5219\u629B\u51FA\u9519\u8BEF\n */\nfunction $GetCursor(page) {\n const cursor = $CursorWeakMap.get(page);\n if (!cursor) {\n throw new Error('Cursor \u672A\u521D\u59CB\u5316\uFF0C\u8BF7\u5148\u8C03\u7528 Humanize.initializeCursor(page)');\n }\n return cursor;\n}\n\nexport const Humanize = {\n /**\n * \u751F\u6210\u5E26\u6296\u52A8\u7684\u6BEB\u79D2\u6570 - \u57FA\u4E8E\u57FA\u7840\u503C\u6DFB\u52A0\u968F\u673A\u6D6E\u52A8 (\u00B130% \u9ED8\u8BA4)\n * @param {number} base - \u57FA\u7840\u5EF6\u8FDF (ms)\n * @param {number} [jitterPercent=0.3] - \u6296\u52A8\u767E\u5206\u6BD4 (0.3 = \u00B130%)\n * @returns {number} \u6296\u52A8\u540E\u7684\u6BEB\u79D2\u6570\n */\n jitterMs(base, jitterPercent = 0.3) {\n const jitter = base * jitterPercent * (Math.random() * 2 - 1);\n return Math.max(10, Math.round(base + jitter));\n },\n\n /**\n * \u521D\u59CB\u5316\u9875\u9762\u7684 Ghost Cursor\uFF08\u5FC5\u987B\u5728\u4F7F\u7528\u5176\u4ED6 cursor \u76F8\u5173\u65B9\u6CD5\u524D\u8C03\u7528\uFF09\n *\n * @param {import('playwright').Page} page\n * @returns {Promise<void>}\n */\n async initializeCursor(page) {\n if ($CursorWeakMap.has(page)) {\n logger.debug('initializeCursor: cursor already exists, skipping');\n return;\n }\n logger.start('initializeCursor', 'creating cursor');\n const cursor = await createCursor(page);\n $CursorWeakMap.set(page, cursor);\n logger.success('initializeCursor', 'cursor initialized');\n },\n\n /**\n * \u4EBA\u7C7B\u5316\u9F20\u6807\u79FB\u52A8 - \u4F7F\u7528 ghost-cursor \u79FB\u52A8\u5230\u6307\u5B9A\u4F4D\u7F6E\u6216\u5143\u7D20\n *\n * @param {import('playwright').Page} page\n * @param {string|{x: number, y: number}|import('playwright').ElementHandle} target - CSS\u9009\u62E9\u5668\u3001\u5750\u6807\u5BF9\u8C61\u6216\u5143\u7D20\u53E5\u67C4\n */\n async humanMove(page, target) {\n const cursor = $GetCursor(page);\n logger.start('humanMove', `target=${typeof target === 'string' ? target : 'element/coords'}`);\n try {\n if (typeof target === 'string') {\n // \u684C\u9762\u7AEF\u79FB\u52A8\u4ECD\u7136\u8D70\u771F\u5B9E\u9F20\u6807\u8F68\u8FF9\uFF0C\u53EA\u662F\u5148\u628A\u9009\u62E9\u5668\u6362\u7B97\u6210\u5143\u7D20\u51E0\u4F55\u4E2D\u5FC3\u3002\n const element = await page.$(target);\n if (!element) {\n logger.warn(`humanMove: \u5143\u7D20\u4E0D\u5B58\u5728 ${target}`);\n return false;\n }\n const box = await element.boundingBox();\n if (!box) {\n logger.warn(`humanMove: \u65E0\u6CD5\u83B7\u53D6\u4F4D\u7F6E ${target}`);\n return false;\n }\n const x = box.x + box.width / 2 + (Math.random() - 0.5) * box.width * 0.2;\n const y = box.y + box.height / 2 + (Math.random() - 0.5) * box.height * 0.2;\n await cursor.actions.move({ x, y });\n } else if (target && typeof target.x === 'number' && typeof target.y === 'number') {\n // \u7EAF\u5750\u6807\u76EE\u6807\u4E0D\u518D\u505A\u989D\u5916\u8BED\u4E49\u5904\u7406\u3002\n await cursor.actions.move(target);\n } else if (target && typeof target.boundingBox === 'function') {\n // ElementHandle \u540C\u6837\u53EA\u505A\u51E0\u4F55\u6362\u7B97\uFF0C\u4E0D\u6539\u5199\u539F\u59CB\u4EA4\u4E92\u542B\u4E49\u3002\n const box = await target.boundingBox();\n if (box) {\n const x = box.x + box.width / 2 + (Math.random() - 0.5) * box.width * 0.2;\n const y = box.y + box.height / 2 + (Math.random() - 0.5) * box.height * 0.2;\n await cursor.actions.move({ x, y });\n }\n }\n logger.success('humanMove');\n return true;\n } catch (error) {\n logger.fail('humanMove', error);\n throw error;\n }\n },\n\n /**\n * \u6E10\u8FDB\u5F0F\u6EDA\u52A8\u5230\u5143\u7D20\u53EF\u89C1\uFF08\u4EC5\u5904\u7406 Y \u8F74\u6EDA\u52A8\uFF09\n * \u8FD4\u56DE restore \u65B9\u6CD5\uFF0C\u7528\u4E8E\u5C06\u6EDA\u52A8\u5BB9\u5668\u6062\u590D\u5230\u539F\u4F4D\u7F6E\n *\n * @param {import('playwright').Page} page\n * @param {string|import('playwright').ElementHandle} target - CSS \u9009\u62E9\u5668\u6216\u5143\u7D20\u53E5\u67C4\n * @param {Object} [options]\n * @param {number} [options.maxSteps=20] - \u6700\u5927\u6EDA\u52A8\u6B65\u6570\n * @param {number} [options.minStep=260] - \u5355\u6B21\u6EDA\u52A8\u6700\u5C0F\u6B65\u957F\n * @param {number} [options.maxStep=800] - \u5355\u6B21\u6EDA\u52A8\u6700\u5927\u6B65\u957F\n * @param {number} [options.maxDurationMs] - \u6700\u957F\u8017\u65F6\u4E0A\u9650 (\u9ED8\u8BA4\u968F maxSteps \u4F30\u7B97)\n */\n async humanScroll(page, target, options = {}) {\n const {\n maxSteps = 20,\n minStep = 260,\n maxStep = 800,\n maxDurationMs = maxSteps * 220 + 800\n } = options;\n const targetDesc = typeof target === 'string' ? target : 'ElementHandle';\n\n logger.start('humanScroll', `target=${targetDesc}`);\n\n let element;\n if (typeof target === 'string') {\n element = await page.$(target);\n if (!element) {\n logger.warn(`humanScroll | \u5143\u7D20\u672A\u627E\u5230: ${target}`);\n return { element: null, didScroll: false };\n }\n } else {\n element = target;\n }\n\n const cursor = $GetCursor(page);\n let didScroll = false;\n\n // \u684C\u9762\u7AEF\u5148\u786E\u8BA4\u201C\u662F\u5426\u771F\u9700\u8981\u6EDA\u201D\uFF0C\u907F\u514D\u628A\u56FA\u5B9A\u5BB9\u5668\u6216\u5DF2\u7ECF\u53EF\u89C1\u7684\u5143\u7D20\u6EDA\u4E71\u3002\n const checkVisibility = async () => {\n return await element.evaluate((el) => {\n const rect = el.getBoundingClientRect();\n if (!rect || rect.width === 0 || rect.height === 0) {\n return { code: 'ZERO_DIMENSIONS', reason: '\u5C3A\u5BF8\u4E3A\u96F6' };\n }\n\n const cx = rect.left + rect.width / 2;\n const cy = rect.top + rect.height / 2;\n const viewH = window.innerHeight;\n const viewW = window.innerWidth;\n let isFixed = false;\n\n for (let node = el; node && node !== document.body; node = node.parentElement) {\n const style = window.getComputedStyle(node);\n if (style && style.position === 'fixed') {\n isFixed = true;\n break;\n }\n }\n\n // 1. \u5148\u770B\u51E0\u4F55\u4F4D\u7F6E\u662F\u5426\u5DF2\u7ECF\u843D\u5728\u89C6\u53E3\u91CC\u3002\n if (cy < 0 || cy > viewH || cx < 0 || cx > viewW) {\n // \u9700\u8981\u6EDA\u52A8\u65F6\uFF0C\u5148\u6839\u636E\u4E2D\u5FC3\u70B9\u4F4D\u7F6E\u63A8\u65AD\u65B9\u5411\u3002\n const direction = cy < 0 ? 'up' : (cy > viewH ? 'down' : 'unknown');\n return { code: 'OUT_OF_VIEWPORT', reason: '\u4E0D\u5728\u89C6\u53E3\u5185', direction, cy, viewH, isFixed };\n }\n\n // 2. \u518D\u68C0\u67E5\u4E2D\u5FC3\u70B9\u662F\u5426\u88AB\u522B\u7684\u5143\u7D20\u76D6\u4F4F\u3002\n const pointElement = document.elementFromPoint(cx, cy);\n if (pointElement && !el.contains(pointElement) && !pointElement.contains(el)) {\n return {\n code: 'OBSTRUCTED',\n reason: '\u88AB\u906E\u6321',\n obstruction: {\n tag: pointElement.tagName,\n id: pointElement.id,\n className: pointElement.className\n },\n cy, // Return Center Y for smart direction calculation\n viewH,\n isFixed\n };\n }\n\n return { code: 'VISIBLE', isFixed };\n });\n };\n\n const getScrollableRect = async () => {\n // \u53EA\u5728\u76EE\u6807\u7956\u5148\u94FE\u91CC\u627E\u771F\u6B63\u53EF\u6EDA\u52A8\u7684\u5BB9\u5668\uFF0C\u4E0D\u628A\u6574\u4E2A window \u5F53\u6210\u9ED8\u8BA4\u7B54\u6848\u3002\n return await element.evaluate((el) => {\n const isScrollable = (node) => {\n const style = window.getComputedStyle(node);\n if (!style) return false;\n const overflowY = style.overflowY;\n if (!['auto', 'scroll', 'overlay'].includes(overflowY)) return false;\n return node.scrollHeight > node.clientHeight + 1;\n };\n\n let current = el;\n while (current && current !== document.body) {\n if (isScrollable(current)) {\n const rect = current.getBoundingClientRect();\n if (rect && rect.width > 0 && rect.height > 0) {\n return { x: rect.x, y: rect.y, width: rect.width, height: rect.height };\n }\n }\n current = current.parentElement;\n }\n\n return null;\n });\n };\n\n const startTime = Date.now();\n\n try {\n for (let i = 0; i < maxSteps; i++) {\n if (Date.now() - startTime > maxDurationMs) {\n logger.warn(`humanScroll | \u8D85\u65F6\u4FDD\u62A4\u89E6\u53D1 (${maxDurationMs}ms)`);\n return { element, didScroll };\n }\n\n const status = await checkVisibility();\n\n if (status.code === 'VISIBLE') {\n if (status.isFixed) {\n logger.info('humanScroll | fixed \u5BB9\u5668\u5185\uFF0C\u8DF3\u8FC7\u6EDA\u52A8');\n } else {\n logger.debug('humanScroll | \u5143\u7D20\u53EF\u89C1\u4E14\u65E0\u906E\u6321');\n }\n logger.success('humanScroll', didScroll ? '\u5DF2\u6EDA\u52A8' : '\u65E0\u9700\u6EDA\u52A8');\n return { element, didScroll };\n }\n\n logger.debug(`humanScroll | \u6B65\u9AA4 ${i + 1}/${maxSteps}: ${status.reason} ${status.direction ? `(${status.direction})` : ''}`);\n\n if (status.code === 'OBSTRUCTED' && status.obstruction) {\n logger.debug(`humanScroll | \u88AB\u4EE5\u4E0B\u5143\u7D20\u906E\u6321 <${status.obstruction.tag} id=\"${status.obstruction.id}\">`);\n }\n\n const scrollRect = await getScrollableRect();\n if (!scrollRect && status.isFixed) {\n logger.warn('humanScroll | fixed \u5BB9\u5668\u5185\u4E14\u65E0\u53EF\u6EDA\u52A8\u7956\u5148\uFF0C\u8DF3\u8FC7\u6EDA\u52A8');\n return { element, didScroll };\n }\n\n const stepMin = scrollRect ? Math.min(minStep, Math.max(60, scrollRect.height * 0.4)) : minStep;\n const stepMax = scrollRect ? Math.min(maxStep, Math.max(stepMin + 40, scrollRect.height * 0.8)) : maxStep;\n\n // \u6839\u636E\u201C\u51FA\u89C6\u53E3 / \u906E\u6321\u201D\u4E24\u79CD\u72B6\u6001\u5206\u522B\u51B3\u5B9A\u6EDA\u52A8\u65B9\u5411\u548C\u8DDD\u79BB\u3002\n let deltaY = 0;\n if (status.code === 'OUT_OF_VIEWPORT') {\n if (status.direction === 'down') {\n deltaY = stepMin + Math.random() * (stepMax - stepMin);\n } else if (status.direction === 'up') {\n deltaY = -(stepMin + Math.random() * (stepMax - stepMin));\n } else {\n // \u6C34\u5E73\u95EE\u9898\u6216\u5947\u602A\u72B6\u6001\uFF0C\u5C1D\u8BD5\u5411\u4E0B\u6EDA\u52A8\u4E00\u70B9\n deltaY = 100;\n }\n } else if (status.code === 'OBSTRUCTED') {\n // \u906E\u6321\u573A\u666F\u4F18\u5148\u6839\u636E\u5143\u7D20\u843D\u70B9\u63A8\u65B9\u5411\uFF0C\u5C3D\u91CF\u6A21\u62DF\u4EBA\u5DE5\u201C\u5F80\u66F4\u53EF\u80FD\u9732\u51FA\u7684\u65B9\u5411\u518D\u8BD5\u4E00\u6B21\u201D\u3002\n const halfY = scrollRect ? (scrollRect.y + scrollRect.height / 2) : (status.viewH / 2);\n const isBottomHalf = status.cy > halfY;\n const direction = isBottomHalf ? 1 : -1;\n\n // \u57FA\u7840\u6EDA\u52A8\u91CF\u518D\u53E0\u4E00\u70B9\u968F\u673A\u6CE2\u52A8\uFF0C\u4FDD\u6301\u884C\u4E3A\u4E0D\u90A3\u4E48\u673A\u68B0\u3002\n deltaY = direction * (stepMin + Math.random() * 50);\n }\n\n // \u9996\u6B21\u6EDA\u52A8\u524D\u628A\u9F20\u6807\u653E\u5230\u66F4\u53EF\u80FD\u63A5\u6536\u6EDA\u8F6E\u4E8B\u4EF6\u7684\u4F4D\u7F6E\u3002\n if (i === 0) {\n const viewSize = page.viewportSize();\n if (scrollRect) {\n const safeX = scrollRect.x + scrollRect.width * 0.5 + (Math.random() - 0.5) * Math.min(80, scrollRect.width * 0.4);\n const safeY = scrollRect.y + scrollRect.height * 0.5 + (Math.random() - 0.5) * Math.min(80, scrollRect.height * 0.4);\n await cursor.actions.move({ x: safeX, y: safeY });\n } else if (viewSize) {\n const safeX = viewSize.width * 0.5 + (Math.random() - 0.5) * 80;\n const safeY = viewSize.height * 0.5 + (Math.random() - 0.5) * 80;\n await cursor.actions.move({ x: safeX, y: safeY });\n }\n }\n\n // \u6267\u884C\u6EDA\u52A8\n await page.mouse.wheel(0, deltaY);\n didScroll = true;\n\n // \u7B49\u5F85\u6EDA\u52A8\u7A33\u5B9A - \u7D27\u51D1\u8282\u594F (20ms - 60ms)\n await delay(this.jitterMs(20 + Math.random() * 40, 0.2));\n }\n\n logger.warn(`humanScroll | \u5728 ${maxSteps} \u6B65\u540E\u65E0\u6CD5\u786E\u4FDD\u53EF\u89C1\u6027`);\n return { element, didScroll };\n\n } catch (error) {\n logger.fail('humanScroll', error);\n throw error;\n }\n },\n\n /**\n * \u4EBA\u7C7B\u5316\u70B9\u51FB - \u4F7F\u7528 ghost-cursor \u6A21\u62DF\u4EBA\u7C7B\u9F20\u6807\u79FB\u52A8\u8F68\u8FF9\u5E76\u70B9\u51FB\n *\n * @param {import('playwright').Page} page\n * @param {string|import('playwright').ElementHandle} [target] - CSS \u9009\u62E9\u5668\u6216\u5143\u7D20\u53E5\u67C4\u3002\u5982\u679C\u4E3A\u7A7A\uFF0C\u5219\u70B9\u51FB\u5F53\u524D\u9F20\u6807\u4F4D\u7F6E\n * @param {Object} [options]\n * @param {number} [options.reactionDelay=250] - \u53CD\u5E94\u5EF6\u8FDF\u57FA\u7840\u503C (ms)\uFF0C\u5B9E\u9645 \u00B130% \u6296\u52A8\n * @param {boolean} [options.throwOnMissing=true] - \u5143\u7D20\u4E0D\u5B58\u5728\u65F6\u662F\u5426\u629B\u51FA\u9519\u8BEF\n * @param {boolean} [options.scrollIfNeeded=true] - \u5143\u7D20\u4E0D\u5728\u89C6\u53E3\u65F6\u662F\u5426\u81EA\u52A8\u6EDA\u52A8\n */\n async humanClick(page, target, options = {}) {\n const cursor = $GetCursor(page);\n\n // \u589E\u52A0 restore \u9009\u9879\uFF0C\u9ED8\u8BA4 false (\u4E0D\u8FD8\u539F\u6EDA\u52A8\u4F4D\u7F6E)\n const { reactionDelay = 250, throwOnMissing = true, scrollIfNeeded = true, restore = false } = options;\n\n const targetDesc = target == null ? 'Current Position' : (typeof target === 'string' ? target : 'ElementHandle');\n logger.start('humanClick', `target=${targetDesc}`);\n\n\n const restoreOnce = async () => {\n if (restoreOnce.restored) return;\n restoreOnce.restored = true;\n\n if (typeof restoreOnce.do !== 'function') return;\n try {\n await delay(this.jitterMs(1000));\n await restoreOnce.do();\n } catch (restoreError) {\n logger.warn(`humanClick: \u6062\u590D\u6EDA\u52A8\u4F4D\u7F6E\u5931\u8D25: ${restoreError.message}`);\n }\n };\n\n\n try {\n // Case 1: \u70B9\u51FB\u5F53\u524D\u4F4D\u7F6E (target \u4E3A null/undefined)\n if (target == null) {\n // \u4EC5\u6267\u884C\u53CD\u5E94\u5EF6\u8FDF + \u70B9\u51FB\n await delay(this.jitterMs(reactionDelay, 0.4));\n await cursor.actions.click();\n logger.success('humanClick', 'Clicked current position');\n return true;\n }\n\n // Case 2: \u70B9\u51FB\u6307\u5B9A\u76EE\u6807\n let element;\n if (typeof target === 'string') {\n element = await page.$(target);\n if (!element) {\n if (throwOnMissing) {\n throw new Error(`\u627E\u4E0D\u5230\u5143\u7D20 ${target}`);\n }\n logger.warn(`humanClick: \u5143\u7D20\u4E0D\u5B58\u5728\uFF0C\u8DF3\u8FC7\u70B9\u51FB ${target}`);\n return false;\n }\n } else {\n element = target;\n }\n\n if (scrollIfNeeded) {\n const { restore: restoreFn, didScroll } = await this.humanScroll(page, element);\n // \u4EC5\u5728 didScroll \u4E3A true \u4E14 options.restore \u4E3A true \u65F6\u624D\u8FD8\u539F\n restoreOnce.do = (didScroll && restore) ? restoreFn : null;\n }\n\n const box = await element.boundingBox();\n if (!box) {\n await restoreOnce();\n if (throwOnMissing) {\n throw new Error('\u65E0\u6CD5\u83B7\u53D6\u5143\u7D20\u4F4D\u7F6E');\n }\n logger.warn('humanClick: \u65E0\u6CD5\u83B7\u53D6\u4F4D\u7F6E\uFF0C\u8DF3\u8FC7\u70B9\u51FB');\n return false;\n }\n\n const x = box.x + box.width / 2 + (Math.random() - 0.5) * box.width * 0.3;\n const y = box.y + box.height / 2 + (Math.random() - 0.5) * box.height * 0.3;\n\n await cursor.actions.move({ x, y });\n await delay(this.jitterMs(reactionDelay, 0.4));\n await cursor.actions.click();\n\n await restoreOnce();\n\n logger.success('humanClick');\n return true;\n } catch (error) {\n await restoreOnce();\n logger.fail('humanClick', error);\n throw error;\n }\n },\n\n /**\n * \u968F\u673A\u5EF6\u8FDF\u4E00\u6BB5\u6BEB\u79D2\u6570\uFF08\u5E26 \u00B130% \u6296\u52A8\uFF09\n * @param {number} baseMs - \u57FA\u7840\u5EF6\u8FDF\u6BEB\u79D2\u6570\n * @param {number} [jitterPercent=0.3] - \u6296\u52A8\u767E\u5206\u6BD4\n */\n async randomSleep(baseMs, jitterPercent = 0.3) {\n const ms = this.jitterMs(baseMs, jitterPercent);\n logger.start('randomSleep', `base=${baseMs}, actual=${ms}ms`);\n await delay(ms);\n logger.success('randomSleep');\n },\n\n /**\n * \u6A21\u62DF\u4EBA\u7C7B\"\u6CE8\u89C6\"\u6216\"\u9605\u8BFB\"\u884C\u4E3A\uFF1A\u9F20\u6807\u5728\u9875\u9762\u4E0A\u968F\u673A\u5FAE\u52A8\n * @param {import('playwright').Page} page\n * @param {number} [baseDurationMs=2500] - \u57FA\u7840\u6301\u7EED\u65F6\u95F4 (\u00B140% \u6296\u52A8)\n */\n async simulateGaze(page, baseDurationMs = 2500) {\n const cursor = $GetCursor(page);\n const durationMs = this.jitterMs(baseDurationMs, 0.4);\n logger.start('simulateGaze', `duration=${durationMs}ms`);\n const startTime = Date.now();\n const viewportSize = page.viewportSize() || { width: 1920, height: 1080 };\n\n while (Date.now() - startTime < durationMs) {\n // \u5728\u89C6\u53E3\u8303\u56F4\u5185\u968F\u673A\u79FB\u52A8\n const x = 100 + Math.random() * (viewportSize.width - 200);\n const y = 100 + Math.random() * (viewportSize.height - 200);\n await cursor.actions.move({ x, y });\n // \u6CE8\u89C6\u505C\u7559 300-1200ms\n await delay(this.jitterMs(600, 0.5));\n }\n logger.success('simulateGaze');\n },\n\n /**\n * \u4EBA\u7C7B\u5316\u8F93\u5165 - \u5E26\u8282\u594F\u53D8\u5316\uFF08\u5FEB-\u6162-\u505C\u987F-\u5076\u5C14\u52A0\u901F\uFF09\n * @param {import('playwright').Page} page\n * @param {string} selector - \u8F93\u5165\u6846\u9009\u62E9\u5668\n * @param {string} text - \u8981\u8F93\u5165\u7684\u6587\u672C\n * @param {Object} [options]\n * @param {number} [options.baseDelay=180] - \u57FA\u7840\u6309\u952E\u5EF6\u8FDF (ms)\uFF0C\u5B9E\u9645 \u00B140% \u6296\u52A8\n * @param {number} [options.pauseProbability=0.08] - \u505C\u987F\u6982\u7387 (0-1)\n * @param {number} [options.pauseBase=800] - \u505C\u987F\u65F6\u957F\u57FA\u7840\u503C (ms)\uFF0C\u5B9E\u9645 \u00B150% \u6296\u52A8\n */\n async humanType(page, selector, text, options = {}) {\n logger.start('humanType', `selector=${selector}, textLen=${text.length}`);\n const {\n baseDelay = 180,\n pauseProbability = 0.08,\n pauseBase = 800\n } = options;\n\n try {\n const locator = page.locator(selector);\n await Humanize.humanClick(page, locator);\n\n // \u70B9\u51FB\u540E\u601D\u8003\u5EF6\u8FDF\n await delay(this.jitterMs(200, 0.4));\n\n for (let i = 0; i < text.length; i++) {\n const char = text[i];\n let charDelay;\n\n if (char === ' ') {\n // \u7A7A\u683C\u952E\u7A0D\u5FEB\n charDelay = this.jitterMs(baseDelay * 0.6, 0.3);\n } else if (/[,.!?;:\uFF0C\u3002\uFF01\uFF1F\uFF1B\uFF1A]/.test(char)) {\n // \u6807\u70B9\u7B26\u53F7\u540E\u7A0D\u6162\uFF08\u6A21\u62DF\u601D\u8003\uFF09\n charDelay = this.jitterMs(baseDelay * 1.5, 0.4);\n } else {\n // \u666E\u901A\u5B57\u7B26\n charDelay = this.jitterMs(baseDelay, 0.4);\n }\n\n await page.keyboard.type(char);\n await delay(charDelay);\n\n // \u968F\u673A\u505C\u987F\uFF08\u6A21\u62DF\u601D\u8003/\u56DE\u987E\uFF09\n if (Math.random() < pauseProbability && i < text.length - 1) {\n const pauseTime = this.jitterMs(pauseBase, 0.5);\n logger.debug(`\u505C\u987F ${pauseTime}ms...`);\n await delay(pauseTime);\n }\n }\n logger.success('humanType');\n } catch (error) {\n logger.fail('humanType', error);\n throw error;\n }\n },\n\n /**\n * \u4EBA\u7C7B\u5316\u6309\u952E - \u6A21\u62DF\u7528\u6237\u5728\u5F53\u524D\u7126\u70B9\u6216\u6307\u5B9A\u76EE\u6807\u4E0A\u6309\u4E0B\u4E00\u6B21\u952E\u3002\n * @param {import('playwright').Page} page\n * @param {string|import('playwright').ElementHandle|import('playwright').Locator} targetOrKey - \u76EE\u6807\u6216\u6309\u952E\n * @param {string|Object} [maybeKey] - \u6309\u952E\u6216\u9009\u9879\n * @param {Object} [options]\n */\n async humanPress(page, targetOrKey, maybeKey, options = {}) {\n const hasTarget = typeof maybeKey === 'string';\n const key = hasTarget ? maybeKey : targetOrKey;\n const pressOptions = hasTarget ? options : (maybeKey || options);\n const {\n reactionDelay = 180,\n holdDelay = 45,\n focusDelay = 180,\n scrollIfNeeded = true,\n throwOnMissing = true,\n keyboardOptions = {},\n } = pressOptions || {};\n const targetDesc = hasTarget\n ? (typeof targetOrKey === 'string' ? targetOrKey : 'ElementHandle')\n : 'current focus';\n\n logger.start('humanPress', `key=${key}, target=${targetDesc}`);\n\n try {\n if (hasTarget) {\n await this.humanClick(page, targetOrKey, { reactionDelay: focusDelay, scrollIfNeeded, throwOnMissing });\n }\n\n await delay(this.jitterMs(reactionDelay, 0.45));\n await page.keyboard.press(key, {\n ...keyboardOptions,\n delay: this.jitterMs(holdDelay, 0.5),\n });\n logger.success('humanPress');\n return true;\n } catch (error) {\n logger.fail('humanPress', error);\n throw error;\n }\n },\n\n /**\n * \u4EBA\u7C7B\u5316\u6E05\u7A7A\u8F93\u5165\u6846 - \u6A21\u62DF\u4EBA\u7C7B\u5220\u9664\u6587\u672C\u7684\u884C\u4E3A\n * @param {import('playwright').Page} page\n * @param {string} selector - \u8F93\u5165\u6846\u9009\u62E9\u5668\n */\n async humanClear(page, selector) {\n logger.start('humanClear', `selector=${selector}`);\n try {\n const locator = page.locator(selector);\n await locator.click();\n await delay(this.jitterMs(200, 0.4));\n\n const currentValue = await locator.inputValue();\n if (!currentValue || currentValue.length === 0) {\n logger.success('humanClear', 'already empty');\n return;\n }\n\n // \u5168\u9009 + \u5220\u9664\n await page.keyboard.press('Meta+A');\n await delay(this.jitterMs(100, 0.4));\n await page.keyboard.press('Backspace');\n\n logger.success('humanClear');\n } catch (error) {\n logger.fail('humanClear', error);\n throw error;\n }\n },\n\n /**\n * \u9875\u9762\u9884\u70ED\u6D4F\u89C8 - \u6A21\u62DF\u4EBA\u7C7B\u8FDB\u5165\u9875\u9762\u540E\u7684\u63A2\u7D22\u884C\u4E3A\n * @param {import('playwright').Page} page\n * @param {number} [baseDuration=3500] - \u9884\u70ED\u65F6\u957F\u57FA\u7840\u503C (\u00B140% \u6296\u52A8)\n */\n async warmUpBrowsing(page, baseDuration = 3500) {\n const cursor = $GetCursor(page);\n const durationMs = this.jitterMs(baseDuration, 0.4);\n\n logger.start('warmUpBrowsing', `duration=${durationMs}ms`);\n const startTime = Date.now();\n const viewportSize = page.viewportSize() || { width: 1920, height: 1080 };\n\n try {\n while (Date.now() - startTime < durationMs) {\n const action = Math.random();\n\n if (action < 0.4) {\n // \u9F20\u6807\u79FB\u52A8\n const x = 100 + Math.random() * (viewportSize.width - 200);\n const y = 100 + Math.random() * (viewportSize.height - 200);\n await cursor.actions.move({ x, y });\n await delay(this.jitterMs(350, 0.4));\n } else if (action < 0.7) {\n // \u6EDA\u52A8\n const scrollY = (Math.random() - 0.5) * 200;\n await page.mouse.wheel(0, scrollY);\n await delay(this.jitterMs(500, 0.4));\n } else {\n // \u505C\u987F/\u6CE8\u89C6\n await delay(this.jitterMs(800, 0.5));\n }\n }\n logger.success('warmUpBrowsing');\n } catch (error) {\n logger.fail('warmUpBrowsing', error);\n throw error;\n }\n },\n\n /**\n * \u81EA\u7136\u6EDA\u52A8 - \u5E26\u60EF\u6027\u3001\u51CF\u901F\u6548\u679C\u548C\u968F\u673A\u6296\u52A8\n * @param {import('playwright').Page} page\n * @param {'up' | 'down'} [direction='down'] - \u6EDA\u52A8\u65B9\u5411\n * @param {number} [distance=300] - \u603B\u6EDA\u52A8\u8DDD\u79BB\u57FA\u7840\u503C (px)\uFF0C\u00B115% \u6296\u52A8\n * @param {number} [baseSteps=5] - \u5206\u51E0\u6B65\u5B8C\u6210\u57FA\u7840\u503C\uFF0C\u00B11 \u968F\u673A\n */\n async naturalScroll(page, direction = 'down', distance = 300, baseSteps = 5) {\n // steps \u52A0\u968F\u673A\u6D6E\u52A8 \u00B11\n const steps = Math.max(3, baseSteps + Math.floor(Math.random() * 3) - 1);\n // distance \u52A0\u6296\u52A8\n const actualDistance = this.jitterMs(distance, 0.15);\n\n logger.start('naturalScroll', `dir=${direction}, dist=${actualDistance}, steps=${steps}`);\n const sign = direction === 'down' ? 1 : -1;\n const stepDistance = actualDistance / steps;\n\n try {\n for (let i = 0; i < steps; i++) {\n // \u60EF\u6027\u51CF\u901F\u56E0\u5B50\n const factor = 1 - (i / steps) * 0.5;\n // \u6BCF\u6B65\u52A0 \u00B110% \u6296\u52A8\n const jitter = 0.9 + Math.random() * 0.2;\n const scrollAmount = stepDistance * factor * sign * jitter;\n\n await page.mouse.wheel(0, scrollAmount);\n\n // \u5EF6\u8FDF\u4E5F\u5E26\u6296\u52A8\n const baseDelay = 60 + i * 25;\n await delay(this.jitterMs(baseDelay, 0.3));\n }\n logger.success('naturalScroll');\n } catch (error) {\n logger.fail('naturalScroll', error);\n throw error;\n }\n }\n}\n", "import delay from 'delay';\n\nexport const jitterMs = (base, jitterPercent = 0.3) => {\n const jitter = Number(base || 0) * Number(jitterPercent || 0) * (Math.random() * 2 - 1);\n return Math.max(10, Math.round(Number(base || 0) + jitter));\n};\n\nexport const randomPointInBox = (box, paddingRatio = 0.24) => {\n const safePaddingX = Math.max(2, Math.min(box.width * paddingRatio, box.width / 2));\n const safePaddingY = Math.max(2, Math.min(box.height * paddingRatio, box.height / 2));\n const x = box.x + safePaddingX + Math.random() * Math.max(1, box.width - safePaddingX * 2);\n const y = box.y + safePaddingY + Math.random() * Math.max(1, box.height - safePaddingY * 2);\n return { x, y };\n};\n\nexport const resolveElement = async (page, target, { throwOnMissing = true } = {}) => {\n if (target == null) return null;\n\n let element = target;\n if (typeof target === 'string') {\n element = await page.$(target);\n }\n\n if (!element) {\n if (throwOnMissing) {\n throw new Error(`\u627E\u4E0D\u5230\u5143\u7D20 ${String(target)}`);\n }\n return null;\n }\n\n return element;\n};\n\nexport const waitJitter = (base, jitterPercent = 0.3) => delay(jitterMs(base, jitterPercent));\n", "import { createInternalLogger } from '../logger.js';\nimport {\n jitterMs,\n resolveElement,\n waitJitter,\n} from './shared.js';\n\nconst logger = createInternalLogger('Humanize.Mobile');\n\nconst initializedPages = new WeakSet();\nconst DEFAULT_TAP_TIMEOUT_MS = 2500;\nconst DEFAULT_MOUSE_TAP_FALLBACK_TIMEOUT_MS = 1200;\nconst DEFAULT_ACTIVATE_FALLBACK_TIMEOUT_MS = 900;\n\nconst clamp = (value, min, max) => Math.min(max, Math.max(min, value));\n\n// \u79FB\u52A8\u7AEF\u5206\u652F\u9ED8\u8BA4\u4EE5\u5F53\u524D\u9875\u9762\u89C6\u53E3\u4E3A\u51C6\uFF0C\u53EA\u6709\u7F3A\u5931\u65F6\u624D\u56DE\u843D\u5230\u5E38\u89C1\u624B\u673A\u5C3A\u5BF8\u3002\nconst resolveViewport = (page) => page?.viewportSize?.() || { width: 390, height: 844 };\n\nconst describeTarget = (target) => {\n if (target == null) return 'Current Position';\n return typeof target === 'string' ? target : 'ElementHandle';\n};\n\nconst clipBoxToViewport = (box, viewport) => {\n if (!box || !viewport) return box;\n const left = clamp(box.x, 0, viewport.width);\n const top = clamp(box.y, 0, viewport.height);\n const right = clamp(box.x + box.width, 0, viewport.width);\n const bottom = clamp(box.y + box.height, 0, viewport.height);\n if (right - left > 1 && bottom - top > 1) {\n return {\n x: left,\n y: top,\n width: right - left,\n height: bottom - top,\n };\n }\n return box;\n};\n\nconst centerPointInBox = (box) => ({\n x: box.x + box.width / 2,\n y: box.y + box.height / 2,\n});\n\nconst withTimeout = async (operation, timeoutMs, label) => {\n const safeTimeoutMs = Math.max(50, Number(timeoutMs || 0));\n let timeoutId = null;\n try {\n return await Promise.race([\n Promise.resolve().then(operation),\n new Promise((_, reject) => {\n timeoutId = setTimeout(() => {\n reject(new Error(`${label} timeout after ${safeTimeoutMs}ms`));\n }, safeTimeoutMs);\n }),\n ]);\n } finally {\n if (timeoutId) clearTimeout(timeoutId);\n }\n};\n\nconst checkElementVisibility = async (element) => {\n return element.evaluate((el) => {\n const targetStyle = window.getComputedStyle(el);\n if (\n !targetStyle\n || targetStyle.display === 'none'\n || targetStyle.visibility === 'hidden'\n || targetStyle.visibility === 'collapse'\n ) {\n return { code: 'NOT_INTERACTABLE', reason: '\u5143\u7D20\u4E0D\u53EF\u89C1', direction: 'down' };\n }\n\n const rect = el.getBoundingClientRect();\n if (!rect || rect.width <= 0 || rect.height <= 0) {\n return { code: 'ZERO_DIMENSIONS', reason: '\u5C3A\u5BF8\u4E3A\u96F6', direction: 'down' };\n }\n\n const viewW = window.innerWidth;\n const viewH = window.innerHeight;\n const centerY = rect.top + rect.height / 2;\n let clipLeft = 0;\n let clipRight = viewW;\n let clipTop = 0;\n let clipBottom = viewH;\n let isFixed = false;\n let positioning = null;\n\n for (let node = el; node && node !== document.body; node = node.parentElement) {\n const style = window.getComputedStyle(node);\n if (style && (style.position === 'fixed' || style.position === 'sticky')) {\n isFixed = true;\n positioning = style.position;\n break;\n }\n }\n\n for (let node = el.parentElement; node && node !== document.body; node = node.parentElement) {\n const style = window.getComputedStyle(node);\n if (!style) continue;\n const clipsY = ['auto', 'scroll', 'overlay', 'hidden', 'clip'].includes(style.overflowY);\n const clipsX = ['auto', 'scroll', 'overlay', 'hidden', 'clip'].includes(style.overflowX);\n if (!clipsX && !clipsY) continue;\n const nodeRect = node.getBoundingClientRect();\n if (!nodeRect || nodeRect.width <= 0 || nodeRect.height <= 0) continue;\n if (clipsX) {\n clipLeft = Math.max(clipLeft, nodeRect.left);\n clipRight = Math.min(clipRight, nodeRect.right);\n }\n if (clipsY) {\n clipTop = Math.max(clipTop, nodeRect.top);\n clipBottom = Math.min(clipBottom, nodeRect.bottom);\n }\n }\n\n // \u53EA\u8BA1\u7B97\u201C\u5728\u5F53\u524D\u88C1\u526A\u5BB9\u5668\u5185\u771F\u5B9E\u9732\u51FA\u7684\u90E8\u5206\u201D\uFF0C\u907F\u514D\u88AB\u5916\u5C42 overflow \u88C1\u6389\u7684\u533A\u57DF\u8BEF\u5BFC\u540E\u7EED tap \u70B9\u3002\n const visibleLeft = Math.max(clipLeft, Math.min(clipRight, rect.left));\n const visibleRight = Math.max(clipLeft, Math.min(clipRight, rect.right));\n const visibleTop = Math.max(clipTop, Math.min(clipBottom, rect.top));\n const visibleBottom = Math.max(clipTop, Math.min(clipBottom, rect.bottom));\n const visibleWidth = visibleRight - visibleLeft;\n const visibleHeight = visibleBottom - visibleTop;\n const cx = visibleLeft + visibleWidth / 2;\n const cy = visibleTop + visibleHeight / 2;\n\n if (visibleWidth <= 1 || visibleHeight <= 1) {\n return {\n code: 'OUT_OF_VIEWPORT',\n reason: '\u4E0D\u5728\u89C6\u53E3\u5185',\n direction: centerY < clipTop ? 'up' : 'down',\n cy: centerY,\n viewH,\n isFixed,\n positioning,\n };\n }\n\n const isRootNode = (node) => (\n !node\n || node === document\n || node === document.body\n || node === document.documentElement\n );\n const commonAncestor = (a, b) => {\n for (let current = a; current && !isRootNode(current); current = current.parentElement) {\n if (current.contains(b)) return current;\n }\n return null;\n };\n const sameTapTarget = (pointElement) => {\n if (!pointElement) return false;\n if (pointElement === el || el.contains(pointElement) || pointElement.contains(el)) {\n return true;\n }\n\n const common = commonAncestor(el, pointElement);\n if (!common) return false;\n const commonRect = common.getBoundingClientRect?.();\n if (!commonRect || commonRect.width <= 0 || commonRect.height <= 0) return false;\n\n const commonArea = commonRect.width * commonRect.height;\n const targetArea = Math.max(1, rect.width * rect.height);\n const maxSharedRegionArea = Math.max(targetArea * 12, 4096);\n if (commonArea > maxSharedRegionArea) return false;\n if (\n commonRect.width > Math.max(rect.width * 8, 120)\n || commonRect.height > Math.max(rect.height * 8, 120)\n ) {\n return false;\n }\n\n return common.contains(el) && common.contains(pointElement);\n };\n\n const describeElement = (node) => {\n if (!node) return null;\n const className = typeof node.className === 'string'\n ? node.className\n : (node.className && typeof node.className.baseVal === 'string' ? node.className.baseVal : '');\n const rect = node.getBoundingClientRect?.();\n const style = window.getComputedStyle(node);\n return {\n tag: node.tagName,\n id: node.id || '',\n className,\n isFixed: Boolean(style && (style.position === 'fixed' || style.position === 'sticky')),\n positioning: style?.position || '',\n top: rect ? rect.top : null,\n bottom: rect ? rect.bottom : null,\n left: rect ? rect.left : null,\n right: rect ? rect.right : null,\n };\n };\n\n // \u53EA\u770B\u4E2D\u5FC3\u70B9\u4F1A\u8BA9\u5F88\u591A\u79FB\u52A8\u7AEF\u5143\u7D20\u88AB\u8BEF\u5224\uFF1B\u591A\u91C7\u6837\u51E0\u4E2A\u70B9\u66F4\u63A5\u8FD1\u771F\u5B9E tap \u8F68\u8FF9\u3002\n const samplePoints = [\n { x: cx, y: cy },\n { x: visibleLeft + Math.min(8, Math.max(1, visibleWidth * 0.25)), y: cy },\n { x: visibleRight - Math.min(8, Math.max(1, visibleWidth * 0.25)), y: cy },\n { x: cx, y: visibleTop + Math.min(8, Math.max(1, visibleHeight * 0.25)) },\n { x: cx, y: visibleBottom - Math.min(8, Math.max(1, visibleHeight * 0.25)) },\n ];\n\n let obstruction = null;\n for (const point of samplePoints) {\n const pointElement = document.elementFromPoint(point.x, point.y);\n if (sameTapTarget(pointElement)) {\n return { code: 'VISIBLE', isFixed, positioning };\n }\n obstruction = obstruction || describeElement(pointElement);\n }\n\n if (obstruction) {\n return {\n code: 'OBSTRUCTED',\n reason: '\u88AB\u906E\u6321',\n direction: cy > viewH / 2 ? 'down' : 'up',\n obstruction,\n cy,\n viewH,\n isFixed,\n positioning,\n };\n }\n\n return { code: 'VISIBLE', isFixed, positioning };\n });\n};\n\nconst activateElementFallback = async (element, point = null, options = {}) => {\n return element.evaluate((el, { innerOptions }) => {\n const isEditable = (node) => {\n if (!node || node.nodeType !== Node.ELEMENT_NODE) return false;\n if (node.isContentEditable) return true;\n if (node instanceof HTMLTextAreaElement) return !node.disabled && !node.readOnly;\n if (node instanceof HTMLInputElement) {\n return !node.disabled && !node.readOnly && typeof node.select === 'function';\n }\n return false;\n };\n const findEditable = (node) => {\n for (let current = node; current && current !== document.body; current = current.parentElement) {\n if (isEditable(current)) return current;\n }\n return null;\n };\n const editable = findEditable(el);\n if (editable && typeof editable.focus === 'function') {\n editable.focus({ preventScroll: true });\n if (innerOptions.editableOnly) {\n return { activated: true, method: 'focus', tag: editable.tagName || '' };\n }\n }\n\n if (innerOptions.editableOnly) {\n return { activated: false, method: 'none', tag: el?.tagName || '' };\n }\n\n if (typeof el.focus === 'function') {\n el.focus({ preventScroll: true });\n }\n if (typeof el.click === 'function') {\n el.click();\n return { activated: true, method: 'dom-click', tag: el.tagName || '' };\n }\n if (typeof el.dispatchEvent === 'function') {\n el.dispatchEvent(new MouseEvent('click', {\n bubbles: true,\n cancelable: true,\n view: window,\n }));\n return { activated: true, method: 'dispatch-click', tag: el.tagName || '' };\n }\n\n return {\n activated: Boolean(editable),\n method: editable ? 'focus' : 'none',\n tag: el?.tagName || '',\n };\n }, {\n innerOptions: options || {},\n });\n};\n\nconst getScrollableRect = async (element) => {\n return element.evaluate((el) => {\n const isScrollable = (node) => {\n const style = window.getComputedStyle(node);\n if (!style) return false;\n const overflowY = style.overflowY;\n if (!['auto', 'scroll', 'overlay'].includes(overflowY)) return false;\n return node.scrollHeight > node.clientHeight + 1;\n };\n\n let current = el;\n while (current && current !== document.body) {\n if (isScrollable(current)) {\n const rect = current.getBoundingClientRect();\n if (rect && rect.width > 0 && rect.height > 0) {\n return {\n x: rect.x,\n y: rect.y,\n width: rect.width,\n height: rect.height,\n };\n }\n }\n current = current.parentElement;\n }\n\n return null;\n });\n};\n\nconst scrollScrollableAncestor = async (element, deltaY) => {\n return element.evaluate((el, amount) => {\n const isScrollable = (node) => {\n const style = window.getComputedStyle(node);\n if (!style) return false;\n const overflowY = style.overflowY;\n if (!['auto', 'scroll', 'overlay'].includes(overflowY)) return false;\n return node.scrollHeight > node.clientHeight + 1;\n };\n\n let current = el;\n while (current && current !== document.body) {\n if (isScrollable(current)) {\n const beforeTop = current.scrollTop;\n current.scrollTop = beforeTop + amount;\n return {\n scroller: true,\n moved: current.scrollTop !== beforeTop,\n scrollTop: current.scrollTop,\n };\n }\n current = current.parentElement;\n }\n\n const beforeTop = window.scrollY;\n window.scrollBy(0, amount);\n return {\n scroller: null,\n moved: window.scrollY !== beforeTop,\n scrollTop: window.scrollY,\n };\n }, deltaY);\n};\n\nconst scrollAwayFromObstruction = async (element, status) => {\n return element.evaluate((el, innerStatus) => {\n const isScrollable = (node) => {\n const style = window.getComputedStyle(node);\n if (!style) return false;\n const overflowY = style.overflowY;\n if (!['auto', 'scroll', 'overlay'].includes(overflowY)) return false;\n return node.scrollHeight > node.clientHeight + 1;\n };\n\n let scroller = el;\n while (scroller && scroller !== document.body) {\n if (isScrollable(scroller)) break;\n scroller = scroller.parentElement;\n }\n if (!scroller || scroller === document.body) {\n return { moved: false, scrollTop: 0, deltaY: 0 };\n }\n\n const rect = el.getBoundingClientRect();\n const scrollerRect = scroller.getBoundingClientRect();\n const obstruction = innerStatus?.obstruction || {};\n const obstructionTop = Number(obstruction.top);\n const obstructionBottom = Number(obstruction.bottom);\n const obstructionMiddle = Number.isFinite(obstructionTop) && Number.isFinite(obstructionBottom)\n ? (obstructionTop + obstructionBottom) / 2\n : scrollerRect.top + scrollerRect.height / 2;\n const scrollerMiddle = scrollerRect.top + scrollerRect.height / 2;\n const padding = 18;\n\n let deltaY = 0;\n if (\n Number.isFinite(obstructionTop)\n && rect.bottom > obstructionTop\n && obstructionTop >= scrollerRect.top\n && obstructionTop <= scrollerRect.bottom\n && obstructionMiddle >= scrollerMiddle\n ) {\n deltaY = rect.bottom - obstructionTop + padding;\n } else if (\n Number.isFinite(obstructionBottom)\n && rect.top < obstructionBottom\n && obstructionBottom >= scrollerRect.top\n && obstructionBottom <= scrollerRect.bottom\n && obstructionMiddle < scrollerMiddle\n ) {\n deltaY = rect.top - obstructionBottom - padding;\n } else {\n const fallbackDistance = Math.max(48, Math.min(180, scrollerRect.height * 0.45));\n deltaY = obstructionMiddle >= scrollerMiddle ? fallbackDistance : -fallbackDistance;\n }\n\n const beforeTop = scroller.scrollTop;\n scroller.scrollTop = beforeTop + deltaY;\n return {\n moved: Math.abs(scroller.scrollTop - beforeTop) > 2,\n scrollTop: scroller.scrollTop,\n deltaY,\n };\n }, status);\n};\n\nconst getElementViewportSnapshot = async (element) => {\n return element.evaluate((el) => {\n const rect = el.getBoundingClientRect();\n return {\n top: rect.top,\n bottom: rect.bottom,\n left: rect.left,\n right: rect.right,\n width: rect.width,\n height: rect.height,\n scrollX: window.scrollX,\n scrollY: window.scrollY,\n };\n });\n};\n\nconst isTargetImmobileAfterScroll = (before, after) => {\n if (!before || !after) return false;\n const rectDeltaY = Number(after.top || 0) - Number(before.top || 0);\n const rectDeltaX = Number(after.left || 0) - Number(before.left || 0);\n const scrollDeltaY = Number(after.scrollY || 0) - Number(before.scrollY || 0);\n const scrollDeltaX = Number(after.scrollX || 0) - Number(before.scrollX || 0);\n const rectMoved = Math.abs(rectDeltaY) > 3 || Math.abs(rectDeltaX) > 3;\n const pageMoved = Math.abs(scrollDeltaY) > 3 || Math.abs(scrollDeltaX) > 3;\n\n if (!rectMoved && !pageMoved) return true;\n if (pageMoved && !rectMoved) return true;\n\n // Normal document content moves opposite the page scroll. Anything much smaller\n // behaves like a viewport-anchored app-shell element even if CSS position is relative.\n if (Math.abs(scrollDeltaY) > 12 && Math.abs(rectDeltaY) < Math.min(12, Math.abs(scrollDeltaY) * 0.2)) {\n return true;\n }\n return false;\n};\n\nconst restoreWindowFromSnapshot = async (page, before, after) => {\n if (!before || !after) return;\n if (\n Math.abs(Number(after.scrollX || 0) - Number(before.scrollX || 0)) <= 2\n && Math.abs(Number(after.scrollY || 0) - Number(before.scrollY || 0)) <= 2\n ) {\n return;\n }\n\n await page.evaluate(\n (state) => window.scrollTo(state.x, state.y),\n { x: Number(before.scrollX || 0), y: Number(before.scrollY || 0) },\n ).catch(() => {});\n};\n\nconst dispatchTouchSwipe = async (page, deltaY, options = {}) => {\n const viewport = resolveViewport(page);\n const rawRect = options.rect || null;\n const rect = rawRect\n ? {\n x: clamp(rawRect.x, 0, viewport.width),\n y: clamp(rawRect.y, 0, viewport.height),\n width: clamp(rawRect.width, 0, viewport.width),\n height: clamp(rawRect.height, 0, viewport.height),\n }\n : null;\n const area = rect && rect.width > 24 && rect.height > 48\n ? {\n left: rect.x,\n right: Math.min(viewport.width, rect.x + rect.width),\n top: rect.y,\n bottom: Math.min(viewport.height, rect.y + rect.height),\n }\n : {\n left: 0,\n right: viewport.width,\n top: 0,\n bottom: viewport.height,\n };\n const areaWidth = Math.max(1, area.right - area.left);\n const areaHeight = Math.max(1, area.bottom - area.top);\n const maxDistance = rect\n ? Math.max(60, areaHeight * 0.72)\n : Math.max(120, viewport.height * 0.72);\n const distance = clamp(Math.abs(deltaY), Math.min(80, maxDistance), maxDistance);\n const direction = deltaY >= 0 ? 1 : -1;\n const startX = clamp(\n area.left + areaWidth * (0.45 + Math.random() * 0.1),\n 24,\n viewport.width - 24,\n );\n const startY = direction > 0\n ? clamp(area.top + areaHeight * (0.72 + Math.random() * 0.1), area.top + 24, area.bottom - 16)\n : clamp(area.top + areaHeight * (0.28 + Math.random() * 0.1), area.top + 16, area.bottom - 24);\n const endY = clamp(startY - direction * distance, Math.max(16, area.top + 12), Math.min(viewport.height - 16, area.bottom - 12));\n const steps = Math.max(4, Math.round(Number(options.steps || 6)));\n const durationMs = jitterMs(options.durationMs || 320, 0.35);\n\n let client = null;\n const scrollBefore = await page.evaluate(() => ({ x: window.scrollX, y: window.scrollY })).catch(() => null);\n try {\n if (page.context && typeof page.context().newCDPSession === 'function') {\n client = await page.context().newCDPSession(page);\n }\n if (!client) throw new Error('CDP session unavailable');\n\n await client.send('Input.synthesizeScrollGesture', {\n x: startX,\n y: startY,\n yDistance: -direction * distance,\n xOverscroll: (Math.random() - 0.5) * 4,\n yOverscroll: (Math.random() - 0.5) * 8,\n speed: 700 + Math.round(Math.random() * 350),\n gestureSourceType: 'touch',\n });\n await waitJitter(160, 0.35);\n const scrollAfterSynth = await page.evaluate(() => ({ x: window.scrollX, y: window.scrollY })).catch(() => null);\n if (\n scrollBefore\n && scrollAfterSynth\n && (Math.abs(scrollAfterSynth.y - scrollBefore.y) > 2 || Math.abs(scrollAfterSynth.x - scrollBefore.x) > 2)\n ) {\n return true;\n }\n\n await client.send('Input.dispatchTouchEvent', {\n type: 'touchStart',\n touchPoints: [{ x: startX, y: startY, id: 1 }],\n });\n\n for (let i = 1; i <= steps; i += 1) {\n const progress = i / steps;\n const eased = 1 - Math.pow(1 - progress, 2);\n const x = startX + (Math.random() - 0.5) * 3;\n const y = startY + (endY - startY) * eased + (Math.random() - 0.5) * 5;\n await waitJitter(durationMs / steps, 0.25);\n await client.send('Input.dispatchTouchEvent', {\n type: 'touchMove',\n touchPoints: [{ x, y, id: 1 }],\n });\n }\n\n await client.send('Input.dispatchTouchEvent', {\n type: 'touchEnd',\n touchPoints: [],\n });\n await waitJitter(120, 0.35);\n const scrollAfterTouch = await page.evaluate(() => ({ x: window.scrollX, y: window.scrollY })).catch(() => null);\n if (\n scrollBefore\n && scrollAfterTouch\n && Math.abs(scrollAfterTouch.y - scrollBefore.y) <= 2\n && Math.abs(scrollAfterTouch.x - scrollBefore.x) <= 2\n ) {\n await page.evaluate((amount) => window.scrollBy(0, amount), deltaY);\n await waitJitter(120, 0.35);\n }\n return true;\n } catch (error) {\n logger.debug(`touch swipe fallback: ${error?.message || error}`);\n try {\n await page.evaluate((amount) => window.scrollBy(0, amount), deltaY);\n await waitJitter(120, 0.35);\n return true;\n } catch {\n await page.mouse.wheel(0, deltaY);\n await waitJitter(120, 0.35);\n return true;\n }\n } finally {\n if (client && typeof client.detach === 'function') {\n try {\n await client.detach();\n } catch {\n // ignore\n }\n }\n }\n};\n\nconst tapPoint = async (page, point, options = {}) => {\n const {\n timeoutMs = DEFAULT_TAP_TIMEOUT_MS,\n mouseFallbackTimeoutMs = DEFAULT_MOUSE_TAP_FALLBACK_TIMEOUT_MS,\n allowMouseFallback = true,\n } = options;\n\n if (page.touchscreen && typeof page.touchscreen.tap === 'function') {\n try {\n await withTimeout(\n () => page.touchscreen.tap(point.x, point.y),\n timeoutMs,\n 'touchscreen.tap',\n );\n return { method: 'touchscreen' };\n } catch (error) {\n logger.warn(`tapPoint | touchscreen.tap \u5931\u8D25\u6216\u8D85\u65F6\uFF0C\u5C1D\u8BD5\u9F20\u6807\u515C\u5E95: ${error?.message || error}`);\n if (!allowMouseFallback) throw error;\n }\n }\n await withTimeout(\n () => page.mouse.click(point.x, point.y),\n mouseFallbackTimeoutMs,\n 'mouse.click fallback',\n );\n return { method: 'mouse' };\n};\n\nexport const MobileHumanize = {\n jitterMs,\n\n async initializeCursor(page) {\n if (initializedPages.has(page)) return;\n initializedPages.add(page);\n logger.debug('initializeCursor: mobile mode uses touch gestures, cursor init skipped');\n },\n\n async humanMove(page, target) {\n logger.debug(`humanMove: mobile no-op target=${typeof target === 'string' ? target : 'element/coords'}`);\n if (typeof target === 'string' || (target && typeof target.boundingBox === 'function')) {\n const element = await resolveElement(page, target, { throwOnMissing: false });\n if (!element) {\n return false;\n }\n }\n await waitJitter(80, 0.4);\n return true;\n },\n\n async humanScroll(page, target, options = {}) {\n const {\n maxSteps = 20,\n minStep = 180,\n maxStep = 520,\n maxDurationMs = maxSteps * 280 + 1200,\n throwOnMissing = false,\n } = options;\n const targetDesc = describeTarget(target);\n\n logger.start('humanScroll', `target=${targetDesc}`);\n\n const element = await resolveElement(page, target, { throwOnMissing });\n if (!element) {\n logger.warn(`humanScroll | \u5143\u7D20\u672A\u627E\u5230: ${targetDesc}`);\n return { element: null, didScroll: false, restore: null };\n }\n\n const startTime = Date.now();\n let didScroll = false;\n for (let i = 0; i < maxSteps; i += 1) {\n const status = await checkElementVisibility(element);\n if (status.code === 'VISIBLE') {\n if (status.isFixed) {\n logger.info('humanScroll | fixed/sticky \u5BB9\u5668\u5185\uFF0C\u8DF3\u8FC7\u6EDA\u52A8');\n } else {\n logger.debug('humanScroll | \u5143\u7D20\u53EF\u89C1\u4E14\u65E0\u906E\u6321');\n }\n logger.success('humanScroll', didScroll ? '\u5DF2\u6EDA\u52A8' : '\u65E0\u9700\u6EDA\u52A8');\n return { element, didScroll, restore: null };\n }\n\n if (status.code === 'ZERO_DIMENSIONS' || status.code === 'NOT_INTERACTABLE') {\n logger.warn(`humanScroll | \u5143\u7D20\u4E0D\u53EF\u6EDA\u52A8\u81F3\u53EF\u70B9\u51FB\u72B6\u6001: ${status.reason || status.code}`);\n return { element, didScroll, restore: null };\n }\n\n // \u53EA\u6709\u627E\u5230\u53EF\u6EDA\u52A8\u7956\u5148\u65F6\u624D\u7EE7\u7EED\u6EDA\uFF0C\u5426\u5219\u56FA\u5B9A\u5BB9\u5668\u91CC\u7684\u5143\u7D20\u76F4\u63A5\u8D70\u539F\u5730\u5224\u5B9A\u3002\n const scrollRect = await getScrollableRect(element);\n if (!scrollRect && status.isFixed && status.code === 'OUT_OF_VIEWPORT') {\n logger.warn(`humanScroll | fixed/sticky \u76EE\u6807\u4E0D\u5728\u89C6\u53E3\u5185\uFF0C\u9875\u9762\u6EDA\u52A8\u65E0\u6CD5\u6539\u53D8\u5176\u4F4D\u7F6E (direction=${status.direction || 'unknown'})`);\n return { element, didScroll, restore: null, unscrollable: true };\n }\n if (!scrollRect && status.isFixed && status.code === 'OBSTRUCTED') {\n logger.warn(`humanScroll | fixed/sticky \u76EE\u6807\u88AB\u906E\u6321\uFF0C\u6EDA\u52A8\u65E0\u6CD5\u89E3\u9664 (${status.obstruction?.tag || 'unknown'})`);\n return { element, didScroll, restore: null, unscrollable: true };\n }\n\n if (scrollRect && status.code === 'OBSTRUCTED' && status.obstruction?.isFixed) {\n const moved = await scrollAwayFromObstruction(element, status);\n if (moved.moved) {\n logger.debug(`humanScroll | sticky/fixed \u906E\u6321\u8865\u507F\u6EDA\u52A8 top=${Math.round(moved.scrollTop || 0)}`);\n await waitJitter(90, 0.3);\n didScroll = true;\n continue;\n }\n }\n\n if (Date.now() - startTime > maxDurationMs) {\n logger.warn(`humanScroll | mobile timeout (${maxDurationMs}ms, status=${status.code}, direction=${status.direction || 'unknown'}, fixed=${Boolean(status.isFixed)})`);\n return { element, didScroll, restore: null };\n }\n\n const stepMin = scrollRect ? Math.min(minStep, Math.max(60, scrollRect.height * 0.4)) : minStep;\n const stepMax = scrollRect ? Math.min(maxStep, Math.max(stepMin + 40, scrollRect.height * 0.8)) : maxStep;\n logger.debug(`humanScroll | \u6B65\u9AA4 ${i + 1}/${maxSteps}: ${status.reason || status.code} ${status.direction ? `(${status.direction})` : ''}`);\n const distance = stepMin + Math.random() * Math.max(1, stepMax - stepMin);\n let deltaY = status.direction === 'up' ? -distance : distance;\n if (status.code === 'OBSTRUCTED') {\n if (status.obstruction?.isFixed && status.obstruction.top != null) {\n const obstructionMiddle = (\n Number(status.obstruction.top || 0)\n + Number(status.obstruction.bottom || status.obstruction.top || 0)\n ) / 2;\n const visibleMiddle = scrollRect\n ? scrollRect.y + scrollRect.height / 2\n : status.viewH / 2;\n deltaY = obstructionMiddle < visibleMiddle ? -distance : distance;\n } else {\n const halfY = scrollRect ? (scrollRect.y + scrollRect.height / 2) : (status.viewH / 2);\n deltaY = status.cy > halfY ? distance : -distance;\n }\n }\n const beforeWindowState = scrollRect\n ? await page.evaluate(() => ({ x: window.scrollX, y: window.scrollY }))\n : null;\n const beforeElementSnapshot = await getElementViewportSnapshot(element).catch(() => null);\n const beforeState = scrollRect\n ? await element.evaluate((el) => {\n const isScrollable = (node) => {\n const style = window.getComputedStyle(node);\n if (!style) return false;\n const overflowY = style.overflowY;\n if (!['auto', 'scroll', 'overlay'].includes(overflowY)) return false;\n return node.scrollHeight > node.clientHeight + 1;\n };\n\n let current = el;\n while (current && current !== document.body) {\n if (isScrollable(current)) {\n return {\n kind: 'element',\n top: current.scrollTop,\n left: current.scrollLeft,\n };\n }\n current = current.parentElement;\n }\n return { kind: 'window', top: window.scrollY, left: window.scrollX };\n })\n : null;\n await dispatchTouchSwipe(page, deltaY, { rect: scrollRect });\n if (scrollRect && beforeWindowState) {\n const afterWindowState = await page.evaluate(() => ({ x: window.scrollX, y: window.scrollY }));\n if (\n Math.abs(afterWindowState.x - beforeWindowState.x) > 2\n || Math.abs(afterWindowState.y - beforeWindowState.y) > 2\n ) {\n await page.evaluate((state) => window.scrollTo(state.x, state.y), beforeWindowState);\n logger.debug(`humanScroll | \u7A97\u53E3\u6EDA\u52A8\u56DE\u6536 from=${Math.round(afterWindowState.y)} to=${Math.round(beforeWindowState.y)}`);\n }\n }\n let afterElementSnapshot = null;\n const readAfterElementSnapshot = async () => {\n if (!afterElementSnapshot) {\n afterElementSnapshot = await getElementViewportSnapshot(element).catch(() => null);\n }\n return afterElementSnapshot;\n };\n if (!scrollRect && beforeElementSnapshot) {\n const afterSnapshot = await readAfterElementSnapshot();\n if (isTargetImmobileAfterScroll(beforeElementSnapshot, afterSnapshot)) {\n await restoreWindowFromSnapshot(page, beforeElementSnapshot, afterSnapshot);\n logger.warn(`humanScroll | \u76EE\u6807\u4E0D\u968F\u9875\u9762\u6EDA\u52A8\u79FB\u52A8\uFF0C\u9875\u9762\u6EDA\u52A8\u65E0\u6CD5\u6539\u53D8\u5176\u4F4D\u7F6E (status=${status.code}, direction=${status.direction || 'unknown'})`);\n return { element, didScroll, restore: null, unscrollable: true };\n }\n }\n if (scrollRect && beforeState) {\n const afterState = await element.evaluate((el) => {\n const isScrollable = (node) => {\n const style = window.getComputedStyle(node);\n if (!style) return false;\n const overflowY = style.overflowY;\n if (!['auto', 'scroll', 'overlay'].includes(overflowY)) return false;\n return node.scrollHeight > node.clientHeight + 1;\n };\n\n let current = el;\n while (current && current !== document.body) {\n if (isScrollable(current)) {\n return {\n kind: 'element',\n top: current.scrollTop,\n left: current.scrollLeft,\n };\n }\n current = current.parentElement;\n }\n return { kind: 'window', top: window.scrollY, left: window.scrollX };\n });\n\n const topDelta = Number(afterState.top || 0) - Number(beforeState.top || 0);\n const leftDelta = Number(afterState.left || 0) - Number(beforeState.left || 0);\n const expectedDelta = Number(deltaY || 0);\n const moved = beforeState.kind !== afterState.kind\n || Math.abs(topDelta) > 2\n || Math.abs(leftDelta) > 2;\n\n if (!moved) {\n const fallback = await scrollScrollableAncestor(element, deltaY);\n logger.debug(`humanScroll | \u5BB9\u5668\u89E6\u6478\u65E0\u6548\uFF0C\u76F4\u63A5\u6EDA\u52A8 fallback=${fallback.scroller ? 'ancestor' : 'window'} top=${Math.round(fallback.scrollTop || 0)}`);\n } else if (\n beforeState.kind === afterState.kind\n && Math.abs(expectedDelta) > 24\n && Math.sign(topDelta || expectedDelta) === Math.sign(expectedDelta)\n && Math.abs(topDelta) < Math.min(Math.abs(expectedDelta) * 0.45, 96)\n ) {\n const residualDelta = expectedDelta - topDelta;\n if (Math.sign(residualDelta) === Math.sign(expectedDelta) && Math.abs(residualDelta) > 24) {\n const fallback = await scrollScrollableAncestor(element, residualDelta);\n logger.debug(`humanScroll | \u5BB9\u5668\u89E6\u6478\u8DDD\u79BB\u4E0D\u8DB3\uFF0C\u8865\u507F\u6EDA\u52A8 fallback=${fallback.scroller ? 'ancestor' : 'window'} top=${Math.round(fallback.scrollTop || 0)}`);\n }\n }\n }\n if (scrollRect && beforeElementSnapshot) {\n const afterSnapshot = await getElementViewportSnapshot(element).catch(() => null);\n if (isTargetImmobileAfterScroll(beforeElementSnapshot, afterSnapshot)) {\n await restoreWindowFromSnapshot(page, beforeElementSnapshot, afterSnapshot);\n logger.warn(`humanScroll | \u76EE\u6807\u4E0D\u968F\u6EDA\u52A8\u5BB9\u5668\u79FB\u52A8\uFF0C\u6EDA\u52A8\u65E0\u6CD5\u6539\u53D8\u5176\u4F4D\u7F6E (status=${status.code}, direction=${status.direction || 'unknown'})`);\n return { element, didScroll, restore: null, unscrollable: true };\n }\n }\n didScroll = true;\n }\n\n try {\n await element.scrollIntoViewIfNeeded?.();\n await waitJitter(80, 0.3);\n const finalStatus = await checkElementVisibility(element);\n if (finalStatus.code === 'VISIBLE') {\n logger.info('humanScroll | \u539F\u751F scrollIntoViewIfNeeded \u515C\u5E95\u6210\u529F');\n logger.success('humanScroll', didScroll ? '\u5DF2\u6EDA\u52A8' : '\u65E0\u9700\u6EDA\u52A8');\n return { element, didScroll: true, restore: null };\n }\n } catch (fallbackError) {\n logger.debug(`humanScroll | native fallback failed: ${fallbackError?.message || fallbackError}`);\n }\n\n logger.warn(`humanScroll | \u5728 ${maxSteps} \u6B65\u540E\u65E0\u6CD5\u786E\u4FDD\u53EF\u89C1\u6027`);\n return { element, didScroll, restore: null };\n },\n\n async humanClick(page, target, options = {}) {\n const {\n reactionDelay = 220,\n throwOnMissing = true,\n scrollIfNeeded = true,\n tapTimeoutMs = DEFAULT_TAP_TIMEOUT_MS,\n mouseFallbackTimeoutMs = DEFAULT_MOUSE_TAP_FALLBACK_TIMEOUT_MS,\n activateFallbackTimeoutMs = DEFAULT_ACTIVATE_FALLBACK_TIMEOUT_MS,\n fallbackDomClick = true,\n fallbackDomClickOnTapError = true,\n } = options;\n const targetDesc = describeTarget(target);\n\n logger.start('humanClick', `target=${targetDesc}`);\n\n try {\n if (target == null) {\n const viewport = resolveViewport(page);\n await waitJitter(reactionDelay, 0.45);\n await tapPoint(page, {\n x: viewport.width * (0.45 + Math.random() * 0.1),\n y: viewport.height * (0.48 + Math.random() * 0.12),\n }, {\n timeoutMs: tapTimeoutMs,\n mouseFallbackTimeoutMs,\n });\n logger.success('humanClick', 'Tapped current position');\n return true;\n }\n\n const element = await resolveElement(page, target, { throwOnMissing });\n if (!element) {\n logger.warn(`humanClick: \u5143\u7D20\u4E0D\u5B58\u5728\uFF0C\u8DF3\u8FC7\u70B9\u51FB ${targetDesc}`);\n return false;\n }\n\n const scrollResult = scrollIfNeeded\n ? await MobileHumanize.humanScroll(page, element, { throwOnMissing })\n : null;\n\n const status = await checkElementVisibility(element).catch(() => null);\n if (status && status.code !== 'VISIBLE') {\n if (\n fallbackDomClick\n && (status.code === 'OUT_OF_VIEWPORT' || status.code === 'OBSTRUCTED')\n && (status.isFixed || scrollResult?.unscrollable)\n ) {\n let fallback = await withTimeout(\n () => activateElementFallback(element, null, {\n editableOnly: true,\n }),\n activateFallbackTimeoutMs,\n 'focus fallback',\n ).catch(() => null);\n if (!fallback?.activated) {\n fallback = await withTimeout(\n () => activateElementFallback(element, null, {\n editableOnly: false,\n }),\n activateFallbackTimeoutMs,\n 'activation fallback',\n ).catch(() => null);\n }\n if (fallback?.activated) {\n logger.warn(`humanClick: \u4E0D\u53EF\u6EDA\u52A8\u76EE\u6807\u4E0D\u53EF\u7269\u7406\u70B9\u51FB\uFF0C\u5DF2\u7528 ${fallback.method} \u6FC0\u6D3B`);\n return true;\n }\n }\n\n const message = `\u5143\u7D20\u4E0D\u53EF\u70B9\u51FB: ${status.reason || status.code}`;\n if (throwOnMissing) throw new Error(message);\n logger.warn(`humanClick: ${message}\uFF0C\u8DF3\u8FC7\u70B9\u51FB`);\n return false;\n }\n\n const box = await element.boundingBox();\n if (!box) {\n if (throwOnMissing) throw new Error('\u65E0\u6CD5\u83B7\u53D6\u5143\u7D20\u4F4D\u7F6E');\n logger.warn('humanClick: \u65E0\u6CD5\u83B7\u53D6\u4F4D\u7F6E\uFF0C\u8DF3\u8FC7\u70B9\u51FB');\n return false;\n }\n\n await waitJitter(reactionDelay, 0.45);\n const visibleBox = clipBoxToViewport(box, resolveViewport(page));\n const tapTarget = centerPointInBox(visibleBox);\n try {\n await tapPoint(page, tapTarget, {\n timeoutMs: tapTimeoutMs,\n mouseFallbackTimeoutMs,\n });\n } catch (tapError) {\n if (!fallbackDomClickOnTapError) throw tapError;\n const fallback = await withTimeout(\n () => activateElementFallback(element, tapTarget, {\n editableOnly: false,\n }),\n activateFallbackTimeoutMs,\n 'activation fallback',\n ).catch(() => null);\n if (!fallback?.activated) throw tapError;\n logger.warn(`humanClick: tap \u5931\u8D25\u540E\u5DF2\u7528 ${fallback.method} \u515C\u5E95: ${tapError?.message || tapError}`);\n }\n await waitJitter(120, 0.35);\n logger.success('humanClick');\n return true;\n } catch (error) {\n logger.fail('humanClick', error);\n throw error;\n }\n },\n\n async randomSleep(baseMs, jitterPercent = 0.3) {\n await waitJitter(baseMs, jitterPercent);\n },\n\n async simulateGaze(page, baseDurationMs = 2500) {\n const durationMs = jitterMs(baseDurationMs, 0.4);\n const startTime = Date.now();\n while (Date.now() - startTime < durationMs) {\n if (Math.random() < 0.28) {\n const distance = 70 + Math.random() * 120;\n await dispatchTouchSwipe(page, Math.random() < 0.7 ? distance : -distance, {\n durationMs: 180,\n steps: 4,\n });\n } else {\n await waitJitter(420, 0.55);\n }\n }\n },\n\n async humanType(page, selector, text, options = {}) {\n const {\n baseDelay = 160,\n pauseProbability = 0.08,\n pauseBase = 700,\n } = options;\n\n await MobileHumanize.humanClick(page, selector, { scrollIfNeeded: true });\n await waitJitter(220, 0.45);\n\n for (let i = 0; i < String(text).length; i += 1) {\n const char = String(text)[i];\n const charDelay = /[,.!?;:\uFF0C\u3002\uFF01\uFF1F\uFF1B\uFF1A]/.test(char)\n ? jitterMs(baseDelay * 1.45, 0.4)\n : jitterMs(char === ' ' ? baseDelay * 0.65 : baseDelay, 0.4);\n await page.keyboard.type(char);\n await waitJitter(charDelay, 0.15);\n\n if (Math.random() < pauseProbability && i < String(text).length - 1) {\n await waitJitter(pauseBase, 0.5);\n }\n }\n },\n\n async humanPress(page, targetOrKey, maybeKey, options = {}) {\n const hasTarget = typeof maybeKey === 'string';\n const key = hasTarget ? maybeKey : targetOrKey;\n const pressOptions = hasTarget ? options : (maybeKey || options);\n const {\n reactionDelay = 170,\n holdDelay = 42,\n focusDelay = 180,\n scrollIfNeeded = true,\n throwOnMissing = true,\n keyboardOptions = {},\n } = pressOptions || {};\n const targetDesc = hasTarget ? describeTarget(targetOrKey) : 'current focus';\n\n logger.start('humanPress', `key=${key}, target=${targetDesc}`);\n\n try {\n if (hasTarget) {\n await MobileHumanize.humanClick(page, targetOrKey, {\n reactionDelay: focusDelay,\n scrollIfNeeded,\n throwOnMissing,\n });\n }\n\n await waitJitter(reactionDelay, 0.45);\n await page.keyboard.press(key, {\n ...keyboardOptions,\n delay: jitterMs(holdDelay, 0.5),\n });\n logger.success('humanPress');\n return true;\n } catch (error) {\n logger.fail('humanPress', error);\n throw error;\n }\n },\n\n async humanClear(page, selector) {\n const locator = page.locator(selector);\n await MobileHumanize.humanClick(page, locator, { scrollIfNeeded: true });\n await waitJitter(160, 0.4);\n const readValue = async () => {\n try {\n return await locator.inputValue({ timeout: 600 });\n } catch {\n return await locator.evaluate((el) => (\n 'value' in el ? String(el.value || '') : String(el.textContent || '')\n )).catch(() => '');\n }\n };\n\n const currentValue = await readValue();\n if (!currentValue) return;\n\n await page.keyboard.press('ControlOrMeta+A');\n await waitJitter(90, 0.35);\n await page.keyboard.press('Backspace');\n await waitJitter(120, 0.35);\n if (!(await readValue())) return;\n\n await locator.evaluate((el) => {\n if ('value' in el) {\n el.value = '';\n el.dispatchEvent(new Event('input', { bubbles: true }));\n el.dispatchEvent(new Event('change', { bubbles: true }));\n return;\n }\n el.textContent = '';\n el.dispatchEvent(new Event('input', { bubbles: true }));\n });\n },\n\n async warmUpBrowsing(page, baseDuration = 3500) {\n const durationMs = jitterMs(baseDuration, 0.4);\n const startTime = Date.now();\n while (Date.now() - startTime < durationMs) {\n const action = Math.random();\n if (action < 0.5) {\n await dispatchTouchSwipe(page, 120 + Math.random() * 220, {\n durationMs: 240,\n steps: 5,\n });\n } else if (action < 0.7) {\n await dispatchTouchSwipe(page, -(80 + Math.random() * 160), {\n durationMs: 220,\n steps: 4,\n });\n } else {\n await waitJitter(560, 0.55);\n }\n }\n },\n\n async naturalScroll(page, direction = 'down', distance = 300, baseSteps = 5) {\n const steps = Math.max(3, baseSteps + Math.floor(Math.random() * 3) - 1);\n const actualDistance = jitterMs(distance, 0.15);\n const sign = direction === 'down' ? 1 : -1;\n for (let i = 0; i < steps; i += 1) {\n const factor = 1 - (i / steps) * 0.45;\n await dispatchTouchSwipe(page, (actualDistance / steps) * factor * sign, {\n durationMs: 150 + i * 20,\n steps: 4,\n });\n }\n },\n};\n", "import { Device, normalizeDevice } from '../../constants.js';\nimport { PageRuntimeStateKey } from '../constants.js';\nimport { withPageReflect } from '../reflect.js';\nimport { Humanize as DesktopHumanize } from './desktop.js';\nimport { MobileHumanize } from './mobile.js';\n\nconst resolveDeviceFromPage = (page) => normalizeDevice(page?.[PageRuntimeStateKey]?.device);\n\n// \u540C\u4E00\u5957 Humanize API \u4F1A\u6839\u636E page \u4E0A\u7684 device \u81EA\u52A8\u5206\u6D41\u5230\u684C\u9762/\u79FB\u52A8\u5B9E\u73B0\u3002\nconst resolveDelegate = (page) => {\n return resolveDeviceFromPage(page) === Device.Mobile\n ? MobileHumanize\n : DesktopHumanize;\n};\n\nexport const DefaultHumanizeDevice = withPageReflect(\n 'DefaultHumanize',\n resolveDelegate,\n [DesktopHumanize, MobileHumanize],\n);\n\nexport const Humanize = DefaultHumanizeDevice;\n", "import { DeviceInput } from '../../device-input.js';\n\nconst FORCE_CLICK = Object.freeze({\n forceClick: true,\n clickOptions: { force: true },\n});\n\nconst pointOrNull = async (target) => {\n if (!target || typeof target.boundingBox !== 'function') return null;\n const box = await target.boundingBox().catch(() => null);\n return box\n ? { x: box.x + box.width / 2, y: box.y + box.height / 2 }\n : null;\n};\n\nexport const CloakHumanizeInput = {\n async initializeCursor(page) {\n return Boolean(page);\n },\n\n async humanMove(page, target) {\n const point = target?.x != null && target?.y != null\n ? target\n : await pointOrNull(typeof target === 'string' ? page.locator(target).first() : target);\n return point ? await DeviceInput.move(page, point, { forceMouse: true }) : false;\n },\n\n async humanScroll(page, target) {\n const element = typeof target === 'string' ? page.locator(target).first() : target;\n if (!element) return { element: null, didScroll: false, restore: null };\n await element.scrollIntoViewIfNeeded?.();\n return { element, didScroll: true, restore: null };\n },\n\n async humanClick(page, target) {\n return await DeviceInput.click(page, target, FORCE_CLICK);\n },\n\n async humanType(page, selector, text) {\n await DeviceInput.click(page, selector, FORCE_CLICK);\n return await DeviceInput.keyboardType(page, text);\n },\n\n async humanPress(page, targetOrKey, maybeKey) {\n return await DeviceInput.press(page, targetOrKey, maybeKey, {\n clickOptions: FORCE_CLICK,\n keyboardOptions: {},\n });\n },\n\n async humanClear(page, selector) {\n return await DeviceInput.fill(page, selector, '', { force: true });\n },\n\n async simulateGaze(page) {\n return await DeviceInput.move(page, { x: 0, y: 0 }, { forceMouse: true });\n },\n\n async warmUpBrowsing(page) {\n return await this.simulateGaze(page);\n },\n\n async naturalScroll(page, direction = 'down', distance = 300) {\n const sign = direction === 'down' ? 1 : -1;\n await page.mouse.wheel(0, Number(distance || 0) * sign);\n },\n};\n", "import { Mode } from './constants.js';\nimport { withModeReflect } from './internals/reflect.js';\nimport { CloakHumanize, DefaultHumanize } from './internals/humanize/index.js';\n\nconst humanizeStrategies = {\n [Mode.Default]: DefaultHumanize,\n [Mode.Cloak]: CloakHumanize,\n};\n\nexport const Humanize = withModeReflect('Humanize', humanizeStrategies);\n", "// \u96C6\u4E2D\u7BA1\u7406\u542F\u52A8\u914D\u7F6E\uFF0C\u53CD\u722C\u53C2\u6570\u4E0E\u6307\u7EB9\u914D\u7F6E\u7EDF\u4E00\u7531 AntiCheat \u63D0\u4F9B\nimport { execFileSync } from 'node:child_process';\nimport { FingerprintGenerator } from 'fingerprint-generator';\nimport { FingerprintInjector } from 'fingerprint-injector';\nimport { DefaultAntiCheat as AntiCheat } from '../anti-cheat/default.js';\nimport { Device, normalizeDevice } from '../../constants.js';\nimport { createInternalLogger } from '../logger.js';\nimport { RuntimeEnv } from '../../runtime-env.js';\nimport {\n createLaunchTrafficHook,\n logLaunchTraffic,\n resolveLaunchTraffic,\n} from './traffic.js';\n\nconst logger = createInternalLogger('Launch');\nconst injectedContexts = new WeakSet();\nconst browserMajorVersionCache = new Map();\n\nconst DEFAULT_BROWSER_PROFILE_SCHEMA_VERSION = 1;\nconst DEFAULT_LOCALE = 'zh-CN';\n\nconst DEFAULT_CRAWLER_BASE_OPTIONS = Object.freeze({\n maxConcurrency: 1,\n maxRequestRetries: 0,\n requestHandlerTimeoutSecs: 240,\n navigationTimeoutSecs: 120,\n});\n\nconst fingerprintInjector = new FingerprintInjector();\n\nconst parseChromeMajorVersion = (rawValue = '') => {\n const match = String(rawValue || '').match(/(?:Chrome|Chromium)(?:\\/|\\s+(?:for Testing\\s+)?)(\\d+)/i);\n return match ? Number(match[1] || 0) : 0;\n};\n\nconst resolveLauncherExecutablePath = (launcher) => {\n if (!launcher || typeof launcher !== 'object') return '';\n if (typeof launcher.executablePath === 'function') {\n try {\n return String(launcher.executablePath() || '').trim();\n } catch {\n return '';\n }\n }\n return '';\n};\n\nconst detectBrowserMajorVersion = (launcher) => {\n\tconst executablePath = resolveLauncherExecutablePath(launcher);\n if (!executablePath) return 0;\n if (browserMajorVersionCache.has(executablePath)) {\n return browserMajorVersionCache.get(executablePath);\n }\n\n let detectedVersion = 0;\n try {\n const rawVersion = execFileSync(executablePath, ['--version'], {\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'ignore'],\n });\n detectedVersion = parseChromeMajorVersion(rawVersion);\n } catch (error) {\n logger.warn(`\u8BFB\u53D6\u6D4F\u89C8\u5668\u7248\u672C\u5931\u8D25: ${error?.message || error}`);\n }\n\n\tbrowserMajorVersionCache.set(executablePath, detectedVersion);\n\treturn detectedVersion;\n};\n\nconst resolveRuntimeDevice = (runtimeState = {}) => normalizeDevice(runtimeState?.device);\n\nconst resolveCoreDevice = (core = {}) => {\n const raw = String(core?.device || '').trim().toLowerCase();\n if (raw === Device.Mobile) return Device.Mobile;\n if (raw === Device.Desktop) return Device.Desktop;\n return '';\n};\n\n// buildFingerprintGenerator \u53EA\u5728\u201C\u6CA1\u6709\u53EF\u590D\u7528 core.fingerprint\u201D\u65F6\u515C\u5E95\u751F\u6210\u4E00\u6B21\u3002\nconst buildFingerprintGenerator = ({ locale, browserMajorVersion, device }) => {\n\treturn new FingerprintGenerator(\n AntiCheat.getFingerprintGeneratorOptions({\n locale,\n browserMajorVersion,\n device,\n }),\n\t);\n};\n\nconst generateFingerprintForCore = ({ locale, browserMajorVersion, device }) => {\n const requestedBrowserMajorVersion = Number(browserMajorVersion || 0);\n const generator = buildFingerprintGenerator({\n locale,\n browserMajorVersion: requestedBrowserMajorVersion,\n device,\n });\n\n try {\n return {\n fingerprint: generator.getFingerprint(),\n exactBrowserMajorVersion: requestedBrowserMajorVersion > 0,\n };\n } catch (error) {\n if (requestedBrowserMajorVersion <= 0) {\n throw error;\n }\n logger.warn(\n `\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}`,\n );\n }\n\n const fallbackGenerator = buildFingerprintGenerator({\n locale,\n browserMajorVersion: 0,\n device,\n });\n return {\n fingerprint: fallbackGenerator.getFingerprint(),\n exactBrowserMajorVersion: false,\n };\n};\n\n// buildReplayableBrowserProfile \u8D1F\u8D23\u628A\u201C\u767B\u5F55\u6001 env\u201D\u63D0\u5347\u6210\u201C\u53EF\u8DE8\u673A\u5668\u590D\u7528\u7684\u6D4F\u89C8\u5668\u771F\u6E90\u201D\u3002\n// \u89C4\u5219\u662F\uFF1A\n// 1. \u6CA1\u6709\u767B\u5F55\u6001\u65F6\uFF0C\u4E0D\u5F3A\u6C42\u751F\u6210\u6301\u4E45\u5316\u6307\u7EB9\uFF1B\n// 2. \u6709\u767B\u5F55\u6001\u4F46\u6CA1\u6709 core.fingerprint \u65F6\uFF0C\u9996\u6B21\u751F\u6210\u5E76\u5199\u56DE runtimeState\uFF1B\n// 3. \u6D4F\u89C8\u5668\u5927\u7248\u672C\u6216 device \u53D8\u5316\u65F6\uFF0C\u5141\u8BB8\u91CD\u5EFA core\uFF0C\u907F\u514D\u65E7\u771F\u6E90\u4E0E\u65B0\u8FD0\u884C\u65F6\u4E0D\u517C\u5BB9\u3002\nconst buildReplayableBrowserProfile = (runtimeState, launcher) => {\n const device = resolveRuntimeDevice(runtimeState);\n if (!runtimeState || !RuntimeEnv.hasLoginState(runtimeState)) {\n return { runtimeState, browserProfileCore: null };\n }\n\n let nextState = RuntimeEnv.rememberState(runtimeState);\n let browserProfileCore = RuntimeEnv.getBrowserProfileCore(nextState);\n const timezoneId = String(browserProfileCore?.timezone_id || '').trim() || AntiCheat.getBaseConfig().timezoneId;\n const locale = DEFAULT_LOCALE;\n const currentBrowserMajorVersion = detectBrowserMajorVersion(launcher);\n const storedBrowserMajorVersion = Number(browserProfileCore?.browser_major_version || 0);\n const storedDevice = resolveCoreDevice(browserProfileCore);\n // core \u662F\u201C\u6307\u7EB9\u771F\u6E90\u201D\uFF0Cdevice / browser major \u53D8\u5316\u65F6\u5FC5\u987B\u91CD\u5EFA\uFF1B\n // \u5426\u5219 runtime \u8868\u9762\u5DF2\u7ECF\u5207\u6362\uFF0C\u5E95\u5C42 still \u53EF\u80FD\u6CBF\u7528\u65E7\u684C\u9762\u6307\u7EB9\u3002\n const needsDeviceRebuild = storedDevice\n ? storedDevice !== device\n : device === Device.Mobile;\n const needsRebuild = !browserProfileCore?.fingerprint\n || Object.keys(browserProfileCore.fingerprint || {}).length === 0\n || needsDeviceRebuild\n || (currentBrowserMajorVersion > 0 && storedBrowserMajorVersion > 0 && storedBrowserMajorVersion !== currentBrowserMajorVersion);\n\n if (needsRebuild) {\n const generated = generateFingerprintForCore({\n locale,\n browserMajorVersion: currentBrowserMajorVersion,\n device,\n });\n const fingerprint = generated.fingerprint;\n const fingerprintBrowserMajorVersion = parseChromeMajorVersion(fingerprint?.fingerprint?.navigator?.userAgent || '');\n browserProfileCore = {\n fingerprint,\n device,\n timezone_id: timezoneId,\n locale,\n browser_major_version: currentBrowserMajorVersion > 0 ? currentBrowserMajorVersion : fingerprintBrowserMajorVersion,\n schema_version: DEFAULT_BROWSER_PROFILE_SCHEMA_VERSION,\n };\n nextState = RuntimeEnv.setBrowserProfileCore(nextState, browserProfileCore);\n logger.info(\n `\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}`,\n );\n return { runtimeState: nextState, browserProfileCore };\n }\n\n const normalizedBrowserProfileCore = {\n ...browserProfileCore,\n device,\n timezone_id: timezoneId,\n locale,\n schema_version: Number(browserProfileCore.schema_version || 0) > 0\n ? Number(browserProfileCore.schema_version || 0)\n : DEFAULT_BROWSER_PROFILE_SCHEMA_VERSION,\n browser_major_version: currentBrowserMajorVersion > 0\n ? currentBrowserMajorVersion\n : Number(browserProfileCore.browser_major_version || 0),\n };\n\n const currentCoreRaw = JSON.stringify(browserProfileCore || {});\n const nextCoreRaw = JSON.stringify(normalizedBrowserProfileCore);\n if (currentCoreRaw !== nextCoreRaw) {\n nextState = RuntimeEnv.setBrowserProfileCore(nextState, normalizedBrowserProfileCore);\n }\n\n return {\n runtimeState: nextState,\n browserProfileCore: normalizedBrowserProfileCore,\n\t};\n};\n\nconst applyFingerprintPageOptions = (pageOptions = {}, { fingerprintWithHeaders = null, locale = '', timezoneId = '' } = {}) => {\n if (!pageOptions || typeof pageOptions !== 'object') return;\n const fingerprint = fingerprintWithHeaders?.fingerprint || fingerprintWithHeaders;\n if (!fingerprint || typeof fingerprint !== 'object') return;\n\n const screen = fingerprint?.screen || {};\n const navigatorFingerprint = fingerprint?.navigator || {};\n const headers = fingerprintWithHeaders?.headers || {};\n const userAgent = String(navigatorFingerprint.userAgent || headers['user-agent'] || '').trim();\n const width = Number(screen.width || 0);\n const height = Number(screen.height || 0);\n const dpr = Number(screen.devicePixelRatio || 0);\n const maxTouchPoints = Number(navigatorFingerprint.maxTouchPoints || 0);\n const isMobile = navigatorFingerprint.userAgentData?.mobile === true || headers['sec-ch-ua-mobile'] === '?1' || /Mobile|Android/i.test(userAgent);\n\n if (userAgent) {\n pageOptions.userAgent = userAgent;\n }\n if (width > 0 && height > 0) {\n pageOptions.viewport = { width, height };\n pageOptions.screen = { width, height };\n }\n pageOptions.isMobile = isMobile;\n pageOptions.hasTouch = maxTouchPoints > 0;\n if (dpr > 0) {\n pageOptions.deviceScaleFactor = dpr;\n }\n if (locale) {\n pageOptions.locale = locale;\n }\n if (timezoneId) {\n pageOptions.timezoneId = timezoneId;\n }\n};\n\n// buildReplayBrowserPoolOptions \u8BA9 BrowserPool / Playwright / FingerprintInjector\n// \u90FD\u4ECE\u540C\u4E00\u4EFD core.fingerprint \u6D3E\u751F\u53C2\u6570\uFF0C\u907F\u514D UA / viewport / JS \u6307\u7EB9\u591A\u771F\u6E90\u51B2\u7A81\u3002\nconst buildReplayBrowserPoolOptions = (browserProfileCore) => {\n const fingerprintWithHeaders = browserProfileCore?.fingerprint;\n const fingerprint = fingerprintWithHeaders?.fingerprint;\n if (!fingerprintWithHeaders || !fingerprint) {\n return null;\n }\n\n return {\n useFingerprints: false,\n prePageCreateHooks: [\n (_pageId, _browserController, pageOptions = {}) => {\n if (!pageOptions || typeof pageOptions !== 'object') return;\n applyFingerprintPageOptions(pageOptions, {\n fingerprintWithHeaders,\n locale: browserProfileCore.locale,\n timezoneId: browserProfileCore.timezone_id,\n });\n },\n ],\n postPageCreateHooks: [\n async (page) => {\n const context = page?.context?.();\n if (!context) return;\n if (!injectedContexts.has(context)) {\n await fingerprintInjector.attachFingerprintToPlaywright(context, fingerprintWithHeaders);\n injectedContexts.add(context);\n }\n },\n ],\n };\n};\n\nexport const DefaultLaunch = {\n getPlaywrightCrawlerOptions(options = {}) {\n const normalizedOptions = Array.isArray(options) ? { customArgs: options } : (options || {});\n const {\n customArgs = [],\n proxyConfiguration = {},\n log: logOptions = null,\n runInHeadfulMode = false,\n debugMode = false,\n isRunningOnApify = false,\n launcher = null,\n preNavigationHooks = [],\n postNavigationHooks = [],\n runtimeState = null,\n } = normalizedOptions;\n const device = resolveRuntimeDevice(runtimeState);\n\n const enableByPassLogger = Boolean(logOptions && logOptions.enable);\n const traffic = resolveLaunchTraffic({ proxyConfiguration, debugMode });\n const trafficHook = createLaunchTrafficHook({\n ...traffic,\n enabled: enableByPassLogger,\n });\n\n\t\t// \u542F\u52A8\u524D\u5148\u786E\u5B9A\u662F\u5426\u8D70\u201C\u7A33\u5B9A\u56DE\u653E\u6A21\u5F0F\u201D\u3002\n\t\tconst replayContext = buildReplayableBrowserProfile(runtimeState, launcher);\n\t\tconst replayBrowserPoolOptions = buildReplayBrowserPoolOptions(replayContext.browserProfileCore);\n\t\tconst launchLocale = String(replayContext.browserProfileCore?.locale || DEFAULT_LOCALE).trim() || DEFAULT_LOCALE;\n\n const launchOptions = {\n args: [\n ...AntiCheat.getLaunchArgs({ locale: launchLocale }),\n ...customArgs,\n ],\n ignoreDefaultArgs: ['--enable-automation'],\n };\n\n if (traffic.launchProxy) {\n launchOptions.proxy = traffic.launchProxy;\n }\n\n logLaunchTraffic({\n ...traffic,\n debugMode,\n enabled: enableByPassLogger,\n });\n\n const onPageCreated = (page) => {\n const recommendedGotoOptions = {\n waitUntil: 'commit',\n };\n\n if (!page || typeof page.on !== 'function') {\n return recommendedGotoOptions;\n }\n trafficHook(page);\n return recommendedGotoOptions;\n };\n\n const launchContext = {\n useIncognitoPages: true,\n launchOptions,\n };\n if (launcher) {\n launchContext.launcher = launcher;\n }\n\n const crawlerBaseOptions = {\n ...DEFAULT_CRAWLER_BASE_OPTIONS,\n headless: !runInHeadfulMode || isRunningOnApify,\n\t\t\t// \u6709 core.fingerprint \u65F6\u8D70\u56FA\u5B9A\u56DE\u653E\uFF1B\u5426\u5219\u9000\u56DE Crawlee \u9ED8\u8BA4\u6307\u7EB9\u6A21\u5F0F\u3002\n\t\t\tbrowserPoolOptions: replayBrowserPoolOptions || {\n\t\t\t\tuseFingerprints: true,\n\t\t\t\tfingerprintOptions: {\n fingerprintGeneratorOptions: AntiCheat.getFingerprintGeneratorOptions({\n locale: launchLocale,\n device,\n }),\n },\n prePageCreateHooks: [\n (_pageId, browserController, pageOptions = {}) => {\n const fingerprintWithHeaders = browserController?.launchContext?.fingerprint;\n const timezoneId = AntiCheat.getBaseConfig().timezoneId;\n applyFingerprintPageOptions(pageOptions, {\n fingerprintWithHeaders,\n locale: launchLocale,\n timezoneId,\n });\n },\n ],\n },\n launchContext,\n };\n\n const normalizedPreNavigationHooks = Array.isArray(preNavigationHooks) ? preNavigationHooks : [];\n const normalizedPostNavigationHooks = Array.isArray(postNavigationHooks) ? postNavigationHooks : [];\n\n const internalPreNavigationHook = async ({ page }, gotoOptions = {}) => {\n const recommendedGotoOptions = onPageCreated(page);\n if (recommendedGotoOptions && typeof recommendedGotoOptions === 'object') {\n Object.assign(gotoOptions, recommendedGotoOptions);\n }\n };\n\n return {\n ...crawlerBaseOptions,\n preNavigationHooks: [internalPreNavigationHook, ...normalizedPreNavigationHooks],\n ...(normalizedPostNavigationHooks.length > 0\n ? { postNavigationHooks: normalizedPostNavigationHooks }\n : {}),\n };\n },\n};\n\nexport const Launch = DefaultLaunch;\n", "import picomatch from 'picomatch';\n\nconst normalizeByPassDomains = (domains) => {\n if (!Array.isArray(domains)) return [];\n return domains\n .map((item) => String(item || '').trim())\n .filter(Boolean);\n};\n\nconst normalizeHostname = (value = '') => String(value || '').trim().toLowerCase();\n\nconst buildByPassDomainRule = (rawPattern) => {\n const pattern = String(rawPattern || '').trim().toLowerCase();\n if (!pattern) return null;\n\n let matcher;\n try {\n matcher = picomatch(pattern, { nocase: true });\n } catch {\n return null;\n }\n\n return {\n pattern,\n test: (hostname) => matcher(String(hostname || '').toLowerCase()),\n };\n};\n\nconst buildByPassDomainRules = (domains = []) => {\n return normalizeByPassDomains(domains)\n .map((domain) => buildByPassDomainRule(domain))\n .filter(Boolean);\n};\n\nconst findMatchedByPassRule = (rules = [], requestUrl = '') => {\n let hostname = '';\n try {\n hostname = normalizeHostname(new URL(String(requestUrl || '')).hostname);\n } catch {\n return null;\n }\n\n for (const rule of rules) {\n if (rule && typeof rule.test === 'function' && rule.test(hostname)) {\n return {\n rule,\n hostname,\n };\n }\n }\n\n return {\n rule: null,\n hostname,\n };\n};\n\nconst isDomainCoveredByByPass = (domain = '', rules = []) => {\n const hostname = normalizeHostname(domain);\n if (!hostname) return false;\n\n for (const rule of rules || []) {\n if (!rule || typeof rule.test !== 'function') continue;\n if (rule.test(hostname)) return true;\n }\n\n return false;\n};\n\nconst resolveRouteByProxy = ({\n requestUrl = '',\n enableProxy = false,\n byPassRules = [],\n}) => {\n if (!enableProxy) {\n return { route: 'direct', matchedRule: null, hostname: '' };\n }\n\n const matched = findMatchedByPassRule(byPassRules, requestUrl);\n if (!matched) {\n return { route: 'proxy', matchedRule: null, hostname: '' };\n }\n\n if (matched.rule) {\n return { route: 'direct', matchedRule: matched.rule, hostname: matched.hostname };\n }\n\n return { route: 'proxy', matchedRule: null, hostname: matched.hostname };\n};\n\nexport const ByPass = {\n normalizeByPassDomains,\n normalizeHostname,\n buildByPassDomainRule,\n buildByPassDomainRules,\n findMatchedByPassRule,\n isDomainCoveredByByPass,\n resolveRouteByProxy,\n};\n", "import { ByPass } from '../../proxy-bypass.js';\nimport { createInternalLogger } from '../logger.js';\nimport { ProxyMeterRuntime } from '../proxy-meter-runtime.js';\n\nconst logger = createInternalLogger('Launch');\n\nconst normalizeObject = (value) => {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return {};\n }\n\n return value;\n};\n\nconst parseProxyConfiguration = (proxyConfiguration = {}) => {\n const config = normalizeObject(proxyConfiguration);\n const proxyUrl = String(config.proxy_url || '').trim();\n const enableProxy = typeof config.enable_proxy === 'boolean'\n ? config.enable_proxy\n : proxyUrl !== '';\n const byPassDomains = enableProxy && proxyUrl\n ? ByPass.normalizeByPassDomains(config.by_pass_domains)\n : [];\n\n return {\n byPassDomains,\n enableProxy,\n proxyUrl,\n };\n};\n\nexport const resolveLaunchTraffic = ({\n proxyConfiguration = {},\n debugMode = false,\n useMeter = true,\n} = {}) => {\n const { byPassDomains, enableProxy, proxyUrl } = parseProxyConfiguration(proxyConfiguration);\n const byPassRules = ByPass.buildByPassDomainRules(byPassDomains);\n const proxyMeter = useMeter && enableProxy && proxyUrl\n ? ProxyMeterRuntime.startProxyMeter({ proxyUrl, debugMode })\n : null;\n const launchProxy = proxyMeter ? { server: proxyMeter.server } : null;\n\n if (launchProxy && byPassDomains.length > 0) {\n launchProxy.bypass = byPassDomains.join(',');\n }\n\n return {\n byPassDomains,\n byPassRules,\n enableProxy,\n proxyUrl,\n launchProxy,\n };\n};\n\nexport const logLaunchTraffic = ({\n byPassDomains = [],\n debugMode = false,\n enabled = false,\n enableProxy = false,\n explicitProxy = false,\n launchProxy = null,\n proxyUrl = '',\n} = {}) => {\n if (!enabled) return;\n\n if (explicitProxy) {\n logger.info('[\u4EE3\u7406\u5DF2\u542F\u7528] \u4F7F\u7528\u663E\u5F0F proxy \u914D\u7F6E\uFF0C\u8DF3\u8FC7 toolkit \u672C\u5730\u6D41\u91CF\u89C2\u6D4B');\n return;\n }\n\n if (launchProxy) {\n let upstreamLabel = '';\n try {\n const parsedProxyUrl = new URL(proxyUrl.includes('://') ? proxyUrl : `http://${proxyUrl}`);\n upstreamLabel = `${parsedProxyUrl.protocol}//${parsedProxyUrl.host}`;\n } catch {}\n logger.info(\n `[\u4EE3\u7406\u5DF2\u542F\u7528] \u672C\u5730=${launchProxy.server} \u4E0A\u6E38=${upstreamLabel || '-'} \u76F4\u8FDE\u57DF\u540D=${byPassDomains.join(',')}`,\n );\n logger.info(`[\u6D41\u91CF\u89C2\u6D4B] \u9010\u8BF7\u6C42\u8C03\u8BD5=${Boolean(debugMode) ? '\u5F00\u542F' : '\u5173\u95ED'}\uFF08\u6C47\u603B\u59CB\u7EC8\u5F00\u542F\uFF09`);\n return;\n }\n\n if (enableProxy) {\n logger.info('[\u4EE3\u7406\u672A\u542F\u7528] enable_proxy=true \u4F46 proxy_url \u4E3A\u7A7A');\n } else if (proxyUrl) {\n logger.info('[\u4EE3\u7406\u672A\u542F\u7528] enable_proxy=false \u4E14 proxy_url \u5DF2\u914D\u7F6E');\n }\n logger.info(`[\u6D41\u91CF\u89C2\u6D4B] \u9010\u8BF7\u6C42\u8C03\u8BD5=${Boolean(debugMode) ? '\u5F00\u542F' : '\u5173\u95ED'}\uFF08\u6C47\u603B\u59CB\u7EC8\u5F00\u542F\uFF09`);\n};\n\nexport const createLaunchTrafficHook = ({\n byPassDomains = [],\n byPassRules = [],\n enabled = false,\n launchProxy = null,\n} = {}) => {\n const patchedPages = new WeakSet();\n\n return (page) => {\n if (!page || typeof page.on !== 'function' || patchedPages.has(page)) {\n return;\n }\n\n patchedPages.add(page);\n page.on('request', (req) => {\n const requestUrl = req.url();\n const resourceType = req.resourceType();\n const matched = byPassDomains.length > 0\n ? ByPass.findMatchedByPassRule(byPassRules, requestUrl)\n : null;\n\n if (launchProxy) {\n ProxyMeterRuntime.recordProxyMeterResourceType(requestUrl, resourceType);\n }\n if (!enabled || byPassDomains.length === 0) return;\n if (!matched || !matched.rule) return;\n\n logger.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}`);\n });\n };\n};\n", "import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nimport { createInternalLogger } from '../logger.js';\nimport { ByPass } from '../../proxy-bypass.js';\nimport {\n createLaunchTrafficHook,\n logLaunchTraffic,\n resolveLaunchTraffic,\n} from './traffic.js';\n\nconst logger = createInternalLogger('Launch');\nconst execFileAsync = promisify(execFile);\n\nconst DEFAULT_CLOAK_CRAWLER_BASE_OPTIONS = Object.freeze({\n maxConcurrency: 1,\n maxRequestRetries: 0,\n requestHandlerTimeoutSecs: 240,\n navigationTimeoutSecs: 120,\n});\n\nconst DEFAULT_CLOAK_HUMANIZE_OPTIONS = Object.freeze({\n humanize: true,\n});\n\nconst DEFAULT_CLOAK_GOTO_OPTIONS = Object.freeze({\n waitUntil: 'commit',\n});\n\nlet cachedCloakModulePromise = null;\n\nconst hasOwn = (target, key) => Object.prototype.hasOwnProperty.call(target, key);\n\nconst loadCloakModule = async () => {\n if (!cachedCloakModulePromise) {\n cachedCloakModulePromise = import('cloakbrowser').catch((error) => {\n cachedCloakModulePromise = null;\n throw new Error('Cloak \u6A21\u5757\u52A0\u8F7D\u5931\u8D25\uFF0C\u8BF7\u786E\u8BA4\u5F53\u524D\u8FD0\u884C\u73AF\u5883\u5DF2\u5B89\u88C5 cloakbrowser\u3002', {\n cause: error,\n });\n });\n }\n\n return cachedCloakModulePromise;\n};\n\nconst buildCloakLaunchOptions = async (options = {}) => {\n const { buildLaunchOptions } = await loadCloakModule();\n return await buildLaunchOptions(normalizeObject(options));\n};\n\nconst normalizeObject = (value) => {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return {};\n }\n\n return value;\n};\n\nconst normalizeStringArray = (value) => {\n if (!Array.isArray(value)) {\n return [];\n }\n\n return value.map((item) => String(item || '').trim()).filter(Boolean);\n};\n\nconst resolveCloakProxy = (proxyConfiguration = {}) => {\n const config = normalizeObject(proxyConfiguration);\n const proxyUrl = String(config.proxy_url || '').trim();\n const enableProxy = typeof config.enable_proxy === 'boolean' ? config.enable_proxy : proxyUrl !== '';\n\n if (!enableProxy || !proxyUrl) {\n return null;\n }\n\n const byPassDomains = ByPass.normalizeByPassDomains(config.by_pass_domains);\n if (byPassDomains.length === 0) {\n return proxyUrl;\n }\n\n const parsedProxyUrl = new URL(proxyUrl.includes('://') ? proxyUrl : `http://${proxyUrl}`);\n return {\n server: `${parsedProxyUrl.protocol}//${parsedProxyUrl.host}`,\n username: decodeURIComponent(parsedProxyUrl.username || ''),\n password: decodeURIComponent(parsedProxyUrl.password || ''),\n bypass: byPassDomains.join(','),\n };\n};\n\nconst extractFingerprintArg = (launchOptions = {}) => {\n const args = Array.isArray(launchOptions?.args) ? launchOptions.args : [];\n return args.find((value) => String(value || '').startsWith('--fingerprint=')) || '';\n};\n\nconst createStableGotoHook = (recommendedGotoOptions = DEFAULT_CLOAK_GOTO_OPTIONS) => {\n const normalizedRecommendedGotoOptions = normalizeObject(recommendedGotoOptions);\n const fallbackGotoOptions = Object.keys(normalizedRecommendedGotoOptions).length > 0\n ? normalizedRecommendedGotoOptions\n : DEFAULT_CLOAK_GOTO_OPTIONS;\n\n return async (_crawlingContext, gotoOptions = {}) => {\n for (const [key, value] of Object.entries(fallbackGotoOptions)) {\n if (gotoOptions[key] == null) {\n gotoOptions[key] = value;\n }\n }\n };\n};\n\nconst attachCloakHumanizeHook = ({\n browserPoolOptions = {},\n activeBrowsers,\n patchedBrowsers,\n humanizeOptions = DEFAULT_CLOAK_HUMANIZE_OPTIONS,\n} = {}) => {\n const normalizedBrowserPoolOptions = normalizeObject(browserPoolOptions);\n const shouldHumanize = humanizeOptions !== false;\n const normalizedHumanizeOptions = shouldHumanize\n ? {\n ...DEFAULT_CLOAK_HUMANIZE_OPTIONS,\n ...normalizeObject(humanizeOptions),\n }\n : null;\n\n return {\n ...normalizedBrowserPoolOptions,\n useFingerprints: false,\n postLaunchHooks: [\n ...(Array.isArray(normalizedBrowserPoolOptions.postLaunchHooks)\n ? normalizedBrowserPoolOptions.postLaunchHooks\n : []),\n async (_pageId, browserController) => {\n const browser = browserController?.browser;\n if (!browser || typeof browser.contexts !== 'function') {\n return;\n }\n\n activeBrowsers.add(browser);\n if (typeof browser.once === 'function') {\n browser.once('disconnected', () => {\n activeBrowsers.delete(browser);\n });\n }\n\n if (!shouldHumanize || patchedBrowsers.has(browser)) {\n return;\n }\n\n const { humanizeBrowser } = await loadCloakModule();\n await humanizeBrowser(browser, normalizedHumanizeOptions);\n patchedBrowsers.add(browser);\n },\n ],\n };\n};\n\nconst closeTrackedBrowsers = async (activeBrowsers) => {\n const browsers = Array.from(activeBrowsers || []);\n activeBrowsers?.clear?.();\n\n await Promise.allSettled(\n browsers.map(async (browser) => {\n if (!browser || typeof browser.isConnected !== 'function' || !browser.isConnected()) {\n return;\n }\n\n await browser.close().catch(() => {});\n }),\n );\n};\n\nconst forceTerminateBrowsersByFingerprintArg = async (fingerprintArg) => {\n if (!fingerprintArg) {\n return;\n }\n\n await execFileAsync('pkill', ['-f', '--', fingerprintArg]).catch((error) => {\n if (error?.code === 1 || error?.code === 'ENOENT') {\n return;\n }\n\n logger.info(`\u5F3A\u5236\u5173\u95ED Cloak \u8FDB\u7A0B\u5931\u8D25\uFF08\u5FFD\u7565\uFF09: ${error?.message || String(error)}`);\n });\n};\n\nexport const CloakLaunch = {\n resolveProxyConfiguration(proxyConfiguration = {}) {\n return resolveCloakProxy(proxyConfiguration);\n },\n\n extractFingerprintArg(launchOptions = {}) {\n return extractFingerprintArg(launchOptions);\n },\n\n createStableGotoHook(recommendedGotoOptions = DEFAULT_CLOAK_GOTO_OPTIONS) {\n return createStableGotoHook(recommendedGotoOptions);\n },\n\n async getPlaywrightCrawlerOptions(options = {}) {\n const runtime = await CloakLaunch.createPlaywrightCrawlerRuntime(options);\n return Object.defineProperties(runtime.crawlerOptions, {\n cleanup: {\n enumerable: false,\n value: runtime.cleanup,\n },\n closeActiveBrowsers: {\n enumerable: false,\n value: runtime.closeActiveBrowsers,\n },\n forceTerminateActiveProcesses: {\n enumerable: false,\n value: runtime.forceTerminateActiveProcesses,\n },\n });\n },\n\n async buildLaunchOptions(options = {}) {\n return await buildCloakLaunchOptions(options);\n },\n\n async createPlaywrightCrawlerRuntime(options = {}) {\n const normalizedOptions = normalizeObject(options);\n const {\n proxyConfiguration = {},\n log: logOptions = null,\n debugMode = false,\n runInHeadfulMode = false,\n isRunningOnApify = false,\n launcher = null,\n cloakOptions = {},\n humanizeOptions = DEFAULT_CLOAK_HUMANIZE_OPTIONS,\n crawlerBaseOptions = {},\n browserPoolOptions = {},\n launchContext = {},\n preNavigationHooks = [],\n postNavigationHooks = [],\n recommendedGotoOptions = DEFAULT_CLOAK_GOTO_OPTIONS,\n } = normalizedOptions;\n\n const normalizedCloakOptions = normalizeObject(cloakOptions);\n const activeBrowsers = new Set();\n const patchedBrowsers = new WeakSet();\n const defaultArgs = isRunningOnApify ? ['--no-sandbox', '--disable-setuid-sandbox'] : [];\n const extraArgs = normalizeStringArray(normalizedCloakOptions.args);\n const hasExplicitProxy = hasOwn(normalizedCloakOptions, 'proxy');\n const proxyLaunchState = hasExplicitProxy\n ? resolveLaunchTraffic({ proxyConfiguration, debugMode, useMeter: false })\n : resolveLaunchTraffic({ proxyConfiguration, debugMode });\n const proxy = hasExplicitProxy ? normalizedCloakOptions.proxy : proxyLaunchState.launchProxy;\n const headless = hasOwn(normalizedCloakOptions, 'headless')\n ? normalizedCloakOptions.headless\n : (!runInHeadfulMode || isRunningOnApify);\n const enableByPassLogger = Boolean(logOptions && logOptions.enable);\n\n const mergedCloakOptions = {\n ...normalizedCloakOptions,\n headless,\n proxy,\n args: [...defaultArgs, ...extraArgs],\n };\n\n const launchOptions = await buildCloakLaunchOptions(mergedCloakOptions);\n const fingerprintArg = extractFingerprintArg(launchOptions);\n const internalPreNavigationHook = createStableGotoHook(recommendedGotoOptions);\n const trafficHook = createLaunchTrafficHook({\n byPassDomains: proxyLaunchState.byPassDomains,\n byPassRules: proxyLaunchState.byPassRules,\n enabled: enableByPassLogger,\n launchProxy: proxyLaunchState.launchProxy,\n });\n const normalizedPreNavigationHooks = Array.isArray(preNavigationHooks) ? preNavigationHooks : [];\n const normalizedPostNavigationHooks = Array.isArray(postNavigationHooks) ? postNavigationHooks : [];\n\n logLaunchTraffic({\n ...proxyLaunchState,\n debugMode,\n enabled: enableByPassLogger,\n explicitProxy: hasExplicitProxy,\n });\n\n const crawlerOptions = {\n ...DEFAULT_CLOAK_CRAWLER_BASE_OPTIONS,\n ...normalizeObject(crawlerBaseOptions),\n headless,\n launchContext: {\n useIncognitoPages: true,\n ...normalizeObject(launchContext),\n ...(launcher ? { launcher } : {}),\n launchOptions,\n },\n browserPoolOptions: attachCloakHumanizeHook({\n browserPoolOptions,\n activeBrowsers,\n patchedBrowsers,\n humanizeOptions,\n }),\n preNavigationHooks: [\n async (crawlingContext, gotoOptions = {}) => {\n trafficHook(crawlingContext?.page);\n await internalPreNavigationHook(crawlingContext, gotoOptions);\n },\n ...normalizedPreNavigationHooks,\n ],\n ...(normalizedPostNavigationHooks.length > 0\n ? { postNavigationHooks: normalizedPostNavigationHooks }\n : {}),\n };\n\n const closeActiveBrowsers = async () => {\n await closeTrackedBrowsers(activeBrowsers);\n };\n\n const forceTerminateActiveProcesses = async () => {\n await forceTerminateBrowsersByFingerprintArg(fingerprintArg);\n };\n\n const cleanup = async () => {\n await closeActiveBrowsers();\n await forceTerminateActiveProcesses();\n };\n\n return {\n headless,\n launchOptions,\n fingerprintArg,\n crawlerOptions,\n closeActiveBrowsers,\n forceTerminateActiveProcesses,\n cleanup,\n };\n },\n};\n", "import { Mode } from './constants.js';\nimport { withModeReflect } from './internals/reflect.js';\nimport { CloakLaunch, DefaultLaunch } from './internals/launch/index.js';\n\nconst launchStrategies = {\n [Mode.Default]: DefaultLaunch,\n [Mode.Cloak]: CloakLaunch,\n};\n\nexport const Launch = withModeReflect('Launch', launchStrategies);\n", "import express from 'express';\nimport { Actor } from 'apify';\nimport { PresetOfLiveViewKey } from './constants';\nimport { createInternalLogger } from './internals/logger';\nimport { capturePageScreenshot } from './internals/screenshot';\n\nconst logger = createInternalLogger('LiveView');\n\n/**\n * \u542F\u52A8\u4E00\u4E2A Web \u670D\u52A1\u5668\u4EE5\u5728 Live View \u9009\u9879\u5361\u4E2D\u663E\u793A\u6700\u65B0\u7684\u5C4F\u5E55\u622A\u56FE\u3002\n */\nasync function startLiveViewServer(liveViewKey) {\n const app = express();\n\n app.get('/', async (req, res) => {\n try {\n // \u4ECE\u9ED8\u8BA4\u7684 Key-Value Store \u4E2D\u8BFB\u53D6\u6700\u65B0\u7684\u5C4F\u5E55\u622A\u56FE\n const screenshotBuffer = await Actor.getValue(liveViewKey);\n\n if (!screenshotBuffer) {\n // \u5982\u679C\u8FD8\u6CA1\u6709\u622A\u56FE\uFF0C\u53D1\u9001\u4E00\u4E2A\u81EA\u52A8\u5237\u65B0\u7684\u5360\u4F4D\u9875\u9762\n res.send('<html><head><meta http-equiv=\"refresh\" content=\"2\"></head><body>\u7B49\u5F85\u7B2C\u4E00\u4E2A\u5C4F\u5E55\u622A\u56FE...</body></html>');\n return;\n }\n\n // \u5C06 Buffer \u8F6C\u6362\u4E3A Base64 \u5B57\u7B26\u4E32\n const screenshotBase64 = screenshotBuffer.toString('base64');\n\n // \u53D1\u9001\u4E00\u4E2A HTML \u9875\u9762\uFF0C\u8BE5\u9875\u9762\u6BCF 1 \u79D2\u81EA\u52A8\u5237\u65B0\u4E00\u6B21\uFF0C\u5E76\u663E\u793A\u622A\u56FE\n res.send(`\n <html>\n <head>\n <title>Live View (\u622A\u56FE)</title>\n <meta http-equiv=\"refresh\" content=\"1\">\n </head>\n <body style=\"margin:0; padding:0;\">\n <img src=\"data:image/png;base64,${screenshotBase64}\" \n alt=\"Live View Screenshot\" \n style=\"width: 100%; height: auto;\" />\n </body>\n </html>\n `);\n } catch (error) {\n logger.fail('Live View Server', error);\n res.status(500).send(`\u65E0\u6CD5\u52A0\u8F7D\u5C4F\u5E55\u622A\u56FE: ${error.message}`);\n }\n });\n\n // \u76D1\u542C Apify \u5BB9\u5668\u7AEF\u53E3 \n const port = process.env.APIFY_CONTAINER_PORT || 4321;\n app.listen(port, () => { logger.success('startLiveViewServer', `\u76D1\u542C\u7AEF\u53E3 ${port}`); });\n}\n\n/**\n * \u62CD\u6444\u5F53\u524D\u9875\u9762\u7684\u5C4F\u5E55\u622A\u56FE\u5E76\u5C06\u5176\u4FDD\u5B58\u5230 Key-Value Store\u3002\n * @param {import('playwright').Page} page\n * @param {string} [logMessage] - \u53EF\u9009\u7684\u65E5\u5FD7\u6D88\u606F\u3002\n */\nasync function takeLiveScreenshot(liveViewKey, page, logMessage) {\n try {\n const buffer = await capturePageScreenshot(page, { type: 'png' });\n await Actor.setValue(liveViewKey, buffer, { contentType: 'image/png' });\n if (logMessage) {\n logger.info(`(\u622A\u56FE): ${logMessage}`);\n }\n } catch (e) {\n logger.warn(`\u65E0\u6CD5\u6355\u83B7 Live View \u5C4F\u5E55\u622A\u56FE: ${e.message}`);\n }\n}\n\nconst useLiveView = (liveViewKey = PresetOfLiveViewKey) => {\n return {\n takeLiveScreenshot: async (page, logMessage) => {\n return await takeLiveScreenshot(liveViewKey, page, logMessage)\n },\n startLiveViewServer: async () => {\n return await startLiveViewServer(liveViewKey);\n }\n }\n}\n\nexport const LiveView = {\n useLiveView,\n};\n", "import { v4 as uuidv4 } from 'uuid';\nimport { createInternalLogger } from './internals/logger.js';\nimport { sloveCaptcha as solveBytedanceCaptchaStrategy } from './internals/captcha/bytedance.js';\n\nconst logger = createInternalLogger('Captcha');\nconst DEFAULT_CAPTCHA_RECOGNITION_OPTIONS = Object.freeze({\n token: 'eKJvBfwfN0YRav0-VD_44E2VBSfm7l0YtddUQ7cFySI',\n apiUrl: 'https://api.jfbym.com/api/YmServer/customApi',\n});\n\nconst CAPTCHA_STRATEGIES = Object.freeze({\n bytedance: {\n sloveCaptcha: solveBytedanceCaptchaStrategy,\n },\n});\n\nconst mergeDefinedOptions = (...sources) => {\n const merged = {};\n\n for (const source of sources) {\n for (const [key, value] of Object.entries(source || {})) {\n if (value !== undefined) {\n merged[key] = value;\n }\n }\n }\n\n return merged;\n};\n\n/**\n * \u521B\u5EFA\u9A8C\u8BC1\u7801\u76D1\u63A7\u5668\uFF0C\u652F\u6301\u57FA\u4E8E DOM \u6216 URL \u7684\u9A8C\u8BC1\u7801\u68C0\u6D4B\u3002\n *\n * @param {import('playwright').Page} page\n * @param {Object} options\n * @param {string} [options.domSelector]\n * @param {string} [options.urlPattern]\n * @param {() => Promise<void>} options.onDetected\n */\nexport function useCaptchaMonitor(page, options) {\n const { domSelector, urlPattern, onDetected } = options;\n\n if (!domSelector && !urlPattern) {\n throw new Error('[CaptchaMonitor] \u5FC5\u987B\u63D0\u4F9B domSelector \u6216 urlPattern\u3002');\n }\n\n if (!onDetected || typeof onDetected !== 'function') {\n throw new Error('[CaptchaMonitor] onDetected \u5FC5\u987B\u662F\u51FD\u6570\u3002');\n }\n\n let isStopped = false;\n let isHandling = false;\n let frameHandler = null;\n let domFrameHandler = null;\n\n const triggerDetected = async () => {\n if (isStopped || isHandling) return;\n isHandling = true;\n try {\n await onDetected();\n } finally {\n isHandling = false;\n }\n };\n\n const cleanupFns = [];\n\n if (domSelector) {\n const exposedFunctionName = `__c_d_${uuidv4().replace(/-/g, '_')}`;\n const cleanerName = `__c_cleaner_${uuidv4().replace(/-/g, '_')}`;\n const installDomMonitor = ({ selector, callbackName, cleanerName: cleanupName }) => {\n (() => {\n if (typeof window[cleanupName] === 'function') {\n try {\n window[cleanupName]();\n } catch {\n // \u5FFD\u7565\u91CD\u590D\u5B89\u88C5\u65F6\u7684\u6E05\u7406\u5F02\u5E38\u3002\n }\n }\n\n /** @type {MutationObserver | null} */\n let observer = null;\n\n const checkAndReport = () => {\n const element = document.querySelector(selector);\n if (!element) {\n return false;\n }\n\n if (window[callbackName]) {\n window[callbackName]();\n }\n return true;\n };\n\n checkAndReport();\n\n observer = new MutationObserver((mutations) => {\n const shouldCheck = mutations.some((mutation) => mutation.addedNodes.length > 0);\n if (shouldCheck && observer) {\n checkAndReport();\n }\n });\n\n const mountObserver = () => {\n const target = document.documentElement;\n if (target && observer) {\n observer.observe(target, { childList: true, subtree: true });\n }\n };\n\n if (document.readyState === 'loading') {\n window.addEventListener('DOMContentLoaded', mountObserver, { once: true });\n } else {\n mountObserver();\n }\n\n window[cleanupName] = () => {\n if (observer) {\n observer.disconnect();\n observer = null;\n }\n };\n })();\n };\n\n const installArgs = {\n selector: domSelector,\n callbackName: exposedFunctionName,\n cleanerName,\n };\n\n const domMonitorReady = (async () => {\n await page.exposeFunction(exposedFunctionName, triggerDetected);\n await page.addInitScript(installDomMonitor, installArgs);\n await page.evaluate(installDomMonitor, installArgs).catch(() => {\n // \u5F53\u524D\u6587\u6863\u53EF\u80FD\u6B63\u5904\u4E8E\u5BFC\u822A\u5207\u6362\u4E2D\uFF0C\u4EA4\u7ED9 framenavigated \u518D\u8865\u88C5\u3002\n });\n logger.success('useCaptchaMonitor', `DOM \u76D1\u63A7\u5DF2\u542F\u7528\uFF1A${domSelector}`);\n })().catch((error) => {\n if (isStopped) {\n return;\n }\n logger.warn(`DOM \u76D1\u63A7\u521D\u59CB\u5316\u5931\u8D25 (${domSelector}): ${error?.message || error}`);\n });\n\n domFrameHandler = async (frame) => {\n if (frame !== page.mainFrame() || isStopped) {\n return;\n }\n\n await domMonitorReady;\n if (isStopped) {\n return;\n }\n\n await page.evaluate(installDomMonitor, installArgs).catch(() => {\n // \u9875\u9762\u53EF\u80FD\u5728\u6781\u77ED\u65F6\u95F4\u5185\u518D\u6B21\u8DF3\u8F6C\uFF0C\u5FFD\u7565\u672C\u6B21\u8865\u88C5\u5931\u8D25\u3002\n });\n };\n\n page.on('framenavigated', domFrameHandler);\n\n cleanupFns.push(async () => {\n if (domFrameHandler) {\n page.off('framenavigated', domFrameHandler);\n }\n await domMonitorReady;\n try {\n await page.evaluate((name) => {\n if (window[name]) {\n window[name]();\n delete window[name];\n }\n }, cleanerName);\n } catch {\n // \u5BFC\u822A\u6216\u9875\u9762\u5173\u95ED\u540E\u7684\u6E05\u7406\u9519\u8BEF\u53EF\u4EE5\u5FFD\u7565\u3002\n }\n });\n }\n\n if (urlPattern) {\n frameHandler = async (frame) => {\n if (frame !== page.mainFrame()) {\n return;\n }\n\n const currentUrl = page.url();\n if (currentUrl.includes(urlPattern)) {\n await triggerDetected();\n }\n };\n\n page.on('framenavigated', frameHandler);\n logger.success('useCaptchaMonitor', `URL \u76D1\u63A7\u5DF2\u542F\u7528\uFF1A${urlPattern}`);\n\n cleanupFns.push(async () => {\n page.off('framenavigated', frameHandler);\n });\n }\n\n return {\n stop: async () => {\n logger.info('\u6B63\u5728\u505C\u6B62\u9A8C\u8BC1\u7801\u76D1\u63A7...');\n isStopped = true;\n for (const fn of cleanupFns) {\n await fn();\n }\n },\n };\n}\n\nexport const callCaptchaRecognitionApi = async (requestParams = {}) => {\n const { apiUrl, ...payload } = mergeDefinedOptions(\n DEFAULT_CAPTCHA_RECOGNITION_OPTIONS,\n requestParams,\n );\n\n if (!apiUrl) {\n throw new Error('[Captcha] \u7F3A\u5C11\u9A8C\u8BC1\u7801\u8BC6\u522B\u63A5\u53E3\u5730\u5740 apiUrl\u3002');\n }\n\n const response = await fetch(apiUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(`Captcha API request failed with status ${response.status}`);\n }\n\n return await response.json();\n};\n\nexport async function solveCaptchaWithStrategy(strategyName, page, options = {}) {\n const strategy = CAPTCHA_STRATEGIES[strategyName];\n\n if (!strategy?.sloveCaptcha) {\n throw new Error(`[Captcha] \u672A\u627E\u5230\u9A8C\u8BC1\u7801\u7B56\u7565\uFF1A${strategyName}`);\n }\n\n const resolvedOptions = mergeDefinedOptions(\n DEFAULT_CAPTCHA_RECOGNITION_OPTIONS,\n options,\n );\n\n return strategy.sloveCaptcha(page, resolvedOptions, {\n callCaptchaRecognitionApi,\n logger,\n });\n}\n\nexport const Captcha = {\n useCaptchaMonitor,\n solveCaptchaWithStrategy,\n};\n", "import { mkdir, writeFile } from 'fs/promises';\nimport path from 'path';\nimport { DeviceInput } from '../../device-input.js';\nimport { createInternalLogger } from '../logger.js';\nimport {\n clickCaptchaAction,\n dragCaptchaAction,\n isAnyCaptchaTextVisible,\n waitForVisible,\n} from './shared.js';\n\nconst logger = createInternalLogger('Captcha');\n\nconst DEFAULT_BYTEDANCE_CAPTCHA_OPTIONS = Object.freeze({\n apiType: '31234',\n maxRetries: 3,\n containerSelector: '#captcha_container',\n iframeSelector: 'iframe[src*=\"verifycenter\"]',\n iframeFallbackSelector: 'iframe',\n sourceImageSelector: '.img-container .canvas-container',\n dropTargetContainerSelector: '.drag-area',\n dropTargetTexts: ['\u62D6\u62FD\u5230\u8FD9\u91CC'],\n refreshTexts: ['\u5237\u65B0'],\n submitTexts: ['\u63D0\u4EA4'],\n guideMaskSelector: '.play-guide-mask',\n recognitionSuccessCode: 10000,\n containerVisibleTimeoutMs: 2000,\n iframeVisibleTimeoutMs: 12000,\n iframeFallbackVisibleTimeoutMs: 4000,\n contentFrameResolveRetries: 5,\n contentFrameResolveDelayMs: 500,\n actionVisibleTimeoutMs: 1500,\n sourceImageVisibleTimeoutMs: 3000,\n challengeReadyTimeoutMs: 15000,\n challengeReadyRefreshTimeoutMs: 20000,\n challengeReadyPollMs: 300,\n loadingIndicatorVisibleTimeoutMs: 200,\n loadingTexts: ['\u52A0\u8F7D\u4E2D', '\u52A0\u8F7D\u4E2D...'],\n errorTexts: [\n '\u68C0\u6D4B\u5230\u60A8\u7684\u7F51\u7EDC\u73AF\u5883\u8F83\u5DEE',\n '\u7F51\u7EDC\u73AF\u5883\u8F83\u5DEE',\n '\u8BF7\u66F4\u6362\u7F51\u7EDC\u6216\u8005\u7A0D\u540E\u518D\u8BD5',\n '\u8BF7\u66F4\u6362\u7F51\u7EDC\u6216\u7A0D\u540E\u518D\u8BD5',\n '\u7A0D\u540E\u518D\u8BD5',\n ],\n recognitionDelayMs: 2000,\n refreshWaitMs: 3000,\n submitWaitMs: 5000,\n submitReadyTimeoutMs: 2500,\n retryDelayBaseMs: 2000,\n retryDelayStepMs: 1000,\n sourceImageRowTolerancePx: 24,\n dragBetweenWaitMs: 250,\n promptBadgeCountSelector: '.drag-area .photo-badge .badge span',\n promptSubmitButtonSelector: '.vc-captcha-verify-mobile-button',\n promptSelectedSourceSelector: '.img-container .canvas-container.selected',\n promptActiveSourceSelector: '.img-container .canvas-container.active',\n promptDragMoveSteps: 16,\n promptDragStepDelayMs: 55,\n promptDragHoldDelayMs: 240,\n promptDragBeforeReleaseDelayMs: 180,\n promptDragAfterReleaseDelayMs: 240,\n promptDragFinalMoveRepeats: 3,\n promptDragRetryDelayMs: 250,\n debugArtifacts: false,\n});\n\nconst PROMPT_CAPTCHA_DRAG_PLANS = Object.freeze([\n { name: 'lower-middle', endXRatio: 0.5, endYRatio: 0.72 },\n { name: 'center-middle', endXRatio: 0.5, endYRatio: 0.56 },\n { name: 'upper-middle', endXRatio: 0.5, endYRatio: 0.4 },\n]);\n\nconst resolveCaptchaDebugDir = () => path.resolve(process.cwd(), 'storage', 'captcha-debug');\n\nconst rectOf = (rect) => {\n if (!rect) {\n return null;\n }\n\n return {\n x: Number(rect.x.toFixed(2)),\n y: Number(rect.y.toFixed(2)),\n width: Number(rect.width.toFixed(2)),\n height: Number(rect.height.toFixed(2)),\n };\n};\n\nconst collectCaptchaDebugInfo = async (page, frame, iframeLocator, attempt, phase, extra = null) => {\n const timestamp = Date.now();\n const debugDir = resolveCaptchaDebugDir();\n await mkdir(debugDir, { recursive: true });\n\n const baseName = `bytedance-${timestamp}-attempt${attempt}-${phase}`;\n const iframeScreenshotPath = path.join(debugDir, `${baseName}-iframe.png`);\n const pageScreenshotPath = path.join(debugDir, `${baseName}-page.png`);\n const htmlPath = path.join(debugDir, `${baseName}-iframe.html`);\n const infoPath = path.join(debugDir, `${baseName}-info.json`);\n\n await iframeLocator.screenshot({ path: iframeScreenshotPath }).catch(() => {});\n await page.screenshot({ path: pageScreenshotPath, fullPage: true }).catch(() => {});\n\n const html = await frame.evaluate(() => document.documentElement.outerHTML).catch(() => '');\n if (html) {\n await writeFile(htmlPath, html, 'utf8');\n }\n\n const info = await frame.evaluate(() => {\n const toRect = (element) => {\n const rect = element.getBoundingClientRect();\n return {\n x: Number(rect.x.toFixed(2)),\n y: Number(rect.y.toFixed(2)),\n width: Number(rect.width.toFixed(2)),\n height: Number(rect.height.toFixed(2)),\n };\n };\n\n const toItem = (element, index) => ({\n index,\n tag: element.tagName,\n id: element.id || '',\n className: typeof element.className === 'string' ? element.className : '',\n text: String(element.textContent || '').trim(),\n rect: toRect(element),\n });\n\n const visibleNodes = Array.from(document.querySelectorAll('body *'))\n .map(toItem)\n .filter((item) => item.rect.width > 0 && item.rect.height > 0);\n\n return {\n title: document.title,\n bodyText: String(document.body?.innerText || '').trim(),\n canvasContainers: visibleNodes.filter((item) => item.className.includes('canvas-container')),\n canvasNodes: visibleNodes.filter((item) => item.tag === 'CANVAS'),\n captchaNodes: visibleNodes.filter((item) => (\n item.id.startsWith('captcha_')\n || item.className.includes('captcha')\n || item.className.includes('verify')\n || /\u62D6\u62FD\u5230\u8FD9\u91CC|\u5237\u65B0|\u63D0\u4EA4/.test(item.text)\n )),\n visibleTextNodes: visibleNodes.filter((item) => item.text).slice(0, 300),\n };\n }).catch(() => null);\n\n if (info) {\n const payload = {\n capturedAt: new Date(timestamp).toISOString(),\n pageUrl: page.url(),\n attempt,\n phase,\n iframeScreenshotPath,\n pageScreenshotPath,\n htmlPath,\n info,\n };\n\n if (extra != null) {\n payload.extra = extra;\n }\n\n await writeFile(infoPath, JSON.stringify(payload, null, 2), 'utf8');\n }\n\n logger.info(`\u5DF2\u5199\u51FA\u9A8C\u8BC1\u7801\u8C03\u8BD5\u4EA7\u7269\uFF1A${debugDir}`);\n};\n\nconst maybeCollectCaptchaDebugInfo = async (\n page,\n frame,\n iframeLocator,\n attempt,\n phase,\n options,\n extra = null,\n) => {\n if (!options.debugArtifacts) {\n return;\n }\n\n await collectCaptchaDebugInfo(page, frame, iframeLocator, attempt, phase, extra);\n};\n\nconst extractCaptchaSerialNumbers = (apiResponse) => {\n const serialNumbers = apiResponse?.data?.data?.serial_number;\n if (!Array.isArray(serialNumbers)) {\n return [];\n }\n\n return serialNumbers\n .map((value) => Number(value))\n .filter((value) => Number.isInteger(value) && value >= 0);\n};\n\nconst resolveContentFrame = async (page, iframeLocator, options) => {\n for (let attempt = 1; attempt <= options.contentFrameResolveRetries; attempt += 1) {\n const iframeHandle = await iframeLocator.elementHandle();\n const frame = await iframeHandle?.contentFrame();\n if (frame) {\n return frame;\n }\n\n if (attempt < options.contentFrameResolveRetries) {\n await page.waitForTimeout(options.contentFrameResolveDelayMs);\n }\n }\n\n return null;\n};\n\nconst getVerifycenterCaptchaContext = async (page, options) => {\n const captchaContainer = page.locator(options.containerSelector).first();\n const isContainerVisible = await waitForVisible(\n captchaContainer,\n options.containerVisibleTimeoutMs,\n );\n\n if (!isContainerVisible) {\n return null;\n }\n\n logger.info('\u68C0\u6D4B\u5230\u9A8C\u8BC1\u7801\u5BB9\u5668\uFF0C\u5F00\u59CB\u7B49\u5F85 iframe \u52A0\u8F7D\u3002');\n\n let iframeLocator = page.locator(options.iframeSelector).first();\n let isIframeVisible = await waitForVisible(\n iframeLocator,\n options.iframeVisibleTimeoutMs,\n );\n\n if (!isIframeVisible) {\n logger.warn('\u672A\u5728\u9884\u671F\u9009\u62E9\u5668\u4E2D\u627E\u5230 verifycenter iframe\uFF0C\u5C1D\u8BD5\u5BB9\u5668\u5185\u4EFB\u610F iframe\u3002');\n iframeLocator = captchaContainer.locator(options.iframeFallbackSelector).first();\n isIframeVisible = await waitForVisible(\n iframeLocator,\n options.iframeFallbackVisibleTimeoutMs,\n );\n }\n\n if (!isIframeVisible) {\n throw new Error('verifycenter iframe not found inside captcha container.');\n }\n\n logger.info('\u9A8C\u8BC1\u7801 iframe \u5DF2\u53EF\u89C1\uFF0C\u5F00\u59CB\u89E3\u6790\u5185\u5BB9 frame\u3002');\n const frame = await resolveContentFrame(page, iframeLocator, options);\n if (!frame) {\n throw new Error('Failed to resolve verifycenter iframe content frame.');\n }\n\n return { iframeLocator, frame };\n};\n\nconst findCaptchaDropTarget = async (frame, options) => {\n const directTarget = frame.locator(options.dropTargetContainerSelector).first();\n if (await waitForVisible(directTarget, options.actionVisibleTimeoutMs)) {\n return directTarget;\n }\n\n for (const text of options.dropTargetTexts) {\n const candidates = [\n frame.getByText(text, { exact: false }).first(),\n frame.locator(`text=${text}`).first(),\n ];\n\n for (const candidate of candidates) {\n const isVisible = await waitForVisible(candidate, options.actionVisibleTimeoutMs);\n if (isVisible) {\n return candidate;\n }\n }\n }\n\n return null;\n};\n\nconst readPromptCaptchaState = async (frame, options) => frame.evaluate((selectors) => {\n const toRect = (element) => {\n if (!element) {\n return null;\n }\n\n const rect = element.getBoundingClientRect();\n return {\n x: Number(rect.x.toFixed(2)),\n y: Number(rect.y.toFixed(2)),\n width: Number(rect.width.toFixed(2)),\n height: Number(rect.height.toFixed(2)),\n };\n };\n\n const badgeNode = document.querySelector(selectors.badgeCountSelector);\n const submitButton = document.querySelector(selectors.submitButtonSelector);\n const dragArea = document.querySelector(selectors.dragAreaSelector);\n\n const badgeCount = badgeNode\n ? Number.parseInt(String(badgeNode.textContent || '').trim(), 10)\n : 0;\n\n return {\n badgeCount: Number.isFinite(badgeCount) ? badgeCount : 0,\n selectedCount: document.querySelectorAll(selectors.selectedSourceSelector).length,\n activeCount: document.querySelectorAll(selectors.activeSourceSelector).length,\n submitDisabled: submitButton ? submitButton.classList.contains('disable') : null,\n dragAreaActive: dragArea ? dragArea.classList.contains('active') : false,\n dragAreaRect: toRect(dragArea),\n };\n}, {\n badgeCountSelector: options.promptBadgeCountSelector,\n submitButtonSelector: options.promptSubmitButtonSelector,\n selectedSourceSelector: options.promptSelectedSourceSelector,\n activeSourceSelector: options.promptActiveSourceSelector,\n dragAreaSelector: options.dropTargetContainerSelector,\n}).catch(() => ({\n badgeCount: 0,\n selectedCount: 0,\n activeCount: 0,\n submitDisabled: null,\n dragAreaActive: false,\n dragAreaRect: null,\n}));\n\nconst normalizeCaptchaImageIndexes = (serialNumbers, imageCount) => {\n if (!Array.isArray(serialNumbers) || imageCount <= 0) {\n return [];\n }\n\n const areAllOneBased = serialNumbers.every((value) => value >= 1 && value <= imageCount);\n if (areAllOneBased) {\n return serialNumbers.map((value) => value - 1);\n }\n\n const areAllZeroBased = serialNumbers.every((value) => value >= 0 && value < imageCount);\n if (areAllZeroBased) {\n return [...serialNumbers];\n }\n\n return serialNumbers\n .map((value) => {\n if (value >= 1 && value <= imageCount) {\n return value - 1;\n }\n\n if (value >= 0 && value < imageCount) {\n return value;\n }\n\n return null;\n })\n .filter((value) => Number.isInteger(value));\n};\n\nconst resolveCaptchaSourceImagesInVisualOrder = async (frame, options) => {\n const sourceImages = frame.locator(options.sourceImageSelector);\n const imageCount = await sourceImages.count().catch(() => 0);\n const sources = [];\n\n for (let domIndex = 0; domIndex < imageCount; domIndex += 1) {\n const locator = sourceImages.nth(domIndex);\n const box = await locator.boundingBox().catch(() => null);\n\n if (!box || box.width <= 0 || box.height <= 0) {\n continue;\n }\n\n sources.push({\n domIndex,\n locator,\n box,\n });\n }\n\n sources.sort((left, right) => {\n const deltaY = left.box.y - right.box.y;\n if (Math.abs(deltaY) > options.sourceImageRowTolerancePx) {\n return deltaY;\n }\n\n return left.box.x - right.box.x;\n });\n\n return sources;\n};\n\nconst refreshCaptcha = async (page, frame, options) => {\n const clicked = await clickCaptchaAction(frame, options.refreshTexts, {\n ...options,\n page,\n logger,\n forceMouse: true,\n }).catch(() => false);\n\n if (!clicked) {\n logger.warn('Refresh button not found.');\n return false;\n }\n\n await page.waitForTimeout(options.refreshWaitMs);\n return true;\n};\n\nconst waitForCaptchaChallengeReady = async (page, frame, options) => {\n const deadline = Date.now() + options.challengeReadyTimeoutMs;\n let refreshDeadline = Date.now() + options.challengeReadyRefreshTimeoutMs;\n let hasSeenLoading = false;\n let hasSeenGuideMask = false;\n let hasLoggedGuideMask = false;\n\n while (Date.now() < deadline) {\n const isLoadingVisible = await isAnyCaptchaTextVisible(\n frame,\n options.loadingTexts,\n options.loadingIndicatorVisibleTimeoutMs,\n );\n const hasErrorTextVisible = await isAnyCaptchaTextVisible(\n frame,\n options.errorTexts,\n options.loadingIndicatorVisibleTimeoutMs,\n );\n\n hasSeenLoading = hasSeenLoading || isLoadingVisible;\n\n const sourceImages = frame.locator(options.sourceImageSelector);\n const imageCount = await sourceImages.count().catch(() => 0);\n const hasVisibleSourceImage = imageCount > 0\n ? await sourceImages.first().isVisible({ timeout: options.loadingIndicatorVisibleTimeoutMs }).catch(() => false)\n : false;\n const hasVisibleDropTarget = await frame.locator(options.dropTargetContainerSelector)\n .first()\n .isVisible({ timeout: options.loadingIndicatorVisibleTimeoutMs })\n .catch(() => false);\n const hasGuideMaskVisible = options.guideMaskSelector\n ? await frame.locator(options.guideMaskSelector)\n .first()\n .isVisible({ timeout: options.loadingIndicatorVisibleTimeoutMs })\n .catch(() => false)\n : false;\n\n hasSeenGuideMask = hasSeenGuideMask || hasGuideMaskVisible;\n\n if (hasGuideMaskVisible && !hasLoggedGuideMask) {\n logger.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');\n hasLoggedGuideMask = true;\n }\n\n if (!isLoadingVisible && hasVisibleSourceImage && hasVisibleDropTarget && !hasGuideMaskVisible) {\n logger.info(\n hasSeenGuideMask\n ? '\u9A8C\u8BC1\u7801\u56FE\u7247\u548C\u62D6\u62FD\u533A\u57DF\u5DF2\u5C31\u7EEA\uFF0C\u5F15\u5BFC\u5C42\u5DF2\u6D88\u5931\u3002'\n : (hasSeenLoading ? '\u9A8C\u8BC1\u7801\u56FE\u7247\u5DF2\u52A0\u8F7D\u5B8C\u6210\u3002' : '\u9A8C\u8BC1\u7801\u56FE\u7247\u5DF2\u5C31\u7EEA\u3002'),\n );\n return;\n }\n\n if (hasErrorTextVisible) {\n logger.warn('\u9A8C\u8BC1\u7801\u9762\u677F\u51FA\u73B0\u7F51\u7EDC\u5F02\u5E38\u6587\u6848\uFF0C\u5C1D\u8BD5\u7ACB\u5373\u5237\u65B0\u9898\u76EE\u3002');\n await refreshCaptcha(page, frame, options);\n refreshDeadline = Date.now() + options.challengeReadyRefreshTimeoutMs;\n hasSeenLoading = false;\n continue;\n }\n\n if ((!hasVisibleSourceImage || !hasVisibleDropTarget) && Date.now() >= refreshDeadline) {\n logger.warn(`\u9A8C\u8BC1\u7801\u9898\u76EE\u8D85\u8FC7 ${options.challengeReadyRefreshTimeoutMs}ms \u4ECD\u672A\u51C6\u5907\u597D\uFF0C\u5C1D\u8BD5\u5237\u65B0\u9898\u76EE\u3002`);\n await refreshCaptcha(page, frame, options);\n refreshDeadline = Date.now() + options.challengeReadyRefreshTimeoutMs;\n hasSeenLoading = false;\n continue;\n }\n\n await page.waitForTimeout(options.challengeReadyPollMs);\n }\n\n throw new Error('Captcha challenge is still loading and did not become ready in time.');\n};\n\nconst dragPromptCaptchaImage = async (\n page,\n frame,\n iframeLocator,\n sourceLocator,\n dropTarget,\n options,\n {\n attempt,\n visualIndex,\n },\n) => {\n const baselineState = await readPromptCaptchaState(frame, options);\n const dragAttempts = [];\n\n for (const plan of PROMPT_CAPTCHA_DRAG_PLANS) {\n const sourceBox = await sourceLocator.boundingBox().catch(() => null);\n const targetBox = await dropTarget.boundingBox().catch(() => null);\n\n if (!sourceBox || !targetBox) {\n throw new Error('Unable to resolve prompt captcha drag coordinates.');\n }\n\n const targetOffsetX = (plan.endXRatio - 0.5) * targetBox.width;\n const targetOffsetY = (plan.endYRatio - 0.5) * targetBox.height;\n\n await dragCaptchaAction(page, sourceLocator, dropTarget, {\n forceMouse: true,\n targetOffsetX,\n targetOffsetY,\n steps: options.promptDragMoveSteps,\n holdDelayMs: options.promptDragHoldDelayMs,\n stepDelayMs: options.promptDragStepDelayMs,\n beforeReleaseDelayMs: options.promptDragBeforeReleaseDelayMs,\n afterReleaseDelayMs: options.promptDragAfterReleaseDelayMs,\n finalMoveRepeats: options.promptDragFinalMoveRepeats,\n });\n\n const afterState = await readPromptCaptchaState(frame, options);\n const accepted = (\n afterState.badgeCount > baselineState.badgeCount\n || afterState.selectedCount > baselineState.selectedCount\n );\n\n const attemptInfo = {\n planName: plan.name,\n sourceRect: rectOf(sourceBox),\n targetRect: rectOf(targetBox),\n targetOffsetX: Number(targetOffsetX.toFixed(2)),\n targetOffsetY: Number(targetOffsetY.toFixed(2)),\n beforeState: baselineState,\n afterState,\n accepted,\n };\n\n dragAttempts.push(attemptInfo);\n logger.info(\n `\u9A8C\u8BC1\u7801\u62D6\u62FD\u7B2C ${visualIndex + 1} \u5F20\uFF0C\u65B9\u6848 ${plan.name}\uFF0C` +\n `badge ${baselineState.badgeCount} -> ${afterState.badgeCount}\uFF0C` +\n `selected ${baselineState.selectedCount} -> ${afterState.selectedCount}`,\n );\n\n if (accepted) {\n return {\n accepted: true,\n dragAttempts,\n };\n }\n\n if (options.promptDragRetryDelayMs > 0) {\n await page.waitForTimeout(options.promptDragRetryDelayMs);\n }\n }\n\n await maybeCollectCaptchaDebugInfo(page, frame, iframeLocator, attempt, `drag-${visualIndex + 1}-failed`, options, {\n visualIndex,\n dragAttempts,\n finalState: await readPromptCaptchaState(frame, options),\n }).catch((error) => {\n logger.warn(`\u9A8C\u8BC1\u7801\u62D6\u62FD\u5931\u8D25\u8C03\u8BD5\u6293\u53D6\u5931\u8D25\uFF1A${error?.message || error}`);\n });\n\n return {\n accepted: false,\n dragAttempts,\n };\n};\n\n/**\n * @param {import('playwright').Page} page\n * @param {Object} [options]\n * @param {{ callCaptchaRecognitionApi?: (requestParams: Record<string, any>) => Promise<any> }} [dependencies]\n * @returns {Promise<boolean>}\n */\nexport async function solveCaptcha(page, options = {}, dependencies = {}) {\n const { callCaptchaRecognitionApi } = dependencies;\n\n if (typeof callCaptchaRecognitionApi !== 'function') {\n throw new Error('[Captcha] \u7F3A\u5C11\u901A\u7528\u8BC6\u522B\u8BF7\u6C42\u51FD\u6570 callCaptchaRecognitionApi\u3002');\n }\n\n const config = {\n ...DEFAULT_BYTEDANCE_CAPTCHA_OPTIONS,\n ...options,\n };\n\n if (!config.token) {\n logger.warn('\u7F3A\u5C11\u9A8C\u8BC1\u7801 token\uFF0C\u8DF3\u8FC7\u81EA\u52A8\u8BC6\u522B\u3002');\n return false;\n }\n\n logger.info('\u5F53\u524D\u4F7F\u7528\u672Ctool\u2014\u2014\u6D4B\u8BD5\u7248\u672C');\n\n for (let attempt = 1; attempt <= config.maxRetries; attempt += 1) {\n logger.info(`\u5F00\u59CB\u7B2C ${attempt}/${config.maxRetries} \u6B21 verifycenter \u9A8C\u8BC1\u7801\u8BC6\u522B\u3002`);\n\n try {\n const captchaContext = await getVerifycenterCaptchaContext(page, config);\n if (!captchaContext) {\n logger.info('Captcha container is not visible anymore.');\n return true;\n }\n\n const { iframeLocator, frame } = captchaContext;\n await waitForCaptchaChallengeReady(page, frame, config);\n await maybeCollectCaptchaDebugInfo(\n page,\n frame,\n iframeLocator,\n attempt,\n 'ready',\n config,\n ).catch((error) => {\n logger.warn(`\u9A8C\u8BC1\u7801\u8C03\u8BD5\u6293\u53D6\u5931\u8D25\uFF1A${error?.message || error}`);\n });\n await page.waitForTimeout(config.recognitionDelayMs);\n\n const screenshotBuffer = await iframeLocator.screenshot();\n const apiResponse = await callCaptchaRecognitionApi({\n apiUrl: config.apiUrl,\n type: config.apiType,\n image: screenshotBuffer.toString('base64'),\n token: config.token,\n });\n const serialNumbers = extractCaptchaSerialNumbers(apiResponse);\n\n if (apiResponse?.code !== config.recognitionSuccessCode || serialNumbers.length === 0) {\n logger.warn(\n `\u9A8C\u8BC1\u7801\u8BC6\u522B\u5931\u8D25\u3002code=${apiResponse?.code}, msg=${apiResponse?.msg || 'unknown'}`,\n );\n await refreshCaptcha(page, frame, config);\n continue;\n }\n\n logger.info(`\u9A8C\u8BC1\u7801\u8BC6\u522B\u6210\u529F\uFF0C\u5E8F\u53F7\uFF1A${serialNumbers.join(', ')}`);\n\n const dropTarget = await findCaptchaDropTarget(frame, config);\n if (!dropTarget) {\n logger.warn('\u672A\u627E\u5230\u9A8C\u8BC1\u7801\u62D6\u62FD\u76EE\u6807\u533A\u57DF\u3002');\n await refreshCaptcha(page, frame, config);\n continue;\n }\n\n const orderedSourceImages = await resolveCaptchaSourceImagesInVisualOrder(frame, config);\n const normalizedIndexes = normalizeCaptchaImageIndexes(serialNumbers, orderedSourceImages.length);\n\n if (normalizedIndexes.length !== serialNumbers.length) {\n throw new Error(\n `Captcha image indexes could not be normalized. raw=${serialNumbers.join(', ')}, count=${orderedSourceImages.length}`,\n );\n }\n\n logger.info(`\u9A8C\u8BC1\u7801\u89C6\u89C9\u4F4D\u5E8F\u6620\u5C04\uFF1A${normalizedIndexes.map((index) => index + 1).join(', ')}`);\n\n for (const imageIndex of normalizedIndexes) {\n if (imageIndex < 0 || imageIndex >= orderedSourceImages.length) {\n throw new Error(\n `Captcha image index ${imageIndex} is out of range. count=${orderedSourceImages.length}`,\n );\n }\n\n const sourceImage = orderedSourceImages[imageIndex].locator;\n await sourceImage.waitFor({\n state: 'visible',\n timeout: config.sourceImageVisibleTimeoutMs,\n });\n\n const dragResult = await dragPromptCaptchaImage(\n page,\n frame,\n iframeLocator,\n sourceImage,\n dropTarget,\n config,\n {\n attempt,\n visualIndex: imageIndex,\n },\n );\n\n if (!dragResult.accepted) {\n throw new Error(`Captcha prompt drag was not accepted for visual index ${imageIndex + 1}.`);\n }\n\n if (config.dragBetweenWaitMs > 0) {\n await page.waitForTimeout(config.dragBetweenWaitMs);\n }\n }\n\n const beforeSubmitState = await readPromptCaptchaState(frame, config);\n logger.info(\n `\u63D0\u4EA4\u524D\u9A8C\u8BC1\u7801\u72B6\u6001\uFF1Abadge=${beforeSubmitState.badgeCount}, ` +\n `selected=${beforeSubmitState.selectedCount}, ` +\n `submitDisabled=${beforeSubmitState.submitDisabled}`,\n );\n\n const submitted = await clickCaptchaAction(frame, config.submitTexts, {\n ...config,\n page,\n logger,\n forceMouse: true,\n actionVisibleTimeoutMs: config.submitReadyTimeoutMs,\n }).catch(() => false);\n\n if (!submitted) {\n logger.warn('\u672A\u627E\u5230\u63D0\u4EA4\u6309\u94AE\uFF0C\u53EF\u80FD\u4F1A\u81EA\u52A8\u63D0\u4EA4\u3002');\n }\n\n await page.waitForTimeout(config.submitWaitMs);\n\n const afterSubmitState = await readPromptCaptchaState(frame, config);\n logger.info(\n `\u63D0\u4EA4\u540E\u9A8C\u8BC1\u7801\u72B6\u6001\uFF1Abadge=${afterSubmitState.badgeCount}, ` +\n `selected=${afterSubmitState.selectedCount}, ` +\n `submitDisabled=${afterSubmitState.submitDisabled}`,\n );\n\n const stillVisible = await iframeLocator\n .isVisible({ timeout: config.containerVisibleTimeoutMs })\n .catch(() => false);\n\n if (!stillVisible) {\n logger.info('\u9A8C\u8BC1\u7801\u8BC6\u522B\u5E76\u63D0\u4EA4\u6210\u529F\u3002');\n return true;\n }\n\n await maybeCollectCaptchaDebugInfo(page, frame, iframeLocator, attempt, 'submit-still-visible', config, {\n beforeSubmitState,\n afterSubmitState,\n }).catch((error) => {\n logger.warn(`\u63D0\u4EA4\u540E\u9A8C\u8BC1\u7801\u8C03\u8BD5\u6293\u53D6\u5931\u8D25\uFF1A${error?.message || error}`);\n });\n\n logger.warn('\u63D0\u4EA4\u540E\u9A8C\u8BC1\u7801 iframe \u4ECD\u7136\u53EF\u89C1\uFF0C\u51C6\u5907\u5237\u65B0\u540E\u91CD\u8BD5\u3002');\n await page.waitForTimeout(2000);\n await refreshCaptcha(page, frame, config);\n } catch (error) {\n logger.error(`\u7B2C ${attempt}/${config.maxRetries} \u6B21\u9A8C\u8BC1\u7801\u8BC6\u522B\u5931\u8D25\uFF1A${error?.message || error}`);\n }\n\n if (attempt < config.maxRetries) {\n await page.waitForTimeout(config.retryDelayBaseMs + (attempt * config.retryDelayStepMs));\n }\n }\n\n logger.error(`\u91CD\u8BD5 ${config.maxRetries} \u6B21\u540E\uFF0C\u9A8C\u8BC1\u7801\u4ECD\u672A\u8BC6\u522B\u6210\u529F\u3002`);\n return false;\n}\n\nexport const sloveCaptcha = solveCaptcha;\n", "import { DeviceInput } from '../../device-input.js';\n\nexport const waitForVisible = async (locator, timeout) => {\n try {\n await locator.waitFor({\n state: 'visible',\n timeout,\n });\n return true;\n } catch {\n return false;\n }\n};\n\nexport const isAnyCaptchaTextVisible = async (frame, texts, timeout) => {\n for (const text of texts || []) {\n if (!text) {\n continue;\n }\n\n const textLocator = frame.getByText(text, { exact: false });\n const locatorText = frame.locator(`text=${text}`);\n const candidateGroups = [textLocator, locatorText];\n\n for (const candidateGroup of candidateGroups) {\n const candidateCount = await candidateGroup.count().catch(() => 0);\n\n for (let index = 0; index < candidateCount; index += 1) {\n const candidate = candidateGroup.nth(index);\n const isVisible = await candidate.isVisible({ timeout }).catch(() => false);\n if (isVisible) {\n return true;\n }\n }\n }\n }\n\n return false;\n};\n\nconst collectVisibleCandidateIndexes = async (candidateGroup, count, timeout) => {\n const visibleIndexes = [];\n\n for (let index = 0; index < count; index += 1) {\n const candidate = candidateGroup.nth(index);\n const isVisible = await candidate.isVisible({ timeout }).catch(() => false);\n if (isVisible) {\n visibleIndexes.push(index);\n }\n }\n\n return visibleIndexes;\n};\n\nexport const clickCaptchaAction = async (frame, texts, options) => {\n for (const text of texts || []) {\n const textLocator = frame.getByText(text, { exact: false });\n const locatorText = frame.locator(`text=${text}`);\n const [getByTextCount, locatorTextCount] = await Promise.all([\n textLocator.count().catch(() => 0),\n locatorText.count().catch(() => 0),\n ]);\n const [getByTextVisibleIndexes, locatorTextVisibleIndexes] = await Promise.all([\n collectVisibleCandidateIndexes(textLocator, getByTextCount, options.actionVisibleTimeoutMs),\n collectVisibleCandidateIndexes(locatorText, locatorTextCount, options.actionVisibleTimeoutMs),\n ]);\n\n options.logger?.info(\n `[CaptchaAction] \u6587\u672C \"${text}\" \u547D\u4E2D\u6570\u91CF\uFF1A` +\n `getByText=${getByTextCount} (visible=${getByTextVisibleIndexes.length}), ` +\n `locator=${locatorTextCount} (visible=${locatorTextVisibleIndexes.length})`,\n );\n\n const candidateGroups = [\n { label: 'getByText', locator: textLocator, count: getByTextCount },\n { label: 'locator', locator: locatorText, count: locatorTextCount },\n ];\n\n for (const candidateGroup of candidateGroups) {\n for (let index = 0; index < candidateGroup.count; index += 1) {\n const candidate = candidateGroup.locator.nth(index);\n const isVisible = await waitForVisible(candidate, options.actionVisibleTimeoutMs);\n\n if (!isVisible) {\n continue;\n }\n\n options.logger?.info(\n `[CaptchaAction] \u6587\u672C \"${text}\" \u9009\u62E9 ${candidateGroup.label}[${index}] \u4F5C\u4E3A\u7B2C\u4E00\u4E2A\u53EF\u89C1\u8282\u70B9\u6267\u884C\u70B9\u51FB\u3002`,\n );\n await DeviceInput.click(options.page, candidate, options);\n return true;\n }\n }\n }\n\n return false;\n};\n\nexport const dragCaptchaAction = async (page, sourceLocator, targetLocator, options = {}) => {\n await DeviceInput.drag(page, sourceLocator, targetLocator, options);\n};\n", "import { createHash } from 'node:crypto';\nimport { v4 as uuidv4 } from 'uuid';\nimport { createInternalLogger } from './internals/logger.js';\n\nconst logger = createInternalLogger('Mutation');\n\nconst MUTATION_MONITOR_MODE = Object.freeze({\n Added: 'added',\n Changed: 'changed',\n All: 'all',\n});\n\n/**\n * \u751F\u6210\u552F\u4E00\u7684 key \u540D\u79F0\uFF0C\u907F\u514D\u51B2\u7A81\n * @returns {string}\n */\nfunction generateKey(prefix) {\n return `__${prefix}_${uuidv4().replace(/-/g, '_')}`;\n}\n\nexport const Mutation = {\n Mode: MUTATION_MONITOR_MODE,\n /**\n * \u7B49\u5F85 DOM \u5143\u7D20\u7A33\u5B9A\uFF08\u65E0\u53D8\u5316\uFF09\n * \u4F7F\u7528 MutationObserver \u76D1\u63A7\u6307\u5B9A\u5143\u7D20\uFF0C\u5F53\u5143\u7D20\u6301\u7EED\u4E00\u6BB5\u65F6\u95F4\u65E0\u53D8\u5316\u65F6 resolve\n * \n * @param {import('playwright').Page} page - Playwright page \u5BF9\u8C61\n * @param {string | string[]} selectors - \u8981\u76D1\u63A7\u7684 CSS \u9009\u62E9\u5668\uFF0C\u5355\u4E2A\u6216\u591A\u4E2A\n * @param {Object} [options] - \u914D\u7F6E\u9009\u9879\n * @param {number} [options.initialTimeout] - \u7B49\u5F85\u5143\u7D20\u51FA\u73B0\u7684\u8D85\u65F6 (\u6BEB\u79D2, \u9ED8\u8BA4: 30000)\n * @param {number} [options.stableTime] - \u65E0\u53D8\u5316\u6301\u7EED\u65F6\u95F4\u540E resolve (\u6BEB\u79D2, \u9ED8\u8BA4: 5000)\n * @param {number} [options.timeout] - \u6574\u4F53\u8D85\u65F6\u65F6\u95F4 (\u6BEB\u79D2, \u9ED8\u8BA4: 120000)\n * @param {Function} [options.onMutation] - \u53D8\u5316\u65F6\u7684\u56DE\u8C03\u94A9\u5B50\n * \u7B7E\u540D: ({ mutationCount, html, text, mutationNodes }) => any\n * \u8FD4\u56DE null/undefined: \u6B63\u5E38\u91CD\u7F6E\u7A33\u5B9A\u8BA1\u65F6\n * \u8FD4\u56DE\u5176\u4ED6\u503C: \u6682\u505C\u7A33\u5B9A\u8BA1\u65F6\uFF08timeout \u4ECD\u7136\u751F\u6548\uFF09\n * @returns {Promise<{ mutationCount: number, stableTime: number, wasPaused: boolean }>}\n */\n async waitForStable(page, selectors, options = {}) {\n const selectorList = Array.isArray(selectors) ? selectors : [selectors];\n const initialTimeout = options.initialTimeout ?? 30 * 1000;\n const stableTime = options.stableTime ?? 5 * 1000;\n const timeout = options.timeout ?? 120 * 1000;\n const onMutation = options.onMutation;\n\n logger.start('waitForStable', `\u76D1\u63A7 ${selectorList.length} \u4E2A\u9009\u62E9\u5668, \u7A33\u5B9A\u65F6\u95F4=${stableTime}ms`);\n\n if (initialTimeout > 0) {\n const selectorQuery = selectorList.join(',');\n try {\n await page.waitForSelector(selectorQuery, { timeout: initialTimeout });\n logger.info(`waitForStable \u5DF2\u68C0\u6D4B\u5230\u5143\u7D20: ${selectorQuery}`);\n } catch (e) {\n logger.warning(`waitForStable \u521D\u59CB\u7B49\u5F85\u8D85\u65F6 (${initialTimeout}ms): ${selectorQuery}`);\n throw e;\n }\n }\n\n // \u751F\u6210\u552F\u4E00\u7684\u56DE\u8C03\u540D\n const callbackName = generateKey('pk_mut_cb');\n\n // \u5982\u679C\u6709 onMutation \u56DE\u8C03\uFF0C\u66B4\u9732\u51FD\u6570\u5E76\u8FD4\u56DE\u7ED3\u679C\n if (onMutation) {\n try {\n await page.exposeFunction(callbackName, async (context) => {\n try {\n const result = await onMutation(context);\n const paused = !(result === null || result === undefined);\n // \u8FD4\u56DE null/undefined \u8868\u793A\u6B63\u5E38\u8BA1\u65F6\uFF0C\u5176\u4ED6\u503C\u8868\u793A\u6682\u505C\n return paused ? '__PAUSE__' : '__CONTINUE__';\n } catch (e) {\n // \u56DE\u8C03\u51FA\u9519\u65F6\u9ED8\u8BA4\u7EE7\u7EED\u8BA1\u65F6\n return '__CONTINUE__';\n }\n });\n logger.info('waitForStable \u5DF2\u542F\u7528 onMutation \u56DE\u8C03');\n } catch (e) {\n // \u53EF\u80FD\u5DF2\u7ECF\u66B4\u9732\u8FC7\uFF0C\u5FFD\u7565\n }\n }\n\n const result = await page.evaluate(\n async ({ selectorList, stableTime, timeout, callbackName, hasCallback }) => {\n return new Promise((resolve, reject) => {\n let mutationCount = 0;\n let stableTimer = null;\n let timeoutTimer = null;\n let isPaused = false;\n let wasPaused = false;\n const observers = [];\n\n // \u6E05\u7406\u51FD\u6570\n const cleanup = () => {\n observers.forEach(obs => obs.disconnect());\n if (stableTimer) clearTimeout(stableTimer);\n if (timeoutTimer) clearTimeout(timeoutTimer);\n };\n\n // \u91CD\u7F6E\u7A33\u5B9A\u8BA1\u65F6\u5668\n const resetStableTimer = () => {\n if (stableTimer) clearTimeout(stableTimer);\n if (isPaused) return;\n stableTimer = setTimeout(() => {\n cleanup();\n resolve({ mutationCount, stableTime, wasPaused });\n }, stableTime);\n };\n\n const setPaused = (nextPaused) => {\n if (isPaused === nextPaused) return;\n isPaused = nextPaused;\n if (isPaused) {\n if (stableTimer) clearTimeout(stableTimer);\n stableTimer = null;\n wasPaused = true;\n return;\n }\n resetStableTimer();\n };\n\n // \u6574\u4F53\u8D85\u65F6\uFF08\u59CB\u7EC8\u751F\u6548\uFF0C\u4E0D\u53D7\u6682\u505C\u5F71\u54CD\uFF09\n timeoutTimer = setTimeout(() => {\n cleanup();\n reject(new Error(`waitForStable \u8D85\u65F6 (${timeout}ms), \u5DF2\u68C0\u6D4B\u5230 ${mutationCount} \u6B21\u53D8\u5316, isPaused=${isPaused}`));\n }, timeout);\n\n // \u4E3A\u6BCF\u4E2A\u9009\u62E9\u5668\u521B\u5EFA MutationObserver\n selectorList.forEach(selector => {\n const elements = document.querySelectorAll(selector);\n elements.forEach(element => {\n const observer = new MutationObserver(async (mutations) => {\n mutationCount += mutations.length;\n\n if (hasCallback && window[callbackName]) {\n // \u83B7\u53D6\u5143\u7D20\u5185\u5BB9\n const html = element.outerHTML || '';\n const text = element.innerText || element.textContent || '';\n const mutationNodes = [{ html, text, mutationType: 'stable' }];\n\n try {\n const signal = await window[callbackName]({\n mutationCount,\n html,\n text,\n mutationNodes\n });\n\n const shouldPause = signal === '__PAUSE__';\n setPaused(shouldPause);\n if (!shouldPause) {\n resetStableTimer();\n }\n } catch (e) {\n // \u56DE\u8C03\u51FA\u9519\u65F6\u7EE7\u7EED\u8BA1\u65F6\n setPaused(false);\n resetStableTimer();\n }\n } else {\n // \u6CA1\u6709\u56DE\u8C03\uFF0C\u4FDD\u6301\u539F\u6709\u884C\u4E3A\n resetStableTimer();\n }\n });\n\n observer.observe(element, {\n childList: true,\n subtree: true,\n characterData: true,\n attributes: true\n });\n\n observers.push(observer);\n });\n });\n\n // \u5982\u679C\u6CA1\u6709\u627E\u5230\u4EFB\u4F55\u5143\u7D20\uFF0C\u76F4\u63A5\u8FD4\u56DE\n if (observers.length === 0) {\n cleanup();\n resolve({ mutationCount: 0, stableTime: 0, wasPaused: false });\n return;\n }\n\n // \u521D\u59CB\u68C0\u67E5\uFF1A\u6302\u8F7D\u540E\u7ACB\u5373\u6267\u884C\u4E00\u6B21\u56DE\u8C03\uFF0C\u5224\u65AD\u662F\u5426\u9700\u8981\u6682\u505C\n const runInitialCheck = async () => {\n if (hasCallback && window[callbackName]) {\n // \u83B7\u53D6\u7B2C\u4E00\u4E2A\u76D1\u63A7\u5143\u7D20\u7684\u5185\u5BB9\n const firstSelector = selectorList[0];\n const firstElement = document.querySelector(firstSelector);\n if (firstElement) {\n const html = firstElement.outerHTML || '';\n const text = firstElement.innerText || firstElement.textContent || '';\n const mutationNodes = [{ html, text, mutationType: 'stable' }];\n\n try {\n const signal = await window[callbackName]({\n mutationCount: 0,\n html,\n text,\n mutationNodes\n });\n\n if (signal === '__PAUSE__') {\n setPaused(true);\n return; // \u6682\u505C\u65F6\u4E0D\u542F\u52A8\u521D\u59CB\u8BA1\u65F6\n }\n } catch (e) {\n // \u56DE\u8C03\u51FA\u9519\u65F6\u7EE7\u7EED\n }\n }\n }\n // \u542F\u52A8\u521D\u59CB\u7A33\u5B9A\u8BA1\u65F6\u5668\n resetStableTimer();\n };\n\n runInitialCheck();\n });\n },\n { selectorList, stableTime, timeout, callbackName, hasCallback: !!onMutation }\n );\n\n if (result.mutationCount === 0 && result.stableTime === 0) {\n logger.warning('waitForStable \u672A\u627E\u5230\u53EF\u76D1\u63A7\u7684\u5143\u7D20');\n }\n logger.success('waitForStable', `DOM \u7A33\u5B9A, \u603B\u5171 ${result.mutationCount} \u6B21\u53D8\u5316${result.wasPaused ? ', \u66FE\u6682\u505C\u8BA1\u65F6' : ''}`);\n return result;\n },\n /**\n * \u7B49\u5F85\u8DE8 root DOM \u5143\u7D20\u7A33\u5B9A\uFF08\u4E3B\u6587\u6863 + iframe \u5185\u5BB9\uFF09\n * \u901A\u8FC7\u8F6E\u8BE2\u5FEB\u7167\u68C0\u6D4B\u53D8\u5316\uFF0C\u9002\u914D iframe / shadow \u573A\u666F\n *\n * @param {import('playwright').Page} page - Playwright page \u5BF9\u8C61\n * @param {string | string[]} selectors - \u8981\u76D1\u63A7\u7684 CSS \u9009\u62E9\u5668\uFF0C\u5355\u4E2A\u6216\u591A\u4E2A\uFF08\u5EFA\u8BAE\u4F20 iframe \u9009\u62E9\u5668\uFF09\n * @param {Object} [options] - \u914D\u7F6E\u9009\u9879\uFF08\u7B7E\u540D\u4E0E waitForStable \u4FDD\u6301\u4E00\u81F4\uFF09\n * @param {number} [options.initialTimeout] - \u7B49\u5F85\u5143\u7D20\u51FA\u73B0\u7684\u8D85\u65F6 (\u6BEB\u79D2, \u9ED8\u8BA4: 60000)\n * @param {number} [options.stableTime] - \u65E0\u53D8\u5316\u6301\u7EED\u65F6\u95F4\u540E resolve (\u6BEB\u79D2, \u9ED8\u8BA4: 10000)\n * @param {number} [options.timeout] - \u6574\u4F53\u8D85\u65F6\u65F6\u95F4 (\u6BEB\u79D2, \u9ED8\u8BA4: 180000)\n * @param {Function} [options.onMutation] - \u53D8\u5316\u65F6\u7684\u56DE\u8C03\u94A9\u5B50\n * @returns {Promise<{ mutationCount: number, stableTime: number, wasPaused: boolean }>}\n */\n async waitForStableAcrossRoots(page, selectors, options = {}) {\n const selectorList = Array.isArray(selectors) ? selectors : [selectors];\n const selectorQuery = selectorList.join(',');\n const initialTimeout = options.initialTimeout ?? 60 * 1000;\n const waitForStableTime = options.stableTime ?? 10 * 1000;\n const overallTimeout = options.timeout ?? 180 * 1000;\n const onMutation = options.onMutation;\n const pollInterval = 500;\n\n const sleep = (ms) => new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n\n const truncate = (value, max = 800) => {\n const text = String(value || '');\n if (text.length <= max) return text;\n return `${text.slice(0, max)}...`;\n };\n\n const normalizeText = (value) => String(value || '').replace(/\\s+/g, ' ').trim();\n const normalizeHtml = (value) => String(value || '').trim();\n const hashSnapshot = (value) => createHash('sha256').update(String(value || '')).digest('hex');\n\n const buildState = async () => {\n const items = [];\n const describeElement = async (elementHandle) => {\n return await elementHandle.evaluate((node) => {\n const tagName = String(node?.tagName || '').toUpperCase();\n return {\n tagName,\n id: String(node?.id || '').trim(),\n name: String(node?.getAttribute?.('name') || '').trim(),\n };\n });\n };\n\n const readElementSnapshot = async (elementHandle) => {\n return await elementHandle.evaluate((node) => {\n const text = String(node?.innerText || node?.textContent || '');\n const html = String(node?.innerHTML || node?.outerHTML || '');\n return {\n text,\n html,\n };\n });\n };\n\n const readFrameSnapshot = async (frame) => {\n return await frame.evaluate(() => {\n const root = document.documentElement || document.body;\n const text = String(root?.innerText || root?.textContent || '');\n const html = String(root?.innerHTML || '');\n return {\n text,\n html,\n url: window.location.href,\n readyState: document.readyState,\n };\n });\n };\n\n for (const selector of selectorList) {\n let handles = [];\n try {\n handles = await page.locator(selector).elementHandles();\n } catch {\n continue;\n }\n\n for (let index = 0; index < handles.length; index += 1) {\n const handle = handles[index];\n try {\n const descriptor = await describeElement(handle);\n const tagName = descriptor?.tagName || '';\n const isFrameElement = tagName === 'IFRAME' || tagName === 'FRAME';\n const nodeName = descriptor?.id || descriptor?.name || 'no-id';\n let source = 'main';\n let path = `${selector}[${index}]`;\n let text = '';\n let html = '';\n let frameUrl = '';\n let readyState = '';\n\n if (isFrameElement) {\n source = 'iframe';\n path = `${selector}[${index}]::iframe(${nodeName})`;\n\n const frame = await handle.contentFrame();\n if (frame) {\n try {\n const frameSnapshot = await readFrameSnapshot(frame);\n text = normalizeText(frameSnapshot?.text || '');\n html = normalizeHtml(frameSnapshot?.html || '');\n frameUrl = String(frameSnapshot?.url || '').trim();\n readyState = String(frameSnapshot?.readyState || '').trim();\n } catch (error) {\n source = 'iframe-unreadable';\n readyState = error?.name || 'unreadable';\n }\n } else {\n source = 'iframe-detached';\n }\n } else {\n try {\n const elementSnapshot = await readElementSnapshot(handle);\n text = normalizeText(elementSnapshot?.text || '');\n html = normalizeHtml(elementSnapshot?.html || '');\n } catch (error) {\n source = 'main-unreadable';\n readyState = error?.name || 'unreadable';\n }\n }\n\n const snapshot = text;\n items.push({\n selector,\n source,\n path,\n text,\n html,\n frameUrl,\n readyState,\n snapshot,\n });\n } finally {\n await handle.dispose().catch(() => { });\n }\n }\n }\n\n const serializedSnapshot = items\n .map((item) => JSON.stringify({\n path: item.path,\n source: item.source,\n frameUrl: item.frameUrl,\n readyState: item.readyState,\n snapshot: item.snapshot,\n }))\n .join('||');\n const summaryText = items.map((item) => item.text).join('\\n').trim();\n const summaryHtml = items.map((item) => item.html).join('\\n');\n const hasMatched = items.length > 0;\n const primary = items.length > 0 ? items[items.length - 1] : null;\n\n return {\n hasMatched,\n snapshotKey: hashSnapshot(serializedSnapshot),\n text: summaryText,\n html: summaryHtml,\n snapshotLength: serializedSnapshot.length,\n itemCount: items.length,\n primaryPath: primary?.path || '',\n mutationNodes: items.map((item) => ({\n html: item.html,\n text: item.text,\n mutationType: item.source,\n frameUrl: item.frameUrl,\n readyState: item.readyState,\n })),\n };\n };\n\n const invokeMutationCallback = async (context) => {\n if (!onMutation) return '__CONTINUE__';\n try {\n const result = await onMutation(context);\n return (result === null || result === undefined) ? '__CONTINUE__' : '__PAUSE__';\n } catch {\n return '__CONTINUE__';\n }\n };\n\n logger.start(\n 'waitForStableAcrossRoots',\n `\u76D1\u63A7 ${selectorList.length} \u4E2A\u9009\u62E9\u5668(\u8DE8 root), \u7A33\u5B9A\u65F6\u95F4=${waitForStableTime}ms`\n );\n\n if (initialTimeout > 0) {\n try {\n await page.waitForSelector(selectorQuery, { timeout: initialTimeout });\n logger.info(`waitForStableAcrossRoots \u5DF2\u68C0\u6D4B\u5230\u5143\u7D20: ${selectorQuery}`);\n } catch (e) {\n logger.warning(`waitForStableAcrossRoots \u521D\u59CB\u7B49\u5F85\u8D85\u65F6 (${initialTimeout}ms): ${selectorQuery}`);\n throw e;\n }\n }\n\n let state = await buildState();\n if (!state?.hasMatched) {\n logger.warning('waitForStableAcrossRoots \u672A\u627E\u5230\u53EF\u76D1\u63A7\u7684\u5143\u7D20');\n return { mutationCount: 0, stableTime: 0, wasPaused: false };\n }\n\n let mutationCount = 0;\n let stableSince = 0;\n let isPaused = false;\n let wasPaused = false;\n let lastSnapshotKey = state.snapshotKey;\n\n const applyPauseSignal = (signal) => {\n const nextPaused = signal === '__PAUSE__';\n if (nextPaused) {\n if (!isPaused) wasPaused = true;\n isPaused = true;\n stableSince = 0;\n return;\n }\n\n isPaused = false;\n stableSince = Date.now();\n };\n\n const initialSignal = await invokeMutationCallback({\n mutationCount: 0,\n html: state.html || '',\n text: state.text || '',\n mutationNodes: state.mutationNodes || [],\n });\n applyPauseSignal(initialSignal);\n\n const deadline = Date.now() + overallTimeout;\n let lastState = state;\n\n while (Date.now() < deadline) {\n await sleep(pollInterval);\n lastState = await buildState();\n\n if (!lastState?.hasMatched) {\n continue;\n }\n\n if (lastState.snapshotKey !== lastSnapshotKey) {\n lastSnapshotKey = lastState.snapshotKey;\n mutationCount += 1;\n\n logger.info(\n `waitForStableAcrossRoots \u53D8\u5316#${mutationCount}, len=${lastState.snapshotLength}, path=${lastState.primaryPath || 'unknown'}, preview=\"${truncate(lastState.text, 120)}\"`\n );\n\n const signal = await invokeMutationCallback({\n mutationCount,\n html: lastState.html || '',\n text: lastState.text || '',\n mutationNodes: lastState.mutationNodes || [],\n });\n applyPauseSignal(signal);\n continue;\n }\n\n if (!isPaused && stableSince > 0 && (Date.now() - stableSince) >= waitForStableTime) {\n logger.success('waitForStableAcrossRoots', `DOM \u7A33\u5B9A, \u603B\u5171 ${mutationCount} \u6B21\u53D8\u5316${wasPaused ? ', \u66FE\u6682\u505C\u8BA1\u65F6' : ''}`);\n return {\n mutationCount,\n stableTime: waitForStableTime,\n wasPaused,\n };\n }\n }\n\n throw new Error(`waitForStableAcrossRoots \u8D85\u65F6 (${overallTimeout}ms), \u5DF2\u68C0\u6D4B\u5230 ${mutationCount} \u6B21\u53D8\u5316, isPaused=${isPaused}`);\n },\n\n /**\n * \u521B\u5EFA\u4E00\u4E2A\u6301\u7EED\u76D1\u63A7 DOM \u53D8\u5316\u7684\u76D1\u63A7\u5668\uFF08\u9ED8\u8BA4\u4EC5\u76D1\u542C\u65B0\u589E DOM\uFF09\n *\n * @param {import('playwright').Page} page - Playwright page \u5BF9\u8C61\n * @param {string | string[]} selectors - \u8981\u76D1\u63A7\u7684 CSS \u9009\u62E9\u5668\uFF0C\u652F\u6301 'document.documentElement'\n * @param {Object} [options] - \u914D\u7F6E\u9009\u9879\n * @param {Function} [options.onMutation] - \u53D8\u5316\u65F6\u7684\u56DE\u8C03\n * \u7B7E\u540D: ({ mutationCount, html, text, mutationNodes }) => void\n * \u6240\u6709\u6A21\u5F0F\u90FD\u8FD4\u56DE\u672C\u6B21\u5168\u90E8\u53D8\u5316\u8282\u70B9\u5FEB\u7167 mutationNodes\n * @param {'added' | 'changed' | 'all'} [options.mode='added'] - \u76D1\u63A7\u6A21\u5F0F\n * @returns {Promise<{ stop: () => Promise<{ totalMutations: number }> }>} - \u8FD4\u56DE\u505C\u6B62\u51FD\u6570\n */\n async useMonitor(page, selectors, options = {}) {\n const selectorList = Array.isArray(selectors) ? selectors : [selectors];\n const onMutation = options.onMutation;\n const rawMode = String(options.mode || MUTATION_MONITOR_MODE.Added).toLowerCase();\n const mode = [MUTATION_MONITOR_MODE.Added, MUTATION_MONITOR_MODE.Changed, MUTATION_MONITOR_MODE.All].includes(rawMode)\n ? rawMode\n : MUTATION_MONITOR_MODE.Added;\n\n logger.start('useMonitor', `\u76D1\u63A7 ${selectorList.length} \u4E2A\u9009\u62E9\u5668, mode=${mode}`);\n\n const monitorKey = generateKey('pk_mon');\n const callbackName = generateKey('pk_mon_cb');\n const cleanerName = generateKey('pk_mon_clean');\n\n if (onMutation) {\n try {\n await page.exposeFunction(callbackName, (payload) => {\n try {\n onMutation(payload);\n } catch (e) {\n // \u5FFD\u7565\u56DE\u8C03\u9519\u8BEF\n }\n });\n } catch (e) {\n // \u53EF\u80FD\u5DF2\u7ECF\u66B4\u9732\u8FC7\uFF0C\u5FFD\u7565\n }\n }\n\n await page.evaluate(({ selectorList, monitorKey, callbackName, cleanerName, hasCallback, mode }) => {\n const monitor = {\n observers: [],\n totalMutations: 0,\n running: true,\n };\n\n const resolveTargets = (selector) => {\n const key = String(selector || '').trim();\n if (!key) return [];\n\n if (key === 'document.documentElement' || key === 'documentElement' || key === 'document') {\n return document.documentElement ? [document.documentElement] : [];\n }\n\n if (key === 'document.body') {\n return document.body ? [document.body] : [];\n }\n\n return Array.from(document.querySelectorAll(key));\n };\n\n const serializeNode = (node, mutationType = 'unknown') => {\n if (!node) {\n return { html: '', text: '', mutationType };\n }\n\n if (node.nodeType === Node.ELEMENT_NODE) {\n return {\n html: node.outerHTML || '',\n text: node.innerText || node.textContent || '',\n mutationType,\n };\n }\n\n if (node.nodeType === Node.TEXT_NODE) {\n const text = node.textContent || '';\n return { html: text, text, mutationType };\n }\n\n if (node.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n const nodes = Array.from(node.childNodes || []);\n const html = nodes\n .map(item => item?.nodeType === Node.ELEMENT_NODE ? (item.outerHTML || '') : (item?.textContent || ''))\n .join('\\n');\n const text = node.textContent || '';\n return { html: html || text, text, mutationType };\n }\n\n const text = node.textContent || '';\n return { html: text, text, mutationType };\n };\n\n const collectMutationNodes = (mutations) => {\n const mutationNodes = [];\n\n for (const mutation of mutations) {\n if (mode === 'added') {\n if (mutation.type !== 'childList') continue;\n const added = Array.from(mutation.addedNodes || []);\n for (const node of added) {\n mutationNodes.push(serializeNode(node, 'added'));\n }\n continue;\n }\n\n if (mode === 'changed') {\n if (mutation.type === 'attributes' || mutation.type === 'characterData') {\n mutationNodes.push(serializeNode(mutation.target, mutation.type));\n } else if (mutation.type === 'childList') {\n const added = Array.from(mutation.addedNodes || []);\n const removed = Array.from(mutation.removedNodes || []);\n\n for (const node of added) {\n mutationNodes.push(serializeNode(node, 'added'));\n }\n for (const node of removed) {\n mutationNodes.push(serializeNode(node, 'removed'));\n }\n\n if (added.length === 0 && removed.length === 0) {\n mutationNodes.push(serializeNode(mutation.target, 'childList'));\n }\n }\n continue;\n }\n\n if (mutation.type === 'childList') {\n const added = Array.from(mutation.addedNodes || []);\n const removed = Array.from(mutation.removedNodes || []);\n\n for (const node of added) {\n mutationNodes.push(serializeNode(node, 'added'));\n }\n for (const node of removed) {\n mutationNodes.push(serializeNode(node, 'removed'));\n }\n\n if (added.length === 0 && removed.length === 0) {\n mutationNodes.push(serializeNode(mutation.target, 'childList'));\n }\n } else if (mutation.type === 'attributes' || mutation.type === 'characterData') {\n mutationNodes.push(serializeNode(mutation.target, mutation.type));\n } else {\n mutationNodes.push(serializeNode(mutation.target, mutation.type || 'unknown'));\n }\n }\n\n return mutationNodes;\n };\n\n selectorList.forEach(selector => {\n const elements = resolveTargets(selector);\n elements.forEach(element => {\n const observer = new MutationObserver((mutations) => {\n if (!monitor.running) return;\n\n const mutationNodes = collectMutationNodes(mutations);\n if (mutationNodes.length <= 0) return;\n\n monitor.totalMutations += mutationNodes.length;\n\n if (hasCallback && window[callbackName]) {\n const html = mutationNodes.map(item => item.html || '').join('\\n');\n const text = mutationNodes.map(item => item.text || '').join('\\n');\n\n window[callbackName]({\n mutationCount: monitor.totalMutations,\n html,\n text,\n mutationNodes,\n });\n }\n });\n\n observer.observe(element, {\n childList: true,\n subtree: true,\n characterData: mode !== 'added',\n attributes: mode !== 'added',\n });\n\n monitor.observers.push(observer);\n });\n });\n\n window[monitorKey] = monitor;\n window[cleanerName] = () => {\n monitor.running = false;\n monitor.observers.forEach(obs => obs.disconnect());\n const total = monitor.totalMutations;\n delete window[monitorKey];\n delete window[cleanerName];\n return total;\n };\n }, { selectorList, monitorKey, callbackName, cleanerName, hasCallback: !!onMutation, mode });\n\n logger.success('useMonitor', '\u76D1\u63A7\u5668\u5DF2\u542F\u52A8');\n\n return {\n stop: async () => {\n let totalMutations = 0;\n try {\n totalMutations = await page.evaluate((cleanerName) => {\n if (window[cleanerName]) {\n return window[cleanerName]();\n }\n return 0;\n }, cleanerName);\n } catch (e) {\n // \u9875\u9762\u53EF\u80FD\u5DF2\u5173\u95ED\uFF0C\u5FFD\u7565\n }\n logger.success('useMonitor.stop', `\u76D1\u63A7\u5DF2\u505C\u6B62, \u5171 ${totalMutations} \u6B21\u53D8\u5316`);\n return { totalMutations };\n }\n };\n }\n};\n", "export const Display = {\n parseTokenDisplayName(value) {\n if (!value) {\n return { owner: '', envType: '', note: '' };\n }\n const parts = String(value).split(':');\n const owner = (parts[0] || '').trim();\n const envType = (parts[1] || '').trim();\n const note = parts.length > 2 ? parts.slice(2).join(':').trim() : '';\n return { owner, envType, note };\n },\n\n parseEnvDisplayName(value) {\n if (!value) {\n return { env: '', owner: '', envType: '', note: '' };\n }\n const parts = String(value).split(':');\n const env = (parts[0] || '').trim();\n const owner = (parts[1] || '').trim();\n const envType = (parts[2] || '').trim();\n const note = parts.length > 3 ? parts.slice(3).join(':').trim() : '';\n return { env, owner, envType, note };\n },\n\n buildTokenDisplayName({ owner, envType, note } = {}) {\n const trimmedOwner = owner?.trim() || '';\n const trimmedType = envType?.trim() || '';\n const trimmedNote = note?.trim() || '';\n const parts = [trimmedOwner, trimmedType];\n if (trimmedNote) {\n parts.push(trimmedNote);\n }\n return parts.filter(Boolean).join(':');\n },\n\n shortId(value, max = 8) {\n const clean = String(value || '').trim();\n if (!clean) return '';\n if (clean.length <= max) return clean;\n return clean.slice(0, max);\n },\n\n resolveTokenIdentity(displayName, tokenId) {\n const cleanName = String(displayName || '').trim();\n const cleanId = String(tokenId || '').trim();\n const short = this.shortId(cleanId, 8);\n const hasName = cleanName !== '' && cleanName !== cleanId;\n const primary = hasName ? cleanName : (short || '-');\n const secondary = hasName && short ? short : '';\n return { primary, secondary, fullId: cleanId, shortId: short };\n },\n\n resolveEnvIdentity(displayName, envId) {\n const parts = this.parseEnvDisplayName(displayName);\n const cleanId = String(envId || '').trim();\n const short = this.shortId(cleanId, 8);\n const hasName = parts.env !== '' && parts.env !== cleanId;\n const primary = hasName ? parts.env : (short || '-');\n const secondary = hasName && short ? short : '';\n return { primary, secondary, parts, fullId: cleanId, shortId: short };\n },\n};\n", "import { createBaseLogger, setDefaultLogger } from './internals/logger.js';\n\nexport const stripAnsi = (input) => {\n if (!input) return '';\n return String(input).replace(/\\x1b\\[[0-9;]*m/g, '');\n};\n\n// =============================================================================\n// Log Templates & Definitions\n// =============================================================================\n\nconst STEP_PREFIX = '\u6B65\u9AA4:';\nconst STEP_SEPARATOR = ' | ';\nconst STEP_EMOJIS = [\n { match: '\u4EFB\u52A1', emoji: '\uD83E\uDDED' },\n { match: '\u8FD0\u884C\u6A21\u5F0F', emoji: '\uD83E\uDDE9' },\n { match: '\u6A21\u677F\u8BC6\u522B', emoji: '\uD83E\uDDF1' },\n { match: '\u767B\u5F55', emoji: '\uD83D\uDD10' },\n { match: '\u73AF\u5883', emoji: '\uD83E\uDDEA' },\n { match: '\u8F93\u5165', emoji: '\u2328\uFE0F' },\n { match: '\u53D1\u9001', emoji: '\uD83D\uDCE4' },\n { match: '\u54CD\u5E94\u76D1\u542C', emoji: '\uD83D\uDCE1' },\n { match: '\u7B49\u5F85\u54CD\u5E94', emoji: '\u23F3' },\n { match: '\u6D41\u5F0F', emoji: '\uD83E\uDDF5' },\n { match: '\u5F15\u7528', emoji: '\uD83D\uDCCE' },\n { match: '\u622A\u56FE', emoji: '\uD83D\uDDBC\uFE0F' },\n { match: '\u5206\u4EAB\u94FE\u63A5', emoji: '\uD83D\uDD17' },\n { match: '\u6570\u636E\u63A8\u9001', emoji: '\uD83D\uDCE6' },\n { match: '\u5F39\u7A97', emoji: '\uD83E\uDE9F' },\n];\nconst STATUS_EMOJIS = [\n { match: '\u5F00\u59CB', emoji: '\uD83D\uDE80' },\n { match: '\u5B8C\u6210', emoji: '\u2705' },\n { match: '\u6210\u529F', emoji: '\u2705' },\n { match: '\u5931\u8D25', emoji: '\u274C' },\n { match: '\u8DF3\u8FC7', emoji: '\u23ED\uFE0F' },\n { match: '\u8D85\u65F6', emoji: '\u23F1\uFE0F' },\n { match: '\u91CD\u8BD5', emoji: '\uD83D\uDD01' },\n { match: '\u7ED3\u675F', emoji: '\uD83C\uDFC1' },\n { match: '\u5DF2\u914D\u7F6E', emoji: '\uD83E\uDDF7' },\n { match: '\u5DF2\u68C0\u6D4B', emoji: '\uD83D\uDD0E' },\n];\n\nconst toErrorMessage = (error) => {\n if (!error) return '';\n if (error instanceof Error) return error.message;\n if (typeof error === 'string') return error;\n try {\n return JSON.stringify(error);\n } catch {\n return String(error);\n }\n};\n\nconst decorateLabel = (label, mappings) => {\n if (!label) return '';\n const mapping = mappings.find((item) => label.includes(item.match));\n if (!mapping) return label;\n return `${mapping.emoji} ${label}`;\n};\n\nconst normalizeSnippet = (snippet, maxLen = 120) => {\n if (!snippet) return '';\n const text = String(snippet).replace(/\\s+/g, ' ').trim();\n if (!text) return '';\n const cleaned = text.replace(/\"/g, \"'\");\n if (cleaned.length <= maxLen) return cleaned;\n return `${cleaned.slice(0, maxLen)}...`;\n};\n\nconst LOG_TAG_PREFIX = '[#log:';\nconst LOG_TAG_SUFFIX = ']';\n\nconst buildLogTag = (key) => `${LOG_TAG_PREFIX}${key}${LOG_TAG_SUFFIX}`;\n\nconst escapeRegExp = (value) => String(value).replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\nconst buildStepPattern = (step, status) => {\n if (!step) return null;\n let pattern = `\u6B65\u9AA4: .*${escapeRegExp(step)}`;\n if (status) {\n pattern += `.*${escapeRegExp(status)}`;\n }\n return new RegExp(pattern);\n};\n\nconst buildDefinitionPatterns = (definition) => {\n const patterns = [new RegExp(`\\\\[#log:${escapeRegExp(definition.key)}\\\\]`)];\n const fallback = buildStepPattern(definition.step, definition.status);\n if (fallback) patterns.push(fallback);\n if (Array.isArray(definition.extraPatterns)) {\n patterns.push(...definition.extraPatterns);\n }\n return patterns;\n};\n\nconst ATTENTION_RANK = {\n low: 1,\n medium: 2,\n high: 3,\n critical: 4,\n};\nconst DEFAULT_ATTENTION_RANK = ATTENTION_RANK.high;\n\nconst LOG_DEFINITIONS = [\n {\n key: 'task_start',\n method: 'taskStart',\n label: '\u4EFB\u52A1\u5F00\u59CB',\n group: '\u4EFB\u52A1',\n step: '\u4EFB\u52A1',\n status: '\u5F00\u59CB',\n level: 'start',\n attention: 'low',\n buildDetails: (url) => [url ? `url=${url}` : ''],\n },\n {\n key: 'task_success',\n method: 'taskSuccess',\n label: '\u4EFB\u52A1\u5B8C\u6210',\n group: '\u4EFB\u52A1',\n step: '\u4EFB\u52A1',\n status: '\u5B8C\u6210',\n level: 'success',\n attention: 'high',\n },\n {\n key: 'task_fail',\n method: 'taskFail',\n label: '\u4EFB\u52A1\u5931\u8D25',\n group: '\u4EFB\u52A1',\n step: '\u4EFB\u52A1',\n status: '\u5931\u8D25',\n level: 'error',\n attention: 'critical',\n buildDetails: (url, err) => [\n url ? `url=${url}` : '',\n err ? `err=${toErrorMessage(err)}` : ''\n ],\n },\n {\n key: 'runtime_headless',\n method: 'runtimeHeadless',\n label: '\u8FD0\u884C\u6A21\u5F0F\u5F3A\u5236\u65E0\u5934',\n group: '\u8FD0\u884C\u6A21\u5F0F',\n step: '\u8FD0\u884C\u6A21\u5F0F',\n status: 'Apify \u73AF\u5883\u5F3A\u5236\u65E0\u5934',\n level: 'warning',\n attention: 'medium',\n },\n {\n key: 'login_inject_success',\n method: 'loginInjectSuccess',\n label: '\u767B\u5F55\u6001\u6CE8\u5165\u6210\u529F',\n group: '\u767B\u5F55',\n step: '\u767B\u5F55\u6001\u6CE8\u5165',\n status: '\u6210\u529F',\n level: 'success',\n attention: 'medium',\n buildDetails: (detail) => [detail ? `detail=${detail}` : ''],\n },\n {\n key: 'login_inject_skip',\n method: 'loginInjectSkip',\n label: '\u767B\u5F55\u6001\u6CE8\u5165\u8DF3\u8FC7',\n group: '\u767B\u5F55',\n step: '\u767B\u5F55\u6001\u6CE8\u5165',\n status: '\u8DF3\u8FC7',\n level: 'warning',\n attention: 'medium',\n buildDetails: (reason) => [reason ? `\u539F\u56E0=${reason}` : ''],\n },\n {\n key: 'login_inject_fail',\n method: 'loginInjectFail',\n label: '\u767B\u5F55\u6001\u6CE8\u5165\u5931\u8D25',\n group: '\u767B\u5F55',\n step: '\u767B\u5F55\u6001\u6CE8\u5165',\n status: '\u5931\u8D25',\n level: 'error',\n attention: 'high',\n buildDetails: (err) => [err ? `err=${toErrorMessage(err)}` : ''],\n },\n {\n key: 'login_verify_success',\n method: 'loginVerifySuccess',\n label: '\u767B\u5F55\u9A8C\u8BC1\u6210\u529F',\n group: '\u767B\u5F55',\n step: '\u767B\u5F55\u9A8C\u8BC1',\n status: '\u6210\u529F',\n level: 'success',\n attention: 'high',\n buildDetails: (detail) => [detail ? `detail=${detail}` : ''],\n },\n {\n key: 'login_verify_skip',\n method: 'loginVerifySkip',\n label: '\u767B\u5F55\u9A8C\u8BC1\u8DF3\u8FC7',\n group: '\u767B\u5F55',\n step: '\u767B\u5F55\u9A8C\u8BC1',\n status: '\u8DF3\u8FC7',\n level: 'warning',\n attention: 'medium',\n buildDetails: (reason) => [reason ? `\u539F\u56E0=${reason}` : ''],\n },\n {\n key: 'login_verify_fail',\n method: 'loginVerifyFail',\n label: '\u767B\u5F55\u9A8C\u8BC1\u5931\u8D25',\n group: '\u767B\u5F55',\n step: '\u767B\u5F55\u9A8C\u8BC1',\n status: '\u5931\u8D25',\n level: 'error',\n attention: 'critical',\n buildDetails: (err) => [err ? `err=${toErrorMessage(err)}` : ''],\n },\n {\n key: 'env_check_success',\n method: 'envCheckSuccess',\n label: '\u73AF\u5883\u68C0\u67E5\u6210\u529F',\n group: '\u73AF\u5883',\n step: '\u73AF\u5883\u68C0\u67E5',\n status: '\u6210\u529F',\n level: 'success',\n attention: 'medium',\n buildDetails: (detail) => [detail ? `detail=${detail}` : ''],\n },\n {\n key: 'env_check_fail',\n method: 'envCheckFail',\n label: '\u73AF\u5883\u68C0\u67E5\u5931\u8D25',\n group: '\u73AF\u5883',\n step: '\u73AF\u5883\u68C0\u67E5',\n status: '\u5931\u8D25',\n level: 'error',\n attention: 'high',\n buildDetails: (err) => [err ? `err=${toErrorMessage(err)}` : ''],\n },\n {\n key: 'input_query_start',\n method: 'inputQuery',\n label: '\u8F93\u5165\u67E5\u8BE2\u5F00\u59CB',\n group: '\u8F93\u5165',\n step: '\u8F93\u5165\u67E5\u8BE2',\n status: '\u5F00\u59CB',\n level: 'start',\n attention: 'low',\n buildDetails: (query) => [query ? `query=${query}` : ''],\n },\n {\n key: 'send_action',\n method: 'sendAction',\n label: '\u53D1\u9001\u8BF7\u6C42',\n group: '\u53D1\u9001',\n step: '\u53D1\u9001\u8BF7\u6C42',\n status: '\u70B9\u51FB\u53D1\u9001',\n level: 'info',\n attention: 'low',\n },\n {\n key: 'response_listen_start',\n method: 'responseListenStart',\n label: '\u54CD\u5E94\u76D1\u542C\u5F00\u59CB',\n group: '\u54CD\u5E94\u76D1\u542C',\n step: '\u54CD\u5E94\u76D1\u542C',\n status: '\u5F00\u59CB',\n level: 'start',\n attention: 'low',\n buildDetails: (label, timeoutSec) => [\n label ? `\u76EE\u6807=${label}` : '',\n timeoutSec ? `timeout=${timeoutSec}s` : ''\n ],\n },\n {\n key: 'response_listen_ready',\n method: 'responseListenReady',\n label: '\u54CD\u5E94\u76D1\u542C\u5DF2\u914D\u7F6E',\n group: '\u54CD\u5E94\u76D1\u542C',\n step: '\u54CD\u5E94\u76D1\u542C',\n status: '\u5DF2\u914D\u7F6E',\n level: 'info',\n attention: 'medium',\n buildDetails: (label) => [label ? `\u76EE\u6807=${label}` : ''],\n },\n {\n key: 'response_listen_detected',\n method: 'responseListenDetected',\n label: '\u54CD\u5E94\u76D1\u542C\u5DF2\u68C0\u6D4B',\n group: '\u54CD\u5E94\u76D1\u542C',\n step: '\u54CD\u5E94\u76D1\u542C',\n status: '\u5DF2\u68C0\u6D4B',\n level: 'success',\n attention: 'medium',\n buildDetails: (label) => [label ? `\u76EE\u6807=${label}` : ''],\n },\n {\n key: 'response_listen_timeout',\n method: 'responseListenTimeout',\n label: '\u54CD\u5E94\u76D1\u542C\u8D85\u65F6',\n group: '\u54CD\u5E94\u76D1\u542C',\n step: '\u54CD\u5E94\u76D1\u542C',\n status: '\u8D85\u65F6',\n level: 'error',\n attention: 'high',\n buildDetails: (label, err) => [\n label ? `\u76EE\u6807=${label}` : '',\n err ? `err=${toErrorMessage(err)}` : ''\n ],\n },\n {\n key: 'response_listen_end',\n method: 'responseListenEnd',\n label: '\u54CD\u5E94\u76D1\u542C\u7ED3\u675F',\n group: '\u54CD\u5E94\u76D1\u542C',\n step: '\u54CD\u5E94\u76D1\u542C',\n status: '\u7ED3\u675F',\n level: 'info',\n attention: 'low',\n buildDetails: (label) => [label ? `\u76EE\u6807=${label}` : ''],\n },\n {\n key: 'response_wait_start',\n method: 'responseWaitStart',\n label: '\u7B49\u5F85\u54CD\u5E94\u5F00\u59CB',\n group: '\u7B49\u5F85\u54CD\u5E94',\n step: '\u7B49\u5F85\u54CD\u5E94',\n status: '\u5F00\u59CB',\n level: 'start',\n attention: 'low',\n buildDetails: (label) => [label ? `\u76EE\u6807=${label}` : ''],\n },\n {\n key: 'response_wait_success',\n method: 'responseWaitSuccess',\n label: '\u7B49\u5F85\u54CD\u5E94\u5B8C\u6210',\n group: '\u7B49\u5F85\u54CD\u5E94',\n step: '\u7B49\u5F85\u54CD\u5E94',\n status: '\u5B8C\u6210',\n level: 'success',\n attention: 'medium',\n buildDetails: (label) => [label ? `\u76EE\u6807=${label}` : ''],\n },\n {\n key: 'response_wait_fail',\n method: 'responseWaitFail',\n label: '\u7B49\u5F85\u54CD\u5E94\u5931\u8D25',\n group: '\u7B49\u5F85\u54CD\u5E94',\n step: '\u7B49\u5F85\u54CD\u5E94',\n status: '\u5931\u8D25',\n level: 'warning',\n attention: 'high',\n buildDetails: (label, err) => [\n label ? `\u76EE\u6807=${label}` : '',\n err ? `err=${toErrorMessage(err)}` : ''\n ],\n },\n {\n key: 'response_wait_retry',\n method: 'responseWaitRetry',\n label: '\u7B49\u5F85\u54CD\u5E94\u91CD\u8BD5',\n group: '\u7B49\u5F85\u54CD\u5E94',\n step: '\u7B49\u5F85\u54CD\u5E94',\n status: '\u91CD\u8BD5',\n level: 'warning',\n attention: 'medium',\n buildDetails: (label, attempt) => [\n label ? `\u76EE\u6807=${label}` : '',\n attempt !== undefined ? `\u5C1D\u8BD5=${attempt}` : ''\n ],\n },\n {\n key: 'dom_wait_start',\n method: 'domWaitStart',\n label: 'DOM\u7A33\u5B9A\u7B49\u5F85\u5F00\u59CB',\n group: 'DOM',\n step: 'DOM\u7A33\u5B9A',\n status: '\u5F00\u59CB',\n level: 'start',\n attention: 'low',\n buildDetails: (label) => [label ? `\u76EE\u6807=${label}` : ''],\n },\n {\n key: 'dom_wait_fail',\n method: 'domWaitFail',\n label: 'DOM\u7A33\u5B9A\u7B49\u5F85\u5931\u8D25',\n group: 'DOM',\n step: 'DOM\u7A33\u5B9A',\n status: '\u5931\u8D25',\n level: 'warning',\n attention: 'high',\n buildDetails: (label, err) => [\n label ? `\u76EE\u6807=${label}` : '',\n err ? `err=${toErrorMessage(err)}` : ''\n ],\n },\n {\n key: 'dom_chunk',\n method: 'domChunk',\n label: 'DOM\u7247\u6BB5',\n group: 'DOM',\n step: 'DOM\u7247\u6BB5',\n status: '',\n level: 'info',\n attention: 'low',\n throttleKey: 'dom-chunk',\n throttleMs: 2000,\n buildDetails: (length, snippet, paused) => [\n length !== undefined ? `len=${length}` : '',\n snippet ? `preview=\"${normalizeSnippet(snippet)}\"` : '',\n paused ? 'paused=1' : ''\n ],\n },\n {\n key: 'dom_wait_success',\n method: 'domWaitSuccess',\n label: 'DOM\u7A33\u5B9A\u7B49\u5F85\u5B8C\u6210',\n group: 'DOM',\n step: 'DOM\u7A33\u5B9A',\n status: '\u5B8C\u6210',\n level: 'success',\n attention: 'medium',\n buildDetails: (mutationCount, stableTime, wasPaused) => [\n mutationCount !== undefined ? `mutations=${mutationCount}` : '',\n stableTime !== undefined ? `stableTime=${stableTime}ms` : '',\n wasPaused ? 'paused=1' : ''\n ],\n },\n {\n key: 'stream_chunk',\n method: 'streamChunk',\n label: '\u6D41\u5F0F\u7247\u6BB5',\n group: '\u6D41\u5F0F',\n step: '\u6D41\u5F0F\u7247\u6BB5',\n status: '',\n level: 'info',\n attention: 'low',\n throttleKey: 'stream-chunk',\n throttleMs: 2000,\n buildDetails: (length, snippet) => [\n length !== undefined ? `len=${length}` : '',\n snippet ? `preview=\"${normalizeSnippet(snippet)}\"` : ''\n ],\n },\n {\n key: 'stream_events_parsed',\n method: 'streamEventsParsed',\n label: '\u6D41\u5F0F\u4E8B\u4EF6\u89E3\u6790\u5B8C\u6210',\n group: '\u6D41\u5F0F',\n step: '\u6D41\u5F0F\u4E8B\u4EF6\u89E3\u6790',\n status: '\u5B8C\u6210',\n level: 'info',\n attention: 'low',\n throttleKey: 'stream-events',\n throttleMs: 4000,\n buildDetails: (count) => [count !== undefined ? `count=${count}` : ''],\n },\n {\n key: 'stream_complete_event',\n method: 'streamCompleteEvent',\n label: '\u6D41\u5F0F\u5B8C\u6210\u4E8B\u4EF6\u6355\u83B7',\n group: '\u6D41\u5F0F',\n step: '\u6D41\u5F0F\u4E8B\u4EF6',\n status: '\u5B8C\u6210\u4E8B\u4EF6\u5DF2\u6355\u83B7',\n level: 'success',\n attention: 'medium',\n },\n {\n key: 'stream_end',\n method: 'streamEnd',\n label: '\u6D41\u5F0F\u54CD\u5E94\u7ED3\u675F',\n group: '\u6D41\u5F0F',\n step: '\u6D41\u5F0F\u54CD\u5E94',\n status: '\u7ED3\u675F',\n level: 'info',\n attention: 'low',\n },\n {\n key: 'reference_expand_start',\n method: 'referenceExpandStart',\n label: '\u5F15\u7528\u5C55\u5F00\u5F00\u59CB',\n group: '\u5F15\u7528',\n step: '\u5F15\u7528\u5C55\u5F00',\n status: '\u5F00\u59CB',\n level: 'start',\n attention: 'low',\n buildDetails: (label) => [label ? `\u76EE\u6807=${label}` : ''],\n },\n {\n key: 'reference_expand_fail',\n method: 'referenceExpandFail',\n label: '\u5F15\u7528\u5C55\u5F00\u5931\u8D25',\n group: '\u5F15\u7528',\n step: '\u5F15\u7528\u5C55\u5F00',\n status: '\u5931\u8D25',\n level: 'warning',\n attention: 'medium',\n buildDetails: (err) => [err ? `err=${toErrorMessage(err)}` : ''],\n },\n {\n key: 'screenshot_start',\n method: 'screenshotStart',\n label: '\u622A\u56FE\u5F00\u59CB',\n group: '\u622A\u56FE',\n step: '\u622A\u56FE',\n status: '\u5F00\u59CB',\n level: 'start',\n attention: 'low',\n },\n {\n key: 'screenshot_success',\n method: 'screenshotSuccess',\n label: '\u622A\u56FE\u6210\u529F',\n group: '\u622A\u56FE',\n step: '\u622A\u56FE',\n status: '\u6210\u529F',\n level: 'success',\n attention: 'high',\n },\n {\n key: 'screenshot_fail',\n method: 'screenshotFail',\n label: '\u622A\u56FE\u5931\u8D25',\n group: '\u622A\u56FE',\n step: '\u622A\u56FE',\n status: '\u5931\u8D25',\n level: 'warning',\n attention: 'high',\n buildDetails: (err) => [err ? `err=${toErrorMessage(err)}` : ''],\n },\n {\n key: 'share_start',\n method: 'shareStart',\n label: '\u5206\u4EAB\u94FE\u63A5\u5F00\u59CB',\n group: '\u5206\u4EAB',\n step: '\u5206\u4EAB\u94FE\u63A5',\n status: '\u5F00\u59CB',\n level: 'start',\n attention: 'low',\n },\n {\n key: 'share_progress',\n method: 'shareProgress',\n label: '\u5206\u4EAB\u94FE\u63A5\u6B65\u9AA4',\n group: '\u5206\u4EAB',\n step: '\u5206\u4EAB\u94FE\u63A5',\n status: '\u6B65\u9AA4',\n level: 'info',\n attention: 'low',\n buildDetails: (label) => [label ? `\u6B65\u9AA4=${label}` : ''],\n },\n {\n key: 'share_dom_hit',\n method: 'shareDomHit',\n label: '\u5206\u4EAB\u94FE\u63A5DOM\u547D\u4E2D',\n group: '\u5206\u4EAB',\n step: '\u5206\u4EAB\u94FE\u63A5',\n status: 'DOM\u547D\u4E2D',\n level: 'info',\n attention: 'low',\n buildDetails: (link, domSnapshot) => [\n link ? `\u94FE\u63A5=${link}` : '',\n domSnapshot ? `DOM=${normalizeSnippet(domSnapshot, 220)}` : ''\n ],\n },\n {\n key: 'share_source',\n method: 'shareSource',\n label: '\u5206\u4EAB\u94FE\u63A5\u6765\u6E90',\n group: '\u5206\u4EAB',\n step: '\u5206\u4EAB\u94FE\u63A5',\n status: '\u6765\u6E90',\n level: 'info',\n attention: 'low',\n buildDetails: (source, link, domSnapshot) => [\n source ? `\u6765\u6E90=${source}` : '',\n link ? `\u94FE\u63A5=${link}` : '',\n source === 'dom' && domSnapshot ? `DOM=${normalizeSnippet(domSnapshot, 220)}` : ''\n ],\n },\n {\n key: 'share_success',\n method: 'shareSuccess',\n label: '\u5206\u4EAB\u94FE\u63A5\u6210\u529F',\n group: '\u5206\u4EAB',\n step: '\u5206\u4EAB\u94FE\u63A5',\n status: '\u6210\u529F',\n level: 'success',\n attention: 'high',\n buildDetails: (link) => [link ? `\u94FE\u63A5=${link}` : ''],\n },\n {\n key: 'share_fail',\n method: 'shareFail',\n label: '\u5206\u4EAB\u94FE\u63A5\u5931\u8D25',\n group: '\u5206\u4EAB',\n step: '\u5206\u4EAB\u94FE\u63A5',\n status: '\u5931\u8D25',\n level: 'warning',\n attention: 'high',\n buildDetails: (err) => [err ? `err=${toErrorMessage(err)}` : ''],\n },\n {\n key: 'share_skip',\n method: 'shareSkip',\n label: '\u5206\u4EAB\u94FE\u63A5\u8DF3\u8FC7',\n group: '\u5206\u4EAB',\n step: '\u5206\u4EAB\u94FE\u63A5',\n status: '\u8DF3\u8FC7',\n level: 'warning',\n attention: 'medium',\n buildDetails: (reason) => [reason ? `\u539F\u56E0=${reason}` : ''],\n },\n {\n key: 'ai_search_card_detect_attempt',\n method: 'aiSearchCardDetectAttempt',\n label: 'AI Search \u5361\u7247\u8BC6\u522B\u5C1D\u8BD5',\n group: 'AI Search',\n step: 'AI Search \u5361\u7247\u8BC6\u522B',\n status: '\u5C1D\u8BD5',\n level: 'info',\n attention: 'low',\n buildDetails: (attempt = 1, maxAttempts = 1, url = '') => [\n `attempt=${attempt}/${maxAttempts}`,\n url ? `url=${url}` : '',\n ],\n },\n {\n key: 'ai_search_card_detect_success',\n method: 'aiSearchCardDetectSuccess',\n label: 'AI Search \u5361\u7247\u8BC6\u522B\u6210\u529F',\n group: 'AI Search',\n step: 'AI Search \u5361\u7247\u8BC6\u522B',\n status: '\u6210\u529F',\n level: 'success',\n attention: 'high',\n buildDetails: (cardType = '', attempts = 1, refreshCount = 0, url = '') => [\n cardType ? `cardType=${cardType}` : '',\n `attempts=${attempts}`,\n `refreshCount=${refreshCount}`,\n url ? `url=${url}` : '',\n ],\n },\n {\n key: 'ai_search_card_empty_result_success',\n method: 'aiSearchCardEmptyResultSuccess',\n label: 'AI Search \u7A7A\u7ED3\u679C\u6210\u529F',\n group: 'AI Search',\n step: 'AI Search \u7A7A\u7ED3\u679C',\n status: '\u6210\u529F',\n level: 'success',\n attention: 'high',\n buildDetails: (contentLeftTpls = [], targetTpls = [], url = '', attempts = 0, refreshCount = 0) => [\n Array.isArray(contentLeftTpls) ? `contentLeftTpls=${normalizeSnippet(contentLeftTpls.join(','), 200)}` : '',\n Array.isArray(targetTpls) ? `targetTpls=${normalizeSnippet(targetTpls.join(','), 200)}` : '',\n `attempts=${attempts}`,\n `refreshCount=${refreshCount}`,\n url ? `url=${url}` : '',\n ],\n },\n {\n key: 'data_push_success',\n method: 'dataPushSuccess',\n label: '\u6570\u636E\u63A8\u9001\u6210\u529F',\n group: '\u6570\u636E\u63A8\u9001',\n step: '\u6570\u636E\u63A8\u9001',\n status: '\u6210\u529F',\n level: 'success',\n attention: 'medium',\n buildDetails: (label) => [label ? `\u8BF4\u660E=${label}` : ''],\n },\n {\n key: 'data_push_fail',\n method: 'dataPushFail',\n label: '\u6570\u636E\u63A8\u9001\u5931\u8D25',\n group: '\u6570\u636E\u63A8\u9001',\n step: '\u6570\u636E\u63A8\u9001',\n status: '\u5931\u8D25',\n level: 'error',\n attention: 'high',\n buildDetails: (err) => [err ? `err=${toErrorMessage(err)}` : ''],\n },\n {\n key: 'popup_detected',\n method: 'popupDetected',\n label: '\u5F39\u7A97\u68C0\u6D4B',\n group: '\u5F39\u7A97',\n step: '\u5F39\u7A97\u5904\u7406',\n status: '\u68C0\u6D4B\u5230\u906E\u7F69',\n level: 'warning',\n attention: 'medium',\n buildDetails: (detail) => [detail ? `detail=${detail}` : ''],\n },\n {\n key: 'popup_close_attempt',\n method: 'popupCloseAttempt',\n label: '\u5F39\u7A97\u5173\u95ED\u5C1D\u8BD5',\n group: '\u5F39\u7A97',\n step: '\u5F39\u7A97\u5904\u7406',\n status: '\u5C1D\u8BD5\u5173\u95ED',\n level: 'info',\n attention: 'low',\n buildDetails: (detail) => [detail ? `detail=${detail}` : ''],\n },\n {\n key: 'popup_close_success',\n method: 'popupCloseSuccess',\n label: '\u5F39\u7A97\u5173\u95ED\u5B8C\u6210',\n group: '\u5F39\u7A97',\n step: '\u5F39\u7A97\u5904\u7406',\n status: '\u5173\u95ED\u5B8C\u6210',\n level: 'success',\n attention: 'medium',\n },\n {\n key: 'popup_close_fail',\n method: 'popupCloseFail',\n label: '\u5F39\u7A97\u5173\u95ED\u5931\u8D25',\n group: '\u5F39\u7A97',\n step: '\u5F39\u7A97\u5904\u7406',\n status: '\u5173\u95ED\u5931\u8D25',\n level: 'warning',\n attention: 'medium',\n buildDetails: (err) => [err ? `err=${toErrorMessage(err)}` : ''],\n },\n];\n\nexport const LOG_TEMPLATES = LOG_DEFINITIONS.map((definition) => {\n const attention = definition.attention || 'medium';\n const attentionRank = ATTENTION_RANK[attention] || ATTENTION_RANK.medium;\n const defaultSelected = attentionRank >= DEFAULT_ATTENTION_RANK;\n return {\n key: definition.key,\n label: definition.label,\n group: definition.group,\n attention,\n patterns: buildDefinitionPatterns(definition),\n defaultSelected,\n };\n});\n\nconst buildStepLine = (step, status, details = []) => {\n const parts = [];\n const decoratedStep = step ? decorateLabel(step, STEP_EMOJIS) : '';\n const base = decoratedStep ? `${STEP_PREFIX} ${decoratedStep}` : STEP_PREFIX;\n parts.push(base.trim());\n if (status) parts.push(decorateLabel(status, STATUS_EMOJIS));\n const detailParts = details.filter(Boolean);\n if (detailParts.length > 0) {\n parts.push(...detailParts);\n }\n return parts.join(STEP_SEPARATOR);\n};\n\nconst createThrottle = () => {\n const lastMap = new Map();\n return (key, intervalMs, fn) => {\n const now = Date.now();\n const last = lastMap.get(key) || 0;\n if (now - last >= intervalMs) {\n lastMap.set(key, now);\n fn();\n }\n };\n};\n\nexport const createTemplateLogger = (baseLogger = createBaseLogger()) => {\n const throttle = createThrottle();\n\n const info = (line) => baseLogger.info(line);\n const success = (line) => baseLogger.success(line);\n const warning = (line) => baseLogger.warning(line);\n const error = (line) => baseLogger.error(line);\n const debug = (line) => baseLogger.debug(line);\n const start = (line) => baseLogger.start(line);\n\n const stepInfo = (step, status, details = []) => info(buildStepLine(step, status, details));\n const stepSuccess = (step, status, details = []) => success(buildStepLine(step, status, details));\n const stepWarn = (step, status, details = []) => warning(buildStepLine(step, status, details));\n const stepError = (step, status, details = []) => error(buildStepLine(step, status, details));\n const stepStart = (step, status, details = []) => start(buildStepLine(step, status, details));\n\n const stepHandlers = {\n info: stepInfo,\n success: stepSuccess,\n warning: stepWarn,\n error: stepError,\n start: stepStart,\n };\n\n const logFromDefinition = (definition, details = []) => {\n const handler = stepHandlers[definition.level] || stepInfo;\n const payload = [...details, buildLogTag(definition.key)];\n const emit = () => handler(definition.step, definition.status, payload);\n if (definition.throttleMs) {\n throttle(definition.throttleKey || definition.key, definition.throttleMs, emit);\n return;\n }\n emit();\n };\n\n const definitionMethods = {};\n LOG_DEFINITIONS.forEach((definition) => {\n if (!definition.method) return;\n definitionMethods[definition.method] = (...args) => {\n const details = definition.buildDetails ? definition.buildDetails(...args) : [];\n logFromDefinition(definition, details);\n };\n });\n\n return {\n step: (step, status, details, level = 'info') => {\n if (level === 'error') return stepError(step, status, details);\n if (level === 'warn' || level === 'warning') return stepWarn(step, status, details);\n if (level === 'start') return stepStart(step, status, details);\n if (level === 'success') return stepSuccess(step, status, details);\n return stepInfo(step, status, details);\n },\n info: (message) => info(message),\n success: (message) => success(message),\n warning: (message) => warning(message),\n warn: (message) => warning(message),\n error: (message) => error(message),\n debug: (message) => debug(message),\n start: (message) => start(message),\n ...definitionMethods,\n };\n};\n\nconst getDefaultBaseLogger = () => createBaseLogger('');\n\nexport const Logger = {\n setLogger: (logger) => setDefaultLogger(logger),\n info: (message) => getDefaultBaseLogger().info(message),\n success: (message) => getDefaultBaseLogger().success(message),\n warning: (message) => getDefaultBaseLogger().warning(message),\n warn: (message) => getDefaultBaseLogger().warning(message),\n error: (message) => getDefaultBaseLogger().error(message),\n debug: (message) => getDefaultBaseLogger().debug(message),\n start: (message) => getDefaultBaseLogger().start(message),\n useTemplate: (logger) => {\n if (logger) return createTemplateLogger(createBaseLogger('', logger));\n return createTemplateLogger();\n },\n};\n", "import delay from 'delay';\nimport { Utils } from './utils.js';\nimport { Mutation } from './mutation.js';\nimport { PageRuntimeStateKey } from './internals/constants.js';\nimport {\n normalizeScreenshotWatermarkify,\n resolveScreenshotWatermarkifyMeta,\n watermarkifyScreenshotBuffer,\n} from './internals/watermarkify.js';\nimport { createInternalLogger } from './internals/logger.js';\nimport {\n compressImageBufferToBase64,\n resolveImageCompression,\n} from './internals/compression.js';\nimport { captureExpandedFullPageScreenshot } from './internals/screenshot.js';\n\nconst logger = createInternalLogger('Share');\n\nconst DEFAULT_TIMEOUT_MS = 50 * 1000;\nconst DEFAULT_PAYLOAD_SNAPSHOT_MAX_LEN = 500;\nconst DEFAULT_POLL_INTERVAL_MS = 120;\n\nconst normalizePrefix = (value) => value == null ? undefined : String(value).trim();\n\nconst toSnapshot = (value, maxLen) => {\n const text = String(value || '');\n if (!text) return '';\n return text.replace(/\\s+/g, ' ').trim().slice(0, maxLen);\n};\n\nconst toInline = (value, maxLen = 200) => {\n const text = String(value || '');\n if (!text) return '';\n return text.replace(/\\s+/g, ' ').trim().slice(0, maxLen);\n};\n\nconst toJsonInline = (value, maxLen = 260) => {\n try {\n return toInline(JSON.stringify(value), maxLen);\n } catch {\n return '[\u4E0D\u53EF\u5E8F\u5217\u5316]';\n }\n};\n\nconst normalizeXurl = (value) => {\n if (!Array.isArray(value)) return [];\n\n const normalizeMatcherList = (input) => {\n if (Array.isArray(input)) {\n return input\n .map((item) => String(item || '').trim().replace(/\\.+$/, ''))\n .filter(Boolean);\n }\n\n const single = String(input || '').trim().replace(/\\.+$/, '');\n return single ? [single] : [];\n };\n\n const normalizeSegments = (input) => {\n if (Array.isArray(input)) {\n return input\n .map((item) => String(item || '').trim().replace(/\\.+$/, ''))\n .filter(Boolean);\n }\n\n const raw = String(input || '').trim();\n if (!raw) return [];\n\n return raw\n .split('.')\n .map((item) => String(item || '').trim().replace(/\\.+$/, ''))\n .filter(Boolean);\n };\n\n const normalized = [];\n\n const apiMatchers = normalizeMatcherList(value[0]);\n if (apiMatchers.length > 0) {\n normalized.push(apiMatchers);\n }\n\n const flattenedPath = [];\n const extraPaths = [];\n\n value.slice(1).forEach((item) => {\n if (Array.isArray(item)) {\n const segments = normalizeSegments(item);\n if (segments.length > 0) {\n extraPaths.push(segments);\n }\n return;\n }\n\n const segments = normalizeSegments(item);\n if (segments.length > 0) {\n flattenedPath.push(...segments);\n }\n });\n\n if (flattenedPath.length > 0) {\n normalized.push(flattenedPath);\n }\n\n if (extraPaths.length > 0) {\n normalized.push(...extraPaths);\n }\n\n return normalized;\n};\n\nconst normalizeShare = (share) => {\n const source = share && typeof share === 'object' ? share : {};\n const modeRaw = String(source.mode || 'dom').trim().toLowerCase();\n const mode = ['dom', 'response', 'custom'].includes(modeRaw) ? modeRaw : 'dom';\n\n return {\n mode,\n prefix: normalizePrefix(source.prefix),\n xurl: normalizeXurl(source.xurl),\n };\n};\n\nconst resolveCaptureScreenWatermarkify = (page, optionValue) => {\n if (optionValue === false) {\n return normalizeScreenshotWatermarkify(false);\n }\n\n const runtimeQuery = String(page?.[PageRuntimeStateKey]?.query || '').trim();\n if (optionValue == null || optionValue === true) {\n return normalizeScreenshotWatermarkify(runtimeQuery ? { query: runtimeQuery } : true);\n }\n\n const optionSource = optionValue && typeof optionValue === 'object' ? optionValue : {};\n return normalizeScreenshotWatermarkify({\n ...(runtimeQuery ? { query: runtimeQuery } : {}),\n ...optionSource,\n });\n};\n\nconst getByPathSegments = (source, pathSegments) => {\n if (!Array.isArray(pathSegments) || pathSegments.length === 0) return undefined;\n\n let current = source;\n\n for (const rawSegment of pathSegments) {\n const segment = String(rawSegment || '').trim();\n if (!segment) return undefined;\n if (current == null) return undefined;\n\n if (Array.isArray(current) && /^\\d+$/.test(segment)) {\n current = current[Number(segment)];\n continue;\n }\n\n current = current[segment];\n }\n\n return current;\n};\n\nconst buildShareLink = (prefix, value) => {\n const raw = String(value || '').trim();\n if (!raw) return '';\n\n if (/^https?:\\/\\//i.test(raw)) {\n return raw;\n }\n\n const safePrefix = normalizePrefix(prefix);\n if (!safePrefix) return '';\n\n const valueNoSlash = raw.replace(/^\\/+/, '');\n\n if (/[?&=]$/.test(safePrefix)) {\n return `${safePrefix}${valueNoSlash}`;\n }\n\n const prefixNoSlash = safePrefix.replace(/\\/+$/, '');\n return `${prefixNoSlash}/${valueNoSlash}`;\n};\n\nconst parseJsonSafely = (text) => {\n const raw = String(text || '').trim();\n if (!raw) return null;\n\n try {\n return JSON.parse(raw);\n } catch {\n return null;\n }\n};\n\nconst createDomShareMonitor = async (page, options = {}) => {\n const prefix = normalizePrefix(options.prefix);\n const selectors = options.selectors ?? 'html';\n const mode = options.mode ?? Mutation.Mode.All;\n const onMatch = typeof options.onMatch === 'function' ? options.onMatch : null;\n const onTelemetry = typeof options.onTelemetry === 'function' ? options.onTelemetry : null;\n\n let matched = false;\n\n logger.info(`DOM \u76D1\u542C\u51C6\u5907\u6302\u8F7D: selectors=${toJsonInline(selectors, 120)}, mode=${mode}`);\n\n const monitor = await Mutation.useMonitor(page, selectors, {\n mode,\n onMutation: (context = {}) => {\n if (matched) return;\n\n const mutationCount = Number(context.mutationCount || 0);\n const mutationNodes = Array.isArray(context.mutationNodes) ? context.mutationNodes : [];\n const html = String(context.html || '');\n const text = String(context.text || '');\n const rawDom = `${html}\\n${text}`;\n\n if (onTelemetry) {\n onTelemetry({\n mutationCount,\n mutationNodesCount: mutationNodes.length,\n });\n }\n\n if (mutationCount <= 5 || mutationCount % 50 === 0) {\n logger.info(`DOM \u53D8\u5316\u5DF2\u6355\u83B7: mutationCount=${mutationCount}, mutationNodes=${mutationNodes.length}`);\n }\n\n const [candidate] = Utils.parseLinks(rawDom, { prefix }) || [];\n if (!candidate) return;\n\n matched = true;\n logger.success('captureLink.domHit', `DOM \u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: mutationCount=${mutationCount}, link=${candidate}`);\n\n if (onMatch) {\n onMatch({\n link: candidate,\n rawDom,\n mutationCount,\n html,\n text,\n mutationNodes,\n });\n }\n },\n });\n\n return {\n stop: async () => {\n const result = await monitor.stop();\n logger.info(`DOM \u76D1\u542C\u5DF2\u505C\u6B62: totalMutations=${result?.totalMutations || 0}`);\n return result;\n },\n };\n};\n\nexport const Share = {\n /**\n * \u6355\u83B7\u5206\u4EAB\u94FE\u63A5\uFF08\u5355\u6A21\u5F0F\uFF09\n * - mode='dom': \u4EC5 DOM \u76D1\u542C\n * - mode='response': \u4EC5\u63A5\u53E3\u76D1\u542C\n * - mode='custom': \u4F7F\u7528 performActions \u8FD4\u56DE\u503C\u4F5C\u4E3A\u94FE\u63A5\n *\n * @param {import('playwright').Page} page\n * @param {Object} [options]\n * @param {{ mode?: 'dom' | 'response' | 'custom', prefix: string, xurl?: Array<string | string[]> }} options.share\n * @param {number} [options.timeoutMs=50000] \u4F20 0 \u8868\u793A\u5173\u95ED\u8D85\u65F6\uFF0C\u76F4\u5230\u6355\u83B7\u6210\u529F\u6216 signal.abort()\n * @param {number} [options.payloadSnapshotMaxLen=500]\n * @param {string | string[]} [options.domSelectors='html']\n * @param {'added' | 'changed' | 'all'} [options.domMode='all']\n * @param {() => void | string | { link?: string | null; payloadText?: string } | Promise<void | string | { link?: string | null; payloadText?: string }>} [options.performActions]\n * @returns {Promise<{ link: string | null; payloadText: string; payloadSnapshot: string; source: 'dom' | 'response' | 'custom' | 'none' }>}\n */\n async captureLink(page, options = {}) {\n const share = normalizeShare(options.share);\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const timeoutDisabled = timeoutMs === 0;\n const payloadSnapshotMaxLen = options.payloadSnapshotMaxLen ?? DEFAULT_PAYLOAD_SNAPSHOT_MAX_LEN;\n const domSelectors = options.domSelectors ?? 'html';\n const domMode = options.domMode ?? Mutation.Mode.All;\n const performActions = typeof options.performActions === 'function' ? options.performActions : async () => { };\n const signal = options.signal;\n const isAborted = () => Boolean(signal?.aborted);\n const abortReason = () => {\n const reason = signal?.reason;\n if (reason instanceof Error) return reason.message;\n return reason ? String(reason) : 'aborted';\n };\n\n if (share.prefix === undefined) {\n throw new Error('Share.captureLink requires options.share.prefix');\n }\n\n if (share.mode !== 'dom' && share.mode !== 'response' && share.mode !== 'custom') {\n throw new Error(`Share.captureLink unsupported share.mode: ${share.mode}`);\n }\n\n const apiMatchers = share.mode === 'response' ? (share.xurl[0] || []) : [];\n const fieldPaths = share.mode === 'response' ? share.xurl.slice(1) : [];\n\n if (share.mode === 'response' && apiMatchers.length === 0) {\n throw new Error('Share.captureLink requires share.xurl[0] api matcher when mode=response');\n }\n\n logger.start('captureLink', `mode=${share.mode}, timeoutMs=${timeoutDisabled ? 'disabled' : timeoutMs}, prefix=${share.prefix}`);\n logger.info(`captureLink \u914D\u7F6E: xurl=${toJsonInline(share.xurl)}, domMode=${domMode}, domSelectors=${toJsonInline(domSelectors, 120)}`);\n\n const stats = {\n actionTimedOut: false,\n domMutationCount: 0,\n domMutationNodes: 0,\n responseObserved: 0,\n responseMatched: 0,\n responseResolved: 0,\n lastMatchedUrl: '',\n responseSampleUrls: [],\n };\n\n if (isAborted()) {\n logger.warning(`captureLink \u5DF2\u53D6\u6D88: ${abortReason()}`);\n return {\n link: null,\n payloadText: '',\n payloadSnapshot: abortReason(),\n source: 'none',\n };\n }\n\n const candidates = {\n dom: null,\n response: null,\n custom: null,\n };\n\n const setCandidate = (source, link, payloadText = '') => {\n const safe = String(link || '').trim();\n if (!safe) return false;\n\n const [validated] = Utils.parseLinks(safe, { prefix: share.prefix }) || [];\n if (!validated) return false;\n\n if (candidates[source]?.link) return false;\n\n candidates[source] = {\n link: validated,\n payloadText: String(payloadText || ''),\n };\n\n logger.info(`\u5019\u9009\u94FE\u63A5\u5DF2\u786E\u8BA4: source=${source}, link=${validated}`);\n return true;\n };\n\n const resolveResponseCandidate = (responseText) => {\n const rawText = String(responseText || '');\n if (!rawText) return null;\n\n const [direct] = Utils.parseLinks(rawText, { prefix: share.prefix }) || [];\n if (direct) {\n return { link: direct, payloadText: rawText };\n }\n\n if (fieldPaths.length === 0) return null;\n\n const payload = parseJsonSafely(rawText);\n if (!payload || typeof payload !== 'object') return null;\n\n for (const pathSegments of fieldPaths) {\n const value = getByPathSegments(payload, pathSegments);\n if (value == null || value === '') continue;\n\n const composed = buildShareLink(share.prefix, value);\n if (!composed) continue;\n\n const [validated] = Utils.parseLinks(composed, { prefix: share.prefix }) || [];\n if (!validated) continue;\n\n return {\n link: validated,\n payloadText: rawText,\n };\n }\n\n return null;\n };\n\n let domMonitor = null;\n\n const stopDomMonitor = async () => {\n if (!domMonitor) return;\n const monitor = domMonitor;\n domMonitor = null;\n try {\n await monitor.stop();\n } catch (error) {\n logger.warning(`\u505C\u6B62 DOM \u76D1\u542C\u5931\u8D25: ${error instanceof Error ? error.message : String(error)}`);\n }\n };\n\n const onResponse = async (response) => {\n if (share.mode !== 'response') return;\n if (candidates.response?.link) return;\n\n stats.responseObserved += 1;\n\n try {\n if (isAborted()) return;\n\n const url = String(response.url() || '');\n\n if (url && stats.responseSampleUrls.length < 8 && !stats.responseSampleUrls.includes(url)) {\n stats.responseSampleUrls.push(url);\n }\n\n if (stats.responseObserved <= 5) {\n logger.info(`\u63A5\u53E3\u54CD\u5E94\u91C7\u6837(${stats.responseObserved}): ${url}`);\n }\n\n if (!apiMatchers.some((matcher) => url.includes(matcher))) return;\n\n stats.responseMatched += 1;\n stats.lastMatchedUrl = url;\n logger.info(`\u63A5\u53E3\u547D\u4E2D\u5339\u914D(${stats.responseMatched}): ${url}`);\n\n const text = await response.text();\n const hit = resolveResponseCandidate(text);\n if (!hit?.link) {\n if (stats.responseMatched <= 3) {\n logger.info(`\u63A5\u53E3\u89E3\u6790\u5B8C\u6210\u4F46\u672A\u63D0\u53D6\u5230\u5206\u4EAB\u94FE\u63A5: payloadSize=${text.length}`);\n }\n return;\n }\n\n stats.responseResolved += 1;\n logger.success('captureLink.responseHit', `\u63A5\u53E3\u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: url=${url}, link=${hit.link}`);\n setCandidate('response', hit.link, hit.payloadText);\n } catch (error) {\n logger.warning(`\u63A5\u53E3\u54CD\u5E94\u5904\u7406\u5F02\u5E38: ${error instanceof Error ? error.message : String(error)}`);\n }\n };\n\n if (share.mode === 'dom') {\n logger.info('\u5F53\u524D\u4E3A DOM \u6A21\u5F0F\uFF0C\u4EC5\u542F\u7528 DOM \u76D1\u542C');\n domMonitor = await createDomShareMonitor(page, {\n prefix: share.prefix,\n selectors: domSelectors,\n mode: domMode,\n onTelemetry: ({ mutationCount, mutationNodesCount }) => {\n stats.domMutationCount = mutationCount;\n stats.domMutationNodes = mutationNodesCount;\n },\n onMatch: ({ link, rawDom }) => {\n setCandidate('dom', link, rawDom);\n },\n });\n }\n\n if (share.mode === 'response') {\n logger.info(`\u5F53\u524D\u4E3A\u63A5\u53E3\u6A21\u5F0F\uFF0C\u6302\u8F7D response \u76D1\u542C: apiMatchers=${toJsonInline(apiMatchers, 160)}`);\n page.on('response', onResponse);\n }\n\n if (share.mode === 'custom') {\n logger.info('\u5F53\u524D\u4E3A custom \u6A21\u5F0F\uFF0C\u5C06\u4F7F\u7528 performActions \u8FD4\u56DE\u503C');\n }\n\n const deadline = timeoutDisabled ? Infinity : Date.now() + timeoutMs;\n const getRemainingMs = () => timeoutDisabled ? Infinity : Math.max(0, deadline - Date.now());\n\n try {\n const actionTimeout = getRemainingMs();\n logger.start('captureLink.performActions', `\u6267\u884C\u52A8\u4F5C\u9884\u7B97=${timeoutDisabled ? 'disabled' : `${actionTimeout}ms`}`);\n let actionValue;\n\n if (!isAborted() && actionTimeout > 0) {\n let timer = null;\n\n const actionPromise = Promise.resolve()\n .then(() => performActions())\n .then((result) => ({ type: 'done', result }))\n .catch((error) => ({ type: 'error', error }));\n\n const actionResult = timeoutDisabled\n ? await actionPromise\n : await Promise.race([\n actionPromise,\n new Promise((resolve) => {\n timer = setTimeout(() => resolve({ type: 'timeout' }), actionTimeout);\n }),\n ]);\n if (timer) clearTimeout(timer);\n\n if (actionResult.type === 'error') {\n logger.fail('captureLink.performActions', actionResult.error);\n throw actionResult.error;\n }\n\n if (actionResult.type === 'timeout') {\n stats.actionTimedOut = true;\n logger.warning(`performActions \u5DF2\u8D85\u65F6 (${actionTimeout}ms)\uFF0C\u52A8\u4F5C\u53EF\u80FD\u4ECD\u5728\u5F02\u6B65\u6267\u884C`);\n } else {\n actionValue = actionResult.result;\n logger.success('captureLink.performActions', '\u6267\u884C\u52A8\u4F5C\u5B8C\u6210');\n }\n }\n\n if (share.mode === 'custom') {\n const customLink = typeof actionValue === 'string'\n ? actionValue\n : actionValue?.link || actionValue?.payloadText;\n const customPayloadText = typeof actionValue === 'string'\n ? actionValue\n : actionValue?.payloadText;\n\n if (setCandidate('custom', customLink, customPayloadText)) {\n logger.success('captureLink.customResult', `custom \u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: link=${candidates.custom.link}`);\n } else {\n logger.warning('performActions \u6267\u884C\u5B8C\u6210\u4F46\u672A\u8FD4\u56DE\u6709\u6548\u5206\u4EAB\u94FE\u63A5');\n }\n }\n\n let nextProgressLogTs = Date.now() + 3000;\n\n while (true) {\n if (isAborted()) {\n logger.warning(`captureLink \u5DF2\u53D6\u6D88: ${abortReason()}`);\n return {\n link: null,\n payloadText: '',\n payloadSnapshot: abortReason(),\n source: 'none',\n };\n }\n\n const selected = candidates[share.mode];\n if (selected?.link) {\n logger.success('captureLink', `\u6355\u83B7\u6210\u529F: source=${share.mode}, link=${selected.link}`);\n return {\n link: selected.link,\n payloadText: selected.payloadText,\n payloadSnapshot: toSnapshot(selected.payloadText, payloadSnapshotMaxLen),\n source: share.mode,\n };\n }\n\n if (share.mode === 'custom') break;\n\n const remaining = getRemainingMs();\n if (remaining <= 0) break;\n\n const now = Date.now();\n if (now >= nextProgressLogTs) {\n logger.info(\n `captureLink \u7B49\u5F85\u4E2D: remaining=${timeoutDisabled ? 'disabled' : `${remaining}ms`}, domMutationCount=${stats.domMutationCount}, responseMatched=${stats.responseMatched}`\n );\n nextProgressLogTs = now + 5000;\n }\n\n await delay(Math.max(0, Math.min(DEFAULT_POLL_INTERVAL_MS, remaining)));\n }\n\n if (!timeoutDisabled && share.mode === 'response' && stats.responseMatched === 0) {\n logger.warning(\n `\u63A5\u53E3\u76D1\u542C\u672A\u547D\u4E2D: apiMatchers=${toJsonInline(apiMatchers, 220)}, \u54CD\u5E94\u6837\u672CURLs=${toJsonInline(stats.responseSampleUrls, 420)}`\n );\n }\n\n logger.warning(\n `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'}`\n );\n\n return {\n link: null,\n payloadText: '',\n payloadSnapshot: '',\n source: 'none',\n };\n } finally {\n if (share.mode === 'response') {\n page.off('response', onResponse);\n logger.info('response \u76D1\u542C\u5DF2\u5378\u8F7D');\n }\n await stopDomMonitor();\n }\n },\n\n\n /**\n * \u5168\u9875\u9762\u6EDA\u52A8\u622A\u56FE\uFF08\u57FA\u7840\u80FD\u529B\uFF09\n *\n * @param {import('playwright').Page} page\n * @param {Object} [options]\n * @param {boolean} [options.restore]\n * @param {number} [options.maxHeight]\n * @param {number} [options.maxBytes] \u9ED8\u8BA4 5MiB\uFF0C\u8FD4\u56DE base64 \u8D85\u8FC7\u540E\u4F1A\u538B\u7F29\n * @param {'jpeg'|'jpg'} [options.type] \u538B\u7F29\u8F93\u51FA\u683C\u5F0F\uFF0C\u9ED8\u8BA4 jpeg\n * @param {boolean|Object} [options.compression] \u4F20 false \u53EF\u5173\u95ED\u538B\u7F29\n * @param {'default'|'cloak'} [options.mode] \u622A\u56FE\u6C34\u5370\u5408\u6210\u6A21\u5F0F\uFF0C\u9ED8\u8BA4 default\n * @returns {Promise<string>} base64 image\n */\n async captureScreen(page, options = {}) {\n const restore = options.restore ?? false;\n const screenshotWatermarkify = resolveCaptureScreenWatermarkify(page, options.watermarkify);\n const compression = resolveImageCompression(options);\n const captureOptions = {\n restore,\n maxHeight: options.maxHeight,\n type: 'png',\n visibleOnly: true,\n };\n\n const capturedAt = new Date();\n const rawBuffer = await captureExpandedFullPageScreenshot(page, captureOptions);\n\n let outputBuffer = rawBuffer;\n\n if (screenshotWatermarkify.enabled) {\n const watermarkifyMeta = await resolveScreenshotWatermarkifyMeta(page, {\n ...screenshotWatermarkify,\n capturedAt,\n });\n outputBuffer = await watermarkifyScreenshotBuffer(rawBuffer, watermarkifyMeta, page, {\n mode: options.mode\n });\n }\n\n return await compressImageBufferToBase64(outputBuffer, compression);\n },\n};\n", "import { Device, normalizeDevice } from '../constants.js';\nimport { PageRuntimeStateKey } from './constants.js';\nimport { createInternalLogger } from './logger.js';\n\nconst DEFAULT_TIMEZONE_OFFSET = 8;\nconst DEFAULT_RESOLVER_TIMEOUT_MS = 180;\nconst DEFAULT_IP_LOOKUP_TIMEOUT_MS = 10000;\nconst DEFAULT_WATERMARK_OPACITY = 0.156;\nconst DEFAULT_WATERMARK_ROTATE_DEG = -16;\nconst DEFAULT_WATERMARK_CELL_WIDTH = 860;\nconst DEFAULT_WATERMARK_CELL_HEIGHT = 330;\nconst DEFAULT_STRIP_LOGO_URL = 'https://static.heartbitai.com/geo/icon/favicon.png';\nconst DEFAULT_IP_LOOKUP_URL = 'https://myip.ipip.net/json';\nconst DEFAULT_LOGO_FETCH_TIMEOUT_MS = 2500;\nconst DEFAULT_STRIP_ONE_LINE_HEIGHT = 78;\nconst DEFAULT_STRIP_WRAPPED_MIN_HEIGHT = 108;\nconst DEFAULT_STRIP_PADDING_LEFT = 22;\nconst DEFAULT_STRIP_PADDING_RIGHT = 28;\nconst DEFAULT_STRIP_GAP = 18;\nconst DEFAULT_STRIP_LABEL_WIDTH = 56;\nconst DEFAULT_STRIP_PROMPT_MAX_SAFE_CHARS = 180;\nconst DEFAULT_STRIP_PROMPT_MIN_TOTAL_WIDTH = 320;\nconst DEFAULT_STRIP_PROMPT_PREFERRED_WIDTH_RATIO = 0.58;\nconst DEFAULT_STRIP_ZONE_GAP = 18;\nconst DEFAULT_STRIP_PROMPT_TRAILING_PADDING = 16;\nconst DEFAULT_STRIP_LABEL_FONT_SIZE = 14.5;\nconst DEFAULT_STRIP_VALUE_FONT_SIZE = 15.5;\nconst DEFAULT_STRIP_VALUE_PADDING = 10;\nconst DEFAULT_STRIP_LABEL_PADDING = 14;\nconst DEFAULT_STRIP_SECTION_GAP = DEFAULT_STRIP_GAP + 16;\nconst DEFAULT_STRIP_LINE_HEIGHT_RATIO = 1.28;\nconst DEFAULT_STRIP_PROMPT_MAX_LINES = 3;\nconst DEFAULT_STRIP_CONTENT_SAFE_PADDING_X = 12;\nconst DEFAULT_STRIP_TEXT_WIDTH_SAFETY = 10;\nconst DEFAULT_BROWSER_COMPOSITOR_VIEWPORT_HEIGHT = 1200;\nconst MOBILE_STRIP_HEIGHT = 78;\nconst MOBILE_STRIP_PADDING_X = 14;\nconst MOBILE_STRIP_PADDING_Y = 13;\nconst MOBILE_STRIP_ROW_HEIGHT = 22;\nconst MOBILE_STRIP_ROW_GAP = 8;\nconst MOBILE_STRIP_LABEL_FONT_SIZE = 12.5;\nconst MOBILE_STRIP_VALUE_FONT_SIZE = 13.5;\nconst MOBILE_STRIP_META_GAP = 16;\nconst MOBILE_STRIP_VALUE_WIDTH_SAFETY = 10;\n\nconst WEAK_LOCATION_VALUES = new Set(['cn', '\u4E2D\u56FD']);\nconst LOCATION_NETWORK_SUFFIX_PATTERNS = [\n /(?:\u4E2D\u56FD)?\u79FB\u52A8$/i,\n /(?:\u4E2D\u56FD)?\u8054\u901A$/i,\n /(?:\u4E2D\u56FD)?\u7535\u4FE1$/i,\n /\u94C1\u901A$/i,\n /\u6559\u80B2\u7F51$/i,\n /\u5E7F\u7535$/i,\n /\u9E4F\u535A\u58EB$/i,\n /\u963F\u91CC\u4E91$/i,\n /\u817E\u8BAF\u4E91$/i,\n /\u767E\u5EA6\u4E91$/i,\n /\u534E\u4E3A\u4E91$/i,\n /cloudflare$/i,\n /amazon$/i,\n /aws$/i,\n /azure$/i,\n /google$/i,\n /oracle$/i,\n /linode$/i,\n /vultr$/i,\n /digitalocean$/i,\n];\n\nlet cachedStripLogoSrcPromise = null;\nconst cachedEnrichmentByContext = new WeakMap();\nconst logger = createInternalLogger('Watermarkify');\n\nconst normalizeText = (value) => String(value || '').trim();\n\nconst toInline = (value, maxLen = 200) => {\n const text = normalizeText(value);\n if (!text) return '';\n return text.replace(/\\s+/g, ' ').trim().slice(0, maxLen);\n};\n\nconst shortenTail = (value, maxLen = 80) => {\n const text = toInline(value, Math.max(maxLen * 2, maxLen + 8));\n if (!text || text.length <= maxLen) return text;\n return `${text.slice(0, Math.max(0, maxLen - 1)).trimEnd()}\u2026`;\n};\n\nconst shortenByCharacters = (value, maxChars = 80) => {\n const text = normalizeWhitespace(value);\n if (!text) return '';\n\n const chars = Array.from(text);\n if (chars.length <= maxChars) {\n return text;\n }\n\n return `${chars.slice(0, Math.max(0, maxChars - 1)).join('').trimEnd()}\u2026`;\n};\n\nconst padDatePart = (value) => String(value).padStart(2, '0');\n\nconst formatUtcOffsetLabel = (offsetHours = DEFAULT_TIMEZONE_OFFSET) => {\n const sign = offsetHours >= 0 ? '+' : '-';\n const absolute = Math.abs(offsetHours);\n const hours = Math.trunc(absolute);\n const minutes = Math.round((absolute - hours) * 60);\n\n if (!minutes) {\n return `UTC${sign}${hours}`;\n }\n\n return `UTC${sign}${hours}:${padDatePart(minutes)}`;\n};\n\nconst formatTimestampForUtcOffset = (date, offsetHours = DEFAULT_TIMEZONE_OFFSET) => {\n const source = date instanceof Date ? date : new Date(date || Date.now());\n const shifted = new Date(source.getTime() + offsetHours * 60 * 60 * 1000);\n\n return [\n `${shifted.getUTCFullYear()}-${padDatePart(shifted.getUTCMonth() + 1)}-${padDatePart(shifted.getUTCDate())}`,\n `${padDatePart(shifted.getUTCHours())}:${padDatePart(shifted.getUTCMinutes())}:${padDatePart(shifted.getUTCSeconds())}`,\n formatUtcOffsetLabel(offsetHours),\n ].join(' ');\n};\n\nconst normalizeWhitespace = (value) => String(value || '')\n .replace(/\\u00a0/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim();\n\nconst stripLocationNetworkSuffix = (value) => {\n const parts = normalizeWhitespace(value).split(' ').filter(Boolean);\n if (parts.length <= 1) {\n return normalizeWhitespace(value);\n }\n\n const last = parts[parts.length - 1];\n if (!LOCATION_NETWORK_SUFFIX_PATTERNS.some((pattern) => pattern.test(last))) {\n return parts.join(' ');\n }\n\n return parts.slice(0, -1).join(' ').trim();\n};\n\nconst isWeakLocationValue = (value) => {\n const text = normalizeWhitespace(value).toLowerCase();\n if (!text) return true;\n if (WEAK_LOCATION_VALUES.has(text)) return true;\n return /^[a-z]{2,3}$/i.test(text);\n};\n\nconst pickHeaderValue = async (response, names = []) => {\n if (!response || typeof response.headerValue !== 'function') return '';\n\n for (const name of names) {\n const value = await response.headerValue(name).catch(() => null);\n const text = normalizeText(value);\n if (text) return text;\n }\n\n return '';\n};\n\nconst parseIpIpJsonResponse = (rawText) => {\n const text = normalizeWhitespace(rawText);\n if (!text || (!text.startsWith('{') && !text.startsWith('['))) {\n return null;\n }\n\n try {\n const payload = JSON.parse(text);\n const ip = toInline(payload?.data?.ip || payload?.ip, 80);\n const locationParts = Array.isArray(payload?.data?.location)\n ? payload.data.location.map((item) => normalizeWhitespace(item)).filter(Boolean)\n : [];\n const location = toInline(\n stripLocationNetworkSuffix(locationParts.join(' ')),\n 80,\n );\n\n if (!ip && !location) {\n return null;\n }\n\n return { ip, location };\n } catch {\n return null;\n }\n};\n\nconst fillEnrichment = (target, source) => {\n if (!target || !source || typeof source !== 'object') {\n return target;\n }\n\n if (!target.ip && source.ip) {\n target.ip = toInline(source.ip, 80);\n }\n if (!target.location && source.location) {\n target.location = toInline(source.location, 80);\n }\n\n return target;\n};\n\nconst readCachedEnrichment = (page) => {\n const context = page && typeof page.context === 'function'\n ? page.context()\n : null;\n if (!context) {\n return null;\n }\n\n const cached = cachedEnrichmentByContext.get(context);\n return cached && typeof cached === 'object' ? cached : null;\n};\n\nconst writeCachedEnrichment = (page, source) => {\n const context = page && typeof page.context === 'function'\n ? page.context()\n : null;\n if (!context || !source || typeof source !== 'object') {\n return;\n }\n\n const current = cachedEnrichmentByContext.get(context) || {};\n const next = {\n ip: toInline(source.ip || current.ip, 80),\n location: toInline(source.location || current.location, 80),\n };\n\n if (!next.ip && !next.location) {\n return;\n }\n\n cachedEnrichmentByContext.set(context, next);\n};\n\nconst getHostname = (url) => {\n try {\n const parsed = new URL(url);\n return parsed.hostname || parsed.host || '\u672C\u5730\u9875\u9762';\n } catch {\n if (/^https?:\\/\\//i.test(url)) {\n return url;\n }\n\n return '\u672C\u5730\u9875\u9762';\n }\n};\n\nconst withTimeout = async (promise, timeoutMs) => {\n const safeTimeoutMs = Math.max(0, Number(timeoutMs) || 0);\n if (!safeTimeoutMs) {\n return promise;\n }\n\n let timer = null;\n try {\n return await Promise.race([\n promise,\n new Promise((resolve) => {\n timer = setTimeout(() => resolve(null), safeTimeoutMs);\n }),\n ]);\n } finally {\n if (timer) clearTimeout(timer);\n }\n};\n\nconst fetchAsDataUrl = async (url, timeoutMs = DEFAULT_LOGO_FETCH_TIMEOUT_MS) => {\n if (typeof fetch !== 'function') {\n return '';\n }\n\n const controller = typeof AbortController === 'function'\n ? new AbortController()\n : null;\n const safeTimeoutMs = Math.max(300, Number(timeoutMs) || DEFAULT_LOGO_FETCH_TIMEOUT_MS);\n const timer = controller\n ? setTimeout(() => controller.abort(), safeTimeoutMs)\n : null;\n\n try {\n const response = await fetch(url, {\n redirect: 'follow',\n signal: controller?.signal,\n });\n\n if (!response?.ok) {\n return '';\n }\n\n const contentType = normalizeText(response.headers?.get?.('content-type')) || 'image/png';\n if (!/^image\\//i.test(contentType)) {\n return '';\n }\n\n const buffer = Buffer.from(await response.arrayBuffer());\n if (!buffer.length) {\n return '';\n }\n\n return `data:${contentType};base64,${buffer.toString('base64')}`;\n } catch {\n return '';\n } finally {\n if (timer) clearTimeout(timer);\n }\n};\n\nconst resolveStripLogoSrc = async () => {\n if (!cachedStripLogoSrcPromise) {\n cachedStripLogoSrcPromise = (async () => {\n const dataUrl = await fetchAsDataUrl(DEFAULT_STRIP_LOGO_URL);\n return dataUrl || DEFAULT_STRIP_LOGO_URL;\n })();\n }\n\n const resolved = await cachedStripLogoSrcPromise.catch(() => DEFAULT_STRIP_LOGO_URL);\n return normalizeText(resolved) || DEFAULT_STRIP_LOGO_URL;\n};\n\nconst normalizeLayer = (value, defaults) => {\n if (value === false) {\n return {\n ...defaults,\n enabled: false,\n };\n }\n\n if (value && typeof value === 'object') {\n return {\n ...defaults,\n ...value,\n enabled: value.enabled !== false,\n };\n }\n\n return {\n ...defaults,\n enabled: true,\n };\n};\n\nconst resolveWithCustomResolver = async (page, baseMeta, options = {}) => {\n const resolver = typeof options.resolver === 'function'\n ? options.resolver\n : null;\n if (!resolver) {\n return null;\n }\n\n const response = options.response && typeof options.response === 'object'\n ? options.response\n : null;\n const serverAddr = response && typeof response.serverAddr === 'function'\n ? await response.serverAddr().catch(() => null)\n : null;\n const controller = typeof AbortController === 'function'\n ? new AbortController()\n : null;\n\n try {\n const resolved = await withTimeout(\n Promise.resolve(resolver({\n page,\n response,\n url: baseMeta.url,\n hostname: baseMeta.hostname,\n title: baseMeta.title,\n prompt: baseMeta.prompt,\n query: baseMeta.query,\n serverAddr,\n signal: controller?.signal,\n })).catch(() => null),\n options.resolverTimeoutMs ?? DEFAULT_RESOLVER_TIMEOUT_MS,\n );\n\n if (!resolved || typeof resolved !== 'object') {\n return null;\n }\n\n const enrichment = {\n ip: toInline(resolved.ip, 80),\n location: toInline(resolved.location, 80),\n };\n if (enrichment.ip || enrichment.location) {\n logger.info(`\u81EA\u5B9A\u4E49 resolver \u547D\u4E2D: ip=${enrichment.ip || '-'}, loc=${enrichment.location || '-'}`);\n } else {\n logger.warning('\u81EA\u5B9A\u4E49 resolver \u5DF2\u6267\u884C\uFF0C\u4F46\u672A\u8FD4\u56DE IP/Loc');\n }\n\n return enrichment;\n } finally {\n controller?.abort();\n }\n};\n\nconst openProbePage = async (page) => {\n if (!page || typeof page.context !== 'function') {\n return null;\n }\n\n const context = page.context();\n if (!context) {\n return null;\n }\n\n const browser = typeof context.browser === 'function'\n ? context.browser()\n : null;\n\n if (browser && typeof browser.newContext === 'function') {\n const probeContext = await browser.newContext().catch(() => null);\n if (probeContext && typeof probeContext.newPage === 'function') {\n const probePage = await probeContext.newPage().catch(async () => {\n await probeContext.close().catch(() => { });\n return null;\n });\n if (probePage) {\n return {\n page: probePage,\n close: async () => {\n await probeContext.close().catch(() => { });\n },\n };\n }\n } else {\n await probeContext?.close?.().catch(() => { });\n }\n }\n\n if (typeof context.newPage === 'function') {\n try {\n const probePage = await context.newPage();\n return {\n page: probePage,\n close: async () => {\n await probePage.close().catch(() => { });\n },\n };\n } catch {\n // \u67D0\u4E9B\u6258\u7BA1\u4E0A\u4E0B\u6587\u4E0D\u5141\u8BB8\u76F4\u63A5 newPage\uFF0C\u8FD9\u91CC\u8FD4\u56DE null \u8BA9\u4E0A\u5C42\u9000\u5316\u3002\n }\n }\n\n return null;\n};\n\nconst readPngDimensions = (buffer) => {\n if (!Buffer.isBuffer(buffer) || buffer.length < 24) {\n return { width: 0, height: 0 };\n }\n\n const pngSignature = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];\n for (let index = 0; index < pngSignature.length; index += 1) {\n if (buffer[index] !== pngSignature[index]) {\n return { width: 0, height: 0 };\n }\n }\n\n return {\n width: buffer.readUInt32BE(16),\n height: buffer.readUInt32BE(20),\n };\n};\n\nconst readJpegDimensions = (buffer) => {\n if (!Buffer.isBuffer(buffer) || buffer.length < 4 || buffer[0] !== 0xff || buffer[1] !== 0xd8) {\n return { width: 0, height: 0 };\n }\n\n let offset = 2;\n while (offset + 9 <= buffer.length) {\n if (buffer[offset] !== 0xff) {\n offset += 1;\n continue;\n }\n\n const marker = buffer[offset + 1];\n offset += 2;\n\n if (marker === 0xd8 || marker === 0xd9) {\n continue;\n }\n\n if (marker === 0xda) {\n break;\n }\n\n if (offset + 2 > buffer.length) {\n break;\n }\n\n const segmentLength = buffer.readUInt16BE(offset);\n if (segmentLength < 2 || offset + segmentLength > buffer.length) {\n break;\n }\n\n const isStartOfFrame = (\n marker >= 0xc0\n && marker <= 0xcf\n && marker !== 0xc4\n && marker !== 0xc8\n && marker !== 0xcc\n );\n\n if (isStartOfFrame && offset + 7 <= buffer.length) {\n return {\n height: buffer.readUInt16BE(offset + 3),\n width: buffer.readUInt16BE(offset + 5),\n };\n }\n\n offset += segmentLength;\n }\n\n return { width: 0, height: 0 };\n};\n\nconst readImageInfo = (buffer) => {\n const png = readPngDimensions(buffer);\n if (png.width && png.height) {\n return {\n mimeType: 'image/png',\n width: png.width,\n height: png.height,\n };\n }\n\n const jpeg = readJpegDimensions(buffer);\n if (jpeg.width && jpeg.height) {\n return {\n mimeType: 'image/jpeg',\n width: jpeg.width,\n height: jpeg.height,\n };\n }\n\n return {\n mimeType: '',\n width: 0,\n height: 0,\n };\n};\n\nconst buildWatermarkifyRenderHtml = ({ imageSrc, overlaySvg, width, height, imageHeight }) => {\n const safeWidth = Math.max(1, Number(width) || 1);\n const safeHeight = Math.max(1, Number(height) || 1);\n const safeImageHeight = Math.max(1, Number(imageHeight || height) || 1);\n\n return `\n <!doctype html>\n <html lang=\"zh-CN\">\n <head>\n <meta charset=\"utf-8\" />\n <style>\n html, body {\n margin: 0;\n padding: 0;\n width: ${safeWidth}px;\n height: ${safeHeight}px;\n overflow: hidden;\n background: #ffffff;\n }\n\n body {\n position: relative;\n }\n\n #pk-stage {\n position: relative;\n width: ${safeWidth}px;\n height: ${safeHeight}px;\n overflow: hidden;\n }\n\n #pk-base-image {\n position: absolute;\n top: 0;\n left: 0;\n display: block;\n width: ${safeWidth}px;\n height: ${safeImageHeight}px;\n }\n\n #pk-overlay {\n position: absolute;\n inset: 0;\n width: ${safeWidth}px;\n height: ${safeHeight}px;\n pointer-events: none;\n }\n </style>\n </head>\n <body>\n <div id=\"pk-stage\">\n <img id=\"pk-base-image\" src=\"${escapeHtmlAttribute(imageSrc)}\" alt=\"\" />\n <div id=\"pk-overlay\">${overlaySvg}</div>\n </div>\n </body>\n </html>\n `;\n};\n\nconst normalizeWatermarkifyRenderMode = (value) => {\n return String(value || 'default').trim().toLowerCase() === 'cloak'\n ? 'cloak'\n : 'default';\n};\n\nconst composeScreenshotBufferWithBrowser = async (page, buffer, overlaySvg, imageInfo = {}, options = {}) => {\n if (!page || typeof page.context !== 'function') {\n logger.warning('watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u8DF3\u8FC7: \u7F3A\u5C11\u53EF\u7528 page');\n return buffer;\n }\n\n const renderScope = await openProbePage(page);\n if (!renderScope?.page) {\n logger.warning('watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u8DF3\u8FC7: \u65E0\u6CD5\u521B\u5EFA render page');\n return buffer;\n }\n\n try {\n const renderPage = renderScope.page;\n const safeWidth = Math.max(1, Number(imageInfo.width) || 1);\n const safeImageHeight = Math.max(1, Number(imageInfo.imageHeight || imageInfo.height) || 1);\n const safeHeight = Math.max(safeImageHeight, Number(imageInfo.height) || safeImageHeight);\n const viewportHeight = Math.max(\n 1,\n Math.min(safeHeight, DEFAULT_BROWSER_COMPOSITOR_VIEWPORT_HEIGHT),\n );\n\n await renderPage.setViewportSize({\n width: safeWidth,\n height: viewportHeight,\n }).catch(() => { });\n\n const renderMode = normalizeWatermarkifyRenderMode(options.mode);\n\n if (renderMode === 'cloak') {\n const renderHtml = buildWatermarkifyRenderHtml({\n imageSrc: `data:${imageInfo.mimeType || 'image/png'};base64,${buffer.toString('base64')}`,\n overlaySvg,\n width: safeWidth,\n height: safeHeight,\n imageHeight: safeImageHeight,\n });\n\n await renderPage.goto('about:blank', {\n waitUntil: 'commit',\n }).catch(() => { });\n\n await renderPage.evaluate((html) => {\n document.open();\n document.write(html);\n document.close();\n }, renderHtml);\n } else {\n await renderPage.setContent(buildWatermarkifyRenderHtml({\n imageSrc: `data:${imageInfo.mimeType || 'image/png'};base64,${buffer.toString('base64')}`,\n overlaySvg,\n width: safeWidth,\n height: safeHeight,\n imageHeight: safeImageHeight,\n }), {\n waitUntil: 'load',\n });\n }\n\n await renderPage.waitForFunction(() => {\n const image = document.getElementById('pk-base-image');\n return image instanceof HTMLImageElement\n && image.complete\n && image.naturalWidth > 0\n && image.naturalHeight > 0;\n }, {\n timeout: 5000,\n }).catch(() => { });\n\n await renderPage.evaluate(async () => {\n if (document.fonts?.ready) {\n await document.fonts.ready.catch(() => { });\n }\n }).catch(() => { });\n\n const composed = await renderPage.screenshot({\n type: 'png',\n fullPage: true,\n animations: 'disabled',\n }).catch((error) => {\n logger.warning(`watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u5931\u8D25: ${error instanceof Error ? error.message : String(error)}`);\n return null;\n });\n\n if (Buffer.isBuffer(composed) && composed.length > 0) {\n return composed;\n }\n\n logger.warning('watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u5931\u8D25: \u672A\u5F97\u5230\u6709\u6548\u622A\u56FE\u7ED3\u679C');\n return buffer;\n } finally {\n await renderScope.close().catch(() => { });\n }\n};\n\nconst resolveWithIpLookup = async (page, options = {}) => {\n if (!page || typeof page.context !== 'function' || options.ipLookup === false) {\n return null;\n }\n\n const probeScope = await openProbePage(page);\n if (!probeScope?.page) {\n logger.warning('ipLookup \u8DF3\u8FC7: \u65E0\u6CD5\u521B\u5EFA probe page');\n return null;\n }\n\n const timeoutMs = Math.max(\n 300,\n Number(options.ipLookupTimeoutMs) || DEFAULT_IP_LOOKUP_TIMEOUT_MS,\n );\n try {\n const probePage = probeScope.page;\n logger.info(`ipLookup \u5C1D\u8BD5: url=${DEFAULT_IP_LOOKUP_URL}, timeoutMs=${timeoutMs}`);\n\n const response = await probePage.goto(DEFAULT_IP_LOOKUP_URL, {\n waitUntil: 'commit',\n timeout: timeoutMs,\n }).catch((error) => {\n logger.warning(`ipLookup \u8BF7\u6C42\u5931\u8D25: url=${DEFAULT_IP_LOOKUP_URL}, error=${error instanceof Error ? error.message : String(error)}`);\n return null;\n });\n\n const status = response && typeof response.status === 'function'\n ? response.status()\n : 0;\n const contentType = normalizeText(await pickHeaderValue(response, ['content-type']));\n let rawText = '';\n\n if (response && typeof response.text === 'function') {\n rawText = String(await withTimeout(\n response.text().catch(() => ''),\n timeoutMs,\n ) || '');\n }\n\n if (!rawText) {\n rawText = String(await withTimeout(\n probePage.evaluate(() => {\n return document.body?.innerText\n || document.documentElement?.innerText\n || '';\n }).catch(() => ''),\n Math.min(timeoutMs, 500),\n ) || '');\n }\n\n const parsed = parseIpIpJsonResponse(rawText);\n if (parsed?.ip || parsed?.location) {\n logger.info(`ipLookup \u6210\u529F: url=${DEFAULT_IP_LOOKUP_URL}, status=${status || '-'}, contentType=${contentType || '-'}, ip=${parsed.ip || '-'}, loc=${parsed.location || '-'}`);\n return parsed;\n }\n\n logger.warning(`ipLookup \u672A\u89E3\u6790\u51FA IP/Loc: url=${DEFAULT_IP_LOOKUP_URL}, status=${status || '-'}, contentType=${contentType || '-'}, preview=${shortenTail(rawText, 120) || '[empty]'}`);\n return null;\n } catch (error) {\n logger.warning(`ipLookup \u6267\u884C\u5F02\u5E38\uFF0C\u672A\u83B7\u5F97 IP/Loc: ${error instanceof Error ? error.message : String(error)}`);\n return null;\n } finally {\n await probeScope.close().catch(() => { });\n }\n};\n\nconst resolveEnrichment = async (page, baseMeta, options) => {\n const response = options.response && typeof options.response === 'object'\n ? options.response\n : null;\n const cached = readCachedEnrichment(page);\n\n const merged = {\n ip: toInline(options.ip, 80),\n location: toInline(options.location, 80),\n };\n\n logger.info(`enrichment \u5F00\u59CB: host=${baseMeta.hostname || '-'}, hasPresetIp=${Boolean(merged.ip)}, hasPresetLoc=${Boolean(merged.location)}, ipLookup=${options.ipLookup !== false}`);\n\n if (!merged.ip || !merged.location) {\n if (cached?.ip || cached?.location) {\n logger.info(`enrichment \u547D\u4E2D\u4E0A\u4E0B\u6587\u7F13\u5B58: ip=${cached.ip || '-'}, loc=${cached.location || '-'}`);\n }\n fillEnrichment(merged, cached);\n }\n\n if (!merged.ip || !merged.location) {\n fillEnrichment(\n merged,\n await resolveWithCustomResolver(page, baseMeta, options),\n );\n }\n\n if ((!merged.ip || !merged.location) && options.ipLookup !== false) {\n fillEnrichment(\n merged,\n await resolveWithIpLookup(page, options),\n );\n }\n\n if (!merged.location || isWeakLocationValue(merged.location)) {\n const headerLocation = toInline(await pickHeaderValue(response, [\n 'cf-ipcountry',\n 'x-vercel-ip-country',\n 'x-country-code',\n 'x-geo-country',\n ]), 80);\n if (!merged.location || (isWeakLocationValue(merged.location) && headerLocation)) {\n logger.info(`enrichment \u4F7F\u7528\u54CD\u5E94\u5934\u8865\u5145 Loc: ${headerLocation || '-'}`);\n merged.location = headerLocation || merged.location;\n }\n }\n\n writeCachedEnrichment(page, merged);\n if (merged.ip || merged.location) {\n logger.info(`enrichment \u5B8C\u6210: ip=${merged.ip || '-'}, loc=${merged.location || '-'}`);\n } else {\n logger.warning('enrichment \u5B8C\u6210: \u672A\u83B7\u5F97 IP/Loc');\n }\n\n return merged;\n};\n\nconst buildWatermarkStamp = ({ prompt, captureTime, ip, location }) => {\n const parts = [\n `Prompt ${shortenTail(prompt, 40) || '-'}`,\n `Time ${captureTime}`,\n `Loc ${shortenTail(location, 20) || '-'}`,\n `IP ${toInline(ip, 24) || '-'}`,\n ];\n\n return parts.join(' | ');\n};\n\nconst buildStripSegments = ({ prompt, captureTime, ip, location }) => {\n const promptValue = shortenByCharacters(\n normalizeWhitespace(prompt) || '-',\n DEFAULT_STRIP_PROMPT_MAX_SAFE_CHARS,\n ) || '-';\n const ipValue = normalizeWhitespace(ip) || '-';\n const locationValue = normalizeWhitespace(location) || '-';\n\n return [\n {\n kind: 'prompt',\n label: 'Prompt',\n value: promptValue,\n rawValue: promptValue,\n },\n {\n kind: 'time',\n label: 'Time',\n value: captureTime,\n rawValue: captureTime,\n },\n {\n kind: 'location',\n label: 'Loc',\n value: locationValue,\n rawValue: locationValue,\n },\n {\n kind: 'ip',\n label: 'IP',\n value: ipValue,\n rawValue: ipValue,\n },\n ];\n};\n\nconst escapeXml = (value) => String(value || '')\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n\nconst escapeHtmlAttribute = (value) => String(value || '')\n .replace(/&/g, '&')\n .replace(/\"/g, '"')\n .replace(/</g, '<')\n .replace(/>/g, '>');\n\nconst estimateTextWidth = (value, fontSize = 16) => {\n const text = String(value || '');\n let width = 0;\n\n for (const char of text) {\n if (/\\s/.test(char)) {\n width += fontSize * 0.34;\n } else if (/[\\u4e00-\\u9fff\\u3400-\\u4dbf\\u3040-\\u30ff\\uac00-\\ud7af]/.test(char)) {\n width += fontSize * 0.92;\n } else if (/[A-Z0-9]/.test(char)) {\n width += fontSize * 0.62;\n } else {\n width += fontSize * 0.56;\n }\n }\n\n return Math.ceil(width);\n};\n\nconst resolvePromptFields = (options = {}, fallbackTitle = '') => {\n const query = normalizeText(options.query);\n const prompt = query\n || normalizeText(options.prompt)\n || normalizeText(fallbackTitle)\n || '\u672A\u63D0\u4F9B Prompt';\n\n return {\n prompt,\n query: query || prompt,\n };\n};\n\nconst createBaseWatermarkifyOptions = () => ({\n enabled: true,\n timezoneOffsetHours: DEFAULT_TIMEZONE_OFFSET,\n response: null,\n ip: '',\n location: '',\n prompt: '',\n query: '',\n ipLookup: true,\n ipLookupTimeoutMs: DEFAULT_IP_LOOKUP_TIMEOUT_MS,\n resolver: null,\n resolverTimeoutMs: DEFAULT_RESOLVER_TIMEOUT_MS,\n watermark: normalizeLayer(undefined, {\n opacity: DEFAULT_WATERMARK_OPACITY,\n rotateDeg: DEFAULT_WATERMARK_ROTATE_DEG,\n cellWidth: DEFAULT_WATERMARK_CELL_WIDTH,\n cellHeight: DEFAULT_WATERMARK_CELL_HEIGHT,\n }),\n strip: normalizeLayer(undefined, {}),\n});\n\nconst createDisabledWatermarkifyOptions = () => ({\n ...createBaseWatermarkifyOptions(),\n enabled: false,\n watermark: normalizeLayer(false, {\n opacity: DEFAULT_WATERMARK_OPACITY,\n rotateDeg: DEFAULT_WATERMARK_ROTATE_DEG,\n cellWidth: DEFAULT_WATERMARK_CELL_WIDTH,\n cellHeight: DEFAULT_WATERMARK_CELL_HEIGHT,\n }),\n strip: normalizeLayer(false, {}),\n});\n\nexport const normalizeScreenshotWatermarkify = (value) => {\n const base = createBaseWatermarkifyOptions();\n\n if (value === false) {\n return createDisabledWatermarkifyOptions();\n }\n\n if (value == null || value === true) {\n return base;\n }\n\n const source = value && typeof value === 'object' ? value : {};\n const timezoneOffsetHoursRaw = Number(source.timezoneOffsetHours);\n const ipLookupTimeoutMsRaw = Number(source.ipLookupTimeoutMs);\n const resolverTimeoutMsRaw = Number(source.resolverTimeoutMs);\n\n return {\n ...base,\n enabled: source.enabled !== false,\n timezoneOffsetHours: Number.isFinite(timezoneOffsetHoursRaw)\n ? timezoneOffsetHoursRaw\n : DEFAULT_TIMEZONE_OFFSET,\n response: source.response ?? null,\n ip: normalizeText(source.ip),\n location: normalizeText(source.location),\n prompt: normalizeWhitespace(source.prompt),\n query: normalizeWhitespace(source.query),\n ipLookup: source.ipLookup !== false,\n ipLookupTimeoutMs: Number.isFinite(ipLookupTimeoutMsRaw)\n ? ipLookupTimeoutMsRaw\n : DEFAULT_IP_LOOKUP_TIMEOUT_MS,\n resolver: typeof source.resolver === 'function' ? source.resolver : null,\n resolverTimeoutMs: Number.isFinite(resolverTimeoutMsRaw)\n ? resolverTimeoutMsRaw\n : DEFAULT_RESOLVER_TIMEOUT_MS,\n watermark: normalizeLayer(source.watermark, {\n opacity: DEFAULT_WATERMARK_OPACITY,\n rotateDeg: DEFAULT_WATERMARK_ROTATE_DEG,\n cellWidth: DEFAULT_WATERMARK_CELL_WIDTH,\n cellHeight: DEFAULT_WATERMARK_CELL_HEIGHT,\n }),\n strip: normalizeLayer(source.strip, {}),\n };\n};\n\nexport const resolveScreenshotWatermarkifyMeta = async (page, options = {}) => {\n const timezoneOffsetHours = options.timezoneOffsetHours ?? DEFAULT_TIMEZONE_OFFSET;\n const url = normalizeText(page?.url?.()) || 'about:blank';\n const title = normalizeText(await page.title().catch(() => '')) || '\u672A\u547D\u540D\u9875\u9762';\n const hostname = getHostname(url);\n const { prompt, query } = resolvePromptFields(options, title);\n const capturedAt = options.capturedAt instanceof Date\n ? options.capturedAt\n : new Date(options.capturedAt || Date.now());\n const captureTime = formatTimestampForUtcOffset(capturedAt, timezoneOffsetHours);\n\n const [enrichment, stripLogoSrc] = await Promise.all([\n resolveEnrichment(page, {\n url,\n hostname,\n title,\n prompt,\n query,\n }, options),\n resolveStripLogoSrc(),\n ]);\n\n const ip = enrichment.ip || '-';\n const location = enrichment.location || '-';\n\n return {\n watermarkText: buildWatermarkStamp({\n prompt,\n captureTime,\n ip,\n location,\n }),\n stripSegments: buildStripSegments({\n prompt,\n captureTime,\n ip,\n location,\n }),\n watermark: options.watermark,\n strip: options.strip,\n stripLogoSrc,\n device: resolvePageDevice(page),\n };\n};\n\nconst buildFontFamily = () => 'MiSans, \"SF Pro Display\", \"PingFang SC\", \"Helvetica Neue\", Arial, sans-serif';\n\nconst resolvePageDevice = (page) => normalizeDevice(page?.[PageRuntimeStateKey]?.device);\n\nconst findStripSegment = (segments, kind) => {\n const found = Array.isArray(segments)\n ? segments.find((segment) => segment?.kind === kind)\n : null;\n return found && typeof found === 'object' ? found : {};\n};\n\nconst buildStripSegmentLayout = (segment, options = {}) => {\n const label = normalizeWhitespace(segment?.label || '');\n const rawValue = normalizeWhitespace(segment?.rawValue || segment?.value || '-') || '-';\n const labelFontSize = DEFAULT_STRIP_LABEL_FONT_SIZE;\n const valueFontSize = DEFAULT_STRIP_VALUE_FONT_SIZE;\n const labelWidth = Math.max(\n DEFAULT_STRIP_LABEL_WIDTH,\n estimateTextWidth(label, labelFontSize) + DEFAULT_STRIP_LABEL_PADDING,\n );\n const rawValueWidth = Math.max(\n 24,\n estimateTextWidth(rawValue, valueFontSize) + DEFAULT_STRIP_VALUE_PADDING,\n );\n const maxValueWidth = Math.max(0, Number(options.valueMaxWidth) || 0);\n const renderValue = maxValueWidth > 0\n ? fitTextWithEllipsis(rawValue, Math.max(18, maxValueWidth - DEFAULT_STRIP_VALUE_PADDING), valueFontSize)\n : rawValue;\n const valueWidth = maxValueWidth > 0\n ? Math.max(24, Math.min(maxValueWidth, estimateTextWidth(renderValue, valueFontSize) + DEFAULT_STRIP_VALUE_PADDING))\n : rawValueWidth;\n\n return {\n ...segment,\n label,\n rawValue,\n renderValue,\n labelFontSize,\n valueFontSize,\n labelWidth,\n valueWidth,\n segmentWidth: labelWidth + valueWidth,\n rowHeight: Math.round(Math.max(labelFontSize, valueFontSize) * 1.42),\n };\n};\n\nconst buildStripRowLayout = (segments, overrides = {}) => {\n const safeSegments = Array.isArray(segments) ? segments : [];\n const sectionGap = DEFAULT_STRIP_SECTION_GAP;\n const layouts = safeSegments.map((segment, index) => buildStripSegmentLayout(segment, {\n valueMaxWidth: overrides?.valueMaxWidths?.[index],\n }));\n const totalWidth = layouts.reduce((sum, segment) => sum + segment.segmentWidth, 0)\n + Math.max(0, layouts.length - 1) * sectionGap;\n const rowHeight = layouts.reduce((max, segment) => Math.max(max, segment.rowHeight || 0), 0);\n\n return {\n sectionGap,\n layouts,\n totalWidth,\n rowHeight,\n };\n};\n\nconst fitTextWithEllipsis = (chars, maxWidth, fontSize) => {\n const safeChars = Array.isArray(chars) ? chars.slice() : Array.from(String(chars || ''));\n if (!safeChars.length) {\n return '-';\n }\n\n if (estimateTextWidth(safeChars.join(''), fontSize) <= maxWidth) {\n return safeChars.join('').trim() || '-';\n }\n\n while (safeChars.length > 1 && estimateTextWidth(`${safeChars.join('').trimEnd()}\u2026`, fontSize) > maxWidth) {\n safeChars.pop();\n }\n\n return `${safeChars.join('').trimEnd()}\u2026` || '\u2026';\n};\n\nconst splitTextToLines = (value, maxWidth, fontSize, maxLines = 2) => {\n const chars = Array.from(normalizeWhitespace(value) || '-');\n const safeMaxWidth = Math.max(18, maxWidth - DEFAULT_STRIP_TEXT_WIDTH_SAFETY);\n if (!chars.length) {\n return { lines: ['-'], truncated: false };\n }\n\n const lines = [];\n let cursor = 0;\n let truncated = false;\n\n while (cursor < chars.length && lines.length < maxLines) {\n while (cursor < chars.length && chars[cursor] === ' ') {\n cursor += 1;\n }\n\n if (cursor >= chars.length) {\n break;\n }\n\n const isLastLine = lines.length === maxLines - 1;\n const lineChars = [];\n\n while (cursor < chars.length) {\n const nextChars = [...lineChars, chars[cursor]];\n const remaining = cursor < chars.length - 1;\n const previewText = nextChars.join('') + (isLastLine && remaining ? '\u2026' : '');\n\n if (estimateTextWidth(previewText, fontSize) <= safeMaxWidth || lineChars.length === 0) {\n lineChars.push(chars[cursor]);\n cursor += 1;\n continue;\n }\n\n break;\n }\n\n while (cursor < chars.length && chars[cursor] === ' ') {\n cursor += 1;\n }\n\n if (isLastLine && cursor < chars.length) {\n lines.push(fitTextWithEllipsis([...lineChars, ...chars.slice(cursor)], safeMaxWidth, fontSize));\n truncated = true;\n cursor = chars.length;\n continue;\n }\n\n lines.push(lineChars.join('').trim() || '-');\n }\n\n return {\n lines: lines.length > 0 ? lines : ['-'],\n truncated,\n };\n};\n\nconst resolveMetadataMinValueWidth = (segment) => {\n switch (segment?.kind) {\n case 'time':\n return Math.max(148, estimateTextWidth('2026-04-23 21:27:16 UTC+8', DEFAULT_STRIP_VALUE_FONT_SIZE) + 8);\n case 'ip':\n return Math.max(108, estimateTextWidth('255.255.255.255', DEFAULT_STRIP_VALUE_FONT_SIZE) + 8);\n case 'location':\n return 76;\n default:\n return 56;\n }\n};\n\nconst buildMetadataRowLayout = (segments, contentWidth) => {\n const safeSegments = Array.isArray(segments) ? segments.filter(Boolean) : [];\n const naturalRow = buildStripRowLayout(safeSegments);\n\n if (!safeSegments.length || naturalRow.totalWidth <= contentWidth) {\n return naturalRow;\n }\n\n const sectionGap = naturalRow.sectionGap;\n const totalLabelWidth = naturalRow.layouts.reduce((sum, segment) => sum + segment.labelWidth, 0);\n const availableValueWidth = Math.max(\n 72,\n Math.floor(contentWidth - totalLabelWidth - Math.max(0, safeSegments.length - 1) * sectionGap),\n );\n const minValueWidths = naturalRow.layouts.map((segment) => resolveMetadataMinValueWidth(segment));\n const naturalValueWidths = naturalRow.layouts.map((segment) => segment.valueWidth);\n const valueWidths = naturalValueWidths.slice();\n let overflow = naturalRow.totalWidth - contentWidth;\n const shrinkOrder = ['location', 'ip', 'time'];\n\n shrinkOrder.forEach((kind) => {\n if (overflow <= 0) return;\n\n naturalRow.layouts.forEach((segment, index) => {\n if (overflow <= 0 || segment.kind !== kind) return;\n const minWidth = minValueWidths[index];\n const reducible = Math.max(0, valueWidths[index] - minWidth);\n if (!reducible) return;\n const reduction = Math.min(reducible, overflow);\n valueWidths[index] -= reduction;\n overflow -= reduction;\n });\n });\n\n if (overflow > 0) {\n const minTotalWidth = minValueWidths.reduce((sum, width) => sum + width, 0);\n if (minTotalWidth > availableValueWidth) {\n const flexibleIndexes = naturalRow.layouts\n .map((segment, index) => ({ segment, index }))\n .filter(({ segment }) => segment.kind !== 'time');\n let extraOverflow = minTotalWidth - availableValueWidth;\n\n flexibleIndexes.forEach(({ index }) => {\n if (extraOverflow <= 0) return;\n const minFloor = 40;\n const reducible = Math.max(0, minValueWidths[index] - minFloor);\n if (!reducible) return;\n const reduction = Math.min(reducible, extraOverflow);\n valueWidths[index] -= reduction;\n extraOverflow -= reduction;\n });\n }\n }\n\n return buildStripRowLayout(safeSegments, {\n valueMaxWidths: valueWidths,\n });\n};\n\nconst buildPromptWrapLayout = (segment, contentWidth) => {\n const label = normalizeWhitespace(segment?.label || 'Prompt') || 'Prompt';\n const rawValue = normalizeWhitespace(segment?.rawValue || segment?.value || '-') || '-';\n const labelFontSize = DEFAULT_STRIP_LABEL_FONT_SIZE;\n const valueFontSize = DEFAULT_STRIP_VALUE_FONT_SIZE;\n const labelWidth = Math.max(\n DEFAULT_STRIP_LABEL_WIDTH,\n estimateTextWidth(label, labelFontSize) + DEFAULT_STRIP_LABEL_PADDING,\n );\n const safeTotalWidth = Math.max(labelWidth + 56, Number(contentWidth) || 0);\n const valueWidth = Math.max(\n 56,\n safeTotalWidth - labelWidth - DEFAULT_STRIP_CONTENT_SAFE_PADDING_X,\n );\n const result = splitTextToLines(rawValue, valueWidth, valueFontSize, DEFAULT_STRIP_PROMPT_MAX_LINES);\n const lineHeight = Math.max(18, Math.round(valueFontSize * DEFAULT_STRIP_LINE_HEIGHT_RATIO));\n const lineWidths = result.lines.map((line) => estimateTextWidth(line, valueFontSize) + DEFAULT_STRIP_VALUE_PADDING);\n const measuredValueWidth = Math.min(\n valueWidth,\n Math.max(56, ...lineWidths),\n );\n const rowHeight = Math.round(Math.max(labelFontSize, valueFontSize) * 1.42);\n\n return {\n mode: result.lines.length === 1 ? 'single' : 'wrapped',\n label,\n rawValue,\n labelFontSize,\n labelWidth,\n valueFontSize,\n valueWidth,\n lines: result.lines,\n truncated: result.truncated,\n lineHeight,\n blockHeight: result.lines.length === 1\n ? rowHeight\n : Math.max(lineHeight, result.lines.length * lineHeight),\n totalWidth: labelWidth + measuredValueWidth,\n };\n};\n\nconst buildStripLayout = (segments, contentWidth) => {\n const safeSegments = Array.isArray(segments) ? segments.filter(Boolean) : [];\n const promptSegment = safeSegments.find((segment) => segment.kind === 'prompt') || safeSegments[0] || null;\n const metadataSegments = safeSegments.filter((segment) => segment !== promptSegment);\n const zoneGap = DEFAULT_STRIP_ZONE_GAP;\n let metadataRow = buildMetadataRowLayout(\n metadataSegments,\n Math.max(220, contentWidth),\n );\n let metadataStartX = Math.max(0, contentWidth - (metadataRow?.totalWidth || 0));\n let promptAvailableWidth = Math.max(\n 220,\n metadataStartX - zoneGap - DEFAULT_STRIP_PROMPT_TRAILING_PADDING,\n );\n\n if (promptAvailableWidth < DEFAULT_STRIP_PROMPT_MIN_TOTAL_WIDTH && metadataSegments.length > 0) {\n const tighterMetadataWidth = Math.max(180, contentWidth - DEFAULT_STRIP_PROMPT_MIN_TOTAL_WIDTH - zoneGap);\n metadataRow = buildMetadataRowLayout(metadataSegments, tighterMetadataWidth);\n metadataStartX = Math.max(0, contentWidth - (metadataRow?.totalWidth || 0));\n promptAvailableWidth = Math.max(\n 220,\n metadataStartX - zoneGap - DEFAULT_STRIP_PROMPT_TRAILING_PADDING,\n );\n }\n\n const preferredPromptWidth = Math.min(\n promptAvailableWidth,\n Math.max(280, Math.round(contentWidth * DEFAULT_STRIP_PROMPT_PREFERRED_WIDTH_RATIO)),\n );\n let promptRow = buildPromptWrapLayout(promptSegment, preferredPromptWidth);\n\n if (promptRow?.truncated && promptAvailableWidth > preferredPromptWidth + 24) {\n promptRow = buildPromptWrapLayout(promptSegment, promptAvailableWidth);\n }\n\n const contentHeight = Math.max(\n promptRow?.blockHeight || 0,\n metadataRow?.rowHeight || 0,\n 24,\n );\n const verticalPadding = contentHeight > (metadataRow?.rowHeight || 0) ? 18 : 16;\n const stripHeight = Math.max(\n contentHeight > (metadataRow?.rowHeight || 0)\n ? DEFAULT_STRIP_WRAPPED_MIN_HEIGHT\n : DEFAULT_STRIP_ONE_LINE_HEIGHT,\n Math.ceil(contentHeight + verticalPadding * 2),\n );\n\n return {\n mode: 'zoned',\n height: stripHeight,\n contentHeight,\n promptRow,\n promptStartX: 0,\n metadataRow,\n metadataStartX,\n };\n};\n\nconst renderStripRow = (row, options = {}) => {\n const startX = Number(options.startX) || 0;\n const centerY = Number(options.centerY) || 0;\n const fontFamily = String(options.fontFamily || '');\n const showDividers = options.showDividers !== false;\n const layouts = Array.isArray(row?.layouts) ? row.layouts : [];\n\n if (!layouts.length) {\n return '';\n }\n\n const rowHeight = Math.max(18, Number(row?.rowHeight) || 18);\n const dividerHalfHeight = Math.max(12, Math.round(rowHeight * 0.56));\n const sectionGap = Math.max(0, Number(row?.sectionGap) || 0);\n const svgSegments = [];\n let currentX = startX;\n\n layouts.forEach((segment, index) => {\n const label = escapeXml(segment.label || '');\n const value = escapeXml(segment.renderValue || '-');\n const labelX = currentX;\n const valueX = currentX + segment.labelWidth;\n\n svgSegments.push(`\n <text\n x=\"${labelX}\"\n y=\"${centerY}\"\n fill=\"#111111\"\n fill-opacity=\"0.54\"\n font-family=\"${fontFamily}\"\n font-size=\"${segment.labelFontSize}\"\n font-weight=\"650\"\n dominant-baseline=\"middle\"\n >${label}</text>\n <text\n x=\"${valueX}\"\n y=\"${centerY}\"\n fill=\"#111111\"\n font-family=\"${fontFamily}\"\n font-size=\"${segment.valueFontSize}\"\n font-weight=\"${segment.kind === 'prompt' ? 760 : 710}\"\n dominant-baseline=\"middle\"\n >${value}</text>\n `);\n\n currentX += segment.segmentWidth;\n\n if (showDividers && index < layouts.length - 1) {\n const lineX = currentX + Math.round(sectionGap / 2);\n svgSegments.push(`\n <line\n x1=\"${lineX}\"\n y1=\"${centerY - dividerHalfHeight}\"\n x2=\"${lineX}\"\n y2=\"${centerY + dividerHalfHeight}\"\n stroke=\"#94a3b8\"\n stroke-opacity=\"0.34\"\n stroke-width=\"1\"\n />\n `);\n currentX += sectionGap;\n }\n });\n\n return svgSegments.join('');\n};\n\nconst renderStripDivider = (x, centerY, height) => {\n const safeX = Number(x) || 0;\n const safeCenterY = Number(centerY) || 0;\n const safeHeight = Math.max(18, Number(height) || 18);\n const halfHeight = Math.max(12, Math.round(safeHeight * 0.56));\n\n return `\n <line\n x1=\"${safeX}\"\n y1=\"${safeCenterY - halfHeight}\"\n x2=\"${safeX}\"\n y2=\"${safeCenterY + halfHeight}\"\n stroke=\"#94a3b8\"\n stroke-opacity=\"0.34\"\n stroke-width=\"1\"\n />\n `;\n};\n\nconst renderMobileStripText = ({\n label,\n value,\n labelX,\n valueX,\n y,\n valueWidth,\n fontFamily,\n}) => {\n const safeLabel = normalizeWhitespace(label) || '-';\n const safeValue = fitTextWithEllipsis(\n Array.from(normalizeWhitespace(value) || '-'),\n Math.max(18, valueWidth - MOBILE_STRIP_VALUE_WIDTH_SAFETY),\n MOBILE_STRIP_VALUE_FONT_SIZE,\n );\n\n return `\n <text\n x=\"${labelX}\"\n y=\"${y}\"\n fill=\"#111111\"\n fill-opacity=\"0.54\"\n font-family=\"${fontFamily}\"\n font-size=\"${MOBILE_STRIP_LABEL_FONT_SIZE}\"\n font-weight=\"650\"\n dominant-baseline=\"middle\"\n >${escapeXml(safeLabel)}</text>\n <text\n x=\"${valueX}\"\n y=\"${y}\"\n fill=\"#111111\"\n font-family=\"${fontFamily}\"\n font-size=\"${MOBILE_STRIP_VALUE_FONT_SIZE}\"\n font-weight=\"730\"\n dominant-baseline=\"middle\"\n >${escapeXml(safeValue)}</text>\n `;\n};\n\nconst renderMobileStrip = ({ meta, width, baseHeight, fontFamily }) => {\n const stripHeight = MOBILE_STRIP_HEIGHT;\n const stripY = baseHeight;\n const contentX = MOBILE_STRIP_PADDING_X;\n const contentWidth = Math.max(1, width - MOBILE_STRIP_PADDING_X * 2);\n const prompt = findStripSegment(meta.stripSegments, 'prompt');\n const time = findStripSegment(meta.stripSegments, 'time');\n const location = findStripSegment(meta.stripSegments, 'location');\n const ip = findStripSegment(meta.stripSegments, 'ip');\n // \u79FB\u52A8\u7AEF\u4FE1\u606F\u6761\u8FFD\u52A0\u5728\u539F\u56FE\u4E0B\u65B9\uFF0C\u907F\u514D\u8986\u76D6\u9875\u9762\u5E95\u90E8\u8F93\u5165\u533A\u3002\n const row1Y = stripY + MOBILE_STRIP_PADDING_Y + MOBILE_STRIP_ROW_HEIGHT / 2;\n const row2Y = row1Y + MOBILE_STRIP_ROW_HEIGHT + MOBILE_STRIP_ROW_GAP;\n const rightColumnX = Math.min(\n width - MOBILE_STRIP_PADDING_X - 112,\n Math.max(\n contentX + 200,\n contentX + Math.round(contentWidth * 0.62),\n ),\n );\n const leftValueX = contentX + 48;\n const rightValueX = rightColumnX + 28;\n const promptValueWidth = Math.max(\n 28,\n rightColumnX - leftValueX - MOBILE_STRIP_META_GAP,\n );\n const timeValueWidth = Math.max(\n 28,\n rightColumnX - leftValueX - MOBILE_STRIP_META_GAP,\n );\n const locValueWidth = Math.max(\n 28,\n width - MOBILE_STRIP_PADDING_X - rightValueX,\n );\n const ipValueWidth = Math.max(\n 28,\n width - MOBILE_STRIP_PADDING_X - rightValueX,\n );\n\n return `\n <g id=\"strip\">\n <rect x=\"0\" y=\"${stripY}\" width=\"${width}\" height=\"${stripHeight}\" fill=\"#ffffff\" fill-opacity=\"0.985\" />\n <rect x=\"0\" y=\"${stripY}\" width=\"${width}\" height=\"1\" fill=\"#111111\" fill-opacity=\"0.10\" />\n <rect x=\"${contentX}\" y=\"${stripY}\" width=\"${Math.max(96, Math.round(width * 0.34))}\" height=\"2\" fill=\"url(#stripAccent)\" />\n ${renderMobileStripText({\n label: 'Prompt',\n value: prompt.rawValue || prompt.value || '-',\n labelX: contentX,\n valueX: leftValueX,\n y: row1Y,\n valueWidth: promptValueWidth,\n fontFamily,\n })}\n ${renderMobileStripText({\n label: 'Loc',\n value: location.rawValue || location.value || '-',\n labelX: rightColumnX,\n valueX: rightValueX,\n y: row1Y,\n valueWidth: locValueWidth,\n fontFamily,\n })}\n ${renderMobileStripText({\n label: 'Time',\n value: time.rawValue || time.value || '-',\n labelX: contentX,\n valueX: leftValueX,\n y: row2Y,\n valueWidth: timeValueWidth,\n fontFamily,\n })}\n ${renderMobileStripText({\n label: 'IP',\n value: ip.rawValue || ip.value || '-',\n labelX: rightColumnX,\n valueX: rightValueX,\n y: row2Y,\n valueWidth: ipValueWidth,\n fontFamily,\n })}\n </g>\n `;\n};\n\nconst buildWatermarkifySvg = (meta, imageWidth, imageHeight) => {\n const hasWatermark = meta?.watermark?.enabled !== false && normalizeText(meta?.watermarkText);\n const hasStrip = meta?.strip?.enabled !== false && Array.isArray(meta?.stripSegments) && meta.stripSegments.length > 0;\n\n if (!hasWatermark && !hasStrip) {\n return '';\n }\n\n const width = Math.max(1, Number(imageWidth) || 1);\n const baseHeight = Math.max(1, Number(imageHeight) || 1);\n const canvasHeight = normalizeDevice(meta.device) === Device.Mobile && hasStrip\n ? baseHeight + MOBILE_STRIP_HEIGHT\n : baseHeight;\n const fontFamily = escapeXml(buildFontFamily());\n const parts = [];\n\n if (hasWatermark) {\n const stampText = escapeXml(normalizeText(meta.watermarkText));\n const cellWidth = Math.max(680, Number(meta.watermark?.cellWidth) || DEFAULT_WATERMARK_CELL_WIDTH);\n const cellHeight = Math.max(260, Number(meta.watermark?.cellHeight) || DEFAULT_WATERMARK_CELL_HEIGHT);\n const rotateDeg = Number(meta.watermark?.rotateDeg) || DEFAULT_WATERMARK_ROTATE_DEG;\n const opacity = Math.min(0.22, Math.max(0.05, Number(meta.watermark?.opacity) || DEFAULT_WATERMARK_OPACITY));\n const rowOffset = Math.round(cellWidth * 0.24);\n const startX = -Math.round(cellWidth * 0.16);\n const startY = -Math.round(cellHeight * 0.12);\n const cols = Math.ceil((width + cellWidth * 1.1) / cellWidth) + 1;\n const rows = Math.ceil((baseHeight + cellHeight * 0.9) / cellHeight) + 1;\n const stamps = [];\n\n for (let row = 0; row < rows; row += 1) {\n for (let col = 0; col < cols; col += 1) {\n const x = startX + col * cellWidth + (row % 2 ? rowOffset : 0);\n const y = startY + row * cellHeight + (row % 2 ? 14 : -8);\n stamps.push(`\n <g transform=\"translate(${x} ${y}) rotate(${rotateDeg})\">\n <text\n x=\"0\"\n y=\"0\"\n fill=\"#111111\"\n fill-opacity=\"${opacity}\"\n stroke=\"#ffffff\"\n stroke-opacity=\"0.12\"\n stroke-width=\"0.22\"\n font-family=\"${fontFamily}\"\n font-size=\"19\"\n font-weight=\"720\"\n letter-spacing=\"0.6\"\n >${stampText}</text>\n </g>\n `);\n }\n }\n\n parts.push(`<g id=\"watermarks\">${stamps.join('')}</g>`);\n }\n\n if (hasStrip) {\n if (normalizeDevice(meta.device) === Device.Mobile) {\n parts.push(renderMobileStrip({\n meta,\n width,\n baseHeight,\n fontFamily,\n }));\n return `\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${canvasHeight}\" viewBox=\"0 0 ${width} ${canvasHeight}\">\n <defs>\n <linearGradient id=\"stripAccent\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\">\n <stop offset=\"0%\" stop-color=\"#111111\" stop-opacity=\"0.98\" />\n <stop offset=\"24%\" stop-color=\"#111111\" stop-opacity=\"0.68\" />\n <stop offset=\"58%\" stop-color=\"#111111\" stop-opacity=\"0.08\" />\n <stop offset=\"100%\" stop-color=\"#111111\" stop-opacity=\"0\" />\n </linearGradient>\n </defs>\n ${parts.join('')}\n </svg>\n `;\n }\n\n const logoSize = 28;\n const logoX = DEFAULT_STRIP_PADDING_LEFT;\n const contentStartX = logoX + logoSize + DEFAULT_STRIP_GAP;\n const contentWidth = width - contentStartX - DEFAULT_STRIP_PADDING_RIGHT;\n const stripLayout = buildStripLayout(meta.stripSegments, contentWidth);\n const stripHeight = stripLayout.height;\n const stripY = baseHeight - stripHeight;\n const logoY = Number((stripY + ((stripHeight - logoSize) / 2)).toFixed(2));\n let stripContentSvg = '';\n const centerY = stripY + stripHeight / 2 + 1;\n const promptRow = stripLayout.promptRow;\n const metadataRow = stripLayout.metadataRow;\n const promptParts = [];\n const hasPrompt = Boolean(promptRow?.label);\n const hasMetadata = Array.isArray(metadataRow?.layouts) && metadataRow.layouts.length > 0;\n const zoneDividerX = hasPrompt && hasMetadata\n ? contentStartX + stripLayout.metadataStartX - (DEFAULT_STRIP_ZONE_GAP / 2)\n : null;\n\n if (promptRow?.mode === 'single') {\n promptParts.push(renderStripRow({\n layouts: [\n {\n kind: 'prompt',\n label: promptRow.label,\n renderValue: promptRow.lines[0] || '-',\n labelFontSize: promptRow.labelFontSize,\n valueFontSize: promptRow.valueFontSize,\n labelWidth: promptRow.labelWidth,\n segmentWidth: promptRow.labelWidth + promptRow.valueWidth,\n },\n ],\n sectionGap: 0,\n rowHeight: promptRow.blockHeight,\n }, {\n startX: contentStartX + stripLayout.promptStartX,\n centerY,\n fontFamily,\n showDividers: false,\n }));\n } else if (promptRow) {\n const promptStartX = contentStartX + stripLayout.promptStartX;\n const labelX = promptStartX;\n const valueX = promptStartX + promptRow.labelWidth;\n const blockTop = centerY - (promptRow.blockHeight / 2);\n const labelY = centerY;\n\n promptParts.push(`\n <text\n x=\"${labelX}\"\n y=\"${labelY}\"\n fill=\"#111111\"\n fill-opacity=\"0.54\"\n font-family=\"${fontFamily}\"\n font-size=\"${promptRow.labelFontSize}\"\n font-weight=\"650\"\n dominant-baseline=\"middle\"\n >${escapeXml(promptRow.label)}</text>\n `);\n\n promptRow.lines.forEach((line, index) => {\n const lineY = blockTop + (index * promptRow.lineHeight) + (promptRow.lineHeight / 2);\n promptParts.push(`\n <text\n x=\"${valueX}\"\n y=\"${lineY}\"\n fill=\"#111111\"\n font-family=\"${fontFamily}\"\n font-size=\"${promptRow.valueFontSize}\"\n font-weight=\"760\"\n dominant-baseline=\"middle\"\n >${escapeXml(line)}</text>\n `);\n });\n }\n\n stripContentSvg = [\n promptParts.join(''),\n zoneDividerX == null\n ? ''\n : renderStripDivider(\n zoneDividerX,\n centerY,\n Math.max(promptRow?.blockHeight || 0, metadataRow?.rowHeight || 0),\n ),\n renderStripRow(metadataRow, {\n startX: contentStartX + stripLayout.metadataStartX,\n centerY,\n fontFamily,\n showDividers: true,\n }),\n ].join('');\n\n parts.push(`\n <g id=\"strip\">\n <rect x=\"0\" y=\"${stripY}\" width=\"${width}\" height=\"${stripHeight}\" fill=\"#ffffff\" fill-opacity=\"0.985\" />\n <rect x=\"0\" y=\"${stripY}\" width=\"${width}\" height=\"1\" fill=\"#111111\" fill-opacity=\"0.10\" />\n <rect x=\"${DEFAULT_STRIP_PADDING_LEFT}\" y=\"${stripY}\" width=\"${Math.max(120, Math.round(width * 0.42))}\" height=\"2\" fill=\"url(#stripAccent)\" />\n ${meta.stripLogoSrc ? `<image href=\"${escapeXml(meta.stripLogoSrc)}\" x=\"${logoX}\" y=\"${logoY}\" width=\"${logoSize}\" height=\"${logoSize}\" />` : ''}\n ${stripContentSvg}\n </g>\n `);\n }\n\n return `\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${canvasHeight}\" viewBox=\"0 0 ${width} ${canvasHeight}\">\n <defs>\n <linearGradient id=\"stripAccent\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\">\n <stop offset=\"0%\" stop-color=\"#111111\" stop-opacity=\"0.98\" />\n <stop offset=\"24%\" stop-color=\"#111111\" stop-opacity=\"0.68\" />\n <stop offset=\"58%\" stop-color=\"#111111\" stop-opacity=\"0.08\" />\n <stop offset=\"100%\" stop-color=\"#111111\" stop-opacity=\"0\" />\n </linearGradient>\n </defs>\n ${parts.join('')}\n </svg>\n `;\n};\n\nexport const watermarkifyScreenshotBuffer = async (buffer, meta, page = null, options = {}) => {\n const hasWatermark = meta?.watermark?.enabled !== false && normalizeText(meta?.watermarkText);\n const hasStrip = meta?.strip?.enabled !== false && Array.isArray(meta?.stripSegments) && meta.stripSegments.length > 0;\n\n if (!Buffer.isBuffer(buffer) || !meta || (!hasWatermark && !hasStrip)) {\n return buffer;\n }\n\n const imageInfo = readImageInfo(buffer);\n if (!imageInfo.width || !imageInfo.height || !imageInfo.mimeType) {\n logger.warning('watermarkify \u8DF3\u8FC7: \u65E0\u6CD5\u89E3\u6790\u622A\u56FE\u5C3A\u5BF8\u6216\u683C\u5F0F');\n return buffer;\n }\n\n const isMobileStrip = normalizeDevice(meta.device) === Device.Mobile && hasStrip;\n const outputImageInfo = isMobileStrip\n ? {\n ...imageInfo,\n imageHeight: imageInfo.height,\n height: imageInfo.height + MOBILE_STRIP_HEIGHT,\n }\n : imageInfo;\n const overlaySvg = buildWatermarkifySvg(meta, imageInfo.width, imageInfo.height);\n if (!overlaySvg) {\n return buffer;\n }\n\n return await composeScreenshotBufferWithBrowser(page, buffer, overlaySvg, outputImageInfo, options);\n};\n", "import { Jimp, JimpMime, ResizeStrategy } from 'jimp';\nimport { createInternalLogger } from './logger.js';\n\nconst logger = createInternalLogger('Compression');\n\nconst DEFAULT_SCREENSHOT_MAX_BYTES = 5 * 1024 * 1024;\nconst DEFAULT_SCREENSHOT_OUTPUT_TYPE = 'jpeg';\nconst DEFAULT_SCREENSHOT_QUALITY = 0.72;\nconst DEFAULT_SCREENSHOT_MIN_QUALITY = 0.38;\nconst DEFAULT_SCREENSHOT_MIN_SCALE = 0.25;\nconst SUPPORTED_SCREENSHOT_OUTPUT_TYPES = new Set(['jpeg']);\n\nconst toPositiveInteger = (value, fallback = 0) => {\n const number = Math.floor(Number(value) || 0);\n return number > 0 ? number : fallback;\n};\n\nconst normalizeQuality = (value, fallback) => {\n const number = Number(value);\n if (!Number.isFinite(number) || number <= 0) return fallback;\n const normalized = number > 1 ? number / 100 : number;\n return Math.min(1, Math.max(0.01, normalized));\n};\n\nconst normalizeScale = (value, fallback) => {\n const number = Number(value);\n if (!Number.isFinite(number) || number <= 0) return fallback;\n return Math.min(1, Math.max(0.05, number));\n};\n\nconst normalizeScreenshotOutputType = (value) => {\n const raw = String(value || DEFAULT_SCREENSHOT_OUTPUT_TYPE).trim().toLowerCase();\n const normalized = raw === 'jpg' ? 'jpeg' : raw;\n return SUPPORTED_SCREENSHOT_OUTPUT_TYPES.has(normalized)\n ? normalized\n : DEFAULT_SCREENSHOT_OUTPUT_TYPE;\n};\n\nconst getBase64BytesFromBuffer = (buffer) => Math.ceil(buffer.length / 3) * 4;\n\nconst toJpegQuality = (value) => Math.round(normalizeQuality(value, DEFAULT_SCREENSHOT_QUALITY) * 100);\n\nexport const resolveImageCompression = (options = {}) => {\n const explicit = options.compression;\n const source = explicit && typeof explicit === 'object' && !Array.isArray(explicit)\n ? explicit\n : {};\n\n const enabled = explicit !== false\n && source.enabled !== false\n && options.compress !== false;\n\n const quality = normalizeQuality(\n source.quality ?? options.quality,\n DEFAULT_SCREENSHOT_QUALITY,\n );\n const minQuality = Math.min(\n quality,\n normalizeQuality(source.minQuality ?? options.minQuality, DEFAULT_SCREENSHOT_MIN_QUALITY),\n );\n\n return {\n enabled,\n maxBytes: toPositiveInteger(\n source.maxBytes\n ?? source.maxBase64Bytes\n ?? options.maxBytes\n ?? options.maxBase64Bytes,\n DEFAULT_SCREENSHOT_MAX_BYTES,\n ),\n outputType: normalizeScreenshotOutputType(\n source.type\n ?? source.outputType\n ?? options.type\n ?? options.outputType,\n ),\n quality,\n minQuality,\n minScale: normalizeScale(\n source.minScale ?? options.minScale,\n DEFAULT_SCREENSHOT_MIN_SCALE,\n ),\n };\n};\n\nconst encodeJpeg = async (sourceImage, compression, scale, quality) => {\n const width = Math.max(1, Math.round(sourceImage.bitmap.width * scale));\n const height = Math.max(1, Math.round(sourceImage.bitmap.height * scale));\n const image = sourceImage.clone();\n\n if (scale < 0.999) {\n image.resize({\n w: width,\n h: height,\n mode: ResizeStrategy.BILINEAR,\n });\n }\n\n const buffer = await image.getBuffer(JimpMime.jpeg, { quality });\n return {\n buffer,\n bytes: getBase64BytesFromBuffer(buffer),\n width,\n height,\n quality,\n scale: Number(scale.toFixed(3)),\n format: compression.outputType,\n };\n};\n\nconst compressImageBuffer = async (buffer, compression) => {\n const sourceImage = await Jimp.read(buffer);\n const maxQuality = toJpegQuality(compression.quality);\n const minQuality = Math.min(maxQuality, toJpegQuality(compression.minQuality));\n let quality = maxQuality;\n let scale = 1;\n let smallest = null;\n\n for (let attempt = 0; attempt < 12; attempt += 1) {\n const candidate = await encodeJpeg(sourceImage, compression, scale, quality);\n if (!smallest || candidate.bytes < smallest.bytes) {\n smallest = candidate;\n }\n if (candidate.bytes <= compression.maxBytes) {\n return { ...candidate, withinLimit: true };\n }\n\n if (quality > minQuality) {\n quality = Math.max(minQuality, Math.floor(quality * 0.75));\n continue;\n }\n\n const ratio = Math.sqrt(compression.maxBytes / Math.max(1, candidate.bytes));\n const nextScale = Math.max(\n compression.minScale,\n Math.min(scale * 0.85, scale * ratio * 0.94),\n );\n\n if (nextScale >= scale * 0.99 || scale <= compression.minScale) {\n break;\n }\n\n scale = nextScale;\n }\n\n const finalCandidate = await encodeJpeg(sourceImage, compression, compression.minScale, minQuality);\n const fallback = !smallest || finalCandidate.bytes < smallest.bytes\n ? finalCandidate\n : smallest;\n return { ...fallback, withinLimit: fallback.bytes <= compression.maxBytes };\n};\n\nexport const compressImageBufferToBase64 = async (buffer, compression) => {\n const originalBytes = getBase64BytesFromBuffer(buffer);\n if (!compression.enabled || originalBytes <= compression.maxBytes) {\n return buffer.toString('base64');\n }\n\n const result = await compressImageBuffer(buffer, compression).catch((error) => {\n logger.warning(`captureScreen \u538B\u7F29\u5931\u8D25\uFF0C\u8FD4\u56DE\u539F\u56FE: ${error instanceof Error ? error.message : String(error)}`);\n return null;\n });\n\n if (!result?.buffer) {\n return buffer.toString('base64');\n }\n\n if (result.withinLimit) {\n logger.info(\n `captureScreen \u5DF2\u538B\u7F29: ${originalBytes} -> ${result.bytes} bytes, `\n + `format=${result.format}, quality=${result.quality}, scale=${result.scale}, size=${result.width}x${result.height}`,\n );\n } else {\n logger.warning(\n `captureScreen \u538B\u7F29\u540E\u4ECD\u8D85\u8FC7\u76EE\u6807: ${originalBytes} -> ${result.bytes} bytes, `\n + `maxBytes=${compression.maxBytes}, format=${result.format}, quality=${result.quality}, scale=${result.scale}`,\n );\n }\n\n return result.buffer.toString('base64');\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["normalizeShare", "segments", "protocol", "domain", "path", "logger", "hasOwn", "state", "serializeError", "logger", "path", "frameUrls", "state", "runtime", "logger", "state", "serializeError", "Actor", "logger", "normalizeStrategies", "state", "waitFor", "delay", "delay", "logger", "getScrollableRect", "delay", "delay", "delay", "logger", "rect", "beforeTop", "state", "resolveDeviceFromPage", "delay", "Humanize", "logger", "logger", "logger", "normalizeObject", "runtime", "logger", "path", "logger", "path", "callCaptchaRecognitionApi", "logger", "uuidv4", "logger", "uuidv4", "result", "selectorList", "stableTime", "timeout", "callbackName", "normalizeText", "path", "state", "monitorKey", "cleanerName", "mode", "text", "logger", "delay", "logger", "withTimeout", "resolvePageDevice", "logger", "toPositiveInteger", "normalizeQuality", "logger", "DEFAULT_TIMEOUT_MS", "toInline", "segments", "delay", "Humanize"]
|
|
7
7
|
}
|