@skrillex1224/playwright-toolkit 2.0.59 → 2.0.61

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -113,7 +113,10 @@ function createLogger(moduleName) {
113
113
  // src/errors.js
114
114
  var errors_exports = {};
115
115
  __export(errors_exports, {
116
- CrawlerError: () => CrawlerError
116
+ CrawlerError: () => CrawlerError,
117
+ FirstDataTimeoutError: () => FirstDataTimeoutError,
118
+ OverallTimeoutError: () => OverallTimeoutError,
119
+ TimeoutError: () => TimeoutError
117
120
  });
118
121
  var import_serialize_error = require("serialize-error");
119
122
  var CrawlerError = class _CrawlerError extends Error {
@@ -166,6 +169,49 @@ var CrawlerError = class _CrawlerError extends Error {
166
169
  return crawlerError;
167
170
  }
168
171
  };
172
+ var TimeoutError = class _TimeoutError extends Error {
173
+ /**
174
+ * @param {string} message - 错误信息
175
+ * @param {number} timeout - 超时时间(毫秒)
176
+ * @param {Object} [context={}] - 上下文信息
177
+ */
178
+ constructor(message, timeout, context = {}) {
179
+ super(message);
180
+ this.name = "TimeoutError";
181
+ this.timeout = timeout;
182
+ this.context = context;
183
+ this.timestamp = (/* @__PURE__ */ new Date()).toISOString();
184
+ if (Error.captureStackTrace) {
185
+ Error.captureStackTrace(this, _TimeoutError);
186
+ }
187
+ }
188
+ };
189
+ var FirstDataTimeoutError = class _FirstDataTimeoutError extends TimeoutError {
190
+ /**
191
+ * @param {number} timeout - 超时时间(毫秒)
192
+ * @param {Object} [context={}] - 上下文信息
193
+ */
194
+ constructor(timeout, context = {}) {
195
+ super(`\u9996\u6B21\u6570\u636E\u63A5\u6536\u8D85\u65F6 (${timeout}ms)`, timeout, context);
196
+ this.name = "FirstDataTimeoutError";
197
+ if (Error.captureStackTrace) {
198
+ Error.captureStackTrace(this, _FirstDataTimeoutError);
199
+ }
200
+ }
201
+ };
202
+ var OverallTimeoutError = class _OverallTimeoutError extends TimeoutError {
203
+ /**
204
+ * @param {number} timeout - 超时时间(毫秒)
205
+ * @param {Object} [context={}] - 上下文信息
206
+ */
207
+ constructor(timeout, context = {}) {
208
+ super(`\u6574\u4F53\u8BF7\u6C42\u8D85\u65F6 (${timeout}ms)`, timeout, context);
209
+ this.name = "OverallTimeoutError";
210
+ if (Error.captureStackTrace) {
211
+ Error.captureStackTrace(this, _OverallTimeoutError);
212
+ }
213
+ }
214
+ };
169
215
 
170
216
  // src/apify-kit.js
171
217
  var import_serialize_error2 = require("serialize-error");
@@ -1019,7 +1065,7 @@ var Sse = {
1019
1065
  if (line.startsWith("data:")) {
1020
1066
  try {
1021
1067
  const jsonContent = line.substring(5).trim();
1022
- if (jsonContent && typeof jsonContent === "object") {
1068
+ if (jsonContent) {
1023
1069
  events.push(JSON.parse(jsonContent));
1024
1070
  }
1025
1071
  } catch (e) {
@@ -1037,19 +1083,57 @@ var Sse = {
1037
1083
  * @param {object} options
1038
1084
  * @param {function(string, function, string): void} [options.onData] - (textChunk, resolve, accumulatedText) => void
1039
1085
  * @param {function(string, function): void} [options.onEnd] - (fullText, resolve) => void
1040
- * @param {number} [options.timeout=180000] - 超时时间 (ms)
1086
+ * @param {function(Error): void} [options.onTimeout] - (error) => void,error 为 FirstDataTimeoutError 或 OverallTimeoutError
1087
+ * @param {number} [options.firstDataTimeout=90000] - 首次数据接收超时 (ms),默认 90s
1088
+ * @param {number} [options.timeout=180000] - 整体请求超时时间 (ms),默认 180s
1041
1089
  * @returns {Promise<any>} - 返回 Promise,当流满足条件时 resolve
1042
1090
  */
1043
1091
  async intercept(page, urlPattern, options = {}) {
1044
- const { onData, onEnd, timeout = 18e4 } = options;
1092
+ const {
1093
+ onData,
1094
+ onEnd,
1095
+ onTimeout,
1096
+ firstDataTimeout = 9e4,
1097
+ timeout = 18e4
1098
+ } = options;
1045
1099
  let streamResolve, streamReject;
1046
1100
  const capturePromise = new Promise((resolve, reject) => {
1047
1101
  streamResolve = resolve;
1048
1102
  streamReject = reject;
1049
1103
  });
1050
- const timeoutId = setTimeout(() => {
1051
- logger8.debug("intercept", `Intercept promise timeout timer reached (${timeout}ms)`);
1052
- }, timeout + 5e3);
1104
+ let firstDataTimer = null;
1105
+ let overallTimer = null;
1106
+ let hasReceivedFirstData = false;
1107
+ const clearAllTimers = () => {
1108
+ if (firstDataTimer) {
1109
+ clearTimeout(firstDataTimer);
1110
+ firstDataTimer = null;
1111
+ }
1112
+ if (overallTimer) {
1113
+ clearTimeout(overallTimer);
1114
+ overallTimer = null;
1115
+ }
1116
+ };
1117
+ firstDataTimer = setTimeout(() => {
1118
+ if (!hasReceivedFirstData) {
1119
+ const error = new FirstDataTimeoutError(firstDataTimeout);
1120
+ logger8.error(`[Intercept] \u9996\u6B21\u6570\u636E\u63A5\u6536\u8D85\u65F6`);
1121
+ clearAllTimers();
1122
+ if (onTimeout) {
1123
+ onTimeout(error);
1124
+ }
1125
+ streamReject(error);
1126
+ }
1127
+ }, firstDataTimeout);
1128
+ overallTimer = setTimeout(() => {
1129
+ const error = new OverallTimeoutError(timeout);
1130
+ logger8.error(`[Intercept] \u6574\u4F53\u8BF7\u6C42\u8D85\u65F6`);
1131
+ clearAllTimers();
1132
+ if (onTimeout) {
1133
+ onTimeout(error);
1134
+ }
1135
+ streamReject(error);
1136
+ }, timeout);
1053
1137
  await page.route(urlPattern, async (route) => {
1054
1138
  const request = route.request();
1055
1139
  const requestUrl = request.url();
@@ -1072,6 +1156,14 @@ var Sse = {
1072
1156
  const chunks = [];
1073
1157
  let accumulatedText = "";
1074
1158
  res.on("data", (chunk) => {
1159
+ if (!hasReceivedFirstData) {
1160
+ hasReceivedFirstData = true;
1161
+ if (firstDataTimer) {
1162
+ clearTimeout(firstDataTimer);
1163
+ firstDataTimer = null;
1164
+ }
1165
+ logger8.debug("[Intercept] \u5DF2\u63A5\u6536\u9996\u6B21\u6570\u636E");
1166
+ }
1075
1167
  chunks.push(chunk);
1076
1168
  const textChunk = chunk.toString("utf-8");
1077
1169
  accumulatedText += textChunk;
@@ -1086,7 +1178,7 @@ var Sse = {
1086
1178
  });
1087
1179
  res.on("end", () => {
1088
1180
  logger8.info("[MITM] \u4E0A\u6E38\u54CD\u5E94\u7ED3\u675F (Stream End)");
1089
- clearTimeout(timeoutId);
1181
+ clearAllTimers();
1090
1182
  const fullBody = Buffer.concat(chunks);
1091
1183
  if (onEnd) {
1092
1184
  try {
@@ -1106,7 +1198,7 @@ var Sse = {
1106
1198
  });
1107
1199
  req.on("error", (e) => {
1108
1200
  logger8.error(`[MITM] Upstream request error: ${e.message}`);
1109
- clearTimeout(timeoutId);
1201
+ clearAllTimers();
1110
1202
  route.abort();
1111
1203
  streamReject(e);
1112
1204
  });
@@ -1116,7 +1208,7 @@ var Sse = {
1116
1208
  req.end();
1117
1209
  } catch (e) {
1118
1210
  logger8.error(`[MITM] Setup error: ${e.message}`);
1119
- clearTimeout(timeoutId);
1211
+ clearAllTimers();
1120
1212
  route.continue();
1121
1213
  }
1122
1214
  });
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../index.js", "../src/constants.js", "../src/internal/logger.js", "../src/errors.js", "../src/apify-kit.js", "../src/utils.js", "../src/stealth.js", "../src/humanize.js", "../src/launch.js", "../src/live-view.js", "../src/captcha-monitor.js", "../src/sse.js"],
4
- "sourcesContent": ["import { ApifyKit } from './src/apify-kit';\nimport { Utils } from './src/utils';\nimport { Stealth } from './src/stealth';\nimport { Humanize } from './src/humanize';\nimport { Launch } from './src/launch';\nimport { LiveView } from './src/live-view';\nimport { Captcha } from './src/captcha-monitor';\nimport { Sse } from './src/sse';\nimport * as Constants from './src/constants';\nimport * as Errors from './src/errors';\n\n// Unified Entry Point\nexport const usePlaywrightToolKit = () => {\n return {\n ApifyKit,\n Stealth,\n Humanize,\n Launch,\n LiveView,\n Constants,\n Utils,\n Captcha,\n Sse,\n Errors\n };\n};\n", "export const Code = {\n Success: 0,\n UnknownError: -1,\n NotLogin: 30000001,\n Chaptcha: 30000002,\n}\n\nexport const Status = {\n Success: 'SUCCESS',\n Failed: 'FAILED'\n}\n\nexport const FAILED_KEY_SEPARATOR = '::<@>::';\n\nexport const PresetOfLiveViewKey = 'LIVE_VIEW_SCREENSHOT';\n", "import { log } from 'crawlee';\n\n/**\n * \u521B\u5EFA\u6A21\u5757\u7EA7\u65E5\u5FD7\u5668\n * @param {string} moduleName - \u6A21\u5757\u540D\u79F0\uFF0C\u4F8B\u5982 'Humanize', 'Stealth'\n */\nexport function createLogger(moduleName) {\n const prefix = `[${moduleName}]`;\n\n return {\n /**\n * \u65B9\u6CD5\u5F00\u59CB\u65E5\u5FD7\n * @param {string} methodName - \u65B9\u6CD5\u540D\u79F0\n * @param {string} [params] - \u53C2\u6570\u6458\u8981 (\u53EF\u9009)\n */\n start(methodName, params = '') {\n const paramStr = params ? ` (${params})` : '';\n log.info(`${prefix} \uD83D\uDD37 ${methodName} \u5F00\u59CB${paramStr}`);\n },\n\n /**\n * \u65B9\u6CD5\u6210\u529F\u65E5\u5FD7\n * @param {string} methodName - \u65B9\u6CD5\u540D\u79F0\n * @param {string} [result] - \u7ED3\u679C\u6458\u8981 (\u53EF\u9009)\n */\n success(methodName, result = '') {\n const resultStr = result ? ` (${result})` : '';\n log.info(`${prefix} \u2705 ${methodName} \u5B8C\u6210${resultStr}`);\n },\n\n /**\n * \u65B9\u6CD5\u5931\u8D25\u65E5\u5FD7\n * @param {string} methodName - \u65B9\u6CD5\u540D\u79F0\n * @param {Error|string} error - \u9519\u8BEF\u5BF9\u8C61\u6216\u4FE1\u606F\n */\n fail(methodName, error) {\n const message = error instanceof Error ? error.message : error;\n log.error(`${prefix} \u274C ${methodName} \u5931\u8D25: ${message}`);\n },\n\n /**\n * \u8C03\u8BD5\u65E5\u5FD7\n * @param {string} message - \u8BE6\u60C5\n */\n debug(message) {\n log.debug(`${prefix} \uD83D\uDD39 ${message}`);\n },\n\n /**\n * \u8B66\u544A\u65E5\u5FD7\n * @param {string} message - \u8B66\u544A\u4FE1\u606F\n */\n warn(message) {\n log.warning(`${prefix} \u26A0\uFE0F ${message}`);\n },\n\n /**\n * \u666E\u901A\u4FE1\u606F\u65E5\u5FD7\n * @param {string} message - \u4FE1\u606F\n */\n info(message) {\n log.info(`${prefix} \uD83D\uDCD6 ${message}`);\n }\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", "import { Status, Code } from './constants';\nimport { createLogger } from './internal/logger';\nimport { CrawlerError } from './errors';\nimport { serializeError } from 'serialize-error';\n\nconst logger = createLogger('ApifyKit');\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\n return {\n /**\n * \u6838\u5FC3\u5C01\u88C5\uFF1A\u6267\u884C\u6B65\u9AA4\uFF0C\u5E26\u81EA\u52A8\u65E5\u5FD7\u786E\u8BA4\u548C\u5931\u8D25\u622A\u56FE\u5904\u7406\n */\n async runStep(step, page, actionFn, options = {}) {\n const { failActor = true } = options; // \u9ED8\u8BA4\u8C03\u7528 Actor.fail\n\n // log.info(`\uD83D\uDD04 [\u6B63\u5728\u6267\u884C] ${step}...`);\n logger.start(`[Step] ${step}`);\n\n try {\n const result = await actionFn();\n // log.info(`\u2705 [\u6267\u884C\u6210\u529F] ${step}`);\n logger.success(`[Step] ${step}`);\n return result;\n } catch (error) {\n // log.error(`\u274C [\u6267\u884C\u5931\u8D25] ${step}: ${error.message}`);\n logger.fail(`[Step] ${step}`, error);\n\n let base64 = '\u622A\u56FE\u5931\u8D25';\n try {\n if (page) {\n const buffer = await page.screenshot({ fullPage: true, type: 'jpeg', quality: 60 });\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 // \u4F7F\u7528 pushFailed \u65B9\u6CD5\u63A8\u9001\u5931\u8D25\u6570\u636E\uFF08\u79C1\u6709\u4F7F\u7528\uFF09\n await this.pushFailed(error, {\n step,\n page,\n options,\n base64\n });\n\n // \u6839\u636E failActor \u51B3\u5B9A\u662F\u5426\u8C03\u7528 Actor.fail\n if (failActor) {\n await Actor.fail(`Run Step ${step} \u5931\u8D25: ${error.message}`);\n } else {\n // \u4E0D\u8C03\u7528 Actor.fail\uFF0C\u76F4\u63A5\u629B\u51FA\u9519\u8BEF\n throw error;\n }\n }\n },\n\n /**\n * \u5BBD\u677E\u7248runStep\uFF1A\u5931\u8D25\u65F6\u4E0D\u8C03\u7528Actor.fail\uFF0C\u53EA\u629B\u51FA\u5F02\u5E38\n */\n async runStepLoose(step, page, fn) {\n return await this.runStep(step, page, fn, { failActor: false });\n },\n\n /**\n * \u63A8\u9001\u6210\u529F\u6570\u636E\u7684\u901A\u7528\u65B9\u6CD5\n * @param {Object} data - \u8981\u63A8\u9001\u7684\u6570\u636E\u5BF9\u8C61\n */\n async pushSuccess(data) {\n await Actor.pushData({\n // \u56FA\u5B9A\u4E3A0\n code: Code.Success,\n status: Status.Success,\n timestamp: new Date().toISOString(),\n data\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\u4F9BrunStep\u5185\u90E8\u4F7F\u7528\uFF09\n * \u81EA\u52A8\u89E3\u6790 CrawlerError \u7684 code \u548C context\n * @param {Error|CrawlerError} error - \u9519\u8BEF\u5BF9\u8C61\n * @param {Object} [meta] - \u989D\u5916\u7684\u6570\u636E\uFF08\u5982failedStep, screenshotBase64\u7B49\uFF09\n * @private\n */\n async pushFailed(error, meta = {}) {\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\n await Actor.pushData({\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 error: serializeError(error),\n meta,\n context,\n timestamp: new Date().toISOString(),\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 { createLogger } from './internal/logger';\nimport delay from 'delay';\n\nconst logger = createLogger('Utils');\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 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\n /**\n * \u5168\u9875\u9762\u6EDA\u52A8\u622A\u56FE\n * \u81EA\u52A8\u68C0\u6D4B\u9875\u9762\u6240\u6709\u53EF\u6EDA\u52A8\u5143\u7D20\uFF0C\u53D6\u6700\u5927\u9AD8\u5EA6\uFF0C\u5F3A\u5236\u5C55\u5F00\u540E\u622A\u56FE\n * \n * @param {import('playwright').Page} page - Playwright page \u5BF9\u8C61\n * @param {Object} [options] - \u914D\u7F6E\u9009\u9879\n * @param {number} [options.buffer] - \u989D\u5916\u7F13\u51B2\u9AD8\u5EA6 (\u9ED8\u8BA4: \u89C6\u53E3\u9AD8\u5EA6\u7684\u4E00\u534A)\n * @returns {Promise<string>} - base64 \u7F16\u7801\u7684 PNG \u56FE\u7247\n */\n async fullPageScreenshot(page, options = {}) {\n logger.start('fullPageScreenshot', 'detecting scrollable elements');\n const originalViewport = page.viewportSize();\n const defaultBuffer = Math.round((originalViewport?.height || 1080) / 2);\n const buffer = options.buffer ?? defaultBuffer;\n\n try {\n // 1. \u81EA\u52A8\u627E\u51FA\u6240\u6709\u53EF\u6EDA\u52A8\u5143\u7D20\u5E76\u5C55\u5F00\uFF0C\u8FD4\u56DE\u6700\u5927\u9AD8\u5EA6\n const maxScrollHeight = await page.evaluate(() => {\n let maxHeight = document.body.scrollHeight;\n\n document.querySelectorAll('*').forEach(el => {\n const style = window.getComputedStyle(el);\n const overflowY = style.overflowY;\n\n if ((overflowY === 'auto' || overflowY === 'scroll') &&\n el.scrollHeight > el.clientHeight) {\n if (el.scrollHeight > maxHeight) {\n maxHeight = el.scrollHeight;\n }\n el.style.overflow = 'visible';\n el.style.height = 'auto';\n el.style.maxHeight = 'none';\n }\n });\n\n return maxHeight;\n });\n\n // 2. \u8C03\u6574\u89C6\u53E3\u9AD8\u5EA6\n await page.setViewportSize({\n width: originalViewport?.width || 1280,\n height: maxScrollHeight + buffer\n });\n\n // \u7B49\u5F85\u6E32\u67D3\n await delay(1000);\n\n // 3. \u622A\u56FE\n const buffer_ = await page.screenshot({\n fullPage: true,\n type: 'png'\n });\n\n logger.success('fullPageScreenshot', `captured ${Math.round(buffer_.length / 1024)} KB`);\n return buffer_.toString('base64');\n } finally {\n if (originalViewport) {\n await page.setViewportSize(originalViewport);\n }\n }\n }\n}\n\n", "import { createLogger } from './internal/logger';\n\nconst logger = createLogger('Stealth');\n\nexport const Stealth = {\n /**\n * \u5173\u952E\u4FEE\u590D\uFF1A\u5C06 Page \u89C6\u53E3\u8C03\u6574\u4E3A\u4E0E\u6D4F\u89C8\u5668\u6307\u7EB9 (window.screen) \u4E00\u81F4\u3002\n * \u9632\u6B62 \"Viewport Mismatch\" \u7C7B\u578B\u7684\u53CD\u722C\u68C0\u6D4B\u3002\n * @param {import('playwright').Page} page \n */\n async syncViewportWithScreen(page) {\n try {\n // \u83B7\u53D6\u6307\u7EB9\u4E2D\u7684\u5C4F\u5E55\u5C3A\u5BF8\n const screen = await page.evaluate(() => ({\n width: window.screen.width,\n height: window.screen.height,\n availWidth: window.screen.availWidth,\n availHeight: window.screen.availHeight,\n }));\n\n // \u8C03\u6574\u89C6\u53E3\n await page.setViewportSize({\n width: screen.width,\n height: screen.height\n });\n\n logger.success('syncViewportWithScreen', `size=${screen.width}x${screen.height}`);\n } catch (e) {\n logger.warn(`syncViewportWithScreen Failed: ${e.message}. Fallback to 1920x1080.`);\n await page.setViewportSize({ width: 1920, height: 1080 });\n }\n },\n\n /**\n * \u786E\u4FDD navigator.webdriver \u9690\u85CF (\u901A\u5E38 Playwright Stealth \u63D2\u4EF6\u5DF2\u5904\u7406\uFF0C\u4F46\u53CC\u91CD\u4FDD\u9669)\n */\n async hideWebdriver(page) {\n await page.addInitScript(() => {\n Object.defineProperty(navigator, 'webdriver', {\n get: () => false,\n });\n });\n logger.success('hideWebdriver');\n },\n\n /**\n * \u901A\u7528\u7684 Playwright \u8D44\u6E90\u62E6\u622A\u5668\uFF0C\u7528\u4E8E\u5C4F\u853D\u4E0D\u5FC5\u8981\u7684\u8D44\u6E90\u4EE5\u52A0\u901F\u52A0\u8F7D\n * @param {import('playwright').Page} page\n * @param {string[]} [resourceTypes] - \u8981\u5C4F\u853D\u7684\u8D44\u6E90\u7C7B\u578B\uFF0C\u9ED8\u8BA4\u4E3A ['font', 'image', 'media']\n */\n async setupBlockingResources(page, resourceTypes = ['font', 'image', 'media']) {\n await page.route('**/*', (route) => {\n const request = route.request();\n const type = request.resourceType();\n if (resourceTypes.includes(type)) {\n return route.abort();\n }\n return route.continue();\n });\n logger.success('setupBlockingResources', `types=[${resourceTypes.join(',')}]`);\n },\n\n /**\n * \u83B7\u53D6\u63A8\u8350\u7684 Stealth \u542F\u52A8\u53C2\u6570\n */\n getStealthLaunchArgs() {\n return [\n '--disable-blink-features=AutomationControlled',\n '--no-sandbox',\n '--disable-setuid-sandbox',\n '--disable-infobars',\n '--window-position=0,0',\n '--ignore-certificate-errors',\n '--disable-web-security',\n // \u6CE8\u610F\uFF1A\u4E0D\u5EFA\u8BAE\u8FD9\u91CC\u5F3A\u5236\u6307\u5B9A window-size\uFF0C\u8BA9 syncViewportWithScreen \u53BB\u52A8\u6001\u8C03\u6574\n // '--window-size=1920,1080' \n ];\n },\n\n /**\n * \u83B7\u53D6\u589E\u5F3A\u7248 Stealth \u542F\u52A8\u53C2\u6570 (\u63A8\u8350\u7528\u4E8E\u9AD8\u98CE\u9669\u53CD\u722C\u573A\u666F)\n * \u5305\u542B\u66F4\u591A\u9488\u5BF9\u81EA\u52A8\u5316\u68C0\u6D4B\u7684\u9632\u62A4\n */\n getAdvancedStealthArgs() {\n return [\n ...this.getStealthLaunchArgs(),\n // \u7981\u7528\u5404\u79CD\u53EF\u80FD\u66B4\u9732\u81EA\u52A8\u5316\u7684\u7279\u5F81\n '--disable-dev-shm-usage',\n '--disable-accelerated-2d-canvas',\n '--disable-gpu-sandbox',\n '--disable-background-networking',\n '--disable-default-apps',\n '--disable-extensions',\n '--disable-sync',\n '--disable-translate',\n '--metrics-recording-only',\n '--mute-audio',\n '--no-first-run',\n // \u6A21\u62DF\u771F\u5B9E\u7528\u6237\u914D\u7F6E\n '--lang=zh-CN,zh',\n ];\n },\n\n /**\n * \u8BBE\u7F6E\u4E2D\u56FD\u65F6\u533A (Asia/Shanghai, UTC+8)\n * \n * \u9632\u6B62\u65F6\u533A\u4E0D\u4E00\u81F4\u7684\u68C0\u6D4B\u3002\u5BF9\u4E8E\u4E2D\u56FD\u5883\u5185\u722C\u53D6\u5F3A\u70C8\u63A8\u8350\u4F7F\u7528\u3002\n * \u5E94\u5728 preNavigationHooks \u6216 BrowserContext \u521B\u5EFA\u540E\u8C03\u7528\u3002\n * \n * @param {import('playwright').BrowserContext} context\n */\n async setChinaTimezone(context) {\n // Playwright \u901A\u8FC7 context \u8BBE\u7F6E\u65F6\u533A\n // \u6CE8\u610F\uFF1A\u8FD9\u9700\u8981\u5728 context \u521B\u5EFA\u65F6\u8BBE\u7F6E\uFF0C\u6216\u8005\u4F7F\u7528 CDP\n // \u8FD9\u91CC\u4F7F\u7528 addInitScript \u6CE8\u5165 Intl \u8986\u76D6\n await context.addInitScript(() => {\n // \u8986\u76D6 Intl.DateTimeFormat \u9ED8\u8BA4\u65F6\u533A\n const originalDateTimeFormat = Intl.DateTimeFormat;\n Intl.DateTimeFormat = function (locales, options) {\n options = options || {};\n options.timeZone = options.timeZone || 'Asia/Shanghai';\n return new originalDateTimeFormat(locales, options);\n };\n Intl.DateTimeFormat.prototype = originalDateTimeFormat.prototype;\n\n // \u8986\u76D6 Date.prototype.getTimezoneOffset \u8FD4\u56DE -480 (UTC+8)\n Date.prototype.getTimezoneOffset = function () {\n return -480; // UTC+8 = -480 \u5206\u949F\n };\n });\n logger.success('setChinaTimezone', 'Asia/Shanghai (UTC+8)');\n }\n}\n", "import delay from 'delay';\nimport { createCursor } from 'ghost-cursor-playwright';\nimport { createLogger } from './internal/logger';\n\nconst logger = createLogger('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 // CSS \u9009\u62E9\u5668\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 // \u5750\u6807\u5BF9\u8C61\n await cursor.actions.move(target);\n } else if (target && typeof target.boundingBox === 'function') {\n // ElementHandle\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 * \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 */\n async humanClick(page, target, options = {}) {\n const cursor = $GetCursor(page);\n\n // \u517C\u5BB9\u5904\u7406\uFF1A\u5982\u679C\u7B2C\u4E8C\u4E2A\u53C2\u6570\u662F\u5BF9\u8C61\u4E14\u6CA1\u6709\u7B2C\u4E09\u4E2A\u53C2\u6570\uFF0C\u8BF4\u660E\u7528\u6237\u7701\u7565\u4E86 target (\u5373 humanClick(page, options))\n // \u4F46\u901A\u5E38\u6211\u4EEC\u4F1A\u9075\u5FAA humanClick(page, null, options) \u7684\u8C03\u7528\u65B9\u5F0F\u3002\n // \u8FD9\u91CC\u7B80\u5355\u5904\u7406\uFF1A\u5982\u679C target \u662F plain object \u4E14 options \u662F\u7A7A\u5BF9\u8C61(\u9ED8\u8BA4\u503C)\uFF0C\u53EF\u80FD\u7528\u6237\u4F20\u9519\u4E86\uFF1F\n // \u8FD8\u662F\u4E25\u683C\u6309\u7167\u6587\u6863\uFF1A\u5982\u679C\u8981\u70B9\u51FB\u5F53\u524D\u4F4D\u7F6E\uFF0C\u4F20 null/undefined\u3002\n\n const { reactionDelay = 250, throwOnMissing = true } = options;\n\n const targetDesc = target == null ? 'Current Position' : (typeof target === 'string' ? target : 'ElementHandle');\n logger.start('humanClick', `target=${targetDesc}`);\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 const box = await element.boundingBox();\n if (!box) {\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 // \u8BA1\u7B97\u5E26\u968F\u673A\u504F\u79FB\u7684\u70B9\u51FB\u4F4D\u7F6E\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 // \u4EBA\u7C7B\u53CD\u5E94\u5EF6\u8FDF (150-400ms \u8303\u56F4)\n await delay(this.jitterMs(reactionDelay, 0.4));\n await cursor.actions.click();\n\n logger.success('humanClick');\n return true;\n } catch (error) {\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 locator.click();\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\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", "// \u96C6\u4E2D\u7BA1\u7406\u542F\u52A8\u914D\u7F6E\uFF0C\u6682\u65F6\u4E3B\u8981\u7531 Stealth \u6A21\u5757\u63D0\u4F9B Args\uFF0C\u8FD9\u91CC\u4F5C\u4E3A\u6269\u5C55\u70B9\nimport { Stealth } from './stealth';\nimport { createLogger } from './internal/logger';\n\nconst logger = createLogger('Launch');\n\nexport const Launch = {\n getLaunchOptions(customArgs = []) {\n return {\n args: [\n ...Stealth.getStealthLaunchArgs(),\n ...customArgs\n ],\n ignoreDefaultArgs: ['--enable-automation'],\n };\n },\n\n /**\n * \u83B7\u53D6\u589E\u5F3A\u7248\u542F\u52A8\u9009\u9879\uFF08\u7528\u4E8E\u9AD8\u98CE\u9669\u53CD\u722C\u573A\u666F\uFF09\n */\n getAdvancedLaunchOptions(customArgs = []) {\n return {\n args: [\n ...Stealth.getAdvancedStealthArgs(),\n ...customArgs\n ],\n ignoreDefaultArgs: ['--enable-automation'],\n };\n },\n\n /**\n * \u63A8\u8350\u7684 Fingerprint Generator \u9009\u9879\n * \u786E\u4FDD\u751F\u6210\u7684\u662F\u684C\u9762\u7AEF\u3001\u8F83\u65B0\u7684 Chrome\uFF0C\u4EE5\u5339\u914D\u6211\u4EEC\u7684\u811A\u672C\u903B\u8F91\n */\n getFingerprintGeneratorOptions() {\n return {\n browsers: [{ name: 'chrome', minVersion: 110 }],\n devices: ['desktop'],\n operatingSystems: ['windows', 'linux'], // \u5305\u542B Linux \u517C\u5BB9\u5BB9\u5668\n };\n },\n\n /**\n * \u521B\u5EFA\u5DF2\u6CE8\u518C Stealth \u63D2\u4EF6\u7684 Chromium \u5B9E\u4F8B\n * \n * \u5C01\u88C5\u4E86 `chromium.use(stealthPlugin())` \u7684\u5E38\u7528\u6A21\u5F0F\n * \n * @example\n * ```javascript\n * import { chromium } from 'playwright-extra';\n * import stealthPlugin from 'puppeteer-extra-plugin-stealth';\n * \n * const stealthChromium = Launch.createStealthChromium(chromium, stealthPlugin);\n * // \u73B0\u5728 stealthChromium \u5DF2\u6CE8\u518C stealth \u63D2\u4EF6\uFF0C\u53EF\u7528\u4E8E launchContext.launcher\n * ```\n * \n * @param {import('playwright-extra').ChromiumExtra} chromium - playwright-extra \u7684 chromium\n * @param {Function} stealthPlugin - puppeteer-extra-plugin-stealth \u7684\u9ED8\u8BA4\u5BFC\u51FA\n * @returns {import('playwright-extra').ChromiumExtra} \u5DF2\u6CE8\u518C stealth \u7684 chromium\n */\n createStealthChromium(chromium, stealthPlugin) {\n chromium.use(stealthPlugin());\n logger.success('createStealthChromium', 'Stealth plugin registered');\n return chromium;\n }\n}\n\n", "import express from 'express';\nimport { Actor } from 'apify';\nimport { PresetOfLiveViewKey } from './constants';\nimport { createLogger } from './internal/logger';\n\nconst logger = createLogger('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 page.screenshot({ 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 { createLogger } from './internal/logger';\n\nconst logger = createLogger('Captcha');\n\n/**\n * \u521B\u5EFA\u9A8C\u8BC1\u7801\u76D1\u63A7\u5668 - \u652F\u6301 DOM \u9009\u62E9\u5668 \u548C URL \u6A21\u5F0F \u4E24\u79CD\u68C0\u6D4B\u65B9\u5F0F\n * \n * \u6CE8\u610F\uFF1A\u76D1\u63A7\u5668\u968F\u9875\u9762\u751F\u547D\u5468\u671F\u81EA\u52A8\u6E05\u7406\uFF0C\u65E0\u9700\u624B\u52A8 cleanup\n * \n * @param {import('playwright').Page} page\n * @param {Object} options\n * @param {string} [options.domSelector] - DOM \u5143\u7D20\u9009\u62E9\u5668 (\u5982 '#captcha_container')\n * @param {string} [options.urlPattern] - URL \u5339\u914D\u6A21\u5F0F (\u5982 '/captcha')\n * @param {Function} options.onDetected - \u68C0\u6D4B\u5230\u9A8C\u8BC1\u7801\u65F6\u7684\u56DE\u8C03 (async function)\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 \u81F3\u5C11\u4E00\u4E2A');\n }\n\n if (!onDetected || typeof onDetected !== 'function') {\n throw new Error('[CaptchaMonitor] onDetected \u5FC5\u987B\u662F\u4E00\u4E2A\u51FD\u6570');\n }\n\n let isHandled = false;\n let frameHandler = null;\n let exposedFunctionName = null;\n\n const triggerDetected = async () => {\n if (isHandled) return;\n isHandled = true;\n await onDetected();\n };\n\n const cleanupFns = [];\n\n // ============================================================\n // \u6A21\u5F0F1: DOM \u76D1\u63A7 (\u4F7F\u7528 MutationObserver)\n // ============================================================\n if (domSelector) {\n // \u751F\u6210\u552F\u4E00\u7684\u51FD\u6570\u540D\u907F\u514D\u51B2\u7A81\n exposedFunctionName = `__c_d_${uuidv4().replace(/-/g, '_')}`;\n // \u751F\u6210\u552F\u4E00\u7684\u6E05\u7406\u51FD\u6570\u540D (\u6302\u8F7D\u5728 window \u4E0A)\n const cleanerName = `__c_cleaner_${uuidv4().replace(/-/g, '_')}`;\n\n // \u66B4\u9732\u56DE\u8C03\u51FD\u6570\u7ED9\u9875\u9762\n page.exposeFunction(exposedFunctionName, triggerDetected).catch(() => {\n // \u5FFD\u7565\u91CD\u590D\u66B4\u9732\u9519\u8BEF\n });\n\n // \u6CE8\u5165 MutationObserver \u76D1\u542C\u811A\u672C\n page.addInitScript(({ selector, callbackName, cleanerName }) => {\n (() => {\n let observer = null;\n\n const checkAndReport = () => {\n const element = document.querySelector(selector);\n if (element) {\n if (observer) {\n observer.disconnect();\n observer = null;\n }\n if (window[callbackName]) {\n window[callbackName]();\n }\n return true;\n }\n return false;\n };\n\n // 1. \u7ACB\u5373\u68C0\u67E5\u4E00\u6B21\n if (checkAndReport()) return;\n\n // 2. \u542F\u52A8 MutationObserver\n observer = new MutationObserver((mutations) => {\n let shouldCheck = false;\n for (const mutation of mutations) {\n if (mutation.addedNodes.length > 0) {\n shouldCheck = true;\n break;\n }\n }\n if (shouldCheck && observer) {\n checkAndReport();\n }\n });\n\n // 3. \u6302\u8F7D\u76D1\u542C\uFF08\u786E\u4FDD DOM \u51C6\u5907\u5C31\u7EEA\uFF09\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 // 4. \u6CE8\u518C\u6E05\u7406\u51FD\u6570\n window[cleanerName] = () => {\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: ${domSelector}`);\n\n // \u6DFB\u52A0\u6E05\u7406\u903B\u8F91\n cleanupFns.push(async () => {\n try {\n // \u8C03\u7528\u9875\u9762\u5185\u7684\u6E05\u7406\u51FD\u6570\n await page.evaluate((name) => {\n if (window[name]) {\n window[name]();\n delete window[name];\n }\n }, cleanerName);\n } catch (e) {\n // \u9875\u9762\u53EF\u80FD\u5DF2\u5173\u95ED\u6216\u8DF3\u8F6C\uFF0C\u5FFD\u7565\u9519\u8BEF\n }\n });\n }\n\n // ============================================================\n // \u6A21\u5F0F2: URL \u76D1\u63A7 (\u76D1\u542C framenavigated)\n // ============================================================\n if (urlPattern) {\n frameHandler = async (frame) => {\n if (frame === page.mainFrame()) {\n const currentUrl = page.url();\n if (currentUrl.includes(urlPattern)) {\n await triggerDetected();\n }\n }\n };\n\n page.on('framenavigated', frameHandler);\n logger.success('useCaptchaMonitor', `URL \u76D1\u63A7\u5DF2\u542F\u7528: ${urlPattern}`);\n\n // \u6DFB\u52A0\u6E05\u7406\u903B\u8F91\n cleanupFns.push(async () => {\n page.off('framenavigated', frameHandler);\n });\n }\n\n // \u8FD4\u56DE\u63A7\u5236\u53E5\u67C4\n return {\n stop: async () => {\n logger.info('useCaptchaMonitor', '\u6B63\u5728\u505C\u6B62\u76D1\u63A7...');\n for (const fn of cleanupFns) {\n await fn();\n }\n isHandled = true; // \u9632\u6B62\u540E\u7EED\u89E6\u53D1\n }\n };\n}\n\n// \u6309\u7167 toolkit \u7EDF\u4E00\u7684\u5BFC\u51FA\u6A21\u5F0F\nexport const Captcha = {\n useCaptchaMonitor\n};\n", "import https from 'https';\nimport { URL } from 'url';\nimport { createLogger } from './internal/logger';\n\nconst logger = createLogger('Sse');\n\nexport const Sse = {\n /**\n * \u89E3\u6790 SSE \u6D41\u6587\u672C\n * \u652F\u6301 `data: {...}` \u548C `data:{...}` \u4E24\u79CD\u683C\u5F0F\n * @param {string} sseStreamText\n * @returns {Array<Object>} events\n */\n parseSseStream(sseStreamText) {\n const events = [];\n const lines = sseStreamText.split('\\n');\n for (const line of lines) {\n // \u517C\u5BB9\u4E24\u79CD\u683C\u5F0F: \"data: {...}\" \u548C \"data:{...}\"\n if (line.startsWith('data:')) {\n try {\n // \u79FB\u9664 \"data:\" \u524D\u7F00\u5E76 trim\uFF0C\u7EDF\u4E00\u5904\u7406\u6709\u65E0\u7A7A\u683C\u7684\u60C5\u51B5\n const jsonContent = line.substring(5).trim();\n if (jsonContent && typeof jsonContent === 'object') {\n events.push(JSON.parse(jsonContent));\n }\n } catch (e) {\n // \u5FFD\u7565\u975E\u6709\u6548 JSON \u7684\u884C\n logger.debug('parseSseStream', `JSON \u89E3\u6790\u5931\u8D25: ${e.message}, line: ${line.substring(0, 100)}...`);\n }\n }\n }\n logger.success('parseSseStream', `\u89E3\u6790\u5B8C\u6210, events \u6570\u91CF: ${events.length}`);\n return events;\n },\n\n /**\n * \u62E6\u622A\u7F51\u7EDC\u8BF7\u6C42\u5E76\u4F7F\u7528 Node.js \u539F\u751F https \u6A21\u5757\u8F6C\u53D1\uFF0C\u4EE5\u89E3\u51B3\u6D41\u5F0F\u6570\u636E\u6355\u83B7\u95EE\u9898\u3002\n * @param {import('playwright').Page} page\n * @param {string|RegExp} urlPattern - \u62E6\u622A\u7684 URL \u6A21\u5F0F\n * @param {object} options\n * @param {function(string, function, string): void} [options.onData] - (textChunk, resolve, accumulatedText) => void\n * @param {function(string, function): void} [options.onEnd] - (fullText, resolve) => void\n * @param {number} [options.timeout=180000] - \u8D85\u65F6\u65F6\u95F4 (ms)\n * @returns {Promise<any>} - \u8FD4\u56DE Promise\uFF0C\u5F53\u6D41\u6EE1\u8DB3\u6761\u4EF6\u65F6 resolve\n */\n async intercept(page, urlPattern, options = {}) {\n const { onData, onEnd, timeout = 180000 } = options;\n\n let streamResolve, streamReject;\n const capturePromise = new Promise((resolve, reject) => {\n streamResolve = resolve;\n streamReject = reject;\n });\n\n // \u8BBE\u7F6E\u5B89\u5168\u8D85\u65F6\uFF0C\u9632\u6B62 Promise \u6C38\u8FDC\u6302\u8D77\n const timeoutId = setTimeout(() => {\n // \u6CE8\u610F\uFF1A\u8FD9\u91CC\u4E0D reject capturePromise\uFF0C\u56E0\u4E3A\u53EF\u80FD\u8BF7\u6C42\u6CA1\u53D1\u751F\uFF0C\u6216\u8005\u7531\u5916\u90E8\u63A7\u5236\u8D85\u65F6\n // \u4F46\u4E3A\u4E86\u907F\u514D\u5185\u5B58\u6CC4\u6F0F\u548C\u672A\u5904\u7406\u72B6\u6001\uFF0C\u53EF\u4EE5\u6253\u5370\u65E5\u5FD7\n logger.debug('intercept', `Intercept promise timeout timer reached (${timeout}ms)`);\n }, timeout + 5000); // \u7A0D\u5FAE\u5BBD\u88D5\u4E00\u70B9\n\n await page.route(urlPattern, async (route) => {\n const request = route.request();\n const requestUrl = request.url();\n logger.info(`[MITM] \u5DF2\u62E6\u622A\u8BF7\u6C42: ${requestUrl}`);\n\n try {\n const headers = await request.allHeaders();\n const postData = request.postData();\n const urlObj = new URL(requestUrl);\n\n // \u5220\u9664 accept-encoding \u5F3A\u5236\u660E\u6587\uFF0C\u5220\u9664 content-length \u8BA9 Node \u91CD\u7B97\n delete headers['accept-encoding'];\n delete headers['content-length'];\n\n const reqOptions = {\n hostname: urlObj.hostname,\n port: 443,\n path: urlObj.pathname + urlObj.search,\n method: request.method(),\n headers: headers,\n timeout: timeout\n };\n\n const req = https.request(reqOptions, (res) => {\n const chunks = [];\n let accumulatedText = \"\";\n\n // A. \u5B9E\u65F6\u6570\u636E\u76D1\u542C\n res.on('data', (chunk) => {\n chunks.push(chunk);\n const textChunk = chunk.toString('utf-8');\n accumulatedText += textChunk;\n\n logger.debug(`[CHUNK] ${textChunk.length} bytes`);\n\n if (onData) {\n try {\n onData(textChunk, streamResolve, accumulatedText);\n } catch (e) {\n logger.error(`onData callback error: ${e.message}`);\n }\n }\n });\n\n // B. \u7ED3\u675F\u76D1\u542C\n res.on('end', () => {\n logger.info('[MITM] \u4E0A\u6E38\u54CD\u5E94\u7ED3\u675F (Stream End)');\n clearTimeout(timeoutId);\n const fullBody = Buffer.concat(chunks);\n\n if (onEnd) {\n try {\n onEnd(accumulatedText, streamResolve);\n } catch (e) {\n logger.error(`onEnd callback error: ${e.message}`);\n }\n } else if (!onData) {\n // \u5982\u679C\u6CA1\u6709\u56DE\u8C03\uFF0C\u9ED8\u8BA4\u7ED3\u675F\u65F6 resolve \u5168\u6587\n streamResolve(accumulatedText);\n }\n\n // \u8FD4\u56DE\u7ED9\u6D4F\u89C8\u5668\n route.fulfill({\n status: res.statusCode,\n headers: res.headers,\n body: fullBody\n }).catch(e => logger.warning(`Route fulfill failed: ${e.message}`));\n });\n });\n\n req.on('error', (e) => {\n logger.error(`[MITM] Upstream request error: ${e.message}`);\n clearTimeout(timeoutId);\n route.abort();\n streamReject(e);\n });\n\n if (postData) {\n req.write(postData);\n }\n req.end();\n\n } catch (e) {\n logger.error(`[MITM] Setup error: ${e.message}`);\n clearTimeout(timeoutId);\n route.continue();\n }\n });\n\n return capturePromise;\n }\n};\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { ApifyKit } from './src/apify-kit';\nimport { Utils } from './src/utils';\nimport { Stealth } from './src/stealth';\nimport { Humanize } from './src/humanize';\nimport { Launch } from './src/launch';\nimport { LiveView } from './src/live-view';\nimport { Captcha } from './src/captcha-monitor';\nimport { Sse } from './src/sse';\nimport * as Constants from './src/constants';\nimport * as Errors from './src/errors';\n\n// Unified Entry Point\nexport const usePlaywrightToolKit = () => {\n return {\n ApifyKit,\n Stealth,\n Humanize,\n Launch,\n LiveView,\n Constants,\n Utils,\n Captcha,\n Sse,\n Errors\n };\n};\n", "export const Code = {\n Success: 0,\n UnknownError: -1,\n NotLogin: 30000001,\n Chaptcha: 30000002,\n}\n\nexport const Status = {\n Success: 'SUCCESS',\n Failed: 'FAILED'\n}\n\nexport const FAILED_KEY_SEPARATOR = '::<@>::';\n\nexport const PresetOfLiveViewKey = 'LIVE_VIEW_SCREENSHOT';\n", "import { log } from 'crawlee';\n\n/**\n * \u521B\u5EFA\u6A21\u5757\u7EA7\u65E5\u5FD7\u5668\n * @param {string} moduleName - \u6A21\u5757\u540D\u79F0\uFF0C\u4F8B\u5982 'Humanize', 'Stealth'\n */\nexport function createLogger(moduleName) {\n const prefix = `[${moduleName}]`;\n\n return {\n /**\n * \u65B9\u6CD5\u5F00\u59CB\u65E5\u5FD7\n * @param {string} methodName - \u65B9\u6CD5\u540D\u79F0\n * @param {string} [params] - \u53C2\u6570\u6458\u8981 (\u53EF\u9009)\n */\n start(methodName, params = '') {\n const paramStr = params ? ` (${params})` : '';\n log.info(`${prefix} \uD83D\uDD37 ${methodName} \u5F00\u59CB${paramStr}`);\n },\n\n /**\n * \u65B9\u6CD5\u6210\u529F\u65E5\u5FD7\n * @param {string} methodName - \u65B9\u6CD5\u540D\u79F0\n * @param {string} [result] - \u7ED3\u679C\u6458\u8981 (\u53EF\u9009)\n */\n success(methodName, result = '') {\n const resultStr = result ? ` (${result})` : '';\n log.info(`${prefix} \u2705 ${methodName} \u5B8C\u6210${resultStr}`);\n },\n\n /**\n * \u65B9\u6CD5\u5931\u8D25\u65E5\u5FD7\n * @param {string} methodName - \u65B9\u6CD5\u540D\u79F0\n * @param {Error|string} error - \u9519\u8BEF\u5BF9\u8C61\u6216\u4FE1\u606F\n */\n fail(methodName, error) {\n const message = error instanceof Error ? error.message : error;\n log.error(`${prefix} \u274C ${methodName} \u5931\u8D25: ${message}`);\n },\n\n /**\n * \u8C03\u8BD5\u65E5\u5FD7\n * @param {string} message - \u8BE6\u60C5\n */\n debug(message) {\n log.debug(`${prefix} \uD83D\uDD39 ${message}`);\n },\n\n /**\n * \u8B66\u544A\u65E5\u5FD7\n * @param {string} message - \u8B66\u544A\u4FE1\u606F\n */\n warn(message) {\n log.warning(`${prefix} \u26A0\uFE0F ${message}`);\n },\n\n /**\n * \u666E\u901A\u4FE1\u606F\u65E5\u5FD7\n * @param {string} message - \u4FE1\u606F\n */\n info(message) {\n log.info(`${prefix} \uD83D\uDCD6 ${message}`);\n }\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 * TimeoutError - \u901A\u7528\u8D85\u65F6\u9519\u8BEF\u57FA\u7C7B\n * \u6240\u6709\u8D85\u65F6\u76F8\u5173\u9519\u8BEF\u7684\u7236\u7C7B\n */\nexport class TimeoutError extends Error {\n /**\n * @param {string} message - \u9519\u8BEF\u4FE1\u606F\n * @param {number} timeout - \u8D85\u65F6\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09\n * @param {Object} [context={}] - \u4E0A\u4E0B\u6587\u4FE1\u606F\n */\n constructor(message, timeout, context = {}) {\n super(message);\n this.name = 'TimeoutError';\n this.timeout = timeout;\n this.context = context;\n this.timestamp = new Date().toISOString();\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, TimeoutError);\n }\n }\n}\n\n/**\n * FirstDataTimeoutError - \u9996\u6B21\u6570\u636E\u63A5\u6536\u8D85\u65F6\u9519\u8BEF\n * \u5728\u7B49\u5F85 SSE \u6D41\u9996\u6B21\u6570\u636E\u65F6\u8D85\u65F6\u629B\u51FA\n */\nexport class FirstDataTimeoutError extends TimeoutError {\n /**\n * @param {number} timeout - \u8D85\u65F6\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09\n * @param {Object} [context={}] - \u4E0A\u4E0B\u6587\u4FE1\u606F\n */\n constructor(timeout, context = {}) {\n super(`\u9996\u6B21\u6570\u636E\u63A5\u6536\u8D85\u65F6 (${timeout}ms)`, timeout, context);\n this.name = 'FirstDataTimeoutError';\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, FirstDataTimeoutError);\n }\n }\n}\n\n/**\n * OverallTimeoutError - \u6574\u4F53\u8BF7\u6C42\u8D85\u65F6\u9519\u8BEF\n * \u5728\u6574\u4E2A\u8BF7\u6C42\u5904\u7406\u8FC7\u7A0B\u8D85\u65F6\u65F6\u629B\u51FA\n */\nexport class OverallTimeoutError extends TimeoutError {\n /**\n * @param {number} timeout - \u8D85\u65F6\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09\n * @param {Object} [context={}] - \u4E0A\u4E0B\u6587\u4FE1\u606F\n */\n constructor(timeout, context = {}) {\n super(`\u6574\u4F53\u8BF7\u6C42\u8D85\u65F6 (${timeout}ms)`, timeout, context);\n this.name = 'OverallTimeoutError';\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, OverallTimeoutError);\n }\n }\n}\n", "import { Status, Code } from './constants';\nimport { createLogger } from './internal/logger';\nimport { CrawlerError } from './errors';\nimport { serializeError } from 'serialize-error';\n\nconst logger = createLogger('ApifyKit');\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\n return {\n /**\n * \u6838\u5FC3\u5C01\u88C5\uFF1A\u6267\u884C\u6B65\u9AA4\uFF0C\u5E26\u81EA\u52A8\u65E5\u5FD7\u786E\u8BA4\u548C\u5931\u8D25\u622A\u56FE\u5904\u7406\n */\n async runStep(step, page, actionFn, options = {}) {\n const { failActor = true } = options; // \u9ED8\u8BA4\u8C03\u7528 Actor.fail\n\n // log.info(`\uD83D\uDD04 [\u6B63\u5728\u6267\u884C] ${step}...`);\n logger.start(`[Step] ${step}`);\n\n try {\n const result = await actionFn();\n // log.info(`\u2705 [\u6267\u884C\u6210\u529F] ${step}`);\n logger.success(`[Step] ${step}`);\n return result;\n } catch (error) {\n // log.error(`\u274C [\u6267\u884C\u5931\u8D25] ${step}: ${error.message}`);\n logger.fail(`[Step] ${step}`, error);\n\n let base64 = '\u622A\u56FE\u5931\u8D25';\n try {\n if (page) {\n const buffer = await page.screenshot({ fullPage: true, type: 'jpeg', quality: 60 });\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 // \u4F7F\u7528 pushFailed \u65B9\u6CD5\u63A8\u9001\u5931\u8D25\u6570\u636E\uFF08\u79C1\u6709\u4F7F\u7528\uFF09\n await this.pushFailed(error, {\n step,\n page,\n options,\n base64\n });\n\n // \u6839\u636E failActor \u51B3\u5B9A\u662F\u5426\u8C03\u7528 Actor.fail\n if (failActor) {\n await Actor.fail(`Run Step ${step} \u5931\u8D25: ${error.message}`);\n } else {\n // \u4E0D\u8C03\u7528 Actor.fail\uFF0C\u76F4\u63A5\u629B\u51FA\u9519\u8BEF\n throw error;\n }\n }\n },\n\n /**\n * \u5BBD\u677E\u7248runStep\uFF1A\u5931\u8D25\u65F6\u4E0D\u8C03\u7528Actor.fail\uFF0C\u53EA\u629B\u51FA\u5F02\u5E38\n */\n async runStepLoose(step, page, fn) {\n return await this.runStep(step, page, fn, { failActor: false });\n },\n\n /**\n * \u63A8\u9001\u6210\u529F\u6570\u636E\u7684\u901A\u7528\u65B9\u6CD5\n * @param {Object} data - \u8981\u63A8\u9001\u7684\u6570\u636E\u5BF9\u8C61\n */\n async pushSuccess(data) {\n await Actor.pushData({\n // \u56FA\u5B9A\u4E3A0\n code: Code.Success,\n status: Status.Success,\n timestamp: new Date().toISOString(),\n data\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\u4F9BrunStep\u5185\u90E8\u4F7F\u7528\uFF09\n * \u81EA\u52A8\u89E3\u6790 CrawlerError \u7684 code \u548C context\n * @param {Error|CrawlerError} error - \u9519\u8BEF\u5BF9\u8C61\n * @param {Object} [meta] - \u989D\u5916\u7684\u6570\u636E\uFF08\u5982failedStep, screenshotBase64\u7B49\uFF09\n * @private\n */\n async pushFailed(error, meta = {}) {\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\n await Actor.pushData({\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 error: serializeError(error),\n meta,\n context,\n timestamp: new Date().toISOString(),\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 { createLogger } from './internal/logger';\nimport delay from 'delay';\n\nconst logger = createLogger('Utils');\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 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\n /**\n * \u5168\u9875\u9762\u6EDA\u52A8\u622A\u56FE\n * \u81EA\u52A8\u68C0\u6D4B\u9875\u9762\u6240\u6709\u53EF\u6EDA\u52A8\u5143\u7D20\uFF0C\u53D6\u6700\u5927\u9AD8\u5EA6\uFF0C\u5F3A\u5236\u5C55\u5F00\u540E\u622A\u56FE\n * \n * @param {import('playwright').Page} page - Playwright page \u5BF9\u8C61\n * @param {Object} [options] - \u914D\u7F6E\u9009\u9879\n * @param {number} [options.buffer] - \u989D\u5916\u7F13\u51B2\u9AD8\u5EA6 (\u9ED8\u8BA4: \u89C6\u53E3\u9AD8\u5EA6\u7684\u4E00\u534A)\n * @returns {Promise<string>} - base64 \u7F16\u7801\u7684 PNG \u56FE\u7247\n */\n async fullPageScreenshot(page, options = {}) {\n logger.start('fullPageScreenshot', 'detecting scrollable elements');\n const originalViewport = page.viewportSize();\n const defaultBuffer = Math.round((originalViewport?.height || 1080) / 2);\n const buffer = options.buffer ?? defaultBuffer;\n\n try {\n // 1. \u81EA\u52A8\u627E\u51FA\u6240\u6709\u53EF\u6EDA\u52A8\u5143\u7D20\u5E76\u5C55\u5F00\uFF0C\u8FD4\u56DE\u6700\u5927\u9AD8\u5EA6\n const maxScrollHeight = await page.evaluate(() => {\n let maxHeight = document.body.scrollHeight;\n\n document.querySelectorAll('*').forEach(el => {\n const style = window.getComputedStyle(el);\n const overflowY = style.overflowY;\n\n if ((overflowY === 'auto' || overflowY === 'scroll') &&\n el.scrollHeight > el.clientHeight) {\n if (el.scrollHeight > maxHeight) {\n maxHeight = el.scrollHeight;\n }\n el.style.overflow = 'visible';\n el.style.height = 'auto';\n el.style.maxHeight = 'none';\n }\n });\n\n return maxHeight;\n });\n\n // 2. \u8C03\u6574\u89C6\u53E3\u9AD8\u5EA6\n await page.setViewportSize({\n width: originalViewport?.width || 1280,\n height: maxScrollHeight + buffer\n });\n\n // \u7B49\u5F85\u6E32\u67D3\n await delay(1000);\n\n // 3. \u622A\u56FE\n const buffer_ = await page.screenshot({\n fullPage: true,\n type: 'png'\n });\n\n logger.success('fullPageScreenshot', `captured ${Math.round(buffer_.length / 1024)} KB`);\n return buffer_.toString('base64');\n } finally {\n if (originalViewport) {\n await page.setViewportSize(originalViewport);\n }\n }\n }\n}\n\n", "import { createLogger } from './internal/logger';\n\nconst logger = createLogger('Stealth');\n\nexport const Stealth = {\n /**\n * \u5173\u952E\u4FEE\u590D\uFF1A\u5C06 Page \u89C6\u53E3\u8C03\u6574\u4E3A\u4E0E\u6D4F\u89C8\u5668\u6307\u7EB9 (window.screen) \u4E00\u81F4\u3002\n * \u9632\u6B62 \"Viewport Mismatch\" \u7C7B\u578B\u7684\u53CD\u722C\u68C0\u6D4B\u3002\n * @param {import('playwright').Page} page \n */\n async syncViewportWithScreen(page) {\n try {\n // \u83B7\u53D6\u6307\u7EB9\u4E2D\u7684\u5C4F\u5E55\u5C3A\u5BF8\n const screen = await page.evaluate(() => ({\n width: window.screen.width,\n height: window.screen.height,\n availWidth: window.screen.availWidth,\n availHeight: window.screen.availHeight,\n }));\n\n // \u8C03\u6574\u89C6\u53E3\n await page.setViewportSize({\n width: screen.width,\n height: screen.height\n });\n\n logger.success('syncViewportWithScreen', `size=${screen.width}x${screen.height}`);\n } catch (e) {\n logger.warn(`syncViewportWithScreen Failed: ${e.message}. Fallback to 1920x1080.`);\n await page.setViewportSize({ width: 1920, height: 1080 });\n }\n },\n\n /**\n * \u786E\u4FDD navigator.webdriver \u9690\u85CF (\u901A\u5E38 Playwright Stealth \u63D2\u4EF6\u5DF2\u5904\u7406\uFF0C\u4F46\u53CC\u91CD\u4FDD\u9669)\n */\n async hideWebdriver(page) {\n await page.addInitScript(() => {\n Object.defineProperty(navigator, 'webdriver', {\n get: () => false,\n });\n });\n logger.success('hideWebdriver');\n },\n\n /**\n * \u901A\u7528\u7684 Playwright \u8D44\u6E90\u62E6\u622A\u5668\uFF0C\u7528\u4E8E\u5C4F\u853D\u4E0D\u5FC5\u8981\u7684\u8D44\u6E90\u4EE5\u52A0\u901F\u52A0\u8F7D\n * @param {import('playwright').Page} page\n * @param {string[]} [resourceTypes] - \u8981\u5C4F\u853D\u7684\u8D44\u6E90\u7C7B\u578B\uFF0C\u9ED8\u8BA4\u4E3A ['font', 'image', 'media']\n */\n async setupBlockingResources(page, resourceTypes = ['font', 'image', 'media']) {\n await page.route('**/*', (route) => {\n const request = route.request();\n const type = request.resourceType();\n if (resourceTypes.includes(type)) {\n return route.abort();\n }\n return route.continue();\n });\n logger.success('setupBlockingResources', `types=[${resourceTypes.join(',')}]`);\n },\n\n /**\n * \u83B7\u53D6\u63A8\u8350\u7684 Stealth \u542F\u52A8\u53C2\u6570\n */\n getStealthLaunchArgs() {\n return [\n '--disable-blink-features=AutomationControlled',\n '--no-sandbox',\n '--disable-setuid-sandbox',\n '--disable-infobars',\n '--window-position=0,0',\n '--ignore-certificate-errors',\n '--disable-web-security',\n // \u6CE8\u610F\uFF1A\u4E0D\u5EFA\u8BAE\u8FD9\u91CC\u5F3A\u5236\u6307\u5B9A window-size\uFF0C\u8BA9 syncViewportWithScreen \u53BB\u52A8\u6001\u8C03\u6574\n // '--window-size=1920,1080' \n ];\n },\n\n /**\n * \u83B7\u53D6\u589E\u5F3A\u7248 Stealth \u542F\u52A8\u53C2\u6570 (\u63A8\u8350\u7528\u4E8E\u9AD8\u98CE\u9669\u53CD\u722C\u573A\u666F)\n * \u5305\u542B\u66F4\u591A\u9488\u5BF9\u81EA\u52A8\u5316\u68C0\u6D4B\u7684\u9632\u62A4\n */\n getAdvancedStealthArgs() {\n return [\n ...this.getStealthLaunchArgs(),\n // \u7981\u7528\u5404\u79CD\u53EF\u80FD\u66B4\u9732\u81EA\u52A8\u5316\u7684\u7279\u5F81\n '--disable-dev-shm-usage',\n '--disable-accelerated-2d-canvas',\n '--disable-gpu-sandbox',\n '--disable-background-networking',\n '--disable-default-apps',\n '--disable-extensions',\n '--disable-sync',\n '--disable-translate',\n '--metrics-recording-only',\n '--mute-audio',\n '--no-first-run',\n // \u6A21\u62DF\u771F\u5B9E\u7528\u6237\u914D\u7F6E\n '--lang=zh-CN,zh',\n ];\n },\n\n /**\n * \u8BBE\u7F6E\u4E2D\u56FD\u65F6\u533A (Asia/Shanghai, UTC+8)\n * \n * \u9632\u6B62\u65F6\u533A\u4E0D\u4E00\u81F4\u7684\u68C0\u6D4B\u3002\u5BF9\u4E8E\u4E2D\u56FD\u5883\u5185\u722C\u53D6\u5F3A\u70C8\u63A8\u8350\u4F7F\u7528\u3002\n * \u5E94\u5728 preNavigationHooks \u6216 BrowserContext \u521B\u5EFA\u540E\u8C03\u7528\u3002\n * \n * @param {import('playwright').BrowserContext} context\n */\n async setChinaTimezone(context) {\n // Playwright \u901A\u8FC7 context \u8BBE\u7F6E\u65F6\u533A\n // \u6CE8\u610F\uFF1A\u8FD9\u9700\u8981\u5728 context \u521B\u5EFA\u65F6\u8BBE\u7F6E\uFF0C\u6216\u8005\u4F7F\u7528 CDP\n // \u8FD9\u91CC\u4F7F\u7528 addInitScript \u6CE8\u5165 Intl \u8986\u76D6\n await context.addInitScript(() => {\n // \u8986\u76D6 Intl.DateTimeFormat \u9ED8\u8BA4\u65F6\u533A\n const originalDateTimeFormat = Intl.DateTimeFormat;\n Intl.DateTimeFormat = function (locales, options) {\n options = options || {};\n options.timeZone = options.timeZone || 'Asia/Shanghai';\n return new originalDateTimeFormat(locales, options);\n };\n Intl.DateTimeFormat.prototype = originalDateTimeFormat.prototype;\n\n // \u8986\u76D6 Date.prototype.getTimezoneOffset \u8FD4\u56DE -480 (UTC+8)\n Date.prototype.getTimezoneOffset = function () {\n return -480; // UTC+8 = -480 \u5206\u949F\n };\n });\n logger.success('setChinaTimezone', 'Asia/Shanghai (UTC+8)');\n }\n}\n", "import delay from 'delay';\nimport { createCursor } from 'ghost-cursor-playwright';\nimport { createLogger } from './internal/logger';\n\nconst logger = createLogger('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 // CSS \u9009\u62E9\u5668\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 // \u5750\u6807\u5BF9\u8C61\n await cursor.actions.move(target);\n } else if (target && typeof target.boundingBox === 'function') {\n // ElementHandle\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 * \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 */\n async humanClick(page, target, options = {}) {\n const cursor = $GetCursor(page);\n\n // \u517C\u5BB9\u5904\u7406\uFF1A\u5982\u679C\u7B2C\u4E8C\u4E2A\u53C2\u6570\u662F\u5BF9\u8C61\u4E14\u6CA1\u6709\u7B2C\u4E09\u4E2A\u53C2\u6570\uFF0C\u8BF4\u660E\u7528\u6237\u7701\u7565\u4E86 target (\u5373 humanClick(page, options))\n // \u4F46\u901A\u5E38\u6211\u4EEC\u4F1A\u9075\u5FAA humanClick(page, null, options) \u7684\u8C03\u7528\u65B9\u5F0F\u3002\n // \u8FD9\u91CC\u7B80\u5355\u5904\u7406\uFF1A\u5982\u679C target \u662F plain object \u4E14 options \u662F\u7A7A\u5BF9\u8C61(\u9ED8\u8BA4\u503C)\uFF0C\u53EF\u80FD\u7528\u6237\u4F20\u9519\u4E86\uFF1F\n // \u8FD8\u662F\u4E25\u683C\u6309\u7167\u6587\u6863\uFF1A\u5982\u679C\u8981\u70B9\u51FB\u5F53\u524D\u4F4D\u7F6E\uFF0C\u4F20 null/undefined\u3002\n\n const { reactionDelay = 250, throwOnMissing = true } = options;\n\n const targetDesc = target == null ? 'Current Position' : (typeof target === 'string' ? target : 'ElementHandle');\n logger.start('humanClick', `target=${targetDesc}`);\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 const box = await element.boundingBox();\n if (!box) {\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 // \u8BA1\u7B97\u5E26\u968F\u673A\u504F\u79FB\u7684\u70B9\u51FB\u4F4D\u7F6E\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 // \u4EBA\u7C7B\u53CD\u5E94\u5EF6\u8FDF (150-400ms \u8303\u56F4)\n await delay(this.jitterMs(reactionDelay, 0.4));\n await cursor.actions.click();\n\n logger.success('humanClick');\n return true;\n } catch (error) {\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 locator.click();\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\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", "// \u96C6\u4E2D\u7BA1\u7406\u542F\u52A8\u914D\u7F6E\uFF0C\u6682\u65F6\u4E3B\u8981\u7531 Stealth \u6A21\u5757\u63D0\u4F9B Args\uFF0C\u8FD9\u91CC\u4F5C\u4E3A\u6269\u5C55\u70B9\nimport { Stealth } from './stealth';\nimport { createLogger } from './internal/logger';\n\nconst logger = createLogger('Launch');\n\nexport const Launch = {\n getLaunchOptions(customArgs = []) {\n return {\n args: [\n ...Stealth.getStealthLaunchArgs(),\n ...customArgs\n ],\n ignoreDefaultArgs: ['--enable-automation'],\n };\n },\n\n /**\n * \u83B7\u53D6\u589E\u5F3A\u7248\u542F\u52A8\u9009\u9879\uFF08\u7528\u4E8E\u9AD8\u98CE\u9669\u53CD\u722C\u573A\u666F\uFF09\n */\n getAdvancedLaunchOptions(customArgs = []) {\n return {\n args: [\n ...Stealth.getAdvancedStealthArgs(),\n ...customArgs\n ],\n ignoreDefaultArgs: ['--enable-automation'],\n };\n },\n\n /**\n * \u63A8\u8350\u7684 Fingerprint Generator \u9009\u9879\n * \u786E\u4FDD\u751F\u6210\u7684\u662F\u684C\u9762\u7AEF\u3001\u8F83\u65B0\u7684 Chrome\uFF0C\u4EE5\u5339\u914D\u6211\u4EEC\u7684\u811A\u672C\u903B\u8F91\n */\n getFingerprintGeneratorOptions() {\n return {\n browsers: [{ name: 'chrome', minVersion: 110 }],\n devices: ['desktop'],\n operatingSystems: ['windows', 'linux'], // \u5305\u542B Linux \u517C\u5BB9\u5BB9\u5668\n };\n },\n\n /**\n * \u521B\u5EFA\u5DF2\u6CE8\u518C Stealth \u63D2\u4EF6\u7684 Chromium \u5B9E\u4F8B\n * \n * \u5C01\u88C5\u4E86 `chromium.use(stealthPlugin())` \u7684\u5E38\u7528\u6A21\u5F0F\n * \n * @example\n * ```javascript\n * import { chromium } from 'playwright-extra';\n * import stealthPlugin from 'puppeteer-extra-plugin-stealth';\n * \n * const stealthChromium = Launch.createStealthChromium(chromium, stealthPlugin);\n * // \u73B0\u5728 stealthChromium \u5DF2\u6CE8\u518C stealth \u63D2\u4EF6\uFF0C\u53EF\u7528\u4E8E launchContext.launcher\n * ```\n * \n * @param {import('playwright-extra').ChromiumExtra} chromium - playwright-extra \u7684 chromium\n * @param {Function} stealthPlugin - puppeteer-extra-plugin-stealth \u7684\u9ED8\u8BA4\u5BFC\u51FA\n * @returns {import('playwright-extra').ChromiumExtra} \u5DF2\u6CE8\u518C stealth \u7684 chromium\n */\n createStealthChromium(chromium, stealthPlugin) {\n chromium.use(stealthPlugin());\n logger.success('createStealthChromium', 'Stealth plugin registered');\n return chromium;\n }\n}\n\n", "import express from 'express';\nimport { Actor } from 'apify';\nimport { PresetOfLiveViewKey } from './constants';\nimport { createLogger } from './internal/logger';\n\nconst logger = createLogger('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 page.screenshot({ 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 { createLogger } from './internal/logger';\n\nconst logger = createLogger('Captcha');\n\n/**\n * \u521B\u5EFA\u9A8C\u8BC1\u7801\u76D1\u63A7\u5668 - \u652F\u6301 DOM \u9009\u62E9\u5668 \u548C URL \u6A21\u5F0F \u4E24\u79CD\u68C0\u6D4B\u65B9\u5F0F\n * \n * \u6CE8\u610F\uFF1A\u76D1\u63A7\u5668\u968F\u9875\u9762\u751F\u547D\u5468\u671F\u81EA\u52A8\u6E05\u7406\uFF0C\u65E0\u9700\u624B\u52A8 cleanup\n * \n * @param {import('playwright').Page} page\n * @param {Object} options\n * @param {string} [options.domSelector] - DOM \u5143\u7D20\u9009\u62E9\u5668 (\u5982 '#captcha_container')\n * @param {string} [options.urlPattern] - URL \u5339\u914D\u6A21\u5F0F (\u5982 '/captcha')\n * @param {Function} options.onDetected - \u68C0\u6D4B\u5230\u9A8C\u8BC1\u7801\u65F6\u7684\u56DE\u8C03 (async function)\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 \u81F3\u5C11\u4E00\u4E2A');\n }\n\n if (!onDetected || typeof onDetected !== 'function') {\n throw new Error('[CaptchaMonitor] onDetected \u5FC5\u987B\u662F\u4E00\u4E2A\u51FD\u6570');\n }\n\n let isHandled = false;\n let frameHandler = null;\n let exposedFunctionName = null;\n\n const triggerDetected = async () => {\n if (isHandled) return;\n isHandled = true;\n await onDetected();\n };\n\n const cleanupFns = [];\n\n // ============================================================\n // \u6A21\u5F0F1: DOM \u76D1\u63A7 (\u4F7F\u7528 MutationObserver)\n // ============================================================\n if (domSelector) {\n // \u751F\u6210\u552F\u4E00\u7684\u51FD\u6570\u540D\u907F\u514D\u51B2\u7A81\n exposedFunctionName = `__c_d_${uuidv4().replace(/-/g, '_')}`;\n // \u751F\u6210\u552F\u4E00\u7684\u6E05\u7406\u51FD\u6570\u540D (\u6302\u8F7D\u5728 window \u4E0A)\n const cleanerName = `__c_cleaner_${uuidv4().replace(/-/g, '_')}`;\n\n // \u66B4\u9732\u56DE\u8C03\u51FD\u6570\u7ED9\u9875\u9762\n page.exposeFunction(exposedFunctionName, triggerDetected).catch(() => {\n // \u5FFD\u7565\u91CD\u590D\u66B4\u9732\u9519\u8BEF\n });\n\n // \u6CE8\u5165 MutationObserver \u76D1\u542C\u811A\u672C\n page.addInitScript(({ selector, callbackName, cleanerName }) => {\n (() => {\n let observer = null;\n\n const checkAndReport = () => {\n const element = document.querySelector(selector);\n if (element) {\n if (observer) {\n observer.disconnect();\n observer = null;\n }\n if (window[callbackName]) {\n window[callbackName]();\n }\n return true;\n }\n return false;\n };\n\n // 1. \u7ACB\u5373\u68C0\u67E5\u4E00\u6B21\n if (checkAndReport()) return;\n\n // 2. \u542F\u52A8 MutationObserver\n observer = new MutationObserver((mutations) => {\n let shouldCheck = false;\n for (const mutation of mutations) {\n if (mutation.addedNodes.length > 0) {\n shouldCheck = true;\n break;\n }\n }\n if (shouldCheck && observer) {\n checkAndReport();\n }\n });\n\n // 3. \u6302\u8F7D\u76D1\u542C\uFF08\u786E\u4FDD DOM \u51C6\u5907\u5C31\u7EEA\uFF09\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 // 4. \u6CE8\u518C\u6E05\u7406\u51FD\u6570\n window[cleanerName] = () => {\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: ${domSelector}`);\n\n // \u6DFB\u52A0\u6E05\u7406\u903B\u8F91\n cleanupFns.push(async () => {\n try {\n // \u8C03\u7528\u9875\u9762\u5185\u7684\u6E05\u7406\u51FD\u6570\n await page.evaluate((name) => {\n if (window[name]) {\n window[name]();\n delete window[name];\n }\n }, cleanerName);\n } catch (e) {\n // \u9875\u9762\u53EF\u80FD\u5DF2\u5173\u95ED\u6216\u8DF3\u8F6C\uFF0C\u5FFD\u7565\u9519\u8BEF\n }\n });\n }\n\n // ============================================================\n // \u6A21\u5F0F2: URL \u76D1\u63A7 (\u76D1\u542C framenavigated)\n // ============================================================\n if (urlPattern) {\n frameHandler = async (frame) => {\n if (frame === page.mainFrame()) {\n const currentUrl = page.url();\n if (currentUrl.includes(urlPattern)) {\n await triggerDetected();\n }\n }\n };\n\n page.on('framenavigated', frameHandler);\n logger.success('useCaptchaMonitor', `URL \u76D1\u63A7\u5DF2\u542F\u7528: ${urlPattern}`);\n\n // \u6DFB\u52A0\u6E05\u7406\u903B\u8F91\n cleanupFns.push(async () => {\n page.off('framenavigated', frameHandler);\n });\n }\n\n // \u8FD4\u56DE\u63A7\u5236\u53E5\u67C4\n return {\n stop: async () => {\n logger.info('useCaptchaMonitor', '\u6B63\u5728\u505C\u6B62\u76D1\u63A7...');\n for (const fn of cleanupFns) {\n await fn();\n }\n isHandled = true; // \u9632\u6B62\u540E\u7EED\u89E6\u53D1\n }\n };\n}\n\n// \u6309\u7167 toolkit \u7EDF\u4E00\u7684\u5BFC\u51FA\u6A21\u5F0F\nexport const Captcha = {\n useCaptchaMonitor\n};\n", "import https from 'https';\nimport { URL } from 'url';\nimport { createLogger } from './internal/logger';\nimport { FirstDataTimeoutError, OverallTimeoutError } from './errors';\n\nconst logger = createLogger('Sse');\n\nexport const Sse = {\n /**\n * \u89E3\u6790 SSE \u6D41\u6587\u672C\n * \u652F\u6301 `data: {...}` \u548C `data:{...}` \u4E24\u79CD\u683C\u5F0F\n * @param {string} sseStreamText\n * @returns {Array<Object>} events\n */\n parseSseStream(sseStreamText) {\n const events = [];\n const lines = sseStreamText.split('\\n');\n for (const line of lines) {\n // \u517C\u5BB9\u4E24\u79CD\u683C\u5F0F: \"data: {...}\" \u548C \"data:{...}\"\n if (line.startsWith('data:')) {\n try {\n // \u79FB\u9664 \"data:\" \u524D\u7F00\u5E76 trim\uFF0C\u7EDF\u4E00\u5904\u7406\u6709\u65E0\u7A7A\u683C\u7684\u60C5\u51B5\n const jsonContent = line.substring(5).trim();\n if (jsonContent) {\n events.push(JSON.parse(jsonContent));\n }\n } catch (e) {\n // \u5FFD\u7565\u975E\u6709\u6548 JSON \u7684\u884C\n logger.debug('parseSseStream', `JSON \u89E3\u6790\u5931\u8D25: ${e.message}, line: ${line.substring(0, 100)}...`);\n }\n }\n }\n logger.success('parseSseStream', `\u89E3\u6790\u5B8C\u6210, events \u6570\u91CF: ${events.length}`);\n return events;\n },\n\n /**\n * \u62E6\u622A\u7F51\u7EDC\u8BF7\u6C42\u5E76\u4F7F\u7528 Node.js \u539F\u751F https \u6A21\u5757\u8F6C\u53D1\uFF0C\u4EE5\u89E3\u51B3\u6D41\u5F0F\u6570\u636E\u6355\u83B7\u95EE\u9898\u3002\n * @param {import('playwright').Page} page\n * @param {string|RegExp} urlPattern - \u62E6\u622A\u7684 URL \u6A21\u5F0F\n * @param {object} options\n * @param {function(string, function, string): void} [options.onData] - (textChunk, resolve, accumulatedText) => void\n * @param {function(string, function): void} [options.onEnd] - (fullText, resolve) => void\n * @param {function(Error): void} [options.onTimeout] - (error) => void\uFF0Cerror \u4E3A FirstDataTimeoutError \u6216 OverallTimeoutError\n * @param {number} [options.firstDataTimeout=90000] - \u9996\u6B21\u6570\u636E\u63A5\u6536\u8D85\u65F6 (ms)\uFF0C\u9ED8\u8BA4 90s\n * @param {number} [options.timeout=180000] - \u6574\u4F53\u8BF7\u6C42\u8D85\u65F6\u65F6\u95F4 (ms)\uFF0C\u9ED8\u8BA4 180s\n * @returns {Promise<any>} - \u8FD4\u56DE Promise\uFF0C\u5F53\u6D41\u6EE1\u8DB3\u6761\u4EF6\u65F6 resolve\n */\n async intercept(page, urlPattern, options = {}) {\n const {\n onData,\n onEnd,\n onTimeout,\n firstDataTimeout = 90000,\n timeout = 180000\n } = options;\n\n let streamResolve, streamReject;\n const capturePromise = new Promise((resolve, reject) => {\n streamResolve = resolve;\n streamReject = reject;\n });\n\n // \u9996\u6B21\u6570\u636E\u63A5\u6536\u8D85\u65F6\u5B9A\u65F6\u5668\n let firstDataTimer = null;\n // \u6574\u4F53\u8BF7\u6C42\u8D85\u65F6\u5B9A\u65F6\u5668\n let overallTimer = null;\n // \u662F\u5426\u5DF2\u63A5\u6536\u5230\u9996\u6B21\u6570\u636E\n let hasReceivedFirstData = false;\n\n // \u6E05\u7406\u6240\u6709\u5B9A\u65F6\u5668\n const clearAllTimers = () => {\n if (firstDataTimer) {\n clearTimeout(firstDataTimer);\n firstDataTimer = null;\n }\n if (overallTimer) {\n clearTimeout(overallTimer);\n overallTimer = null;\n }\n };\n\n // \u8BBE\u7F6E\u9996\u6B21\u6570\u636E\u8D85\u65F6\n firstDataTimer = setTimeout(() => {\n if (!hasReceivedFirstData) {\n const error = new FirstDataTimeoutError(firstDataTimeout);\n logger.error(`[Intercept] \u9996\u6B21\u6570\u636E\u63A5\u6536\u8D85\u65F6`);\n clearAllTimers();\n\n if (onTimeout) {\n onTimeout(error);\n }\n streamReject(error);\n }\n }, firstDataTimeout);\n\n // \u8BBE\u7F6E\u6574\u4F53\u8BF7\u6C42\u8D85\u65F6\n overallTimer = setTimeout(() => {\n const error = new OverallTimeoutError(timeout);\n logger.error(`[Intercept] \u6574\u4F53\u8BF7\u6C42\u8D85\u65F6`);\n clearAllTimers();\n\n if (onTimeout) {\n onTimeout(error);\n }\n streamReject(error);\n }, timeout);\n\n await page.route(urlPattern, async (route) => {\n const request = route.request();\n const requestUrl = request.url();\n logger.info(`[MITM] \u5DF2\u62E6\u622A\u8BF7\u6C42: ${requestUrl}`);\n\n try {\n const headers = await request.allHeaders();\n const postData = request.postData();\n const urlObj = new URL(requestUrl);\n\n // \u5220\u9664 accept-encoding \u5F3A\u5236\u660E\u6587\uFF0C\u5220\u9664 content-length \u8BA9 Node \u91CD\u7B97\n delete headers['accept-encoding'];\n delete headers['content-length'];\n\n const reqOptions = {\n hostname: urlObj.hostname,\n port: 443,\n path: urlObj.pathname + urlObj.search,\n method: request.method(),\n headers: headers,\n timeout: timeout\n };\n\n const req = https.request(reqOptions, (res) => {\n const chunks = [];\n let accumulatedText = \"\";\n\n // A. \u5B9E\u65F6\u6570\u636E\u76D1\u542C\n res.on('data', (chunk) => {\n // \u6807\u8BB0\u5DF2\u63A5\u6536\u9996\u6B21\u6570\u636E\uFF0C\u6E05\u9664\u9996\u6B21\u6570\u636E\u8D85\u65F6\n if (!hasReceivedFirstData) {\n hasReceivedFirstData = true;\n if (firstDataTimer) {\n clearTimeout(firstDataTimer);\n firstDataTimer = null;\n }\n logger.debug('[Intercept] \u5DF2\u63A5\u6536\u9996\u6B21\u6570\u636E');\n }\n\n chunks.push(chunk);\n const textChunk = chunk.toString('utf-8');\n accumulatedText += textChunk;\n\n logger.debug(`[CHUNK] ${textChunk.length} bytes`);\n\n if (onData) {\n try {\n onData(textChunk, streamResolve, accumulatedText);\n } catch (e) {\n logger.error(`onData callback error: ${e.message}`);\n }\n }\n });\n\n // B. \u7ED3\u675F\u76D1\u542C\n res.on('end', () => {\n logger.info('[MITM] \u4E0A\u6E38\u54CD\u5E94\u7ED3\u675F (Stream End)');\n clearAllTimers();\n const fullBody = Buffer.concat(chunks);\n\n if (onEnd) {\n try {\n onEnd(accumulatedText, streamResolve);\n } catch (e) {\n logger.error(`onEnd callback error: ${e.message}`);\n }\n } else if (!onData) {\n // \u5982\u679C\u6CA1\u6709\u56DE\u8C03\uFF0C\u9ED8\u8BA4\u7ED3\u675F\u65F6 resolve \u5168\u6587\n streamResolve(accumulatedText);\n }\n\n // \u8FD4\u56DE\u7ED9\u6D4F\u89C8\u5668\n route.fulfill({\n status: res.statusCode,\n headers: res.headers,\n body: fullBody\n }).catch(e => logger.warning(`Route fulfill failed: ${e.message}`));\n });\n });\n\n req.on('error', (e) => {\n logger.error(`[MITM] Upstream request error: ${e.message}`);\n clearAllTimers();\n route.abort();\n streamReject(e);\n });\n\n if (postData) {\n req.write(postData);\n }\n req.end();\n\n } catch (e) {\n logger.error(`[MITM] Setup error: ${e.message}`);\n clearAllTimers();\n route.continue();\n }\n });\n\n return capturePromise;\n }\n};\n"],
5
+ "mappings": "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",
6
6
  "names": ["import_serialize_error", "Actor", "logger", "delay", "logger", "import_delay", "logger", "delay", "logger", "logger", "express", "logger", "uuidv4", "cleanerName", "logger", "https"]
7
7
  }
package/dist/index.js CHANGED
@@ -84,7 +84,10 @@ function createLogger(moduleName) {
84
84
  // src/errors.js
85
85
  var errors_exports = {};
86
86
  __export(errors_exports, {
87
- CrawlerError: () => CrawlerError
87
+ CrawlerError: () => CrawlerError,
88
+ FirstDataTimeoutError: () => FirstDataTimeoutError,
89
+ OverallTimeoutError: () => OverallTimeoutError,
90
+ TimeoutError: () => TimeoutError
88
91
  });
89
92
  import { serializeError } from "serialize-error";
90
93
  var CrawlerError = class _CrawlerError extends Error {
@@ -137,6 +140,49 @@ var CrawlerError = class _CrawlerError extends Error {
137
140
  return crawlerError;
138
141
  }
139
142
  };
143
+ var TimeoutError = class _TimeoutError extends Error {
144
+ /**
145
+ * @param {string} message - 错误信息
146
+ * @param {number} timeout - 超时时间(毫秒)
147
+ * @param {Object} [context={}] - 上下文信息
148
+ */
149
+ constructor(message, timeout, context = {}) {
150
+ super(message);
151
+ this.name = "TimeoutError";
152
+ this.timeout = timeout;
153
+ this.context = context;
154
+ this.timestamp = (/* @__PURE__ */ new Date()).toISOString();
155
+ if (Error.captureStackTrace) {
156
+ Error.captureStackTrace(this, _TimeoutError);
157
+ }
158
+ }
159
+ };
160
+ var FirstDataTimeoutError = class _FirstDataTimeoutError extends TimeoutError {
161
+ /**
162
+ * @param {number} timeout - 超时时间(毫秒)
163
+ * @param {Object} [context={}] - 上下文信息
164
+ */
165
+ constructor(timeout, context = {}) {
166
+ super(`\u9996\u6B21\u6570\u636E\u63A5\u6536\u8D85\u65F6 (${timeout}ms)`, timeout, context);
167
+ this.name = "FirstDataTimeoutError";
168
+ if (Error.captureStackTrace) {
169
+ Error.captureStackTrace(this, _FirstDataTimeoutError);
170
+ }
171
+ }
172
+ };
173
+ var OverallTimeoutError = class _OverallTimeoutError extends TimeoutError {
174
+ /**
175
+ * @param {number} timeout - 超时时间(毫秒)
176
+ * @param {Object} [context={}] - 上下文信息
177
+ */
178
+ constructor(timeout, context = {}) {
179
+ super(`\u6574\u4F53\u8BF7\u6C42\u8D85\u65F6 (${timeout}ms)`, timeout, context);
180
+ this.name = "OverallTimeoutError";
181
+ if (Error.captureStackTrace) {
182
+ Error.captureStackTrace(this, _OverallTimeoutError);
183
+ }
184
+ }
185
+ };
140
186
 
141
187
  // src/apify-kit.js
142
188
  import { serializeError as serializeError2 } from "serialize-error";
@@ -990,7 +1036,7 @@ var Sse = {
990
1036
  if (line.startsWith("data:")) {
991
1037
  try {
992
1038
  const jsonContent = line.substring(5).trim();
993
- if (jsonContent && typeof jsonContent === "object") {
1039
+ if (jsonContent) {
994
1040
  events.push(JSON.parse(jsonContent));
995
1041
  }
996
1042
  } catch (e) {
@@ -1008,19 +1054,57 @@ var Sse = {
1008
1054
  * @param {object} options
1009
1055
  * @param {function(string, function, string): void} [options.onData] - (textChunk, resolve, accumulatedText) => void
1010
1056
  * @param {function(string, function): void} [options.onEnd] - (fullText, resolve) => void
1011
- * @param {number} [options.timeout=180000] - 超时时间 (ms)
1057
+ * @param {function(Error): void} [options.onTimeout] - (error) => void,error 为 FirstDataTimeoutError 或 OverallTimeoutError
1058
+ * @param {number} [options.firstDataTimeout=90000] - 首次数据接收超时 (ms),默认 90s
1059
+ * @param {number} [options.timeout=180000] - 整体请求超时时间 (ms),默认 180s
1012
1060
  * @returns {Promise<any>} - 返回 Promise,当流满足条件时 resolve
1013
1061
  */
1014
1062
  async intercept(page, urlPattern, options = {}) {
1015
- const { onData, onEnd, timeout = 18e4 } = options;
1063
+ const {
1064
+ onData,
1065
+ onEnd,
1066
+ onTimeout,
1067
+ firstDataTimeout = 9e4,
1068
+ timeout = 18e4
1069
+ } = options;
1016
1070
  let streamResolve, streamReject;
1017
1071
  const capturePromise = new Promise((resolve, reject) => {
1018
1072
  streamResolve = resolve;
1019
1073
  streamReject = reject;
1020
1074
  });
1021
- const timeoutId = setTimeout(() => {
1022
- logger8.debug("intercept", `Intercept promise timeout timer reached (${timeout}ms)`);
1023
- }, timeout + 5e3);
1075
+ let firstDataTimer = null;
1076
+ let overallTimer = null;
1077
+ let hasReceivedFirstData = false;
1078
+ const clearAllTimers = () => {
1079
+ if (firstDataTimer) {
1080
+ clearTimeout(firstDataTimer);
1081
+ firstDataTimer = null;
1082
+ }
1083
+ if (overallTimer) {
1084
+ clearTimeout(overallTimer);
1085
+ overallTimer = null;
1086
+ }
1087
+ };
1088
+ firstDataTimer = setTimeout(() => {
1089
+ if (!hasReceivedFirstData) {
1090
+ const error = new FirstDataTimeoutError(firstDataTimeout);
1091
+ logger8.error(`[Intercept] \u9996\u6B21\u6570\u636E\u63A5\u6536\u8D85\u65F6`);
1092
+ clearAllTimers();
1093
+ if (onTimeout) {
1094
+ onTimeout(error);
1095
+ }
1096
+ streamReject(error);
1097
+ }
1098
+ }, firstDataTimeout);
1099
+ overallTimer = setTimeout(() => {
1100
+ const error = new OverallTimeoutError(timeout);
1101
+ logger8.error(`[Intercept] \u6574\u4F53\u8BF7\u6C42\u8D85\u65F6`);
1102
+ clearAllTimers();
1103
+ if (onTimeout) {
1104
+ onTimeout(error);
1105
+ }
1106
+ streamReject(error);
1107
+ }, timeout);
1024
1108
  await page.route(urlPattern, async (route) => {
1025
1109
  const request = route.request();
1026
1110
  const requestUrl = request.url();
@@ -1043,6 +1127,14 @@ var Sse = {
1043
1127
  const chunks = [];
1044
1128
  let accumulatedText = "";
1045
1129
  res.on("data", (chunk) => {
1130
+ if (!hasReceivedFirstData) {
1131
+ hasReceivedFirstData = true;
1132
+ if (firstDataTimer) {
1133
+ clearTimeout(firstDataTimer);
1134
+ firstDataTimer = null;
1135
+ }
1136
+ logger8.debug("[Intercept] \u5DF2\u63A5\u6536\u9996\u6B21\u6570\u636E");
1137
+ }
1046
1138
  chunks.push(chunk);
1047
1139
  const textChunk = chunk.toString("utf-8");
1048
1140
  accumulatedText += textChunk;
@@ -1057,7 +1149,7 @@ var Sse = {
1057
1149
  });
1058
1150
  res.on("end", () => {
1059
1151
  logger8.info("[MITM] \u4E0A\u6E38\u54CD\u5E94\u7ED3\u675F (Stream End)");
1060
- clearTimeout(timeoutId);
1152
+ clearAllTimers();
1061
1153
  const fullBody = Buffer.concat(chunks);
1062
1154
  if (onEnd) {
1063
1155
  try {
@@ -1077,7 +1169,7 @@ var Sse = {
1077
1169
  });
1078
1170
  req.on("error", (e) => {
1079
1171
  logger8.error(`[MITM] Upstream request error: ${e.message}`);
1080
- clearTimeout(timeoutId);
1172
+ clearAllTimers();
1081
1173
  route.abort();
1082
1174
  streamReject(e);
1083
1175
  });
@@ -1087,7 +1179,7 @@ var Sse = {
1087
1179
  req.end();
1088
1180
  } catch (e) {
1089
1181
  logger8.error(`[MITM] Setup error: ${e.message}`);
1090
- clearTimeout(timeoutId);
1182
+ clearAllTimers();
1091
1183
  route.continue();
1092
1184
  }
1093
1185
  });
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/constants.js", "../src/internal/logger.js", "../src/errors.js", "../src/apify-kit.js", "../src/utils.js", "../src/stealth.js", "../src/humanize.js", "../src/launch.js", "../src/live-view.js", "../src/captcha-monitor.js", "../src/sse.js", "../index.js"],
4
- "sourcesContent": ["export const Code = {\n Success: 0,\n UnknownError: -1,\n NotLogin: 30000001,\n Chaptcha: 30000002,\n}\n\nexport const Status = {\n Success: 'SUCCESS',\n Failed: 'FAILED'\n}\n\nexport const FAILED_KEY_SEPARATOR = '::<@>::';\n\nexport const PresetOfLiveViewKey = 'LIVE_VIEW_SCREENSHOT';\n", "import { log } from 'crawlee';\n\n/**\n * \u521B\u5EFA\u6A21\u5757\u7EA7\u65E5\u5FD7\u5668\n * @param {string} moduleName - \u6A21\u5757\u540D\u79F0\uFF0C\u4F8B\u5982 'Humanize', 'Stealth'\n */\nexport function createLogger(moduleName) {\n const prefix = `[${moduleName}]`;\n\n return {\n /**\n * \u65B9\u6CD5\u5F00\u59CB\u65E5\u5FD7\n * @param {string} methodName - \u65B9\u6CD5\u540D\u79F0\n * @param {string} [params] - \u53C2\u6570\u6458\u8981 (\u53EF\u9009)\n */\n start(methodName, params = '') {\n const paramStr = params ? ` (${params})` : '';\n log.info(`${prefix} \uD83D\uDD37 ${methodName} \u5F00\u59CB${paramStr}`);\n },\n\n /**\n * \u65B9\u6CD5\u6210\u529F\u65E5\u5FD7\n * @param {string} methodName - \u65B9\u6CD5\u540D\u79F0\n * @param {string} [result] - \u7ED3\u679C\u6458\u8981 (\u53EF\u9009)\n */\n success(methodName, result = '') {\n const resultStr = result ? ` (${result})` : '';\n log.info(`${prefix} \u2705 ${methodName} \u5B8C\u6210${resultStr}`);\n },\n\n /**\n * \u65B9\u6CD5\u5931\u8D25\u65E5\u5FD7\n * @param {string} methodName - \u65B9\u6CD5\u540D\u79F0\n * @param {Error|string} error - \u9519\u8BEF\u5BF9\u8C61\u6216\u4FE1\u606F\n */\n fail(methodName, error) {\n const message = error instanceof Error ? error.message : error;\n log.error(`${prefix} \u274C ${methodName} \u5931\u8D25: ${message}`);\n },\n\n /**\n * \u8C03\u8BD5\u65E5\u5FD7\n * @param {string} message - \u8BE6\u60C5\n */\n debug(message) {\n log.debug(`${prefix} \uD83D\uDD39 ${message}`);\n },\n\n /**\n * \u8B66\u544A\u65E5\u5FD7\n * @param {string} message - \u8B66\u544A\u4FE1\u606F\n */\n warn(message) {\n log.warning(`${prefix} \u26A0\uFE0F ${message}`);\n },\n\n /**\n * \u666E\u901A\u4FE1\u606F\u65E5\u5FD7\n * @param {string} message - \u4FE1\u606F\n */\n info(message) {\n log.info(`${prefix} \uD83D\uDCD6 ${message}`);\n }\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", "import { Status, Code } from './constants';\nimport { createLogger } from './internal/logger';\nimport { CrawlerError } from './errors';\nimport { serializeError } from 'serialize-error';\n\nconst logger = createLogger('ApifyKit');\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\n return {\n /**\n * \u6838\u5FC3\u5C01\u88C5\uFF1A\u6267\u884C\u6B65\u9AA4\uFF0C\u5E26\u81EA\u52A8\u65E5\u5FD7\u786E\u8BA4\u548C\u5931\u8D25\u622A\u56FE\u5904\u7406\n */\n async runStep(step, page, actionFn, options = {}) {\n const { failActor = true } = options; // \u9ED8\u8BA4\u8C03\u7528 Actor.fail\n\n // log.info(`\uD83D\uDD04 [\u6B63\u5728\u6267\u884C] ${step}...`);\n logger.start(`[Step] ${step}`);\n\n try {\n const result = await actionFn();\n // log.info(`\u2705 [\u6267\u884C\u6210\u529F] ${step}`);\n logger.success(`[Step] ${step}`);\n return result;\n } catch (error) {\n // log.error(`\u274C [\u6267\u884C\u5931\u8D25] ${step}: ${error.message}`);\n logger.fail(`[Step] ${step}`, error);\n\n let base64 = '\u622A\u56FE\u5931\u8D25';\n try {\n if (page) {\n const buffer = await page.screenshot({ fullPage: true, type: 'jpeg', quality: 60 });\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 // \u4F7F\u7528 pushFailed \u65B9\u6CD5\u63A8\u9001\u5931\u8D25\u6570\u636E\uFF08\u79C1\u6709\u4F7F\u7528\uFF09\n await this.pushFailed(error, {\n step,\n page,\n options,\n base64\n });\n\n // \u6839\u636E failActor \u51B3\u5B9A\u662F\u5426\u8C03\u7528 Actor.fail\n if (failActor) {\n await Actor.fail(`Run Step ${step} \u5931\u8D25: ${error.message}`);\n } else {\n // \u4E0D\u8C03\u7528 Actor.fail\uFF0C\u76F4\u63A5\u629B\u51FA\u9519\u8BEF\n throw error;\n }\n }\n },\n\n /**\n * \u5BBD\u677E\u7248runStep\uFF1A\u5931\u8D25\u65F6\u4E0D\u8C03\u7528Actor.fail\uFF0C\u53EA\u629B\u51FA\u5F02\u5E38\n */\n async runStepLoose(step, page, fn) {\n return await this.runStep(step, page, fn, { failActor: false });\n },\n\n /**\n * \u63A8\u9001\u6210\u529F\u6570\u636E\u7684\u901A\u7528\u65B9\u6CD5\n * @param {Object} data - \u8981\u63A8\u9001\u7684\u6570\u636E\u5BF9\u8C61\n */\n async pushSuccess(data) {\n await Actor.pushData({\n // \u56FA\u5B9A\u4E3A0\n code: Code.Success,\n status: Status.Success,\n timestamp: new Date().toISOString(),\n data\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\u4F9BrunStep\u5185\u90E8\u4F7F\u7528\uFF09\n * \u81EA\u52A8\u89E3\u6790 CrawlerError \u7684 code \u548C context\n * @param {Error|CrawlerError} error - \u9519\u8BEF\u5BF9\u8C61\n * @param {Object} [meta] - \u989D\u5916\u7684\u6570\u636E\uFF08\u5982failedStep, screenshotBase64\u7B49\uFF09\n * @private\n */\n async pushFailed(error, meta = {}) {\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\n await Actor.pushData({\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 error: serializeError(error),\n meta,\n context,\n timestamp: new Date().toISOString(),\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 { createLogger } from './internal/logger';\nimport delay from 'delay';\n\nconst logger = createLogger('Utils');\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 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\n /**\n * \u5168\u9875\u9762\u6EDA\u52A8\u622A\u56FE\n * \u81EA\u52A8\u68C0\u6D4B\u9875\u9762\u6240\u6709\u53EF\u6EDA\u52A8\u5143\u7D20\uFF0C\u53D6\u6700\u5927\u9AD8\u5EA6\uFF0C\u5F3A\u5236\u5C55\u5F00\u540E\u622A\u56FE\n * \n * @param {import('playwright').Page} page - Playwright page \u5BF9\u8C61\n * @param {Object} [options] - \u914D\u7F6E\u9009\u9879\n * @param {number} [options.buffer] - \u989D\u5916\u7F13\u51B2\u9AD8\u5EA6 (\u9ED8\u8BA4: \u89C6\u53E3\u9AD8\u5EA6\u7684\u4E00\u534A)\n * @returns {Promise<string>} - base64 \u7F16\u7801\u7684 PNG \u56FE\u7247\n */\n async fullPageScreenshot(page, options = {}) {\n logger.start('fullPageScreenshot', 'detecting scrollable elements');\n const originalViewport = page.viewportSize();\n const defaultBuffer = Math.round((originalViewport?.height || 1080) / 2);\n const buffer = options.buffer ?? defaultBuffer;\n\n try {\n // 1. \u81EA\u52A8\u627E\u51FA\u6240\u6709\u53EF\u6EDA\u52A8\u5143\u7D20\u5E76\u5C55\u5F00\uFF0C\u8FD4\u56DE\u6700\u5927\u9AD8\u5EA6\n const maxScrollHeight = await page.evaluate(() => {\n let maxHeight = document.body.scrollHeight;\n\n document.querySelectorAll('*').forEach(el => {\n const style = window.getComputedStyle(el);\n const overflowY = style.overflowY;\n\n if ((overflowY === 'auto' || overflowY === 'scroll') &&\n el.scrollHeight > el.clientHeight) {\n if (el.scrollHeight > maxHeight) {\n maxHeight = el.scrollHeight;\n }\n el.style.overflow = 'visible';\n el.style.height = 'auto';\n el.style.maxHeight = 'none';\n }\n });\n\n return maxHeight;\n });\n\n // 2. \u8C03\u6574\u89C6\u53E3\u9AD8\u5EA6\n await page.setViewportSize({\n width: originalViewport?.width || 1280,\n height: maxScrollHeight + buffer\n });\n\n // \u7B49\u5F85\u6E32\u67D3\n await delay(1000);\n\n // 3. \u622A\u56FE\n const buffer_ = await page.screenshot({\n fullPage: true,\n type: 'png'\n });\n\n logger.success('fullPageScreenshot', `captured ${Math.round(buffer_.length / 1024)} KB`);\n return buffer_.toString('base64');\n } finally {\n if (originalViewport) {\n await page.setViewportSize(originalViewport);\n }\n }\n }\n}\n\n", "import { createLogger } from './internal/logger';\n\nconst logger = createLogger('Stealth');\n\nexport const Stealth = {\n /**\n * \u5173\u952E\u4FEE\u590D\uFF1A\u5C06 Page \u89C6\u53E3\u8C03\u6574\u4E3A\u4E0E\u6D4F\u89C8\u5668\u6307\u7EB9 (window.screen) \u4E00\u81F4\u3002\n * \u9632\u6B62 \"Viewport Mismatch\" \u7C7B\u578B\u7684\u53CD\u722C\u68C0\u6D4B\u3002\n * @param {import('playwright').Page} page \n */\n async syncViewportWithScreen(page) {\n try {\n // \u83B7\u53D6\u6307\u7EB9\u4E2D\u7684\u5C4F\u5E55\u5C3A\u5BF8\n const screen = await page.evaluate(() => ({\n width: window.screen.width,\n height: window.screen.height,\n availWidth: window.screen.availWidth,\n availHeight: window.screen.availHeight,\n }));\n\n // \u8C03\u6574\u89C6\u53E3\n await page.setViewportSize({\n width: screen.width,\n height: screen.height\n });\n\n logger.success('syncViewportWithScreen', `size=${screen.width}x${screen.height}`);\n } catch (e) {\n logger.warn(`syncViewportWithScreen Failed: ${e.message}. Fallback to 1920x1080.`);\n await page.setViewportSize({ width: 1920, height: 1080 });\n }\n },\n\n /**\n * \u786E\u4FDD navigator.webdriver \u9690\u85CF (\u901A\u5E38 Playwright Stealth \u63D2\u4EF6\u5DF2\u5904\u7406\uFF0C\u4F46\u53CC\u91CD\u4FDD\u9669)\n */\n async hideWebdriver(page) {\n await page.addInitScript(() => {\n Object.defineProperty(navigator, 'webdriver', {\n get: () => false,\n });\n });\n logger.success('hideWebdriver');\n },\n\n /**\n * \u901A\u7528\u7684 Playwright \u8D44\u6E90\u62E6\u622A\u5668\uFF0C\u7528\u4E8E\u5C4F\u853D\u4E0D\u5FC5\u8981\u7684\u8D44\u6E90\u4EE5\u52A0\u901F\u52A0\u8F7D\n * @param {import('playwright').Page} page\n * @param {string[]} [resourceTypes] - \u8981\u5C4F\u853D\u7684\u8D44\u6E90\u7C7B\u578B\uFF0C\u9ED8\u8BA4\u4E3A ['font', 'image', 'media']\n */\n async setupBlockingResources(page, resourceTypes = ['font', 'image', 'media']) {\n await page.route('**/*', (route) => {\n const request = route.request();\n const type = request.resourceType();\n if (resourceTypes.includes(type)) {\n return route.abort();\n }\n return route.continue();\n });\n logger.success('setupBlockingResources', `types=[${resourceTypes.join(',')}]`);\n },\n\n /**\n * \u83B7\u53D6\u63A8\u8350\u7684 Stealth \u542F\u52A8\u53C2\u6570\n */\n getStealthLaunchArgs() {\n return [\n '--disable-blink-features=AutomationControlled',\n '--no-sandbox',\n '--disable-setuid-sandbox',\n '--disable-infobars',\n '--window-position=0,0',\n '--ignore-certificate-errors',\n '--disable-web-security',\n // \u6CE8\u610F\uFF1A\u4E0D\u5EFA\u8BAE\u8FD9\u91CC\u5F3A\u5236\u6307\u5B9A window-size\uFF0C\u8BA9 syncViewportWithScreen \u53BB\u52A8\u6001\u8C03\u6574\n // '--window-size=1920,1080' \n ];\n },\n\n /**\n * \u83B7\u53D6\u589E\u5F3A\u7248 Stealth \u542F\u52A8\u53C2\u6570 (\u63A8\u8350\u7528\u4E8E\u9AD8\u98CE\u9669\u53CD\u722C\u573A\u666F)\n * \u5305\u542B\u66F4\u591A\u9488\u5BF9\u81EA\u52A8\u5316\u68C0\u6D4B\u7684\u9632\u62A4\n */\n getAdvancedStealthArgs() {\n return [\n ...this.getStealthLaunchArgs(),\n // \u7981\u7528\u5404\u79CD\u53EF\u80FD\u66B4\u9732\u81EA\u52A8\u5316\u7684\u7279\u5F81\n '--disable-dev-shm-usage',\n '--disable-accelerated-2d-canvas',\n '--disable-gpu-sandbox',\n '--disable-background-networking',\n '--disable-default-apps',\n '--disable-extensions',\n '--disable-sync',\n '--disable-translate',\n '--metrics-recording-only',\n '--mute-audio',\n '--no-first-run',\n // \u6A21\u62DF\u771F\u5B9E\u7528\u6237\u914D\u7F6E\n '--lang=zh-CN,zh',\n ];\n },\n\n /**\n * \u8BBE\u7F6E\u4E2D\u56FD\u65F6\u533A (Asia/Shanghai, UTC+8)\n * \n * \u9632\u6B62\u65F6\u533A\u4E0D\u4E00\u81F4\u7684\u68C0\u6D4B\u3002\u5BF9\u4E8E\u4E2D\u56FD\u5883\u5185\u722C\u53D6\u5F3A\u70C8\u63A8\u8350\u4F7F\u7528\u3002\n * \u5E94\u5728 preNavigationHooks \u6216 BrowserContext \u521B\u5EFA\u540E\u8C03\u7528\u3002\n * \n * @param {import('playwright').BrowserContext} context\n */\n async setChinaTimezone(context) {\n // Playwright \u901A\u8FC7 context \u8BBE\u7F6E\u65F6\u533A\n // \u6CE8\u610F\uFF1A\u8FD9\u9700\u8981\u5728 context \u521B\u5EFA\u65F6\u8BBE\u7F6E\uFF0C\u6216\u8005\u4F7F\u7528 CDP\n // \u8FD9\u91CC\u4F7F\u7528 addInitScript \u6CE8\u5165 Intl \u8986\u76D6\n await context.addInitScript(() => {\n // \u8986\u76D6 Intl.DateTimeFormat \u9ED8\u8BA4\u65F6\u533A\n const originalDateTimeFormat = Intl.DateTimeFormat;\n Intl.DateTimeFormat = function (locales, options) {\n options = options || {};\n options.timeZone = options.timeZone || 'Asia/Shanghai';\n return new originalDateTimeFormat(locales, options);\n };\n Intl.DateTimeFormat.prototype = originalDateTimeFormat.prototype;\n\n // \u8986\u76D6 Date.prototype.getTimezoneOffset \u8FD4\u56DE -480 (UTC+8)\n Date.prototype.getTimezoneOffset = function () {\n return -480; // UTC+8 = -480 \u5206\u949F\n };\n });\n logger.success('setChinaTimezone', 'Asia/Shanghai (UTC+8)');\n }\n}\n", "import delay from 'delay';\nimport { createCursor } from 'ghost-cursor-playwright';\nimport { createLogger } from './internal/logger';\n\nconst logger = createLogger('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 // CSS \u9009\u62E9\u5668\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 // \u5750\u6807\u5BF9\u8C61\n await cursor.actions.move(target);\n } else if (target && typeof target.boundingBox === 'function') {\n // ElementHandle\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 * \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 */\n async humanClick(page, target, options = {}) {\n const cursor = $GetCursor(page);\n\n // \u517C\u5BB9\u5904\u7406\uFF1A\u5982\u679C\u7B2C\u4E8C\u4E2A\u53C2\u6570\u662F\u5BF9\u8C61\u4E14\u6CA1\u6709\u7B2C\u4E09\u4E2A\u53C2\u6570\uFF0C\u8BF4\u660E\u7528\u6237\u7701\u7565\u4E86 target (\u5373 humanClick(page, options))\n // \u4F46\u901A\u5E38\u6211\u4EEC\u4F1A\u9075\u5FAA humanClick(page, null, options) \u7684\u8C03\u7528\u65B9\u5F0F\u3002\n // \u8FD9\u91CC\u7B80\u5355\u5904\u7406\uFF1A\u5982\u679C target \u662F plain object \u4E14 options \u662F\u7A7A\u5BF9\u8C61(\u9ED8\u8BA4\u503C)\uFF0C\u53EF\u80FD\u7528\u6237\u4F20\u9519\u4E86\uFF1F\n // \u8FD8\u662F\u4E25\u683C\u6309\u7167\u6587\u6863\uFF1A\u5982\u679C\u8981\u70B9\u51FB\u5F53\u524D\u4F4D\u7F6E\uFF0C\u4F20 null/undefined\u3002\n\n const { reactionDelay = 250, throwOnMissing = true } = options;\n\n const targetDesc = target == null ? 'Current Position' : (typeof target === 'string' ? target : 'ElementHandle');\n logger.start('humanClick', `target=${targetDesc}`);\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 const box = await element.boundingBox();\n if (!box) {\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 // \u8BA1\u7B97\u5E26\u968F\u673A\u504F\u79FB\u7684\u70B9\u51FB\u4F4D\u7F6E\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 // \u4EBA\u7C7B\u53CD\u5E94\u5EF6\u8FDF (150-400ms \u8303\u56F4)\n await delay(this.jitterMs(reactionDelay, 0.4));\n await cursor.actions.click();\n\n logger.success('humanClick');\n return true;\n } catch (error) {\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 locator.click();\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\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", "// \u96C6\u4E2D\u7BA1\u7406\u542F\u52A8\u914D\u7F6E\uFF0C\u6682\u65F6\u4E3B\u8981\u7531 Stealth \u6A21\u5757\u63D0\u4F9B Args\uFF0C\u8FD9\u91CC\u4F5C\u4E3A\u6269\u5C55\u70B9\nimport { Stealth } from './stealth';\nimport { createLogger } from './internal/logger';\n\nconst logger = createLogger('Launch');\n\nexport const Launch = {\n getLaunchOptions(customArgs = []) {\n return {\n args: [\n ...Stealth.getStealthLaunchArgs(),\n ...customArgs\n ],\n ignoreDefaultArgs: ['--enable-automation'],\n };\n },\n\n /**\n * \u83B7\u53D6\u589E\u5F3A\u7248\u542F\u52A8\u9009\u9879\uFF08\u7528\u4E8E\u9AD8\u98CE\u9669\u53CD\u722C\u573A\u666F\uFF09\n */\n getAdvancedLaunchOptions(customArgs = []) {\n return {\n args: [\n ...Stealth.getAdvancedStealthArgs(),\n ...customArgs\n ],\n ignoreDefaultArgs: ['--enable-automation'],\n };\n },\n\n /**\n * \u63A8\u8350\u7684 Fingerprint Generator \u9009\u9879\n * \u786E\u4FDD\u751F\u6210\u7684\u662F\u684C\u9762\u7AEF\u3001\u8F83\u65B0\u7684 Chrome\uFF0C\u4EE5\u5339\u914D\u6211\u4EEC\u7684\u811A\u672C\u903B\u8F91\n */\n getFingerprintGeneratorOptions() {\n return {\n browsers: [{ name: 'chrome', minVersion: 110 }],\n devices: ['desktop'],\n operatingSystems: ['windows', 'linux'], // \u5305\u542B Linux \u517C\u5BB9\u5BB9\u5668\n };\n },\n\n /**\n * \u521B\u5EFA\u5DF2\u6CE8\u518C Stealth \u63D2\u4EF6\u7684 Chromium \u5B9E\u4F8B\n * \n * \u5C01\u88C5\u4E86 `chromium.use(stealthPlugin())` \u7684\u5E38\u7528\u6A21\u5F0F\n * \n * @example\n * ```javascript\n * import { chromium } from 'playwright-extra';\n * import stealthPlugin from 'puppeteer-extra-plugin-stealth';\n * \n * const stealthChromium = Launch.createStealthChromium(chromium, stealthPlugin);\n * // \u73B0\u5728 stealthChromium \u5DF2\u6CE8\u518C stealth \u63D2\u4EF6\uFF0C\u53EF\u7528\u4E8E launchContext.launcher\n * ```\n * \n * @param {import('playwright-extra').ChromiumExtra} chromium - playwright-extra \u7684 chromium\n * @param {Function} stealthPlugin - puppeteer-extra-plugin-stealth \u7684\u9ED8\u8BA4\u5BFC\u51FA\n * @returns {import('playwright-extra').ChromiumExtra} \u5DF2\u6CE8\u518C stealth \u7684 chromium\n */\n createStealthChromium(chromium, stealthPlugin) {\n chromium.use(stealthPlugin());\n logger.success('createStealthChromium', 'Stealth plugin registered');\n return chromium;\n }\n}\n\n", "import express from 'express';\nimport { Actor } from 'apify';\nimport { PresetOfLiveViewKey } from './constants';\nimport { createLogger } from './internal/logger';\n\nconst logger = createLogger('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 page.screenshot({ 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 { createLogger } from './internal/logger';\n\nconst logger = createLogger('Captcha');\n\n/**\n * \u521B\u5EFA\u9A8C\u8BC1\u7801\u76D1\u63A7\u5668 - \u652F\u6301 DOM \u9009\u62E9\u5668 \u548C URL \u6A21\u5F0F \u4E24\u79CD\u68C0\u6D4B\u65B9\u5F0F\n * \n * \u6CE8\u610F\uFF1A\u76D1\u63A7\u5668\u968F\u9875\u9762\u751F\u547D\u5468\u671F\u81EA\u52A8\u6E05\u7406\uFF0C\u65E0\u9700\u624B\u52A8 cleanup\n * \n * @param {import('playwright').Page} page\n * @param {Object} options\n * @param {string} [options.domSelector] - DOM \u5143\u7D20\u9009\u62E9\u5668 (\u5982 '#captcha_container')\n * @param {string} [options.urlPattern] - URL \u5339\u914D\u6A21\u5F0F (\u5982 '/captcha')\n * @param {Function} options.onDetected - \u68C0\u6D4B\u5230\u9A8C\u8BC1\u7801\u65F6\u7684\u56DE\u8C03 (async function)\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 \u81F3\u5C11\u4E00\u4E2A');\n }\n\n if (!onDetected || typeof onDetected !== 'function') {\n throw new Error('[CaptchaMonitor] onDetected \u5FC5\u987B\u662F\u4E00\u4E2A\u51FD\u6570');\n }\n\n let isHandled = false;\n let frameHandler = null;\n let exposedFunctionName = null;\n\n const triggerDetected = async () => {\n if (isHandled) return;\n isHandled = true;\n await onDetected();\n };\n\n const cleanupFns = [];\n\n // ============================================================\n // \u6A21\u5F0F1: DOM \u76D1\u63A7 (\u4F7F\u7528 MutationObserver)\n // ============================================================\n if (domSelector) {\n // \u751F\u6210\u552F\u4E00\u7684\u51FD\u6570\u540D\u907F\u514D\u51B2\u7A81\n exposedFunctionName = `__c_d_${uuidv4().replace(/-/g, '_')}`;\n // \u751F\u6210\u552F\u4E00\u7684\u6E05\u7406\u51FD\u6570\u540D (\u6302\u8F7D\u5728 window \u4E0A)\n const cleanerName = `__c_cleaner_${uuidv4().replace(/-/g, '_')}`;\n\n // \u66B4\u9732\u56DE\u8C03\u51FD\u6570\u7ED9\u9875\u9762\n page.exposeFunction(exposedFunctionName, triggerDetected).catch(() => {\n // \u5FFD\u7565\u91CD\u590D\u66B4\u9732\u9519\u8BEF\n });\n\n // \u6CE8\u5165 MutationObserver \u76D1\u542C\u811A\u672C\n page.addInitScript(({ selector, callbackName, cleanerName }) => {\n (() => {\n let observer = null;\n\n const checkAndReport = () => {\n const element = document.querySelector(selector);\n if (element) {\n if (observer) {\n observer.disconnect();\n observer = null;\n }\n if (window[callbackName]) {\n window[callbackName]();\n }\n return true;\n }\n return false;\n };\n\n // 1. \u7ACB\u5373\u68C0\u67E5\u4E00\u6B21\n if (checkAndReport()) return;\n\n // 2. \u542F\u52A8 MutationObserver\n observer = new MutationObserver((mutations) => {\n let shouldCheck = false;\n for (const mutation of mutations) {\n if (mutation.addedNodes.length > 0) {\n shouldCheck = true;\n break;\n }\n }\n if (shouldCheck && observer) {\n checkAndReport();\n }\n });\n\n // 3. \u6302\u8F7D\u76D1\u542C\uFF08\u786E\u4FDD DOM \u51C6\u5907\u5C31\u7EEA\uFF09\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 // 4. \u6CE8\u518C\u6E05\u7406\u51FD\u6570\n window[cleanerName] = () => {\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: ${domSelector}`);\n\n // \u6DFB\u52A0\u6E05\u7406\u903B\u8F91\n cleanupFns.push(async () => {\n try {\n // \u8C03\u7528\u9875\u9762\u5185\u7684\u6E05\u7406\u51FD\u6570\n await page.evaluate((name) => {\n if (window[name]) {\n window[name]();\n delete window[name];\n }\n }, cleanerName);\n } catch (e) {\n // \u9875\u9762\u53EF\u80FD\u5DF2\u5173\u95ED\u6216\u8DF3\u8F6C\uFF0C\u5FFD\u7565\u9519\u8BEF\n }\n });\n }\n\n // ============================================================\n // \u6A21\u5F0F2: URL \u76D1\u63A7 (\u76D1\u542C framenavigated)\n // ============================================================\n if (urlPattern) {\n frameHandler = async (frame) => {\n if (frame === page.mainFrame()) {\n const currentUrl = page.url();\n if (currentUrl.includes(urlPattern)) {\n await triggerDetected();\n }\n }\n };\n\n page.on('framenavigated', frameHandler);\n logger.success('useCaptchaMonitor', `URL \u76D1\u63A7\u5DF2\u542F\u7528: ${urlPattern}`);\n\n // \u6DFB\u52A0\u6E05\u7406\u903B\u8F91\n cleanupFns.push(async () => {\n page.off('framenavigated', frameHandler);\n });\n }\n\n // \u8FD4\u56DE\u63A7\u5236\u53E5\u67C4\n return {\n stop: async () => {\n logger.info('useCaptchaMonitor', '\u6B63\u5728\u505C\u6B62\u76D1\u63A7...');\n for (const fn of cleanupFns) {\n await fn();\n }\n isHandled = true; // \u9632\u6B62\u540E\u7EED\u89E6\u53D1\n }\n };\n}\n\n// \u6309\u7167 toolkit \u7EDF\u4E00\u7684\u5BFC\u51FA\u6A21\u5F0F\nexport const Captcha = {\n useCaptchaMonitor\n};\n", "import https from 'https';\nimport { URL } from 'url';\nimport { createLogger } from './internal/logger';\n\nconst logger = createLogger('Sse');\n\nexport const Sse = {\n /**\n * \u89E3\u6790 SSE \u6D41\u6587\u672C\n * \u652F\u6301 `data: {...}` \u548C `data:{...}` \u4E24\u79CD\u683C\u5F0F\n * @param {string} sseStreamText\n * @returns {Array<Object>} events\n */\n parseSseStream(sseStreamText) {\n const events = [];\n const lines = sseStreamText.split('\\n');\n for (const line of lines) {\n // \u517C\u5BB9\u4E24\u79CD\u683C\u5F0F: \"data: {...}\" \u548C \"data:{...}\"\n if (line.startsWith('data:')) {\n try {\n // \u79FB\u9664 \"data:\" \u524D\u7F00\u5E76 trim\uFF0C\u7EDF\u4E00\u5904\u7406\u6709\u65E0\u7A7A\u683C\u7684\u60C5\u51B5\n const jsonContent = line.substring(5).trim();\n if (jsonContent && typeof jsonContent === 'object') {\n events.push(JSON.parse(jsonContent));\n }\n } catch (e) {\n // \u5FFD\u7565\u975E\u6709\u6548 JSON \u7684\u884C\n logger.debug('parseSseStream', `JSON \u89E3\u6790\u5931\u8D25: ${e.message}, line: ${line.substring(0, 100)}...`);\n }\n }\n }\n logger.success('parseSseStream', `\u89E3\u6790\u5B8C\u6210, events \u6570\u91CF: ${events.length}`);\n return events;\n },\n\n /**\n * \u62E6\u622A\u7F51\u7EDC\u8BF7\u6C42\u5E76\u4F7F\u7528 Node.js \u539F\u751F https \u6A21\u5757\u8F6C\u53D1\uFF0C\u4EE5\u89E3\u51B3\u6D41\u5F0F\u6570\u636E\u6355\u83B7\u95EE\u9898\u3002\n * @param {import('playwright').Page} page\n * @param {string|RegExp} urlPattern - \u62E6\u622A\u7684 URL \u6A21\u5F0F\n * @param {object} options\n * @param {function(string, function, string): void} [options.onData] - (textChunk, resolve, accumulatedText) => void\n * @param {function(string, function): void} [options.onEnd] - (fullText, resolve) => void\n * @param {number} [options.timeout=180000] - \u8D85\u65F6\u65F6\u95F4 (ms)\n * @returns {Promise<any>} - \u8FD4\u56DE Promise\uFF0C\u5F53\u6D41\u6EE1\u8DB3\u6761\u4EF6\u65F6 resolve\n */\n async intercept(page, urlPattern, options = {}) {\n const { onData, onEnd, timeout = 180000 } = options;\n\n let streamResolve, streamReject;\n const capturePromise = new Promise((resolve, reject) => {\n streamResolve = resolve;\n streamReject = reject;\n });\n\n // \u8BBE\u7F6E\u5B89\u5168\u8D85\u65F6\uFF0C\u9632\u6B62 Promise \u6C38\u8FDC\u6302\u8D77\n const timeoutId = setTimeout(() => {\n // \u6CE8\u610F\uFF1A\u8FD9\u91CC\u4E0D reject capturePromise\uFF0C\u56E0\u4E3A\u53EF\u80FD\u8BF7\u6C42\u6CA1\u53D1\u751F\uFF0C\u6216\u8005\u7531\u5916\u90E8\u63A7\u5236\u8D85\u65F6\n // \u4F46\u4E3A\u4E86\u907F\u514D\u5185\u5B58\u6CC4\u6F0F\u548C\u672A\u5904\u7406\u72B6\u6001\uFF0C\u53EF\u4EE5\u6253\u5370\u65E5\u5FD7\n logger.debug('intercept', `Intercept promise timeout timer reached (${timeout}ms)`);\n }, timeout + 5000); // \u7A0D\u5FAE\u5BBD\u88D5\u4E00\u70B9\n\n await page.route(urlPattern, async (route) => {\n const request = route.request();\n const requestUrl = request.url();\n logger.info(`[MITM] \u5DF2\u62E6\u622A\u8BF7\u6C42: ${requestUrl}`);\n\n try {\n const headers = await request.allHeaders();\n const postData = request.postData();\n const urlObj = new URL(requestUrl);\n\n // \u5220\u9664 accept-encoding \u5F3A\u5236\u660E\u6587\uFF0C\u5220\u9664 content-length \u8BA9 Node \u91CD\u7B97\n delete headers['accept-encoding'];\n delete headers['content-length'];\n\n const reqOptions = {\n hostname: urlObj.hostname,\n port: 443,\n path: urlObj.pathname + urlObj.search,\n method: request.method(),\n headers: headers,\n timeout: timeout\n };\n\n const req = https.request(reqOptions, (res) => {\n const chunks = [];\n let accumulatedText = \"\";\n\n // A. \u5B9E\u65F6\u6570\u636E\u76D1\u542C\n res.on('data', (chunk) => {\n chunks.push(chunk);\n const textChunk = chunk.toString('utf-8');\n accumulatedText += textChunk;\n\n logger.debug(`[CHUNK] ${textChunk.length} bytes`);\n\n if (onData) {\n try {\n onData(textChunk, streamResolve, accumulatedText);\n } catch (e) {\n logger.error(`onData callback error: ${e.message}`);\n }\n }\n });\n\n // B. \u7ED3\u675F\u76D1\u542C\n res.on('end', () => {\n logger.info('[MITM] \u4E0A\u6E38\u54CD\u5E94\u7ED3\u675F (Stream End)');\n clearTimeout(timeoutId);\n const fullBody = Buffer.concat(chunks);\n\n if (onEnd) {\n try {\n onEnd(accumulatedText, streamResolve);\n } catch (e) {\n logger.error(`onEnd callback error: ${e.message}`);\n }\n } else if (!onData) {\n // \u5982\u679C\u6CA1\u6709\u56DE\u8C03\uFF0C\u9ED8\u8BA4\u7ED3\u675F\u65F6 resolve \u5168\u6587\n streamResolve(accumulatedText);\n }\n\n // \u8FD4\u56DE\u7ED9\u6D4F\u89C8\u5668\n route.fulfill({\n status: res.statusCode,\n headers: res.headers,\n body: fullBody\n }).catch(e => logger.warning(`Route fulfill failed: ${e.message}`));\n });\n });\n\n req.on('error', (e) => {\n logger.error(`[MITM] Upstream request error: ${e.message}`);\n clearTimeout(timeoutId);\n route.abort();\n streamReject(e);\n });\n\n if (postData) {\n req.write(postData);\n }\n req.end();\n\n } catch (e) {\n logger.error(`[MITM] Setup error: ${e.message}`);\n clearTimeout(timeoutId);\n route.continue();\n }\n });\n\n return capturePromise;\n }\n};\n", "import { ApifyKit } from './src/apify-kit';\nimport { Utils } from './src/utils';\nimport { Stealth } from './src/stealth';\nimport { Humanize } from './src/humanize';\nimport { Launch } from './src/launch';\nimport { LiveView } from './src/live-view';\nimport { Captcha } from './src/captcha-monitor';\nimport { Sse } from './src/sse';\nimport * as Constants from './src/constants';\nimport * as Errors from './src/errors';\n\n// Unified Entry Point\nexport const usePlaywrightToolKit = () => {\n return {\n ApifyKit,\n Stealth,\n Humanize,\n Launch,\n LiveView,\n Constants,\n Utils,\n Captcha,\n Sse,\n Errors\n };\n};\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["export const Code = {\n Success: 0,\n UnknownError: -1,\n NotLogin: 30000001,\n Chaptcha: 30000002,\n}\n\nexport const Status = {\n Success: 'SUCCESS',\n Failed: 'FAILED'\n}\n\nexport const FAILED_KEY_SEPARATOR = '::<@>::';\n\nexport const PresetOfLiveViewKey = 'LIVE_VIEW_SCREENSHOT';\n", "import { log } from 'crawlee';\n\n/**\n * \u521B\u5EFA\u6A21\u5757\u7EA7\u65E5\u5FD7\u5668\n * @param {string} moduleName - \u6A21\u5757\u540D\u79F0\uFF0C\u4F8B\u5982 'Humanize', 'Stealth'\n */\nexport function createLogger(moduleName) {\n const prefix = `[${moduleName}]`;\n\n return {\n /**\n * \u65B9\u6CD5\u5F00\u59CB\u65E5\u5FD7\n * @param {string} methodName - \u65B9\u6CD5\u540D\u79F0\n * @param {string} [params] - \u53C2\u6570\u6458\u8981 (\u53EF\u9009)\n */\n start(methodName, params = '') {\n const paramStr = params ? ` (${params})` : '';\n log.info(`${prefix} \uD83D\uDD37 ${methodName} \u5F00\u59CB${paramStr}`);\n },\n\n /**\n * \u65B9\u6CD5\u6210\u529F\u65E5\u5FD7\n * @param {string} methodName - \u65B9\u6CD5\u540D\u79F0\n * @param {string} [result] - \u7ED3\u679C\u6458\u8981 (\u53EF\u9009)\n */\n success(methodName, result = '') {\n const resultStr = result ? ` (${result})` : '';\n log.info(`${prefix} \u2705 ${methodName} \u5B8C\u6210${resultStr}`);\n },\n\n /**\n * \u65B9\u6CD5\u5931\u8D25\u65E5\u5FD7\n * @param {string} methodName - \u65B9\u6CD5\u540D\u79F0\n * @param {Error|string} error - \u9519\u8BEF\u5BF9\u8C61\u6216\u4FE1\u606F\n */\n fail(methodName, error) {\n const message = error instanceof Error ? error.message : error;\n log.error(`${prefix} \u274C ${methodName} \u5931\u8D25: ${message}`);\n },\n\n /**\n * \u8C03\u8BD5\u65E5\u5FD7\n * @param {string} message - \u8BE6\u60C5\n */\n debug(message) {\n log.debug(`${prefix} \uD83D\uDD39 ${message}`);\n },\n\n /**\n * \u8B66\u544A\u65E5\u5FD7\n * @param {string} message - \u8B66\u544A\u4FE1\u606F\n */\n warn(message) {\n log.warning(`${prefix} \u26A0\uFE0F ${message}`);\n },\n\n /**\n * \u666E\u901A\u4FE1\u606F\u65E5\u5FD7\n * @param {string} message - \u4FE1\u606F\n */\n info(message) {\n log.info(`${prefix} \uD83D\uDCD6 ${message}`);\n }\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 * TimeoutError - \u901A\u7528\u8D85\u65F6\u9519\u8BEF\u57FA\u7C7B\n * \u6240\u6709\u8D85\u65F6\u76F8\u5173\u9519\u8BEF\u7684\u7236\u7C7B\n */\nexport class TimeoutError extends Error {\n /**\n * @param {string} message - \u9519\u8BEF\u4FE1\u606F\n * @param {number} timeout - \u8D85\u65F6\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09\n * @param {Object} [context={}] - \u4E0A\u4E0B\u6587\u4FE1\u606F\n */\n constructor(message, timeout, context = {}) {\n super(message);\n this.name = 'TimeoutError';\n this.timeout = timeout;\n this.context = context;\n this.timestamp = new Date().toISOString();\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, TimeoutError);\n }\n }\n}\n\n/**\n * FirstDataTimeoutError - \u9996\u6B21\u6570\u636E\u63A5\u6536\u8D85\u65F6\u9519\u8BEF\n * \u5728\u7B49\u5F85 SSE \u6D41\u9996\u6B21\u6570\u636E\u65F6\u8D85\u65F6\u629B\u51FA\n */\nexport class FirstDataTimeoutError extends TimeoutError {\n /**\n * @param {number} timeout - \u8D85\u65F6\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09\n * @param {Object} [context={}] - \u4E0A\u4E0B\u6587\u4FE1\u606F\n */\n constructor(timeout, context = {}) {\n super(`\u9996\u6B21\u6570\u636E\u63A5\u6536\u8D85\u65F6 (${timeout}ms)`, timeout, context);\n this.name = 'FirstDataTimeoutError';\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, FirstDataTimeoutError);\n }\n }\n}\n\n/**\n * OverallTimeoutError - \u6574\u4F53\u8BF7\u6C42\u8D85\u65F6\u9519\u8BEF\n * \u5728\u6574\u4E2A\u8BF7\u6C42\u5904\u7406\u8FC7\u7A0B\u8D85\u65F6\u65F6\u629B\u51FA\n */\nexport class OverallTimeoutError extends TimeoutError {\n /**\n * @param {number} timeout - \u8D85\u65F6\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09\n * @param {Object} [context={}] - \u4E0A\u4E0B\u6587\u4FE1\u606F\n */\n constructor(timeout, context = {}) {\n super(`\u6574\u4F53\u8BF7\u6C42\u8D85\u65F6 (${timeout}ms)`, timeout, context);\n this.name = 'OverallTimeoutError';\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, OverallTimeoutError);\n }\n }\n}\n", "import { Status, Code } from './constants';\nimport { createLogger } from './internal/logger';\nimport { CrawlerError } from './errors';\nimport { serializeError } from 'serialize-error';\n\nconst logger = createLogger('ApifyKit');\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\n return {\n /**\n * \u6838\u5FC3\u5C01\u88C5\uFF1A\u6267\u884C\u6B65\u9AA4\uFF0C\u5E26\u81EA\u52A8\u65E5\u5FD7\u786E\u8BA4\u548C\u5931\u8D25\u622A\u56FE\u5904\u7406\n */\n async runStep(step, page, actionFn, options = {}) {\n const { failActor = true } = options; // \u9ED8\u8BA4\u8C03\u7528 Actor.fail\n\n // log.info(`\uD83D\uDD04 [\u6B63\u5728\u6267\u884C] ${step}...`);\n logger.start(`[Step] ${step}`);\n\n try {\n const result = await actionFn();\n // log.info(`\u2705 [\u6267\u884C\u6210\u529F] ${step}`);\n logger.success(`[Step] ${step}`);\n return result;\n } catch (error) {\n // log.error(`\u274C [\u6267\u884C\u5931\u8D25] ${step}: ${error.message}`);\n logger.fail(`[Step] ${step}`, error);\n\n let base64 = '\u622A\u56FE\u5931\u8D25';\n try {\n if (page) {\n const buffer = await page.screenshot({ fullPage: true, type: 'jpeg', quality: 60 });\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 // \u4F7F\u7528 pushFailed \u65B9\u6CD5\u63A8\u9001\u5931\u8D25\u6570\u636E\uFF08\u79C1\u6709\u4F7F\u7528\uFF09\n await this.pushFailed(error, {\n step,\n page,\n options,\n base64\n });\n\n // \u6839\u636E failActor \u51B3\u5B9A\u662F\u5426\u8C03\u7528 Actor.fail\n if (failActor) {\n await Actor.fail(`Run Step ${step} \u5931\u8D25: ${error.message}`);\n } else {\n // \u4E0D\u8C03\u7528 Actor.fail\uFF0C\u76F4\u63A5\u629B\u51FA\u9519\u8BEF\n throw error;\n }\n }\n },\n\n /**\n * \u5BBD\u677E\u7248runStep\uFF1A\u5931\u8D25\u65F6\u4E0D\u8C03\u7528Actor.fail\uFF0C\u53EA\u629B\u51FA\u5F02\u5E38\n */\n async runStepLoose(step, page, fn) {\n return await this.runStep(step, page, fn, { failActor: false });\n },\n\n /**\n * \u63A8\u9001\u6210\u529F\u6570\u636E\u7684\u901A\u7528\u65B9\u6CD5\n * @param {Object} data - \u8981\u63A8\u9001\u7684\u6570\u636E\u5BF9\u8C61\n */\n async pushSuccess(data) {\n await Actor.pushData({\n // \u56FA\u5B9A\u4E3A0\n code: Code.Success,\n status: Status.Success,\n timestamp: new Date().toISOString(),\n data\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\u4F9BrunStep\u5185\u90E8\u4F7F\u7528\uFF09\n * \u81EA\u52A8\u89E3\u6790 CrawlerError \u7684 code \u548C context\n * @param {Error|CrawlerError} error - \u9519\u8BEF\u5BF9\u8C61\n * @param {Object} [meta] - \u989D\u5916\u7684\u6570\u636E\uFF08\u5982failedStep, screenshotBase64\u7B49\uFF09\n * @private\n */\n async pushFailed(error, meta = {}) {\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\n await Actor.pushData({\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 error: serializeError(error),\n meta,\n context,\n timestamp: new Date().toISOString(),\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 { createLogger } from './internal/logger';\nimport delay from 'delay';\n\nconst logger = createLogger('Utils');\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 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\n /**\n * \u5168\u9875\u9762\u6EDA\u52A8\u622A\u56FE\n * \u81EA\u52A8\u68C0\u6D4B\u9875\u9762\u6240\u6709\u53EF\u6EDA\u52A8\u5143\u7D20\uFF0C\u53D6\u6700\u5927\u9AD8\u5EA6\uFF0C\u5F3A\u5236\u5C55\u5F00\u540E\u622A\u56FE\n * \n * @param {import('playwright').Page} page - Playwright page \u5BF9\u8C61\n * @param {Object} [options] - \u914D\u7F6E\u9009\u9879\n * @param {number} [options.buffer] - \u989D\u5916\u7F13\u51B2\u9AD8\u5EA6 (\u9ED8\u8BA4: \u89C6\u53E3\u9AD8\u5EA6\u7684\u4E00\u534A)\n * @returns {Promise<string>} - base64 \u7F16\u7801\u7684 PNG \u56FE\u7247\n */\n async fullPageScreenshot(page, options = {}) {\n logger.start('fullPageScreenshot', 'detecting scrollable elements');\n const originalViewport = page.viewportSize();\n const defaultBuffer = Math.round((originalViewport?.height || 1080) / 2);\n const buffer = options.buffer ?? defaultBuffer;\n\n try {\n // 1. \u81EA\u52A8\u627E\u51FA\u6240\u6709\u53EF\u6EDA\u52A8\u5143\u7D20\u5E76\u5C55\u5F00\uFF0C\u8FD4\u56DE\u6700\u5927\u9AD8\u5EA6\n const maxScrollHeight = await page.evaluate(() => {\n let maxHeight = document.body.scrollHeight;\n\n document.querySelectorAll('*').forEach(el => {\n const style = window.getComputedStyle(el);\n const overflowY = style.overflowY;\n\n if ((overflowY === 'auto' || overflowY === 'scroll') &&\n el.scrollHeight > el.clientHeight) {\n if (el.scrollHeight > maxHeight) {\n maxHeight = el.scrollHeight;\n }\n el.style.overflow = 'visible';\n el.style.height = 'auto';\n el.style.maxHeight = 'none';\n }\n });\n\n return maxHeight;\n });\n\n // 2. \u8C03\u6574\u89C6\u53E3\u9AD8\u5EA6\n await page.setViewportSize({\n width: originalViewport?.width || 1280,\n height: maxScrollHeight + buffer\n });\n\n // \u7B49\u5F85\u6E32\u67D3\n await delay(1000);\n\n // 3. \u622A\u56FE\n const buffer_ = await page.screenshot({\n fullPage: true,\n type: 'png'\n });\n\n logger.success('fullPageScreenshot', `captured ${Math.round(buffer_.length / 1024)} KB`);\n return buffer_.toString('base64');\n } finally {\n if (originalViewport) {\n await page.setViewportSize(originalViewport);\n }\n }\n }\n}\n\n", "import { createLogger } from './internal/logger';\n\nconst logger = createLogger('Stealth');\n\nexport const Stealth = {\n /**\n * \u5173\u952E\u4FEE\u590D\uFF1A\u5C06 Page \u89C6\u53E3\u8C03\u6574\u4E3A\u4E0E\u6D4F\u89C8\u5668\u6307\u7EB9 (window.screen) \u4E00\u81F4\u3002\n * \u9632\u6B62 \"Viewport Mismatch\" \u7C7B\u578B\u7684\u53CD\u722C\u68C0\u6D4B\u3002\n * @param {import('playwright').Page} page \n */\n async syncViewportWithScreen(page) {\n try {\n // \u83B7\u53D6\u6307\u7EB9\u4E2D\u7684\u5C4F\u5E55\u5C3A\u5BF8\n const screen = await page.evaluate(() => ({\n width: window.screen.width,\n height: window.screen.height,\n availWidth: window.screen.availWidth,\n availHeight: window.screen.availHeight,\n }));\n\n // \u8C03\u6574\u89C6\u53E3\n await page.setViewportSize({\n width: screen.width,\n height: screen.height\n });\n\n logger.success('syncViewportWithScreen', `size=${screen.width}x${screen.height}`);\n } catch (e) {\n logger.warn(`syncViewportWithScreen Failed: ${e.message}. Fallback to 1920x1080.`);\n await page.setViewportSize({ width: 1920, height: 1080 });\n }\n },\n\n /**\n * \u786E\u4FDD navigator.webdriver \u9690\u85CF (\u901A\u5E38 Playwright Stealth \u63D2\u4EF6\u5DF2\u5904\u7406\uFF0C\u4F46\u53CC\u91CD\u4FDD\u9669)\n */\n async hideWebdriver(page) {\n await page.addInitScript(() => {\n Object.defineProperty(navigator, 'webdriver', {\n get: () => false,\n });\n });\n logger.success('hideWebdriver');\n },\n\n /**\n * \u901A\u7528\u7684 Playwright \u8D44\u6E90\u62E6\u622A\u5668\uFF0C\u7528\u4E8E\u5C4F\u853D\u4E0D\u5FC5\u8981\u7684\u8D44\u6E90\u4EE5\u52A0\u901F\u52A0\u8F7D\n * @param {import('playwright').Page} page\n * @param {string[]} [resourceTypes] - \u8981\u5C4F\u853D\u7684\u8D44\u6E90\u7C7B\u578B\uFF0C\u9ED8\u8BA4\u4E3A ['font', 'image', 'media']\n */\n async setupBlockingResources(page, resourceTypes = ['font', 'image', 'media']) {\n await page.route('**/*', (route) => {\n const request = route.request();\n const type = request.resourceType();\n if (resourceTypes.includes(type)) {\n return route.abort();\n }\n return route.continue();\n });\n logger.success('setupBlockingResources', `types=[${resourceTypes.join(',')}]`);\n },\n\n /**\n * \u83B7\u53D6\u63A8\u8350\u7684 Stealth \u542F\u52A8\u53C2\u6570\n */\n getStealthLaunchArgs() {\n return [\n '--disable-blink-features=AutomationControlled',\n '--no-sandbox',\n '--disable-setuid-sandbox',\n '--disable-infobars',\n '--window-position=0,0',\n '--ignore-certificate-errors',\n '--disable-web-security',\n // \u6CE8\u610F\uFF1A\u4E0D\u5EFA\u8BAE\u8FD9\u91CC\u5F3A\u5236\u6307\u5B9A window-size\uFF0C\u8BA9 syncViewportWithScreen \u53BB\u52A8\u6001\u8C03\u6574\n // '--window-size=1920,1080' \n ];\n },\n\n /**\n * \u83B7\u53D6\u589E\u5F3A\u7248 Stealth \u542F\u52A8\u53C2\u6570 (\u63A8\u8350\u7528\u4E8E\u9AD8\u98CE\u9669\u53CD\u722C\u573A\u666F)\n * \u5305\u542B\u66F4\u591A\u9488\u5BF9\u81EA\u52A8\u5316\u68C0\u6D4B\u7684\u9632\u62A4\n */\n getAdvancedStealthArgs() {\n return [\n ...this.getStealthLaunchArgs(),\n // \u7981\u7528\u5404\u79CD\u53EF\u80FD\u66B4\u9732\u81EA\u52A8\u5316\u7684\u7279\u5F81\n '--disable-dev-shm-usage',\n '--disable-accelerated-2d-canvas',\n '--disable-gpu-sandbox',\n '--disable-background-networking',\n '--disable-default-apps',\n '--disable-extensions',\n '--disable-sync',\n '--disable-translate',\n '--metrics-recording-only',\n '--mute-audio',\n '--no-first-run',\n // \u6A21\u62DF\u771F\u5B9E\u7528\u6237\u914D\u7F6E\n '--lang=zh-CN,zh',\n ];\n },\n\n /**\n * \u8BBE\u7F6E\u4E2D\u56FD\u65F6\u533A (Asia/Shanghai, UTC+8)\n * \n * \u9632\u6B62\u65F6\u533A\u4E0D\u4E00\u81F4\u7684\u68C0\u6D4B\u3002\u5BF9\u4E8E\u4E2D\u56FD\u5883\u5185\u722C\u53D6\u5F3A\u70C8\u63A8\u8350\u4F7F\u7528\u3002\n * \u5E94\u5728 preNavigationHooks \u6216 BrowserContext \u521B\u5EFA\u540E\u8C03\u7528\u3002\n * \n * @param {import('playwright').BrowserContext} context\n */\n async setChinaTimezone(context) {\n // Playwright \u901A\u8FC7 context \u8BBE\u7F6E\u65F6\u533A\n // \u6CE8\u610F\uFF1A\u8FD9\u9700\u8981\u5728 context \u521B\u5EFA\u65F6\u8BBE\u7F6E\uFF0C\u6216\u8005\u4F7F\u7528 CDP\n // \u8FD9\u91CC\u4F7F\u7528 addInitScript \u6CE8\u5165 Intl \u8986\u76D6\n await context.addInitScript(() => {\n // \u8986\u76D6 Intl.DateTimeFormat \u9ED8\u8BA4\u65F6\u533A\n const originalDateTimeFormat = Intl.DateTimeFormat;\n Intl.DateTimeFormat = function (locales, options) {\n options = options || {};\n options.timeZone = options.timeZone || 'Asia/Shanghai';\n return new originalDateTimeFormat(locales, options);\n };\n Intl.DateTimeFormat.prototype = originalDateTimeFormat.prototype;\n\n // \u8986\u76D6 Date.prototype.getTimezoneOffset \u8FD4\u56DE -480 (UTC+8)\n Date.prototype.getTimezoneOffset = function () {\n return -480; // UTC+8 = -480 \u5206\u949F\n };\n });\n logger.success('setChinaTimezone', 'Asia/Shanghai (UTC+8)');\n }\n}\n", "import delay from 'delay';\nimport { createCursor } from 'ghost-cursor-playwright';\nimport { createLogger } from './internal/logger';\n\nconst logger = createLogger('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 // CSS \u9009\u62E9\u5668\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 // \u5750\u6807\u5BF9\u8C61\n await cursor.actions.move(target);\n } else if (target && typeof target.boundingBox === 'function') {\n // ElementHandle\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 * \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 */\n async humanClick(page, target, options = {}) {\n const cursor = $GetCursor(page);\n\n // \u517C\u5BB9\u5904\u7406\uFF1A\u5982\u679C\u7B2C\u4E8C\u4E2A\u53C2\u6570\u662F\u5BF9\u8C61\u4E14\u6CA1\u6709\u7B2C\u4E09\u4E2A\u53C2\u6570\uFF0C\u8BF4\u660E\u7528\u6237\u7701\u7565\u4E86 target (\u5373 humanClick(page, options))\n // \u4F46\u901A\u5E38\u6211\u4EEC\u4F1A\u9075\u5FAA humanClick(page, null, options) \u7684\u8C03\u7528\u65B9\u5F0F\u3002\n // \u8FD9\u91CC\u7B80\u5355\u5904\u7406\uFF1A\u5982\u679C target \u662F plain object \u4E14 options \u662F\u7A7A\u5BF9\u8C61(\u9ED8\u8BA4\u503C)\uFF0C\u53EF\u80FD\u7528\u6237\u4F20\u9519\u4E86\uFF1F\n // \u8FD8\u662F\u4E25\u683C\u6309\u7167\u6587\u6863\uFF1A\u5982\u679C\u8981\u70B9\u51FB\u5F53\u524D\u4F4D\u7F6E\uFF0C\u4F20 null/undefined\u3002\n\n const { reactionDelay = 250, throwOnMissing = true } = options;\n\n const targetDesc = target == null ? 'Current Position' : (typeof target === 'string' ? target : 'ElementHandle');\n logger.start('humanClick', `target=${targetDesc}`);\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 const box = await element.boundingBox();\n if (!box) {\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 // \u8BA1\u7B97\u5E26\u968F\u673A\u504F\u79FB\u7684\u70B9\u51FB\u4F4D\u7F6E\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 // \u4EBA\u7C7B\u53CD\u5E94\u5EF6\u8FDF (150-400ms \u8303\u56F4)\n await delay(this.jitterMs(reactionDelay, 0.4));\n await cursor.actions.click();\n\n logger.success('humanClick');\n return true;\n } catch (error) {\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 locator.click();\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\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", "// \u96C6\u4E2D\u7BA1\u7406\u542F\u52A8\u914D\u7F6E\uFF0C\u6682\u65F6\u4E3B\u8981\u7531 Stealth \u6A21\u5757\u63D0\u4F9B Args\uFF0C\u8FD9\u91CC\u4F5C\u4E3A\u6269\u5C55\u70B9\nimport { Stealth } from './stealth';\nimport { createLogger } from './internal/logger';\n\nconst logger = createLogger('Launch');\n\nexport const Launch = {\n getLaunchOptions(customArgs = []) {\n return {\n args: [\n ...Stealth.getStealthLaunchArgs(),\n ...customArgs\n ],\n ignoreDefaultArgs: ['--enable-automation'],\n };\n },\n\n /**\n * \u83B7\u53D6\u589E\u5F3A\u7248\u542F\u52A8\u9009\u9879\uFF08\u7528\u4E8E\u9AD8\u98CE\u9669\u53CD\u722C\u573A\u666F\uFF09\n */\n getAdvancedLaunchOptions(customArgs = []) {\n return {\n args: [\n ...Stealth.getAdvancedStealthArgs(),\n ...customArgs\n ],\n ignoreDefaultArgs: ['--enable-automation'],\n };\n },\n\n /**\n * \u63A8\u8350\u7684 Fingerprint Generator \u9009\u9879\n * \u786E\u4FDD\u751F\u6210\u7684\u662F\u684C\u9762\u7AEF\u3001\u8F83\u65B0\u7684 Chrome\uFF0C\u4EE5\u5339\u914D\u6211\u4EEC\u7684\u811A\u672C\u903B\u8F91\n */\n getFingerprintGeneratorOptions() {\n return {\n browsers: [{ name: 'chrome', minVersion: 110 }],\n devices: ['desktop'],\n operatingSystems: ['windows', 'linux'], // \u5305\u542B Linux \u517C\u5BB9\u5BB9\u5668\n };\n },\n\n /**\n * \u521B\u5EFA\u5DF2\u6CE8\u518C Stealth \u63D2\u4EF6\u7684 Chromium \u5B9E\u4F8B\n * \n * \u5C01\u88C5\u4E86 `chromium.use(stealthPlugin())` \u7684\u5E38\u7528\u6A21\u5F0F\n * \n * @example\n * ```javascript\n * import { chromium } from 'playwright-extra';\n * import stealthPlugin from 'puppeteer-extra-plugin-stealth';\n * \n * const stealthChromium = Launch.createStealthChromium(chromium, stealthPlugin);\n * // \u73B0\u5728 stealthChromium \u5DF2\u6CE8\u518C stealth \u63D2\u4EF6\uFF0C\u53EF\u7528\u4E8E launchContext.launcher\n * ```\n * \n * @param {import('playwright-extra').ChromiumExtra} chromium - playwright-extra \u7684 chromium\n * @param {Function} stealthPlugin - puppeteer-extra-plugin-stealth \u7684\u9ED8\u8BA4\u5BFC\u51FA\n * @returns {import('playwright-extra').ChromiumExtra} \u5DF2\u6CE8\u518C stealth \u7684 chromium\n */\n createStealthChromium(chromium, stealthPlugin) {\n chromium.use(stealthPlugin());\n logger.success('createStealthChromium', 'Stealth plugin registered');\n return chromium;\n }\n}\n\n", "import express from 'express';\nimport { Actor } from 'apify';\nimport { PresetOfLiveViewKey } from './constants';\nimport { createLogger } from './internal/logger';\n\nconst logger = createLogger('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 page.screenshot({ 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 { createLogger } from './internal/logger';\n\nconst logger = createLogger('Captcha');\n\n/**\n * \u521B\u5EFA\u9A8C\u8BC1\u7801\u76D1\u63A7\u5668 - \u652F\u6301 DOM \u9009\u62E9\u5668 \u548C URL \u6A21\u5F0F \u4E24\u79CD\u68C0\u6D4B\u65B9\u5F0F\n * \n * \u6CE8\u610F\uFF1A\u76D1\u63A7\u5668\u968F\u9875\u9762\u751F\u547D\u5468\u671F\u81EA\u52A8\u6E05\u7406\uFF0C\u65E0\u9700\u624B\u52A8 cleanup\n * \n * @param {import('playwright').Page} page\n * @param {Object} options\n * @param {string} [options.domSelector] - DOM \u5143\u7D20\u9009\u62E9\u5668 (\u5982 '#captcha_container')\n * @param {string} [options.urlPattern] - URL \u5339\u914D\u6A21\u5F0F (\u5982 '/captcha')\n * @param {Function} options.onDetected - \u68C0\u6D4B\u5230\u9A8C\u8BC1\u7801\u65F6\u7684\u56DE\u8C03 (async function)\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 \u81F3\u5C11\u4E00\u4E2A');\n }\n\n if (!onDetected || typeof onDetected !== 'function') {\n throw new Error('[CaptchaMonitor] onDetected \u5FC5\u987B\u662F\u4E00\u4E2A\u51FD\u6570');\n }\n\n let isHandled = false;\n let frameHandler = null;\n let exposedFunctionName = null;\n\n const triggerDetected = async () => {\n if (isHandled) return;\n isHandled = true;\n await onDetected();\n };\n\n const cleanupFns = [];\n\n // ============================================================\n // \u6A21\u5F0F1: DOM \u76D1\u63A7 (\u4F7F\u7528 MutationObserver)\n // ============================================================\n if (domSelector) {\n // \u751F\u6210\u552F\u4E00\u7684\u51FD\u6570\u540D\u907F\u514D\u51B2\u7A81\n exposedFunctionName = `__c_d_${uuidv4().replace(/-/g, '_')}`;\n // \u751F\u6210\u552F\u4E00\u7684\u6E05\u7406\u51FD\u6570\u540D (\u6302\u8F7D\u5728 window \u4E0A)\n const cleanerName = `__c_cleaner_${uuidv4().replace(/-/g, '_')}`;\n\n // \u66B4\u9732\u56DE\u8C03\u51FD\u6570\u7ED9\u9875\u9762\n page.exposeFunction(exposedFunctionName, triggerDetected).catch(() => {\n // \u5FFD\u7565\u91CD\u590D\u66B4\u9732\u9519\u8BEF\n });\n\n // \u6CE8\u5165 MutationObserver \u76D1\u542C\u811A\u672C\n page.addInitScript(({ selector, callbackName, cleanerName }) => {\n (() => {\n let observer = null;\n\n const checkAndReport = () => {\n const element = document.querySelector(selector);\n if (element) {\n if (observer) {\n observer.disconnect();\n observer = null;\n }\n if (window[callbackName]) {\n window[callbackName]();\n }\n return true;\n }\n return false;\n };\n\n // 1. \u7ACB\u5373\u68C0\u67E5\u4E00\u6B21\n if (checkAndReport()) return;\n\n // 2. \u542F\u52A8 MutationObserver\n observer = new MutationObserver((mutations) => {\n let shouldCheck = false;\n for (const mutation of mutations) {\n if (mutation.addedNodes.length > 0) {\n shouldCheck = true;\n break;\n }\n }\n if (shouldCheck && observer) {\n checkAndReport();\n }\n });\n\n // 3. \u6302\u8F7D\u76D1\u542C\uFF08\u786E\u4FDD DOM \u51C6\u5907\u5C31\u7EEA\uFF09\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 // 4. \u6CE8\u518C\u6E05\u7406\u51FD\u6570\n window[cleanerName] = () => {\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: ${domSelector}`);\n\n // \u6DFB\u52A0\u6E05\u7406\u903B\u8F91\n cleanupFns.push(async () => {\n try {\n // \u8C03\u7528\u9875\u9762\u5185\u7684\u6E05\u7406\u51FD\u6570\n await page.evaluate((name) => {\n if (window[name]) {\n window[name]();\n delete window[name];\n }\n }, cleanerName);\n } catch (e) {\n // \u9875\u9762\u53EF\u80FD\u5DF2\u5173\u95ED\u6216\u8DF3\u8F6C\uFF0C\u5FFD\u7565\u9519\u8BEF\n }\n });\n }\n\n // ============================================================\n // \u6A21\u5F0F2: URL \u76D1\u63A7 (\u76D1\u542C framenavigated)\n // ============================================================\n if (urlPattern) {\n frameHandler = async (frame) => {\n if (frame === page.mainFrame()) {\n const currentUrl = page.url();\n if (currentUrl.includes(urlPattern)) {\n await triggerDetected();\n }\n }\n };\n\n page.on('framenavigated', frameHandler);\n logger.success('useCaptchaMonitor', `URL \u76D1\u63A7\u5DF2\u542F\u7528: ${urlPattern}`);\n\n // \u6DFB\u52A0\u6E05\u7406\u903B\u8F91\n cleanupFns.push(async () => {\n page.off('framenavigated', frameHandler);\n });\n }\n\n // \u8FD4\u56DE\u63A7\u5236\u53E5\u67C4\n return {\n stop: async () => {\n logger.info('useCaptchaMonitor', '\u6B63\u5728\u505C\u6B62\u76D1\u63A7...');\n for (const fn of cleanupFns) {\n await fn();\n }\n isHandled = true; // \u9632\u6B62\u540E\u7EED\u89E6\u53D1\n }\n };\n}\n\n// \u6309\u7167 toolkit \u7EDF\u4E00\u7684\u5BFC\u51FA\u6A21\u5F0F\nexport const Captcha = {\n useCaptchaMonitor\n};\n", "import https from 'https';\nimport { URL } from 'url';\nimport { createLogger } from './internal/logger';\nimport { FirstDataTimeoutError, OverallTimeoutError } from './errors';\n\nconst logger = createLogger('Sse');\n\nexport const Sse = {\n /**\n * \u89E3\u6790 SSE \u6D41\u6587\u672C\n * \u652F\u6301 `data: {...}` \u548C `data:{...}` \u4E24\u79CD\u683C\u5F0F\n * @param {string} sseStreamText\n * @returns {Array<Object>} events\n */\n parseSseStream(sseStreamText) {\n const events = [];\n const lines = sseStreamText.split('\\n');\n for (const line of lines) {\n // \u517C\u5BB9\u4E24\u79CD\u683C\u5F0F: \"data: {...}\" \u548C \"data:{...}\"\n if (line.startsWith('data:')) {\n try {\n // \u79FB\u9664 \"data:\" \u524D\u7F00\u5E76 trim\uFF0C\u7EDF\u4E00\u5904\u7406\u6709\u65E0\u7A7A\u683C\u7684\u60C5\u51B5\n const jsonContent = line.substring(5).trim();\n if (jsonContent) {\n events.push(JSON.parse(jsonContent));\n }\n } catch (e) {\n // \u5FFD\u7565\u975E\u6709\u6548 JSON \u7684\u884C\n logger.debug('parseSseStream', `JSON \u89E3\u6790\u5931\u8D25: ${e.message}, line: ${line.substring(0, 100)}...`);\n }\n }\n }\n logger.success('parseSseStream', `\u89E3\u6790\u5B8C\u6210, events \u6570\u91CF: ${events.length}`);\n return events;\n },\n\n /**\n * \u62E6\u622A\u7F51\u7EDC\u8BF7\u6C42\u5E76\u4F7F\u7528 Node.js \u539F\u751F https \u6A21\u5757\u8F6C\u53D1\uFF0C\u4EE5\u89E3\u51B3\u6D41\u5F0F\u6570\u636E\u6355\u83B7\u95EE\u9898\u3002\n * @param {import('playwright').Page} page\n * @param {string|RegExp} urlPattern - \u62E6\u622A\u7684 URL \u6A21\u5F0F\n * @param {object} options\n * @param {function(string, function, string): void} [options.onData] - (textChunk, resolve, accumulatedText) => void\n * @param {function(string, function): void} [options.onEnd] - (fullText, resolve) => void\n * @param {function(Error): void} [options.onTimeout] - (error) => void\uFF0Cerror \u4E3A FirstDataTimeoutError \u6216 OverallTimeoutError\n * @param {number} [options.firstDataTimeout=90000] - \u9996\u6B21\u6570\u636E\u63A5\u6536\u8D85\u65F6 (ms)\uFF0C\u9ED8\u8BA4 90s\n * @param {number} [options.timeout=180000] - \u6574\u4F53\u8BF7\u6C42\u8D85\u65F6\u65F6\u95F4 (ms)\uFF0C\u9ED8\u8BA4 180s\n * @returns {Promise<any>} - \u8FD4\u56DE Promise\uFF0C\u5F53\u6D41\u6EE1\u8DB3\u6761\u4EF6\u65F6 resolve\n */\n async intercept(page, urlPattern, options = {}) {\n const {\n onData,\n onEnd,\n onTimeout,\n firstDataTimeout = 90000,\n timeout = 180000\n } = options;\n\n let streamResolve, streamReject;\n const capturePromise = new Promise((resolve, reject) => {\n streamResolve = resolve;\n streamReject = reject;\n });\n\n // \u9996\u6B21\u6570\u636E\u63A5\u6536\u8D85\u65F6\u5B9A\u65F6\u5668\n let firstDataTimer = null;\n // \u6574\u4F53\u8BF7\u6C42\u8D85\u65F6\u5B9A\u65F6\u5668\n let overallTimer = null;\n // \u662F\u5426\u5DF2\u63A5\u6536\u5230\u9996\u6B21\u6570\u636E\n let hasReceivedFirstData = false;\n\n // \u6E05\u7406\u6240\u6709\u5B9A\u65F6\u5668\n const clearAllTimers = () => {\n if (firstDataTimer) {\n clearTimeout(firstDataTimer);\n firstDataTimer = null;\n }\n if (overallTimer) {\n clearTimeout(overallTimer);\n overallTimer = null;\n }\n };\n\n // \u8BBE\u7F6E\u9996\u6B21\u6570\u636E\u8D85\u65F6\n firstDataTimer = setTimeout(() => {\n if (!hasReceivedFirstData) {\n const error = new FirstDataTimeoutError(firstDataTimeout);\n logger.error(`[Intercept] \u9996\u6B21\u6570\u636E\u63A5\u6536\u8D85\u65F6`);\n clearAllTimers();\n\n if (onTimeout) {\n onTimeout(error);\n }\n streamReject(error);\n }\n }, firstDataTimeout);\n\n // \u8BBE\u7F6E\u6574\u4F53\u8BF7\u6C42\u8D85\u65F6\n overallTimer = setTimeout(() => {\n const error = new OverallTimeoutError(timeout);\n logger.error(`[Intercept] \u6574\u4F53\u8BF7\u6C42\u8D85\u65F6`);\n clearAllTimers();\n\n if (onTimeout) {\n onTimeout(error);\n }\n streamReject(error);\n }, timeout);\n\n await page.route(urlPattern, async (route) => {\n const request = route.request();\n const requestUrl = request.url();\n logger.info(`[MITM] \u5DF2\u62E6\u622A\u8BF7\u6C42: ${requestUrl}`);\n\n try {\n const headers = await request.allHeaders();\n const postData = request.postData();\n const urlObj = new URL(requestUrl);\n\n // \u5220\u9664 accept-encoding \u5F3A\u5236\u660E\u6587\uFF0C\u5220\u9664 content-length \u8BA9 Node \u91CD\u7B97\n delete headers['accept-encoding'];\n delete headers['content-length'];\n\n const reqOptions = {\n hostname: urlObj.hostname,\n port: 443,\n path: urlObj.pathname + urlObj.search,\n method: request.method(),\n headers: headers,\n timeout: timeout\n };\n\n const req = https.request(reqOptions, (res) => {\n const chunks = [];\n let accumulatedText = \"\";\n\n // A. \u5B9E\u65F6\u6570\u636E\u76D1\u542C\n res.on('data', (chunk) => {\n // \u6807\u8BB0\u5DF2\u63A5\u6536\u9996\u6B21\u6570\u636E\uFF0C\u6E05\u9664\u9996\u6B21\u6570\u636E\u8D85\u65F6\n if (!hasReceivedFirstData) {\n hasReceivedFirstData = true;\n if (firstDataTimer) {\n clearTimeout(firstDataTimer);\n firstDataTimer = null;\n }\n logger.debug('[Intercept] \u5DF2\u63A5\u6536\u9996\u6B21\u6570\u636E');\n }\n\n chunks.push(chunk);\n const textChunk = chunk.toString('utf-8');\n accumulatedText += textChunk;\n\n logger.debug(`[CHUNK] ${textChunk.length} bytes`);\n\n if (onData) {\n try {\n onData(textChunk, streamResolve, accumulatedText);\n } catch (e) {\n logger.error(`onData callback error: ${e.message}`);\n }\n }\n });\n\n // B. \u7ED3\u675F\u76D1\u542C\n res.on('end', () => {\n logger.info('[MITM] \u4E0A\u6E38\u54CD\u5E94\u7ED3\u675F (Stream End)');\n clearAllTimers();\n const fullBody = Buffer.concat(chunks);\n\n if (onEnd) {\n try {\n onEnd(accumulatedText, streamResolve);\n } catch (e) {\n logger.error(`onEnd callback error: ${e.message}`);\n }\n } else if (!onData) {\n // \u5982\u679C\u6CA1\u6709\u56DE\u8C03\uFF0C\u9ED8\u8BA4\u7ED3\u675F\u65F6 resolve \u5168\u6587\n streamResolve(accumulatedText);\n }\n\n // \u8FD4\u56DE\u7ED9\u6D4F\u89C8\u5668\n route.fulfill({\n status: res.statusCode,\n headers: res.headers,\n body: fullBody\n }).catch(e => logger.warning(`Route fulfill failed: ${e.message}`));\n });\n });\n\n req.on('error', (e) => {\n logger.error(`[MITM] Upstream request error: ${e.message}`);\n clearAllTimers();\n route.abort();\n streamReject(e);\n });\n\n if (postData) {\n req.write(postData);\n }\n req.end();\n\n } catch (e) {\n logger.error(`[MITM] Setup error: ${e.message}`);\n clearAllTimers();\n route.continue();\n }\n });\n\n return capturePromise;\n }\n};\n", "import { ApifyKit } from './src/apify-kit';\nimport { Utils } from './src/utils';\nimport { Stealth } from './src/stealth';\nimport { Humanize } from './src/humanize';\nimport { Launch } from './src/launch';\nimport { LiveView } from './src/live-view';\nimport { Captcha } from './src/captcha-monitor';\nimport { Sse } from './src/sse';\nimport * as Constants from './src/constants';\nimport * as Errors from './src/errors';\n\n// Unified Entry Point\nexport const usePlaywrightToolKit = () => {\n return {\n ApifyKit,\n Stealth,\n Humanize,\n Launch,\n LiveView,\n Constants,\n Utils,\n Captcha,\n Sse,\n Errors\n };\n};\n"],
5
+ "mappings": "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",
6
6
  "names": ["serializeError", "Actor", "logger", "logger", "delay", "logger", "delay", "logger", "logger", "logger", "cleanerName", "logger"]
7
7
  }
package/index.d.ts CHANGED
@@ -45,6 +45,29 @@ export declare class CrawlerError extends Error {
45
45
 
46
46
  export interface ErrorsModule {
47
47
  CrawlerError: typeof CrawlerError;
48
+ TimeoutError: typeof TimeoutError;
49
+ FirstDataTimeoutError: typeof FirstDataTimeoutError;
50
+ OverallTimeoutError: typeof OverallTimeoutError;
51
+ }
52
+
53
+ // 通用超时错误基类
54
+ export declare class TimeoutError extends Error {
55
+ name: 'TimeoutError';
56
+ timeout: number;
57
+ context: Record<string, any>;
58
+ timestamp: string;
59
+ constructor(message: string, timeout: number, context?: Record<string, any>);
60
+ }
61
+
62
+ // 超时错误类
63
+ export declare class FirstDataTimeoutError extends TimeoutError {
64
+ name: 'FirstDataTimeoutError';
65
+ constructor(timeout: number, context?: Record<string, any>);
66
+ }
67
+
68
+ export declare class OverallTimeoutError extends TimeoutError {
69
+ name: 'OverallTimeoutError';
70
+ constructor(timeout: number, context?: Record<string, any>);
48
71
  }
49
72
 
50
73
  // =============================================================================
@@ -152,9 +175,15 @@ export interface SseInterceptOnEndCallback {
152
175
  (fullText: string, resolve: (value: any) => void): void;
153
176
  }
154
177
 
178
+ export interface SseInterceptOnTimeoutCallback {
179
+ (error: FirstDataTimeoutError | OverallTimeoutError): void;
180
+ }
181
+
155
182
  export interface SseInterceptOptions {
156
183
  onData?: SseInterceptOnDataCallback;
157
184
  onEnd?: SseInterceptOnEndCallback;
185
+ onTimeout?: SseInterceptOnTimeoutCallback;
186
+ firstDataTimeout?: number;
158
187
  timeout?: number;
159
188
  }
160
189
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skrillex1224/playwright-toolkit",
3
- "version": "2.0.59",
3
+ "version": "2.0.61",
4
4
  "description": "一个在 Apify/Crawlee Actor 中启用实时截图视图的实用工具库。",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.js",