@skrillex1224/playwright-toolkit 2.1.279 → 2.1.280
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser.js +165 -157
- package/dist/browser.js.map +4 -4
- package/dist/index.cjs +467 -539
- package/dist/index.cjs.map +4 -4
- package/dist/index.js +467 -539
- package/dist/index.js.map +4 -4
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -360,18 +360,18 @@ var fallbackLog = {
|
|
|
360
360
|
error: (...args) => console.error(...args),
|
|
361
361
|
debug: (...args) => console.debug ? console.debug(...args) : console.log(...args)
|
|
362
362
|
};
|
|
363
|
-
var resolveLogMethod = (
|
|
364
|
-
if (
|
|
365
|
-
return
|
|
363
|
+
var resolveLogMethod = (logger16, name) => {
|
|
364
|
+
if (logger16 && typeof logger16[name] === "function") {
|
|
365
|
+
return logger16[name].bind(logger16);
|
|
366
366
|
}
|
|
367
|
-
if (name === "warning" &&
|
|
368
|
-
return
|
|
367
|
+
if (name === "warning" && logger16 && typeof logger16.warn === "function") {
|
|
368
|
+
return logger16.warn.bind(logger16);
|
|
369
369
|
}
|
|
370
370
|
return fallbackLog[name];
|
|
371
371
|
};
|
|
372
372
|
var defaultLogger = null;
|
|
373
|
-
var setDefaultLogger = (
|
|
374
|
-
defaultLogger =
|
|
373
|
+
var setDefaultLogger = (logger16) => {
|
|
374
|
+
defaultLogger = logger16;
|
|
375
375
|
};
|
|
376
376
|
var resolveLogger = (explicitLogger) => {
|
|
377
377
|
if (explicitLogger && typeof explicitLogger.info === "function") {
|
|
@@ -398,8 +398,8 @@ var colorize = (text, color) => {
|
|
|
398
398
|
var createBaseLogger = (prefix = "", explicitLogger) => {
|
|
399
399
|
const name = prefix ? String(prefix) : "";
|
|
400
400
|
const dispatch = (methodName, icon, message, color) => {
|
|
401
|
-
const
|
|
402
|
-
const logFn = resolveLogMethod(
|
|
401
|
+
const logger16 = resolveLogger(explicitLogger);
|
|
402
|
+
const logFn = resolveLogMethod(logger16, methodName);
|
|
403
403
|
const timestamp = colorize(`[${formatTimestamp()}]`, ANSI.gray);
|
|
404
404
|
const line = formatLine(name, icon, message);
|
|
405
405
|
const coloredLine = colorize(line, color);
|
|
@@ -896,7 +896,7 @@ var prepareExpandedFullPageScreenshot = async (page, options = {}) => {
|
|
|
896
896
|
viewportResized
|
|
897
897
|
};
|
|
898
898
|
};
|
|
899
|
-
var restoreExpandedFullPageScreenshot = async (page,
|
|
899
|
+
var restoreExpandedFullPageScreenshot = async (page, state2 = {}) => {
|
|
900
900
|
await page.evaluate((className) => {
|
|
901
901
|
const targets = new Set([
|
|
902
902
|
...document.querySelectorAll(`.${className}`),
|
|
@@ -920,8 +920,8 @@ var restoreExpandedFullPageScreenshot = async (page, state = {}) => {
|
|
|
920
920
|
el.classList.remove(className);
|
|
921
921
|
});
|
|
922
922
|
}, EXPANDED_SCROLLABLE_CLASS);
|
|
923
|
-
if (
|
|
924
|
-
await page.setViewportSize(
|
|
923
|
+
if (state2?.originalViewport && state2?.viewportResized) {
|
|
924
|
+
await page.setViewportSize(state2.originalViewport);
|
|
925
925
|
}
|
|
926
926
|
};
|
|
927
927
|
var capturePageScreenshot = async (page, options = {}) => {
|
|
@@ -978,21 +978,21 @@ var capturePageScreenshot = async (page, options = {}) => {
|
|
|
978
978
|
}
|
|
979
979
|
};
|
|
980
980
|
var captureExpandedFullPageScreenshot = async (page, options = {}) => {
|
|
981
|
-
const
|
|
981
|
+
const state2 = await prepareExpandedFullPageScreenshot(page, options);
|
|
982
982
|
try {
|
|
983
983
|
return await capturePageScreenshot(page, {
|
|
984
984
|
fullPage: true,
|
|
985
985
|
type: options.type || "png",
|
|
986
986
|
quality: options.quality,
|
|
987
987
|
timeout: options.timeout,
|
|
988
|
-
maxClipHeight:
|
|
988
|
+
maxClipHeight: state2.targetHeight
|
|
989
989
|
});
|
|
990
990
|
} finally {
|
|
991
991
|
await restoreAffixedElementsForExpandedScreenshot(page).catch((error) => {
|
|
992
992
|
logger.warning(`\u79FB\u52A8\u7AEF\u5438\u9644\u5143\u7D20\u6062\u590D\u5931\u8D25: ${error?.message || error}`);
|
|
993
993
|
});
|
|
994
994
|
if (options.restore) {
|
|
995
|
-
await restoreExpandedFullPageScreenshot(page,
|
|
995
|
+
await restoreExpandedFullPageScreenshot(page, state2);
|
|
996
996
|
}
|
|
997
997
|
}
|
|
998
998
|
};
|
|
@@ -1887,8 +1887,8 @@ var normalizeBrowserProfile = (value) => {
|
|
|
1887
1887
|
payload: buildBrowserProfilePayload(core, observed)
|
|
1888
1888
|
};
|
|
1889
1889
|
};
|
|
1890
|
-
var rememberRuntimeState = (
|
|
1891
|
-
rememberedRuntimeState = deepClone(
|
|
1890
|
+
var rememberRuntimeState = (state2) => {
|
|
1891
|
+
rememberedRuntimeState = deepClone(state2);
|
|
1892
1892
|
return rememberedRuntimeState;
|
|
1893
1893
|
};
|
|
1894
1894
|
var normalizeRuntimeState = (source = {}, actor = "") => {
|
|
@@ -1947,7 +1947,7 @@ var RuntimeEnv = {
|
|
|
1947
1947
|
} else {
|
|
1948
1948
|
delete normalizedRuntime.browser_profile;
|
|
1949
1949
|
}
|
|
1950
|
-
const
|
|
1950
|
+
const state2 = {
|
|
1951
1951
|
actor: resolvedActor,
|
|
1952
1952
|
device,
|
|
1953
1953
|
runtime: normalizedRuntime,
|
|
@@ -1961,73 +1961,73 @@ var RuntimeEnv = {
|
|
|
1961
1961
|
browserProfileCore: browserProfile.core,
|
|
1962
1962
|
browserProfileObserved: browserProfile.observed
|
|
1963
1963
|
};
|
|
1964
|
-
rememberRuntimeState(
|
|
1965
|
-
return
|
|
1964
|
+
rememberRuntimeState(state2);
|
|
1965
|
+
return state2;
|
|
1966
1966
|
},
|
|
1967
1967
|
// buildEnvPatch 只构造允许回写到后端 env 的字段集合。
|
|
1968
1968
|
buildEnvPatch(source = {}, actor = "") {
|
|
1969
|
-
const
|
|
1970
|
-
const browserProfile = buildBrowserProfilePayload(
|
|
1969
|
+
const state2 = normalizeRuntimeState(source, actor);
|
|
1970
|
+
const browserProfile = buildBrowserProfilePayload(state2.browserProfileCore, state2.browserProfileObserved);
|
|
1971
1971
|
const envPatch = {
|
|
1972
|
-
...Array.isArray(
|
|
1973
|
-
...Object.keys(
|
|
1974
|
-
...Object.keys(
|
|
1972
|
+
...Array.isArray(state2.cookies) && state2.cookies.length > 0 ? { cookies: state2.cookies } : {},
|
|
1973
|
+
...Object.keys(state2.localStorage || {}).length > 0 ? { local_storage: state2.localStorage } : {},
|
|
1974
|
+
...Object.keys(state2.sessionStorage || {}).length > 0 ? { session_storage: state2.sessionStorage } : {},
|
|
1975
1975
|
...Object.keys(browserProfile).length > 0 ? { browser_profile: browserProfile } : {}
|
|
1976
1976
|
};
|
|
1977
1977
|
return Object.keys(envPatch).length > 0 ? envPatch : null;
|
|
1978
1978
|
},
|
|
1979
1979
|
// hasLoginState 只判断 runtime 是否存在有效载荷,不再区分具体字段来源。
|
|
1980
1980
|
hasLoginState(source = {}, actor = "") {
|
|
1981
|
-
const
|
|
1982
|
-
return isPlainObject(
|
|
1981
|
+
const state2 = normalizeRuntimeState(source, actor);
|
|
1982
|
+
return isPlainObject(state2.runtime) && Object.keys(state2.runtime || {}).length > 0;
|
|
1983
1983
|
},
|
|
1984
1984
|
rememberState(source = {}) {
|
|
1985
|
-
const
|
|
1986
|
-
rememberRuntimeState(
|
|
1985
|
+
const state2 = normalizeRuntimeState(source);
|
|
1986
|
+
rememberRuntimeState(state2);
|
|
1987
1987
|
return RuntimeEnv.peekRememberedState();
|
|
1988
1988
|
},
|
|
1989
1989
|
peekRememberedState() {
|
|
1990
1990
|
return rememberedRuntimeState ? deepClone(rememberedRuntimeState) : null;
|
|
1991
1991
|
},
|
|
1992
1992
|
getBrowserProfileCore(source = {}, actor = "") {
|
|
1993
|
-
const
|
|
1994
|
-
return deepClone(
|
|
1993
|
+
const state2 = normalizeRuntimeState(source, actor);
|
|
1994
|
+
return deepClone(state2.browserProfileCore || {});
|
|
1995
1995
|
},
|
|
1996
1996
|
setBrowserProfileCore(source = {}, core = {}, actor = "") {
|
|
1997
|
-
const
|
|
1997
|
+
const state2 = normalizeRuntimeState(source, actor);
|
|
1998
1998
|
const normalizedCore = normalizeBrowserProfileCore({
|
|
1999
1999
|
...core,
|
|
2000
|
-
device: normalizeKnownDevice(core?.device) ||
|
|
2000
|
+
device: normalizeKnownDevice(core?.device) || state2.device
|
|
2001
2001
|
});
|
|
2002
|
-
|
|
2003
|
-
|
|
2004
|
-
if (Object.keys(
|
|
2005
|
-
|
|
2002
|
+
state2.browserProfileCore = normalizedCore;
|
|
2003
|
+
state2.browserProfile = buildBrowserProfilePayload(normalizedCore, state2.browserProfileObserved);
|
|
2004
|
+
if (Object.keys(state2.browserProfile).length > 0) {
|
|
2005
|
+
state2.runtime.browser_profile = state2.browserProfile;
|
|
2006
2006
|
} else {
|
|
2007
|
-
delete
|
|
2007
|
+
delete state2.runtime.browser_profile;
|
|
2008
2008
|
}
|
|
2009
|
-
rememberRuntimeState(
|
|
2010
|
-
return
|
|
2009
|
+
rememberRuntimeState(state2);
|
|
2010
|
+
return state2;
|
|
2011
2011
|
},
|
|
2012
2012
|
// applyToPage 只负责把登录态相关字段注入页面:
|
|
2013
2013
|
// cookies / localStorage / sessionStorage。
|
|
2014
2014
|
// 指纹、时区、UA、viewport 的回放发生在 launch.js 启动阶段,不在这里做。
|
|
2015
2015
|
async applyToPage(page, source = {}, options = {}) {
|
|
2016
2016
|
if (!page) return;
|
|
2017
|
-
let
|
|
2017
|
+
let state2 = normalizeRuntimeState(source, options?.actor || "");
|
|
2018
2018
|
if (typeof options?.preapply === "function") {
|
|
2019
|
-
|
|
2020
|
-
rememberRuntimeState(
|
|
2019
|
+
state2 = await options.preapply(state2) || state2;
|
|
2020
|
+
rememberRuntimeState(state2);
|
|
2021
2021
|
}
|
|
2022
2022
|
Object.defineProperty(page, PageRuntimeStateKey, {
|
|
2023
2023
|
configurable: true,
|
|
2024
2024
|
enumerable: false,
|
|
2025
2025
|
writable: true,
|
|
2026
|
-
value:
|
|
2026
|
+
value: state2
|
|
2027
2027
|
});
|
|
2028
|
-
const localStorage =
|
|
2029
|
-
const sessionStorage =
|
|
2030
|
-
const cookies = (
|
|
2028
|
+
const localStorage = state2.localStorage || {};
|
|
2029
|
+
const sessionStorage = state2.sessionStorage || {};
|
|
2030
|
+
const cookies = (state2.cookies || []).map((cookie) => {
|
|
2031
2031
|
const normalized = { ...cookie };
|
|
2032
2032
|
if (!normalized.path) {
|
|
2033
2033
|
normalized.path = "/";
|
|
@@ -2065,8 +2065,8 @@ var RuntimeEnv = {
|
|
|
2065
2065
|
},
|
|
2066
2066
|
// captureEnvPatch 在任务结束时采集最新环境快照,用于 pushSuccess / pushFailed 自动回写。
|
|
2067
2067
|
async captureEnvPatch(page, source = {}, options = {}) {
|
|
2068
|
-
const
|
|
2069
|
-
const baseline = RuntimeEnv.buildEnvPatch(
|
|
2068
|
+
const state2 = normalizeRuntimeState(source, options?.actor || "");
|
|
2069
|
+
const baseline = RuntimeEnv.buildEnvPatch(state2) || {};
|
|
2070
2070
|
if (!page || typeof page.evaluate !== "function" || typeof page.context !== "function") {
|
|
2071
2071
|
return Object.keys(baseline).length > 0 ? baseline : null;
|
|
2072
2072
|
}
|
|
@@ -2085,7 +2085,7 @@ var RuntimeEnv = {
|
|
|
2085
2085
|
cookies
|
|
2086
2086
|
},
|
|
2087
2087
|
{
|
|
2088
|
-
browserProfileCore:
|
|
2088
|
+
browserProfileCore: state2.browserProfileCore
|
|
2089
2089
|
}
|
|
2090
2090
|
);
|
|
2091
2091
|
return RuntimeEnv.mergeEnvPatches(baseline, capturedPatch);
|
|
@@ -2099,11 +2099,11 @@ var RuntimeEnv = {
|
|
|
2099
2099
|
var logger3 = createInternalLogger("ApifyKit");
|
|
2100
2100
|
var resolveRuntimeContext = (input) => {
|
|
2101
2101
|
const rememberedState = RuntimeEnv.peekRememberedState();
|
|
2102
|
-
const
|
|
2103
|
-
const envPatch = RuntimeEnv.buildEnvPatch(
|
|
2102
|
+
const state2 = rememberedState || RuntimeEnv.parseInput(input || {});
|
|
2103
|
+
const envPatch = RuntimeEnv.buildEnvPatch(state2) || null;
|
|
2104
2104
|
return {
|
|
2105
|
-
actor:
|
|
2106
|
-
runtime:
|
|
2105
|
+
actor: state2.actor,
|
|
2106
|
+
runtime: state2.runtime,
|
|
2107
2107
|
envPatch
|
|
2108
2108
|
};
|
|
2109
2109
|
};
|
|
@@ -2462,6 +2462,57 @@ var Utils = {
|
|
|
2462
2462
|
}
|
|
2463
2463
|
};
|
|
2464
2464
|
|
|
2465
|
+
// src/internals/context.js
|
|
2466
|
+
var state = {
|
|
2467
|
+
mode: Mode.Default
|
|
2468
|
+
};
|
|
2469
|
+
var normalizeStrategies = (strategies) => strategies && typeof strategies === "object" ? strategies : {};
|
|
2470
|
+
var ToolkitContext = {
|
|
2471
|
+
get mode() {
|
|
2472
|
+
return state.mode;
|
|
2473
|
+
},
|
|
2474
|
+
setMode(mode = Mode.Default) {
|
|
2475
|
+
state.mode = normalizeMode(mode, Mode.Default);
|
|
2476
|
+
return state.mode;
|
|
2477
|
+
}
|
|
2478
|
+
};
|
|
2479
|
+
var getToolkitMode = () => state.mode;
|
|
2480
|
+
var setToolkitMode = (mode = Mode.Default) => ToolkitContext.setMode(mode);
|
|
2481
|
+
var resolveModeStrategy = (strategies = {}, mode = getToolkitMode(), fallbackMode = Mode.Default) => {
|
|
2482
|
+
const normalizedStrategies = normalizeStrategies(strategies);
|
|
2483
|
+
const normalizedMode = normalizeMode(mode, fallbackMode);
|
|
2484
|
+
const delegate = normalizedStrategies[normalizedMode] ?? normalizedStrategies[fallbackMode] ?? Object.values(normalizedStrategies).find(Boolean) ?? null;
|
|
2485
|
+
return {
|
|
2486
|
+
mode: normalizedMode,
|
|
2487
|
+
delegate
|
|
2488
|
+
};
|
|
2489
|
+
};
|
|
2490
|
+
|
|
2491
|
+
// src/internals/delegate.js
|
|
2492
|
+
var normalizeMethodDefinition = (definition) => typeof definition === "string" ? { name: definition, enumerable: true } : {
|
|
2493
|
+
name: String(definition?.name || "").trim(),
|
|
2494
|
+
enumerable: definition?.enumerable !== false
|
|
2495
|
+
};
|
|
2496
|
+
var createMethodDescriptor = (namespace, methodName, enumerable, strategies) => ({
|
|
2497
|
+
enumerable,
|
|
2498
|
+
value: (...args) => {
|
|
2499
|
+
const { mode, delegate } = resolveModeStrategy(strategies);
|
|
2500
|
+
if (typeof delegate?.[methodName] !== "function") {
|
|
2501
|
+
throw new Error(`${namespace}.${methodName} is not available in ${mode} mode`);
|
|
2502
|
+
}
|
|
2503
|
+
return delegate[methodName](...args);
|
|
2504
|
+
}
|
|
2505
|
+
});
|
|
2506
|
+
var createDelegatedFacade = (namespace, strategies = {}, methods = []) => {
|
|
2507
|
+
const descriptors = Object.fromEntries(
|
|
2508
|
+
methods.map(normalizeMethodDefinition).filter((method) => method.name).map((method) => [
|
|
2509
|
+
method.name,
|
|
2510
|
+
createMethodDescriptor(namespace, method.name, method.enumerable, strategies)
|
|
2511
|
+
])
|
|
2512
|
+
);
|
|
2513
|
+
return Object.defineProperties({}, descriptors);
|
|
2514
|
+
};
|
|
2515
|
+
|
|
2465
2516
|
// src/internals/anti-cheat/default.js
|
|
2466
2517
|
var BASE_CONFIG = Object.freeze({
|
|
2467
2518
|
locale: "zh-CN",
|
|
@@ -2535,43 +2586,52 @@ var DefaultAntiCheat = {
|
|
|
2535
2586
|
};
|
|
2536
2587
|
|
|
2537
2588
|
// src/internals/anti-cheat/cloakbrowser.js
|
|
2538
|
-
var
|
|
2539
|
-
|
|
2540
|
-
|
|
2541
|
-
|
|
2542
|
-
|
|
2543
|
-
|
|
2544
|
-
|
|
2545
|
-
|
|
2546
|
-
|
|
2547
|
-
|
|
2548
|
-
|
|
2549
|
-
|
|
2550
|
-
var callAntiCheat = (method, ...args) => {
|
|
2551
|
-
const delegate = resolveAntiCheatDelegate();
|
|
2552
|
-
if (typeof delegate?.[method] !== "function") {
|
|
2553
|
-
throw new Error(`AntiCheat.${method} is not available in ${getToolkitMode()} mode`);
|
|
2554
|
-
}
|
|
2555
|
-
return delegate[method](...args);
|
|
2556
|
-
};
|
|
2557
|
-
var AntiCheat = {
|
|
2589
|
+
var CLOAK_BROWSER_BASE_CONFIG = Object.freeze({
|
|
2590
|
+
locale: "",
|
|
2591
|
+
acceptLanguage: "",
|
|
2592
|
+
timezoneId: "",
|
|
2593
|
+
timezoneOffset: null,
|
|
2594
|
+
geolocation: null
|
|
2595
|
+
});
|
|
2596
|
+
var normalizeHeaders = (headers) => headers && typeof headers === "object" ? headers : {};
|
|
2597
|
+
var CloakBrowserAntiCheat = {
|
|
2598
|
+
/**
|
|
2599
|
+
* CloakBrowser 自身会负责浏览器指纹,toolkit 在该模式下尽量不再注入额外反检测配置。
|
|
2600
|
+
*/
|
|
2558
2601
|
getBaseConfig() {
|
|
2559
|
-
return
|
|
2602
|
+
return { ...CLOAK_BROWSER_BASE_CONFIG };
|
|
2560
2603
|
},
|
|
2561
|
-
getFingerprintGeneratorOptions(
|
|
2562
|
-
return
|
|
2604
|
+
getFingerprintGeneratorOptions() {
|
|
2605
|
+
return {};
|
|
2563
2606
|
},
|
|
2564
|
-
getLaunchArgs(
|
|
2565
|
-
return
|
|
2607
|
+
getLaunchArgs() {
|
|
2608
|
+
return [];
|
|
2566
2609
|
},
|
|
2567
|
-
getTlsFingerprintOptions(
|
|
2568
|
-
return
|
|
2610
|
+
getTlsFingerprintOptions() {
|
|
2611
|
+
return {};
|
|
2569
2612
|
},
|
|
2570
2613
|
applyLocaleHeaders(headers, acceptLanguage = "") {
|
|
2571
|
-
|
|
2614
|
+
const normalizedHeaders = normalizeHeaders(headers);
|
|
2615
|
+
if (acceptLanguage && !normalizedHeaders["accept-language"]) {
|
|
2616
|
+
normalizedHeaders["accept-language"] = acceptLanguage;
|
|
2617
|
+
}
|
|
2618
|
+
return normalizedHeaders;
|
|
2572
2619
|
}
|
|
2573
2620
|
};
|
|
2574
2621
|
|
|
2622
|
+
// src/anti-cheat.js
|
|
2623
|
+
var antiCheatStrategies = {
|
|
2624
|
+
[Mode.Default]: DefaultAntiCheat,
|
|
2625
|
+
[Mode.CloakBrowser]: CloakBrowserAntiCheat
|
|
2626
|
+
};
|
|
2627
|
+
var AntiCheat = createDelegatedFacade("AntiCheat", antiCheatStrategies, [
|
|
2628
|
+
"getBaseConfig",
|
|
2629
|
+
"getFingerprintGeneratorOptions",
|
|
2630
|
+
"getLaunchArgs",
|
|
2631
|
+
"getTlsFingerprintOptions",
|
|
2632
|
+
"applyLocaleHeaders"
|
|
2633
|
+
]);
|
|
2634
|
+
|
|
2575
2635
|
// src/device-input.js
|
|
2576
2636
|
var resolveDeviceFromPage = (page) => normalizeDevice(page?.[PageRuntimeStateKey]?.device);
|
|
2577
2637
|
var assertPage = (page, method) => {
|
|
@@ -2971,12 +3031,12 @@ var resolveDescriptor = (descriptor, device) => {
|
|
|
2971
3031
|
}
|
|
2972
3032
|
return resolved;
|
|
2973
3033
|
};
|
|
2974
|
-
var attachRuntimeState = (page,
|
|
3034
|
+
var attachRuntimeState = (page, state2) => {
|
|
2975
3035
|
Object.defineProperty(page, PageRuntimeStateKey, {
|
|
2976
3036
|
configurable: true,
|
|
2977
3037
|
enumerable: false,
|
|
2978
3038
|
writable: true,
|
|
2979
|
-
value:
|
|
3039
|
+
value: state2
|
|
2980
3040
|
});
|
|
2981
3041
|
};
|
|
2982
3042
|
var restoreRuntimeState = (page, snapshot) => {
|
|
@@ -4030,7 +4090,7 @@ var restoreWindowFromSnapshot = async (page, before, after) => {
|
|
|
4030
4090
|
return;
|
|
4031
4091
|
}
|
|
4032
4092
|
await page.evaluate(
|
|
4033
|
-
(
|
|
4093
|
+
(state2) => window.scrollTo(state2.x, state2.y),
|
|
4034
4094
|
{ x: Number(before.scrollX || 0), y: Number(before.scrollY || 0) }
|
|
4035
4095
|
).catch(() => {
|
|
4036
4096
|
});
|
|
@@ -4276,7 +4336,7 @@ var MobileHumanize = {
|
|
|
4276
4336
|
if (scrollRect && beforeWindowState) {
|
|
4277
4337
|
const afterWindowState = await page.evaluate(() => ({ x: window.scrollX, y: window.scrollY }));
|
|
4278
4338
|
if (Math.abs(afterWindowState.x - beforeWindowState.x) > 2 || Math.abs(afterWindowState.y - beforeWindowState.y) > 2) {
|
|
4279
|
-
await page.evaluate((
|
|
4339
|
+
await page.evaluate((state2) => window.scrollTo(state2.x, state2.y), beforeWindowState);
|
|
4280
4340
|
logger6.debug(`humanScroll | \u7A97\u53E3\u6EDA\u52A8\u56DE\u6536 from=${Math.round(afterWindowState.y)} to=${Math.round(beforeWindowState.y)}`);
|
|
4281
4341
|
}
|
|
4282
4342
|
}
|
|
@@ -4643,23 +4703,60 @@ var DefaultHumanize = {
|
|
|
4643
4703
|
|
|
4644
4704
|
// src/internals/humanize/cloakbrowser.js
|
|
4645
4705
|
import delay4 from "delay";
|
|
4646
|
-
var logger7 = createInternalLogger("Humanize.CloakBrowser");
|
|
4647
|
-
var humanizedPages = /* @__PURE__ */ new WeakSet();
|
|
4648
|
-
var cachedCloakHumanModulePromise = null;
|
|
4649
4706
|
var isPageLike2 = (value) => value && typeof value === "object" && typeof value.evaluate === "function";
|
|
4650
4707
|
var isPoint2 = (value) => value && typeof value === "object" && Number.isFinite(Number(value.x)) && Number.isFinite(Number(value.y));
|
|
4651
4708
|
var resolveDeviceFromPage3 = (page) => normalizeDevice(page?.[PageRuntimeStateKey]?.device);
|
|
4652
4709
|
var isMobilePage = (page) => resolveDeviceFromPage3(page) === Device.Mobile;
|
|
4653
|
-
var
|
|
4654
|
-
|
|
4655
|
-
|
|
4656
|
-
|
|
4657
|
-
|
|
4658
|
-
|
|
4710
|
+
var resolveNativeTarget2 = (page, target) => typeof target === "string" ? page.locator(target).first() : target;
|
|
4711
|
+
var targetExists = async (target) => {
|
|
4712
|
+
if (!target) {
|
|
4713
|
+
return false;
|
|
4714
|
+
}
|
|
4715
|
+
if (typeof target.count === "function") {
|
|
4716
|
+
const count = await target.count().catch(() => 0);
|
|
4717
|
+
return count > 0;
|
|
4718
|
+
}
|
|
4719
|
+
if (typeof target.elementHandle === "function") {
|
|
4720
|
+
const handle = await target.elementHandle().catch(() => null);
|
|
4721
|
+
try {
|
|
4722
|
+
return Boolean(handle);
|
|
4723
|
+
} finally {
|
|
4724
|
+
await handle?.dispose?.().catch(() => {
|
|
4659
4725
|
});
|
|
4660
|
-
}
|
|
4726
|
+
}
|
|
4727
|
+
}
|
|
4728
|
+
return true;
|
|
4729
|
+
};
|
|
4730
|
+
var getTargetBoundingBox2 = async (target) => {
|
|
4731
|
+
if (!target) {
|
|
4732
|
+
return null;
|
|
4733
|
+
}
|
|
4734
|
+
if (typeof target.boundingBox === "function") {
|
|
4735
|
+
return await target.boundingBox().catch(() => null);
|
|
4736
|
+
}
|
|
4737
|
+
if (typeof target.elementHandle === "function") {
|
|
4738
|
+
const handle = await target.elementHandle().catch(() => null);
|
|
4739
|
+
try {
|
|
4740
|
+
return await handle?.boundingBox?.().catch(() => null);
|
|
4741
|
+
} finally {
|
|
4742
|
+
await handle?.dispose?.().catch(() => {
|
|
4743
|
+
});
|
|
4744
|
+
}
|
|
4745
|
+
}
|
|
4746
|
+
return null;
|
|
4747
|
+
};
|
|
4748
|
+
var resolveActionTarget = async (page, target, { throwOnMissing = true } = {}) => {
|
|
4749
|
+
if (target == null) {
|
|
4750
|
+
return null;
|
|
4661
4751
|
}
|
|
4662
|
-
|
|
4752
|
+
const resolvedTarget = resolveNativeTarget2(page, target);
|
|
4753
|
+
if (throwOnMissing || await targetExists(resolvedTarget)) {
|
|
4754
|
+
return resolvedTarget;
|
|
4755
|
+
}
|
|
4756
|
+
return null;
|
|
4757
|
+
};
|
|
4758
|
+
var readViewportScroll = async (page) => {
|
|
4759
|
+
return await page.evaluate(() => ({ x: window.scrollX, y: window.scrollY })).catch(() => ({ x: 0, y: 0 }));
|
|
4663
4760
|
};
|
|
4664
4761
|
var buildTypingHumanConfig = (options = {}) => {
|
|
4665
4762
|
const humanConfig = {};
|
|
@@ -4679,237 +4776,109 @@ var buildTypingHumanConfig = (options = {}) => {
|
|
|
4679
4776
|
return Object.keys(humanConfig).length > 0 ? humanConfig : null;
|
|
4680
4777
|
};
|
|
4681
4778
|
var buildActionOptions = (options = {}) => {
|
|
4682
|
-
const actionOptions = {
|
|
4779
|
+
const actionOptions = {
|
|
4780
|
+
force: true
|
|
4781
|
+
};
|
|
4683
4782
|
if (options && options.timeout != null) {
|
|
4684
4783
|
actionOptions.timeout = options.timeout;
|
|
4685
4784
|
}
|
|
4686
|
-
actionOptions.force = true;
|
|
4687
4785
|
const humanConfig = buildTypingHumanConfig(options);
|
|
4688
4786
|
if (humanConfig) {
|
|
4689
4787
|
actionOptions.human_config = humanConfig;
|
|
4690
4788
|
}
|
|
4691
4789
|
return actionOptions;
|
|
4692
4790
|
};
|
|
4693
|
-
var ensureDesktopHumanized = async (page) => {
|
|
4694
|
-
if (!page || typeof page !== "object") {
|
|
4695
|
-
throw new Error("Humanize requires a Playwright page");
|
|
4696
|
-
}
|
|
4697
|
-
const humanModule = await loadCloakHumanModule();
|
|
4698
|
-
if (page._original && page._humanCursor) {
|
|
4699
|
-
humanizedPages.add(page);
|
|
4700
|
-
return humanModule;
|
|
4701
|
-
}
|
|
4702
|
-
if (humanizedPages.has(page)) {
|
|
4703
|
-
return humanModule;
|
|
4704
|
-
}
|
|
4705
|
-
const config = page._humanCfg || humanModule.resolveConfig?.("default") || humanModule.resolveConfig?.();
|
|
4706
|
-
const cursor = page._humanCursor || { x: 0, y: 0, initialized: false };
|
|
4707
|
-
humanModule.patchPage(page, config, cursor);
|
|
4708
|
-
humanizedPages.add(page);
|
|
4709
|
-
return humanModule;
|
|
4710
|
-
};
|
|
4711
|
-
var patchHandle = async (page, handle) => {
|
|
4712
|
-
if (!handle || typeof handle !== "object") return handle;
|
|
4713
|
-
const humanModule = await ensureDesktopHumanized(page);
|
|
4714
|
-
humanModule.patchSingleElementHandle(
|
|
4715
|
-
handle,
|
|
4716
|
-
page,
|
|
4717
|
-
page._humanCfg,
|
|
4718
|
-
page._humanCursor,
|
|
4719
|
-
page._humanRaw,
|
|
4720
|
-
page._humanRawKb,
|
|
4721
|
-
page._humanOriginals,
|
|
4722
|
-
page._stealth
|
|
4723
|
-
);
|
|
4724
|
-
return handle;
|
|
4725
|
-
};
|
|
4726
|
-
var resolvePatchedTarget = async (page, target, { throwOnMissing = true } = {}) => {
|
|
4727
|
-
if (target == null) {
|
|
4728
|
-
return { target: null, dispose: null };
|
|
4729
|
-
}
|
|
4730
|
-
if (typeof target === "string") {
|
|
4731
|
-
const handle = await page.$(target);
|
|
4732
|
-
if (!handle) {
|
|
4733
|
-
if (throwOnMissing) {
|
|
4734
|
-
throw new Error(`\u627E\u4E0D\u5230\u5143\u7D20 ${String(target)}`);
|
|
4735
|
-
}
|
|
4736
|
-
return { target: null, dispose: null };
|
|
4737
|
-
}
|
|
4738
|
-
return { target: handle, dispose: null };
|
|
4739
|
-
}
|
|
4740
|
-
if (typeof target.elementHandle === "function") {
|
|
4741
|
-
const handle = await target.elementHandle();
|
|
4742
|
-
if (!handle) {
|
|
4743
|
-
if (throwOnMissing) {
|
|
4744
|
-
throw new Error("\u627E\u4E0D\u5230 locator \u5BF9\u5E94\u7684\u5143\u7D20");
|
|
4745
|
-
}
|
|
4746
|
-
return { target: null, dispose: null };
|
|
4747
|
-
}
|
|
4748
|
-
await patchHandle(page, handle);
|
|
4749
|
-
return {
|
|
4750
|
-
target: handle,
|
|
4751
|
-
dispose: async () => {
|
|
4752
|
-
await handle.dispose().catch(() => {
|
|
4753
|
-
});
|
|
4754
|
-
}
|
|
4755
|
-
};
|
|
4756
|
-
}
|
|
4757
|
-
await patchHandle(page, target);
|
|
4758
|
-
return { target, dispose: null };
|
|
4759
|
-
};
|
|
4760
4791
|
var jitterSleep = async (baseMs, jitterPercent = 0.3) => {
|
|
4761
4792
|
await delay4(jitterMs(baseMs, jitterPercent));
|
|
4762
4793
|
};
|
|
4763
|
-
var
|
|
4764
|
-
await ensureDesktopHumanized(page);
|
|
4794
|
+
var moveCursorToPoint = async (page, point) => {
|
|
4765
4795
|
await page.mouse.move(Number(point.x), Number(point.y));
|
|
4766
4796
|
return true;
|
|
4767
4797
|
};
|
|
4768
|
-
var doDesktopHumanClick = async (page, target, options = {}) => {
|
|
4769
|
-
await ensureDesktopHumanized(page);
|
|
4770
|
-
if (target == null) {
|
|
4771
|
-
const cursor = page._humanCursor || { x: 0, y: 0 };
|
|
4772
|
-
await page.mouse.click(cursor.x || 0, cursor.y || 0);
|
|
4773
|
-
return true;
|
|
4774
|
-
}
|
|
4775
|
-
if (isPoint2(target)) {
|
|
4776
|
-
return humanMoveToPoint(page, target).then(async () => {
|
|
4777
|
-
await page.mouse.click(Number(target.x), Number(target.y));
|
|
4778
|
-
return true;
|
|
4779
|
-
});
|
|
4780
|
-
}
|
|
4781
|
-
const throwOnMissing = options.throwOnMissing !== false;
|
|
4782
|
-
if (typeof target === "string") {
|
|
4783
|
-
if (!throwOnMissing) {
|
|
4784
|
-
const existingHandle = await page.$(target);
|
|
4785
|
-
if (!existingHandle) {
|
|
4786
|
-
return false;
|
|
4787
|
-
}
|
|
4788
|
-
await existingHandle.click(buildActionOptions(options));
|
|
4789
|
-
return true;
|
|
4790
|
-
}
|
|
4791
|
-
await page.click(target, buildActionOptions(options));
|
|
4792
|
-
return true;
|
|
4793
|
-
}
|
|
4794
|
-
const { target: resolvedTarget, dispose } = await resolvePatchedTarget(page, target, { throwOnMissing });
|
|
4795
|
-
try {
|
|
4796
|
-
if (!resolvedTarget) {
|
|
4797
|
-
return false;
|
|
4798
|
-
}
|
|
4799
|
-
if (typeof resolvedTarget.click === "function") {
|
|
4800
|
-
await resolvedTarget.click(buildActionOptions(options));
|
|
4801
|
-
return true;
|
|
4802
|
-
}
|
|
4803
|
-
const box = await resolvedTarget.boundingBox?.();
|
|
4804
|
-
if (!box) {
|
|
4805
|
-
if (throwOnMissing) {
|
|
4806
|
-
throw new Error("\u65E0\u6CD5\u83B7\u53D6\u5143\u7D20\u4F4D\u7F6E");
|
|
4807
|
-
}
|
|
4808
|
-
return false;
|
|
4809
|
-
}
|
|
4810
|
-
await page.mouse.click(box.x + box.width / 2, box.y + box.height / 2);
|
|
4811
|
-
return true;
|
|
4812
|
-
} finally {
|
|
4813
|
-
if (typeof dispose === "function") {
|
|
4814
|
-
await dispose();
|
|
4815
|
-
}
|
|
4816
|
-
}
|
|
4817
|
-
};
|
|
4818
4798
|
var CloakBrowserHumanize = {
|
|
4819
4799
|
jitterMs(base, jitterPercent = 0.3) {
|
|
4820
4800
|
return jitterMs(base, jitterPercent);
|
|
4821
4801
|
},
|
|
4822
4802
|
async initializeCursor(page) {
|
|
4823
4803
|
if (isMobilePage(page)) {
|
|
4824
|
-
return MobileHumanize.initializeCursor(page);
|
|
4804
|
+
return await MobileHumanize.initializeCursor(page);
|
|
4825
4805
|
}
|
|
4826
|
-
|
|
4827
|
-
logger7.debug("initializeCursor: cloakbrowser human layer ready");
|
|
4806
|
+
return Boolean(page);
|
|
4828
4807
|
},
|
|
4829
4808
|
async humanMove(page, target) {
|
|
4830
4809
|
if (isMobilePage(page)) {
|
|
4831
4810
|
return await MobileHumanize.humanMove(page, target);
|
|
4832
4811
|
}
|
|
4833
|
-
await ensureDesktopHumanized(page);
|
|
4834
4812
|
if (isPoint2(target)) {
|
|
4835
|
-
return await
|
|
4813
|
+
return await moveCursorToPoint(page, target);
|
|
4836
4814
|
}
|
|
4837
|
-
const
|
|
4838
|
-
|
|
4839
|
-
|
|
4840
|
-
|
|
4841
|
-
|
|
4842
|
-
|
|
4843
|
-
await resolvedTarget.hover({ force: true });
|
|
4844
|
-
return true;
|
|
4845
|
-
}
|
|
4846
|
-
const box = await resolvedTarget.boundingBox?.();
|
|
4847
|
-
if (!box) {
|
|
4848
|
-
return false;
|
|
4849
|
-
}
|
|
4850
|
-
await page.mouse.move(box.x + box.width / 2, box.y + box.height / 2);
|
|
4815
|
+
const resolvedTarget = await resolveActionTarget(page, target, { throwOnMissing: false });
|
|
4816
|
+
if (!resolvedTarget) {
|
|
4817
|
+
return false;
|
|
4818
|
+
}
|
|
4819
|
+
if (typeof resolvedTarget.hover === "function") {
|
|
4820
|
+
await resolvedTarget.hover({ force: true });
|
|
4851
4821
|
return true;
|
|
4852
|
-
} finally {
|
|
4853
|
-
if (typeof dispose === "function") {
|
|
4854
|
-
await dispose();
|
|
4855
|
-
}
|
|
4856
4822
|
}
|
|
4823
|
+
const box = await getTargetBoundingBox2(resolvedTarget);
|
|
4824
|
+
if (!box) {
|
|
4825
|
+
return false;
|
|
4826
|
+
}
|
|
4827
|
+
return await moveCursorToPoint(page, {
|
|
4828
|
+
x: box.x + box.width / 2,
|
|
4829
|
+
y: box.y + box.height / 2
|
|
4830
|
+
});
|
|
4857
4831
|
},
|
|
4858
4832
|
async humanScroll(page, target, options = {}) {
|
|
4859
4833
|
if (isMobilePage(page)) {
|
|
4860
4834
|
return await MobileHumanize.humanScroll(page, target, options);
|
|
4861
4835
|
}
|
|
4862
|
-
const
|
|
4863
|
-
if (
|
|
4864
|
-
|
|
4865
|
-
try {
|
|
4866
|
-
const result = await humanModule.scrollToElement(
|
|
4867
|
-
page,
|
|
4868
|
-
page._humanRaw,
|
|
4869
|
-
target,
|
|
4870
|
-
x,
|
|
4871
|
-
y,
|
|
4872
|
-
page._humanCfg,
|
|
4873
|
-
options.timeout
|
|
4874
|
-
);
|
|
4875
|
-
if (page._humanCursor) {
|
|
4876
|
-
page._humanCursor.x = result.cursorX;
|
|
4877
|
-
page._humanCursor.y = result.cursorY;
|
|
4878
|
-
}
|
|
4879
|
-
return {
|
|
4880
|
-
element: await page.$(target),
|
|
4881
|
-
didScroll: Boolean(result.didScroll),
|
|
4882
|
-
restore: null
|
|
4883
|
-
};
|
|
4884
|
-
} catch (error) {
|
|
4885
|
-
logger7.warn(`humanScroll: cloakbrowser \u6EDA\u52A8\u5931\u8D25\uFF0C\u8DF3\u8FC7 (${error?.message || error})`);
|
|
4886
|
-
return { element: null, didScroll: false, restore: null };
|
|
4887
|
-
}
|
|
4888
|
-
}
|
|
4889
|
-
const { target: resolvedTarget, dispose } = await resolvePatchedTarget(page, target, { throwOnMissing: false });
|
|
4890
|
-
try {
|
|
4891
|
-
if (!resolvedTarget) {
|
|
4892
|
-
return { element: null, didScroll: false, restore: null };
|
|
4893
|
-
}
|
|
4894
|
-
const before = await page.evaluate(() => ({ x: window.scrollX, y: window.scrollY }));
|
|
4895
|
-
await resolvedTarget.scrollIntoViewIfNeeded?.();
|
|
4896
|
-
const after = await page.evaluate(() => ({ x: window.scrollX, y: window.scrollY }));
|
|
4897
|
-
return {
|
|
4898
|
-
element: resolvedTarget,
|
|
4899
|
-
didScroll: before.x !== after.x || before.y !== after.y,
|
|
4900
|
-
restore: null
|
|
4901
|
-
};
|
|
4902
|
-
} finally {
|
|
4903
|
-
if (typeof dispose === "function") {
|
|
4904
|
-
await dispose();
|
|
4905
|
-
}
|
|
4836
|
+
const resolvedTarget = await resolveActionTarget(page, target, { throwOnMissing: false });
|
|
4837
|
+
if (!resolvedTarget) {
|
|
4838
|
+
return { element: null, didScroll: false, restore: null };
|
|
4906
4839
|
}
|
|
4840
|
+
const before = await readViewportScroll(page);
|
|
4841
|
+
await resolvedTarget.scrollIntoViewIfNeeded?.().catch(() => {
|
|
4842
|
+
});
|
|
4843
|
+
const after = await readViewportScroll(page);
|
|
4844
|
+
return {
|
|
4845
|
+
element: resolvedTarget,
|
|
4846
|
+
didScroll: before.x !== after.x || before.y !== after.y,
|
|
4847
|
+
restore: null
|
|
4848
|
+
};
|
|
4907
4849
|
},
|
|
4908
4850
|
async humanClick(page, target, options = {}) {
|
|
4909
4851
|
if (isMobilePage(page)) {
|
|
4910
4852
|
return await MobileHumanize.humanClick(page, target, options);
|
|
4911
4853
|
}
|
|
4912
|
-
|
|
4854
|
+
if (target == null) {
|
|
4855
|
+
const { x = 0, y = 0 } = page?._humanCursor || {};
|
|
4856
|
+
await page.mouse.click(x || 0, y || 0);
|
|
4857
|
+
return true;
|
|
4858
|
+
}
|
|
4859
|
+
if (isPoint2(target)) {
|
|
4860
|
+
await page.mouse.click(Number(target.x), Number(target.y));
|
|
4861
|
+
return true;
|
|
4862
|
+
}
|
|
4863
|
+
const resolvedTarget = await resolveActionTarget(page, target, {
|
|
4864
|
+
throwOnMissing: options.throwOnMissing !== false
|
|
4865
|
+
});
|
|
4866
|
+
if (!resolvedTarget) {
|
|
4867
|
+
return false;
|
|
4868
|
+
}
|
|
4869
|
+
if (typeof resolvedTarget.click === "function") {
|
|
4870
|
+
await resolvedTarget.click(buildActionOptions(options));
|
|
4871
|
+
return true;
|
|
4872
|
+
}
|
|
4873
|
+
const box = await getTargetBoundingBox2(resolvedTarget);
|
|
4874
|
+
if (!box) {
|
|
4875
|
+
if (options.throwOnMissing !== false) {
|
|
4876
|
+
throw new Error("\u65E0\u6CD5\u83B7\u53D6\u5143\u7D20\u4F4D\u7F6E");
|
|
4877
|
+
}
|
|
4878
|
+
return false;
|
|
4879
|
+
}
|
|
4880
|
+
await page.mouse.click(box.x + box.width / 2, box.y + box.height / 2);
|
|
4881
|
+
return true;
|
|
4913
4882
|
},
|
|
4914
4883
|
async randomSleep(pageOrBaseMs, maybeBaseMs, maybeJitterPercent) {
|
|
4915
4884
|
if (isPageLike2(pageOrBaseMs)) {
|
|
@@ -4925,7 +4894,6 @@ var CloakBrowserHumanize = {
|
|
|
4925
4894
|
if (isMobilePage(page)) {
|
|
4926
4895
|
return await MobileHumanize.simulateGaze(page, baseDurationMs);
|
|
4927
4896
|
}
|
|
4928
|
-
await ensureDesktopHumanized(page);
|
|
4929
4897
|
const durationMs = jitterMs(baseDurationMs, 0.4);
|
|
4930
4898
|
const startTime = Date.now();
|
|
4931
4899
|
const viewportSize = page.viewportSize() || { width: 1365, height: 900 };
|
|
@@ -4941,29 +4909,21 @@ var CloakBrowserHumanize = {
|
|
|
4941
4909
|
if (isMobilePage(page)) {
|
|
4942
4910
|
return await MobileHumanize.humanType(page, selector, text, options);
|
|
4943
4911
|
}
|
|
4944
|
-
await ensureDesktopHumanized(page);
|
|
4945
4912
|
const actionOptions = buildActionOptions(options);
|
|
4946
4913
|
if (typeof selector === "string") {
|
|
4947
4914
|
await page.type(selector, text, actionOptions);
|
|
4948
4915
|
return;
|
|
4949
4916
|
}
|
|
4950
|
-
const
|
|
4951
|
-
|
|
4952
|
-
|
|
4953
|
-
throw new Error("\u76EE\u6807\u5143\u7D20\u4E0D\u652F\u6301 type()");
|
|
4954
|
-
}
|
|
4955
|
-
await resolvedTarget.type(text, actionOptions);
|
|
4956
|
-
} finally {
|
|
4957
|
-
if (typeof dispose === "function") {
|
|
4958
|
-
await dispose();
|
|
4959
|
-
}
|
|
4917
|
+
const resolvedTarget = await resolveActionTarget(page, selector, { throwOnMissing: true });
|
|
4918
|
+
if (!resolvedTarget || typeof resolvedTarget.type !== "function") {
|
|
4919
|
+
throw new Error("\u76EE\u6807\u5143\u7D20\u4E0D\u652F\u6301 type()");
|
|
4960
4920
|
}
|
|
4921
|
+
await resolvedTarget.type(text, actionOptions);
|
|
4961
4922
|
},
|
|
4962
4923
|
async humanPress(page, targetOrKey, maybeKey, options = {}) {
|
|
4963
4924
|
if (isMobilePage(page)) {
|
|
4964
4925
|
return await MobileHumanize.humanPress(page, targetOrKey, maybeKey, options);
|
|
4965
4926
|
}
|
|
4966
|
-
await ensureDesktopHumanized(page);
|
|
4967
4927
|
const hasTarget = typeof maybeKey === "string";
|
|
4968
4928
|
const key = hasTarget ? maybeKey : targetOrKey;
|
|
4969
4929
|
const pressOptions = hasTarget ? options : maybeKey || options;
|
|
@@ -4979,49 +4939,57 @@ var CloakBrowserHumanize = {
|
|
|
4979
4939
|
await page.press(targetOrKey, key, buildActionOptions(pressOptions));
|
|
4980
4940
|
return true;
|
|
4981
4941
|
}
|
|
4982
|
-
const
|
|
4942
|
+
const resolvedTarget = await resolveActionTarget(page, targetOrKey, {
|
|
4983
4943
|
throwOnMissing: pressOptions.throwOnMissing !== false
|
|
4984
4944
|
});
|
|
4985
|
-
|
|
4986
|
-
|
|
4987
|
-
|
|
4988
|
-
|
|
4989
|
-
|
|
4990
|
-
await resolvedTarget.press(key, buildActionOptions(pressOptions));
|
|
4991
|
-
return true;
|
|
4992
|
-
}
|
|
4993
|
-
await doDesktopHumanClick(page, targetOrKey, {
|
|
4994
|
-
...pressOptions,
|
|
4995
|
-
reactionDelay: pressOptions.focusDelay ?? 180
|
|
4996
|
-
});
|
|
4997
|
-
await jitterSleep(pressOptions.reactionDelay ?? 180, 0.45);
|
|
4998
|
-
await page.keyboard.press(key, {
|
|
4999
|
-
...pressOptions.keyboardOptions || {},
|
|
5000
|
-
delay: jitterMs(pressOptions.holdDelay ?? 45, 0.5)
|
|
5001
|
-
});
|
|
4945
|
+
if (!resolvedTarget) {
|
|
4946
|
+
return false;
|
|
4947
|
+
}
|
|
4948
|
+
if (typeof resolvedTarget.press === "function") {
|
|
4949
|
+
await resolvedTarget.press(key, buildActionOptions(pressOptions));
|
|
5002
4950
|
return true;
|
|
5003
|
-
} finally {
|
|
5004
|
-
if (typeof dispose === "function") {
|
|
5005
|
-
await dispose();
|
|
5006
|
-
}
|
|
5007
4951
|
}
|
|
4952
|
+
await this.humanClick(page, targetOrKey, {
|
|
4953
|
+
...pressOptions,
|
|
4954
|
+
reactionDelay: pressOptions.focusDelay ?? 180
|
|
4955
|
+
});
|
|
4956
|
+
await jitterSleep(pressOptions.reactionDelay ?? 180, 0.45);
|
|
4957
|
+
await page.keyboard.press(key, {
|
|
4958
|
+
...pressOptions.keyboardOptions || {},
|
|
4959
|
+
delay: jitterMs(pressOptions.holdDelay ?? 45, 0.5)
|
|
4960
|
+
});
|
|
4961
|
+
return true;
|
|
5008
4962
|
},
|
|
5009
4963
|
async humanClear(page, selector) {
|
|
5010
4964
|
if (isMobilePage(page)) {
|
|
5011
4965
|
return await MobileHumanize.humanClear(page, selector);
|
|
5012
4966
|
}
|
|
5013
|
-
|
|
5014
|
-
|
|
5015
|
-
|
|
4967
|
+
if (typeof selector === "string") {
|
|
4968
|
+
if (typeof page.clear === "function") {
|
|
4969
|
+
await page.clear(selector, { force: true });
|
|
4970
|
+
return;
|
|
4971
|
+
}
|
|
4972
|
+
await page.fill(selector, "", { force: true });
|
|
4973
|
+
return;
|
|
4974
|
+
}
|
|
4975
|
+
const resolvedTarget = await resolveActionTarget(page, selector, { throwOnMissing: true });
|
|
4976
|
+
if (!resolvedTarget) {
|
|
4977
|
+
throw new Error("\u76EE\u6807\u5143\u7D20\u4E0D\u652F\u6301 clear()");
|
|
4978
|
+
}
|
|
4979
|
+
if (typeof resolvedTarget.clear === "function") {
|
|
4980
|
+
await resolvedTarget.clear(buildActionOptions());
|
|
4981
|
+
return;
|
|
4982
|
+
}
|
|
4983
|
+
if (typeof resolvedTarget.fill === "function") {
|
|
4984
|
+
await resolvedTarget.fill("", buildActionOptions());
|
|
5016
4985
|
return;
|
|
5017
4986
|
}
|
|
5018
|
-
|
|
4987
|
+
throw new Error("\u76EE\u6807\u5143\u7D20\u4E0D\u652F\u6301 clear()");
|
|
5019
4988
|
},
|
|
5020
4989
|
async warmUpBrowsing(page, baseDuration = 3500) {
|
|
5021
4990
|
if (isMobilePage(page)) {
|
|
5022
4991
|
return await MobileHumanize.warmUpBrowsing(page, baseDuration);
|
|
5023
4992
|
}
|
|
5024
|
-
await ensureDesktopHumanized(page);
|
|
5025
4993
|
const durationMs = jitterMs(baseDuration, 0.4);
|
|
5026
4994
|
const startTime = Date.now();
|
|
5027
4995
|
const viewportSize = page.viewportSize() || { width: 1365, height: 900 };
|
|
@@ -5047,7 +5015,6 @@ var CloakBrowserHumanize = {
|
|
|
5047
5015
|
if (isMobilePage(page)) {
|
|
5048
5016
|
return await MobileHumanize.naturalScroll(page, direction, distance, baseSteps);
|
|
5049
5017
|
}
|
|
5050
|
-
await ensureDesktopHumanized(page);
|
|
5051
5018
|
const steps = Math.max(3, baseSteps + Math.floor(Math.random() * 3) - 1);
|
|
5052
5019
|
const actualDistance = jitterMs(distance, 0.15);
|
|
5053
5020
|
const sign = direction === "down" ? 1 : -1;
|
|
@@ -5062,55 +5029,24 @@ var CloakBrowserHumanize = {
|
|
|
5062
5029
|
};
|
|
5063
5030
|
|
|
5064
5031
|
// src/humanize.js
|
|
5065
|
-
var
|
|
5066
|
-
|
|
5067
|
-
|
|
5068
|
-
|
|
5069
|
-
|
|
5070
|
-
|
|
5071
|
-
|
|
5072
|
-
|
|
5073
|
-
|
|
5074
|
-
|
|
5075
|
-
|
|
5076
|
-
|
|
5077
|
-
|
|
5078
|
-
|
|
5079
|
-
|
|
5080
|
-
|
|
5081
|
-
|
|
5082
|
-
|
|
5083
|
-
humanScroll(page, target, options = {}) {
|
|
5084
|
-
return callHumanize("humanScroll", page, target, options);
|
|
5085
|
-
},
|
|
5086
|
-
humanClick(page, target, options = {}) {
|
|
5087
|
-
return callHumanize("humanClick", page, target, options);
|
|
5088
|
-
},
|
|
5089
|
-
randomSleep(pageOrBaseMs, maybeBaseMs, maybeJitterPercent) {
|
|
5090
|
-
return callHumanize("randomSleep", pageOrBaseMs, maybeBaseMs, maybeJitterPercent);
|
|
5091
|
-
},
|
|
5092
|
-
simulateGaze(page, baseDurationMs = 2500) {
|
|
5093
|
-
return callHumanize("simulateGaze", page, baseDurationMs);
|
|
5094
|
-
},
|
|
5095
|
-
humanType(page, selector, text, options = {}) {
|
|
5096
|
-
return callHumanize("humanType", page, selector, text, options);
|
|
5097
|
-
},
|
|
5098
|
-
humanPress(page, targetOrKey, maybeKey, options = {}) {
|
|
5099
|
-
if (typeof maybeKey === "string") {
|
|
5100
|
-
return callHumanize("humanPress", page, targetOrKey, maybeKey, options);
|
|
5101
|
-
}
|
|
5102
|
-
return callHumanize("humanPress", page, targetOrKey, maybeKey || options);
|
|
5103
|
-
},
|
|
5104
|
-
humanClear(page, selector) {
|
|
5105
|
-
return callHumanize("humanClear", page, selector);
|
|
5106
|
-
},
|
|
5107
|
-
warmUpBrowsing(page, baseDuration = 3500) {
|
|
5108
|
-
return callHumanize("warmUpBrowsing", page, baseDuration);
|
|
5109
|
-
},
|
|
5110
|
-
naturalScroll(page, direction = "down", distance = 300, baseSteps = 5) {
|
|
5111
|
-
return callHumanize("naturalScroll", page, direction, distance, baseSteps);
|
|
5112
|
-
}
|
|
5113
|
-
};
|
|
5032
|
+
var humanizeStrategies = {
|
|
5033
|
+
[Mode.Default]: DefaultHumanize,
|
|
5034
|
+
[Mode.CloakBrowser]: CloakBrowserHumanize
|
|
5035
|
+
};
|
|
5036
|
+
var Humanize2 = createDelegatedFacade("Humanize", humanizeStrategies, [
|
|
5037
|
+
"jitterMs",
|
|
5038
|
+
"initializeCursor",
|
|
5039
|
+
"humanMove",
|
|
5040
|
+
"humanScroll",
|
|
5041
|
+
"humanClick",
|
|
5042
|
+
"randomSleep",
|
|
5043
|
+
"simulateGaze",
|
|
5044
|
+
"humanType",
|
|
5045
|
+
"humanPress",
|
|
5046
|
+
"humanClear",
|
|
5047
|
+
"warmUpBrowsing",
|
|
5048
|
+
"naturalScroll"
|
|
5049
|
+
]);
|
|
5114
5050
|
|
|
5115
5051
|
// src/internals/launch/default.js
|
|
5116
5052
|
import { execFileSync } from "node:child_process";
|
|
@@ -5198,7 +5134,7 @@ var ByPass = {
|
|
|
5198
5134
|
};
|
|
5199
5135
|
|
|
5200
5136
|
// src/internals/launch/default.js
|
|
5201
|
-
var
|
|
5137
|
+
var logger7 = createInternalLogger("Launch");
|
|
5202
5138
|
var REQUEST_HOOK_FLAG = Symbol("playwright-toolkit-request-hook");
|
|
5203
5139
|
var injectedContexts = /* @__PURE__ */ new WeakSet();
|
|
5204
5140
|
var browserMajorVersionCache = /* @__PURE__ */ new Map();
|
|
@@ -5250,7 +5186,7 @@ var detectBrowserMajorVersion = (launcher) => {
|
|
|
5250
5186
|
});
|
|
5251
5187
|
detectedVersion = parseChromeMajorVersion(rawVersion);
|
|
5252
5188
|
} catch (error) {
|
|
5253
|
-
|
|
5189
|
+
logger7.warn(`\u8BFB\u53D6\u6D4F\u89C8\u5668\u7248\u672C\u5931\u8D25: ${error?.message || error}`);
|
|
5254
5190
|
}
|
|
5255
5191
|
browserMajorVersionCache.set(executablePath, detectedVersion);
|
|
5256
5192
|
return detectedVersion;
|
|
@@ -5287,7 +5223,7 @@ var generateFingerprintForCore = ({ locale, browserMajorVersion, device }) => {
|
|
|
5287
5223
|
if (requestedBrowserMajorVersion <= 0) {
|
|
5288
5224
|
throw error;
|
|
5289
5225
|
}
|
|
5290
|
-
|
|
5226
|
+
logger7.warn(
|
|
5291
5227
|
`\u5F53\u524D\u6D4F\u89C8\u5668\u5927\u7248\u672C ${requestedBrowserMajorVersion} \u65E0\u53EF\u7528 strict \u6307\u7EB9\u6837\u672C\uFF0C\u9000\u56DE\u4E0D\u7ED1\u5B9A\u5927\u7248\u672C\u751F\u6210: ${error?.message || error}`
|
|
5292
5228
|
);
|
|
5293
5229
|
}
|
|
@@ -5332,7 +5268,7 @@ var buildReplayableBrowserProfile = (runtimeState, launcher) => {
|
|
|
5332
5268
|
schema_version: DEFAULT_BROWSER_PROFILE_SCHEMA_VERSION
|
|
5333
5269
|
};
|
|
5334
5270
|
nextState = RuntimeEnv.setBrowserProfileCore(nextState, browserProfileCore);
|
|
5335
|
-
|
|
5271
|
+
logger7.info(
|
|
5336
5272
|
`\u5DF2\u751F\u6210\u6D4F\u89C8\u5668\u6307\u7EB9\u771F\u6E90 | env=${String(nextState.envId || "-")} | device=${device} | version=${browserProfileCore.browser_major_version || "-"} | fingerprintVersion=${fingerprintBrowserMajorVersion || "-"} | exactVersion=${generated.exactBrowserMajorVersion ? "true" : "false"} | timezone=${timezoneId}`
|
|
5337
5273
|
);
|
|
5338
5274
|
return { runtimeState: nextState, browserProfileCore };
|
|
@@ -5461,18 +5397,18 @@ var DefaultLaunch = {
|
|
|
5461
5397
|
upstreamLabel = `${parsedProxyUrl.protocol}//${parsedProxyUrl.host}`;
|
|
5462
5398
|
} catch {
|
|
5463
5399
|
}
|
|
5464
|
-
|
|
5400
|
+
logger7.info(
|
|
5465
5401
|
`[\u4EE3\u7406\u5DF2\u542F\u7528] \u672C\u5730=${launchProxy.server} \u4E0A\u6E38=${upstreamLabel || "-"} \u76F4\u8FDE\u57DF\u540D=${(byPassDomains || []).join(",")}`
|
|
5466
5402
|
);
|
|
5467
|
-
|
|
5403
|
+
logger7.info(`[\u6D41\u91CF\u89C2\u6D4B] \u9010\u8BF7\u6C42\u8C03\u8BD5=${Boolean(debugMode) ? "\u5F00\u542F" : "\u5173\u95ED"}\uFF08\u6C47\u603B\u59CB\u7EC8\u5F00\u542F\uFF09`);
|
|
5468
5404
|
} else if (enableByPassLogger && enableProxy && !launchProxy) {
|
|
5469
|
-
|
|
5470
|
-
|
|
5405
|
+
logger7.info("[\u4EE3\u7406\u672A\u542F\u7528] enable_proxy=true \u4F46 proxy_url \u4E3A\u7A7A");
|
|
5406
|
+
logger7.info(`[\u6D41\u91CF\u89C2\u6D4B] \u9010\u8BF7\u6C42\u8C03\u8BD5=${Boolean(debugMode) ? "\u5F00\u542F" : "\u5173\u95ED"}\uFF08\u6C47\u603B\u59CB\u7EC8\u5F00\u542F\uFF09`);
|
|
5471
5407
|
} else if (enableByPassLogger && !enableProxy && proxyUrl) {
|
|
5472
|
-
|
|
5473
|
-
|
|
5408
|
+
logger7.info("[\u4EE3\u7406\u672A\u542F\u7528] enable_proxy=false \u4E14 proxy_url \u5DF2\u914D\u7F6E");
|
|
5409
|
+
logger7.info(`[\u6D41\u91CF\u89C2\u6D4B] \u9010\u8BF7\u6C42\u8C03\u8BD5=${Boolean(debugMode) ? "\u5F00\u542F" : "\u5173\u95ED"}\uFF08\u6C47\u603B\u59CB\u7EC8\u5F00\u542F\uFF09`);
|
|
5474
5410
|
} else if (enableByPassLogger) {
|
|
5475
|
-
|
|
5411
|
+
logger7.info(`[\u6D41\u91CF\u89C2\u6D4B] \u9010\u8BF7\u6C42\u8C03\u8BD5=${Boolean(debugMode) ? "\u5F00\u542F" : "\u5173\u95ED"}\uFF08\u6C47\u603B\u59CB\u7EC8\u5F00\u542F\uFF09`);
|
|
5476
5412
|
}
|
|
5477
5413
|
const onPageCreated = (page) => {
|
|
5478
5414
|
const recommendedGotoOptions = {
|
|
@@ -5494,7 +5430,7 @@ var DefaultLaunch = {
|
|
|
5494
5430
|
}
|
|
5495
5431
|
if (!enableByPassLogger || byPassDomains.length === 0) return;
|
|
5496
5432
|
if (!matched || !matched.rule) return;
|
|
5497
|
-
|
|
5433
|
+
logger7.info(`[\u76F4\u8FDE\u547D\u4E2D] \u89C4\u5219=${matched.rule.pattern} \u57DF\u540D=${matched.hostname} \u8D44\u6E90\u7C7B\u578B=${resourceType} \u65B9\u6CD5=${req.method()} \u5730\u5740=${requestUrl}`);
|
|
5498
5434
|
};
|
|
5499
5435
|
page.on("request", requestHandler);
|
|
5500
5436
|
return recommendedGotoOptions;
|
|
@@ -5551,7 +5487,7 @@ var DefaultLaunch = {
|
|
|
5551
5487
|
// src/internals/launch/cloakbrowser.js
|
|
5552
5488
|
import { execFile } from "node:child_process";
|
|
5553
5489
|
import { promisify } from "node:util";
|
|
5554
|
-
var
|
|
5490
|
+
var logger8 = createInternalLogger("CloakBrowser");
|
|
5555
5491
|
var execFileAsync = promisify(execFile);
|
|
5556
5492
|
var DEFAULT_CLOAK_CRAWLER_BASE_OPTIONS = Object.freeze({
|
|
5557
5493
|
maxConcurrency: 1,
|
|
@@ -5687,7 +5623,7 @@ var forceTerminateBrowsersByFingerprintArg = async (fingerprintArg) => {
|
|
|
5687
5623
|
if (error?.code === 1 || error?.code === "ENOENT") {
|
|
5688
5624
|
return;
|
|
5689
5625
|
}
|
|
5690
|
-
|
|
5626
|
+
logger8.info(`\u5F3A\u5236\u5173\u95ED CloakBrowser \u8FDB\u7A0B\u5931\u8D25\uFF08\u5FFD\u7565\uFF09: ${error?.message || String(error)}`);
|
|
5691
5627
|
});
|
|
5692
5628
|
};
|
|
5693
5629
|
var CloakBrowserLaunch = {
|
|
@@ -5701,8 +5637,21 @@ var CloakBrowserLaunch = {
|
|
|
5701
5637
|
return createStableGotoHook(recommendedGotoOptions);
|
|
5702
5638
|
},
|
|
5703
5639
|
async getPlaywrightCrawlerOptions(options = {}) {
|
|
5704
|
-
const
|
|
5705
|
-
return crawlerOptions
|
|
5640
|
+
const runtime2 = await CloakBrowserLaunch.createPlaywrightCrawlerRuntime(options);
|
|
5641
|
+
return Object.defineProperties(runtime2.crawlerOptions, {
|
|
5642
|
+
cleanup: {
|
|
5643
|
+
enumerable: false,
|
|
5644
|
+
value: runtime2.cleanup
|
|
5645
|
+
},
|
|
5646
|
+
closeActiveBrowsers: {
|
|
5647
|
+
enumerable: false,
|
|
5648
|
+
value: runtime2.closeActiveBrowsers
|
|
5649
|
+
},
|
|
5650
|
+
forceTerminateActiveProcesses: {
|
|
5651
|
+
enumerable: false,
|
|
5652
|
+
value: runtime2.forceTerminateActiveProcesses
|
|
5653
|
+
}
|
|
5654
|
+
});
|
|
5706
5655
|
},
|
|
5707
5656
|
async buildLaunchOptions(options = {}) {
|
|
5708
5657
|
return await buildCloakLaunchOptions(options);
|
|
@@ -5783,39 +5732,18 @@ var CloakBrowserLaunch = {
|
|
|
5783
5732
|
};
|
|
5784
5733
|
|
|
5785
5734
|
// src/launch.js
|
|
5786
|
-
var
|
|
5787
|
-
|
|
5788
|
-
|
|
5789
|
-
if (typeof delegate?.[method] !== "function") {
|
|
5790
|
-
throw new Error(`Launch.${method} is not available in ${getToolkitMode()} mode`);
|
|
5791
|
-
}
|
|
5792
|
-
return delegate[method](...args);
|
|
5793
|
-
};
|
|
5794
|
-
var Launch = {
|
|
5795
|
-
getPlaywrightCrawlerOptions(options = {}) {
|
|
5796
|
-
return callLaunch("getPlaywrightCrawlerOptions", options);
|
|
5797
|
-
},
|
|
5798
|
-
resolveProxyConfiguration(proxyConfiguration = {}) {
|
|
5799
|
-
return callLaunch("resolveProxyConfiguration", proxyConfiguration);
|
|
5800
|
-
},
|
|
5801
|
-
extractFingerprintArg(launchOptions = {}) {
|
|
5802
|
-
return callLaunch("extractFingerprintArg", launchOptions);
|
|
5803
|
-
},
|
|
5804
|
-
createStableGotoHook(recommendedGotoOptions = {}) {
|
|
5805
|
-
return callLaunch("createStableGotoHook", recommendedGotoOptions);
|
|
5806
|
-
},
|
|
5807
|
-
buildLaunchOptions(options = {}) {
|
|
5808
|
-
return callLaunch("buildLaunchOptions", options);
|
|
5809
|
-
},
|
|
5810
|
-
createPlaywrightCrawlerRuntime(options = {}) {
|
|
5811
|
-
return callLaunch("createPlaywrightCrawlerRuntime", options);
|
|
5812
|
-
}
|
|
5735
|
+
var launchStrategies = {
|
|
5736
|
+
[Mode.Default]: DefaultLaunch,
|
|
5737
|
+
[Mode.CloakBrowser]: CloakBrowserLaunch
|
|
5813
5738
|
};
|
|
5739
|
+
var Launch = createDelegatedFacade("Launch", launchStrategies, [
|
|
5740
|
+
"getPlaywrightCrawlerOptions"
|
|
5741
|
+
]);
|
|
5814
5742
|
|
|
5815
5743
|
// src/live-view.js
|
|
5816
5744
|
import express from "express";
|
|
5817
5745
|
import { Actor } from "apify";
|
|
5818
|
-
var
|
|
5746
|
+
var logger9 = createInternalLogger("LiveView");
|
|
5819
5747
|
async function startLiveViewServer(liveViewKey) {
|
|
5820
5748
|
const app = express();
|
|
5821
5749
|
app.get("/", async (req, res) => {
|
|
@@ -5840,13 +5768,13 @@ async function startLiveViewServer(liveViewKey) {
|
|
|
5840
5768
|
</html>
|
|
5841
5769
|
`);
|
|
5842
5770
|
} catch (error) {
|
|
5843
|
-
|
|
5771
|
+
logger9.fail("Live View Server", error);
|
|
5844
5772
|
res.status(500).send(`\u65E0\u6CD5\u52A0\u8F7D\u5C4F\u5E55\u622A\u56FE: ${error.message}`);
|
|
5845
5773
|
}
|
|
5846
5774
|
});
|
|
5847
5775
|
const port = process.env.APIFY_CONTAINER_PORT || 4321;
|
|
5848
5776
|
app.listen(port, () => {
|
|
5849
|
-
|
|
5777
|
+
logger9.success("startLiveViewServer", `\u76D1\u542C\u7AEF\u53E3 ${port}`);
|
|
5850
5778
|
});
|
|
5851
5779
|
}
|
|
5852
5780
|
async function takeLiveScreenshot(liveViewKey, page, logMessage) {
|
|
@@ -5854,10 +5782,10 @@ async function takeLiveScreenshot(liveViewKey, page, logMessage) {
|
|
|
5854
5782
|
const buffer = await capturePageScreenshot(page, { type: "png" });
|
|
5855
5783
|
await Actor.setValue(liveViewKey, buffer, { contentType: "image/png" });
|
|
5856
5784
|
if (logMessage) {
|
|
5857
|
-
|
|
5785
|
+
logger9.info(`(\u622A\u56FE): ${logMessage}`);
|
|
5858
5786
|
}
|
|
5859
5787
|
} catch (e) {
|
|
5860
|
-
|
|
5788
|
+
logger9.warn(`\u65E0\u6CD5\u6355\u83B7 Live View \u5C4F\u5E55\u622A\u56FE: ${e.message}`);
|
|
5861
5789
|
}
|
|
5862
5790
|
}
|
|
5863
5791
|
var useLiveView = (liveViewKey = PresetOfLiveViewKey) => {
|
|
@@ -5966,7 +5894,7 @@ var dragCaptchaAction = async (page, sourceLocator, targetLocator, options = {})
|
|
|
5966
5894
|
};
|
|
5967
5895
|
|
|
5968
5896
|
// src/internals/captcha/bytedance.js
|
|
5969
|
-
var
|
|
5897
|
+
var logger10 = createInternalLogger("Captcha");
|
|
5970
5898
|
var DEFAULT_BYTEDANCE_CAPTCHA_OPTIONS = Object.freeze({
|
|
5971
5899
|
apiType: "31234",
|
|
5972
5900
|
maxRetries: 3,
|
|
@@ -6098,7 +6026,7 @@ var collectCaptchaDebugInfo = async (page, frame, iframeLocator, attempt, phase,
|
|
|
6098
6026
|
}
|
|
6099
6027
|
await writeFile(infoPath, JSON.stringify(payload, null, 2), "utf8");
|
|
6100
6028
|
}
|
|
6101
|
-
|
|
6029
|
+
logger10.info(`\u5DF2\u5199\u51FA\u9A8C\u8BC1\u7801\u8C03\u8BD5\u4EA7\u7269\uFF1A${debugDir}`);
|
|
6102
6030
|
};
|
|
6103
6031
|
var maybeCollectCaptchaDebugInfo = async (page, frame, iframeLocator, attempt, phase, options, extra = null) => {
|
|
6104
6032
|
if (!options.debugArtifacts) {
|
|
@@ -6135,14 +6063,14 @@ var getVerifycenterCaptchaContext = async (page, options) => {
|
|
|
6135
6063
|
if (!isContainerVisible) {
|
|
6136
6064
|
return null;
|
|
6137
6065
|
}
|
|
6138
|
-
|
|
6066
|
+
logger10.info("\u68C0\u6D4B\u5230\u9A8C\u8BC1\u7801\u5BB9\u5668\uFF0C\u5F00\u59CB\u7B49\u5F85 iframe \u52A0\u8F7D\u3002");
|
|
6139
6067
|
let iframeLocator = page.locator(options.iframeSelector).first();
|
|
6140
6068
|
let isIframeVisible = await waitForVisible(
|
|
6141
6069
|
iframeLocator,
|
|
6142
6070
|
options.iframeVisibleTimeoutMs
|
|
6143
6071
|
);
|
|
6144
6072
|
if (!isIframeVisible) {
|
|
6145
|
-
|
|
6073
|
+
logger10.warn("\u672A\u5728\u9884\u671F\u9009\u62E9\u5668\u4E2D\u627E\u5230 verifycenter iframe\uFF0C\u5C1D\u8BD5\u5BB9\u5668\u5185\u4EFB\u610F iframe\u3002");
|
|
6146
6074
|
iframeLocator = captchaContainer.locator(options.iframeFallbackSelector).first();
|
|
6147
6075
|
isIframeVisible = await waitForVisible(
|
|
6148
6076
|
iframeLocator,
|
|
@@ -6152,7 +6080,7 @@ var getVerifycenterCaptchaContext = async (page, options) => {
|
|
|
6152
6080
|
if (!isIframeVisible) {
|
|
6153
6081
|
throw new Error("verifycenter iframe not found inside captcha container.");
|
|
6154
6082
|
}
|
|
6155
|
-
|
|
6083
|
+
logger10.info("\u9A8C\u8BC1\u7801 iframe \u5DF2\u53EF\u89C1\uFF0C\u5F00\u59CB\u89E3\u6790\u5185\u5BB9 frame\u3002");
|
|
6156
6084
|
const frame = await resolveContentFrame(page, iframeLocator, options);
|
|
6157
6085
|
if (!frame) {
|
|
6158
6086
|
throw new Error("Failed to resolve verifycenter iframe content frame.");
|
|
@@ -6268,11 +6196,11 @@ var refreshCaptcha = async (page, frame, options) => {
|
|
|
6268
6196
|
const clicked = await clickCaptchaAction(frame, options.refreshTexts, {
|
|
6269
6197
|
...options,
|
|
6270
6198
|
page,
|
|
6271
|
-
logger:
|
|
6199
|
+
logger: logger10,
|
|
6272
6200
|
forceMouse: true
|
|
6273
6201
|
}).catch(() => false);
|
|
6274
6202
|
if (!clicked) {
|
|
6275
|
-
|
|
6203
|
+
logger10.warn("Refresh button not found.");
|
|
6276
6204
|
return false;
|
|
6277
6205
|
}
|
|
6278
6206
|
await page.waitForTimeout(options.refreshWaitMs);
|
|
@@ -6303,24 +6231,24 @@ var waitForCaptchaChallengeReady = async (page, frame, options) => {
|
|
|
6303
6231
|
const hasGuideMaskVisible = options.guideMaskSelector ? await frame.locator(options.guideMaskSelector).first().isVisible({ timeout: options.loadingIndicatorVisibleTimeoutMs }).catch(() => false) : false;
|
|
6304
6232
|
hasSeenGuideMask = hasSeenGuideMask || hasGuideMaskVisible;
|
|
6305
6233
|
if (hasGuideMaskVisible && !hasLoggedGuideMask) {
|
|
6306
|
-
|
|
6234
|
+
logger10.info("\u68C0\u6D4B\u5230\u9A8C\u8BC1\u7801\u64CD\u4F5C\u5F15\u5BFC\u5C42\uFF0C\u7B49\u5F85\u5176\u6D88\u5931\u540E\u518D\u5F00\u59CB\u8BC6\u522B\u3002");
|
|
6307
6235
|
hasLoggedGuideMask = true;
|
|
6308
6236
|
}
|
|
6309
6237
|
if (!isLoadingVisible && hasVisibleSourceImage && hasVisibleDropTarget && !hasGuideMaskVisible) {
|
|
6310
|
-
|
|
6238
|
+
logger10.info(
|
|
6311
6239
|
hasSeenGuideMask ? "\u9A8C\u8BC1\u7801\u56FE\u7247\u548C\u62D6\u62FD\u533A\u57DF\u5DF2\u5C31\u7EEA\uFF0C\u5F15\u5BFC\u5C42\u5DF2\u6D88\u5931\u3002" : hasSeenLoading ? "\u9A8C\u8BC1\u7801\u56FE\u7247\u5DF2\u52A0\u8F7D\u5B8C\u6210\u3002" : "\u9A8C\u8BC1\u7801\u56FE\u7247\u5DF2\u5C31\u7EEA\u3002"
|
|
6312
6240
|
);
|
|
6313
6241
|
return;
|
|
6314
6242
|
}
|
|
6315
6243
|
if (hasErrorTextVisible) {
|
|
6316
|
-
|
|
6244
|
+
logger10.warn("\u9A8C\u8BC1\u7801\u9762\u677F\u51FA\u73B0\u7F51\u7EDC\u5F02\u5E38\u6587\u6848\uFF0C\u5C1D\u8BD5\u7ACB\u5373\u5237\u65B0\u9898\u76EE\u3002");
|
|
6317
6245
|
await refreshCaptcha(page, frame, options);
|
|
6318
6246
|
refreshDeadline = Date.now() + options.challengeReadyRefreshTimeoutMs;
|
|
6319
6247
|
hasSeenLoading = false;
|
|
6320
6248
|
continue;
|
|
6321
6249
|
}
|
|
6322
6250
|
if ((!hasVisibleSourceImage || !hasVisibleDropTarget) && Date.now() >= refreshDeadline) {
|
|
6323
|
-
|
|
6251
|
+
logger10.warn(`\u9A8C\u8BC1\u7801\u9898\u76EE\u8D85\u8FC7 ${options.challengeReadyRefreshTimeoutMs}ms \u4ECD\u672A\u51C6\u5907\u597D\uFF0C\u5C1D\u8BD5\u5237\u65B0\u9898\u76EE\u3002`);
|
|
6324
6252
|
await refreshCaptcha(page, frame, options);
|
|
6325
6253
|
refreshDeadline = Date.now() + options.challengeReadyRefreshTimeoutMs;
|
|
6326
6254
|
hasSeenLoading = false;
|
|
@@ -6368,7 +6296,7 @@ var dragPromptCaptchaImage = async (page, frame, iframeLocator, sourceLocator, d
|
|
|
6368
6296
|
accepted
|
|
6369
6297
|
};
|
|
6370
6298
|
dragAttempts.push(attemptInfo);
|
|
6371
|
-
|
|
6299
|
+
logger10.info(
|
|
6372
6300
|
`\u9A8C\u8BC1\u7801\u62D6\u62FD\u7B2C ${visualIndex + 1} \u5F20\uFF0C\u65B9\u6848 ${plan.name}\uFF0Cbadge ${baselineState.badgeCount} -> ${afterState.badgeCount}\uFF0Cselected ${baselineState.selectedCount} -> ${afterState.selectedCount}`
|
|
6373
6301
|
);
|
|
6374
6302
|
if (accepted) {
|
|
@@ -6386,7 +6314,7 @@ var dragPromptCaptchaImage = async (page, frame, iframeLocator, sourceLocator, d
|
|
|
6386
6314
|
dragAttempts,
|
|
6387
6315
|
finalState: await readPromptCaptchaState(frame, options)
|
|
6388
6316
|
}).catch((error) => {
|
|
6389
|
-
|
|
6317
|
+
logger10.warn(`\u9A8C\u8BC1\u7801\u62D6\u62FD\u5931\u8D25\u8C03\u8BD5\u6293\u53D6\u5931\u8D25\uFF1A${error?.message || error}`);
|
|
6390
6318
|
});
|
|
6391
6319
|
return {
|
|
6392
6320
|
accepted: false,
|
|
@@ -6403,16 +6331,16 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
|
|
|
6403
6331
|
...options
|
|
6404
6332
|
};
|
|
6405
6333
|
if (!config.token) {
|
|
6406
|
-
|
|
6334
|
+
logger10.warn("\u7F3A\u5C11\u9A8C\u8BC1\u7801 token\uFF0C\u8DF3\u8FC7\u81EA\u52A8\u8BC6\u522B\u3002");
|
|
6407
6335
|
return false;
|
|
6408
6336
|
}
|
|
6409
|
-
|
|
6337
|
+
logger10.info("\u5F53\u524D\u4F7F\u7528\u672Ctool\u2014\u2014\u6D4B\u8BD5\u7248\u672C");
|
|
6410
6338
|
for (let attempt = 1; attempt <= config.maxRetries; attempt += 1) {
|
|
6411
|
-
|
|
6339
|
+
logger10.info(`\u5F00\u59CB\u7B2C ${attempt}/${config.maxRetries} \u6B21 verifycenter \u9A8C\u8BC1\u7801\u8BC6\u522B\u3002`);
|
|
6412
6340
|
try {
|
|
6413
6341
|
const captchaContext = await getVerifycenterCaptchaContext(page, config);
|
|
6414
6342
|
if (!captchaContext) {
|
|
6415
|
-
|
|
6343
|
+
logger10.info("Captcha container is not visible anymore.");
|
|
6416
6344
|
return true;
|
|
6417
6345
|
}
|
|
6418
6346
|
const { iframeLocator, frame } = captchaContext;
|
|
@@ -6425,7 +6353,7 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
|
|
|
6425
6353
|
"ready",
|
|
6426
6354
|
config
|
|
6427
6355
|
).catch((error) => {
|
|
6428
|
-
|
|
6356
|
+
logger10.warn(`\u9A8C\u8BC1\u7801\u8C03\u8BD5\u6293\u53D6\u5931\u8D25\uFF1A${error?.message || error}`);
|
|
6429
6357
|
});
|
|
6430
6358
|
await page.waitForTimeout(config.recognitionDelayMs);
|
|
6431
6359
|
const screenshotBuffer = await iframeLocator.screenshot();
|
|
@@ -6437,16 +6365,16 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
|
|
|
6437
6365
|
});
|
|
6438
6366
|
const serialNumbers = extractCaptchaSerialNumbers(apiResponse);
|
|
6439
6367
|
if (apiResponse?.code !== config.recognitionSuccessCode || serialNumbers.length === 0) {
|
|
6440
|
-
|
|
6368
|
+
logger10.warn(
|
|
6441
6369
|
`\u9A8C\u8BC1\u7801\u8BC6\u522B\u5931\u8D25\u3002code=${apiResponse?.code}, msg=${apiResponse?.msg || "unknown"}`
|
|
6442
6370
|
);
|
|
6443
6371
|
await refreshCaptcha(page, frame, config);
|
|
6444
6372
|
continue;
|
|
6445
6373
|
}
|
|
6446
|
-
|
|
6374
|
+
logger10.info(`\u9A8C\u8BC1\u7801\u8BC6\u522B\u6210\u529F\uFF0C\u5E8F\u53F7\uFF1A${serialNumbers.join(", ")}`);
|
|
6447
6375
|
const dropTarget = await findCaptchaDropTarget(frame, config);
|
|
6448
6376
|
if (!dropTarget) {
|
|
6449
|
-
|
|
6377
|
+
logger10.warn("\u672A\u627E\u5230\u9A8C\u8BC1\u7801\u62D6\u62FD\u76EE\u6807\u533A\u57DF\u3002");
|
|
6450
6378
|
await refreshCaptcha(page, frame, config);
|
|
6451
6379
|
continue;
|
|
6452
6380
|
}
|
|
@@ -6457,7 +6385,7 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
|
|
|
6457
6385
|
`Captcha image indexes could not be normalized. raw=${serialNumbers.join(", ")}, count=${orderedSourceImages.length}`
|
|
6458
6386
|
);
|
|
6459
6387
|
}
|
|
6460
|
-
|
|
6388
|
+
logger10.info(`\u9A8C\u8BC1\u7801\u89C6\u89C9\u4F4D\u5E8F\u6620\u5C04\uFF1A${normalizedIndexes.map((index) => index + 1).join(", ")}`);
|
|
6461
6389
|
for (const imageIndex of normalizedIndexes) {
|
|
6462
6390
|
if (imageIndex < 0 || imageIndex >= orderedSourceImages.length) {
|
|
6463
6391
|
throw new Error(
|
|
@@ -6489,52 +6417,52 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
|
|
|
6489
6417
|
}
|
|
6490
6418
|
}
|
|
6491
6419
|
const beforeSubmitState = await readPromptCaptchaState(frame, config);
|
|
6492
|
-
|
|
6420
|
+
logger10.info(
|
|
6493
6421
|
`\u63D0\u4EA4\u524D\u9A8C\u8BC1\u7801\u72B6\u6001\uFF1Abadge=${beforeSubmitState.badgeCount}, selected=${beforeSubmitState.selectedCount}, submitDisabled=${beforeSubmitState.submitDisabled}`
|
|
6494
6422
|
);
|
|
6495
6423
|
const submitted = await clickCaptchaAction(frame, config.submitTexts, {
|
|
6496
6424
|
...config,
|
|
6497
6425
|
page,
|
|
6498
|
-
logger:
|
|
6426
|
+
logger: logger10,
|
|
6499
6427
|
forceMouse: true,
|
|
6500
6428
|
actionVisibleTimeoutMs: config.submitReadyTimeoutMs
|
|
6501
6429
|
}).catch(() => false);
|
|
6502
6430
|
if (!submitted) {
|
|
6503
|
-
|
|
6431
|
+
logger10.warn("\u672A\u627E\u5230\u63D0\u4EA4\u6309\u94AE\uFF0C\u53EF\u80FD\u4F1A\u81EA\u52A8\u63D0\u4EA4\u3002");
|
|
6504
6432
|
}
|
|
6505
6433
|
await page.waitForTimeout(config.submitWaitMs);
|
|
6506
6434
|
const afterSubmitState = await readPromptCaptchaState(frame, config);
|
|
6507
|
-
|
|
6435
|
+
logger10.info(
|
|
6508
6436
|
`\u63D0\u4EA4\u540E\u9A8C\u8BC1\u7801\u72B6\u6001\uFF1Abadge=${afterSubmitState.badgeCount}, selected=${afterSubmitState.selectedCount}, submitDisabled=${afterSubmitState.submitDisabled}`
|
|
6509
6437
|
);
|
|
6510
6438
|
const stillVisible = await iframeLocator.isVisible({ timeout: config.containerVisibleTimeoutMs }).catch(() => false);
|
|
6511
6439
|
if (!stillVisible) {
|
|
6512
|
-
|
|
6440
|
+
logger10.info("\u9A8C\u8BC1\u7801\u8BC6\u522B\u5E76\u63D0\u4EA4\u6210\u529F\u3002");
|
|
6513
6441
|
return true;
|
|
6514
6442
|
}
|
|
6515
6443
|
await maybeCollectCaptchaDebugInfo(page, frame, iframeLocator, attempt, "submit-still-visible", config, {
|
|
6516
6444
|
beforeSubmitState,
|
|
6517
6445
|
afterSubmitState
|
|
6518
6446
|
}).catch((error) => {
|
|
6519
|
-
|
|
6447
|
+
logger10.warn(`\u63D0\u4EA4\u540E\u9A8C\u8BC1\u7801\u8C03\u8BD5\u6293\u53D6\u5931\u8D25\uFF1A${error?.message || error}`);
|
|
6520
6448
|
});
|
|
6521
|
-
|
|
6449
|
+
logger10.warn("\u63D0\u4EA4\u540E\u9A8C\u8BC1\u7801 iframe \u4ECD\u7136\u53EF\u89C1\uFF0C\u51C6\u5907\u5237\u65B0\u540E\u91CD\u8BD5\u3002");
|
|
6522
6450
|
await page.waitForTimeout(2e3);
|
|
6523
6451
|
await refreshCaptcha(page, frame, config);
|
|
6524
6452
|
} catch (error) {
|
|
6525
|
-
|
|
6453
|
+
logger10.error(`\u7B2C ${attempt}/${config.maxRetries} \u6B21\u9A8C\u8BC1\u7801\u8BC6\u522B\u5931\u8D25\uFF1A${error?.message || error}`);
|
|
6526
6454
|
}
|
|
6527
6455
|
if (attempt < config.maxRetries) {
|
|
6528
6456
|
await page.waitForTimeout(config.retryDelayBaseMs + attempt * config.retryDelayStepMs);
|
|
6529
6457
|
}
|
|
6530
6458
|
}
|
|
6531
|
-
|
|
6459
|
+
logger10.error(`\u91CD\u8BD5 ${config.maxRetries} \u6B21\u540E\uFF0C\u9A8C\u8BC1\u7801\u4ECD\u672A\u8BC6\u522B\u6210\u529F\u3002`);
|
|
6532
6460
|
return false;
|
|
6533
6461
|
}
|
|
6534
6462
|
var sloveCaptcha = solveCaptcha;
|
|
6535
6463
|
|
|
6536
6464
|
// src/chaptcha.js
|
|
6537
|
-
var
|
|
6465
|
+
var logger11 = createInternalLogger("Captcha");
|
|
6538
6466
|
var DEFAULT_CAPTCHA_RECOGNITION_OPTIONS = Object.freeze({
|
|
6539
6467
|
token: "eKJvBfwfN0YRav0-VD_44E2VBSfm7l0YtddUQ7cFySI",
|
|
6540
6468
|
apiUrl: "https://api.jfbym.com/api/YmServer/customApi"
|
|
@@ -6621,7 +6549,7 @@ function useCaptchaMonitor(page, options) {
|
|
|
6621
6549
|
};
|
|
6622
6550
|
})();
|
|
6623
6551
|
}, { selector: domSelector, callbackName: exposedFunctionName, cleanerName });
|
|
6624
|
-
|
|
6552
|
+
logger11.success("useCaptchaMonitor", `DOM \u76D1\u63A7\u5DF2\u542F\u7528\uFF1A${domSelector}`);
|
|
6625
6553
|
cleanupFns.push(async () => {
|
|
6626
6554
|
try {
|
|
6627
6555
|
await page.evaluate((name) => {
|
|
@@ -6645,14 +6573,14 @@ function useCaptchaMonitor(page, options) {
|
|
|
6645
6573
|
}
|
|
6646
6574
|
};
|
|
6647
6575
|
page.on("framenavigated", frameHandler);
|
|
6648
|
-
|
|
6576
|
+
logger11.success("useCaptchaMonitor", `URL \u76D1\u63A7\u5DF2\u542F\u7528\uFF1A${urlPattern}`);
|
|
6649
6577
|
cleanupFns.push(async () => {
|
|
6650
6578
|
page.off("framenavigated", frameHandler);
|
|
6651
6579
|
});
|
|
6652
6580
|
}
|
|
6653
6581
|
return {
|
|
6654
6582
|
stop: async () => {
|
|
6655
|
-
|
|
6583
|
+
logger11.info("\u6B63\u5728\u505C\u6B62\u9A8C\u8BC1\u7801\u76D1\u63A7...");
|
|
6656
6584
|
for (const fn of cleanupFns) {
|
|
6657
6585
|
await fn();
|
|
6658
6586
|
}
|
|
@@ -6691,7 +6619,7 @@ async function solveCaptchaWithStrategy(strategyName, page, options = {}) {
|
|
|
6691
6619
|
);
|
|
6692
6620
|
return strategy.sloveCaptcha(page, resolvedOptions, {
|
|
6693
6621
|
callCaptchaRecognitionApi,
|
|
6694
|
-
logger:
|
|
6622
|
+
logger: logger11
|
|
6695
6623
|
});
|
|
6696
6624
|
}
|
|
6697
6625
|
var Captcha = {
|
|
@@ -6702,7 +6630,7 @@ var Captcha = {
|
|
|
6702
6630
|
// src/mutation.js
|
|
6703
6631
|
import { createHash } from "node:crypto";
|
|
6704
6632
|
import { v4 as uuidv42 } from "uuid";
|
|
6705
|
-
var
|
|
6633
|
+
var logger12 = createInternalLogger("Mutation");
|
|
6706
6634
|
var MUTATION_MONITOR_MODE = Object.freeze({
|
|
6707
6635
|
Added: "added",
|
|
6708
6636
|
Changed: "changed",
|
|
@@ -6735,14 +6663,14 @@ var Mutation = {
|
|
|
6735
6663
|
const stableTime = options.stableTime ?? 5 * 1e3;
|
|
6736
6664
|
const timeout = options.timeout ?? 120 * 1e3;
|
|
6737
6665
|
const onMutation = options.onMutation;
|
|
6738
|
-
|
|
6666
|
+
logger12.start("waitForStable", `\u76D1\u63A7 ${selectorList.length} \u4E2A\u9009\u62E9\u5668, \u7A33\u5B9A\u65F6\u95F4=${stableTime}ms`);
|
|
6739
6667
|
if (initialTimeout > 0) {
|
|
6740
6668
|
const selectorQuery = selectorList.join(",");
|
|
6741
6669
|
try {
|
|
6742
6670
|
await page.waitForSelector(selectorQuery, { timeout: initialTimeout });
|
|
6743
|
-
|
|
6671
|
+
logger12.info(`waitForStable \u5DF2\u68C0\u6D4B\u5230\u5143\u7D20: ${selectorQuery}`);
|
|
6744
6672
|
} catch (e) {
|
|
6745
|
-
|
|
6673
|
+
logger12.warning(`waitForStable \u521D\u59CB\u7B49\u5F85\u8D85\u65F6 (${initialTimeout}ms): ${selectorQuery}`);
|
|
6746
6674
|
throw e;
|
|
6747
6675
|
}
|
|
6748
6676
|
}
|
|
@@ -6758,7 +6686,7 @@ var Mutation = {
|
|
|
6758
6686
|
return "__CONTINUE__";
|
|
6759
6687
|
}
|
|
6760
6688
|
});
|
|
6761
|
-
|
|
6689
|
+
logger12.info("waitForStable \u5DF2\u542F\u7528 onMutation \u56DE\u8C03");
|
|
6762
6690
|
} catch (e) {
|
|
6763
6691
|
}
|
|
6764
6692
|
}
|
|
@@ -6873,9 +6801,9 @@ var Mutation = {
|
|
|
6873
6801
|
{ selectorList, stableTime, timeout, callbackName, hasCallback: !!onMutation }
|
|
6874
6802
|
);
|
|
6875
6803
|
if (result.mutationCount === 0 && result.stableTime === 0) {
|
|
6876
|
-
|
|
6804
|
+
logger12.warning("waitForStable \u672A\u627E\u5230\u53EF\u76D1\u63A7\u7684\u5143\u7D20");
|
|
6877
6805
|
}
|
|
6878
|
-
|
|
6806
|
+
logger12.success("waitForStable", `DOM \u7A33\u5B9A, \u603B\u5171 ${result.mutationCount} \u6B21\u53D8\u5316${result.wasPaused ? ", \u66FE\u6682\u505C\u8BA1\u65F6" : ""}`);
|
|
6879
6807
|
return result;
|
|
6880
6808
|
},
|
|
6881
6809
|
/**
|
|
@@ -7047,29 +6975,29 @@ var Mutation = {
|
|
|
7047
6975
|
return "__CONTINUE__";
|
|
7048
6976
|
}
|
|
7049
6977
|
};
|
|
7050
|
-
|
|
6978
|
+
logger12.start(
|
|
7051
6979
|
"waitForStableAcrossRoots",
|
|
7052
6980
|
`\u76D1\u63A7 ${selectorList.length} \u4E2A\u9009\u62E9\u5668(\u8DE8 root), \u7A33\u5B9A\u65F6\u95F4=${waitForStableTime}ms`
|
|
7053
6981
|
);
|
|
7054
6982
|
if (initialTimeout > 0) {
|
|
7055
6983
|
try {
|
|
7056
6984
|
await page.waitForSelector(selectorQuery, { timeout: initialTimeout });
|
|
7057
|
-
|
|
6985
|
+
logger12.info(`waitForStableAcrossRoots \u5DF2\u68C0\u6D4B\u5230\u5143\u7D20: ${selectorQuery}`);
|
|
7058
6986
|
} catch (e) {
|
|
7059
|
-
|
|
6987
|
+
logger12.warning(`waitForStableAcrossRoots \u521D\u59CB\u7B49\u5F85\u8D85\u65F6 (${initialTimeout}ms): ${selectorQuery}`);
|
|
7060
6988
|
throw e;
|
|
7061
6989
|
}
|
|
7062
6990
|
}
|
|
7063
|
-
let
|
|
7064
|
-
if (!
|
|
7065
|
-
|
|
6991
|
+
let state2 = await buildState();
|
|
6992
|
+
if (!state2?.hasMatched) {
|
|
6993
|
+
logger12.warning("waitForStableAcrossRoots \u672A\u627E\u5230\u53EF\u76D1\u63A7\u7684\u5143\u7D20");
|
|
7066
6994
|
return { mutationCount: 0, stableTime: 0, wasPaused: false };
|
|
7067
6995
|
}
|
|
7068
6996
|
let mutationCount = 0;
|
|
7069
6997
|
let stableSince = 0;
|
|
7070
6998
|
let isPaused = false;
|
|
7071
6999
|
let wasPaused = false;
|
|
7072
|
-
let lastSnapshotKey =
|
|
7000
|
+
let lastSnapshotKey = state2.snapshotKey;
|
|
7073
7001
|
const applyPauseSignal = (signal) => {
|
|
7074
7002
|
const nextPaused = signal === "__PAUSE__";
|
|
7075
7003
|
if (nextPaused) {
|
|
@@ -7083,13 +7011,13 @@ var Mutation = {
|
|
|
7083
7011
|
};
|
|
7084
7012
|
const initialSignal = await invokeMutationCallback({
|
|
7085
7013
|
mutationCount: 0,
|
|
7086
|
-
html:
|
|
7087
|
-
text:
|
|
7088
|
-
mutationNodes:
|
|
7014
|
+
html: state2.html || "",
|
|
7015
|
+
text: state2.text || "",
|
|
7016
|
+
mutationNodes: state2.mutationNodes || []
|
|
7089
7017
|
});
|
|
7090
7018
|
applyPauseSignal(initialSignal);
|
|
7091
7019
|
const deadline = Date.now() + overallTimeout;
|
|
7092
|
-
let lastState =
|
|
7020
|
+
let lastState = state2;
|
|
7093
7021
|
while (Date.now() < deadline) {
|
|
7094
7022
|
await sleep(pollInterval);
|
|
7095
7023
|
lastState = await buildState();
|
|
@@ -7099,7 +7027,7 @@ var Mutation = {
|
|
|
7099
7027
|
if (lastState.snapshotKey !== lastSnapshotKey) {
|
|
7100
7028
|
lastSnapshotKey = lastState.snapshotKey;
|
|
7101
7029
|
mutationCount += 1;
|
|
7102
|
-
|
|
7030
|
+
logger12.info(
|
|
7103
7031
|
`waitForStableAcrossRoots \u53D8\u5316#${mutationCount}, len=${lastState.snapshotLength}, path=${lastState.primaryPath || "unknown"}, preview="${truncate(lastState.text, 120)}"`
|
|
7104
7032
|
);
|
|
7105
7033
|
const signal = await invokeMutationCallback({
|
|
@@ -7112,7 +7040,7 @@ var Mutation = {
|
|
|
7112
7040
|
continue;
|
|
7113
7041
|
}
|
|
7114
7042
|
if (!isPaused && stableSince > 0 && Date.now() - stableSince >= waitForStableTime) {
|
|
7115
|
-
|
|
7043
|
+
logger12.success("waitForStableAcrossRoots", `DOM \u7A33\u5B9A, \u603B\u5171 ${mutationCount} \u6B21\u53D8\u5316${wasPaused ? ", \u66FE\u6682\u505C\u8BA1\u65F6" : ""}`);
|
|
7116
7044
|
return {
|
|
7117
7045
|
mutationCount,
|
|
7118
7046
|
stableTime: waitForStableTime,
|
|
@@ -7139,7 +7067,7 @@ var Mutation = {
|
|
|
7139
7067
|
const onMutation = options.onMutation;
|
|
7140
7068
|
const rawMode = String(options.mode || MUTATION_MONITOR_MODE.Added).toLowerCase();
|
|
7141
7069
|
const mode = [MUTATION_MONITOR_MODE.Added, MUTATION_MONITOR_MODE.Changed, MUTATION_MONITOR_MODE.All].includes(rawMode) ? rawMode : MUTATION_MONITOR_MODE.Added;
|
|
7142
|
-
|
|
7070
|
+
logger12.start("useMonitor", `\u76D1\u63A7 ${selectorList.length} \u4E2A\u9009\u62E9\u5668, mode=${mode}`);
|
|
7143
7071
|
const monitorKey = generateKey("pk_mon");
|
|
7144
7072
|
const callbackName = generateKey("pk_mon_cb");
|
|
7145
7073
|
const cleanerName = generateKey("pk_mon_clean");
|
|
@@ -7282,7 +7210,7 @@ var Mutation = {
|
|
|
7282
7210
|
return total;
|
|
7283
7211
|
};
|
|
7284
7212
|
}, { selectorList, monitorKey, callbackName, cleanerName, hasCallback: !!onMutation, mode });
|
|
7285
|
-
|
|
7213
|
+
logger12.success("useMonitor", "\u76D1\u63A7\u5668\u5DF2\u542F\u52A8");
|
|
7286
7214
|
return {
|
|
7287
7215
|
stop: async () => {
|
|
7288
7216
|
let totalMutations = 0;
|
|
@@ -7295,7 +7223,7 @@ var Mutation = {
|
|
|
7295
7223
|
}, cleanerName);
|
|
7296
7224
|
} catch (e) {
|
|
7297
7225
|
}
|
|
7298
|
-
|
|
7226
|
+
logger12.success("useMonitor.stop", `\u76D1\u63A7\u5DF2\u505C\u6B62, \u5171 ${totalMutations} \u6B21\u53D8\u5316`);
|
|
7299
7227
|
return { totalMutations };
|
|
7300
7228
|
}
|
|
7301
7229
|
};
|
|
@@ -8164,7 +8092,7 @@ var createTemplateLogger = (baseLogger = createBaseLogger()) => {
|
|
|
8164
8092
|
};
|
|
8165
8093
|
var getDefaultBaseLogger = () => createBaseLogger("");
|
|
8166
8094
|
var Logger = {
|
|
8167
|
-
setLogger: (
|
|
8095
|
+
setLogger: (logger16) => setDefaultLogger(logger16),
|
|
8168
8096
|
info: (message) => getDefaultBaseLogger().info(message),
|
|
8169
8097
|
success: (message) => getDefaultBaseLogger().success(message),
|
|
8170
8098
|
warning: (message) => getDefaultBaseLogger().warning(message),
|
|
@@ -8172,8 +8100,8 @@ var Logger = {
|
|
|
8172
8100
|
error: (message) => getDefaultBaseLogger().error(message),
|
|
8173
8101
|
debug: (message) => getDefaultBaseLogger().debug(message),
|
|
8174
8102
|
start: (message) => getDefaultBaseLogger().start(message),
|
|
8175
|
-
useTemplate: (
|
|
8176
|
-
if (
|
|
8103
|
+
useTemplate: (logger16) => {
|
|
8104
|
+
if (logger16) return createTemplateLogger(createBaseLogger("", logger16));
|
|
8177
8105
|
return createTemplateLogger();
|
|
8178
8106
|
}
|
|
8179
8107
|
};
|
|
@@ -8247,7 +8175,7 @@ var LOCATION_NETWORK_SUFFIX_PATTERNS = [
|
|
|
8247
8175
|
];
|
|
8248
8176
|
var cachedStripLogoSrcPromise = null;
|
|
8249
8177
|
var cachedEnrichmentByContext = /* @__PURE__ */ new WeakMap();
|
|
8250
|
-
var
|
|
8178
|
+
var logger13 = createInternalLogger("Watermarkify");
|
|
8251
8179
|
var normalizeText = (value) => String(value || "").trim();
|
|
8252
8180
|
var toInline = (value, maxLen = 200) => {
|
|
8253
8181
|
const text = normalizeText(value);
|
|
@@ -8489,9 +8417,9 @@ var resolveWithCustomResolver = async (page, baseMeta, options = {}) => {
|
|
|
8489
8417
|
location: toInline(resolved.location, 80)
|
|
8490
8418
|
};
|
|
8491
8419
|
if (enrichment.ip || enrichment.location) {
|
|
8492
|
-
|
|
8420
|
+
logger13.info(`\u81EA\u5B9A\u4E49 resolver \u547D\u4E2D: ip=${enrichment.ip || "-"}, loc=${enrichment.location || "-"}`);
|
|
8493
8421
|
} else {
|
|
8494
|
-
|
|
8422
|
+
logger13.warning("\u81EA\u5B9A\u4E49 resolver \u5DF2\u6267\u884C\uFF0C\u4F46\u672A\u8FD4\u56DE IP/Loc");
|
|
8495
8423
|
}
|
|
8496
8424
|
return enrichment;
|
|
8497
8425
|
} finally {
|
|
@@ -8680,12 +8608,12 @@ var normalizeWatermarkifyRenderMode = (value) => {
|
|
|
8680
8608
|
};
|
|
8681
8609
|
var composeScreenshotBufferWithBrowser = async (page, buffer, overlaySvg, imageInfo = {}, options = {}) => {
|
|
8682
8610
|
if (!page || typeof page.context !== "function") {
|
|
8683
|
-
|
|
8611
|
+
logger13.warning("watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u8DF3\u8FC7: \u7F3A\u5C11\u53EF\u7528 page");
|
|
8684
8612
|
return buffer;
|
|
8685
8613
|
}
|
|
8686
8614
|
const renderScope = await openProbePage(page);
|
|
8687
8615
|
if (!renderScope?.page) {
|
|
8688
|
-
|
|
8616
|
+
logger13.warning("watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u8DF3\u8FC7: \u65E0\u6CD5\u521B\u5EFA render page");
|
|
8689
8617
|
return buffer;
|
|
8690
8618
|
}
|
|
8691
8619
|
try {
|
|
@@ -8750,13 +8678,13 @@ var composeScreenshotBufferWithBrowser = async (page, buffer, overlaySvg, imageI
|
|
|
8750
8678
|
fullPage: true,
|
|
8751
8679
|
animations: "disabled"
|
|
8752
8680
|
}).catch((error) => {
|
|
8753
|
-
|
|
8681
|
+
logger13.warning(`watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u5931\u8D25: ${error instanceof Error ? error.message : String(error)}`);
|
|
8754
8682
|
return null;
|
|
8755
8683
|
});
|
|
8756
8684
|
if (Buffer.isBuffer(composed) && composed.length > 0) {
|
|
8757
8685
|
return composed;
|
|
8758
8686
|
}
|
|
8759
|
-
|
|
8687
|
+
logger13.warning("watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u5931\u8D25: \u672A\u5F97\u5230\u6709\u6548\u622A\u56FE\u7ED3\u679C");
|
|
8760
8688
|
return buffer;
|
|
8761
8689
|
} finally {
|
|
8762
8690
|
await renderScope.close().catch(() => {
|
|
@@ -8769,7 +8697,7 @@ var resolveWithIpLookup = async (page, options = {}) => {
|
|
|
8769
8697
|
}
|
|
8770
8698
|
const probeScope = await openProbePage(page);
|
|
8771
8699
|
if (!probeScope?.page) {
|
|
8772
|
-
|
|
8700
|
+
logger13.warning("ipLookup \u8DF3\u8FC7: \u65E0\u6CD5\u521B\u5EFA probe page");
|
|
8773
8701
|
return null;
|
|
8774
8702
|
}
|
|
8775
8703
|
const timeoutMs = Math.max(
|
|
@@ -8778,12 +8706,12 @@ var resolveWithIpLookup = async (page, options = {}) => {
|
|
|
8778
8706
|
);
|
|
8779
8707
|
try {
|
|
8780
8708
|
const probePage = probeScope.page;
|
|
8781
|
-
|
|
8709
|
+
logger13.info(`ipLookup \u5C1D\u8BD5: url=${DEFAULT_IP_LOOKUP_URL}, timeoutMs=${timeoutMs}`);
|
|
8782
8710
|
const response = await probePage.goto(DEFAULT_IP_LOOKUP_URL, {
|
|
8783
8711
|
waitUntil: "commit",
|
|
8784
8712
|
timeout: timeoutMs
|
|
8785
8713
|
}).catch((error) => {
|
|
8786
|
-
|
|
8714
|
+
logger13.warning(`ipLookup \u8BF7\u6C42\u5931\u8D25: url=${DEFAULT_IP_LOOKUP_URL}, error=${error instanceof Error ? error.message : String(error)}`);
|
|
8787
8715
|
return null;
|
|
8788
8716
|
});
|
|
8789
8717
|
const status = response && typeof response.status === "function" ? response.status() : 0;
|
|
@@ -8805,13 +8733,13 @@ var resolveWithIpLookup = async (page, options = {}) => {
|
|
|
8805
8733
|
}
|
|
8806
8734
|
const parsed = parseIpIpJsonResponse(rawText);
|
|
8807
8735
|
if (parsed?.ip || parsed?.location) {
|
|
8808
|
-
|
|
8736
|
+
logger13.info(`ipLookup \u6210\u529F: url=${DEFAULT_IP_LOOKUP_URL}, status=${status || "-"}, contentType=${contentType || "-"}, ip=${parsed.ip || "-"}, loc=${parsed.location || "-"}`);
|
|
8809
8737
|
return parsed;
|
|
8810
8738
|
}
|
|
8811
|
-
|
|
8739
|
+
logger13.warning(`ipLookup \u672A\u89E3\u6790\u51FA IP/Loc: url=${DEFAULT_IP_LOOKUP_URL}, status=${status || "-"}, contentType=${contentType || "-"}, preview=${shortenTail(rawText, 120) || "[empty]"}`);
|
|
8812
8740
|
return null;
|
|
8813
8741
|
} catch (error) {
|
|
8814
|
-
|
|
8742
|
+
logger13.warning(`ipLookup \u6267\u884C\u5F02\u5E38\uFF0C\u672A\u83B7\u5F97 IP/Loc: ${error instanceof Error ? error.message : String(error)}`);
|
|
8815
8743
|
return null;
|
|
8816
8744
|
} finally {
|
|
8817
8745
|
await probeScope.close().catch(() => {
|
|
@@ -8825,10 +8753,10 @@ var resolveEnrichment = async (page, baseMeta, options) => {
|
|
|
8825
8753
|
ip: toInline(options.ip, 80),
|
|
8826
8754
|
location: toInline(options.location, 80)
|
|
8827
8755
|
};
|
|
8828
|
-
|
|
8756
|
+
logger13.info(`enrichment \u5F00\u59CB: host=${baseMeta.hostname || "-"}, hasPresetIp=${Boolean(merged.ip)}, hasPresetLoc=${Boolean(merged.location)}, ipLookup=${options.ipLookup !== false}`);
|
|
8829
8757
|
if (!merged.ip || !merged.location) {
|
|
8830
8758
|
if (cached?.ip || cached?.location) {
|
|
8831
|
-
|
|
8759
|
+
logger13.info(`enrichment \u547D\u4E2D\u4E0A\u4E0B\u6587\u7F13\u5B58: ip=${cached.ip || "-"}, loc=${cached.location || "-"}`);
|
|
8832
8760
|
}
|
|
8833
8761
|
fillEnrichment(merged, cached);
|
|
8834
8762
|
}
|
|
@@ -8852,15 +8780,15 @@ var resolveEnrichment = async (page, baseMeta, options) => {
|
|
|
8852
8780
|
"x-geo-country"
|
|
8853
8781
|
]), 80);
|
|
8854
8782
|
if (!merged.location || isWeakLocationValue(merged.location) && headerLocation) {
|
|
8855
|
-
|
|
8783
|
+
logger13.info(`enrichment \u4F7F\u7528\u54CD\u5E94\u5934\u8865\u5145 Loc: ${headerLocation || "-"}`);
|
|
8856
8784
|
merged.location = headerLocation || merged.location;
|
|
8857
8785
|
}
|
|
8858
8786
|
}
|
|
8859
8787
|
writeCachedEnrichment(page, merged);
|
|
8860
8788
|
if (merged.ip || merged.location) {
|
|
8861
|
-
|
|
8789
|
+
logger13.info(`enrichment \u5B8C\u6210: ip=${merged.ip || "-"}, loc=${merged.location || "-"}`);
|
|
8862
8790
|
} else {
|
|
8863
|
-
|
|
8791
|
+
logger13.warning("enrichment \u5B8C\u6210: \u672A\u83B7\u5F97 IP/Loc");
|
|
8864
8792
|
}
|
|
8865
8793
|
return merged;
|
|
8866
8794
|
};
|
|
@@ -9673,7 +9601,7 @@ var watermarkifyScreenshotBuffer = async (buffer, meta, page = null, options = {
|
|
|
9673
9601
|
}
|
|
9674
9602
|
const imageInfo = readImageInfo(buffer);
|
|
9675
9603
|
if (!imageInfo.width || !imageInfo.height || !imageInfo.mimeType) {
|
|
9676
|
-
|
|
9604
|
+
logger13.warning("watermarkify \u8DF3\u8FC7: \u65E0\u6CD5\u89E3\u6790\u622A\u56FE\u5C3A\u5BF8\u6216\u683C\u5F0F");
|
|
9677
9605
|
return buffer;
|
|
9678
9606
|
}
|
|
9679
9607
|
const isMobileStrip = normalizeDevice(meta.device) === Device.Mobile && hasStrip;
|
|
@@ -9691,7 +9619,7 @@ var watermarkifyScreenshotBuffer = async (buffer, meta, page = null, options = {
|
|
|
9691
9619
|
|
|
9692
9620
|
// src/internals/compression.js
|
|
9693
9621
|
import { Jimp, JimpMime, ResizeStrategy } from "jimp";
|
|
9694
|
-
var
|
|
9622
|
+
var logger14 = createInternalLogger("Compression");
|
|
9695
9623
|
var DEFAULT_SCREENSHOT_MAX_BYTES = 5 * 1024 * 1024;
|
|
9696
9624
|
var DEFAULT_SCREENSHOT_OUTPUT_TYPE = "jpeg";
|
|
9697
9625
|
var DEFAULT_SCREENSHOT_QUALITY = 0.72;
|
|
@@ -9810,18 +9738,18 @@ var compressImageBufferToBase64 = async (buffer, compression) => {
|
|
|
9810
9738
|
return buffer.toString("base64");
|
|
9811
9739
|
}
|
|
9812
9740
|
const result = await compressImageBuffer(buffer, compression).catch((error) => {
|
|
9813
|
-
|
|
9741
|
+
logger14.warning(`captureScreen \u538B\u7F29\u5931\u8D25\uFF0C\u8FD4\u56DE\u539F\u56FE: ${error instanceof Error ? error.message : String(error)}`);
|
|
9814
9742
|
return null;
|
|
9815
9743
|
});
|
|
9816
9744
|
if (!result?.buffer) {
|
|
9817
9745
|
return buffer.toString("base64");
|
|
9818
9746
|
}
|
|
9819
9747
|
if (result.withinLimit) {
|
|
9820
|
-
|
|
9748
|
+
logger14.info(
|
|
9821
9749
|
`captureScreen \u5DF2\u538B\u7F29: ${originalBytes} -> ${result.bytes} bytes, format=${result.format}, quality=${result.quality}, scale=${result.scale}, size=${result.width}x${result.height}`
|
|
9822
9750
|
);
|
|
9823
9751
|
} else {
|
|
9824
|
-
|
|
9752
|
+
logger14.warning(
|
|
9825
9753
|
`captureScreen \u538B\u7F29\u540E\u4ECD\u8D85\u8FC7\u76EE\u6807: ${originalBytes} -> ${result.bytes} bytes, maxBytes=${compression.maxBytes}, format=${result.format}, quality=${result.quality}, scale=${result.scale}`
|
|
9826
9754
|
);
|
|
9827
9755
|
}
|
|
@@ -9829,7 +9757,7 @@ var compressImageBufferToBase64 = async (buffer, compression) => {
|
|
|
9829
9757
|
};
|
|
9830
9758
|
|
|
9831
9759
|
// src/share.js
|
|
9832
|
-
var
|
|
9760
|
+
var logger15 = createInternalLogger("Share");
|
|
9833
9761
|
var DEFAULT_TIMEOUT_MS2 = 50 * 1e3;
|
|
9834
9762
|
var DEFAULT_PAYLOAD_SNAPSHOT_MAX_LEN = 500;
|
|
9835
9763
|
var DEFAULT_POLL_INTERVAL_MS = 120;
|
|
@@ -9966,7 +9894,7 @@ var createDomShareMonitor = async (page, options = {}) => {
|
|
|
9966
9894
|
const onMatch = typeof options.onMatch === "function" ? options.onMatch : null;
|
|
9967
9895
|
const onTelemetry = typeof options.onTelemetry === "function" ? options.onTelemetry : null;
|
|
9968
9896
|
let matched = false;
|
|
9969
|
-
|
|
9897
|
+
logger15.info(`DOM \u76D1\u542C\u51C6\u5907\u6302\u8F7D: selectors=${toJsonInline(selectors, 120)}, mode=${mode}`);
|
|
9970
9898
|
const monitor = await Mutation.useMonitor(page, selectors, {
|
|
9971
9899
|
mode,
|
|
9972
9900
|
onMutation: (context = {}) => {
|
|
@@ -9984,12 +9912,12 @@ ${text}`;
|
|
|
9984
9912
|
});
|
|
9985
9913
|
}
|
|
9986
9914
|
if (mutationCount <= 5 || mutationCount % 50 === 0) {
|
|
9987
|
-
|
|
9915
|
+
logger15.info(`DOM \u53D8\u5316\u5DF2\u6355\u83B7: mutationCount=${mutationCount}, mutationNodes=${mutationNodes.length}`);
|
|
9988
9916
|
}
|
|
9989
9917
|
const [candidate] = Utils.parseLinks(rawDom, { prefix }) || [];
|
|
9990
9918
|
if (!candidate) return;
|
|
9991
9919
|
matched = true;
|
|
9992
|
-
|
|
9920
|
+
logger15.success("captureLink.domHit", `DOM \u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: mutationCount=${mutationCount}, link=${candidate}`);
|
|
9993
9921
|
if (onMatch) {
|
|
9994
9922
|
onMatch({
|
|
9995
9923
|
link: candidate,
|
|
@@ -10005,7 +9933,7 @@ ${text}`;
|
|
|
10005
9933
|
return {
|
|
10006
9934
|
stop: async () => {
|
|
10007
9935
|
const result = await monitor.stop();
|
|
10008
|
-
|
|
9936
|
+
logger15.info(`DOM \u76D1\u542C\u5DF2\u505C\u6B62: totalMutations=${result?.totalMutations || 0}`);
|
|
10009
9937
|
return result;
|
|
10010
9938
|
}
|
|
10011
9939
|
};
|
|
@@ -10054,8 +9982,8 @@ var Share = {
|
|
|
10054
9982
|
if (share.mode === "response" && apiMatchers.length === 0) {
|
|
10055
9983
|
throw new Error("Share.captureLink requires share.xurl[0] api matcher when mode=response");
|
|
10056
9984
|
}
|
|
10057
|
-
|
|
10058
|
-
|
|
9985
|
+
logger15.start("captureLink", `mode=${share.mode}, timeoutMs=${timeoutDisabled ? "disabled" : timeoutMs}, prefix=${share.prefix}`);
|
|
9986
|
+
logger15.info(`captureLink \u914D\u7F6E: xurl=${toJsonInline(share.xurl)}, domMode=${domMode}, domSelectors=${toJsonInline(domSelectors, 120)}`);
|
|
10059
9987
|
const stats = {
|
|
10060
9988
|
actionTimedOut: false,
|
|
10061
9989
|
domMutationCount: 0,
|
|
@@ -10067,7 +9995,7 @@ var Share = {
|
|
|
10067
9995
|
responseSampleUrls: []
|
|
10068
9996
|
};
|
|
10069
9997
|
if (isAborted()) {
|
|
10070
|
-
|
|
9998
|
+
logger15.warning(`captureLink \u5DF2\u53D6\u6D88: ${abortReason()}`);
|
|
10071
9999
|
return {
|
|
10072
10000
|
link: null,
|
|
10073
10001
|
payloadText: "",
|
|
@@ -10090,7 +10018,7 @@ var Share = {
|
|
|
10090
10018
|
link: validated,
|
|
10091
10019
|
payloadText: String(payloadText || "")
|
|
10092
10020
|
};
|
|
10093
|
-
|
|
10021
|
+
logger15.info(`\u5019\u9009\u94FE\u63A5\u5DF2\u786E\u8BA4: source=${source}, link=${validated}`);
|
|
10094
10022
|
return true;
|
|
10095
10023
|
};
|
|
10096
10024
|
const resolveResponseCandidate = (responseText) => {
|
|
@@ -10125,7 +10053,7 @@ var Share = {
|
|
|
10125
10053
|
try {
|
|
10126
10054
|
await monitor.stop();
|
|
10127
10055
|
} catch (error) {
|
|
10128
|
-
|
|
10056
|
+
logger15.warning(`\u505C\u6B62 DOM \u76D1\u542C\u5931\u8D25: ${error instanceof Error ? error.message : String(error)}`);
|
|
10129
10057
|
}
|
|
10130
10058
|
};
|
|
10131
10059
|
const onResponse = async (response) => {
|
|
@@ -10139,29 +10067,29 @@ var Share = {
|
|
|
10139
10067
|
stats.responseSampleUrls.push(url);
|
|
10140
10068
|
}
|
|
10141
10069
|
if (stats.responseObserved <= 5) {
|
|
10142
|
-
|
|
10070
|
+
logger15.info(`\u63A5\u53E3\u54CD\u5E94\u91C7\u6837(${stats.responseObserved}): ${url}`);
|
|
10143
10071
|
}
|
|
10144
10072
|
if (!apiMatchers.some((matcher) => url.includes(matcher))) return;
|
|
10145
10073
|
stats.responseMatched += 1;
|
|
10146
10074
|
stats.lastMatchedUrl = url;
|
|
10147
|
-
|
|
10075
|
+
logger15.info(`\u63A5\u53E3\u547D\u4E2D\u5339\u914D(${stats.responseMatched}): ${url}`);
|
|
10148
10076
|
const text = await response.text();
|
|
10149
10077
|
const hit = resolveResponseCandidate(text);
|
|
10150
10078
|
if (!hit?.link) {
|
|
10151
10079
|
if (stats.responseMatched <= 3) {
|
|
10152
|
-
|
|
10080
|
+
logger15.info(`\u63A5\u53E3\u89E3\u6790\u5B8C\u6210\u4F46\u672A\u63D0\u53D6\u5230\u5206\u4EAB\u94FE\u63A5: payloadSize=${text.length}`);
|
|
10153
10081
|
}
|
|
10154
10082
|
return;
|
|
10155
10083
|
}
|
|
10156
10084
|
stats.responseResolved += 1;
|
|
10157
|
-
|
|
10085
|
+
logger15.success("captureLink.responseHit", `\u63A5\u53E3\u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: url=${url}, link=${hit.link}`);
|
|
10158
10086
|
setCandidate("response", hit.link, hit.payloadText);
|
|
10159
10087
|
} catch (error) {
|
|
10160
|
-
|
|
10088
|
+
logger15.warning(`\u63A5\u53E3\u54CD\u5E94\u5904\u7406\u5F02\u5E38: ${error instanceof Error ? error.message : String(error)}`);
|
|
10161
10089
|
}
|
|
10162
10090
|
};
|
|
10163
10091
|
if (share.mode === "dom") {
|
|
10164
|
-
|
|
10092
|
+
logger15.info("\u5F53\u524D\u4E3A DOM \u6A21\u5F0F\uFF0C\u4EC5\u542F\u7528 DOM \u76D1\u542C");
|
|
10165
10093
|
domMonitor = await createDomShareMonitor(page, {
|
|
10166
10094
|
prefix: share.prefix,
|
|
10167
10095
|
selectors: domSelectors,
|
|
@@ -10176,17 +10104,17 @@ var Share = {
|
|
|
10176
10104
|
});
|
|
10177
10105
|
}
|
|
10178
10106
|
if (share.mode === "response") {
|
|
10179
|
-
|
|
10107
|
+
logger15.info(`\u5F53\u524D\u4E3A\u63A5\u53E3\u6A21\u5F0F\uFF0C\u6302\u8F7D response \u76D1\u542C: apiMatchers=${toJsonInline(apiMatchers, 160)}`);
|
|
10180
10108
|
page.on("response", onResponse);
|
|
10181
10109
|
}
|
|
10182
10110
|
if (share.mode === "custom") {
|
|
10183
|
-
|
|
10111
|
+
logger15.info("\u5F53\u524D\u4E3A custom \u6A21\u5F0F\uFF0C\u5C06\u4F7F\u7528 performActions \u8FD4\u56DE\u503C");
|
|
10184
10112
|
}
|
|
10185
10113
|
const deadline = timeoutDisabled ? Infinity : Date.now() + timeoutMs;
|
|
10186
10114
|
const getRemainingMs = () => timeoutDisabled ? Infinity : Math.max(0, deadline - Date.now());
|
|
10187
10115
|
try {
|
|
10188
10116
|
const actionTimeout = getRemainingMs();
|
|
10189
|
-
|
|
10117
|
+
logger15.start("captureLink.performActions", `\u6267\u884C\u52A8\u4F5C\u9884\u7B97=${timeoutDisabled ? "disabled" : `${actionTimeout}ms`}`);
|
|
10190
10118
|
let actionValue;
|
|
10191
10119
|
if (!isAborted() && actionTimeout > 0) {
|
|
10192
10120
|
let timer = null;
|
|
@@ -10199,30 +10127,30 @@ var Share = {
|
|
|
10199
10127
|
]);
|
|
10200
10128
|
if (timer) clearTimeout(timer);
|
|
10201
10129
|
if (actionResult.type === "error") {
|
|
10202
|
-
|
|
10130
|
+
logger15.fail("captureLink.performActions", actionResult.error);
|
|
10203
10131
|
throw actionResult.error;
|
|
10204
10132
|
}
|
|
10205
10133
|
if (actionResult.type === "timeout") {
|
|
10206
10134
|
stats.actionTimedOut = true;
|
|
10207
|
-
|
|
10135
|
+
logger15.warning(`performActions \u5DF2\u8D85\u65F6 (${actionTimeout}ms)\uFF0C\u52A8\u4F5C\u53EF\u80FD\u4ECD\u5728\u5F02\u6B65\u6267\u884C`);
|
|
10208
10136
|
} else {
|
|
10209
10137
|
actionValue = actionResult.result;
|
|
10210
|
-
|
|
10138
|
+
logger15.success("captureLink.performActions", "\u6267\u884C\u52A8\u4F5C\u5B8C\u6210");
|
|
10211
10139
|
}
|
|
10212
10140
|
}
|
|
10213
10141
|
if (share.mode === "custom") {
|
|
10214
10142
|
const customLink = typeof actionValue === "string" ? actionValue : actionValue?.link || actionValue?.payloadText;
|
|
10215
10143
|
const customPayloadText = typeof actionValue === "string" ? actionValue : actionValue?.payloadText;
|
|
10216
10144
|
if (setCandidate("custom", customLink, customPayloadText)) {
|
|
10217
|
-
|
|
10145
|
+
logger15.success("captureLink.customResult", `custom \u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: link=${candidates.custom.link}`);
|
|
10218
10146
|
} else {
|
|
10219
|
-
|
|
10147
|
+
logger15.warning("performActions \u6267\u884C\u5B8C\u6210\u4F46\u672A\u8FD4\u56DE\u6709\u6548\u5206\u4EAB\u94FE\u63A5");
|
|
10220
10148
|
}
|
|
10221
10149
|
}
|
|
10222
10150
|
let nextProgressLogTs = Date.now() + 3e3;
|
|
10223
10151
|
while (true) {
|
|
10224
10152
|
if (isAborted()) {
|
|
10225
|
-
|
|
10153
|
+
logger15.warning(`captureLink \u5DF2\u53D6\u6D88: ${abortReason()}`);
|
|
10226
10154
|
return {
|
|
10227
10155
|
link: null,
|
|
10228
10156
|
payloadText: "",
|
|
@@ -10232,7 +10160,7 @@ var Share = {
|
|
|
10232
10160
|
}
|
|
10233
10161
|
const selected = candidates[share.mode];
|
|
10234
10162
|
if (selected?.link) {
|
|
10235
|
-
|
|
10163
|
+
logger15.success("captureLink", `\u6355\u83B7\u6210\u529F: source=${share.mode}, link=${selected.link}`);
|
|
10236
10164
|
return {
|
|
10237
10165
|
link: selected.link,
|
|
10238
10166
|
payloadText: selected.payloadText,
|
|
@@ -10245,7 +10173,7 @@ var Share = {
|
|
|
10245
10173
|
if (remaining <= 0) break;
|
|
10246
10174
|
const now = Date.now();
|
|
10247
10175
|
if (now >= nextProgressLogTs) {
|
|
10248
|
-
|
|
10176
|
+
logger15.info(
|
|
10249
10177
|
`captureLink \u7B49\u5F85\u4E2D: remaining=${timeoutDisabled ? "disabled" : `${remaining}ms`}, domMutationCount=${stats.domMutationCount}, responseMatched=${stats.responseMatched}`
|
|
10250
10178
|
);
|
|
10251
10179
|
nextProgressLogTs = now + 5e3;
|
|
@@ -10253,11 +10181,11 @@ var Share = {
|
|
|
10253
10181
|
await delay5(Math.max(0, Math.min(DEFAULT_POLL_INTERVAL_MS, remaining)));
|
|
10254
10182
|
}
|
|
10255
10183
|
if (!timeoutDisabled && share.mode === "response" && stats.responseMatched === 0) {
|
|
10256
|
-
|
|
10184
|
+
logger15.warning(
|
|
10257
10185
|
`\u63A5\u53E3\u76D1\u542C\u672A\u547D\u4E2D: apiMatchers=${toJsonInline(apiMatchers, 220)}, \u54CD\u5E94\u6837\u672CURLs=${toJsonInline(stats.responseSampleUrls, 420)}`
|
|
10258
10186
|
);
|
|
10259
10187
|
}
|
|
10260
|
-
|
|
10188
|
+
logger15.warning(
|
|
10261
10189
|
`captureLink ${timeoutDisabled ? "\u672A\u62FF\u5230\u94FE\u63A5" : "\u8D85\u65F6\u672A\u62FF\u5230\u94FE\u63A5"}: mode=${share.mode}, actionTimedOut=${stats.actionTimedOut}, domMutationCount=${stats.domMutationCount}, responseObserved=${stats.responseObserved}, responseMatched=${stats.responseMatched}, lastMatchedUrl=${stats.lastMatchedUrl || "none"}`
|
|
10262
10190
|
);
|
|
10263
10191
|
return {
|
|
@@ -10269,7 +10197,7 @@ var Share = {
|
|
|
10269
10197
|
} finally {
|
|
10270
10198
|
if (share.mode === "response") {
|
|
10271
10199
|
page.off("response", onResponse);
|
|
10272
|
-
|
|
10200
|
+
logger15.info("response \u76D1\u542C\u5DF2\u5378\u8F7D");
|
|
10273
10201
|
}
|
|
10274
10202
|
await stopDomMonitor();
|
|
10275
10203
|
}
|