@skrillex1224/playwright-toolkit 2.1.279 → 2.1.280
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser.js +165 -157
- package/dist/browser.js.map +4 -4
- package/dist/index.cjs +467 -539
- package/dist/index.cjs.map +4 -4
- package/dist/index.js +467 -539
- package/dist/index.js.map +4 -4
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -387,18 +387,18 @@ var fallbackLog = {
|
|
|
387
387
|
error: (...args) => console.error(...args),
|
|
388
388
|
debug: (...args) => console.debug ? console.debug(...args) : console.log(...args)
|
|
389
389
|
};
|
|
390
|
-
var resolveLogMethod = (
|
|
391
|
-
if (
|
|
392
|
-
return
|
|
390
|
+
var resolveLogMethod = (logger16, name) => {
|
|
391
|
+
if (logger16 && typeof logger16[name] === "function") {
|
|
392
|
+
return logger16[name].bind(logger16);
|
|
393
393
|
}
|
|
394
|
-
if (name === "warning" &&
|
|
395
|
-
return
|
|
394
|
+
if (name === "warning" && logger16 && typeof logger16.warn === "function") {
|
|
395
|
+
return logger16.warn.bind(logger16);
|
|
396
396
|
}
|
|
397
397
|
return fallbackLog[name];
|
|
398
398
|
};
|
|
399
399
|
var defaultLogger = null;
|
|
400
|
-
var setDefaultLogger = (
|
|
401
|
-
defaultLogger =
|
|
400
|
+
var setDefaultLogger = (logger16) => {
|
|
401
|
+
defaultLogger = logger16;
|
|
402
402
|
};
|
|
403
403
|
var resolveLogger = (explicitLogger) => {
|
|
404
404
|
if (explicitLogger && typeof explicitLogger.info === "function") {
|
|
@@ -425,8 +425,8 @@ var colorize = (text, color) => {
|
|
|
425
425
|
var createBaseLogger = (prefix = "", explicitLogger) => {
|
|
426
426
|
const name = prefix ? String(prefix) : "";
|
|
427
427
|
const dispatch = (methodName, icon, message, color) => {
|
|
428
|
-
const
|
|
429
|
-
const logFn = resolveLogMethod(
|
|
428
|
+
const logger16 = resolveLogger(explicitLogger);
|
|
429
|
+
const logFn = resolveLogMethod(logger16, methodName);
|
|
430
430
|
const timestamp = colorize(`[${formatTimestamp()}]`, ANSI.gray);
|
|
431
431
|
const line = formatLine(name, icon, message);
|
|
432
432
|
const coloredLine = colorize(line, color);
|
|
@@ -923,7 +923,7 @@ var prepareExpandedFullPageScreenshot = async (page, options = {}) => {
|
|
|
923
923
|
viewportResized
|
|
924
924
|
};
|
|
925
925
|
};
|
|
926
|
-
var restoreExpandedFullPageScreenshot = async (page,
|
|
926
|
+
var restoreExpandedFullPageScreenshot = async (page, state2 = {}) => {
|
|
927
927
|
await page.evaluate((className) => {
|
|
928
928
|
const targets = new Set([
|
|
929
929
|
...document.querySelectorAll(`.${className}`),
|
|
@@ -947,8 +947,8 @@ var restoreExpandedFullPageScreenshot = async (page, state = {}) => {
|
|
|
947
947
|
el.classList.remove(className);
|
|
948
948
|
});
|
|
949
949
|
}, EXPANDED_SCROLLABLE_CLASS);
|
|
950
|
-
if (
|
|
951
|
-
await page.setViewportSize(
|
|
950
|
+
if (state2?.originalViewport && state2?.viewportResized) {
|
|
951
|
+
await page.setViewportSize(state2.originalViewport);
|
|
952
952
|
}
|
|
953
953
|
};
|
|
954
954
|
var capturePageScreenshot = async (page, options = {}) => {
|
|
@@ -1005,21 +1005,21 @@ var capturePageScreenshot = async (page, options = {}) => {
|
|
|
1005
1005
|
}
|
|
1006
1006
|
};
|
|
1007
1007
|
var captureExpandedFullPageScreenshot = async (page, options = {}) => {
|
|
1008
|
-
const
|
|
1008
|
+
const state2 = await prepareExpandedFullPageScreenshot(page, options);
|
|
1009
1009
|
try {
|
|
1010
1010
|
return await capturePageScreenshot(page, {
|
|
1011
1011
|
fullPage: true,
|
|
1012
1012
|
type: options.type || "png",
|
|
1013
1013
|
quality: options.quality,
|
|
1014
1014
|
timeout: options.timeout,
|
|
1015
|
-
maxClipHeight:
|
|
1015
|
+
maxClipHeight: state2.targetHeight
|
|
1016
1016
|
});
|
|
1017
1017
|
} finally {
|
|
1018
1018
|
await restoreAffixedElementsForExpandedScreenshot(page).catch((error) => {
|
|
1019
1019
|
logger.warning(`\u79FB\u52A8\u7AEF\u5438\u9644\u5143\u7D20\u6062\u590D\u5931\u8D25: ${error?.message || error}`);
|
|
1020
1020
|
});
|
|
1021
1021
|
if (options.restore) {
|
|
1022
|
-
await restoreExpandedFullPageScreenshot(page,
|
|
1022
|
+
await restoreExpandedFullPageScreenshot(page, state2);
|
|
1023
1023
|
}
|
|
1024
1024
|
}
|
|
1025
1025
|
};
|
|
@@ -1915,8 +1915,8 @@ var normalizeBrowserProfile = (value) => {
|
|
|
1915
1915
|
payload: buildBrowserProfilePayload(core, observed)
|
|
1916
1916
|
};
|
|
1917
1917
|
};
|
|
1918
|
-
var rememberRuntimeState = (
|
|
1919
|
-
rememberedRuntimeState = deepClone(
|
|
1918
|
+
var rememberRuntimeState = (state2) => {
|
|
1919
|
+
rememberedRuntimeState = deepClone(state2);
|
|
1920
1920
|
return rememberedRuntimeState;
|
|
1921
1921
|
};
|
|
1922
1922
|
var normalizeRuntimeState = (source = {}, actor = "") => {
|
|
@@ -1975,7 +1975,7 @@ var RuntimeEnv = {
|
|
|
1975
1975
|
} else {
|
|
1976
1976
|
delete normalizedRuntime.browser_profile;
|
|
1977
1977
|
}
|
|
1978
|
-
const
|
|
1978
|
+
const state2 = {
|
|
1979
1979
|
actor: resolvedActor,
|
|
1980
1980
|
device,
|
|
1981
1981
|
runtime: normalizedRuntime,
|
|
@@ -1989,73 +1989,73 @@ var RuntimeEnv = {
|
|
|
1989
1989
|
browserProfileCore: browserProfile.core,
|
|
1990
1990
|
browserProfileObserved: browserProfile.observed
|
|
1991
1991
|
};
|
|
1992
|
-
rememberRuntimeState(
|
|
1993
|
-
return
|
|
1992
|
+
rememberRuntimeState(state2);
|
|
1993
|
+
return state2;
|
|
1994
1994
|
},
|
|
1995
1995
|
// buildEnvPatch 只构造允许回写到后端 env 的字段集合。
|
|
1996
1996
|
buildEnvPatch(source = {}, actor = "") {
|
|
1997
|
-
const
|
|
1998
|
-
const browserProfile = buildBrowserProfilePayload(
|
|
1997
|
+
const state2 = normalizeRuntimeState(source, actor);
|
|
1998
|
+
const browserProfile = buildBrowserProfilePayload(state2.browserProfileCore, state2.browserProfileObserved);
|
|
1999
1999
|
const envPatch = {
|
|
2000
|
-
...Array.isArray(
|
|
2001
|
-
...Object.keys(
|
|
2002
|
-
...Object.keys(
|
|
2000
|
+
...Array.isArray(state2.cookies) && state2.cookies.length > 0 ? { cookies: state2.cookies } : {},
|
|
2001
|
+
...Object.keys(state2.localStorage || {}).length > 0 ? { local_storage: state2.localStorage } : {},
|
|
2002
|
+
...Object.keys(state2.sessionStorage || {}).length > 0 ? { session_storage: state2.sessionStorage } : {},
|
|
2003
2003
|
...Object.keys(browserProfile).length > 0 ? { browser_profile: browserProfile } : {}
|
|
2004
2004
|
};
|
|
2005
2005
|
return Object.keys(envPatch).length > 0 ? envPatch : null;
|
|
2006
2006
|
},
|
|
2007
2007
|
// hasLoginState 只判断 runtime 是否存在有效载荷,不再区分具体字段来源。
|
|
2008
2008
|
hasLoginState(source = {}, actor = "") {
|
|
2009
|
-
const
|
|
2010
|
-
return isPlainObject(
|
|
2009
|
+
const state2 = normalizeRuntimeState(source, actor);
|
|
2010
|
+
return isPlainObject(state2.runtime) && Object.keys(state2.runtime || {}).length > 0;
|
|
2011
2011
|
},
|
|
2012
2012
|
rememberState(source = {}) {
|
|
2013
|
-
const
|
|
2014
|
-
rememberRuntimeState(
|
|
2013
|
+
const state2 = normalizeRuntimeState(source);
|
|
2014
|
+
rememberRuntimeState(state2);
|
|
2015
2015
|
return RuntimeEnv.peekRememberedState();
|
|
2016
2016
|
},
|
|
2017
2017
|
peekRememberedState() {
|
|
2018
2018
|
return rememberedRuntimeState ? deepClone(rememberedRuntimeState) : null;
|
|
2019
2019
|
},
|
|
2020
2020
|
getBrowserProfileCore(source = {}, actor = "") {
|
|
2021
|
-
const
|
|
2022
|
-
return deepClone(
|
|
2021
|
+
const state2 = normalizeRuntimeState(source, actor);
|
|
2022
|
+
return deepClone(state2.browserProfileCore || {});
|
|
2023
2023
|
},
|
|
2024
2024
|
setBrowserProfileCore(source = {}, core = {}, actor = "") {
|
|
2025
|
-
const
|
|
2025
|
+
const state2 = normalizeRuntimeState(source, actor);
|
|
2026
2026
|
const normalizedCore = normalizeBrowserProfileCore({
|
|
2027
2027
|
...core,
|
|
2028
|
-
device: normalizeKnownDevice(core?.device) ||
|
|
2028
|
+
device: normalizeKnownDevice(core?.device) || state2.device
|
|
2029
2029
|
});
|
|
2030
|
-
|
|
2031
|
-
|
|
2032
|
-
if (Object.keys(
|
|
2033
|
-
|
|
2030
|
+
state2.browserProfileCore = normalizedCore;
|
|
2031
|
+
state2.browserProfile = buildBrowserProfilePayload(normalizedCore, state2.browserProfileObserved);
|
|
2032
|
+
if (Object.keys(state2.browserProfile).length > 0) {
|
|
2033
|
+
state2.runtime.browser_profile = state2.browserProfile;
|
|
2034
2034
|
} else {
|
|
2035
|
-
delete
|
|
2035
|
+
delete state2.runtime.browser_profile;
|
|
2036
2036
|
}
|
|
2037
|
-
rememberRuntimeState(
|
|
2038
|
-
return
|
|
2037
|
+
rememberRuntimeState(state2);
|
|
2038
|
+
return state2;
|
|
2039
2039
|
},
|
|
2040
2040
|
// applyToPage 只负责把登录态相关字段注入页面:
|
|
2041
2041
|
// cookies / localStorage / sessionStorage。
|
|
2042
2042
|
// 指纹、时区、UA、viewport 的回放发生在 launch.js 启动阶段,不在这里做。
|
|
2043
2043
|
async applyToPage(page, source = {}, options = {}) {
|
|
2044
2044
|
if (!page) return;
|
|
2045
|
-
let
|
|
2045
|
+
let state2 = normalizeRuntimeState(source, options?.actor || "");
|
|
2046
2046
|
if (typeof options?.preapply === "function") {
|
|
2047
|
-
|
|
2048
|
-
rememberRuntimeState(
|
|
2047
|
+
state2 = await options.preapply(state2) || state2;
|
|
2048
|
+
rememberRuntimeState(state2);
|
|
2049
2049
|
}
|
|
2050
2050
|
Object.defineProperty(page, PageRuntimeStateKey, {
|
|
2051
2051
|
configurable: true,
|
|
2052
2052
|
enumerable: false,
|
|
2053
2053
|
writable: true,
|
|
2054
|
-
value:
|
|
2054
|
+
value: state2
|
|
2055
2055
|
});
|
|
2056
|
-
const localStorage =
|
|
2057
|
-
const sessionStorage =
|
|
2058
|
-
const cookies = (
|
|
2056
|
+
const localStorage = state2.localStorage || {};
|
|
2057
|
+
const sessionStorage = state2.sessionStorage || {};
|
|
2058
|
+
const cookies = (state2.cookies || []).map((cookie) => {
|
|
2059
2059
|
const normalized = { ...cookie };
|
|
2060
2060
|
if (!normalized.path) {
|
|
2061
2061
|
normalized.path = "/";
|
|
@@ -2093,8 +2093,8 @@ var RuntimeEnv = {
|
|
|
2093
2093
|
},
|
|
2094
2094
|
// captureEnvPatch 在任务结束时采集最新环境快照,用于 pushSuccess / pushFailed 自动回写。
|
|
2095
2095
|
async captureEnvPatch(page, source = {}, options = {}) {
|
|
2096
|
-
const
|
|
2097
|
-
const baseline = RuntimeEnv.buildEnvPatch(
|
|
2096
|
+
const state2 = normalizeRuntimeState(source, options?.actor || "");
|
|
2097
|
+
const baseline = RuntimeEnv.buildEnvPatch(state2) || {};
|
|
2098
2098
|
if (!page || typeof page.evaluate !== "function" || typeof page.context !== "function") {
|
|
2099
2099
|
return Object.keys(baseline).length > 0 ? baseline : null;
|
|
2100
2100
|
}
|
|
@@ -2113,7 +2113,7 @@ var RuntimeEnv = {
|
|
|
2113
2113
|
cookies
|
|
2114
2114
|
},
|
|
2115
2115
|
{
|
|
2116
|
-
browserProfileCore:
|
|
2116
|
+
browserProfileCore: state2.browserProfileCore
|
|
2117
2117
|
}
|
|
2118
2118
|
);
|
|
2119
2119
|
return RuntimeEnv.mergeEnvPatches(baseline, capturedPatch);
|
|
@@ -2127,11 +2127,11 @@ var RuntimeEnv = {
|
|
|
2127
2127
|
var logger3 = createInternalLogger("ApifyKit");
|
|
2128
2128
|
var resolveRuntimeContext = (input) => {
|
|
2129
2129
|
const rememberedState = RuntimeEnv.peekRememberedState();
|
|
2130
|
-
const
|
|
2131
|
-
const envPatch = RuntimeEnv.buildEnvPatch(
|
|
2130
|
+
const state2 = rememberedState || RuntimeEnv.parseInput(input || {});
|
|
2131
|
+
const envPatch = RuntimeEnv.buildEnvPatch(state2) || null;
|
|
2132
2132
|
return {
|
|
2133
|
-
actor:
|
|
2134
|
-
runtime:
|
|
2133
|
+
actor: state2.actor,
|
|
2134
|
+
runtime: state2.runtime,
|
|
2135
2135
|
envPatch
|
|
2136
2136
|
};
|
|
2137
2137
|
};
|
|
@@ -2490,6 +2490,57 @@ var Utils = {
|
|
|
2490
2490
|
}
|
|
2491
2491
|
};
|
|
2492
2492
|
|
|
2493
|
+
// src/internals/context.js
|
|
2494
|
+
var state = {
|
|
2495
|
+
mode: Mode.Default
|
|
2496
|
+
};
|
|
2497
|
+
var normalizeStrategies = (strategies) => strategies && typeof strategies === "object" ? strategies : {};
|
|
2498
|
+
var ToolkitContext = {
|
|
2499
|
+
get mode() {
|
|
2500
|
+
return state.mode;
|
|
2501
|
+
},
|
|
2502
|
+
setMode(mode = Mode.Default) {
|
|
2503
|
+
state.mode = normalizeMode(mode, Mode.Default);
|
|
2504
|
+
return state.mode;
|
|
2505
|
+
}
|
|
2506
|
+
};
|
|
2507
|
+
var getToolkitMode = () => state.mode;
|
|
2508
|
+
var setToolkitMode = (mode = Mode.Default) => ToolkitContext.setMode(mode);
|
|
2509
|
+
var resolveModeStrategy = (strategies = {}, mode = getToolkitMode(), fallbackMode = Mode.Default) => {
|
|
2510
|
+
const normalizedStrategies = normalizeStrategies(strategies);
|
|
2511
|
+
const normalizedMode = normalizeMode(mode, fallbackMode);
|
|
2512
|
+
const delegate = normalizedStrategies[normalizedMode] ?? normalizedStrategies[fallbackMode] ?? Object.values(normalizedStrategies).find(Boolean) ?? null;
|
|
2513
|
+
return {
|
|
2514
|
+
mode: normalizedMode,
|
|
2515
|
+
delegate
|
|
2516
|
+
};
|
|
2517
|
+
};
|
|
2518
|
+
|
|
2519
|
+
// src/internals/delegate.js
|
|
2520
|
+
var normalizeMethodDefinition = (definition) => typeof definition === "string" ? { name: definition, enumerable: true } : {
|
|
2521
|
+
name: String(definition?.name || "").trim(),
|
|
2522
|
+
enumerable: definition?.enumerable !== false
|
|
2523
|
+
};
|
|
2524
|
+
var createMethodDescriptor = (namespace, methodName, enumerable, strategies) => ({
|
|
2525
|
+
enumerable,
|
|
2526
|
+
value: (...args) => {
|
|
2527
|
+
const { mode, delegate } = resolveModeStrategy(strategies);
|
|
2528
|
+
if (typeof delegate?.[methodName] !== "function") {
|
|
2529
|
+
throw new Error(`${namespace}.${methodName} is not available in ${mode} mode`);
|
|
2530
|
+
}
|
|
2531
|
+
return delegate[methodName](...args);
|
|
2532
|
+
}
|
|
2533
|
+
});
|
|
2534
|
+
var createDelegatedFacade = (namespace, strategies = {}, methods = []) => {
|
|
2535
|
+
const descriptors = Object.fromEntries(
|
|
2536
|
+
methods.map(normalizeMethodDefinition).filter((method) => method.name).map((method) => [
|
|
2537
|
+
method.name,
|
|
2538
|
+
createMethodDescriptor(namespace, method.name, method.enumerable, strategies)
|
|
2539
|
+
])
|
|
2540
|
+
);
|
|
2541
|
+
return Object.defineProperties({}, descriptors);
|
|
2542
|
+
};
|
|
2543
|
+
|
|
2493
2544
|
// src/internals/anti-cheat/default.js
|
|
2494
2545
|
var BASE_CONFIG = Object.freeze({
|
|
2495
2546
|
locale: "zh-CN",
|
|
@@ -2563,43 +2614,52 @@ var DefaultAntiCheat = {
|
|
|
2563
2614
|
};
|
|
2564
2615
|
|
|
2565
2616
|
// src/internals/anti-cheat/cloakbrowser.js
|
|
2566
|
-
var
|
|
2567
|
-
|
|
2568
|
-
|
|
2569
|
-
|
|
2570
|
-
|
|
2571
|
-
|
|
2572
|
-
|
|
2573
|
-
|
|
2574
|
-
|
|
2575
|
-
|
|
2576
|
-
|
|
2577
|
-
|
|
2578
|
-
var callAntiCheat = (method, ...args) => {
|
|
2579
|
-
const delegate = resolveAntiCheatDelegate();
|
|
2580
|
-
if (typeof delegate?.[method] !== "function") {
|
|
2581
|
-
throw new Error(`AntiCheat.${method} is not available in ${getToolkitMode()} mode`);
|
|
2582
|
-
}
|
|
2583
|
-
return delegate[method](...args);
|
|
2584
|
-
};
|
|
2585
|
-
var AntiCheat = {
|
|
2617
|
+
var CLOAK_BROWSER_BASE_CONFIG = Object.freeze({
|
|
2618
|
+
locale: "",
|
|
2619
|
+
acceptLanguage: "",
|
|
2620
|
+
timezoneId: "",
|
|
2621
|
+
timezoneOffset: null,
|
|
2622
|
+
geolocation: null
|
|
2623
|
+
});
|
|
2624
|
+
var normalizeHeaders = (headers) => headers && typeof headers === "object" ? headers : {};
|
|
2625
|
+
var CloakBrowserAntiCheat = {
|
|
2626
|
+
/**
|
|
2627
|
+
* CloakBrowser 自身会负责浏览器指纹,toolkit 在该模式下尽量不再注入额外反检测配置。
|
|
2628
|
+
*/
|
|
2586
2629
|
getBaseConfig() {
|
|
2587
|
-
return
|
|
2630
|
+
return { ...CLOAK_BROWSER_BASE_CONFIG };
|
|
2588
2631
|
},
|
|
2589
|
-
getFingerprintGeneratorOptions(
|
|
2590
|
-
return
|
|
2632
|
+
getFingerprintGeneratorOptions() {
|
|
2633
|
+
return {};
|
|
2591
2634
|
},
|
|
2592
|
-
getLaunchArgs(
|
|
2593
|
-
return
|
|
2635
|
+
getLaunchArgs() {
|
|
2636
|
+
return [];
|
|
2594
2637
|
},
|
|
2595
|
-
getTlsFingerprintOptions(
|
|
2596
|
-
return
|
|
2638
|
+
getTlsFingerprintOptions() {
|
|
2639
|
+
return {};
|
|
2597
2640
|
},
|
|
2598
2641
|
applyLocaleHeaders(headers, acceptLanguage = "") {
|
|
2599
|
-
|
|
2642
|
+
const normalizedHeaders = normalizeHeaders(headers);
|
|
2643
|
+
if (acceptLanguage && !normalizedHeaders["accept-language"]) {
|
|
2644
|
+
normalizedHeaders["accept-language"] = acceptLanguage;
|
|
2645
|
+
}
|
|
2646
|
+
return normalizedHeaders;
|
|
2600
2647
|
}
|
|
2601
2648
|
};
|
|
2602
2649
|
|
|
2650
|
+
// src/anti-cheat.js
|
|
2651
|
+
var antiCheatStrategies = {
|
|
2652
|
+
[Mode.Default]: DefaultAntiCheat,
|
|
2653
|
+
[Mode.CloakBrowser]: CloakBrowserAntiCheat
|
|
2654
|
+
};
|
|
2655
|
+
var AntiCheat = createDelegatedFacade("AntiCheat", antiCheatStrategies, [
|
|
2656
|
+
"getBaseConfig",
|
|
2657
|
+
"getFingerprintGeneratorOptions",
|
|
2658
|
+
"getLaunchArgs",
|
|
2659
|
+
"getTlsFingerprintOptions",
|
|
2660
|
+
"applyLocaleHeaders"
|
|
2661
|
+
]);
|
|
2662
|
+
|
|
2603
2663
|
// src/device-input.js
|
|
2604
2664
|
var resolveDeviceFromPage = (page) => normalizeDevice(page?.[PageRuntimeStateKey]?.device);
|
|
2605
2665
|
var assertPage = (page, method) => {
|
|
@@ -2999,12 +3059,12 @@ var resolveDescriptor = (descriptor, device) => {
|
|
|
2999
3059
|
}
|
|
3000
3060
|
return resolved;
|
|
3001
3061
|
};
|
|
3002
|
-
var attachRuntimeState = (page,
|
|
3062
|
+
var attachRuntimeState = (page, state2) => {
|
|
3003
3063
|
Object.defineProperty(page, PageRuntimeStateKey, {
|
|
3004
3064
|
configurable: true,
|
|
3005
3065
|
enumerable: false,
|
|
3006
3066
|
writable: true,
|
|
3007
|
-
value:
|
|
3067
|
+
value: state2
|
|
3008
3068
|
});
|
|
3009
3069
|
};
|
|
3010
3070
|
var restoreRuntimeState = (page, snapshot) => {
|
|
@@ -4058,7 +4118,7 @@ var restoreWindowFromSnapshot = async (page, before, after) => {
|
|
|
4058
4118
|
return;
|
|
4059
4119
|
}
|
|
4060
4120
|
await page.evaluate(
|
|
4061
|
-
(
|
|
4121
|
+
(state2) => window.scrollTo(state2.x, state2.y),
|
|
4062
4122
|
{ x: Number(before.scrollX || 0), y: Number(before.scrollY || 0) }
|
|
4063
4123
|
).catch(() => {
|
|
4064
4124
|
});
|
|
@@ -4304,7 +4364,7 @@ var MobileHumanize = {
|
|
|
4304
4364
|
if (scrollRect && beforeWindowState) {
|
|
4305
4365
|
const afterWindowState = await page.evaluate(() => ({ x: window.scrollX, y: window.scrollY }));
|
|
4306
4366
|
if (Math.abs(afterWindowState.x - beforeWindowState.x) > 2 || Math.abs(afterWindowState.y - beforeWindowState.y) > 2) {
|
|
4307
|
-
await page.evaluate((
|
|
4367
|
+
await page.evaluate((state2) => window.scrollTo(state2.x, state2.y), beforeWindowState);
|
|
4308
4368
|
logger6.debug(`humanScroll | \u7A97\u53E3\u6EDA\u52A8\u56DE\u6536 from=${Math.round(afterWindowState.y)} to=${Math.round(beforeWindowState.y)}`);
|
|
4309
4369
|
}
|
|
4310
4370
|
}
|
|
@@ -4671,23 +4731,60 @@ var DefaultHumanize = {
|
|
|
4671
4731
|
|
|
4672
4732
|
// src/internals/humanize/cloakbrowser.js
|
|
4673
4733
|
var import_delay4 = __toESM(require("delay"), 1);
|
|
4674
|
-
var logger7 = createInternalLogger("Humanize.CloakBrowser");
|
|
4675
|
-
var humanizedPages = /* @__PURE__ */ new WeakSet();
|
|
4676
|
-
var cachedCloakHumanModulePromise = null;
|
|
4677
4734
|
var isPageLike2 = (value) => value && typeof value === "object" && typeof value.evaluate === "function";
|
|
4678
4735
|
var isPoint2 = (value) => value && typeof value === "object" && Number.isFinite(Number(value.x)) && Number.isFinite(Number(value.y));
|
|
4679
4736
|
var resolveDeviceFromPage3 = (page) => normalizeDevice(page?.[PageRuntimeStateKey]?.device);
|
|
4680
4737
|
var isMobilePage = (page) => resolveDeviceFromPage3(page) === Device.Mobile;
|
|
4681
|
-
var
|
|
4682
|
-
|
|
4683
|
-
|
|
4684
|
-
|
|
4685
|
-
|
|
4686
|
-
|
|
4738
|
+
var resolveNativeTarget2 = (page, target) => typeof target === "string" ? page.locator(target).first() : target;
|
|
4739
|
+
var targetExists = async (target) => {
|
|
4740
|
+
if (!target) {
|
|
4741
|
+
return false;
|
|
4742
|
+
}
|
|
4743
|
+
if (typeof target.count === "function") {
|
|
4744
|
+
const count = await target.count().catch(() => 0);
|
|
4745
|
+
return count > 0;
|
|
4746
|
+
}
|
|
4747
|
+
if (typeof target.elementHandle === "function") {
|
|
4748
|
+
const handle = await target.elementHandle().catch(() => null);
|
|
4749
|
+
try {
|
|
4750
|
+
return Boolean(handle);
|
|
4751
|
+
} finally {
|
|
4752
|
+
await handle?.dispose?.().catch(() => {
|
|
4687
4753
|
});
|
|
4688
|
-
}
|
|
4754
|
+
}
|
|
4755
|
+
}
|
|
4756
|
+
return true;
|
|
4757
|
+
};
|
|
4758
|
+
var getTargetBoundingBox2 = async (target) => {
|
|
4759
|
+
if (!target) {
|
|
4760
|
+
return null;
|
|
4761
|
+
}
|
|
4762
|
+
if (typeof target.boundingBox === "function") {
|
|
4763
|
+
return await target.boundingBox().catch(() => null);
|
|
4764
|
+
}
|
|
4765
|
+
if (typeof target.elementHandle === "function") {
|
|
4766
|
+
const handle = await target.elementHandle().catch(() => null);
|
|
4767
|
+
try {
|
|
4768
|
+
return await handle?.boundingBox?.().catch(() => null);
|
|
4769
|
+
} finally {
|
|
4770
|
+
await handle?.dispose?.().catch(() => {
|
|
4771
|
+
});
|
|
4772
|
+
}
|
|
4773
|
+
}
|
|
4774
|
+
return null;
|
|
4775
|
+
};
|
|
4776
|
+
var resolveActionTarget = async (page, target, { throwOnMissing = true } = {}) => {
|
|
4777
|
+
if (target == null) {
|
|
4778
|
+
return null;
|
|
4689
4779
|
}
|
|
4690
|
-
|
|
4780
|
+
const resolvedTarget = resolveNativeTarget2(page, target);
|
|
4781
|
+
if (throwOnMissing || await targetExists(resolvedTarget)) {
|
|
4782
|
+
return resolvedTarget;
|
|
4783
|
+
}
|
|
4784
|
+
return null;
|
|
4785
|
+
};
|
|
4786
|
+
var readViewportScroll = async (page) => {
|
|
4787
|
+
return await page.evaluate(() => ({ x: window.scrollX, y: window.scrollY })).catch(() => ({ x: 0, y: 0 }));
|
|
4691
4788
|
};
|
|
4692
4789
|
var buildTypingHumanConfig = (options = {}) => {
|
|
4693
4790
|
const humanConfig = {};
|
|
@@ -4707,237 +4804,109 @@ var buildTypingHumanConfig = (options = {}) => {
|
|
|
4707
4804
|
return Object.keys(humanConfig).length > 0 ? humanConfig : null;
|
|
4708
4805
|
};
|
|
4709
4806
|
var buildActionOptions = (options = {}) => {
|
|
4710
|
-
const actionOptions = {
|
|
4807
|
+
const actionOptions = {
|
|
4808
|
+
force: true
|
|
4809
|
+
};
|
|
4711
4810
|
if (options && options.timeout != null) {
|
|
4712
4811
|
actionOptions.timeout = options.timeout;
|
|
4713
4812
|
}
|
|
4714
|
-
actionOptions.force = true;
|
|
4715
4813
|
const humanConfig = buildTypingHumanConfig(options);
|
|
4716
4814
|
if (humanConfig) {
|
|
4717
4815
|
actionOptions.human_config = humanConfig;
|
|
4718
4816
|
}
|
|
4719
4817
|
return actionOptions;
|
|
4720
4818
|
};
|
|
4721
|
-
var ensureDesktopHumanized = async (page) => {
|
|
4722
|
-
if (!page || typeof page !== "object") {
|
|
4723
|
-
throw new Error("Humanize requires a Playwright page");
|
|
4724
|
-
}
|
|
4725
|
-
const humanModule = await loadCloakHumanModule();
|
|
4726
|
-
if (page._original && page._humanCursor) {
|
|
4727
|
-
humanizedPages.add(page);
|
|
4728
|
-
return humanModule;
|
|
4729
|
-
}
|
|
4730
|
-
if (humanizedPages.has(page)) {
|
|
4731
|
-
return humanModule;
|
|
4732
|
-
}
|
|
4733
|
-
const config = page._humanCfg || humanModule.resolveConfig?.("default") || humanModule.resolveConfig?.();
|
|
4734
|
-
const cursor = page._humanCursor || { x: 0, y: 0, initialized: false };
|
|
4735
|
-
humanModule.patchPage(page, config, cursor);
|
|
4736
|
-
humanizedPages.add(page);
|
|
4737
|
-
return humanModule;
|
|
4738
|
-
};
|
|
4739
|
-
var patchHandle = async (page, handle) => {
|
|
4740
|
-
if (!handle || typeof handle !== "object") return handle;
|
|
4741
|
-
const humanModule = await ensureDesktopHumanized(page);
|
|
4742
|
-
humanModule.patchSingleElementHandle(
|
|
4743
|
-
handle,
|
|
4744
|
-
page,
|
|
4745
|
-
page._humanCfg,
|
|
4746
|
-
page._humanCursor,
|
|
4747
|
-
page._humanRaw,
|
|
4748
|
-
page._humanRawKb,
|
|
4749
|
-
page._humanOriginals,
|
|
4750
|
-
page._stealth
|
|
4751
|
-
);
|
|
4752
|
-
return handle;
|
|
4753
|
-
};
|
|
4754
|
-
var resolvePatchedTarget = async (page, target, { throwOnMissing = true } = {}) => {
|
|
4755
|
-
if (target == null) {
|
|
4756
|
-
return { target: null, dispose: null };
|
|
4757
|
-
}
|
|
4758
|
-
if (typeof target === "string") {
|
|
4759
|
-
const handle = await page.$(target);
|
|
4760
|
-
if (!handle) {
|
|
4761
|
-
if (throwOnMissing) {
|
|
4762
|
-
throw new Error(`\u627E\u4E0D\u5230\u5143\u7D20 ${String(target)}`);
|
|
4763
|
-
}
|
|
4764
|
-
return { target: null, dispose: null };
|
|
4765
|
-
}
|
|
4766
|
-
return { target: handle, dispose: null };
|
|
4767
|
-
}
|
|
4768
|
-
if (typeof target.elementHandle === "function") {
|
|
4769
|
-
const handle = await target.elementHandle();
|
|
4770
|
-
if (!handle) {
|
|
4771
|
-
if (throwOnMissing) {
|
|
4772
|
-
throw new Error("\u627E\u4E0D\u5230 locator \u5BF9\u5E94\u7684\u5143\u7D20");
|
|
4773
|
-
}
|
|
4774
|
-
return { target: null, dispose: null };
|
|
4775
|
-
}
|
|
4776
|
-
await patchHandle(page, handle);
|
|
4777
|
-
return {
|
|
4778
|
-
target: handle,
|
|
4779
|
-
dispose: async () => {
|
|
4780
|
-
await handle.dispose().catch(() => {
|
|
4781
|
-
});
|
|
4782
|
-
}
|
|
4783
|
-
};
|
|
4784
|
-
}
|
|
4785
|
-
await patchHandle(page, target);
|
|
4786
|
-
return { target, dispose: null };
|
|
4787
|
-
};
|
|
4788
4819
|
var jitterSleep = async (baseMs, jitterPercent = 0.3) => {
|
|
4789
4820
|
await (0, import_delay4.default)(jitterMs(baseMs, jitterPercent));
|
|
4790
4821
|
};
|
|
4791
|
-
var
|
|
4792
|
-
await ensureDesktopHumanized(page);
|
|
4822
|
+
var moveCursorToPoint = async (page, point) => {
|
|
4793
4823
|
await page.mouse.move(Number(point.x), Number(point.y));
|
|
4794
4824
|
return true;
|
|
4795
4825
|
};
|
|
4796
|
-
var doDesktopHumanClick = async (page, target, options = {}) => {
|
|
4797
|
-
await ensureDesktopHumanized(page);
|
|
4798
|
-
if (target == null) {
|
|
4799
|
-
const cursor = page._humanCursor || { x: 0, y: 0 };
|
|
4800
|
-
await page.mouse.click(cursor.x || 0, cursor.y || 0);
|
|
4801
|
-
return true;
|
|
4802
|
-
}
|
|
4803
|
-
if (isPoint2(target)) {
|
|
4804
|
-
return humanMoveToPoint(page, target).then(async () => {
|
|
4805
|
-
await page.mouse.click(Number(target.x), Number(target.y));
|
|
4806
|
-
return true;
|
|
4807
|
-
});
|
|
4808
|
-
}
|
|
4809
|
-
const throwOnMissing = options.throwOnMissing !== false;
|
|
4810
|
-
if (typeof target === "string") {
|
|
4811
|
-
if (!throwOnMissing) {
|
|
4812
|
-
const existingHandle = await page.$(target);
|
|
4813
|
-
if (!existingHandle) {
|
|
4814
|
-
return false;
|
|
4815
|
-
}
|
|
4816
|
-
await existingHandle.click(buildActionOptions(options));
|
|
4817
|
-
return true;
|
|
4818
|
-
}
|
|
4819
|
-
await page.click(target, buildActionOptions(options));
|
|
4820
|
-
return true;
|
|
4821
|
-
}
|
|
4822
|
-
const { target: resolvedTarget, dispose } = await resolvePatchedTarget(page, target, { throwOnMissing });
|
|
4823
|
-
try {
|
|
4824
|
-
if (!resolvedTarget) {
|
|
4825
|
-
return false;
|
|
4826
|
-
}
|
|
4827
|
-
if (typeof resolvedTarget.click === "function") {
|
|
4828
|
-
await resolvedTarget.click(buildActionOptions(options));
|
|
4829
|
-
return true;
|
|
4830
|
-
}
|
|
4831
|
-
const box = await resolvedTarget.boundingBox?.();
|
|
4832
|
-
if (!box) {
|
|
4833
|
-
if (throwOnMissing) {
|
|
4834
|
-
throw new Error("\u65E0\u6CD5\u83B7\u53D6\u5143\u7D20\u4F4D\u7F6E");
|
|
4835
|
-
}
|
|
4836
|
-
return false;
|
|
4837
|
-
}
|
|
4838
|
-
await page.mouse.click(box.x + box.width / 2, box.y + box.height / 2);
|
|
4839
|
-
return true;
|
|
4840
|
-
} finally {
|
|
4841
|
-
if (typeof dispose === "function") {
|
|
4842
|
-
await dispose();
|
|
4843
|
-
}
|
|
4844
|
-
}
|
|
4845
|
-
};
|
|
4846
4826
|
var CloakBrowserHumanize = {
|
|
4847
4827
|
jitterMs(base, jitterPercent = 0.3) {
|
|
4848
4828
|
return jitterMs(base, jitterPercent);
|
|
4849
4829
|
},
|
|
4850
4830
|
async initializeCursor(page) {
|
|
4851
4831
|
if (isMobilePage(page)) {
|
|
4852
|
-
return MobileHumanize.initializeCursor(page);
|
|
4832
|
+
return await MobileHumanize.initializeCursor(page);
|
|
4853
4833
|
}
|
|
4854
|
-
|
|
4855
|
-
logger7.debug("initializeCursor: cloakbrowser human layer ready");
|
|
4834
|
+
return Boolean(page);
|
|
4856
4835
|
},
|
|
4857
4836
|
async humanMove(page, target) {
|
|
4858
4837
|
if (isMobilePage(page)) {
|
|
4859
4838
|
return await MobileHumanize.humanMove(page, target);
|
|
4860
4839
|
}
|
|
4861
|
-
await ensureDesktopHumanized(page);
|
|
4862
4840
|
if (isPoint2(target)) {
|
|
4863
|
-
return await
|
|
4841
|
+
return await moveCursorToPoint(page, target);
|
|
4864
4842
|
}
|
|
4865
|
-
const
|
|
4866
|
-
|
|
4867
|
-
|
|
4868
|
-
|
|
4869
|
-
|
|
4870
|
-
|
|
4871
|
-
await resolvedTarget.hover({ force: true });
|
|
4872
|
-
return true;
|
|
4873
|
-
}
|
|
4874
|
-
const box = await resolvedTarget.boundingBox?.();
|
|
4875
|
-
if (!box) {
|
|
4876
|
-
return false;
|
|
4877
|
-
}
|
|
4878
|
-
await page.mouse.move(box.x + box.width / 2, box.y + box.height / 2);
|
|
4843
|
+
const resolvedTarget = await resolveActionTarget(page, target, { throwOnMissing: false });
|
|
4844
|
+
if (!resolvedTarget) {
|
|
4845
|
+
return false;
|
|
4846
|
+
}
|
|
4847
|
+
if (typeof resolvedTarget.hover === "function") {
|
|
4848
|
+
await resolvedTarget.hover({ force: true });
|
|
4879
4849
|
return true;
|
|
4880
|
-
} finally {
|
|
4881
|
-
if (typeof dispose === "function") {
|
|
4882
|
-
await dispose();
|
|
4883
|
-
}
|
|
4884
4850
|
}
|
|
4851
|
+
const box = await getTargetBoundingBox2(resolvedTarget);
|
|
4852
|
+
if (!box) {
|
|
4853
|
+
return false;
|
|
4854
|
+
}
|
|
4855
|
+
return await moveCursorToPoint(page, {
|
|
4856
|
+
x: box.x + box.width / 2,
|
|
4857
|
+
y: box.y + box.height / 2
|
|
4858
|
+
});
|
|
4885
4859
|
},
|
|
4886
4860
|
async humanScroll(page, target, options = {}) {
|
|
4887
4861
|
if (isMobilePage(page)) {
|
|
4888
4862
|
return await MobileHumanize.humanScroll(page, target, options);
|
|
4889
4863
|
}
|
|
4890
|
-
const
|
|
4891
|
-
if (
|
|
4892
|
-
|
|
4893
|
-
try {
|
|
4894
|
-
const result = await humanModule.scrollToElement(
|
|
4895
|
-
page,
|
|
4896
|
-
page._humanRaw,
|
|
4897
|
-
target,
|
|
4898
|
-
x,
|
|
4899
|
-
y,
|
|
4900
|
-
page._humanCfg,
|
|
4901
|
-
options.timeout
|
|
4902
|
-
);
|
|
4903
|
-
if (page._humanCursor) {
|
|
4904
|
-
page._humanCursor.x = result.cursorX;
|
|
4905
|
-
page._humanCursor.y = result.cursorY;
|
|
4906
|
-
}
|
|
4907
|
-
return {
|
|
4908
|
-
element: await page.$(target),
|
|
4909
|
-
didScroll: Boolean(result.didScroll),
|
|
4910
|
-
restore: null
|
|
4911
|
-
};
|
|
4912
|
-
} catch (error) {
|
|
4913
|
-
logger7.warn(`humanScroll: cloakbrowser \u6EDA\u52A8\u5931\u8D25\uFF0C\u8DF3\u8FC7 (${error?.message || error})`);
|
|
4914
|
-
return { element: null, didScroll: false, restore: null };
|
|
4915
|
-
}
|
|
4916
|
-
}
|
|
4917
|
-
const { target: resolvedTarget, dispose } = await resolvePatchedTarget(page, target, { throwOnMissing: false });
|
|
4918
|
-
try {
|
|
4919
|
-
if (!resolvedTarget) {
|
|
4920
|
-
return { element: null, didScroll: false, restore: null };
|
|
4921
|
-
}
|
|
4922
|
-
const before = await page.evaluate(() => ({ x: window.scrollX, y: window.scrollY }));
|
|
4923
|
-
await resolvedTarget.scrollIntoViewIfNeeded?.();
|
|
4924
|
-
const after = await page.evaluate(() => ({ x: window.scrollX, y: window.scrollY }));
|
|
4925
|
-
return {
|
|
4926
|
-
element: resolvedTarget,
|
|
4927
|
-
didScroll: before.x !== after.x || before.y !== after.y,
|
|
4928
|
-
restore: null
|
|
4929
|
-
};
|
|
4930
|
-
} finally {
|
|
4931
|
-
if (typeof dispose === "function") {
|
|
4932
|
-
await dispose();
|
|
4933
|
-
}
|
|
4864
|
+
const resolvedTarget = await resolveActionTarget(page, target, { throwOnMissing: false });
|
|
4865
|
+
if (!resolvedTarget) {
|
|
4866
|
+
return { element: null, didScroll: false, restore: null };
|
|
4934
4867
|
}
|
|
4868
|
+
const before = await readViewportScroll(page);
|
|
4869
|
+
await resolvedTarget.scrollIntoViewIfNeeded?.().catch(() => {
|
|
4870
|
+
});
|
|
4871
|
+
const after = await readViewportScroll(page);
|
|
4872
|
+
return {
|
|
4873
|
+
element: resolvedTarget,
|
|
4874
|
+
didScroll: before.x !== after.x || before.y !== after.y,
|
|
4875
|
+
restore: null
|
|
4876
|
+
};
|
|
4935
4877
|
},
|
|
4936
4878
|
async humanClick(page, target, options = {}) {
|
|
4937
4879
|
if (isMobilePage(page)) {
|
|
4938
4880
|
return await MobileHumanize.humanClick(page, target, options);
|
|
4939
4881
|
}
|
|
4940
|
-
|
|
4882
|
+
if (target == null) {
|
|
4883
|
+
const { x = 0, y = 0 } = page?._humanCursor || {};
|
|
4884
|
+
await page.mouse.click(x || 0, y || 0);
|
|
4885
|
+
return true;
|
|
4886
|
+
}
|
|
4887
|
+
if (isPoint2(target)) {
|
|
4888
|
+
await page.mouse.click(Number(target.x), Number(target.y));
|
|
4889
|
+
return true;
|
|
4890
|
+
}
|
|
4891
|
+
const resolvedTarget = await resolveActionTarget(page, target, {
|
|
4892
|
+
throwOnMissing: options.throwOnMissing !== false
|
|
4893
|
+
});
|
|
4894
|
+
if (!resolvedTarget) {
|
|
4895
|
+
return false;
|
|
4896
|
+
}
|
|
4897
|
+
if (typeof resolvedTarget.click === "function") {
|
|
4898
|
+
await resolvedTarget.click(buildActionOptions(options));
|
|
4899
|
+
return true;
|
|
4900
|
+
}
|
|
4901
|
+
const box = await getTargetBoundingBox2(resolvedTarget);
|
|
4902
|
+
if (!box) {
|
|
4903
|
+
if (options.throwOnMissing !== false) {
|
|
4904
|
+
throw new Error("\u65E0\u6CD5\u83B7\u53D6\u5143\u7D20\u4F4D\u7F6E");
|
|
4905
|
+
}
|
|
4906
|
+
return false;
|
|
4907
|
+
}
|
|
4908
|
+
await page.mouse.click(box.x + box.width / 2, box.y + box.height / 2);
|
|
4909
|
+
return true;
|
|
4941
4910
|
},
|
|
4942
4911
|
async randomSleep(pageOrBaseMs, maybeBaseMs, maybeJitterPercent) {
|
|
4943
4912
|
if (isPageLike2(pageOrBaseMs)) {
|
|
@@ -4953,7 +4922,6 @@ var CloakBrowserHumanize = {
|
|
|
4953
4922
|
if (isMobilePage(page)) {
|
|
4954
4923
|
return await MobileHumanize.simulateGaze(page, baseDurationMs);
|
|
4955
4924
|
}
|
|
4956
|
-
await ensureDesktopHumanized(page);
|
|
4957
4925
|
const durationMs = jitterMs(baseDurationMs, 0.4);
|
|
4958
4926
|
const startTime = Date.now();
|
|
4959
4927
|
const viewportSize = page.viewportSize() || { width: 1365, height: 900 };
|
|
@@ -4969,29 +4937,21 @@ var CloakBrowserHumanize = {
|
|
|
4969
4937
|
if (isMobilePage(page)) {
|
|
4970
4938
|
return await MobileHumanize.humanType(page, selector, text, options);
|
|
4971
4939
|
}
|
|
4972
|
-
await ensureDesktopHumanized(page);
|
|
4973
4940
|
const actionOptions = buildActionOptions(options);
|
|
4974
4941
|
if (typeof selector === "string") {
|
|
4975
4942
|
await page.type(selector, text, actionOptions);
|
|
4976
4943
|
return;
|
|
4977
4944
|
}
|
|
4978
|
-
const
|
|
4979
|
-
|
|
4980
|
-
|
|
4981
|
-
throw new Error("\u76EE\u6807\u5143\u7D20\u4E0D\u652F\u6301 type()");
|
|
4982
|
-
}
|
|
4983
|
-
await resolvedTarget.type(text, actionOptions);
|
|
4984
|
-
} finally {
|
|
4985
|
-
if (typeof dispose === "function") {
|
|
4986
|
-
await dispose();
|
|
4987
|
-
}
|
|
4945
|
+
const resolvedTarget = await resolveActionTarget(page, selector, { throwOnMissing: true });
|
|
4946
|
+
if (!resolvedTarget || typeof resolvedTarget.type !== "function") {
|
|
4947
|
+
throw new Error("\u76EE\u6807\u5143\u7D20\u4E0D\u652F\u6301 type()");
|
|
4988
4948
|
}
|
|
4949
|
+
await resolvedTarget.type(text, actionOptions);
|
|
4989
4950
|
},
|
|
4990
4951
|
async humanPress(page, targetOrKey, maybeKey, options = {}) {
|
|
4991
4952
|
if (isMobilePage(page)) {
|
|
4992
4953
|
return await MobileHumanize.humanPress(page, targetOrKey, maybeKey, options);
|
|
4993
4954
|
}
|
|
4994
|
-
await ensureDesktopHumanized(page);
|
|
4995
4955
|
const hasTarget = typeof maybeKey === "string";
|
|
4996
4956
|
const key = hasTarget ? maybeKey : targetOrKey;
|
|
4997
4957
|
const pressOptions = hasTarget ? options : maybeKey || options;
|
|
@@ -5007,49 +4967,57 @@ var CloakBrowserHumanize = {
|
|
|
5007
4967
|
await page.press(targetOrKey, key, buildActionOptions(pressOptions));
|
|
5008
4968
|
return true;
|
|
5009
4969
|
}
|
|
5010
|
-
const
|
|
4970
|
+
const resolvedTarget = await resolveActionTarget(page, targetOrKey, {
|
|
5011
4971
|
throwOnMissing: pressOptions.throwOnMissing !== false
|
|
5012
4972
|
});
|
|
5013
|
-
|
|
5014
|
-
|
|
5015
|
-
|
|
5016
|
-
|
|
5017
|
-
|
|
5018
|
-
await resolvedTarget.press(key, buildActionOptions(pressOptions));
|
|
5019
|
-
return true;
|
|
5020
|
-
}
|
|
5021
|
-
await doDesktopHumanClick(page, targetOrKey, {
|
|
5022
|
-
...pressOptions,
|
|
5023
|
-
reactionDelay: pressOptions.focusDelay ?? 180
|
|
5024
|
-
});
|
|
5025
|
-
await jitterSleep(pressOptions.reactionDelay ?? 180, 0.45);
|
|
5026
|
-
await page.keyboard.press(key, {
|
|
5027
|
-
...pressOptions.keyboardOptions || {},
|
|
5028
|
-
delay: jitterMs(pressOptions.holdDelay ?? 45, 0.5)
|
|
5029
|
-
});
|
|
4973
|
+
if (!resolvedTarget) {
|
|
4974
|
+
return false;
|
|
4975
|
+
}
|
|
4976
|
+
if (typeof resolvedTarget.press === "function") {
|
|
4977
|
+
await resolvedTarget.press(key, buildActionOptions(pressOptions));
|
|
5030
4978
|
return true;
|
|
5031
|
-
} finally {
|
|
5032
|
-
if (typeof dispose === "function") {
|
|
5033
|
-
await dispose();
|
|
5034
|
-
}
|
|
5035
4979
|
}
|
|
4980
|
+
await this.humanClick(page, targetOrKey, {
|
|
4981
|
+
...pressOptions,
|
|
4982
|
+
reactionDelay: pressOptions.focusDelay ?? 180
|
|
4983
|
+
});
|
|
4984
|
+
await jitterSleep(pressOptions.reactionDelay ?? 180, 0.45);
|
|
4985
|
+
await page.keyboard.press(key, {
|
|
4986
|
+
...pressOptions.keyboardOptions || {},
|
|
4987
|
+
delay: jitterMs(pressOptions.holdDelay ?? 45, 0.5)
|
|
4988
|
+
});
|
|
4989
|
+
return true;
|
|
5036
4990
|
},
|
|
5037
4991
|
async humanClear(page, selector) {
|
|
5038
4992
|
if (isMobilePage(page)) {
|
|
5039
4993
|
return await MobileHumanize.humanClear(page, selector);
|
|
5040
4994
|
}
|
|
5041
|
-
|
|
5042
|
-
|
|
5043
|
-
|
|
4995
|
+
if (typeof selector === "string") {
|
|
4996
|
+
if (typeof page.clear === "function") {
|
|
4997
|
+
await page.clear(selector, { force: true });
|
|
4998
|
+
return;
|
|
4999
|
+
}
|
|
5000
|
+
await page.fill(selector, "", { force: true });
|
|
5001
|
+
return;
|
|
5002
|
+
}
|
|
5003
|
+
const resolvedTarget = await resolveActionTarget(page, selector, { throwOnMissing: true });
|
|
5004
|
+
if (!resolvedTarget) {
|
|
5005
|
+
throw new Error("\u76EE\u6807\u5143\u7D20\u4E0D\u652F\u6301 clear()");
|
|
5006
|
+
}
|
|
5007
|
+
if (typeof resolvedTarget.clear === "function") {
|
|
5008
|
+
await resolvedTarget.clear(buildActionOptions());
|
|
5009
|
+
return;
|
|
5010
|
+
}
|
|
5011
|
+
if (typeof resolvedTarget.fill === "function") {
|
|
5012
|
+
await resolvedTarget.fill("", buildActionOptions());
|
|
5044
5013
|
return;
|
|
5045
5014
|
}
|
|
5046
|
-
|
|
5015
|
+
throw new Error("\u76EE\u6807\u5143\u7D20\u4E0D\u652F\u6301 clear()");
|
|
5047
5016
|
},
|
|
5048
5017
|
async warmUpBrowsing(page, baseDuration = 3500) {
|
|
5049
5018
|
if (isMobilePage(page)) {
|
|
5050
5019
|
return await MobileHumanize.warmUpBrowsing(page, baseDuration);
|
|
5051
5020
|
}
|
|
5052
|
-
await ensureDesktopHumanized(page);
|
|
5053
5021
|
const durationMs = jitterMs(baseDuration, 0.4);
|
|
5054
5022
|
const startTime = Date.now();
|
|
5055
5023
|
const viewportSize = page.viewportSize() || { width: 1365, height: 900 };
|
|
@@ -5075,7 +5043,6 @@ var CloakBrowserHumanize = {
|
|
|
5075
5043
|
if (isMobilePage(page)) {
|
|
5076
5044
|
return await MobileHumanize.naturalScroll(page, direction, distance, baseSteps);
|
|
5077
5045
|
}
|
|
5078
|
-
await ensureDesktopHumanized(page);
|
|
5079
5046
|
const steps = Math.max(3, baseSteps + Math.floor(Math.random() * 3) - 1);
|
|
5080
5047
|
const actualDistance = jitterMs(distance, 0.15);
|
|
5081
5048
|
const sign = direction === "down" ? 1 : -1;
|
|
@@ -5090,55 +5057,24 @@ var CloakBrowserHumanize = {
|
|
|
5090
5057
|
};
|
|
5091
5058
|
|
|
5092
5059
|
// src/humanize.js
|
|
5093
|
-
var
|
|
5094
|
-
|
|
5095
|
-
|
|
5096
|
-
|
|
5097
|
-
|
|
5098
|
-
|
|
5099
|
-
|
|
5100
|
-
|
|
5101
|
-
|
|
5102
|
-
|
|
5103
|
-
|
|
5104
|
-
|
|
5105
|
-
|
|
5106
|
-
|
|
5107
|
-
|
|
5108
|
-
|
|
5109
|
-
|
|
5110
|
-
|
|
5111
|
-
humanScroll(page, target, options = {}) {
|
|
5112
|
-
return callHumanize("humanScroll", page, target, options);
|
|
5113
|
-
},
|
|
5114
|
-
humanClick(page, target, options = {}) {
|
|
5115
|
-
return callHumanize("humanClick", page, target, options);
|
|
5116
|
-
},
|
|
5117
|
-
randomSleep(pageOrBaseMs, maybeBaseMs, maybeJitterPercent) {
|
|
5118
|
-
return callHumanize("randomSleep", pageOrBaseMs, maybeBaseMs, maybeJitterPercent);
|
|
5119
|
-
},
|
|
5120
|
-
simulateGaze(page, baseDurationMs = 2500) {
|
|
5121
|
-
return callHumanize("simulateGaze", page, baseDurationMs);
|
|
5122
|
-
},
|
|
5123
|
-
humanType(page, selector, text, options = {}) {
|
|
5124
|
-
return callHumanize("humanType", page, selector, text, options);
|
|
5125
|
-
},
|
|
5126
|
-
humanPress(page, targetOrKey, maybeKey, options = {}) {
|
|
5127
|
-
if (typeof maybeKey === "string") {
|
|
5128
|
-
return callHumanize("humanPress", page, targetOrKey, maybeKey, options);
|
|
5129
|
-
}
|
|
5130
|
-
return callHumanize("humanPress", page, targetOrKey, maybeKey || options);
|
|
5131
|
-
},
|
|
5132
|
-
humanClear(page, selector) {
|
|
5133
|
-
return callHumanize("humanClear", page, selector);
|
|
5134
|
-
},
|
|
5135
|
-
warmUpBrowsing(page, baseDuration = 3500) {
|
|
5136
|
-
return callHumanize("warmUpBrowsing", page, baseDuration);
|
|
5137
|
-
},
|
|
5138
|
-
naturalScroll(page, direction = "down", distance = 300, baseSteps = 5) {
|
|
5139
|
-
return callHumanize("naturalScroll", page, direction, distance, baseSteps);
|
|
5140
|
-
}
|
|
5141
|
-
};
|
|
5060
|
+
var humanizeStrategies = {
|
|
5061
|
+
[Mode.Default]: DefaultHumanize,
|
|
5062
|
+
[Mode.CloakBrowser]: CloakBrowserHumanize
|
|
5063
|
+
};
|
|
5064
|
+
var Humanize2 = createDelegatedFacade("Humanize", humanizeStrategies, [
|
|
5065
|
+
"jitterMs",
|
|
5066
|
+
"initializeCursor",
|
|
5067
|
+
"humanMove",
|
|
5068
|
+
"humanScroll",
|
|
5069
|
+
"humanClick",
|
|
5070
|
+
"randomSleep",
|
|
5071
|
+
"simulateGaze",
|
|
5072
|
+
"humanType",
|
|
5073
|
+
"humanPress",
|
|
5074
|
+
"humanClear",
|
|
5075
|
+
"warmUpBrowsing",
|
|
5076
|
+
"naturalScroll"
|
|
5077
|
+
]);
|
|
5142
5078
|
|
|
5143
5079
|
// src/internals/launch/default.js
|
|
5144
5080
|
var import_node_child_process = require("node:child_process");
|
|
@@ -5226,7 +5162,7 @@ var ByPass = {
|
|
|
5226
5162
|
};
|
|
5227
5163
|
|
|
5228
5164
|
// src/internals/launch/default.js
|
|
5229
|
-
var
|
|
5165
|
+
var logger7 = createInternalLogger("Launch");
|
|
5230
5166
|
var REQUEST_HOOK_FLAG = Symbol("playwright-toolkit-request-hook");
|
|
5231
5167
|
var injectedContexts = /* @__PURE__ */ new WeakSet();
|
|
5232
5168
|
var browserMajorVersionCache = /* @__PURE__ */ new Map();
|
|
@@ -5278,7 +5214,7 @@ var detectBrowserMajorVersion = (launcher) => {
|
|
|
5278
5214
|
});
|
|
5279
5215
|
detectedVersion = parseChromeMajorVersion(rawVersion);
|
|
5280
5216
|
} catch (error) {
|
|
5281
|
-
|
|
5217
|
+
logger7.warn(`\u8BFB\u53D6\u6D4F\u89C8\u5668\u7248\u672C\u5931\u8D25: ${error?.message || error}`);
|
|
5282
5218
|
}
|
|
5283
5219
|
browserMajorVersionCache.set(executablePath, detectedVersion);
|
|
5284
5220
|
return detectedVersion;
|
|
@@ -5315,7 +5251,7 @@ var generateFingerprintForCore = ({ locale, browserMajorVersion, device }) => {
|
|
|
5315
5251
|
if (requestedBrowserMajorVersion <= 0) {
|
|
5316
5252
|
throw error;
|
|
5317
5253
|
}
|
|
5318
|
-
|
|
5254
|
+
logger7.warn(
|
|
5319
5255
|
`\u5F53\u524D\u6D4F\u89C8\u5668\u5927\u7248\u672C ${requestedBrowserMajorVersion} \u65E0\u53EF\u7528 strict \u6307\u7EB9\u6837\u672C\uFF0C\u9000\u56DE\u4E0D\u7ED1\u5B9A\u5927\u7248\u672C\u751F\u6210: ${error?.message || error}`
|
|
5320
5256
|
);
|
|
5321
5257
|
}
|
|
@@ -5360,7 +5296,7 @@ var buildReplayableBrowserProfile = (runtimeState, launcher) => {
|
|
|
5360
5296
|
schema_version: DEFAULT_BROWSER_PROFILE_SCHEMA_VERSION
|
|
5361
5297
|
};
|
|
5362
5298
|
nextState = RuntimeEnv.setBrowserProfileCore(nextState, browserProfileCore);
|
|
5363
|
-
|
|
5299
|
+
logger7.info(
|
|
5364
5300
|
`\u5DF2\u751F\u6210\u6D4F\u89C8\u5668\u6307\u7EB9\u771F\u6E90 | env=${String(nextState.envId || "-")} | device=${device} | version=${browserProfileCore.browser_major_version || "-"} | fingerprintVersion=${fingerprintBrowserMajorVersion || "-"} | exactVersion=${generated.exactBrowserMajorVersion ? "true" : "false"} | timezone=${timezoneId}`
|
|
5365
5301
|
);
|
|
5366
5302
|
return { runtimeState: nextState, browserProfileCore };
|
|
@@ -5489,18 +5425,18 @@ var DefaultLaunch = {
|
|
|
5489
5425
|
upstreamLabel = `${parsedProxyUrl.protocol}//${parsedProxyUrl.host}`;
|
|
5490
5426
|
} catch {
|
|
5491
5427
|
}
|
|
5492
|
-
|
|
5428
|
+
logger7.info(
|
|
5493
5429
|
`[\u4EE3\u7406\u5DF2\u542F\u7528] \u672C\u5730=${launchProxy.server} \u4E0A\u6E38=${upstreamLabel || "-"} \u76F4\u8FDE\u57DF\u540D=${(byPassDomains || []).join(",")}`
|
|
5494
5430
|
);
|
|
5495
|
-
|
|
5431
|
+
logger7.info(`[\u6D41\u91CF\u89C2\u6D4B] \u9010\u8BF7\u6C42\u8C03\u8BD5=${Boolean(debugMode) ? "\u5F00\u542F" : "\u5173\u95ED"}\uFF08\u6C47\u603B\u59CB\u7EC8\u5F00\u542F\uFF09`);
|
|
5496
5432
|
} else if (enableByPassLogger && enableProxy && !launchProxy) {
|
|
5497
|
-
|
|
5498
|
-
|
|
5433
|
+
logger7.info("[\u4EE3\u7406\u672A\u542F\u7528] enable_proxy=true \u4F46 proxy_url \u4E3A\u7A7A");
|
|
5434
|
+
logger7.info(`[\u6D41\u91CF\u89C2\u6D4B] \u9010\u8BF7\u6C42\u8C03\u8BD5=${Boolean(debugMode) ? "\u5F00\u542F" : "\u5173\u95ED"}\uFF08\u6C47\u603B\u59CB\u7EC8\u5F00\u542F\uFF09`);
|
|
5499
5435
|
} else if (enableByPassLogger && !enableProxy && proxyUrl) {
|
|
5500
|
-
|
|
5501
|
-
|
|
5436
|
+
logger7.info("[\u4EE3\u7406\u672A\u542F\u7528] enable_proxy=false \u4E14 proxy_url \u5DF2\u914D\u7F6E");
|
|
5437
|
+
logger7.info(`[\u6D41\u91CF\u89C2\u6D4B] \u9010\u8BF7\u6C42\u8C03\u8BD5=${Boolean(debugMode) ? "\u5F00\u542F" : "\u5173\u95ED"}\uFF08\u6C47\u603B\u59CB\u7EC8\u5F00\u542F\uFF09`);
|
|
5502
5438
|
} else if (enableByPassLogger) {
|
|
5503
|
-
|
|
5439
|
+
logger7.info(`[\u6D41\u91CF\u89C2\u6D4B] \u9010\u8BF7\u6C42\u8C03\u8BD5=${Boolean(debugMode) ? "\u5F00\u542F" : "\u5173\u95ED"}\uFF08\u6C47\u603B\u59CB\u7EC8\u5F00\u542F\uFF09`);
|
|
5504
5440
|
}
|
|
5505
5441
|
const onPageCreated = (page) => {
|
|
5506
5442
|
const recommendedGotoOptions = {
|
|
@@ -5522,7 +5458,7 @@ var DefaultLaunch = {
|
|
|
5522
5458
|
}
|
|
5523
5459
|
if (!enableByPassLogger || byPassDomains.length === 0) return;
|
|
5524
5460
|
if (!matched || !matched.rule) return;
|
|
5525
|
-
|
|
5461
|
+
logger7.info(`[\u76F4\u8FDE\u547D\u4E2D] \u89C4\u5219=${matched.rule.pattern} \u57DF\u540D=${matched.hostname} \u8D44\u6E90\u7C7B\u578B=${resourceType} \u65B9\u6CD5=${req.method()} \u5730\u5740=${requestUrl}`);
|
|
5526
5462
|
};
|
|
5527
5463
|
page.on("request", requestHandler);
|
|
5528
5464
|
return recommendedGotoOptions;
|
|
@@ -5579,7 +5515,7 @@ var DefaultLaunch = {
|
|
|
5579
5515
|
// src/internals/launch/cloakbrowser.js
|
|
5580
5516
|
var import_node_child_process2 = require("node:child_process");
|
|
5581
5517
|
var import_node_util = require("node:util");
|
|
5582
|
-
var
|
|
5518
|
+
var logger8 = createInternalLogger("CloakBrowser");
|
|
5583
5519
|
var execFileAsync = (0, import_node_util.promisify)(import_node_child_process2.execFile);
|
|
5584
5520
|
var DEFAULT_CLOAK_CRAWLER_BASE_OPTIONS = Object.freeze({
|
|
5585
5521
|
maxConcurrency: 1,
|
|
@@ -5715,7 +5651,7 @@ var forceTerminateBrowsersByFingerprintArg = async (fingerprintArg) => {
|
|
|
5715
5651
|
if (error?.code === 1 || error?.code === "ENOENT") {
|
|
5716
5652
|
return;
|
|
5717
5653
|
}
|
|
5718
|
-
|
|
5654
|
+
logger8.info(`\u5F3A\u5236\u5173\u95ED CloakBrowser \u8FDB\u7A0B\u5931\u8D25\uFF08\u5FFD\u7565\uFF09: ${error?.message || String(error)}`);
|
|
5719
5655
|
});
|
|
5720
5656
|
};
|
|
5721
5657
|
var CloakBrowserLaunch = {
|
|
@@ -5729,8 +5665,21 @@ var CloakBrowserLaunch = {
|
|
|
5729
5665
|
return createStableGotoHook(recommendedGotoOptions);
|
|
5730
5666
|
},
|
|
5731
5667
|
async getPlaywrightCrawlerOptions(options = {}) {
|
|
5732
|
-
const
|
|
5733
|
-
return crawlerOptions
|
|
5668
|
+
const runtime2 = await CloakBrowserLaunch.createPlaywrightCrawlerRuntime(options);
|
|
5669
|
+
return Object.defineProperties(runtime2.crawlerOptions, {
|
|
5670
|
+
cleanup: {
|
|
5671
|
+
enumerable: false,
|
|
5672
|
+
value: runtime2.cleanup
|
|
5673
|
+
},
|
|
5674
|
+
closeActiveBrowsers: {
|
|
5675
|
+
enumerable: false,
|
|
5676
|
+
value: runtime2.closeActiveBrowsers
|
|
5677
|
+
},
|
|
5678
|
+
forceTerminateActiveProcesses: {
|
|
5679
|
+
enumerable: false,
|
|
5680
|
+
value: runtime2.forceTerminateActiveProcesses
|
|
5681
|
+
}
|
|
5682
|
+
});
|
|
5734
5683
|
},
|
|
5735
5684
|
async buildLaunchOptions(options = {}) {
|
|
5736
5685
|
return await buildCloakLaunchOptions(options);
|
|
@@ -5811,39 +5760,18 @@ var CloakBrowserLaunch = {
|
|
|
5811
5760
|
};
|
|
5812
5761
|
|
|
5813
5762
|
// src/launch.js
|
|
5814
|
-
var
|
|
5815
|
-
|
|
5816
|
-
|
|
5817
|
-
if (typeof delegate?.[method] !== "function") {
|
|
5818
|
-
throw new Error(`Launch.${method} is not available in ${getToolkitMode()} mode`);
|
|
5819
|
-
}
|
|
5820
|
-
return delegate[method](...args);
|
|
5821
|
-
};
|
|
5822
|
-
var Launch = {
|
|
5823
|
-
getPlaywrightCrawlerOptions(options = {}) {
|
|
5824
|
-
return callLaunch("getPlaywrightCrawlerOptions", options);
|
|
5825
|
-
},
|
|
5826
|
-
resolveProxyConfiguration(proxyConfiguration = {}) {
|
|
5827
|
-
return callLaunch("resolveProxyConfiguration", proxyConfiguration);
|
|
5828
|
-
},
|
|
5829
|
-
extractFingerprintArg(launchOptions = {}) {
|
|
5830
|
-
return callLaunch("extractFingerprintArg", launchOptions);
|
|
5831
|
-
},
|
|
5832
|
-
createStableGotoHook(recommendedGotoOptions = {}) {
|
|
5833
|
-
return callLaunch("createStableGotoHook", recommendedGotoOptions);
|
|
5834
|
-
},
|
|
5835
|
-
buildLaunchOptions(options = {}) {
|
|
5836
|
-
return callLaunch("buildLaunchOptions", options);
|
|
5837
|
-
},
|
|
5838
|
-
createPlaywrightCrawlerRuntime(options = {}) {
|
|
5839
|
-
return callLaunch("createPlaywrightCrawlerRuntime", options);
|
|
5840
|
-
}
|
|
5763
|
+
var launchStrategies = {
|
|
5764
|
+
[Mode.Default]: DefaultLaunch,
|
|
5765
|
+
[Mode.CloakBrowser]: CloakBrowserLaunch
|
|
5841
5766
|
};
|
|
5767
|
+
var Launch = createDelegatedFacade("Launch", launchStrategies, [
|
|
5768
|
+
"getPlaywrightCrawlerOptions"
|
|
5769
|
+
]);
|
|
5842
5770
|
|
|
5843
5771
|
// src/live-view.js
|
|
5844
5772
|
var import_express = __toESM(require("express"), 1);
|
|
5845
5773
|
var import_apify = require("apify");
|
|
5846
|
-
var
|
|
5774
|
+
var logger9 = createInternalLogger("LiveView");
|
|
5847
5775
|
async function startLiveViewServer(liveViewKey) {
|
|
5848
5776
|
const app = (0, import_express.default)();
|
|
5849
5777
|
app.get("/", async (req, res) => {
|
|
@@ -5868,13 +5796,13 @@ async function startLiveViewServer(liveViewKey) {
|
|
|
5868
5796
|
</html>
|
|
5869
5797
|
`);
|
|
5870
5798
|
} catch (error) {
|
|
5871
|
-
|
|
5799
|
+
logger9.fail("Live View Server", error);
|
|
5872
5800
|
res.status(500).send(`\u65E0\u6CD5\u52A0\u8F7D\u5C4F\u5E55\u622A\u56FE: ${error.message}`);
|
|
5873
5801
|
}
|
|
5874
5802
|
});
|
|
5875
5803
|
const port = process.env.APIFY_CONTAINER_PORT || 4321;
|
|
5876
5804
|
app.listen(port, () => {
|
|
5877
|
-
|
|
5805
|
+
logger9.success("startLiveViewServer", `\u76D1\u542C\u7AEF\u53E3 ${port}`);
|
|
5878
5806
|
});
|
|
5879
5807
|
}
|
|
5880
5808
|
async function takeLiveScreenshot(liveViewKey, page, logMessage) {
|
|
@@ -5882,10 +5810,10 @@ async function takeLiveScreenshot(liveViewKey, page, logMessage) {
|
|
|
5882
5810
|
const buffer = await capturePageScreenshot(page, { type: "png" });
|
|
5883
5811
|
await import_apify.Actor.setValue(liveViewKey, buffer, { contentType: "image/png" });
|
|
5884
5812
|
if (logMessage) {
|
|
5885
|
-
|
|
5813
|
+
logger9.info(`(\u622A\u56FE): ${logMessage}`);
|
|
5886
5814
|
}
|
|
5887
5815
|
} catch (e) {
|
|
5888
|
-
|
|
5816
|
+
logger9.warn(`\u65E0\u6CD5\u6355\u83B7 Live View \u5C4F\u5E55\u622A\u56FE: ${e.message}`);
|
|
5889
5817
|
}
|
|
5890
5818
|
}
|
|
5891
5819
|
var useLiveView = (liveViewKey = PresetOfLiveViewKey) => {
|
|
@@ -5994,7 +5922,7 @@ var dragCaptchaAction = async (page, sourceLocator, targetLocator, options = {})
|
|
|
5994
5922
|
};
|
|
5995
5923
|
|
|
5996
5924
|
// src/internals/captcha/bytedance.js
|
|
5997
|
-
var
|
|
5925
|
+
var logger10 = createInternalLogger("Captcha");
|
|
5998
5926
|
var DEFAULT_BYTEDANCE_CAPTCHA_OPTIONS = Object.freeze({
|
|
5999
5927
|
apiType: "31234",
|
|
6000
5928
|
maxRetries: 3,
|
|
@@ -6126,7 +6054,7 @@ var collectCaptchaDebugInfo = async (page, frame, iframeLocator, attempt, phase,
|
|
|
6126
6054
|
}
|
|
6127
6055
|
await (0, import_promises.writeFile)(infoPath, JSON.stringify(payload, null, 2), "utf8");
|
|
6128
6056
|
}
|
|
6129
|
-
|
|
6057
|
+
logger10.info(`\u5DF2\u5199\u51FA\u9A8C\u8BC1\u7801\u8C03\u8BD5\u4EA7\u7269\uFF1A${debugDir}`);
|
|
6130
6058
|
};
|
|
6131
6059
|
var maybeCollectCaptchaDebugInfo = async (page, frame, iframeLocator, attempt, phase, options, extra = null) => {
|
|
6132
6060
|
if (!options.debugArtifacts) {
|
|
@@ -6163,14 +6091,14 @@ var getVerifycenterCaptchaContext = async (page, options) => {
|
|
|
6163
6091
|
if (!isContainerVisible) {
|
|
6164
6092
|
return null;
|
|
6165
6093
|
}
|
|
6166
|
-
|
|
6094
|
+
logger10.info("\u68C0\u6D4B\u5230\u9A8C\u8BC1\u7801\u5BB9\u5668\uFF0C\u5F00\u59CB\u7B49\u5F85 iframe \u52A0\u8F7D\u3002");
|
|
6167
6095
|
let iframeLocator = page.locator(options.iframeSelector).first();
|
|
6168
6096
|
let isIframeVisible = await waitForVisible(
|
|
6169
6097
|
iframeLocator,
|
|
6170
6098
|
options.iframeVisibleTimeoutMs
|
|
6171
6099
|
);
|
|
6172
6100
|
if (!isIframeVisible) {
|
|
6173
|
-
|
|
6101
|
+
logger10.warn("\u672A\u5728\u9884\u671F\u9009\u62E9\u5668\u4E2D\u627E\u5230 verifycenter iframe\uFF0C\u5C1D\u8BD5\u5BB9\u5668\u5185\u4EFB\u610F iframe\u3002");
|
|
6174
6102
|
iframeLocator = captchaContainer.locator(options.iframeFallbackSelector).first();
|
|
6175
6103
|
isIframeVisible = await waitForVisible(
|
|
6176
6104
|
iframeLocator,
|
|
@@ -6180,7 +6108,7 @@ var getVerifycenterCaptchaContext = async (page, options) => {
|
|
|
6180
6108
|
if (!isIframeVisible) {
|
|
6181
6109
|
throw new Error("verifycenter iframe not found inside captcha container.");
|
|
6182
6110
|
}
|
|
6183
|
-
|
|
6111
|
+
logger10.info("\u9A8C\u8BC1\u7801 iframe \u5DF2\u53EF\u89C1\uFF0C\u5F00\u59CB\u89E3\u6790\u5185\u5BB9 frame\u3002");
|
|
6184
6112
|
const frame = await resolveContentFrame(page, iframeLocator, options);
|
|
6185
6113
|
if (!frame) {
|
|
6186
6114
|
throw new Error("Failed to resolve verifycenter iframe content frame.");
|
|
@@ -6296,11 +6224,11 @@ var refreshCaptcha = async (page, frame, options) => {
|
|
|
6296
6224
|
const clicked = await clickCaptchaAction(frame, options.refreshTexts, {
|
|
6297
6225
|
...options,
|
|
6298
6226
|
page,
|
|
6299
|
-
logger:
|
|
6227
|
+
logger: logger10,
|
|
6300
6228
|
forceMouse: true
|
|
6301
6229
|
}).catch(() => false);
|
|
6302
6230
|
if (!clicked) {
|
|
6303
|
-
|
|
6231
|
+
logger10.warn("Refresh button not found.");
|
|
6304
6232
|
return false;
|
|
6305
6233
|
}
|
|
6306
6234
|
await page.waitForTimeout(options.refreshWaitMs);
|
|
@@ -6331,24 +6259,24 @@ var waitForCaptchaChallengeReady = async (page, frame, options) => {
|
|
|
6331
6259
|
const hasGuideMaskVisible = options.guideMaskSelector ? await frame.locator(options.guideMaskSelector).first().isVisible({ timeout: options.loadingIndicatorVisibleTimeoutMs }).catch(() => false) : false;
|
|
6332
6260
|
hasSeenGuideMask = hasSeenGuideMask || hasGuideMaskVisible;
|
|
6333
6261
|
if (hasGuideMaskVisible && !hasLoggedGuideMask) {
|
|
6334
|
-
|
|
6262
|
+
logger10.info("\u68C0\u6D4B\u5230\u9A8C\u8BC1\u7801\u64CD\u4F5C\u5F15\u5BFC\u5C42\uFF0C\u7B49\u5F85\u5176\u6D88\u5931\u540E\u518D\u5F00\u59CB\u8BC6\u522B\u3002");
|
|
6335
6263
|
hasLoggedGuideMask = true;
|
|
6336
6264
|
}
|
|
6337
6265
|
if (!isLoadingVisible && hasVisibleSourceImage && hasVisibleDropTarget && !hasGuideMaskVisible) {
|
|
6338
|
-
|
|
6266
|
+
logger10.info(
|
|
6339
6267
|
hasSeenGuideMask ? "\u9A8C\u8BC1\u7801\u56FE\u7247\u548C\u62D6\u62FD\u533A\u57DF\u5DF2\u5C31\u7EEA\uFF0C\u5F15\u5BFC\u5C42\u5DF2\u6D88\u5931\u3002" : hasSeenLoading ? "\u9A8C\u8BC1\u7801\u56FE\u7247\u5DF2\u52A0\u8F7D\u5B8C\u6210\u3002" : "\u9A8C\u8BC1\u7801\u56FE\u7247\u5DF2\u5C31\u7EEA\u3002"
|
|
6340
6268
|
);
|
|
6341
6269
|
return;
|
|
6342
6270
|
}
|
|
6343
6271
|
if (hasErrorTextVisible) {
|
|
6344
|
-
|
|
6272
|
+
logger10.warn("\u9A8C\u8BC1\u7801\u9762\u677F\u51FA\u73B0\u7F51\u7EDC\u5F02\u5E38\u6587\u6848\uFF0C\u5C1D\u8BD5\u7ACB\u5373\u5237\u65B0\u9898\u76EE\u3002");
|
|
6345
6273
|
await refreshCaptcha(page, frame, options);
|
|
6346
6274
|
refreshDeadline = Date.now() + options.challengeReadyRefreshTimeoutMs;
|
|
6347
6275
|
hasSeenLoading = false;
|
|
6348
6276
|
continue;
|
|
6349
6277
|
}
|
|
6350
6278
|
if ((!hasVisibleSourceImage || !hasVisibleDropTarget) && Date.now() >= refreshDeadline) {
|
|
6351
|
-
|
|
6279
|
+
logger10.warn(`\u9A8C\u8BC1\u7801\u9898\u76EE\u8D85\u8FC7 ${options.challengeReadyRefreshTimeoutMs}ms \u4ECD\u672A\u51C6\u5907\u597D\uFF0C\u5C1D\u8BD5\u5237\u65B0\u9898\u76EE\u3002`);
|
|
6352
6280
|
await refreshCaptcha(page, frame, options);
|
|
6353
6281
|
refreshDeadline = Date.now() + options.challengeReadyRefreshTimeoutMs;
|
|
6354
6282
|
hasSeenLoading = false;
|
|
@@ -6396,7 +6324,7 @@ var dragPromptCaptchaImage = async (page, frame, iframeLocator, sourceLocator, d
|
|
|
6396
6324
|
accepted
|
|
6397
6325
|
};
|
|
6398
6326
|
dragAttempts.push(attemptInfo);
|
|
6399
|
-
|
|
6327
|
+
logger10.info(
|
|
6400
6328
|
`\u9A8C\u8BC1\u7801\u62D6\u62FD\u7B2C ${visualIndex + 1} \u5F20\uFF0C\u65B9\u6848 ${plan.name}\uFF0Cbadge ${baselineState.badgeCount} -> ${afterState.badgeCount}\uFF0Cselected ${baselineState.selectedCount} -> ${afterState.selectedCount}`
|
|
6401
6329
|
);
|
|
6402
6330
|
if (accepted) {
|
|
@@ -6414,7 +6342,7 @@ var dragPromptCaptchaImage = async (page, frame, iframeLocator, sourceLocator, d
|
|
|
6414
6342
|
dragAttempts,
|
|
6415
6343
|
finalState: await readPromptCaptchaState(frame, options)
|
|
6416
6344
|
}).catch((error) => {
|
|
6417
|
-
|
|
6345
|
+
logger10.warn(`\u9A8C\u8BC1\u7801\u62D6\u62FD\u5931\u8D25\u8C03\u8BD5\u6293\u53D6\u5931\u8D25\uFF1A${error?.message || error}`);
|
|
6418
6346
|
});
|
|
6419
6347
|
return {
|
|
6420
6348
|
accepted: false,
|
|
@@ -6431,16 +6359,16 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
|
|
|
6431
6359
|
...options
|
|
6432
6360
|
};
|
|
6433
6361
|
if (!config.token) {
|
|
6434
|
-
|
|
6362
|
+
logger10.warn("\u7F3A\u5C11\u9A8C\u8BC1\u7801 token\uFF0C\u8DF3\u8FC7\u81EA\u52A8\u8BC6\u522B\u3002");
|
|
6435
6363
|
return false;
|
|
6436
6364
|
}
|
|
6437
|
-
|
|
6365
|
+
logger10.info("\u5F53\u524D\u4F7F\u7528\u672Ctool\u2014\u2014\u6D4B\u8BD5\u7248\u672C");
|
|
6438
6366
|
for (let attempt = 1; attempt <= config.maxRetries; attempt += 1) {
|
|
6439
|
-
|
|
6367
|
+
logger10.info(`\u5F00\u59CB\u7B2C ${attempt}/${config.maxRetries} \u6B21 verifycenter \u9A8C\u8BC1\u7801\u8BC6\u522B\u3002`);
|
|
6440
6368
|
try {
|
|
6441
6369
|
const captchaContext = await getVerifycenterCaptchaContext(page, config);
|
|
6442
6370
|
if (!captchaContext) {
|
|
6443
|
-
|
|
6371
|
+
logger10.info("Captcha container is not visible anymore.");
|
|
6444
6372
|
return true;
|
|
6445
6373
|
}
|
|
6446
6374
|
const { iframeLocator, frame } = captchaContext;
|
|
@@ -6453,7 +6381,7 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
|
|
|
6453
6381
|
"ready",
|
|
6454
6382
|
config
|
|
6455
6383
|
).catch((error) => {
|
|
6456
|
-
|
|
6384
|
+
logger10.warn(`\u9A8C\u8BC1\u7801\u8C03\u8BD5\u6293\u53D6\u5931\u8D25\uFF1A${error?.message || error}`);
|
|
6457
6385
|
});
|
|
6458
6386
|
await page.waitForTimeout(config.recognitionDelayMs);
|
|
6459
6387
|
const screenshotBuffer = await iframeLocator.screenshot();
|
|
@@ -6465,16 +6393,16 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
|
|
|
6465
6393
|
});
|
|
6466
6394
|
const serialNumbers = extractCaptchaSerialNumbers(apiResponse);
|
|
6467
6395
|
if (apiResponse?.code !== config.recognitionSuccessCode || serialNumbers.length === 0) {
|
|
6468
|
-
|
|
6396
|
+
logger10.warn(
|
|
6469
6397
|
`\u9A8C\u8BC1\u7801\u8BC6\u522B\u5931\u8D25\u3002code=${apiResponse?.code}, msg=${apiResponse?.msg || "unknown"}`
|
|
6470
6398
|
);
|
|
6471
6399
|
await refreshCaptcha(page, frame, config);
|
|
6472
6400
|
continue;
|
|
6473
6401
|
}
|
|
6474
|
-
|
|
6402
|
+
logger10.info(`\u9A8C\u8BC1\u7801\u8BC6\u522B\u6210\u529F\uFF0C\u5E8F\u53F7\uFF1A${serialNumbers.join(", ")}`);
|
|
6475
6403
|
const dropTarget = await findCaptchaDropTarget(frame, config);
|
|
6476
6404
|
if (!dropTarget) {
|
|
6477
|
-
|
|
6405
|
+
logger10.warn("\u672A\u627E\u5230\u9A8C\u8BC1\u7801\u62D6\u62FD\u76EE\u6807\u533A\u57DF\u3002");
|
|
6478
6406
|
await refreshCaptcha(page, frame, config);
|
|
6479
6407
|
continue;
|
|
6480
6408
|
}
|
|
@@ -6485,7 +6413,7 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
|
|
|
6485
6413
|
`Captcha image indexes could not be normalized. raw=${serialNumbers.join(", ")}, count=${orderedSourceImages.length}`
|
|
6486
6414
|
);
|
|
6487
6415
|
}
|
|
6488
|
-
|
|
6416
|
+
logger10.info(`\u9A8C\u8BC1\u7801\u89C6\u89C9\u4F4D\u5E8F\u6620\u5C04\uFF1A${normalizedIndexes.map((index) => index + 1).join(", ")}`);
|
|
6489
6417
|
for (const imageIndex of normalizedIndexes) {
|
|
6490
6418
|
if (imageIndex < 0 || imageIndex >= orderedSourceImages.length) {
|
|
6491
6419
|
throw new Error(
|
|
@@ -6517,52 +6445,52 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
|
|
|
6517
6445
|
}
|
|
6518
6446
|
}
|
|
6519
6447
|
const beforeSubmitState = await readPromptCaptchaState(frame, config);
|
|
6520
|
-
|
|
6448
|
+
logger10.info(
|
|
6521
6449
|
`\u63D0\u4EA4\u524D\u9A8C\u8BC1\u7801\u72B6\u6001\uFF1Abadge=${beforeSubmitState.badgeCount}, selected=${beforeSubmitState.selectedCount}, submitDisabled=${beforeSubmitState.submitDisabled}`
|
|
6522
6450
|
);
|
|
6523
6451
|
const submitted = await clickCaptchaAction(frame, config.submitTexts, {
|
|
6524
6452
|
...config,
|
|
6525
6453
|
page,
|
|
6526
|
-
logger:
|
|
6454
|
+
logger: logger10,
|
|
6527
6455
|
forceMouse: true,
|
|
6528
6456
|
actionVisibleTimeoutMs: config.submitReadyTimeoutMs
|
|
6529
6457
|
}).catch(() => false);
|
|
6530
6458
|
if (!submitted) {
|
|
6531
|
-
|
|
6459
|
+
logger10.warn("\u672A\u627E\u5230\u63D0\u4EA4\u6309\u94AE\uFF0C\u53EF\u80FD\u4F1A\u81EA\u52A8\u63D0\u4EA4\u3002");
|
|
6532
6460
|
}
|
|
6533
6461
|
await page.waitForTimeout(config.submitWaitMs);
|
|
6534
6462
|
const afterSubmitState = await readPromptCaptchaState(frame, config);
|
|
6535
|
-
|
|
6463
|
+
logger10.info(
|
|
6536
6464
|
`\u63D0\u4EA4\u540E\u9A8C\u8BC1\u7801\u72B6\u6001\uFF1Abadge=${afterSubmitState.badgeCount}, selected=${afterSubmitState.selectedCount}, submitDisabled=${afterSubmitState.submitDisabled}`
|
|
6537
6465
|
);
|
|
6538
6466
|
const stillVisible = await iframeLocator.isVisible({ timeout: config.containerVisibleTimeoutMs }).catch(() => false);
|
|
6539
6467
|
if (!stillVisible) {
|
|
6540
|
-
|
|
6468
|
+
logger10.info("\u9A8C\u8BC1\u7801\u8BC6\u522B\u5E76\u63D0\u4EA4\u6210\u529F\u3002");
|
|
6541
6469
|
return true;
|
|
6542
6470
|
}
|
|
6543
6471
|
await maybeCollectCaptchaDebugInfo(page, frame, iframeLocator, attempt, "submit-still-visible", config, {
|
|
6544
6472
|
beforeSubmitState,
|
|
6545
6473
|
afterSubmitState
|
|
6546
6474
|
}).catch((error) => {
|
|
6547
|
-
|
|
6475
|
+
logger10.warn(`\u63D0\u4EA4\u540E\u9A8C\u8BC1\u7801\u8C03\u8BD5\u6293\u53D6\u5931\u8D25\uFF1A${error?.message || error}`);
|
|
6548
6476
|
});
|
|
6549
|
-
|
|
6477
|
+
logger10.warn("\u63D0\u4EA4\u540E\u9A8C\u8BC1\u7801 iframe \u4ECD\u7136\u53EF\u89C1\uFF0C\u51C6\u5907\u5237\u65B0\u540E\u91CD\u8BD5\u3002");
|
|
6550
6478
|
await page.waitForTimeout(2e3);
|
|
6551
6479
|
await refreshCaptcha(page, frame, config);
|
|
6552
6480
|
} catch (error) {
|
|
6553
|
-
|
|
6481
|
+
logger10.error(`\u7B2C ${attempt}/${config.maxRetries} \u6B21\u9A8C\u8BC1\u7801\u8BC6\u522B\u5931\u8D25\uFF1A${error?.message || error}`);
|
|
6554
6482
|
}
|
|
6555
6483
|
if (attempt < config.maxRetries) {
|
|
6556
6484
|
await page.waitForTimeout(config.retryDelayBaseMs + attempt * config.retryDelayStepMs);
|
|
6557
6485
|
}
|
|
6558
6486
|
}
|
|
6559
|
-
|
|
6487
|
+
logger10.error(`\u91CD\u8BD5 ${config.maxRetries} \u6B21\u540E\uFF0C\u9A8C\u8BC1\u7801\u4ECD\u672A\u8BC6\u522B\u6210\u529F\u3002`);
|
|
6560
6488
|
return false;
|
|
6561
6489
|
}
|
|
6562
6490
|
var sloveCaptcha = solveCaptcha;
|
|
6563
6491
|
|
|
6564
6492
|
// src/chaptcha.js
|
|
6565
|
-
var
|
|
6493
|
+
var logger11 = createInternalLogger("Captcha");
|
|
6566
6494
|
var DEFAULT_CAPTCHA_RECOGNITION_OPTIONS = Object.freeze({
|
|
6567
6495
|
token: "eKJvBfwfN0YRav0-VD_44E2VBSfm7l0YtddUQ7cFySI",
|
|
6568
6496
|
apiUrl: "https://api.jfbym.com/api/YmServer/customApi"
|
|
@@ -6649,7 +6577,7 @@ function useCaptchaMonitor(page, options) {
|
|
|
6649
6577
|
};
|
|
6650
6578
|
})();
|
|
6651
6579
|
}, { selector: domSelector, callbackName: exposedFunctionName, cleanerName });
|
|
6652
|
-
|
|
6580
|
+
logger11.success("useCaptchaMonitor", `DOM \u76D1\u63A7\u5DF2\u542F\u7528\uFF1A${domSelector}`);
|
|
6653
6581
|
cleanupFns.push(async () => {
|
|
6654
6582
|
try {
|
|
6655
6583
|
await page.evaluate((name) => {
|
|
@@ -6673,14 +6601,14 @@ function useCaptchaMonitor(page, options) {
|
|
|
6673
6601
|
}
|
|
6674
6602
|
};
|
|
6675
6603
|
page.on("framenavigated", frameHandler);
|
|
6676
|
-
|
|
6604
|
+
logger11.success("useCaptchaMonitor", `URL \u76D1\u63A7\u5DF2\u542F\u7528\uFF1A${urlPattern}`);
|
|
6677
6605
|
cleanupFns.push(async () => {
|
|
6678
6606
|
page.off("framenavigated", frameHandler);
|
|
6679
6607
|
});
|
|
6680
6608
|
}
|
|
6681
6609
|
return {
|
|
6682
6610
|
stop: async () => {
|
|
6683
|
-
|
|
6611
|
+
logger11.info("\u6B63\u5728\u505C\u6B62\u9A8C\u8BC1\u7801\u76D1\u63A7...");
|
|
6684
6612
|
for (const fn of cleanupFns) {
|
|
6685
6613
|
await fn();
|
|
6686
6614
|
}
|
|
@@ -6719,7 +6647,7 @@ async function solveCaptchaWithStrategy(strategyName, page, options = {}) {
|
|
|
6719
6647
|
);
|
|
6720
6648
|
return strategy.sloveCaptcha(page, resolvedOptions, {
|
|
6721
6649
|
callCaptchaRecognitionApi,
|
|
6722
|
-
logger:
|
|
6650
|
+
logger: logger11
|
|
6723
6651
|
});
|
|
6724
6652
|
}
|
|
6725
6653
|
var Captcha = {
|
|
@@ -6730,7 +6658,7 @@ var Captcha = {
|
|
|
6730
6658
|
// src/mutation.js
|
|
6731
6659
|
var import_node_crypto = require("node:crypto");
|
|
6732
6660
|
var import_uuid2 = require("uuid");
|
|
6733
|
-
var
|
|
6661
|
+
var logger12 = createInternalLogger("Mutation");
|
|
6734
6662
|
var MUTATION_MONITOR_MODE = Object.freeze({
|
|
6735
6663
|
Added: "added",
|
|
6736
6664
|
Changed: "changed",
|
|
@@ -6763,14 +6691,14 @@ var Mutation = {
|
|
|
6763
6691
|
const stableTime = options.stableTime ?? 5 * 1e3;
|
|
6764
6692
|
const timeout = options.timeout ?? 120 * 1e3;
|
|
6765
6693
|
const onMutation = options.onMutation;
|
|
6766
|
-
|
|
6694
|
+
logger12.start("waitForStable", `\u76D1\u63A7 ${selectorList.length} \u4E2A\u9009\u62E9\u5668, \u7A33\u5B9A\u65F6\u95F4=${stableTime}ms`);
|
|
6767
6695
|
if (initialTimeout > 0) {
|
|
6768
6696
|
const selectorQuery = selectorList.join(",");
|
|
6769
6697
|
try {
|
|
6770
6698
|
await page.waitForSelector(selectorQuery, { timeout: initialTimeout });
|
|
6771
|
-
|
|
6699
|
+
logger12.info(`waitForStable \u5DF2\u68C0\u6D4B\u5230\u5143\u7D20: ${selectorQuery}`);
|
|
6772
6700
|
} catch (e) {
|
|
6773
|
-
|
|
6701
|
+
logger12.warning(`waitForStable \u521D\u59CB\u7B49\u5F85\u8D85\u65F6 (${initialTimeout}ms): ${selectorQuery}`);
|
|
6774
6702
|
throw e;
|
|
6775
6703
|
}
|
|
6776
6704
|
}
|
|
@@ -6786,7 +6714,7 @@ var Mutation = {
|
|
|
6786
6714
|
return "__CONTINUE__";
|
|
6787
6715
|
}
|
|
6788
6716
|
});
|
|
6789
|
-
|
|
6717
|
+
logger12.info("waitForStable \u5DF2\u542F\u7528 onMutation \u56DE\u8C03");
|
|
6790
6718
|
} catch (e) {
|
|
6791
6719
|
}
|
|
6792
6720
|
}
|
|
@@ -6901,9 +6829,9 @@ var Mutation = {
|
|
|
6901
6829
|
{ selectorList, stableTime, timeout, callbackName, hasCallback: !!onMutation }
|
|
6902
6830
|
);
|
|
6903
6831
|
if (result.mutationCount === 0 && result.stableTime === 0) {
|
|
6904
|
-
|
|
6832
|
+
logger12.warning("waitForStable \u672A\u627E\u5230\u53EF\u76D1\u63A7\u7684\u5143\u7D20");
|
|
6905
6833
|
}
|
|
6906
|
-
|
|
6834
|
+
logger12.success("waitForStable", `DOM \u7A33\u5B9A, \u603B\u5171 ${result.mutationCount} \u6B21\u53D8\u5316${result.wasPaused ? ", \u66FE\u6682\u505C\u8BA1\u65F6" : ""}`);
|
|
6907
6835
|
return result;
|
|
6908
6836
|
},
|
|
6909
6837
|
/**
|
|
@@ -7075,29 +7003,29 @@ var Mutation = {
|
|
|
7075
7003
|
return "__CONTINUE__";
|
|
7076
7004
|
}
|
|
7077
7005
|
};
|
|
7078
|
-
|
|
7006
|
+
logger12.start(
|
|
7079
7007
|
"waitForStableAcrossRoots",
|
|
7080
7008
|
`\u76D1\u63A7 ${selectorList.length} \u4E2A\u9009\u62E9\u5668(\u8DE8 root), \u7A33\u5B9A\u65F6\u95F4=${waitForStableTime}ms`
|
|
7081
7009
|
);
|
|
7082
7010
|
if (initialTimeout > 0) {
|
|
7083
7011
|
try {
|
|
7084
7012
|
await page.waitForSelector(selectorQuery, { timeout: initialTimeout });
|
|
7085
|
-
|
|
7013
|
+
logger12.info(`waitForStableAcrossRoots \u5DF2\u68C0\u6D4B\u5230\u5143\u7D20: ${selectorQuery}`);
|
|
7086
7014
|
} catch (e) {
|
|
7087
|
-
|
|
7015
|
+
logger12.warning(`waitForStableAcrossRoots \u521D\u59CB\u7B49\u5F85\u8D85\u65F6 (${initialTimeout}ms): ${selectorQuery}`);
|
|
7088
7016
|
throw e;
|
|
7089
7017
|
}
|
|
7090
7018
|
}
|
|
7091
|
-
let
|
|
7092
|
-
if (!
|
|
7093
|
-
|
|
7019
|
+
let state2 = await buildState();
|
|
7020
|
+
if (!state2?.hasMatched) {
|
|
7021
|
+
logger12.warning("waitForStableAcrossRoots \u672A\u627E\u5230\u53EF\u76D1\u63A7\u7684\u5143\u7D20");
|
|
7094
7022
|
return { mutationCount: 0, stableTime: 0, wasPaused: false };
|
|
7095
7023
|
}
|
|
7096
7024
|
let mutationCount = 0;
|
|
7097
7025
|
let stableSince = 0;
|
|
7098
7026
|
let isPaused = false;
|
|
7099
7027
|
let wasPaused = false;
|
|
7100
|
-
let lastSnapshotKey =
|
|
7028
|
+
let lastSnapshotKey = state2.snapshotKey;
|
|
7101
7029
|
const applyPauseSignal = (signal) => {
|
|
7102
7030
|
const nextPaused = signal === "__PAUSE__";
|
|
7103
7031
|
if (nextPaused) {
|
|
@@ -7111,13 +7039,13 @@ var Mutation = {
|
|
|
7111
7039
|
};
|
|
7112
7040
|
const initialSignal = await invokeMutationCallback({
|
|
7113
7041
|
mutationCount: 0,
|
|
7114
|
-
html:
|
|
7115
|
-
text:
|
|
7116
|
-
mutationNodes:
|
|
7042
|
+
html: state2.html || "",
|
|
7043
|
+
text: state2.text || "",
|
|
7044
|
+
mutationNodes: state2.mutationNodes || []
|
|
7117
7045
|
});
|
|
7118
7046
|
applyPauseSignal(initialSignal);
|
|
7119
7047
|
const deadline = Date.now() + overallTimeout;
|
|
7120
|
-
let lastState =
|
|
7048
|
+
let lastState = state2;
|
|
7121
7049
|
while (Date.now() < deadline) {
|
|
7122
7050
|
await sleep(pollInterval);
|
|
7123
7051
|
lastState = await buildState();
|
|
@@ -7127,7 +7055,7 @@ var Mutation = {
|
|
|
7127
7055
|
if (lastState.snapshotKey !== lastSnapshotKey) {
|
|
7128
7056
|
lastSnapshotKey = lastState.snapshotKey;
|
|
7129
7057
|
mutationCount += 1;
|
|
7130
|
-
|
|
7058
|
+
logger12.info(
|
|
7131
7059
|
`waitForStableAcrossRoots \u53D8\u5316#${mutationCount}, len=${lastState.snapshotLength}, path=${lastState.primaryPath || "unknown"}, preview="${truncate(lastState.text, 120)}"`
|
|
7132
7060
|
);
|
|
7133
7061
|
const signal = await invokeMutationCallback({
|
|
@@ -7140,7 +7068,7 @@ var Mutation = {
|
|
|
7140
7068
|
continue;
|
|
7141
7069
|
}
|
|
7142
7070
|
if (!isPaused && stableSince > 0 && Date.now() - stableSince >= waitForStableTime) {
|
|
7143
|
-
|
|
7071
|
+
logger12.success("waitForStableAcrossRoots", `DOM \u7A33\u5B9A, \u603B\u5171 ${mutationCount} \u6B21\u53D8\u5316${wasPaused ? ", \u66FE\u6682\u505C\u8BA1\u65F6" : ""}`);
|
|
7144
7072
|
return {
|
|
7145
7073
|
mutationCount,
|
|
7146
7074
|
stableTime: waitForStableTime,
|
|
@@ -7167,7 +7095,7 @@ var Mutation = {
|
|
|
7167
7095
|
const onMutation = options.onMutation;
|
|
7168
7096
|
const rawMode = String(options.mode || MUTATION_MONITOR_MODE.Added).toLowerCase();
|
|
7169
7097
|
const mode = [MUTATION_MONITOR_MODE.Added, MUTATION_MONITOR_MODE.Changed, MUTATION_MONITOR_MODE.All].includes(rawMode) ? rawMode : MUTATION_MONITOR_MODE.Added;
|
|
7170
|
-
|
|
7098
|
+
logger12.start("useMonitor", `\u76D1\u63A7 ${selectorList.length} \u4E2A\u9009\u62E9\u5668, mode=${mode}`);
|
|
7171
7099
|
const monitorKey = generateKey("pk_mon");
|
|
7172
7100
|
const callbackName = generateKey("pk_mon_cb");
|
|
7173
7101
|
const cleanerName = generateKey("pk_mon_clean");
|
|
@@ -7310,7 +7238,7 @@ var Mutation = {
|
|
|
7310
7238
|
return total;
|
|
7311
7239
|
};
|
|
7312
7240
|
}, { selectorList, monitorKey, callbackName, cleanerName, hasCallback: !!onMutation, mode });
|
|
7313
|
-
|
|
7241
|
+
logger12.success("useMonitor", "\u76D1\u63A7\u5668\u5DF2\u542F\u52A8");
|
|
7314
7242
|
return {
|
|
7315
7243
|
stop: async () => {
|
|
7316
7244
|
let totalMutations = 0;
|
|
@@ -7323,7 +7251,7 @@ var Mutation = {
|
|
|
7323
7251
|
}, cleanerName);
|
|
7324
7252
|
} catch (e) {
|
|
7325
7253
|
}
|
|
7326
|
-
|
|
7254
|
+
logger12.success("useMonitor.stop", `\u76D1\u63A7\u5DF2\u505C\u6B62, \u5171 ${totalMutations} \u6B21\u53D8\u5316`);
|
|
7327
7255
|
return { totalMutations };
|
|
7328
7256
|
}
|
|
7329
7257
|
};
|
|
@@ -8192,7 +8120,7 @@ var createTemplateLogger = (baseLogger = createBaseLogger()) => {
|
|
|
8192
8120
|
};
|
|
8193
8121
|
var getDefaultBaseLogger = () => createBaseLogger("");
|
|
8194
8122
|
var Logger = {
|
|
8195
|
-
setLogger: (
|
|
8123
|
+
setLogger: (logger16) => setDefaultLogger(logger16),
|
|
8196
8124
|
info: (message) => getDefaultBaseLogger().info(message),
|
|
8197
8125
|
success: (message) => getDefaultBaseLogger().success(message),
|
|
8198
8126
|
warning: (message) => getDefaultBaseLogger().warning(message),
|
|
@@ -8200,8 +8128,8 @@ var Logger = {
|
|
|
8200
8128
|
error: (message) => getDefaultBaseLogger().error(message),
|
|
8201
8129
|
debug: (message) => getDefaultBaseLogger().debug(message),
|
|
8202
8130
|
start: (message) => getDefaultBaseLogger().start(message),
|
|
8203
|
-
useTemplate: (
|
|
8204
|
-
if (
|
|
8131
|
+
useTemplate: (logger16) => {
|
|
8132
|
+
if (logger16) return createTemplateLogger(createBaseLogger("", logger16));
|
|
8205
8133
|
return createTemplateLogger();
|
|
8206
8134
|
}
|
|
8207
8135
|
};
|
|
@@ -8275,7 +8203,7 @@ var LOCATION_NETWORK_SUFFIX_PATTERNS = [
|
|
|
8275
8203
|
];
|
|
8276
8204
|
var cachedStripLogoSrcPromise = null;
|
|
8277
8205
|
var cachedEnrichmentByContext = /* @__PURE__ */ new WeakMap();
|
|
8278
|
-
var
|
|
8206
|
+
var logger13 = createInternalLogger("Watermarkify");
|
|
8279
8207
|
var normalizeText = (value) => String(value || "").trim();
|
|
8280
8208
|
var toInline = (value, maxLen = 200) => {
|
|
8281
8209
|
const text = normalizeText(value);
|
|
@@ -8517,9 +8445,9 @@ var resolveWithCustomResolver = async (page, baseMeta, options = {}) => {
|
|
|
8517
8445
|
location: toInline(resolved.location, 80)
|
|
8518
8446
|
};
|
|
8519
8447
|
if (enrichment.ip || enrichment.location) {
|
|
8520
|
-
|
|
8448
|
+
logger13.info(`\u81EA\u5B9A\u4E49 resolver \u547D\u4E2D: ip=${enrichment.ip || "-"}, loc=${enrichment.location || "-"}`);
|
|
8521
8449
|
} else {
|
|
8522
|
-
|
|
8450
|
+
logger13.warning("\u81EA\u5B9A\u4E49 resolver \u5DF2\u6267\u884C\uFF0C\u4F46\u672A\u8FD4\u56DE IP/Loc");
|
|
8523
8451
|
}
|
|
8524
8452
|
return enrichment;
|
|
8525
8453
|
} finally {
|
|
@@ -8708,12 +8636,12 @@ var normalizeWatermarkifyRenderMode = (value) => {
|
|
|
8708
8636
|
};
|
|
8709
8637
|
var composeScreenshotBufferWithBrowser = async (page, buffer, overlaySvg, imageInfo = {}, options = {}) => {
|
|
8710
8638
|
if (!page || typeof page.context !== "function") {
|
|
8711
|
-
|
|
8639
|
+
logger13.warning("watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u8DF3\u8FC7: \u7F3A\u5C11\u53EF\u7528 page");
|
|
8712
8640
|
return buffer;
|
|
8713
8641
|
}
|
|
8714
8642
|
const renderScope = await openProbePage(page);
|
|
8715
8643
|
if (!renderScope?.page) {
|
|
8716
|
-
|
|
8644
|
+
logger13.warning("watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u8DF3\u8FC7: \u65E0\u6CD5\u521B\u5EFA render page");
|
|
8717
8645
|
return buffer;
|
|
8718
8646
|
}
|
|
8719
8647
|
try {
|
|
@@ -8778,13 +8706,13 @@ var composeScreenshotBufferWithBrowser = async (page, buffer, overlaySvg, imageI
|
|
|
8778
8706
|
fullPage: true,
|
|
8779
8707
|
animations: "disabled"
|
|
8780
8708
|
}).catch((error) => {
|
|
8781
|
-
|
|
8709
|
+
logger13.warning(`watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u5931\u8D25: ${error instanceof Error ? error.message : String(error)}`);
|
|
8782
8710
|
return null;
|
|
8783
8711
|
});
|
|
8784
8712
|
if (Buffer.isBuffer(composed) && composed.length > 0) {
|
|
8785
8713
|
return composed;
|
|
8786
8714
|
}
|
|
8787
|
-
|
|
8715
|
+
logger13.warning("watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u5931\u8D25: \u672A\u5F97\u5230\u6709\u6548\u622A\u56FE\u7ED3\u679C");
|
|
8788
8716
|
return buffer;
|
|
8789
8717
|
} finally {
|
|
8790
8718
|
await renderScope.close().catch(() => {
|
|
@@ -8797,7 +8725,7 @@ var resolveWithIpLookup = async (page, options = {}) => {
|
|
|
8797
8725
|
}
|
|
8798
8726
|
const probeScope = await openProbePage(page);
|
|
8799
8727
|
if (!probeScope?.page) {
|
|
8800
|
-
|
|
8728
|
+
logger13.warning("ipLookup \u8DF3\u8FC7: \u65E0\u6CD5\u521B\u5EFA probe page");
|
|
8801
8729
|
return null;
|
|
8802
8730
|
}
|
|
8803
8731
|
const timeoutMs = Math.max(
|
|
@@ -8806,12 +8734,12 @@ var resolveWithIpLookup = async (page, options = {}) => {
|
|
|
8806
8734
|
);
|
|
8807
8735
|
try {
|
|
8808
8736
|
const probePage = probeScope.page;
|
|
8809
|
-
|
|
8737
|
+
logger13.info(`ipLookup \u5C1D\u8BD5: url=${DEFAULT_IP_LOOKUP_URL}, timeoutMs=${timeoutMs}`);
|
|
8810
8738
|
const response = await probePage.goto(DEFAULT_IP_LOOKUP_URL, {
|
|
8811
8739
|
waitUntil: "commit",
|
|
8812
8740
|
timeout: timeoutMs
|
|
8813
8741
|
}).catch((error) => {
|
|
8814
|
-
|
|
8742
|
+
logger13.warning(`ipLookup \u8BF7\u6C42\u5931\u8D25: url=${DEFAULT_IP_LOOKUP_URL}, error=${error instanceof Error ? error.message : String(error)}`);
|
|
8815
8743
|
return null;
|
|
8816
8744
|
});
|
|
8817
8745
|
const status = response && typeof response.status === "function" ? response.status() : 0;
|
|
@@ -8833,13 +8761,13 @@ var resolveWithIpLookup = async (page, options = {}) => {
|
|
|
8833
8761
|
}
|
|
8834
8762
|
const parsed = parseIpIpJsonResponse(rawText);
|
|
8835
8763
|
if (parsed?.ip || parsed?.location) {
|
|
8836
|
-
|
|
8764
|
+
logger13.info(`ipLookup \u6210\u529F: url=${DEFAULT_IP_LOOKUP_URL}, status=${status || "-"}, contentType=${contentType || "-"}, ip=${parsed.ip || "-"}, loc=${parsed.location || "-"}`);
|
|
8837
8765
|
return parsed;
|
|
8838
8766
|
}
|
|
8839
|
-
|
|
8767
|
+
logger13.warning(`ipLookup \u672A\u89E3\u6790\u51FA IP/Loc: url=${DEFAULT_IP_LOOKUP_URL}, status=${status || "-"}, contentType=${contentType || "-"}, preview=${shortenTail(rawText, 120) || "[empty]"}`);
|
|
8840
8768
|
return null;
|
|
8841
8769
|
} catch (error) {
|
|
8842
|
-
|
|
8770
|
+
logger13.warning(`ipLookup \u6267\u884C\u5F02\u5E38\uFF0C\u672A\u83B7\u5F97 IP/Loc: ${error instanceof Error ? error.message : String(error)}`);
|
|
8843
8771
|
return null;
|
|
8844
8772
|
} finally {
|
|
8845
8773
|
await probeScope.close().catch(() => {
|
|
@@ -8853,10 +8781,10 @@ var resolveEnrichment = async (page, baseMeta, options) => {
|
|
|
8853
8781
|
ip: toInline(options.ip, 80),
|
|
8854
8782
|
location: toInline(options.location, 80)
|
|
8855
8783
|
};
|
|
8856
|
-
|
|
8784
|
+
logger13.info(`enrichment \u5F00\u59CB: host=${baseMeta.hostname || "-"}, hasPresetIp=${Boolean(merged.ip)}, hasPresetLoc=${Boolean(merged.location)}, ipLookup=${options.ipLookup !== false}`);
|
|
8857
8785
|
if (!merged.ip || !merged.location) {
|
|
8858
8786
|
if (cached?.ip || cached?.location) {
|
|
8859
|
-
|
|
8787
|
+
logger13.info(`enrichment \u547D\u4E2D\u4E0A\u4E0B\u6587\u7F13\u5B58: ip=${cached.ip || "-"}, loc=${cached.location || "-"}`);
|
|
8860
8788
|
}
|
|
8861
8789
|
fillEnrichment(merged, cached);
|
|
8862
8790
|
}
|
|
@@ -8880,15 +8808,15 @@ var resolveEnrichment = async (page, baseMeta, options) => {
|
|
|
8880
8808
|
"x-geo-country"
|
|
8881
8809
|
]), 80);
|
|
8882
8810
|
if (!merged.location || isWeakLocationValue(merged.location) && headerLocation) {
|
|
8883
|
-
|
|
8811
|
+
logger13.info(`enrichment \u4F7F\u7528\u54CD\u5E94\u5934\u8865\u5145 Loc: ${headerLocation || "-"}`);
|
|
8884
8812
|
merged.location = headerLocation || merged.location;
|
|
8885
8813
|
}
|
|
8886
8814
|
}
|
|
8887
8815
|
writeCachedEnrichment(page, merged);
|
|
8888
8816
|
if (merged.ip || merged.location) {
|
|
8889
|
-
|
|
8817
|
+
logger13.info(`enrichment \u5B8C\u6210: ip=${merged.ip || "-"}, loc=${merged.location || "-"}`);
|
|
8890
8818
|
} else {
|
|
8891
|
-
|
|
8819
|
+
logger13.warning("enrichment \u5B8C\u6210: \u672A\u83B7\u5F97 IP/Loc");
|
|
8892
8820
|
}
|
|
8893
8821
|
return merged;
|
|
8894
8822
|
};
|
|
@@ -9701,7 +9629,7 @@ var watermarkifyScreenshotBuffer = async (buffer, meta, page = null, options = {
|
|
|
9701
9629
|
}
|
|
9702
9630
|
const imageInfo = readImageInfo(buffer);
|
|
9703
9631
|
if (!imageInfo.width || !imageInfo.height || !imageInfo.mimeType) {
|
|
9704
|
-
|
|
9632
|
+
logger13.warning("watermarkify \u8DF3\u8FC7: \u65E0\u6CD5\u89E3\u6790\u622A\u56FE\u5C3A\u5BF8\u6216\u683C\u5F0F");
|
|
9705
9633
|
return buffer;
|
|
9706
9634
|
}
|
|
9707
9635
|
const isMobileStrip = normalizeDevice(meta.device) === Device.Mobile && hasStrip;
|
|
@@ -9719,7 +9647,7 @@ var watermarkifyScreenshotBuffer = async (buffer, meta, page = null, options = {
|
|
|
9719
9647
|
|
|
9720
9648
|
// src/internals/compression.js
|
|
9721
9649
|
var import_jimp = require("jimp");
|
|
9722
|
-
var
|
|
9650
|
+
var logger14 = createInternalLogger("Compression");
|
|
9723
9651
|
var DEFAULT_SCREENSHOT_MAX_BYTES = 5 * 1024 * 1024;
|
|
9724
9652
|
var DEFAULT_SCREENSHOT_OUTPUT_TYPE = "jpeg";
|
|
9725
9653
|
var DEFAULT_SCREENSHOT_QUALITY = 0.72;
|
|
@@ -9838,18 +9766,18 @@ var compressImageBufferToBase64 = async (buffer, compression) => {
|
|
|
9838
9766
|
return buffer.toString("base64");
|
|
9839
9767
|
}
|
|
9840
9768
|
const result = await compressImageBuffer(buffer, compression).catch((error) => {
|
|
9841
|
-
|
|
9769
|
+
logger14.warning(`captureScreen \u538B\u7F29\u5931\u8D25\uFF0C\u8FD4\u56DE\u539F\u56FE: ${error instanceof Error ? error.message : String(error)}`);
|
|
9842
9770
|
return null;
|
|
9843
9771
|
});
|
|
9844
9772
|
if (!result?.buffer) {
|
|
9845
9773
|
return buffer.toString("base64");
|
|
9846
9774
|
}
|
|
9847
9775
|
if (result.withinLimit) {
|
|
9848
|
-
|
|
9776
|
+
logger14.info(
|
|
9849
9777
|
`captureScreen \u5DF2\u538B\u7F29: ${originalBytes} -> ${result.bytes} bytes, format=${result.format}, quality=${result.quality}, scale=${result.scale}, size=${result.width}x${result.height}`
|
|
9850
9778
|
);
|
|
9851
9779
|
} else {
|
|
9852
|
-
|
|
9780
|
+
logger14.warning(
|
|
9853
9781
|
`captureScreen \u538B\u7F29\u540E\u4ECD\u8D85\u8FC7\u76EE\u6807: ${originalBytes} -> ${result.bytes} bytes, maxBytes=${compression.maxBytes}, format=${result.format}, quality=${result.quality}, scale=${result.scale}`
|
|
9854
9782
|
);
|
|
9855
9783
|
}
|
|
@@ -9857,7 +9785,7 @@ var compressImageBufferToBase64 = async (buffer, compression) => {
|
|
|
9857
9785
|
};
|
|
9858
9786
|
|
|
9859
9787
|
// src/share.js
|
|
9860
|
-
var
|
|
9788
|
+
var logger15 = createInternalLogger("Share");
|
|
9861
9789
|
var DEFAULT_TIMEOUT_MS2 = 50 * 1e3;
|
|
9862
9790
|
var DEFAULT_PAYLOAD_SNAPSHOT_MAX_LEN = 500;
|
|
9863
9791
|
var DEFAULT_POLL_INTERVAL_MS = 120;
|
|
@@ -9994,7 +9922,7 @@ var createDomShareMonitor = async (page, options = {}) => {
|
|
|
9994
9922
|
const onMatch = typeof options.onMatch === "function" ? options.onMatch : null;
|
|
9995
9923
|
const onTelemetry = typeof options.onTelemetry === "function" ? options.onTelemetry : null;
|
|
9996
9924
|
let matched = false;
|
|
9997
|
-
|
|
9925
|
+
logger15.info(`DOM \u76D1\u542C\u51C6\u5907\u6302\u8F7D: selectors=${toJsonInline(selectors, 120)}, mode=${mode}`);
|
|
9998
9926
|
const monitor = await Mutation.useMonitor(page, selectors, {
|
|
9999
9927
|
mode,
|
|
10000
9928
|
onMutation: (context = {}) => {
|
|
@@ -10012,12 +9940,12 @@ ${text}`;
|
|
|
10012
9940
|
});
|
|
10013
9941
|
}
|
|
10014
9942
|
if (mutationCount <= 5 || mutationCount % 50 === 0) {
|
|
10015
|
-
|
|
9943
|
+
logger15.info(`DOM \u53D8\u5316\u5DF2\u6355\u83B7: mutationCount=${mutationCount}, mutationNodes=${mutationNodes.length}`);
|
|
10016
9944
|
}
|
|
10017
9945
|
const [candidate] = Utils.parseLinks(rawDom, { prefix }) || [];
|
|
10018
9946
|
if (!candidate) return;
|
|
10019
9947
|
matched = true;
|
|
10020
|
-
|
|
9948
|
+
logger15.success("captureLink.domHit", `DOM \u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: mutationCount=${mutationCount}, link=${candidate}`);
|
|
10021
9949
|
if (onMatch) {
|
|
10022
9950
|
onMatch({
|
|
10023
9951
|
link: candidate,
|
|
@@ -10033,7 +9961,7 @@ ${text}`;
|
|
|
10033
9961
|
return {
|
|
10034
9962
|
stop: async () => {
|
|
10035
9963
|
const result = await monitor.stop();
|
|
10036
|
-
|
|
9964
|
+
logger15.info(`DOM \u76D1\u542C\u5DF2\u505C\u6B62: totalMutations=${result?.totalMutations || 0}`);
|
|
10037
9965
|
return result;
|
|
10038
9966
|
}
|
|
10039
9967
|
};
|
|
@@ -10082,8 +10010,8 @@ var Share = {
|
|
|
10082
10010
|
if (share.mode === "response" && apiMatchers.length === 0) {
|
|
10083
10011
|
throw new Error("Share.captureLink requires share.xurl[0] api matcher when mode=response");
|
|
10084
10012
|
}
|
|
10085
|
-
|
|
10086
|
-
|
|
10013
|
+
logger15.start("captureLink", `mode=${share.mode}, timeoutMs=${timeoutDisabled ? "disabled" : timeoutMs}, prefix=${share.prefix}`);
|
|
10014
|
+
logger15.info(`captureLink \u914D\u7F6E: xurl=${toJsonInline(share.xurl)}, domMode=${domMode}, domSelectors=${toJsonInline(domSelectors, 120)}`);
|
|
10087
10015
|
const stats = {
|
|
10088
10016
|
actionTimedOut: false,
|
|
10089
10017
|
domMutationCount: 0,
|
|
@@ -10095,7 +10023,7 @@ var Share = {
|
|
|
10095
10023
|
responseSampleUrls: []
|
|
10096
10024
|
};
|
|
10097
10025
|
if (isAborted()) {
|
|
10098
|
-
|
|
10026
|
+
logger15.warning(`captureLink \u5DF2\u53D6\u6D88: ${abortReason()}`);
|
|
10099
10027
|
return {
|
|
10100
10028
|
link: null,
|
|
10101
10029
|
payloadText: "",
|
|
@@ -10118,7 +10046,7 @@ var Share = {
|
|
|
10118
10046
|
link: validated,
|
|
10119
10047
|
payloadText: String(payloadText || "")
|
|
10120
10048
|
};
|
|
10121
|
-
|
|
10049
|
+
logger15.info(`\u5019\u9009\u94FE\u63A5\u5DF2\u786E\u8BA4: source=${source}, link=${validated}`);
|
|
10122
10050
|
return true;
|
|
10123
10051
|
};
|
|
10124
10052
|
const resolveResponseCandidate = (responseText) => {
|
|
@@ -10153,7 +10081,7 @@ var Share = {
|
|
|
10153
10081
|
try {
|
|
10154
10082
|
await monitor.stop();
|
|
10155
10083
|
} catch (error) {
|
|
10156
|
-
|
|
10084
|
+
logger15.warning(`\u505C\u6B62 DOM \u76D1\u542C\u5931\u8D25: ${error instanceof Error ? error.message : String(error)}`);
|
|
10157
10085
|
}
|
|
10158
10086
|
};
|
|
10159
10087
|
const onResponse = async (response) => {
|
|
@@ -10167,29 +10095,29 @@ var Share = {
|
|
|
10167
10095
|
stats.responseSampleUrls.push(url);
|
|
10168
10096
|
}
|
|
10169
10097
|
if (stats.responseObserved <= 5) {
|
|
10170
|
-
|
|
10098
|
+
logger15.info(`\u63A5\u53E3\u54CD\u5E94\u91C7\u6837(${stats.responseObserved}): ${url}`);
|
|
10171
10099
|
}
|
|
10172
10100
|
if (!apiMatchers.some((matcher) => url.includes(matcher))) return;
|
|
10173
10101
|
stats.responseMatched += 1;
|
|
10174
10102
|
stats.lastMatchedUrl = url;
|
|
10175
|
-
|
|
10103
|
+
logger15.info(`\u63A5\u53E3\u547D\u4E2D\u5339\u914D(${stats.responseMatched}): ${url}`);
|
|
10176
10104
|
const text = await response.text();
|
|
10177
10105
|
const hit = resolveResponseCandidate(text);
|
|
10178
10106
|
if (!hit?.link) {
|
|
10179
10107
|
if (stats.responseMatched <= 3) {
|
|
10180
|
-
|
|
10108
|
+
logger15.info(`\u63A5\u53E3\u89E3\u6790\u5B8C\u6210\u4F46\u672A\u63D0\u53D6\u5230\u5206\u4EAB\u94FE\u63A5: payloadSize=${text.length}`);
|
|
10181
10109
|
}
|
|
10182
10110
|
return;
|
|
10183
10111
|
}
|
|
10184
10112
|
stats.responseResolved += 1;
|
|
10185
|
-
|
|
10113
|
+
logger15.success("captureLink.responseHit", `\u63A5\u53E3\u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: url=${url}, link=${hit.link}`);
|
|
10186
10114
|
setCandidate("response", hit.link, hit.payloadText);
|
|
10187
10115
|
} catch (error) {
|
|
10188
|
-
|
|
10116
|
+
logger15.warning(`\u63A5\u53E3\u54CD\u5E94\u5904\u7406\u5F02\u5E38: ${error instanceof Error ? error.message : String(error)}`);
|
|
10189
10117
|
}
|
|
10190
10118
|
};
|
|
10191
10119
|
if (share.mode === "dom") {
|
|
10192
|
-
|
|
10120
|
+
logger15.info("\u5F53\u524D\u4E3A DOM \u6A21\u5F0F\uFF0C\u4EC5\u542F\u7528 DOM \u76D1\u542C");
|
|
10193
10121
|
domMonitor = await createDomShareMonitor(page, {
|
|
10194
10122
|
prefix: share.prefix,
|
|
10195
10123
|
selectors: domSelectors,
|
|
@@ -10204,17 +10132,17 @@ var Share = {
|
|
|
10204
10132
|
});
|
|
10205
10133
|
}
|
|
10206
10134
|
if (share.mode === "response") {
|
|
10207
|
-
|
|
10135
|
+
logger15.info(`\u5F53\u524D\u4E3A\u63A5\u53E3\u6A21\u5F0F\uFF0C\u6302\u8F7D response \u76D1\u542C: apiMatchers=${toJsonInline(apiMatchers, 160)}`);
|
|
10208
10136
|
page.on("response", onResponse);
|
|
10209
10137
|
}
|
|
10210
10138
|
if (share.mode === "custom") {
|
|
10211
|
-
|
|
10139
|
+
logger15.info("\u5F53\u524D\u4E3A custom \u6A21\u5F0F\uFF0C\u5C06\u4F7F\u7528 performActions \u8FD4\u56DE\u503C");
|
|
10212
10140
|
}
|
|
10213
10141
|
const deadline = timeoutDisabled ? Infinity : Date.now() + timeoutMs;
|
|
10214
10142
|
const getRemainingMs = () => timeoutDisabled ? Infinity : Math.max(0, deadline - Date.now());
|
|
10215
10143
|
try {
|
|
10216
10144
|
const actionTimeout = getRemainingMs();
|
|
10217
|
-
|
|
10145
|
+
logger15.start("captureLink.performActions", `\u6267\u884C\u52A8\u4F5C\u9884\u7B97=${timeoutDisabled ? "disabled" : `${actionTimeout}ms`}`);
|
|
10218
10146
|
let actionValue;
|
|
10219
10147
|
if (!isAborted() && actionTimeout > 0) {
|
|
10220
10148
|
let timer = null;
|
|
@@ -10227,30 +10155,30 @@ var Share = {
|
|
|
10227
10155
|
]);
|
|
10228
10156
|
if (timer) clearTimeout(timer);
|
|
10229
10157
|
if (actionResult.type === "error") {
|
|
10230
|
-
|
|
10158
|
+
logger15.fail("captureLink.performActions", actionResult.error);
|
|
10231
10159
|
throw actionResult.error;
|
|
10232
10160
|
}
|
|
10233
10161
|
if (actionResult.type === "timeout") {
|
|
10234
10162
|
stats.actionTimedOut = true;
|
|
10235
|
-
|
|
10163
|
+
logger15.warning(`performActions \u5DF2\u8D85\u65F6 (${actionTimeout}ms)\uFF0C\u52A8\u4F5C\u53EF\u80FD\u4ECD\u5728\u5F02\u6B65\u6267\u884C`);
|
|
10236
10164
|
} else {
|
|
10237
10165
|
actionValue = actionResult.result;
|
|
10238
|
-
|
|
10166
|
+
logger15.success("captureLink.performActions", "\u6267\u884C\u52A8\u4F5C\u5B8C\u6210");
|
|
10239
10167
|
}
|
|
10240
10168
|
}
|
|
10241
10169
|
if (share.mode === "custom") {
|
|
10242
10170
|
const customLink = typeof actionValue === "string" ? actionValue : actionValue?.link || actionValue?.payloadText;
|
|
10243
10171
|
const customPayloadText = typeof actionValue === "string" ? actionValue : actionValue?.payloadText;
|
|
10244
10172
|
if (setCandidate("custom", customLink, customPayloadText)) {
|
|
10245
|
-
|
|
10173
|
+
logger15.success("captureLink.customResult", `custom \u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: link=${candidates.custom.link}`);
|
|
10246
10174
|
} else {
|
|
10247
|
-
|
|
10175
|
+
logger15.warning("performActions \u6267\u884C\u5B8C\u6210\u4F46\u672A\u8FD4\u56DE\u6709\u6548\u5206\u4EAB\u94FE\u63A5");
|
|
10248
10176
|
}
|
|
10249
10177
|
}
|
|
10250
10178
|
let nextProgressLogTs = Date.now() + 3e3;
|
|
10251
10179
|
while (true) {
|
|
10252
10180
|
if (isAborted()) {
|
|
10253
|
-
|
|
10181
|
+
logger15.warning(`captureLink \u5DF2\u53D6\u6D88: ${abortReason()}`);
|
|
10254
10182
|
return {
|
|
10255
10183
|
link: null,
|
|
10256
10184
|
payloadText: "",
|
|
@@ -10260,7 +10188,7 @@ var Share = {
|
|
|
10260
10188
|
}
|
|
10261
10189
|
const selected = candidates[share.mode];
|
|
10262
10190
|
if (selected?.link) {
|
|
10263
|
-
|
|
10191
|
+
logger15.success("captureLink", `\u6355\u83B7\u6210\u529F: source=${share.mode}, link=${selected.link}`);
|
|
10264
10192
|
return {
|
|
10265
10193
|
link: selected.link,
|
|
10266
10194
|
payloadText: selected.payloadText,
|
|
@@ -10273,7 +10201,7 @@ var Share = {
|
|
|
10273
10201
|
if (remaining <= 0) break;
|
|
10274
10202
|
const now = Date.now();
|
|
10275
10203
|
if (now >= nextProgressLogTs) {
|
|
10276
|
-
|
|
10204
|
+
logger15.info(
|
|
10277
10205
|
`captureLink \u7B49\u5F85\u4E2D: remaining=${timeoutDisabled ? "disabled" : `${remaining}ms`}, domMutationCount=${stats.domMutationCount}, responseMatched=${stats.responseMatched}`
|
|
10278
10206
|
);
|
|
10279
10207
|
nextProgressLogTs = now + 5e3;
|
|
@@ -10281,11 +10209,11 @@ var Share = {
|
|
|
10281
10209
|
await (0, import_delay5.default)(Math.max(0, Math.min(DEFAULT_POLL_INTERVAL_MS, remaining)));
|
|
10282
10210
|
}
|
|
10283
10211
|
if (!timeoutDisabled && share.mode === "response" && stats.responseMatched === 0) {
|
|
10284
|
-
|
|
10212
|
+
logger15.warning(
|
|
10285
10213
|
`\u63A5\u53E3\u76D1\u542C\u672A\u547D\u4E2D: apiMatchers=${toJsonInline(apiMatchers, 220)}, \u54CD\u5E94\u6837\u672CURLs=${toJsonInline(stats.responseSampleUrls, 420)}`
|
|
10286
10214
|
);
|
|
10287
10215
|
}
|
|
10288
|
-
|
|
10216
|
+
logger15.warning(
|
|
10289
10217
|
`captureLink ${timeoutDisabled ? "\u672A\u62FF\u5230\u94FE\u63A5" : "\u8D85\u65F6\u672A\u62FF\u5230\u94FE\u63A5"}: mode=${share.mode}, actionTimedOut=${stats.actionTimedOut}, domMutationCount=${stats.domMutationCount}, responseObserved=${stats.responseObserved}, responseMatched=${stats.responseMatched}, lastMatchedUrl=${stats.lastMatchedUrl || "none"}`
|
|
10290
10218
|
);
|
|
10291
10219
|
return {
|
|
@@ -10297,7 +10225,7 @@ var Share = {
|
|
|
10297
10225
|
} finally {
|
|
10298
10226
|
if (share.mode === "response") {
|
|
10299
10227
|
page.off("response", onResponse);
|
|
10300
|
-
|
|
10228
|
+
logger15.info("response \u76D1\u542C\u5DF2\u5378\u8F7D");
|
|
10301
10229
|
}
|
|
10302
10230
|
await stopDomMonitor();
|
|
10303
10231
|
}
|