@skrillex1224/playwright-toolkit 2.1.278 → 2.1.280
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser.js +165 -157
- package/dist/browser.js.map +4 -4
- package/dist/index.cjs +480 -583
- package/dist/index.cjs.map +4 -4
- package/dist/index.js +480 -583
- 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;
|
|
4779
|
+
}
|
|
4780
|
+
const resolvedTarget = resolveNativeTarget2(page, target);
|
|
4781
|
+
if (throwOnMissing || await targetExists(resolvedTarget)) {
|
|
4782
|
+
return resolvedTarget;
|
|
4689
4783
|
}
|
|
4690
|
-
return
|
|
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,264 +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
|
-
if (options && options.force != null) {
|
|
4715
|
-
actionOptions.force = options.force;
|
|
4716
|
-
}
|
|
4717
4813
|
const humanConfig = buildTypingHumanConfig(options);
|
|
4718
4814
|
if (humanConfig) {
|
|
4719
4815
|
actionOptions.human_config = humanConfig;
|
|
4720
4816
|
}
|
|
4721
4817
|
return actionOptions;
|
|
4722
4818
|
};
|
|
4723
|
-
var getErrorMessage = (error) => {
|
|
4724
|
-
if (typeof error === "string") return error;
|
|
4725
|
-
if (error && typeof error.message === "string") return error.message;
|
|
4726
|
-
return String(error ?? "");
|
|
4727
|
-
};
|
|
4728
|
-
var isPointerEventsCoveredError = (error) => {
|
|
4729
|
-
const message = getErrorMessage(error).toLowerCase();
|
|
4730
|
-
return message.includes("pointer_events") && (message.includes("covered by") || message.includes("receiving events"));
|
|
4731
|
-
};
|
|
4732
|
-
var withPointerEventsForceFallback = async (label, options, operation) => {
|
|
4733
|
-
try {
|
|
4734
|
-
return await operation(options);
|
|
4735
|
-
} catch (error) {
|
|
4736
|
-
if (options?.force || !isPointerEventsCoveredError(error)) {
|
|
4737
|
-
throw error;
|
|
4738
|
-
}
|
|
4739
|
-
logger7.warn(`${label}: cloakbrowser pointer_events check failed, retrying with force=true (${getErrorMessage(error)})`);
|
|
4740
|
-
return await operation({
|
|
4741
|
-
...options || {},
|
|
4742
|
-
force: true
|
|
4743
|
-
});
|
|
4744
|
-
}
|
|
4745
|
-
};
|
|
4746
|
-
var ensureDesktopHumanized = async (page) => {
|
|
4747
|
-
if (!page || typeof page !== "object") {
|
|
4748
|
-
throw new Error("Humanize requires a Playwright page");
|
|
4749
|
-
}
|
|
4750
|
-
const humanModule = await loadCloakHumanModule();
|
|
4751
|
-
if (page._original && page._humanCursor) {
|
|
4752
|
-
humanizedPages.add(page);
|
|
4753
|
-
return humanModule;
|
|
4754
|
-
}
|
|
4755
|
-
if (humanizedPages.has(page)) {
|
|
4756
|
-
return humanModule;
|
|
4757
|
-
}
|
|
4758
|
-
const config = page._humanCfg || humanModule.resolveConfig?.("default") || humanModule.resolveConfig?.();
|
|
4759
|
-
const cursor = page._humanCursor || { x: 0, y: 0, initialized: false };
|
|
4760
|
-
humanModule.patchPage(page, config, cursor);
|
|
4761
|
-
humanizedPages.add(page);
|
|
4762
|
-
return humanModule;
|
|
4763
|
-
};
|
|
4764
|
-
var patchHandle = async (page, handle) => {
|
|
4765
|
-
if (!handle || typeof handle !== "object") return handle;
|
|
4766
|
-
const humanModule = await ensureDesktopHumanized(page);
|
|
4767
|
-
humanModule.patchSingleElementHandle(
|
|
4768
|
-
handle,
|
|
4769
|
-
page,
|
|
4770
|
-
page._humanCfg,
|
|
4771
|
-
page._humanCursor,
|
|
4772
|
-
page._humanRaw,
|
|
4773
|
-
page._humanRawKb,
|
|
4774
|
-
page._humanOriginals,
|
|
4775
|
-
page._stealth
|
|
4776
|
-
);
|
|
4777
|
-
return handle;
|
|
4778
|
-
};
|
|
4779
|
-
var resolvePatchedTarget = async (page, target, { throwOnMissing = true } = {}) => {
|
|
4780
|
-
if (target == null) {
|
|
4781
|
-
return { target: null, dispose: null };
|
|
4782
|
-
}
|
|
4783
|
-
if (typeof target === "string") {
|
|
4784
|
-
const handle = await page.$(target);
|
|
4785
|
-
if (!handle) {
|
|
4786
|
-
if (throwOnMissing) {
|
|
4787
|
-
throw new Error(`\u627E\u4E0D\u5230\u5143\u7D20 ${String(target)}`);
|
|
4788
|
-
}
|
|
4789
|
-
return { target: null, dispose: null };
|
|
4790
|
-
}
|
|
4791
|
-
return { target: handle, dispose: null };
|
|
4792
|
-
}
|
|
4793
|
-
if (typeof target.elementHandle === "function") {
|
|
4794
|
-
const handle = await target.elementHandle();
|
|
4795
|
-
if (!handle) {
|
|
4796
|
-
if (throwOnMissing) {
|
|
4797
|
-
throw new Error("\u627E\u4E0D\u5230 locator \u5BF9\u5E94\u7684\u5143\u7D20");
|
|
4798
|
-
}
|
|
4799
|
-
return { target: null, dispose: null };
|
|
4800
|
-
}
|
|
4801
|
-
await patchHandle(page, handle);
|
|
4802
|
-
return {
|
|
4803
|
-
target: handle,
|
|
4804
|
-
dispose: async () => {
|
|
4805
|
-
await handle.dispose().catch(() => {
|
|
4806
|
-
});
|
|
4807
|
-
}
|
|
4808
|
-
};
|
|
4809
|
-
}
|
|
4810
|
-
await patchHandle(page, target);
|
|
4811
|
-
return { target, dispose: null };
|
|
4812
|
-
};
|
|
4813
4819
|
var jitterSleep = async (baseMs, jitterPercent = 0.3) => {
|
|
4814
4820
|
await (0, import_delay4.default)(jitterMs(baseMs, jitterPercent));
|
|
4815
4821
|
};
|
|
4816
|
-
var
|
|
4817
|
-
await ensureDesktopHumanized(page);
|
|
4822
|
+
var moveCursorToPoint = async (page, point) => {
|
|
4818
4823
|
await page.mouse.move(Number(point.x), Number(point.y));
|
|
4819
4824
|
return true;
|
|
4820
4825
|
};
|
|
4821
|
-
var doDesktopHumanClick = async (page, target, options = {}) => {
|
|
4822
|
-
await ensureDesktopHumanized(page);
|
|
4823
|
-
return await withPointerEventsForceFallback("humanClick", options, async (effectiveOptions = {}) => {
|
|
4824
|
-
if (target == null) {
|
|
4825
|
-
const cursor = page._humanCursor || { x: 0, y: 0 };
|
|
4826
|
-
await page.mouse.click(cursor.x || 0, cursor.y || 0);
|
|
4827
|
-
return true;
|
|
4828
|
-
}
|
|
4829
|
-
if (isPoint2(target)) {
|
|
4830
|
-
return humanMoveToPoint(page, target).then(async () => {
|
|
4831
|
-
await page.mouse.click(Number(target.x), Number(target.y));
|
|
4832
|
-
return true;
|
|
4833
|
-
});
|
|
4834
|
-
}
|
|
4835
|
-
const throwOnMissing = effectiveOptions.throwOnMissing !== false;
|
|
4836
|
-
if (typeof target === "string") {
|
|
4837
|
-
if (!throwOnMissing) {
|
|
4838
|
-
const existingHandle = await page.$(target);
|
|
4839
|
-
if (!existingHandle) {
|
|
4840
|
-
return false;
|
|
4841
|
-
}
|
|
4842
|
-
await existingHandle.click(buildActionOptions(effectiveOptions));
|
|
4843
|
-
return true;
|
|
4844
|
-
}
|
|
4845
|
-
await page.click(target, buildActionOptions(effectiveOptions));
|
|
4846
|
-
return true;
|
|
4847
|
-
}
|
|
4848
|
-
const { target: resolvedTarget, dispose } = await resolvePatchedTarget(page, target, { throwOnMissing });
|
|
4849
|
-
try {
|
|
4850
|
-
if (!resolvedTarget) {
|
|
4851
|
-
return false;
|
|
4852
|
-
}
|
|
4853
|
-
if (typeof resolvedTarget.click === "function") {
|
|
4854
|
-
await resolvedTarget.click(buildActionOptions(effectiveOptions));
|
|
4855
|
-
return true;
|
|
4856
|
-
}
|
|
4857
|
-
const box = await resolvedTarget.boundingBox?.();
|
|
4858
|
-
if (!box) {
|
|
4859
|
-
if (throwOnMissing) {
|
|
4860
|
-
throw new Error("\u65E0\u6CD5\u83B7\u53D6\u5143\u7D20\u4F4D\u7F6E");
|
|
4861
|
-
}
|
|
4862
|
-
return false;
|
|
4863
|
-
}
|
|
4864
|
-
await page.mouse.click(box.x + box.width / 2, box.y + box.height / 2);
|
|
4865
|
-
return true;
|
|
4866
|
-
} finally {
|
|
4867
|
-
if (typeof dispose === "function") {
|
|
4868
|
-
await dispose();
|
|
4869
|
-
}
|
|
4870
|
-
}
|
|
4871
|
-
});
|
|
4872
|
-
};
|
|
4873
4826
|
var CloakBrowserHumanize = {
|
|
4874
4827
|
jitterMs(base, jitterPercent = 0.3) {
|
|
4875
4828
|
return jitterMs(base, jitterPercent);
|
|
4876
4829
|
},
|
|
4877
4830
|
async initializeCursor(page) {
|
|
4878
4831
|
if (isMobilePage(page)) {
|
|
4879
|
-
return MobileHumanize.initializeCursor(page);
|
|
4832
|
+
return await MobileHumanize.initializeCursor(page);
|
|
4880
4833
|
}
|
|
4881
|
-
|
|
4882
|
-
logger7.debug("initializeCursor: cloakbrowser human layer ready");
|
|
4834
|
+
return Boolean(page);
|
|
4883
4835
|
},
|
|
4884
4836
|
async humanMove(page, target) {
|
|
4885
4837
|
if (isMobilePage(page)) {
|
|
4886
4838
|
return await MobileHumanize.humanMove(page, target);
|
|
4887
4839
|
}
|
|
4888
|
-
await ensureDesktopHumanized(page);
|
|
4889
4840
|
if (isPoint2(target)) {
|
|
4890
|
-
return await
|
|
4841
|
+
return await moveCursorToPoint(page, target);
|
|
4891
4842
|
}
|
|
4892
|
-
const
|
|
4893
|
-
|
|
4894
|
-
|
|
4895
|
-
|
|
4896
|
-
|
|
4897
|
-
|
|
4898
|
-
await resolvedTarget.hover();
|
|
4899
|
-
return true;
|
|
4900
|
-
}
|
|
4901
|
-
const box = await resolvedTarget.boundingBox?.();
|
|
4902
|
-
if (!box) {
|
|
4903
|
-
return false;
|
|
4904
|
-
}
|
|
4905
|
-
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 });
|
|
4906
4849
|
return true;
|
|
4907
|
-
} finally {
|
|
4908
|
-
if (typeof dispose === "function") {
|
|
4909
|
-
await dispose();
|
|
4910
|
-
}
|
|
4911
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
|
+
});
|
|
4912
4859
|
},
|
|
4913
4860
|
async humanScroll(page, target, options = {}) {
|
|
4914
4861
|
if (isMobilePage(page)) {
|
|
4915
4862
|
return await MobileHumanize.humanScroll(page, target, options);
|
|
4916
4863
|
}
|
|
4917
|
-
const
|
|
4918
|
-
if (
|
|
4919
|
-
|
|
4920
|
-
try {
|
|
4921
|
-
const result = await humanModule.scrollToElement(
|
|
4922
|
-
page,
|
|
4923
|
-
page._humanRaw,
|
|
4924
|
-
target,
|
|
4925
|
-
x,
|
|
4926
|
-
y,
|
|
4927
|
-
page._humanCfg,
|
|
4928
|
-
options.timeout
|
|
4929
|
-
);
|
|
4930
|
-
if (page._humanCursor) {
|
|
4931
|
-
page._humanCursor.x = result.cursorX;
|
|
4932
|
-
page._humanCursor.y = result.cursorY;
|
|
4933
|
-
}
|
|
4934
|
-
return {
|
|
4935
|
-
element: await page.$(target),
|
|
4936
|
-
didScroll: Boolean(result.didScroll),
|
|
4937
|
-
restore: null
|
|
4938
|
-
};
|
|
4939
|
-
} catch (error) {
|
|
4940
|
-
logger7.warn(`humanScroll: cloakbrowser \u6EDA\u52A8\u5931\u8D25\uFF0C\u8DF3\u8FC7 (${error?.message || error})`);
|
|
4941
|
-
return { element: null, didScroll: false, restore: null };
|
|
4942
|
-
}
|
|
4943
|
-
}
|
|
4944
|
-
const { target: resolvedTarget, dispose } = await resolvePatchedTarget(page, target, { throwOnMissing: false });
|
|
4945
|
-
try {
|
|
4946
|
-
if (!resolvedTarget) {
|
|
4947
|
-
return { element: null, didScroll: false, restore: null };
|
|
4948
|
-
}
|
|
4949
|
-
const before = await page.evaluate(() => ({ x: window.scrollX, y: window.scrollY }));
|
|
4950
|
-
await resolvedTarget.scrollIntoViewIfNeeded?.();
|
|
4951
|
-
const after = await page.evaluate(() => ({ x: window.scrollX, y: window.scrollY }));
|
|
4952
|
-
return {
|
|
4953
|
-
element: resolvedTarget,
|
|
4954
|
-
didScroll: before.x !== after.x || before.y !== after.y,
|
|
4955
|
-
restore: null
|
|
4956
|
-
};
|
|
4957
|
-
} finally {
|
|
4958
|
-
if (typeof dispose === "function") {
|
|
4959
|
-
await dispose();
|
|
4960
|
-
}
|
|
4864
|
+
const resolvedTarget = await resolveActionTarget(page, target, { throwOnMissing: false });
|
|
4865
|
+
if (!resolvedTarget) {
|
|
4866
|
+
return { element: null, didScroll: false, restore: null };
|
|
4961
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
|
+
};
|
|
4962
4877
|
},
|
|
4963
4878
|
async humanClick(page, target, options = {}) {
|
|
4964
4879
|
if (isMobilePage(page)) {
|
|
4965
4880
|
return await MobileHumanize.humanClick(page, target, options);
|
|
4966
4881
|
}
|
|
4967
|
-
|
|
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;
|
|
4968
4910
|
},
|
|
4969
4911
|
async randomSleep(pageOrBaseMs, maybeBaseMs, maybeJitterPercent) {
|
|
4970
4912
|
if (isPageLike2(pageOrBaseMs)) {
|
|
@@ -4980,7 +4922,6 @@ var CloakBrowserHumanize = {
|
|
|
4980
4922
|
if (isMobilePage(page)) {
|
|
4981
4923
|
return await MobileHumanize.simulateGaze(page, baseDurationMs);
|
|
4982
4924
|
}
|
|
4983
|
-
await ensureDesktopHumanized(page);
|
|
4984
4925
|
const durationMs = jitterMs(baseDurationMs, 0.4);
|
|
4985
4926
|
const startTime = Date.now();
|
|
4986
4927
|
const viewportSize = page.viewportSize() || { width: 1365, height: 900 };
|
|
@@ -4996,31 +4937,21 @@ var CloakBrowserHumanize = {
|
|
|
4996
4937
|
if (isMobilePage(page)) {
|
|
4997
4938
|
return await MobileHumanize.humanType(page, selector, text, options);
|
|
4998
4939
|
}
|
|
4999
|
-
|
|
5000
|
-
|
|
5001
|
-
|
|
5002
|
-
|
|
5003
|
-
|
|
5004
|
-
|
|
5005
|
-
|
|
5006
|
-
|
|
5007
|
-
|
|
5008
|
-
|
|
5009
|
-
throw new Error("\u76EE\u6807\u5143\u7D20\u4E0D\u652F\u6301 type()");
|
|
5010
|
-
}
|
|
5011
|
-
await resolvedTarget.type(text, actionOptions);
|
|
5012
|
-
} finally {
|
|
5013
|
-
if (typeof dispose === "function") {
|
|
5014
|
-
await dispose();
|
|
5015
|
-
}
|
|
5016
|
-
}
|
|
5017
|
-
});
|
|
4940
|
+
const actionOptions = buildActionOptions(options);
|
|
4941
|
+
if (typeof selector === "string") {
|
|
4942
|
+
await page.type(selector, text, actionOptions);
|
|
4943
|
+
return;
|
|
4944
|
+
}
|
|
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()");
|
|
4948
|
+
}
|
|
4949
|
+
await resolvedTarget.type(text, actionOptions);
|
|
5018
4950
|
},
|
|
5019
4951
|
async humanPress(page, targetOrKey, maybeKey, options = {}) {
|
|
5020
4952
|
if (isMobilePage(page)) {
|
|
5021
4953
|
return await MobileHumanize.humanPress(page, targetOrKey, maybeKey, options);
|
|
5022
4954
|
}
|
|
5023
|
-
await ensureDesktopHumanized(page);
|
|
5024
4955
|
const hasTarget = typeof maybeKey === "string";
|
|
5025
4956
|
const key = hasTarget ? maybeKey : targetOrKey;
|
|
5026
4957
|
const pressOptions = hasTarget ? options : maybeKey || options;
|
|
@@ -5032,55 +4963,61 @@ var CloakBrowserHumanize = {
|
|
|
5032
4963
|
});
|
|
5033
4964
|
return true;
|
|
5034
4965
|
}
|
|
5035
|
-
|
|
5036
|
-
|
|
5037
|
-
|
|
5038
|
-
|
|
5039
|
-
|
|
5040
|
-
|
|
5041
|
-
|
|
5042
|
-
|
|
5043
|
-
|
|
5044
|
-
|
|
5045
|
-
|
|
5046
|
-
|
|
5047
|
-
|
|
5048
|
-
|
|
5049
|
-
|
|
5050
|
-
|
|
5051
|
-
|
|
5052
|
-
|
|
5053
|
-
|
|
5054
|
-
|
|
5055
|
-
|
|
5056
|
-
|
|
5057
|
-
...effectiveOptions.keyboardOptions || {},
|
|
5058
|
-
delay: jitterMs(effectiveOptions.holdDelay ?? 45, 0.5)
|
|
5059
|
-
});
|
|
5060
|
-
return true;
|
|
5061
|
-
} finally {
|
|
5062
|
-
if (typeof dispose === "function") {
|
|
5063
|
-
await dispose();
|
|
5064
|
-
}
|
|
5065
|
-
}
|
|
4966
|
+
if (typeof targetOrKey === "string") {
|
|
4967
|
+
await page.press(targetOrKey, key, buildActionOptions(pressOptions));
|
|
4968
|
+
return true;
|
|
4969
|
+
}
|
|
4970
|
+
const resolvedTarget = await resolveActionTarget(page, targetOrKey, {
|
|
4971
|
+
throwOnMissing: pressOptions.throwOnMissing !== false
|
|
4972
|
+
});
|
|
4973
|
+
if (!resolvedTarget) {
|
|
4974
|
+
return false;
|
|
4975
|
+
}
|
|
4976
|
+
if (typeof resolvedTarget.press === "function") {
|
|
4977
|
+
await resolvedTarget.press(key, buildActionOptions(pressOptions));
|
|
4978
|
+
return true;
|
|
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)
|
|
5066
4988
|
});
|
|
4989
|
+
return true;
|
|
5067
4990
|
},
|
|
5068
4991
|
async humanClear(page, selector) {
|
|
5069
4992
|
if (isMobilePage(page)) {
|
|
5070
4993
|
return await MobileHumanize.humanClear(page, selector);
|
|
5071
4994
|
}
|
|
5072
|
-
|
|
5073
|
-
|
|
5074
|
-
|
|
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());
|
|
5075
5013
|
return;
|
|
5076
5014
|
}
|
|
5077
|
-
|
|
5015
|
+
throw new Error("\u76EE\u6807\u5143\u7D20\u4E0D\u652F\u6301 clear()");
|
|
5078
5016
|
},
|
|
5079
5017
|
async warmUpBrowsing(page, baseDuration = 3500) {
|
|
5080
5018
|
if (isMobilePage(page)) {
|
|
5081
5019
|
return await MobileHumanize.warmUpBrowsing(page, baseDuration);
|
|
5082
5020
|
}
|
|
5083
|
-
await ensureDesktopHumanized(page);
|
|
5084
5021
|
const durationMs = jitterMs(baseDuration, 0.4);
|
|
5085
5022
|
const startTime = Date.now();
|
|
5086
5023
|
const viewportSize = page.viewportSize() || { width: 1365, height: 900 };
|
|
@@ -5106,7 +5043,6 @@ var CloakBrowserHumanize = {
|
|
|
5106
5043
|
if (isMobilePage(page)) {
|
|
5107
5044
|
return await MobileHumanize.naturalScroll(page, direction, distance, baseSteps);
|
|
5108
5045
|
}
|
|
5109
|
-
await ensureDesktopHumanized(page);
|
|
5110
5046
|
const steps = Math.max(3, baseSteps + Math.floor(Math.random() * 3) - 1);
|
|
5111
5047
|
const actualDistance = jitterMs(distance, 0.15);
|
|
5112
5048
|
const sign = direction === "down" ? 1 : -1;
|
|
@@ -5121,55 +5057,24 @@ var CloakBrowserHumanize = {
|
|
|
5121
5057
|
};
|
|
5122
5058
|
|
|
5123
5059
|
// src/humanize.js
|
|
5124
|
-
var
|
|
5125
|
-
|
|
5126
|
-
|
|
5127
|
-
|
|
5128
|
-
|
|
5129
|
-
|
|
5130
|
-
|
|
5131
|
-
|
|
5132
|
-
|
|
5133
|
-
|
|
5134
|
-
|
|
5135
|
-
|
|
5136
|
-
|
|
5137
|
-
|
|
5138
|
-
|
|
5139
|
-
|
|
5140
|
-
|
|
5141
|
-
|
|
5142
|
-
humanScroll(page, target, options = {}) {
|
|
5143
|
-
return callHumanize("humanScroll", page, target, options);
|
|
5144
|
-
},
|
|
5145
|
-
humanClick(page, target, options = {}) {
|
|
5146
|
-
return callHumanize("humanClick", page, target, options);
|
|
5147
|
-
},
|
|
5148
|
-
randomSleep(pageOrBaseMs, maybeBaseMs, maybeJitterPercent) {
|
|
5149
|
-
return callHumanize("randomSleep", pageOrBaseMs, maybeBaseMs, maybeJitterPercent);
|
|
5150
|
-
},
|
|
5151
|
-
simulateGaze(page, baseDurationMs = 2500) {
|
|
5152
|
-
return callHumanize("simulateGaze", page, baseDurationMs);
|
|
5153
|
-
},
|
|
5154
|
-
humanType(page, selector, text, options = {}) {
|
|
5155
|
-
return callHumanize("humanType", page, selector, text, options);
|
|
5156
|
-
},
|
|
5157
|
-
humanPress(page, targetOrKey, maybeKey, options = {}) {
|
|
5158
|
-
if (typeof maybeKey === "string") {
|
|
5159
|
-
return callHumanize("humanPress", page, targetOrKey, maybeKey, options);
|
|
5160
|
-
}
|
|
5161
|
-
return callHumanize("humanPress", page, targetOrKey, maybeKey || options);
|
|
5162
|
-
},
|
|
5163
|
-
humanClear(page, selector) {
|
|
5164
|
-
return callHumanize("humanClear", page, selector);
|
|
5165
|
-
},
|
|
5166
|
-
warmUpBrowsing(page, baseDuration = 3500) {
|
|
5167
|
-
return callHumanize("warmUpBrowsing", page, baseDuration);
|
|
5168
|
-
},
|
|
5169
|
-
naturalScroll(page, direction = "down", distance = 300, baseSteps = 5) {
|
|
5170
|
-
return callHumanize("naturalScroll", page, direction, distance, baseSteps);
|
|
5171
|
-
}
|
|
5172
|
-
};
|
|
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
|
+
]);
|
|
5173
5078
|
|
|
5174
5079
|
// src/internals/launch/default.js
|
|
5175
5080
|
var import_node_child_process = require("node:child_process");
|
|
@@ -5257,7 +5162,7 @@ var ByPass = {
|
|
|
5257
5162
|
};
|
|
5258
5163
|
|
|
5259
5164
|
// src/internals/launch/default.js
|
|
5260
|
-
var
|
|
5165
|
+
var logger7 = createInternalLogger("Launch");
|
|
5261
5166
|
var REQUEST_HOOK_FLAG = Symbol("playwright-toolkit-request-hook");
|
|
5262
5167
|
var injectedContexts = /* @__PURE__ */ new WeakSet();
|
|
5263
5168
|
var browserMajorVersionCache = /* @__PURE__ */ new Map();
|
|
@@ -5309,7 +5214,7 @@ var detectBrowserMajorVersion = (launcher) => {
|
|
|
5309
5214
|
});
|
|
5310
5215
|
detectedVersion = parseChromeMajorVersion(rawVersion);
|
|
5311
5216
|
} catch (error) {
|
|
5312
|
-
|
|
5217
|
+
logger7.warn(`\u8BFB\u53D6\u6D4F\u89C8\u5668\u7248\u672C\u5931\u8D25: ${error?.message || error}`);
|
|
5313
5218
|
}
|
|
5314
5219
|
browserMajorVersionCache.set(executablePath, detectedVersion);
|
|
5315
5220
|
return detectedVersion;
|
|
@@ -5346,7 +5251,7 @@ var generateFingerprintForCore = ({ locale, browserMajorVersion, device }) => {
|
|
|
5346
5251
|
if (requestedBrowserMajorVersion <= 0) {
|
|
5347
5252
|
throw error;
|
|
5348
5253
|
}
|
|
5349
|
-
|
|
5254
|
+
logger7.warn(
|
|
5350
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}`
|
|
5351
5256
|
);
|
|
5352
5257
|
}
|
|
@@ -5391,7 +5296,7 @@ var buildReplayableBrowserProfile = (runtimeState, launcher) => {
|
|
|
5391
5296
|
schema_version: DEFAULT_BROWSER_PROFILE_SCHEMA_VERSION
|
|
5392
5297
|
};
|
|
5393
5298
|
nextState = RuntimeEnv.setBrowserProfileCore(nextState, browserProfileCore);
|
|
5394
|
-
|
|
5299
|
+
logger7.info(
|
|
5395
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}`
|
|
5396
5301
|
);
|
|
5397
5302
|
return { runtimeState: nextState, browserProfileCore };
|
|
@@ -5520,18 +5425,18 @@ var DefaultLaunch = {
|
|
|
5520
5425
|
upstreamLabel = `${parsedProxyUrl.protocol}//${parsedProxyUrl.host}`;
|
|
5521
5426
|
} catch {
|
|
5522
5427
|
}
|
|
5523
|
-
|
|
5428
|
+
logger7.info(
|
|
5524
5429
|
`[\u4EE3\u7406\u5DF2\u542F\u7528] \u672C\u5730=${launchProxy.server} \u4E0A\u6E38=${upstreamLabel || "-"} \u76F4\u8FDE\u57DF\u540D=${(byPassDomains || []).join(",")}`
|
|
5525
5430
|
);
|
|
5526
|
-
|
|
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`);
|
|
5527
5432
|
} else if (enableByPassLogger && enableProxy && !launchProxy) {
|
|
5528
|
-
|
|
5529
|
-
|
|
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`);
|
|
5530
5435
|
} else if (enableByPassLogger && !enableProxy && proxyUrl) {
|
|
5531
|
-
|
|
5532
|
-
|
|
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`);
|
|
5533
5438
|
} else if (enableByPassLogger) {
|
|
5534
|
-
|
|
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`);
|
|
5535
5440
|
}
|
|
5536
5441
|
const onPageCreated = (page) => {
|
|
5537
5442
|
const recommendedGotoOptions = {
|
|
@@ -5553,7 +5458,7 @@ var DefaultLaunch = {
|
|
|
5553
5458
|
}
|
|
5554
5459
|
if (!enableByPassLogger || byPassDomains.length === 0) return;
|
|
5555
5460
|
if (!matched || !matched.rule) return;
|
|
5556
|
-
|
|
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}`);
|
|
5557
5462
|
};
|
|
5558
5463
|
page.on("request", requestHandler);
|
|
5559
5464
|
return recommendedGotoOptions;
|
|
@@ -5610,7 +5515,7 @@ var DefaultLaunch = {
|
|
|
5610
5515
|
// src/internals/launch/cloakbrowser.js
|
|
5611
5516
|
var import_node_child_process2 = require("node:child_process");
|
|
5612
5517
|
var import_node_util = require("node:util");
|
|
5613
|
-
var
|
|
5518
|
+
var logger8 = createInternalLogger("CloakBrowser");
|
|
5614
5519
|
var execFileAsync = (0, import_node_util.promisify)(import_node_child_process2.execFile);
|
|
5615
5520
|
var DEFAULT_CLOAK_CRAWLER_BASE_OPTIONS = Object.freeze({
|
|
5616
5521
|
maxConcurrency: 1,
|
|
@@ -5746,7 +5651,7 @@ var forceTerminateBrowsersByFingerprintArg = async (fingerprintArg) => {
|
|
|
5746
5651
|
if (error?.code === 1 || error?.code === "ENOENT") {
|
|
5747
5652
|
return;
|
|
5748
5653
|
}
|
|
5749
|
-
|
|
5654
|
+
logger8.info(`\u5F3A\u5236\u5173\u95ED CloakBrowser \u8FDB\u7A0B\u5931\u8D25\uFF08\u5FFD\u7565\uFF09: ${error?.message || String(error)}`);
|
|
5750
5655
|
});
|
|
5751
5656
|
};
|
|
5752
5657
|
var CloakBrowserLaunch = {
|
|
@@ -5760,8 +5665,21 @@ var CloakBrowserLaunch = {
|
|
|
5760
5665
|
return createStableGotoHook(recommendedGotoOptions);
|
|
5761
5666
|
},
|
|
5762
5667
|
async getPlaywrightCrawlerOptions(options = {}) {
|
|
5763
|
-
const
|
|
5764
|
-
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
|
+
});
|
|
5765
5683
|
},
|
|
5766
5684
|
async buildLaunchOptions(options = {}) {
|
|
5767
5685
|
return await buildCloakLaunchOptions(options);
|
|
@@ -5842,39 +5760,18 @@ var CloakBrowserLaunch = {
|
|
|
5842
5760
|
};
|
|
5843
5761
|
|
|
5844
5762
|
// src/launch.js
|
|
5845
|
-
var
|
|
5846
|
-
|
|
5847
|
-
|
|
5848
|
-
if (typeof delegate?.[method] !== "function") {
|
|
5849
|
-
throw new Error(`Launch.${method} is not available in ${getToolkitMode()} mode`);
|
|
5850
|
-
}
|
|
5851
|
-
return delegate[method](...args);
|
|
5852
|
-
};
|
|
5853
|
-
var Launch = {
|
|
5854
|
-
getPlaywrightCrawlerOptions(options = {}) {
|
|
5855
|
-
return callLaunch("getPlaywrightCrawlerOptions", options);
|
|
5856
|
-
},
|
|
5857
|
-
resolveProxyConfiguration(proxyConfiguration = {}) {
|
|
5858
|
-
return callLaunch("resolveProxyConfiguration", proxyConfiguration);
|
|
5859
|
-
},
|
|
5860
|
-
extractFingerprintArg(launchOptions = {}) {
|
|
5861
|
-
return callLaunch("extractFingerprintArg", launchOptions);
|
|
5862
|
-
},
|
|
5863
|
-
createStableGotoHook(recommendedGotoOptions = {}) {
|
|
5864
|
-
return callLaunch("createStableGotoHook", recommendedGotoOptions);
|
|
5865
|
-
},
|
|
5866
|
-
buildLaunchOptions(options = {}) {
|
|
5867
|
-
return callLaunch("buildLaunchOptions", options);
|
|
5868
|
-
},
|
|
5869
|
-
createPlaywrightCrawlerRuntime(options = {}) {
|
|
5870
|
-
return callLaunch("createPlaywrightCrawlerRuntime", options);
|
|
5871
|
-
}
|
|
5763
|
+
var launchStrategies = {
|
|
5764
|
+
[Mode.Default]: DefaultLaunch,
|
|
5765
|
+
[Mode.CloakBrowser]: CloakBrowserLaunch
|
|
5872
5766
|
};
|
|
5767
|
+
var Launch = createDelegatedFacade("Launch", launchStrategies, [
|
|
5768
|
+
"getPlaywrightCrawlerOptions"
|
|
5769
|
+
]);
|
|
5873
5770
|
|
|
5874
5771
|
// src/live-view.js
|
|
5875
5772
|
var import_express = __toESM(require("express"), 1);
|
|
5876
5773
|
var import_apify = require("apify");
|
|
5877
|
-
var
|
|
5774
|
+
var logger9 = createInternalLogger("LiveView");
|
|
5878
5775
|
async function startLiveViewServer(liveViewKey) {
|
|
5879
5776
|
const app = (0, import_express.default)();
|
|
5880
5777
|
app.get("/", async (req, res) => {
|
|
@@ -5899,13 +5796,13 @@ async function startLiveViewServer(liveViewKey) {
|
|
|
5899
5796
|
</html>
|
|
5900
5797
|
`);
|
|
5901
5798
|
} catch (error) {
|
|
5902
|
-
|
|
5799
|
+
logger9.fail("Live View Server", error);
|
|
5903
5800
|
res.status(500).send(`\u65E0\u6CD5\u52A0\u8F7D\u5C4F\u5E55\u622A\u56FE: ${error.message}`);
|
|
5904
5801
|
}
|
|
5905
5802
|
});
|
|
5906
5803
|
const port = process.env.APIFY_CONTAINER_PORT || 4321;
|
|
5907
5804
|
app.listen(port, () => {
|
|
5908
|
-
|
|
5805
|
+
logger9.success("startLiveViewServer", `\u76D1\u542C\u7AEF\u53E3 ${port}`);
|
|
5909
5806
|
});
|
|
5910
5807
|
}
|
|
5911
5808
|
async function takeLiveScreenshot(liveViewKey, page, logMessage) {
|
|
@@ -5913,10 +5810,10 @@ async function takeLiveScreenshot(liveViewKey, page, logMessage) {
|
|
|
5913
5810
|
const buffer = await capturePageScreenshot(page, { type: "png" });
|
|
5914
5811
|
await import_apify.Actor.setValue(liveViewKey, buffer, { contentType: "image/png" });
|
|
5915
5812
|
if (logMessage) {
|
|
5916
|
-
|
|
5813
|
+
logger9.info(`(\u622A\u56FE): ${logMessage}`);
|
|
5917
5814
|
}
|
|
5918
5815
|
} catch (e) {
|
|
5919
|
-
|
|
5816
|
+
logger9.warn(`\u65E0\u6CD5\u6355\u83B7 Live View \u5C4F\u5E55\u622A\u56FE: ${e.message}`);
|
|
5920
5817
|
}
|
|
5921
5818
|
}
|
|
5922
5819
|
var useLiveView = (liveViewKey = PresetOfLiveViewKey) => {
|
|
@@ -6025,7 +5922,7 @@ var dragCaptchaAction = async (page, sourceLocator, targetLocator, options = {})
|
|
|
6025
5922
|
};
|
|
6026
5923
|
|
|
6027
5924
|
// src/internals/captcha/bytedance.js
|
|
6028
|
-
var
|
|
5925
|
+
var logger10 = createInternalLogger("Captcha");
|
|
6029
5926
|
var DEFAULT_BYTEDANCE_CAPTCHA_OPTIONS = Object.freeze({
|
|
6030
5927
|
apiType: "31234",
|
|
6031
5928
|
maxRetries: 3,
|
|
@@ -6157,7 +6054,7 @@ var collectCaptchaDebugInfo = async (page, frame, iframeLocator, attempt, phase,
|
|
|
6157
6054
|
}
|
|
6158
6055
|
await (0, import_promises.writeFile)(infoPath, JSON.stringify(payload, null, 2), "utf8");
|
|
6159
6056
|
}
|
|
6160
|
-
|
|
6057
|
+
logger10.info(`\u5DF2\u5199\u51FA\u9A8C\u8BC1\u7801\u8C03\u8BD5\u4EA7\u7269\uFF1A${debugDir}`);
|
|
6161
6058
|
};
|
|
6162
6059
|
var maybeCollectCaptchaDebugInfo = async (page, frame, iframeLocator, attempt, phase, options, extra = null) => {
|
|
6163
6060
|
if (!options.debugArtifacts) {
|
|
@@ -6194,14 +6091,14 @@ var getVerifycenterCaptchaContext = async (page, options) => {
|
|
|
6194
6091
|
if (!isContainerVisible) {
|
|
6195
6092
|
return null;
|
|
6196
6093
|
}
|
|
6197
|
-
|
|
6094
|
+
logger10.info("\u68C0\u6D4B\u5230\u9A8C\u8BC1\u7801\u5BB9\u5668\uFF0C\u5F00\u59CB\u7B49\u5F85 iframe \u52A0\u8F7D\u3002");
|
|
6198
6095
|
let iframeLocator = page.locator(options.iframeSelector).first();
|
|
6199
6096
|
let isIframeVisible = await waitForVisible(
|
|
6200
6097
|
iframeLocator,
|
|
6201
6098
|
options.iframeVisibleTimeoutMs
|
|
6202
6099
|
);
|
|
6203
6100
|
if (!isIframeVisible) {
|
|
6204
|
-
|
|
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");
|
|
6205
6102
|
iframeLocator = captchaContainer.locator(options.iframeFallbackSelector).first();
|
|
6206
6103
|
isIframeVisible = await waitForVisible(
|
|
6207
6104
|
iframeLocator,
|
|
@@ -6211,7 +6108,7 @@ var getVerifycenterCaptchaContext = async (page, options) => {
|
|
|
6211
6108
|
if (!isIframeVisible) {
|
|
6212
6109
|
throw new Error("verifycenter iframe not found inside captcha container.");
|
|
6213
6110
|
}
|
|
6214
|
-
|
|
6111
|
+
logger10.info("\u9A8C\u8BC1\u7801 iframe \u5DF2\u53EF\u89C1\uFF0C\u5F00\u59CB\u89E3\u6790\u5185\u5BB9 frame\u3002");
|
|
6215
6112
|
const frame = await resolveContentFrame(page, iframeLocator, options);
|
|
6216
6113
|
if (!frame) {
|
|
6217
6114
|
throw new Error("Failed to resolve verifycenter iframe content frame.");
|
|
@@ -6327,11 +6224,11 @@ var refreshCaptcha = async (page, frame, options) => {
|
|
|
6327
6224
|
const clicked = await clickCaptchaAction(frame, options.refreshTexts, {
|
|
6328
6225
|
...options,
|
|
6329
6226
|
page,
|
|
6330
|
-
logger:
|
|
6227
|
+
logger: logger10,
|
|
6331
6228
|
forceMouse: true
|
|
6332
6229
|
}).catch(() => false);
|
|
6333
6230
|
if (!clicked) {
|
|
6334
|
-
|
|
6231
|
+
logger10.warn("Refresh button not found.");
|
|
6335
6232
|
return false;
|
|
6336
6233
|
}
|
|
6337
6234
|
await page.waitForTimeout(options.refreshWaitMs);
|
|
@@ -6362,24 +6259,24 @@ var waitForCaptchaChallengeReady = async (page, frame, options) => {
|
|
|
6362
6259
|
const hasGuideMaskVisible = options.guideMaskSelector ? await frame.locator(options.guideMaskSelector).first().isVisible({ timeout: options.loadingIndicatorVisibleTimeoutMs }).catch(() => false) : false;
|
|
6363
6260
|
hasSeenGuideMask = hasSeenGuideMask || hasGuideMaskVisible;
|
|
6364
6261
|
if (hasGuideMaskVisible && !hasLoggedGuideMask) {
|
|
6365
|
-
|
|
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");
|
|
6366
6263
|
hasLoggedGuideMask = true;
|
|
6367
6264
|
}
|
|
6368
6265
|
if (!isLoadingVisible && hasVisibleSourceImage && hasVisibleDropTarget && !hasGuideMaskVisible) {
|
|
6369
|
-
|
|
6266
|
+
logger10.info(
|
|
6370
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"
|
|
6371
6268
|
);
|
|
6372
6269
|
return;
|
|
6373
6270
|
}
|
|
6374
6271
|
if (hasErrorTextVisible) {
|
|
6375
|
-
|
|
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");
|
|
6376
6273
|
await refreshCaptcha(page, frame, options);
|
|
6377
6274
|
refreshDeadline = Date.now() + options.challengeReadyRefreshTimeoutMs;
|
|
6378
6275
|
hasSeenLoading = false;
|
|
6379
6276
|
continue;
|
|
6380
6277
|
}
|
|
6381
6278
|
if ((!hasVisibleSourceImage || !hasVisibleDropTarget) && Date.now() >= refreshDeadline) {
|
|
6382
|
-
|
|
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`);
|
|
6383
6280
|
await refreshCaptcha(page, frame, options);
|
|
6384
6281
|
refreshDeadline = Date.now() + options.challengeReadyRefreshTimeoutMs;
|
|
6385
6282
|
hasSeenLoading = false;
|
|
@@ -6427,7 +6324,7 @@ var dragPromptCaptchaImage = async (page, frame, iframeLocator, sourceLocator, d
|
|
|
6427
6324
|
accepted
|
|
6428
6325
|
};
|
|
6429
6326
|
dragAttempts.push(attemptInfo);
|
|
6430
|
-
|
|
6327
|
+
logger10.info(
|
|
6431
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}`
|
|
6432
6329
|
);
|
|
6433
6330
|
if (accepted) {
|
|
@@ -6445,7 +6342,7 @@ var dragPromptCaptchaImage = async (page, frame, iframeLocator, sourceLocator, d
|
|
|
6445
6342
|
dragAttempts,
|
|
6446
6343
|
finalState: await readPromptCaptchaState(frame, options)
|
|
6447
6344
|
}).catch((error) => {
|
|
6448
|
-
|
|
6345
|
+
logger10.warn(`\u9A8C\u8BC1\u7801\u62D6\u62FD\u5931\u8D25\u8C03\u8BD5\u6293\u53D6\u5931\u8D25\uFF1A${error?.message || error}`);
|
|
6449
6346
|
});
|
|
6450
6347
|
return {
|
|
6451
6348
|
accepted: false,
|
|
@@ -6462,16 +6359,16 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
|
|
|
6462
6359
|
...options
|
|
6463
6360
|
};
|
|
6464
6361
|
if (!config.token) {
|
|
6465
|
-
|
|
6362
|
+
logger10.warn("\u7F3A\u5C11\u9A8C\u8BC1\u7801 token\uFF0C\u8DF3\u8FC7\u81EA\u52A8\u8BC6\u522B\u3002");
|
|
6466
6363
|
return false;
|
|
6467
6364
|
}
|
|
6468
|
-
|
|
6365
|
+
logger10.info("\u5F53\u524D\u4F7F\u7528\u672Ctool\u2014\u2014\u6D4B\u8BD5\u7248\u672C");
|
|
6469
6366
|
for (let attempt = 1; attempt <= config.maxRetries; attempt += 1) {
|
|
6470
|
-
|
|
6367
|
+
logger10.info(`\u5F00\u59CB\u7B2C ${attempt}/${config.maxRetries} \u6B21 verifycenter \u9A8C\u8BC1\u7801\u8BC6\u522B\u3002`);
|
|
6471
6368
|
try {
|
|
6472
6369
|
const captchaContext = await getVerifycenterCaptchaContext(page, config);
|
|
6473
6370
|
if (!captchaContext) {
|
|
6474
|
-
|
|
6371
|
+
logger10.info("Captcha container is not visible anymore.");
|
|
6475
6372
|
return true;
|
|
6476
6373
|
}
|
|
6477
6374
|
const { iframeLocator, frame } = captchaContext;
|
|
@@ -6484,7 +6381,7 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
|
|
|
6484
6381
|
"ready",
|
|
6485
6382
|
config
|
|
6486
6383
|
).catch((error) => {
|
|
6487
|
-
|
|
6384
|
+
logger10.warn(`\u9A8C\u8BC1\u7801\u8C03\u8BD5\u6293\u53D6\u5931\u8D25\uFF1A${error?.message || error}`);
|
|
6488
6385
|
});
|
|
6489
6386
|
await page.waitForTimeout(config.recognitionDelayMs);
|
|
6490
6387
|
const screenshotBuffer = await iframeLocator.screenshot();
|
|
@@ -6496,16 +6393,16 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
|
|
|
6496
6393
|
});
|
|
6497
6394
|
const serialNumbers = extractCaptchaSerialNumbers(apiResponse);
|
|
6498
6395
|
if (apiResponse?.code !== config.recognitionSuccessCode || serialNumbers.length === 0) {
|
|
6499
|
-
|
|
6396
|
+
logger10.warn(
|
|
6500
6397
|
`\u9A8C\u8BC1\u7801\u8BC6\u522B\u5931\u8D25\u3002code=${apiResponse?.code}, msg=${apiResponse?.msg || "unknown"}`
|
|
6501
6398
|
);
|
|
6502
6399
|
await refreshCaptcha(page, frame, config);
|
|
6503
6400
|
continue;
|
|
6504
6401
|
}
|
|
6505
|
-
|
|
6402
|
+
logger10.info(`\u9A8C\u8BC1\u7801\u8BC6\u522B\u6210\u529F\uFF0C\u5E8F\u53F7\uFF1A${serialNumbers.join(", ")}`);
|
|
6506
6403
|
const dropTarget = await findCaptchaDropTarget(frame, config);
|
|
6507
6404
|
if (!dropTarget) {
|
|
6508
|
-
|
|
6405
|
+
logger10.warn("\u672A\u627E\u5230\u9A8C\u8BC1\u7801\u62D6\u62FD\u76EE\u6807\u533A\u57DF\u3002");
|
|
6509
6406
|
await refreshCaptcha(page, frame, config);
|
|
6510
6407
|
continue;
|
|
6511
6408
|
}
|
|
@@ -6516,7 +6413,7 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
|
|
|
6516
6413
|
`Captcha image indexes could not be normalized. raw=${serialNumbers.join(", ")}, count=${orderedSourceImages.length}`
|
|
6517
6414
|
);
|
|
6518
6415
|
}
|
|
6519
|
-
|
|
6416
|
+
logger10.info(`\u9A8C\u8BC1\u7801\u89C6\u89C9\u4F4D\u5E8F\u6620\u5C04\uFF1A${normalizedIndexes.map((index) => index + 1).join(", ")}`);
|
|
6520
6417
|
for (const imageIndex of normalizedIndexes) {
|
|
6521
6418
|
if (imageIndex < 0 || imageIndex >= orderedSourceImages.length) {
|
|
6522
6419
|
throw new Error(
|
|
@@ -6548,52 +6445,52 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
|
|
|
6548
6445
|
}
|
|
6549
6446
|
}
|
|
6550
6447
|
const beforeSubmitState = await readPromptCaptchaState(frame, config);
|
|
6551
|
-
|
|
6448
|
+
logger10.info(
|
|
6552
6449
|
`\u63D0\u4EA4\u524D\u9A8C\u8BC1\u7801\u72B6\u6001\uFF1Abadge=${beforeSubmitState.badgeCount}, selected=${beforeSubmitState.selectedCount}, submitDisabled=${beforeSubmitState.submitDisabled}`
|
|
6553
6450
|
);
|
|
6554
6451
|
const submitted = await clickCaptchaAction(frame, config.submitTexts, {
|
|
6555
6452
|
...config,
|
|
6556
6453
|
page,
|
|
6557
|
-
logger:
|
|
6454
|
+
logger: logger10,
|
|
6558
6455
|
forceMouse: true,
|
|
6559
6456
|
actionVisibleTimeoutMs: config.submitReadyTimeoutMs
|
|
6560
6457
|
}).catch(() => false);
|
|
6561
6458
|
if (!submitted) {
|
|
6562
|
-
|
|
6459
|
+
logger10.warn("\u672A\u627E\u5230\u63D0\u4EA4\u6309\u94AE\uFF0C\u53EF\u80FD\u4F1A\u81EA\u52A8\u63D0\u4EA4\u3002");
|
|
6563
6460
|
}
|
|
6564
6461
|
await page.waitForTimeout(config.submitWaitMs);
|
|
6565
6462
|
const afterSubmitState = await readPromptCaptchaState(frame, config);
|
|
6566
|
-
|
|
6463
|
+
logger10.info(
|
|
6567
6464
|
`\u63D0\u4EA4\u540E\u9A8C\u8BC1\u7801\u72B6\u6001\uFF1Abadge=${afterSubmitState.badgeCount}, selected=${afterSubmitState.selectedCount}, submitDisabled=${afterSubmitState.submitDisabled}`
|
|
6568
6465
|
);
|
|
6569
6466
|
const stillVisible = await iframeLocator.isVisible({ timeout: config.containerVisibleTimeoutMs }).catch(() => false);
|
|
6570
6467
|
if (!stillVisible) {
|
|
6571
|
-
|
|
6468
|
+
logger10.info("\u9A8C\u8BC1\u7801\u8BC6\u522B\u5E76\u63D0\u4EA4\u6210\u529F\u3002");
|
|
6572
6469
|
return true;
|
|
6573
6470
|
}
|
|
6574
6471
|
await maybeCollectCaptchaDebugInfo(page, frame, iframeLocator, attempt, "submit-still-visible", config, {
|
|
6575
6472
|
beforeSubmitState,
|
|
6576
6473
|
afterSubmitState
|
|
6577
6474
|
}).catch((error) => {
|
|
6578
|
-
|
|
6475
|
+
logger10.warn(`\u63D0\u4EA4\u540E\u9A8C\u8BC1\u7801\u8C03\u8BD5\u6293\u53D6\u5931\u8D25\uFF1A${error?.message || error}`);
|
|
6579
6476
|
});
|
|
6580
|
-
|
|
6477
|
+
logger10.warn("\u63D0\u4EA4\u540E\u9A8C\u8BC1\u7801 iframe \u4ECD\u7136\u53EF\u89C1\uFF0C\u51C6\u5907\u5237\u65B0\u540E\u91CD\u8BD5\u3002");
|
|
6581
6478
|
await page.waitForTimeout(2e3);
|
|
6582
6479
|
await refreshCaptcha(page, frame, config);
|
|
6583
6480
|
} catch (error) {
|
|
6584
|
-
|
|
6481
|
+
logger10.error(`\u7B2C ${attempt}/${config.maxRetries} \u6B21\u9A8C\u8BC1\u7801\u8BC6\u522B\u5931\u8D25\uFF1A${error?.message || error}`);
|
|
6585
6482
|
}
|
|
6586
6483
|
if (attempt < config.maxRetries) {
|
|
6587
6484
|
await page.waitForTimeout(config.retryDelayBaseMs + attempt * config.retryDelayStepMs);
|
|
6588
6485
|
}
|
|
6589
6486
|
}
|
|
6590
|
-
|
|
6487
|
+
logger10.error(`\u91CD\u8BD5 ${config.maxRetries} \u6B21\u540E\uFF0C\u9A8C\u8BC1\u7801\u4ECD\u672A\u8BC6\u522B\u6210\u529F\u3002`);
|
|
6591
6488
|
return false;
|
|
6592
6489
|
}
|
|
6593
6490
|
var sloveCaptcha = solveCaptcha;
|
|
6594
6491
|
|
|
6595
6492
|
// src/chaptcha.js
|
|
6596
|
-
var
|
|
6493
|
+
var logger11 = createInternalLogger("Captcha");
|
|
6597
6494
|
var DEFAULT_CAPTCHA_RECOGNITION_OPTIONS = Object.freeze({
|
|
6598
6495
|
token: "eKJvBfwfN0YRav0-VD_44E2VBSfm7l0YtddUQ7cFySI",
|
|
6599
6496
|
apiUrl: "https://api.jfbym.com/api/YmServer/customApi"
|
|
@@ -6680,7 +6577,7 @@ function useCaptchaMonitor(page, options) {
|
|
|
6680
6577
|
};
|
|
6681
6578
|
})();
|
|
6682
6579
|
}, { selector: domSelector, callbackName: exposedFunctionName, cleanerName });
|
|
6683
|
-
|
|
6580
|
+
logger11.success("useCaptchaMonitor", `DOM \u76D1\u63A7\u5DF2\u542F\u7528\uFF1A${domSelector}`);
|
|
6684
6581
|
cleanupFns.push(async () => {
|
|
6685
6582
|
try {
|
|
6686
6583
|
await page.evaluate((name) => {
|
|
@@ -6704,14 +6601,14 @@ function useCaptchaMonitor(page, options) {
|
|
|
6704
6601
|
}
|
|
6705
6602
|
};
|
|
6706
6603
|
page.on("framenavigated", frameHandler);
|
|
6707
|
-
|
|
6604
|
+
logger11.success("useCaptchaMonitor", `URL \u76D1\u63A7\u5DF2\u542F\u7528\uFF1A${urlPattern}`);
|
|
6708
6605
|
cleanupFns.push(async () => {
|
|
6709
6606
|
page.off("framenavigated", frameHandler);
|
|
6710
6607
|
});
|
|
6711
6608
|
}
|
|
6712
6609
|
return {
|
|
6713
6610
|
stop: async () => {
|
|
6714
|
-
|
|
6611
|
+
logger11.info("\u6B63\u5728\u505C\u6B62\u9A8C\u8BC1\u7801\u76D1\u63A7...");
|
|
6715
6612
|
for (const fn of cleanupFns) {
|
|
6716
6613
|
await fn();
|
|
6717
6614
|
}
|
|
@@ -6750,7 +6647,7 @@ async function solveCaptchaWithStrategy(strategyName, page, options = {}) {
|
|
|
6750
6647
|
);
|
|
6751
6648
|
return strategy.sloveCaptcha(page, resolvedOptions, {
|
|
6752
6649
|
callCaptchaRecognitionApi,
|
|
6753
|
-
logger:
|
|
6650
|
+
logger: logger11
|
|
6754
6651
|
});
|
|
6755
6652
|
}
|
|
6756
6653
|
var Captcha = {
|
|
@@ -6761,7 +6658,7 @@ var Captcha = {
|
|
|
6761
6658
|
// src/mutation.js
|
|
6762
6659
|
var import_node_crypto = require("node:crypto");
|
|
6763
6660
|
var import_uuid2 = require("uuid");
|
|
6764
|
-
var
|
|
6661
|
+
var logger12 = createInternalLogger("Mutation");
|
|
6765
6662
|
var MUTATION_MONITOR_MODE = Object.freeze({
|
|
6766
6663
|
Added: "added",
|
|
6767
6664
|
Changed: "changed",
|
|
@@ -6794,14 +6691,14 @@ var Mutation = {
|
|
|
6794
6691
|
const stableTime = options.stableTime ?? 5 * 1e3;
|
|
6795
6692
|
const timeout = options.timeout ?? 120 * 1e3;
|
|
6796
6693
|
const onMutation = options.onMutation;
|
|
6797
|
-
|
|
6694
|
+
logger12.start("waitForStable", `\u76D1\u63A7 ${selectorList.length} \u4E2A\u9009\u62E9\u5668, \u7A33\u5B9A\u65F6\u95F4=${stableTime}ms`);
|
|
6798
6695
|
if (initialTimeout > 0) {
|
|
6799
6696
|
const selectorQuery = selectorList.join(",");
|
|
6800
6697
|
try {
|
|
6801
6698
|
await page.waitForSelector(selectorQuery, { timeout: initialTimeout });
|
|
6802
|
-
|
|
6699
|
+
logger12.info(`waitForStable \u5DF2\u68C0\u6D4B\u5230\u5143\u7D20: ${selectorQuery}`);
|
|
6803
6700
|
} catch (e) {
|
|
6804
|
-
|
|
6701
|
+
logger12.warning(`waitForStable \u521D\u59CB\u7B49\u5F85\u8D85\u65F6 (${initialTimeout}ms): ${selectorQuery}`);
|
|
6805
6702
|
throw e;
|
|
6806
6703
|
}
|
|
6807
6704
|
}
|
|
@@ -6817,7 +6714,7 @@ var Mutation = {
|
|
|
6817
6714
|
return "__CONTINUE__";
|
|
6818
6715
|
}
|
|
6819
6716
|
});
|
|
6820
|
-
|
|
6717
|
+
logger12.info("waitForStable \u5DF2\u542F\u7528 onMutation \u56DE\u8C03");
|
|
6821
6718
|
} catch (e) {
|
|
6822
6719
|
}
|
|
6823
6720
|
}
|
|
@@ -6932,9 +6829,9 @@ var Mutation = {
|
|
|
6932
6829
|
{ selectorList, stableTime, timeout, callbackName, hasCallback: !!onMutation }
|
|
6933
6830
|
);
|
|
6934
6831
|
if (result.mutationCount === 0 && result.stableTime === 0) {
|
|
6935
|
-
|
|
6832
|
+
logger12.warning("waitForStable \u672A\u627E\u5230\u53EF\u76D1\u63A7\u7684\u5143\u7D20");
|
|
6936
6833
|
}
|
|
6937
|
-
|
|
6834
|
+
logger12.success("waitForStable", `DOM \u7A33\u5B9A, \u603B\u5171 ${result.mutationCount} \u6B21\u53D8\u5316${result.wasPaused ? ", \u66FE\u6682\u505C\u8BA1\u65F6" : ""}`);
|
|
6938
6835
|
return result;
|
|
6939
6836
|
},
|
|
6940
6837
|
/**
|
|
@@ -7106,29 +7003,29 @@ var Mutation = {
|
|
|
7106
7003
|
return "__CONTINUE__";
|
|
7107
7004
|
}
|
|
7108
7005
|
};
|
|
7109
|
-
|
|
7006
|
+
logger12.start(
|
|
7110
7007
|
"waitForStableAcrossRoots",
|
|
7111
7008
|
`\u76D1\u63A7 ${selectorList.length} \u4E2A\u9009\u62E9\u5668(\u8DE8 root), \u7A33\u5B9A\u65F6\u95F4=${waitForStableTime}ms`
|
|
7112
7009
|
);
|
|
7113
7010
|
if (initialTimeout > 0) {
|
|
7114
7011
|
try {
|
|
7115
7012
|
await page.waitForSelector(selectorQuery, { timeout: initialTimeout });
|
|
7116
|
-
|
|
7013
|
+
logger12.info(`waitForStableAcrossRoots \u5DF2\u68C0\u6D4B\u5230\u5143\u7D20: ${selectorQuery}`);
|
|
7117
7014
|
} catch (e) {
|
|
7118
|
-
|
|
7015
|
+
logger12.warning(`waitForStableAcrossRoots \u521D\u59CB\u7B49\u5F85\u8D85\u65F6 (${initialTimeout}ms): ${selectorQuery}`);
|
|
7119
7016
|
throw e;
|
|
7120
7017
|
}
|
|
7121
7018
|
}
|
|
7122
|
-
let
|
|
7123
|
-
if (!
|
|
7124
|
-
|
|
7019
|
+
let state2 = await buildState();
|
|
7020
|
+
if (!state2?.hasMatched) {
|
|
7021
|
+
logger12.warning("waitForStableAcrossRoots \u672A\u627E\u5230\u53EF\u76D1\u63A7\u7684\u5143\u7D20");
|
|
7125
7022
|
return { mutationCount: 0, stableTime: 0, wasPaused: false };
|
|
7126
7023
|
}
|
|
7127
7024
|
let mutationCount = 0;
|
|
7128
7025
|
let stableSince = 0;
|
|
7129
7026
|
let isPaused = false;
|
|
7130
7027
|
let wasPaused = false;
|
|
7131
|
-
let lastSnapshotKey =
|
|
7028
|
+
let lastSnapshotKey = state2.snapshotKey;
|
|
7132
7029
|
const applyPauseSignal = (signal) => {
|
|
7133
7030
|
const nextPaused = signal === "__PAUSE__";
|
|
7134
7031
|
if (nextPaused) {
|
|
@@ -7142,13 +7039,13 @@ var Mutation = {
|
|
|
7142
7039
|
};
|
|
7143
7040
|
const initialSignal = await invokeMutationCallback({
|
|
7144
7041
|
mutationCount: 0,
|
|
7145
|
-
html:
|
|
7146
|
-
text:
|
|
7147
|
-
mutationNodes:
|
|
7042
|
+
html: state2.html || "",
|
|
7043
|
+
text: state2.text || "",
|
|
7044
|
+
mutationNodes: state2.mutationNodes || []
|
|
7148
7045
|
});
|
|
7149
7046
|
applyPauseSignal(initialSignal);
|
|
7150
7047
|
const deadline = Date.now() + overallTimeout;
|
|
7151
|
-
let lastState =
|
|
7048
|
+
let lastState = state2;
|
|
7152
7049
|
while (Date.now() < deadline) {
|
|
7153
7050
|
await sleep(pollInterval);
|
|
7154
7051
|
lastState = await buildState();
|
|
@@ -7158,7 +7055,7 @@ var Mutation = {
|
|
|
7158
7055
|
if (lastState.snapshotKey !== lastSnapshotKey) {
|
|
7159
7056
|
lastSnapshotKey = lastState.snapshotKey;
|
|
7160
7057
|
mutationCount += 1;
|
|
7161
|
-
|
|
7058
|
+
logger12.info(
|
|
7162
7059
|
`waitForStableAcrossRoots \u53D8\u5316#${mutationCount}, len=${lastState.snapshotLength}, path=${lastState.primaryPath || "unknown"}, preview="${truncate(lastState.text, 120)}"`
|
|
7163
7060
|
);
|
|
7164
7061
|
const signal = await invokeMutationCallback({
|
|
@@ -7171,7 +7068,7 @@ var Mutation = {
|
|
|
7171
7068
|
continue;
|
|
7172
7069
|
}
|
|
7173
7070
|
if (!isPaused && stableSince > 0 && Date.now() - stableSince >= waitForStableTime) {
|
|
7174
|
-
|
|
7071
|
+
logger12.success("waitForStableAcrossRoots", `DOM \u7A33\u5B9A, \u603B\u5171 ${mutationCount} \u6B21\u53D8\u5316${wasPaused ? ", \u66FE\u6682\u505C\u8BA1\u65F6" : ""}`);
|
|
7175
7072
|
return {
|
|
7176
7073
|
mutationCount,
|
|
7177
7074
|
stableTime: waitForStableTime,
|
|
@@ -7198,7 +7095,7 @@ var Mutation = {
|
|
|
7198
7095
|
const onMutation = options.onMutation;
|
|
7199
7096
|
const rawMode = String(options.mode || MUTATION_MONITOR_MODE.Added).toLowerCase();
|
|
7200
7097
|
const mode = [MUTATION_MONITOR_MODE.Added, MUTATION_MONITOR_MODE.Changed, MUTATION_MONITOR_MODE.All].includes(rawMode) ? rawMode : MUTATION_MONITOR_MODE.Added;
|
|
7201
|
-
|
|
7098
|
+
logger12.start("useMonitor", `\u76D1\u63A7 ${selectorList.length} \u4E2A\u9009\u62E9\u5668, mode=${mode}`);
|
|
7202
7099
|
const monitorKey = generateKey("pk_mon");
|
|
7203
7100
|
const callbackName = generateKey("pk_mon_cb");
|
|
7204
7101
|
const cleanerName = generateKey("pk_mon_clean");
|
|
@@ -7341,7 +7238,7 @@ var Mutation = {
|
|
|
7341
7238
|
return total;
|
|
7342
7239
|
};
|
|
7343
7240
|
}, { selectorList, monitorKey, callbackName, cleanerName, hasCallback: !!onMutation, mode });
|
|
7344
|
-
|
|
7241
|
+
logger12.success("useMonitor", "\u76D1\u63A7\u5668\u5DF2\u542F\u52A8");
|
|
7345
7242
|
return {
|
|
7346
7243
|
stop: async () => {
|
|
7347
7244
|
let totalMutations = 0;
|
|
@@ -7354,7 +7251,7 @@ var Mutation = {
|
|
|
7354
7251
|
}, cleanerName);
|
|
7355
7252
|
} catch (e) {
|
|
7356
7253
|
}
|
|
7357
|
-
|
|
7254
|
+
logger12.success("useMonitor.stop", `\u76D1\u63A7\u5DF2\u505C\u6B62, \u5171 ${totalMutations} \u6B21\u53D8\u5316`);
|
|
7358
7255
|
return { totalMutations };
|
|
7359
7256
|
}
|
|
7360
7257
|
};
|
|
@@ -8223,7 +8120,7 @@ var createTemplateLogger = (baseLogger = createBaseLogger()) => {
|
|
|
8223
8120
|
};
|
|
8224
8121
|
var getDefaultBaseLogger = () => createBaseLogger("");
|
|
8225
8122
|
var Logger = {
|
|
8226
|
-
setLogger: (
|
|
8123
|
+
setLogger: (logger16) => setDefaultLogger(logger16),
|
|
8227
8124
|
info: (message) => getDefaultBaseLogger().info(message),
|
|
8228
8125
|
success: (message) => getDefaultBaseLogger().success(message),
|
|
8229
8126
|
warning: (message) => getDefaultBaseLogger().warning(message),
|
|
@@ -8231,8 +8128,8 @@ var Logger = {
|
|
|
8231
8128
|
error: (message) => getDefaultBaseLogger().error(message),
|
|
8232
8129
|
debug: (message) => getDefaultBaseLogger().debug(message),
|
|
8233
8130
|
start: (message) => getDefaultBaseLogger().start(message),
|
|
8234
|
-
useTemplate: (
|
|
8235
|
-
if (
|
|
8131
|
+
useTemplate: (logger16) => {
|
|
8132
|
+
if (logger16) return createTemplateLogger(createBaseLogger("", logger16));
|
|
8236
8133
|
return createTemplateLogger();
|
|
8237
8134
|
}
|
|
8238
8135
|
};
|
|
@@ -8306,7 +8203,7 @@ var LOCATION_NETWORK_SUFFIX_PATTERNS = [
|
|
|
8306
8203
|
];
|
|
8307
8204
|
var cachedStripLogoSrcPromise = null;
|
|
8308
8205
|
var cachedEnrichmentByContext = /* @__PURE__ */ new WeakMap();
|
|
8309
|
-
var
|
|
8206
|
+
var logger13 = createInternalLogger("Watermarkify");
|
|
8310
8207
|
var normalizeText = (value) => String(value || "").trim();
|
|
8311
8208
|
var toInline = (value, maxLen = 200) => {
|
|
8312
8209
|
const text = normalizeText(value);
|
|
@@ -8548,9 +8445,9 @@ var resolveWithCustomResolver = async (page, baseMeta, options = {}) => {
|
|
|
8548
8445
|
location: toInline(resolved.location, 80)
|
|
8549
8446
|
};
|
|
8550
8447
|
if (enrichment.ip || enrichment.location) {
|
|
8551
|
-
|
|
8448
|
+
logger13.info(`\u81EA\u5B9A\u4E49 resolver \u547D\u4E2D: ip=${enrichment.ip || "-"}, loc=${enrichment.location || "-"}`);
|
|
8552
8449
|
} else {
|
|
8553
|
-
|
|
8450
|
+
logger13.warning("\u81EA\u5B9A\u4E49 resolver \u5DF2\u6267\u884C\uFF0C\u4F46\u672A\u8FD4\u56DE IP/Loc");
|
|
8554
8451
|
}
|
|
8555
8452
|
return enrichment;
|
|
8556
8453
|
} finally {
|
|
@@ -8739,12 +8636,12 @@ var normalizeWatermarkifyRenderMode = (value) => {
|
|
|
8739
8636
|
};
|
|
8740
8637
|
var composeScreenshotBufferWithBrowser = async (page, buffer, overlaySvg, imageInfo = {}, options = {}) => {
|
|
8741
8638
|
if (!page || typeof page.context !== "function") {
|
|
8742
|
-
|
|
8639
|
+
logger13.warning("watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u8DF3\u8FC7: \u7F3A\u5C11\u53EF\u7528 page");
|
|
8743
8640
|
return buffer;
|
|
8744
8641
|
}
|
|
8745
8642
|
const renderScope = await openProbePage(page);
|
|
8746
8643
|
if (!renderScope?.page) {
|
|
8747
|
-
|
|
8644
|
+
logger13.warning("watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u8DF3\u8FC7: \u65E0\u6CD5\u521B\u5EFA render page");
|
|
8748
8645
|
return buffer;
|
|
8749
8646
|
}
|
|
8750
8647
|
try {
|
|
@@ -8809,13 +8706,13 @@ var composeScreenshotBufferWithBrowser = async (page, buffer, overlaySvg, imageI
|
|
|
8809
8706
|
fullPage: true,
|
|
8810
8707
|
animations: "disabled"
|
|
8811
8708
|
}).catch((error) => {
|
|
8812
|
-
|
|
8709
|
+
logger13.warning(`watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u5931\u8D25: ${error instanceof Error ? error.message : String(error)}`);
|
|
8813
8710
|
return null;
|
|
8814
8711
|
});
|
|
8815
8712
|
if (Buffer.isBuffer(composed) && composed.length > 0) {
|
|
8816
8713
|
return composed;
|
|
8817
8714
|
}
|
|
8818
|
-
|
|
8715
|
+
logger13.warning("watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u5931\u8D25: \u672A\u5F97\u5230\u6709\u6548\u622A\u56FE\u7ED3\u679C");
|
|
8819
8716
|
return buffer;
|
|
8820
8717
|
} finally {
|
|
8821
8718
|
await renderScope.close().catch(() => {
|
|
@@ -8828,7 +8725,7 @@ var resolveWithIpLookup = async (page, options = {}) => {
|
|
|
8828
8725
|
}
|
|
8829
8726
|
const probeScope = await openProbePage(page);
|
|
8830
8727
|
if (!probeScope?.page) {
|
|
8831
|
-
|
|
8728
|
+
logger13.warning("ipLookup \u8DF3\u8FC7: \u65E0\u6CD5\u521B\u5EFA probe page");
|
|
8832
8729
|
return null;
|
|
8833
8730
|
}
|
|
8834
8731
|
const timeoutMs = Math.max(
|
|
@@ -8837,12 +8734,12 @@ var resolveWithIpLookup = async (page, options = {}) => {
|
|
|
8837
8734
|
);
|
|
8838
8735
|
try {
|
|
8839
8736
|
const probePage = probeScope.page;
|
|
8840
|
-
|
|
8737
|
+
logger13.info(`ipLookup \u5C1D\u8BD5: url=${DEFAULT_IP_LOOKUP_URL}, timeoutMs=${timeoutMs}`);
|
|
8841
8738
|
const response = await probePage.goto(DEFAULT_IP_LOOKUP_URL, {
|
|
8842
8739
|
waitUntil: "commit",
|
|
8843
8740
|
timeout: timeoutMs
|
|
8844
8741
|
}).catch((error) => {
|
|
8845
|
-
|
|
8742
|
+
logger13.warning(`ipLookup \u8BF7\u6C42\u5931\u8D25: url=${DEFAULT_IP_LOOKUP_URL}, error=${error instanceof Error ? error.message : String(error)}`);
|
|
8846
8743
|
return null;
|
|
8847
8744
|
});
|
|
8848
8745
|
const status = response && typeof response.status === "function" ? response.status() : 0;
|
|
@@ -8864,13 +8761,13 @@ var resolveWithIpLookup = async (page, options = {}) => {
|
|
|
8864
8761
|
}
|
|
8865
8762
|
const parsed = parseIpIpJsonResponse(rawText);
|
|
8866
8763
|
if (parsed?.ip || parsed?.location) {
|
|
8867
|
-
|
|
8764
|
+
logger13.info(`ipLookup \u6210\u529F: url=${DEFAULT_IP_LOOKUP_URL}, status=${status || "-"}, contentType=${contentType || "-"}, ip=${parsed.ip || "-"}, loc=${parsed.location || "-"}`);
|
|
8868
8765
|
return parsed;
|
|
8869
8766
|
}
|
|
8870
|
-
|
|
8767
|
+
logger13.warning(`ipLookup \u672A\u89E3\u6790\u51FA IP/Loc: url=${DEFAULT_IP_LOOKUP_URL}, status=${status || "-"}, contentType=${contentType || "-"}, preview=${shortenTail(rawText, 120) || "[empty]"}`);
|
|
8871
8768
|
return null;
|
|
8872
8769
|
} catch (error) {
|
|
8873
|
-
|
|
8770
|
+
logger13.warning(`ipLookup \u6267\u884C\u5F02\u5E38\uFF0C\u672A\u83B7\u5F97 IP/Loc: ${error instanceof Error ? error.message : String(error)}`);
|
|
8874
8771
|
return null;
|
|
8875
8772
|
} finally {
|
|
8876
8773
|
await probeScope.close().catch(() => {
|
|
@@ -8884,10 +8781,10 @@ var resolveEnrichment = async (page, baseMeta, options) => {
|
|
|
8884
8781
|
ip: toInline(options.ip, 80),
|
|
8885
8782
|
location: toInline(options.location, 80)
|
|
8886
8783
|
};
|
|
8887
|
-
|
|
8784
|
+
logger13.info(`enrichment \u5F00\u59CB: host=${baseMeta.hostname || "-"}, hasPresetIp=${Boolean(merged.ip)}, hasPresetLoc=${Boolean(merged.location)}, ipLookup=${options.ipLookup !== false}`);
|
|
8888
8785
|
if (!merged.ip || !merged.location) {
|
|
8889
8786
|
if (cached?.ip || cached?.location) {
|
|
8890
|
-
|
|
8787
|
+
logger13.info(`enrichment \u547D\u4E2D\u4E0A\u4E0B\u6587\u7F13\u5B58: ip=${cached.ip || "-"}, loc=${cached.location || "-"}`);
|
|
8891
8788
|
}
|
|
8892
8789
|
fillEnrichment(merged, cached);
|
|
8893
8790
|
}
|
|
@@ -8911,15 +8808,15 @@ var resolveEnrichment = async (page, baseMeta, options) => {
|
|
|
8911
8808
|
"x-geo-country"
|
|
8912
8809
|
]), 80);
|
|
8913
8810
|
if (!merged.location || isWeakLocationValue(merged.location) && headerLocation) {
|
|
8914
|
-
|
|
8811
|
+
logger13.info(`enrichment \u4F7F\u7528\u54CD\u5E94\u5934\u8865\u5145 Loc: ${headerLocation || "-"}`);
|
|
8915
8812
|
merged.location = headerLocation || merged.location;
|
|
8916
8813
|
}
|
|
8917
8814
|
}
|
|
8918
8815
|
writeCachedEnrichment(page, merged);
|
|
8919
8816
|
if (merged.ip || merged.location) {
|
|
8920
|
-
|
|
8817
|
+
logger13.info(`enrichment \u5B8C\u6210: ip=${merged.ip || "-"}, loc=${merged.location || "-"}`);
|
|
8921
8818
|
} else {
|
|
8922
|
-
|
|
8819
|
+
logger13.warning("enrichment \u5B8C\u6210: \u672A\u83B7\u5F97 IP/Loc");
|
|
8923
8820
|
}
|
|
8924
8821
|
return merged;
|
|
8925
8822
|
};
|
|
@@ -9732,7 +9629,7 @@ var watermarkifyScreenshotBuffer = async (buffer, meta, page = null, options = {
|
|
|
9732
9629
|
}
|
|
9733
9630
|
const imageInfo = readImageInfo(buffer);
|
|
9734
9631
|
if (!imageInfo.width || !imageInfo.height || !imageInfo.mimeType) {
|
|
9735
|
-
|
|
9632
|
+
logger13.warning("watermarkify \u8DF3\u8FC7: \u65E0\u6CD5\u89E3\u6790\u622A\u56FE\u5C3A\u5BF8\u6216\u683C\u5F0F");
|
|
9736
9633
|
return buffer;
|
|
9737
9634
|
}
|
|
9738
9635
|
const isMobileStrip = normalizeDevice(meta.device) === Device.Mobile && hasStrip;
|
|
@@ -9750,7 +9647,7 @@ var watermarkifyScreenshotBuffer = async (buffer, meta, page = null, options = {
|
|
|
9750
9647
|
|
|
9751
9648
|
// src/internals/compression.js
|
|
9752
9649
|
var import_jimp = require("jimp");
|
|
9753
|
-
var
|
|
9650
|
+
var logger14 = createInternalLogger("Compression");
|
|
9754
9651
|
var DEFAULT_SCREENSHOT_MAX_BYTES = 5 * 1024 * 1024;
|
|
9755
9652
|
var DEFAULT_SCREENSHOT_OUTPUT_TYPE = "jpeg";
|
|
9756
9653
|
var DEFAULT_SCREENSHOT_QUALITY = 0.72;
|
|
@@ -9869,18 +9766,18 @@ var compressImageBufferToBase64 = async (buffer, compression) => {
|
|
|
9869
9766
|
return buffer.toString("base64");
|
|
9870
9767
|
}
|
|
9871
9768
|
const result = await compressImageBuffer(buffer, compression).catch((error) => {
|
|
9872
|
-
|
|
9769
|
+
logger14.warning(`captureScreen \u538B\u7F29\u5931\u8D25\uFF0C\u8FD4\u56DE\u539F\u56FE: ${error instanceof Error ? error.message : String(error)}`);
|
|
9873
9770
|
return null;
|
|
9874
9771
|
});
|
|
9875
9772
|
if (!result?.buffer) {
|
|
9876
9773
|
return buffer.toString("base64");
|
|
9877
9774
|
}
|
|
9878
9775
|
if (result.withinLimit) {
|
|
9879
|
-
|
|
9776
|
+
logger14.info(
|
|
9880
9777
|
`captureScreen \u5DF2\u538B\u7F29: ${originalBytes} -> ${result.bytes} bytes, format=${result.format}, quality=${result.quality}, scale=${result.scale}, size=${result.width}x${result.height}`
|
|
9881
9778
|
);
|
|
9882
9779
|
} else {
|
|
9883
|
-
|
|
9780
|
+
logger14.warning(
|
|
9884
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}`
|
|
9885
9782
|
);
|
|
9886
9783
|
}
|
|
@@ -9888,7 +9785,7 @@ var compressImageBufferToBase64 = async (buffer, compression) => {
|
|
|
9888
9785
|
};
|
|
9889
9786
|
|
|
9890
9787
|
// src/share.js
|
|
9891
|
-
var
|
|
9788
|
+
var logger15 = createInternalLogger("Share");
|
|
9892
9789
|
var DEFAULT_TIMEOUT_MS2 = 50 * 1e3;
|
|
9893
9790
|
var DEFAULT_PAYLOAD_SNAPSHOT_MAX_LEN = 500;
|
|
9894
9791
|
var DEFAULT_POLL_INTERVAL_MS = 120;
|
|
@@ -10025,7 +9922,7 @@ var createDomShareMonitor = async (page, options = {}) => {
|
|
|
10025
9922
|
const onMatch = typeof options.onMatch === "function" ? options.onMatch : null;
|
|
10026
9923
|
const onTelemetry = typeof options.onTelemetry === "function" ? options.onTelemetry : null;
|
|
10027
9924
|
let matched = false;
|
|
10028
|
-
|
|
9925
|
+
logger15.info(`DOM \u76D1\u542C\u51C6\u5907\u6302\u8F7D: selectors=${toJsonInline(selectors, 120)}, mode=${mode}`);
|
|
10029
9926
|
const monitor = await Mutation.useMonitor(page, selectors, {
|
|
10030
9927
|
mode,
|
|
10031
9928
|
onMutation: (context = {}) => {
|
|
@@ -10043,12 +9940,12 @@ ${text}`;
|
|
|
10043
9940
|
});
|
|
10044
9941
|
}
|
|
10045
9942
|
if (mutationCount <= 5 || mutationCount % 50 === 0) {
|
|
10046
|
-
|
|
9943
|
+
logger15.info(`DOM \u53D8\u5316\u5DF2\u6355\u83B7: mutationCount=${mutationCount}, mutationNodes=${mutationNodes.length}`);
|
|
10047
9944
|
}
|
|
10048
9945
|
const [candidate] = Utils.parseLinks(rawDom, { prefix }) || [];
|
|
10049
9946
|
if (!candidate) return;
|
|
10050
9947
|
matched = true;
|
|
10051
|
-
|
|
9948
|
+
logger15.success("captureLink.domHit", `DOM \u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: mutationCount=${mutationCount}, link=${candidate}`);
|
|
10052
9949
|
if (onMatch) {
|
|
10053
9950
|
onMatch({
|
|
10054
9951
|
link: candidate,
|
|
@@ -10064,7 +9961,7 @@ ${text}`;
|
|
|
10064
9961
|
return {
|
|
10065
9962
|
stop: async () => {
|
|
10066
9963
|
const result = await monitor.stop();
|
|
10067
|
-
|
|
9964
|
+
logger15.info(`DOM \u76D1\u542C\u5DF2\u505C\u6B62: totalMutations=${result?.totalMutations || 0}`);
|
|
10068
9965
|
return result;
|
|
10069
9966
|
}
|
|
10070
9967
|
};
|
|
@@ -10113,8 +10010,8 @@ var Share = {
|
|
|
10113
10010
|
if (share.mode === "response" && apiMatchers.length === 0) {
|
|
10114
10011
|
throw new Error("Share.captureLink requires share.xurl[0] api matcher when mode=response");
|
|
10115
10012
|
}
|
|
10116
|
-
|
|
10117
|
-
|
|
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)}`);
|
|
10118
10015
|
const stats = {
|
|
10119
10016
|
actionTimedOut: false,
|
|
10120
10017
|
domMutationCount: 0,
|
|
@@ -10126,7 +10023,7 @@ var Share = {
|
|
|
10126
10023
|
responseSampleUrls: []
|
|
10127
10024
|
};
|
|
10128
10025
|
if (isAborted()) {
|
|
10129
|
-
|
|
10026
|
+
logger15.warning(`captureLink \u5DF2\u53D6\u6D88: ${abortReason()}`);
|
|
10130
10027
|
return {
|
|
10131
10028
|
link: null,
|
|
10132
10029
|
payloadText: "",
|
|
@@ -10149,7 +10046,7 @@ var Share = {
|
|
|
10149
10046
|
link: validated,
|
|
10150
10047
|
payloadText: String(payloadText || "")
|
|
10151
10048
|
};
|
|
10152
|
-
|
|
10049
|
+
logger15.info(`\u5019\u9009\u94FE\u63A5\u5DF2\u786E\u8BA4: source=${source}, link=${validated}`);
|
|
10153
10050
|
return true;
|
|
10154
10051
|
};
|
|
10155
10052
|
const resolveResponseCandidate = (responseText) => {
|
|
@@ -10184,7 +10081,7 @@ var Share = {
|
|
|
10184
10081
|
try {
|
|
10185
10082
|
await monitor.stop();
|
|
10186
10083
|
} catch (error) {
|
|
10187
|
-
|
|
10084
|
+
logger15.warning(`\u505C\u6B62 DOM \u76D1\u542C\u5931\u8D25: ${error instanceof Error ? error.message : String(error)}`);
|
|
10188
10085
|
}
|
|
10189
10086
|
};
|
|
10190
10087
|
const onResponse = async (response) => {
|
|
@@ -10198,29 +10095,29 @@ var Share = {
|
|
|
10198
10095
|
stats.responseSampleUrls.push(url);
|
|
10199
10096
|
}
|
|
10200
10097
|
if (stats.responseObserved <= 5) {
|
|
10201
|
-
|
|
10098
|
+
logger15.info(`\u63A5\u53E3\u54CD\u5E94\u91C7\u6837(${stats.responseObserved}): ${url}`);
|
|
10202
10099
|
}
|
|
10203
10100
|
if (!apiMatchers.some((matcher) => url.includes(matcher))) return;
|
|
10204
10101
|
stats.responseMatched += 1;
|
|
10205
10102
|
stats.lastMatchedUrl = url;
|
|
10206
|
-
|
|
10103
|
+
logger15.info(`\u63A5\u53E3\u547D\u4E2D\u5339\u914D(${stats.responseMatched}): ${url}`);
|
|
10207
10104
|
const text = await response.text();
|
|
10208
10105
|
const hit = resolveResponseCandidate(text);
|
|
10209
10106
|
if (!hit?.link) {
|
|
10210
10107
|
if (stats.responseMatched <= 3) {
|
|
10211
|
-
|
|
10108
|
+
logger15.info(`\u63A5\u53E3\u89E3\u6790\u5B8C\u6210\u4F46\u672A\u63D0\u53D6\u5230\u5206\u4EAB\u94FE\u63A5: payloadSize=${text.length}`);
|
|
10212
10109
|
}
|
|
10213
10110
|
return;
|
|
10214
10111
|
}
|
|
10215
10112
|
stats.responseResolved += 1;
|
|
10216
|
-
|
|
10113
|
+
logger15.success("captureLink.responseHit", `\u63A5\u53E3\u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: url=${url}, link=${hit.link}`);
|
|
10217
10114
|
setCandidate("response", hit.link, hit.payloadText);
|
|
10218
10115
|
} catch (error) {
|
|
10219
|
-
|
|
10116
|
+
logger15.warning(`\u63A5\u53E3\u54CD\u5E94\u5904\u7406\u5F02\u5E38: ${error instanceof Error ? error.message : String(error)}`);
|
|
10220
10117
|
}
|
|
10221
10118
|
};
|
|
10222
10119
|
if (share.mode === "dom") {
|
|
10223
|
-
|
|
10120
|
+
logger15.info("\u5F53\u524D\u4E3A DOM \u6A21\u5F0F\uFF0C\u4EC5\u542F\u7528 DOM \u76D1\u542C");
|
|
10224
10121
|
domMonitor = await createDomShareMonitor(page, {
|
|
10225
10122
|
prefix: share.prefix,
|
|
10226
10123
|
selectors: domSelectors,
|
|
@@ -10235,17 +10132,17 @@ var Share = {
|
|
|
10235
10132
|
});
|
|
10236
10133
|
}
|
|
10237
10134
|
if (share.mode === "response") {
|
|
10238
|
-
|
|
10135
|
+
logger15.info(`\u5F53\u524D\u4E3A\u63A5\u53E3\u6A21\u5F0F\uFF0C\u6302\u8F7D response \u76D1\u542C: apiMatchers=${toJsonInline(apiMatchers, 160)}`);
|
|
10239
10136
|
page.on("response", onResponse);
|
|
10240
10137
|
}
|
|
10241
10138
|
if (share.mode === "custom") {
|
|
10242
|
-
|
|
10139
|
+
logger15.info("\u5F53\u524D\u4E3A custom \u6A21\u5F0F\uFF0C\u5C06\u4F7F\u7528 performActions \u8FD4\u56DE\u503C");
|
|
10243
10140
|
}
|
|
10244
10141
|
const deadline = timeoutDisabled ? Infinity : Date.now() + timeoutMs;
|
|
10245
10142
|
const getRemainingMs = () => timeoutDisabled ? Infinity : Math.max(0, deadline - Date.now());
|
|
10246
10143
|
try {
|
|
10247
10144
|
const actionTimeout = getRemainingMs();
|
|
10248
|
-
|
|
10145
|
+
logger15.start("captureLink.performActions", `\u6267\u884C\u52A8\u4F5C\u9884\u7B97=${timeoutDisabled ? "disabled" : `${actionTimeout}ms`}`);
|
|
10249
10146
|
let actionValue;
|
|
10250
10147
|
if (!isAborted() && actionTimeout > 0) {
|
|
10251
10148
|
let timer = null;
|
|
@@ -10258,30 +10155,30 @@ var Share = {
|
|
|
10258
10155
|
]);
|
|
10259
10156
|
if (timer) clearTimeout(timer);
|
|
10260
10157
|
if (actionResult.type === "error") {
|
|
10261
|
-
|
|
10158
|
+
logger15.fail("captureLink.performActions", actionResult.error);
|
|
10262
10159
|
throw actionResult.error;
|
|
10263
10160
|
}
|
|
10264
10161
|
if (actionResult.type === "timeout") {
|
|
10265
10162
|
stats.actionTimedOut = true;
|
|
10266
|
-
|
|
10163
|
+
logger15.warning(`performActions \u5DF2\u8D85\u65F6 (${actionTimeout}ms)\uFF0C\u52A8\u4F5C\u53EF\u80FD\u4ECD\u5728\u5F02\u6B65\u6267\u884C`);
|
|
10267
10164
|
} else {
|
|
10268
10165
|
actionValue = actionResult.result;
|
|
10269
|
-
|
|
10166
|
+
logger15.success("captureLink.performActions", "\u6267\u884C\u52A8\u4F5C\u5B8C\u6210");
|
|
10270
10167
|
}
|
|
10271
10168
|
}
|
|
10272
10169
|
if (share.mode === "custom") {
|
|
10273
10170
|
const customLink = typeof actionValue === "string" ? actionValue : actionValue?.link || actionValue?.payloadText;
|
|
10274
10171
|
const customPayloadText = typeof actionValue === "string" ? actionValue : actionValue?.payloadText;
|
|
10275
10172
|
if (setCandidate("custom", customLink, customPayloadText)) {
|
|
10276
|
-
|
|
10173
|
+
logger15.success("captureLink.customResult", `custom \u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: link=${candidates.custom.link}`);
|
|
10277
10174
|
} else {
|
|
10278
|
-
|
|
10175
|
+
logger15.warning("performActions \u6267\u884C\u5B8C\u6210\u4F46\u672A\u8FD4\u56DE\u6709\u6548\u5206\u4EAB\u94FE\u63A5");
|
|
10279
10176
|
}
|
|
10280
10177
|
}
|
|
10281
10178
|
let nextProgressLogTs = Date.now() + 3e3;
|
|
10282
10179
|
while (true) {
|
|
10283
10180
|
if (isAborted()) {
|
|
10284
|
-
|
|
10181
|
+
logger15.warning(`captureLink \u5DF2\u53D6\u6D88: ${abortReason()}`);
|
|
10285
10182
|
return {
|
|
10286
10183
|
link: null,
|
|
10287
10184
|
payloadText: "",
|
|
@@ -10291,7 +10188,7 @@ var Share = {
|
|
|
10291
10188
|
}
|
|
10292
10189
|
const selected = candidates[share.mode];
|
|
10293
10190
|
if (selected?.link) {
|
|
10294
|
-
|
|
10191
|
+
logger15.success("captureLink", `\u6355\u83B7\u6210\u529F: source=${share.mode}, link=${selected.link}`);
|
|
10295
10192
|
return {
|
|
10296
10193
|
link: selected.link,
|
|
10297
10194
|
payloadText: selected.payloadText,
|
|
@@ -10304,7 +10201,7 @@ var Share = {
|
|
|
10304
10201
|
if (remaining <= 0) break;
|
|
10305
10202
|
const now = Date.now();
|
|
10306
10203
|
if (now >= nextProgressLogTs) {
|
|
10307
|
-
|
|
10204
|
+
logger15.info(
|
|
10308
10205
|
`captureLink \u7B49\u5F85\u4E2D: remaining=${timeoutDisabled ? "disabled" : `${remaining}ms`}, domMutationCount=${stats.domMutationCount}, responseMatched=${stats.responseMatched}`
|
|
10309
10206
|
);
|
|
10310
10207
|
nextProgressLogTs = now + 5e3;
|
|
@@ -10312,11 +10209,11 @@ var Share = {
|
|
|
10312
10209
|
await (0, import_delay5.default)(Math.max(0, Math.min(DEFAULT_POLL_INTERVAL_MS, remaining)));
|
|
10313
10210
|
}
|
|
10314
10211
|
if (!timeoutDisabled && share.mode === "response" && stats.responseMatched === 0) {
|
|
10315
|
-
|
|
10212
|
+
logger15.warning(
|
|
10316
10213
|
`\u63A5\u53E3\u76D1\u542C\u672A\u547D\u4E2D: apiMatchers=${toJsonInline(apiMatchers, 220)}, \u54CD\u5E94\u6837\u672CURLs=${toJsonInline(stats.responseSampleUrls, 420)}`
|
|
10317
10214
|
);
|
|
10318
10215
|
}
|
|
10319
|
-
|
|
10216
|
+
logger15.warning(
|
|
10320
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"}`
|
|
10321
10218
|
);
|
|
10322
10219
|
return {
|
|
@@ -10328,7 +10225,7 @@ var Share = {
|
|
|
10328
10225
|
} finally {
|
|
10329
10226
|
if (share.mode === "response") {
|
|
10330
10227
|
page.off("response", onResponse);
|
|
10331
|
-
|
|
10228
|
+
logger15.info("response \u76D1\u542C\u5DF2\u5378\u8F7D");
|
|
10332
10229
|
}
|
|
10333
10230
|
await stopDomMonitor();
|
|
10334
10231
|
}
|