@skrillex1224/playwright-toolkit 2.1.278 → 2.1.280
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser.js +165 -157
- package/dist/browser.js.map +4 -4
- package/dist/index.cjs +480 -583
- package/dist/index.cjs.map +4 -4
- package/dist/index.js +480 -583
- package/dist/index.js.map +4 -4
- package/package.json +1 -1
package/dist/index.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;
|
|
4751
|
+
}
|
|
4752
|
+
const resolvedTarget = resolveNativeTarget2(page, target);
|
|
4753
|
+
if (throwOnMissing || await targetExists(resolvedTarget)) {
|
|
4754
|
+
return resolvedTarget;
|
|
4661
4755
|
}
|
|
4662
|
-
return
|
|
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,264 +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
|
-
if (options && options.force != null) {
|
|
4687
|
-
actionOptions.force = options.force;
|
|
4688
|
-
}
|
|
4689
4785
|
const humanConfig = buildTypingHumanConfig(options);
|
|
4690
4786
|
if (humanConfig) {
|
|
4691
4787
|
actionOptions.human_config = humanConfig;
|
|
4692
4788
|
}
|
|
4693
4789
|
return actionOptions;
|
|
4694
4790
|
};
|
|
4695
|
-
var getErrorMessage = (error) => {
|
|
4696
|
-
if (typeof error === "string") return error;
|
|
4697
|
-
if (error && typeof error.message === "string") return error.message;
|
|
4698
|
-
return String(error ?? "");
|
|
4699
|
-
};
|
|
4700
|
-
var isPointerEventsCoveredError = (error) => {
|
|
4701
|
-
const message = getErrorMessage(error).toLowerCase();
|
|
4702
|
-
return message.includes("pointer_events") && (message.includes("covered by") || message.includes("receiving events"));
|
|
4703
|
-
};
|
|
4704
|
-
var withPointerEventsForceFallback = async (label, options, operation) => {
|
|
4705
|
-
try {
|
|
4706
|
-
return await operation(options);
|
|
4707
|
-
} catch (error) {
|
|
4708
|
-
if (options?.force || !isPointerEventsCoveredError(error)) {
|
|
4709
|
-
throw error;
|
|
4710
|
-
}
|
|
4711
|
-
logger7.warn(`${label}: cloakbrowser pointer_events check failed, retrying with force=true (${getErrorMessage(error)})`);
|
|
4712
|
-
return await operation({
|
|
4713
|
-
...options || {},
|
|
4714
|
-
force: true
|
|
4715
|
-
});
|
|
4716
|
-
}
|
|
4717
|
-
};
|
|
4718
|
-
var ensureDesktopHumanized = async (page) => {
|
|
4719
|
-
if (!page || typeof page !== "object") {
|
|
4720
|
-
throw new Error("Humanize requires a Playwright page");
|
|
4721
|
-
}
|
|
4722
|
-
const humanModule = await loadCloakHumanModule();
|
|
4723
|
-
if (page._original && page._humanCursor) {
|
|
4724
|
-
humanizedPages.add(page);
|
|
4725
|
-
return humanModule;
|
|
4726
|
-
}
|
|
4727
|
-
if (humanizedPages.has(page)) {
|
|
4728
|
-
return humanModule;
|
|
4729
|
-
}
|
|
4730
|
-
const config = page._humanCfg || humanModule.resolveConfig?.("default") || humanModule.resolveConfig?.();
|
|
4731
|
-
const cursor = page._humanCursor || { x: 0, y: 0, initialized: false };
|
|
4732
|
-
humanModule.patchPage(page, config, cursor);
|
|
4733
|
-
humanizedPages.add(page);
|
|
4734
|
-
return humanModule;
|
|
4735
|
-
};
|
|
4736
|
-
var patchHandle = async (page, handle) => {
|
|
4737
|
-
if (!handle || typeof handle !== "object") return handle;
|
|
4738
|
-
const humanModule = await ensureDesktopHumanized(page);
|
|
4739
|
-
humanModule.patchSingleElementHandle(
|
|
4740
|
-
handle,
|
|
4741
|
-
page,
|
|
4742
|
-
page._humanCfg,
|
|
4743
|
-
page._humanCursor,
|
|
4744
|
-
page._humanRaw,
|
|
4745
|
-
page._humanRawKb,
|
|
4746
|
-
page._humanOriginals,
|
|
4747
|
-
page._stealth
|
|
4748
|
-
);
|
|
4749
|
-
return handle;
|
|
4750
|
-
};
|
|
4751
|
-
var resolvePatchedTarget = async (page, target, { throwOnMissing = true } = {}) => {
|
|
4752
|
-
if (target == null) {
|
|
4753
|
-
return { target: null, dispose: null };
|
|
4754
|
-
}
|
|
4755
|
-
if (typeof target === "string") {
|
|
4756
|
-
const handle = await page.$(target);
|
|
4757
|
-
if (!handle) {
|
|
4758
|
-
if (throwOnMissing) {
|
|
4759
|
-
throw new Error(`\u627E\u4E0D\u5230\u5143\u7D20 ${String(target)}`);
|
|
4760
|
-
}
|
|
4761
|
-
return { target: null, dispose: null };
|
|
4762
|
-
}
|
|
4763
|
-
return { target: handle, dispose: null };
|
|
4764
|
-
}
|
|
4765
|
-
if (typeof target.elementHandle === "function") {
|
|
4766
|
-
const handle = await target.elementHandle();
|
|
4767
|
-
if (!handle) {
|
|
4768
|
-
if (throwOnMissing) {
|
|
4769
|
-
throw new Error("\u627E\u4E0D\u5230 locator \u5BF9\u5E94\u7684\u5143\u7D20");
|
|
4770
|
-
}
|
|
4771
|
-
return { target: null, dispose: null };
|
|
4772
|
-
}
|
|
4773
|
-
await patchHandle(page, handle);
|
|
4774
|
-
return {
|
|
4775
|
-
target: handle,
|
|
4776
|
-
dispose: async () => {
|
|
4777
|
-
await handle.dispose().catch(() => {
|
|
4778
|
-
});
|
|
4779
|
-
}
|
|
4780
|
-
};
|
|
4781
|
-
}
|
|
4782
|
-
await patchHandle(page, target);
|
|
4783
|
-
return { target, dispose: null };
|
|
4784
|
-
};
|
|
4785
4791
|
var jitterSleep = async (baseMs, jitterPercent = 0.3) => {
|
|
4786
4792
|
await delay4(jitterMs(baseMs, jitterPercent));
|
|
4787
4793
|
};
|
|
4788
|
-
var
|
|
4789
|
-
await ensureDesktopHumanized(page);
|
|
4794
|
+
var moveCursorToPoint = async (page, point) => {
|
|
4790
4795
|
await page.mouse.move(Number(point.x), Number(point.y));
|
|
4791
4796
|
return true;
|
|
4792
4797
|
};
|
|
4793
|
-
var doDesktopHumanClick = async (page, target, options = {}) => {
|
|
4794
|
-
await ensureDesktopHumanized(page);
|
|
4795
|
-
return await withPointerEventsForceFallback("humanClick", options, async (effectiveOptions = {}) => {
|
|
4796
|
-
if (target == null) {
|
|
4797
|
-
const cursor = page._humanCursor || { x: 0, y: 0 };
|
|
4798
|
-
await page.mouse.click(cursor.x || 0, cursor.y || 0);
|
|
4799
|
-
return true;
|
|
4800
|
-
}
|
|
4801
|
-
if (isPoint2(target)) {
|
|
4802
|
-
return humanMoveToPoint(page, target).then(async () => {
|
|
4803
|
-
await page.mouse.click(Number(target.x), Number(target.y));
|
|
4804
|
-
return true;
|
|
4805
|
-
});
|
|
4806
|
-
}
|
|
4807
|
-
const throwOnMissing = effectiveOptions.throwOnMissing !== false;
|
|
4808
|
-
if (typeof target === "string") {
|
|
4809
|
-
if (!throwOnMissing) {
|
|
4810
|
-
const existingHandle = await page.$(target);
|
|
4811
|
-
if (!existingHandle) {
|
|
4812
|
-
return false;
|
|
4813
|
-
}
|
|
4814
|
-
await existingHandle.click(buildActionOptions(effectiveOptions));
|
|
4815
|
-
return true;
|
|
4816
|
-
}
|
|
4817
|
-
await page.click(target, buildActionOptions(effectiveOptions));
|
|
4818
|
-
return true;
|
|
4819
|
-
}
|
|
4820
|
-
const { target: resolvedTarget, dispose } = await resolvePatchedTarget(page, target, { throwOnMissing });
|
|
4821
|
-
try {
|
|
4822
|
-
if (!resolvedTarget) {
|
|
4823
|
-
return false;
|
|
4824
|
-
}
|
|
4825
|
-
if (typeof resolvedTarget.click === "function") {
|
|
4826
|
-
await resolvedTarget.click(buildActionOptions(effectiveOptions));
|
|
4827
|
-
return true;
|
|
4828
|
-
}
|
|
4829
|
-
const box = await resolvedTarget.boundingBox?.();
|
|
4830
|
-
if (!box) {
|
|
4831
|
-
if (throwOnMissing) {
|
|
4832
|
-
throw new Error("\u65E0\u6CD5\u83B7\u53D6\u5143\u7D20\u4F4D\u7F6E");
|
|
4833
|
-
}
|
|
4834
|
-
return false;
|
|
4835
|
-
}
|
|
4836
|
-
await page.mouse.click(box.x + box.width / 2, box.y + box.height / 2);
|
|
4837
|
-
return true;
|
|
4838
|
-
} finally {
|
|
4839
|
-
if (typeof dispose === "function") {
|
|
4840
|
-
await dispose();
|
|
4841
|
-
}
|
|
4842
|
-
}
|
|
4843
|
-
});
|
|
4844
|
-
};
|
|
4845
4798
|
var CloakBrowserHumanize = {
|
|
4846
4799
|
jitterMs(base, jitterPercent = 0.3) {
|
|
4847
4800
|
return jitterMs(base, jitterPercent);
|
|
4848
4801
|
},
|
|
4849
4802
|
async initializeCursor(page) {
|
|
4850
4803
|
if (isMobilePage(page)) {
|
|
4851
|
-
return MobileHumanize.initializeCursor(page);
|
|
4804
|
+
return await MobileHumanize.initializeCursor(page);
|
|
4852
4805
|
}
|
|
4853
|
-
|
|
4854
|
-
logger7.debug("initializeCursor: cloakbrowser human layer ready");
|
|
4806
|
+
return Boolean(page);
|
|
4855
4807
|
},
|
|
4856
4808
|
async humanMove(page, target) {
|
|
4857
4809
|
if (isMobilePage(page)) {
|
|
4858
4810
|
return await MobileHumanize.humanMove(page, target);
|
|
4859
4811
|
}
|
|
4860
|
-
await ensureDesktopHumanized(page);
|
|
4861
4812
|
if (isPoint2(target)) {
|
|
4862
|
-
return await
|
|
4813
|
+
return await moveCursorToPoint(page, target);
|
|
4863
4814
|
}
|
|
4864
|
-
const
|
|
4865
|
-
|
|
4866
|
-
|
|
4867
|
-
|
|
4868
|
-
|
|
4869
|
-
|
|
4870
|
-
await resolvedTarget.hover();
|
|
4871
|
-
return true;
|
|
4872
|
-
}
|
|
4873
|
-
const box = await resolvedTarget.boundingBox?.();
|
|
4874
|
-
if (!box) {
|
|
4875
|
-
return false;
|
|
4876
|
-
}
|
|
4877
|
-
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 });
|
|
4878
4821
|
return true;
|
|
4879
|
-
} finally {
|
|
4880
|
-
if (typeof dispose === "function") {
|
|
4881
|
-
await dispose();
|
|
4882
|
-
}
|
|
4883
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
|
+
});
|
|
4884
4831
|
},
|
|
4885
4832
|
async humanScroll(page, target, options = {}) {
|
|
4886
4833
|
if (isMobilePage(page)) {
|
|
4887
4834
|
return await MobileHumanize.humanScroll(page, target, options);
|
|
4888
4835
|
}
|
|
4889
|
-
const
|
|
4890
|
-
if (
|
|
4891
|
-
|
|
4892
|
-
try {
|
|
4893
|
-
const result = await humanModule.scrollToElement(
|
|
4894
|
-
page,
|
|
4895
|
-
page._humanRaw,
|
|
4896
|
-
target,
|
|
4897
|
-
x,
|
|
4898
|
-
y,
|
|
4899
|
-
page._humanCfg,
|
|
4900
|
-
options.timeout
|
|
4901
|
-
);
|
|
4902
|
-
if (page._humanCursor) {
|
|
4903
|
-
page._humanCursor.x = result.cursorX;
|
|
4904
|
-
page._humanCursor.y = result.cursorY;
|
|
4905
|
-
}
|
|
4906
|
-
return {
|
|
4907
|
-
element: await page.$(target),
|
|
4908
|
-
didScroll: Boolean(result.didScroll),
|
|
4909
|
-
restore: null
|
|
4910
|
-
};
|
|
4911
|
-
} catch (error) {
|
|
4912
|
-
logger7.warn(`humanScroll: cloakbrowser \u6EDA\u52A8\u5931\u8D25\uFF0C\u8DF3\u8FC7 (${error?.message || error})`);
|
|
4913
|
-
return { element: null, didScroll: false, restore: null };
|
|
4914
|
-
}
|
|
4915
|
-
}
|
|
4916
|
-
const { target: resolvedTarget, dispose } = await resolvePatchedTarget(page, target, { throwOnMissing: false });
|
|
4917
|
-
try {
|
|
4918
|
-
if (!resolvedTarget) {
|
|
4919
|
-
return { element: null, didScroll: false, restore: null };
|
|
4920
|
-
}
|
|
4921
|
-
const before = await page.evaluate(() => ({ x: window.scrollX, y: window.scrollY }));
|
|
4922
|
-
await resolvedTarget.scrollIntoViewIfNeeded?.();
|
|
4923
|
-
const after = await page.evaluate(() => ({ x: window.scrollX, y: window.scrollY }));
|
|
4924
|
-
return {
|
|
4925
|
-
element: resolvedTarget,
|
|
4926
|
-
didScroll: before.x !== after.x || before.y !== after.y,
|
|
4927
|
-
restore: null
|
|
4928
|
-
};
|
|
4929
|
-
} finally {
|
|
4930
|
-
if (typeof dispose === "function") {
|
|
4931
|
-
await dispose();
|
|
4932
|
-
}
|
|
4836
|
+
const resolvedTarget = await resolveActionTarget(page, target, { throwOnMissing: false });
|
|
4837
|
+
if (!resolvedTarget) {
|
|
4838
|
+
return { element: null, didScroll: false, restore: null };
|
|
4933
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
|
+
};
|
|
4934
4849
|
},
|
|
4935
4850
|
async humanClick(page, target, options = {}) {
|
|
4936
4851
|
if (isMobilePage(page)) {
|
|
4937
4852
|
return await MobileHumanize.humanClick(page, target, options);
|
|
4938
4853
|
}
|
|
4939
|
-
|
|
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;
|
|
4940
4882
|
},
|
|
4941
4883
|
async randomSleep(pageOrBaseMs, maybeBaseMs, maybeJitterPercent) {
|
|
4942
4884
|
if (isPageLike2(pageOrBaseMs)) {
|
|
@@ -4952,7 +4894,6 @@ var CloakBrowserHumanize = {
|
|
|
4952
4894
|
if (isMobilePage(page)) {
|
|
4953
4895
|
return await MobileHumanize.simulateGaze(page, baseDurationMs);
|
|
4954
4896
|
}
|
|
4955
|
-
await ensureDesktopHumanized(page);
|
|
4956
4897
|
const durationMs = jitterMs(baseDurationMs, 0.4);
|
|
4957
4898
|
const startTime = Date.now();
|
|
4958
4899
|
const viewportSize = page.viewportSize() || { width: 1365, height: 900 };
|
|
@@ -4968,31 +4909,21 @@ var CloakBrowserHumanize = {
|
|
|
4968
4909
|
if (isMobilePage(page)) {
|
|
4969
4910
|
return await MobileHumanize.humanType(page, selector, text, options);
|
|
4970
4911
|
}
|
|
4971
|
-
|
|
4972
|
-
|
|
4973
|
-
|
|
4974
|
-
|
|
4975
|
-
|
|
4976
|
-
|
|
4977
|
-
|
|
4978
|
-
|
|
4979
|
-
|
|
4980
|
-
|
|
4981
|
-
throw new Error("\u76EE\u6807\u5143\u7D20\u4E0D\u652F\u6301 type()");
|
|
4982
|
-
}
|
|
4983
|
-
await resolvedTarget.type(text, actionOptions);
|
|
4984
|
-
} finally {
|
|
4985
|
-
if (typeof dispose === "function") {
|
|
4986
|
-
await dispose();
|
|
4987
|
-
}
|
|
4988
|
-
}
|
|
4989
|
-
});
|
|
4912
|
+
const actionOptions = buildActionOptions(options);
|
|
4913
|
+
if (typeof selector === "string") {
|
|
4914
|
+
await page.type(selector, text, actionOptions);
|
|
4915
|
+
return;
|
|
4916
|
+
}
|
|
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()");
|
|
4920
|
+
}
|
|
4921
|
+
await resolvedTarget.type(text, actionOptions);
|
|
4990
4922
|
},
|
|
4991
4923
|
async humanPress(page, targetOrKey, maybeKey, options = {}) {
|
|
4992
4924
|
if (isMobilePage(page)) {
|
|
4993
4925
|
return await MobileHumanize.humanPress(page, targetOrKey, maybeKey, options);
|
|
4994
4926
|
}
|
|
4995
|
-
await ensureDesktopHumanized(page);
|
|
4996
4927
|
const hasTarget = typeof maybeKey === "string";
|
|
4997
4928
|
const key = hasTarget ? maybeKey : targetOrKey;
|
|
4998
4929
|
const pressOptions = hasTarget ? options : maybeKey || options;
|
|
@@ -5004,55 +4935,61 @@ var CloakBrowserHumanize = {
|
|
|
5004
4935
|
});
|
|
5005
4936
|
return true;
|
|
5006
4937
|
}
|
|
5007
|
-
|
|
5008
|
-
|
|
5009
|
-
|
|
5010
|
-
|
|
5011
|
-
|
|
5012
|
-
|
|
5013
|
-
|
|
5014
|
-
|
|
5015
|
-
|
|
5016
|
-
|
|
5017
|
-
|
|
5018
|
-
|
|
5019
|
-
|
|
5020
|
-
|
|
5021
|
-
|
|
5022
|
-
|
|
5023
|
-
|
|
5024
|
-
|
|
5025
|
-
|
|
5026
|
-
|
|
5027
|
-
|
|
5028
|
-
|
|
5029
|
-
...effectiveOptions.keyboardOptions || {},
|
|
5030
|
-
delay: jitterMs(effectiveOptions.holdDelay ?? 45, 0.5)
|
|
5031
|
-
});
|
|
5032
|
-
return true;
|
|
5033
|
-
} finally {
|
|
5034
|
-
if (typeof dispose === "function") {
|
|
5035
|
-
await dispose();
|
|
5036
|
-
}
|
|
5037
|
-
}
|
|
4938
|
+
if (typeof targetOrKey === "string") {
|
|
4939
|
+
await page.press(targetOrKey, key, buildActionOptions(pressOptions));
|
|
4940
|
+
return true;
|
|
4941
|
+
}
|
|
4942
|
+
const resolvedTarget = await resolveActionTarget(page, targetOrKey, {
|
|
4943
|
+
throwOnMissing: pressOptions.throwOnMissing !== false
|
|
4944
|
+
});
|
|
4945
|
+
if (!resolvedTarget) {
|
|
4946
|
+
return false;
|
|
4947
|
+
}
|
|
4948
|
+
if (typeof resolvedTarget.press === "function") {
|
|
4949
|
+
await resolvedTarget.press(key, buildActionOptions(pressOptions));
|
|
4950
|
+
return true;
|
|
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)
|
|
5038
4960
|
});
|
|
4961
|
+
return true;
|
|
5039
4962
|
},
|
|
5040
4963
|
async humanClear(page, selector) {
|
|
5041
4964
|
if (isMobilePage(page)) {
|
|
5042
4965
|
return await MobileHumanize.humanClear(page, selector);
|
|
5043
4966
|
}
|
|
5044
|
-
|
|
5045
|
-
|
|
5046
|
-
|
|
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());
|
|
5047
4985
|
return;
|
|
5048
4986
|
}
|
|
5049
|
-
|
|
4987
|
+
throw new Error("\u76EE\u6807\u5143\u7D20\u4E0D\u652F\u6301 clear()");
|
|
5050
4988
|
},
|
|
5051
4989
|
async warmUpBrowsing(page, baseDuration = 3500) {
|
|
5052
4990
|
if (isMobilePage(page)) {
|
|
5053
4991
|
return await MobileHumanize.warmUpBrowsing(page, baseDuration);
|
|
5054
4992
|
}
|
|
5055
|
-
await ensureDesktopHumanized(page);
|
|
5056
4993
|
const durationMs = jitterMs(baseDuration, 0.4);
|
|
5057
4994
|
const startTime = Date.now();
|
|
5058
4995
|
const viewportSize = page.viewportSize() || { width: 1365, height: 900 };
|
|
@@ -5078,7 +5015,6 @@ var CloakBrowserHumanize = {
|
|
|
5078
5015
|
if (isMobilePage(page)) {
|
|
5079
5016
|
return await MobileHumanize.naturalScroll(page, direction, distance, baseSteps);
|
|
5080
5017
|
}
|
|
5081
|
-
await ensureDesktopHumanized(page);
|
|
5082
5018
|
const steps = Math.max(3, baseSteps + Math.floor(Math.random() * 3) - 1);
|
|
5083
5019
|
const actualDistance = jitterMs(distance, 0.15);
|
|
5084
5020
|
const sign = direction === "down" ? 1 : -1;
|
|
@@ -5093,55 +5029,24 @@ var CloakBrowserHumanize = {
|
|
|
5093
5029
|
};
|
|
5094
5030
|
|
|
5095
5031
|
// src/humanize.js
|
|
5096
|
-
var
|
|
5097
|
-
|
|
5098
|
-
|
|
5099
|
-
|
|
5100
|
-
|
|
5101
|
-
|
|
5102
|
-
|
|
5103
|
-
|
|
5104
|
-
|
|
5105
|
-
|
|
5106
|
-
|
|
5107
|
-
|
|
5108
|
-
|
|
5109
|
-
|
|
5110
|
-
|
|
5111
|
-
|
|
5112
|
-
|
|
5113
|
-
|
|
5114
|
-
humanScroll(page, target, options = {}) {
|
|
5115
|
-
return callHumanize("humanScroll", page, target, options);
|
|
5116
|
-
},
|
|
5117
|
-
humanClick(page, target, options = {}) {
|
|
5118
|
-
return callHumanize("humanClick", page, target, options);
|
|
5119
|
-
},
|
|
5120
|
-
randomSleep(pageOrBaseMs, maybeBaseMs, maybeJitterPercent) {
|
|
5121
|
-
return callHumanize("randomSleep", pageOrBaseMs, maybeBaseMs, maybeJitterPercent);
|
|
5122
|
-
},
|
|
5123
|
-
simulateGaze(page, baseDurationMs = 2500) {
|
|
5124
|
-
return callHumanize("simulateGaze", page, baseDurationMs);
|
|
5125
|
-
},
|
|
5126
|
-
humanType(page, selector, text, options = {}) {
|
|
5127
|
-
return callHumanize("humanType", page, selector, text, options);
|
|
5128
|
-
},
|
|
5129
|
-
humanPress(page, targetOrKey, maybeKey, options = {}) {
|
|
5130
|
-
if (typeof maybeKey === "string") {
|
|
5131
|
-
return callHumanize("humanPress", page, targetOrKey, maybeKey, options);
|
|
5132
|
-
}
|
|
5133
|
-
return callHumanize("humanPress", page, targetOrKey, maybeKey || options);
|
|
5134
|
-
},
|
|
5135
|
-
humanClear(page, selector) {
|
|
5136
|
-
return callHumanize("humanClear", page, selector);
|
|
5137
|
-
},
|
|
5138
|
-
warmUpBrowsing(page, baseDuration = 3500) {
|
|
5139
|
-
return callHumanize("warmUpBrowsing", page, baseDuration);
|
|
5140
|
-
},
|
|
5141
|
-
naturalScroll(page, direction = "down", distance = 300, baseSteps = 5) {
|
|
5142
|
-
return callHumanize("naturalScroll", page, direction, distance, baseSteps);
|
|
5143
|
-
}
|
|
5144
|
-
};
|
|
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
|
+
]);
|
|
5145
5050
|
|
|
5146
5051
|
// src/internals/launch/default.js
|
|
5147
5052
|
import { execFileSync } from "node:child_process";
|
|
@@ -5229,7 +5134,7 @@ var ByPass = {
|
|
|
5229
5134
|
};
|
|
5230
5135
|
|
|
5231
5136
|
// src/internals/launch/default.js
|
|
5232
|
-
var
|
|
5137
|
+
var logger7 = createInternalLogger("Launch");
|
|
5233
5138
|
var REQUEST_HOOK_FLAG = Symbol("playwright-toolkit-request-hook");
|
|
5234
5139
|
var injectedContexts = /* @__PURE__ */ new WeakSet();
|
|
5235
5140
|
var browserMajorVersionCache = /* @__PURE__ */ new Map();
|
|
@@ -5281,7 +5186,7 @@ var detectBrowserMajorVersion = (launcher) => {
|
|
|
5281
5186
|
});
|
|
5282
5187
|
detectedVersion = parseChromeMajorVersion(rawVersion);
|
|
5283
5188
|
} catch (error) {
|
|
5284
|
-
|
|
5189
|
+
logger7.warn(`\u8BFB\u53D6\u6D4F\u89C8\u5668\u7248\u672C\u5931\u8D25: ${error?.message || error}`);
|
|
5285
5190
|
}
|
|
5286
5191
|
browserMajorVersionCache.set(executablePath, detectedVersion);
|
|
5287
5192
|
return detectedVersion;
|
|
@@ -5318,7 +5223,7 @@ var generateFingerprintForCore = ({ locale, browserMajorVersion, device }) => {
|
|
|
5318
5223
|
if (requestedBrowserMajorVersion <= 0) {
|
|
5319
5224
|
throw error;
|
|
5320
5225
|
}
|
|
5321
|
-
|
|
5226
|
+
logger7.warn(
|
|
5322
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}`
|
|
5323
5228
|
);
|
|
5324
5229
|
}
|
|
@@ -5363,7 +5268,7 @@ var buildReplayableBrowserProfile = (runtimeState, launcher) => {
|
|
|
5363
5268
|
schema_version: DEFAULT_BROWSER_PROFILE_SCHEMA_VERSION
|
|
5364
5269
|
};
|
|
5365
5270
|
nextState = RuntimeEnv.setBrowserProfileCore(nextState, browserProfileCore);
|
|
5366
|
-
|
|
5271
|
+
logger7.info(
|
|
5367
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}`
|
|
5368
5273
|
);
|
|
5369
5274
|
return { runtimeState: nextState, browserProfileCore };
|
|
@@ -5492,18 +5397,18 @@ var DefaultLaunch = {
|
|
|
5492
5397
|
upstreamLabel = `${parsedProxyUrl.protocol}//${parsedProxyUrl.host}`;
|
|
5493
5398
|
} catch {
|
|
5494
5399
|
}
|
|
5495
|
-
|
|
5400
|
+
logger7.info(
|
|
5496
5401
|
`[\u4EE3\u7406\u5DF2\u542F\u7528] \u672C\u5730=${launchProxy.server} \u4E0A\u6E38=${upstreamLabel || "-"} \u76F4\u8FDE\u57DF\u540D=${(byPassDomains || []).join(",")}`
|
|
5497
5402
|
);
|
|
5498
|
-
|
|
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`);
|
|
5499
5404
|
} else if (enableByPassLogger && enableProxy && !launchProxy) {
|
|
5500
|
-
|
|
5501
|
-
|
|
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`);
|
|
5502
5407
|
} else if (enableByPassLogger && !enableProxy && proxyUrl) {
|
|
5503
|
-
|
|
5504
|
-
|
|
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`);
|
|
5505
5410
|
} else if (enableByPassLogger) {
|
|
5506
|
-
|
|
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`);
|
|
5507
5412
|
}
|
|
5508
5413
|
const onPageCreated = (page) => {
|
|
5509
5414
|
const recommendedGotoOptions = {
|
|
@@ -5525,7 +5430,7 @@ var DefaultLaunch = {
|
|
|
5525
5430
|
}
|
|
5526
5431
|
if (!enableByPassLogger || byPassDomains.length === 0) return;
|
|
5527
5432
|
if (!matched || !matched.rule) return;
|
|
5528
|
-
|
|
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}`);
|
|
5529
5434
|
};
|
|
5530
5435
|
page.on("request", requestHandler);
|
|
5531
5436
|
return recommendedGotoOptions;
|
|
@@ -5582,7 +5487,7 @@ var DefaultLaunch = {
|
|
|
5582
5487
|
// src/internals/launch/cloakbrowser.js
|
|
5583
5488
|
import { execFile } from "node:child_process";
|
|
5584
5489
|
import { promisify } from "node:util";
|
|
5585
|
-
var
|
|
5490
|
+
var logger8 = createInternalLogger("CloakBrowser");
|
|
5586
5491
|
var execFileAsync = promisify(execFile);
|
|
5587
5492
|
var DEFAULT_CLOAK_CRAWLER_BASE_OPTIONS = Object.freeze({
|
|
5588
5493
|
maxConcurrency: 1,
|
|
@@ -5718,7 +5623,7 @@ var forceTerminateBrowsersByFingerprintArg = async (fingerprintArg) => {
|
|
|
5718
5623
|
if (error?.code === 1 || error?.code === "ENOENT") {
|
|
5719
5624
|
return;
|
|
5720
5625
|
}
|
|
5721
|
-
|
|
5626
|
+
logger8.info(`\u5F3A\u5236\u5173\u95ED CloakBrowser \u8FDB\u7A0B\u5931\u8D25\uFF08\u5FFD\u7565\uFF09: ${error?.message || String(error)}`);
|
|
5722
5627
|
});
|
|
5723
5628
|
};
|
|
5724
5629
|
var CloakBrowserLaunch = {
|
|
@@ -5732,8 +5637,21 @@ var CloakBrowserLaunch = {
|
|
|
5732
5637
|
return createStableGotoHook(recommendedGotoOptions);
|
|
5733
5638
|
},
|
|
5734
5639
|
async getPlaywrightCrawlerOptions(options = {}) {
|
|
5735
|
-
const
|
|
5736
|
-
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
|
+
});
|
|
5737
5655
|
},
|
|
5738
5656
|
async buildLaunchOptions(options = {}) {
|
|
5739
5657
|
return await buildCloakLaunchOptions(options);
|
|
@@ -5814,39 +5732,18 @@ var CloakBrowserLaunch = {
|
|
|
5814
5732
|
};
|
|
5815
5733
|
|
|
5816
5734
|
// src/launch.js
|
|
5817
|
-
var
|
|
5818
|
-
|
|
5819
|
-
|
|
5820
|
-
if (typeof delegate?.[method] !== "function") {
|
|
5821
|
-
throw new Error(`Launch.${method} is not available in ${getToolkitMode()} mode`);
|
|
5822
|
-
}
|
|
5823
|
-
return delegate[method](...args);
|
|
5824
|
-
};
|
|
5825
|
-
var Launch = {
|
|
5826
|
-
getPlaywrightCrawlerOptions(options = {}) {
|
|
5827
|
-
return callLaunch("getPlaywrightCrawlerOptions", options);
|
|
5828
|
-
},
|
|
5829
|
-
resolveProxyConfiguration(proxyConfiguration = {}) {
|
|
5830
|
-
return callLaunch("resolveProxyConfiguration", proxyConfiguration);
|
|
5831
|
-
},
|
|
5832
|
-
extractFingerprintArg(launchOptions = {}) {
|
|
5833
|
-
return callLaunch("extractFingerprintArg", launchOptions);
|
|
5834
|
-
},
|
|
5835
|
-
createStableGotoHook(recommendedGotoOptions = {}) {
|
|
5836
|
-
return callLaunch("createStableGotoHook", recommendedGotoOptions);
|
|
5837
|
-
},
|
|
5838
|
-
buildLaunchOptions(options = {}) {
|
|
5839
|
-
return callLaunch("buildLaunchOptions", options);
|
|
5840
|
-
},
|
|
5841
|
-
createPlaywrightCrawlerRuntime(options = {}) {
|
|
5842
|
-
return callLaunch("createPlaywrightCrawlerRuntime", options);
|
|
5843
|
-
}
|
|
5735
|
+
var launchStrategies = {
|
|
5736
|
+
[Mode.Default]: DefaultLaunch,
|
|
5737
|
+
[Mode.CloakBrowser]: CloakBrowserLaunch
|
|
5844
5738
|
};
|
|
5739
|
+
var Launch = createDelegatedFacade("Launch", launchStrategies, [
|
|
5740
|
+
"getPlaywrightCrawlerOptions"
|
|
5741
|
+
]);
|
|
5845
5742
|
|
|
5846
5743
|
// src/live-view.js
|
|
5847
5744
|
import express from "express";
|
|
5848
5745
|
import { Actor } from "apify";
|
|
5849
|
-
var
|
|
5746
|
+
var logger9 = createInternalLogger("LiveView");
|
|
5850
5747
|
async function startLiveViewServer(liveViewKey) {
|
|
5851
5748
|
const app = express();
|
|
5852
5749
|
app.get("/", async (req, res) => {
|
|
@@ -5871,13 +5768,13 @@ async function startLiveViewServer(liveViewKey) {
|
|
|
5871
5768
|
</html>
|
|
5872
5769
|
`);
|
|
5873
5770
|
} catch (error) {
|
|
5874
|
-
|
|
5771
|
+
logger9.fail("Live View Server", error);
|
|
5875
5772
|
res.status(500).send(`\u65E0\u6CD5\u52A0\u8F7D\u5C4F\u5E55\u622A\u56FE: ${error.message}`);
|
|
5876
5773
|
}
|
|
5877
5774
|
});
|
|
5878
5775
|
const port = process.env.APIFY_CONTAINER_PORT || 4321;
|
|
5879
5776
|
app.listen(port, () => {
|
|
5880
|
-
|
|
5777
|
+
logger9.success("startLiveViewServer", `\u76D1\u542C\u7AEF\u53E3 ${port}`);
|
|
5881
5778
|
});
|
|
5882
5779
|
}
|
|
5883
5780
|
async function takeLiveScreenshot(liveViewKey, page, logMessage) {
|
|
@@ -5885,10 +5782,10 @@ async function takeLiveScreenshot(liveViewKey, page, logMessage) {
|
|
|
5885
5782
|
const buffer = await capturePageScreenshot(page, { type: "png" });
|
|
5886
5783
|
await Actor.setValue(liveViewKey, buffer, { contentType: "image/png" });
|
|
5887
5784
|
if (logMessage) {
|
|
5888
|
-
|
|
5785
|
+
logger9.info(`(\u622A\u56FE): ${logMessage}`);
|
|
5889
5786
|
}
|
|
5890
5787
|
} catch (e) {
|
|
5891
|
-
|
|
5788
|
+
logger9.warn(`\u65E0\u6CD5\u6355\u83B7 Live View \u5C4F\u5E55\u622A\u56FE: ${e.message}`);
|
|
5892
5789
|
}
|
|
5893
5790
|
}
|
|
5894
5791
|
var useLiveView = (liveViewKey = PresetOfLiveViewKey) => {
|
|
@@ -5997,7 +5894,7 @@ var dragCaptchaAction = async (page, sourceLocator, targetLocator, options = {})
|
|
|
5997
5894
|
};
|
|
5998
5895
|
|
|
5999
5896
|
// src/internals/captcha/bytedance.js
|
|
6000
|
-
var
|
|
5897
|
+
var logger10 = createInternalLogger("Captcha");
|
|
6001
5898
|
var DEFAULT_BYTEDANCE_CAPTCHA_OPTIONS = Object.freeze({
|
|
6002
5899
|
apiType: "31234",
|
|
6003
5900
|
maxRetries: 3,
|
|
@@ -6129,7 +6026,7 @@ var collectCaptchaDebugInfo = async (page, frame, iframeLocator, attempt, phase,
|
|
|
6129
6026
|
}
|
|
6130
6027
|
await writeFile(infoPath, JSON.stringify(payload, null, 2), "utf8");
|
|
6131
6028
|
}
|
|
6132
|
-
|
|
6029
|
+
logger10.info(`\u5DF2\u5199\u51FA\u9A8C\u8BC1\u7801\u8C03\u8BD5\u4EA7\u7269\uFF1A${debugDir}`);
|
|
6133
6030
|
};
|
|
6134
6031
|
var maybeCollectCaptchaDebugInfo = async (page, frame, iframeLocator, attempt, phase, options, extra = null) => {
|
|
6135
6032
|
if (!options.debugArtifacts) {
|
|
@@ -6166,14 +6063,14 @@ var getVerifycenterCaptchaContext = async (page, options) => {
|
|
|
6166
6063
|
if (!isContainerVisible) {
|
|
6167
6064
|
return null;
|
|
6168
6065
|
}
|
|
6169
|
-
|
|
6066
|
+
logger10.info("\u68C0\u6D4B\u5230\u9A8C\u8BC1\u7801\u5BB9\u5668\uFF0C\u5F00\u59CB\u7B49\u5F85 iframe \u52A0\u8F7D\u3002");
|
|
6170
6067
|
let iframeLocator = page.locator(options.iframeSelector).first();
|
|
6171
6068
|
let isIframeVisible = await waitForVisible(
|
|
6172
6069
|
iframeLocator,
|
|
6173
6070
|
options.iframeVisibleTimeoutMs
|
|
6174
6071
|
);
|
|
6175
6072
|
if (!isIframeVisible) {
|
|
6176
|
-
|
|
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");
|
|
6177
6074
|
iframeLocator = captchaContainer.locator(options.iframeFallbackSelector).first();
|
|
6178
6075
|
isIframeVisible = await waitForVisible(
|
|
6179
6076
|
iframeLocator,
|
|
@@ -6183,7 +6080,7 @@ var getVerifycenterCaptchaContext = async (page, options) => {
|
|
|
6183
6080
|
if (!isIframeVisible) {
|
|
6184
6081
|
throw new Error("verifycenter iframe not found inside captcha container.");
|
|
6185
6082
|
}
|
|
6186
|
-
|
|
6083
|
+
logger10.info("\u9A8C\u8BC1\u7801 iframe \u5DF2\u53EF\u89C1\uFF0C\u5F00\u59CB\u89E3\u6790\u5185\u5BB9 frame\u3002");
|
|
6187
6084
|
const frame = await resolveContentFrame(page, iframeLocator, options);
|
|
6188
6085
|
if (!frame) {
|
|
6189
6086
|
throw new Error("Failed to resolve verifycenter iframe content frame.");
|
|
@@ -6299,11 +6196,11 @@ var refreshCaptcha = async (page, frame, options) => {
|
|
|
6299
6196
|
const clicked = await clickCaptchaAction(frame, options.refreshTexts, {
|
|
6300
6197
|
...options,
|
|
6301
6198
|
page,
|
|
6302
|
-
logger:
|
|
6199
|
+
logger: logger10,
|
|
6303
6200
|
forceMouse: true
|
|
6304
6201
|
}).catch(() => false);
|
|
6305
6202
|
if (!clicked) {
|
|
6306
|
-
|
|
6203
|
+
logger10.warn("Refresh button not found.");
|
|
6307
6204
|
return false;
|
|
6308
6205
|
}
|
|
6309
6206
|
await page.waitForTimeout(options.refreshWaitMs);
|
|
@@ -6334,24 +6231,24 @@ var waitForCaptchaChallengeReady = async (page, frame, options) => {
|
|
|
6334
6231
|
const hasGuideMaskVisible = options.guideMaskSelector ? await frame.locator(options.guideMaskSelector).first().isVisible({ timeout: options.loadingIndicatorVisibleTimeoutMs }).catch(() => false) : false;
|
|
6335
6232
|
hasSeenGuideMask = hasSeenGuideMask || hasGuideMaskVisible;
|
|
6336
6233
|
if (hasGuideMaskVisible && !hasLoggedGuideMask) {
|
|
6337
|
-
|
|
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");
|
|
6338
6235
|
hasLoggedGuideMask = true;
|
|
6339
6236
|
}
|
|
6340
6237
|
if (!isLoadingVisible && hasVisibleSourceImage && hasVisibleDropTarget && !hasGuideMaskVisible) {
|
|
6341
|
-
|
|
6238
|
+
logger10.info(
|
|
6342
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"
|
|
6343
6240
|
);
|
|
6344
6241
|
return;
|
|
6345
6242
|
}
|
|
6346
6243
|
if (hasErrorTextVisible) {
|
|
6347
|
-
|
|
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");
|
|
6348
6245
|
await refreshCaptcha(page, frame, options);
|
|
6349
6246
|
refreshDeadline = Date.now() + options.challengeReadyRefreshTimeoutMs;
|
|
6350
6247
|
hasSeenLoading = false;
|
|
6351
6248
|
continue;
|
|
6352
6249
|
}
|
|
6353
6250
|
if ((!hasVisibleSourceImage || !hasVisibleDropTarget) && Date.now() >= refreshDeadline) {
|
|
6354
|
-
|
|
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`);
|
|
6355
6252
|
await refreshCaptcha(page, frame, options);
|
|
6356
6253
|
refreshDeadline = Date.now() + options.challengeReadyRefreshTimeoutMs;
|
|
6357
6254
|
hasSeenLoading = false;
|
|
@@ -6399,7 +6296,7 @@ var dragPromptCaptchaImage = async (page, frame, iframeLocator, sourceLocator, d
|
|
|
6399
6296
|
accepted
|
|
6400
6297
|
};
|
|
6401
6298
|
dragAttempts.push(attemptInfo);
|
|
6402
|
-
|
|
6299
|
+
logger10.info(
|
|
6403
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}`
|
|
6404
6301
|
);
|
|
6405
6302
|
if (accepted) {
|
|
@@ -6417,7 +6314,7 @@ var dragPromptCaptchaImage = async (page, frame, iframeLocator, sourceLocator, d
|
|
|
6417
6314
|
dragAttempts,
|
|
6418
6315
|
finalState: await readPromptCaptchaState(frame, options)
|
|
6419
6316
|
}).catch((error) => {
|
|
6420
|
-
|
|
6317
|
+
logger10.warn(`\u9A8C\u8BC1\u7801\u62D6\u62FD\u5931\u8D25\u8C03\u8BD5\u6293\u53D6\u5931\u8D25\uFF1A${error?.message || error}`);
|
|
6421
6318
|
});
|
|
6422
6319
|
return {
|
|
6423
6320
|
accepted: false,
|
|
@@ -6434,16 +6331,16 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
|
|
|
6434
6331
|
...options
|
|
6435
6332
|
};
|
|
6436
6333
|
if (!config.token) {
|
|
6437
|
-
|
|
6334
|
+
logger10.warn("\u7F3A\u5C11\u9A8C\u8BC1\u7801 token\uFF0C\u8DF3\u8FC7\u81EA\u52A8\u8BC6\u522B\u3002");
|
|
6438
6335
|
return false;
|
|
6439
6336
|
}
|
|
6440
|
-
|
|
6337
|
+
logger10.info("\u5F53\u524D\u4F7F\u7528\u672Ctool\u2014\u2014\u6D4B\u8BD5\u7248\u672C");
|
|
6441
6338
|
for (let attempt = 1; attempt <= config.maxRetries; attempt += 1) {
|
|
6442
|
-
|
|
6339
|
+
logger10.info(`\u5F00\u59CB\u7B2C ${attempt}/${config.maxRetries} \u6B21 verifycenter \u9A8C\u8BC1\u7801\u8BC6\u522B\u3002`);
|
|
6443
6340
|
try {
|
|
6444
6341
|
const captchaContext = await getVerifycenterCaptchaContext(page, config);
|
|
6445
6342
|
if (!captchaContext) {
|
|
6446
|
-
|
|
6343
|
+
logger10.info("Captcha container is not visible anymore.");
|
|
6447
6344
|
return true;
|
|
6448
6345
|
}
|
|
6449
6346
|
const { iframeLocator, frame } = captchaContext;
|
|
@@ -6456,7 +6353,7 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
|
|
|
6456
6353
|
"ready",
|
|
6457
6354
|
config
|
|
6458
6355
|
).catch((error) => {
|
|
6459
|
-
|
|
6356
|
+
logger10.warn(`\u9A8C\u8BC1\u7801\u8C03\u8BD5\u6293\u53D6\u5931\u8D25\uFF1A${error?.message || error}`);
|
|
6460
6357
|
});
|
|
6461
6358
|
await page.waitForTimeout(config.recognitionDelayMs);
|
|
6462
6359
|
const screenshotBuffer = await iframeLocator.screenshot();
|
|
@@ -6468,16 +6365,16 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
|
|
|
6468
6365
|
});
|
|
6469
6366
|
const serialNumbers = extractCaptchaSerialNumbers(apiResponse);
|
|
6470
6367
|
if (apiResponse?.code !== config.recognitionSuccessCode || serialNumbers.length === 0) {
|
|
6471
|
-
|
|
6368
|
+
logger10.warn(
|
|
6472
6369
|
`\u9A8C\u8BC1\u7801\u8BC6\u522B\u5931\u8D25\u3002code=${apiResponse?.code}, msg=${apiResponse?.msg || "unknown"}`
|
|
6473
6370
|
);
|
|
6474
6371
|
await refreshCaptcha(page, frame, config);
|
|
6475
6372
|
continue;
|
|
6476
6373
|
}
|
|
6477
|
-
|
|
6374
|
+
logger10.info(`\u9A8C\u8BC1\u7801\u8BC6\u522B\u6210\u529F\uFF0C\u5E8F\u53F7\uFF1A${serialNumbers.join(", ")}`);
|
|
6478
6375
|
const dropTarget = await findCaptchaDropTarget(frame, config);
|
|
6479
6376
|
if (!dropTarget) {
|
|
6480
|
-
|
|
6377
|
+
logger10.warn("\u672A\u627E\u5230\u9A8C\u8BC1\u7801\u62D6\u62FD\u76EE\u6807\u533A\u57DF\u3002");
|
|
6481
6378
|
await refreshCaptcha(page, frame, config);
|
|
6482
6379
|
continue;
|
|
6483
6380
|
}
|
|
@@ -6488,7 +6385,7 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
|
|
|
6488
6385
|
`Captcha image indexes could not be normalized. raw=${serialNumbers.join(", ")}, count=${orderedSourceImages.length}`
|
|
6489
6386
|
);
|
|
6490
6387
|
}
|
|
6491
|
-
|
|
6388
|
+
logger10.info(`\u9A8C\u8BC1\u7801\u89C6\u89C9\u4F4D\u5E8F\u6620\u5C04\uFF1A${normalizedIndexes.map((index) => index + 1).join(", ")}`);
|
|
6492
6389
|
for (const imageIndex of normalizedIndexes) {
|
|
6493
6390
|
if (imageIndex < 0 || imageIndex >= orderedSourceImages.length) {
|
|
6494
6391
|
throw new Error(
|
|
@@ -6520,52 +6417,52 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
|
|
|
6520
6417
|
}
|
|
6521
6418
|
}
|
|
6522
6419
|
const beforeSubmitState = await readPromptCaptchaState(frame, config);
|
|
6523
|
-
|
|
6420
|
+
logger10.info(
|
|
6524
6421
|
`\u63D0\u4EA4\u524D\u9A8C\u8BC1\u7801\u72B6\u6001\uFF1Abadge=${beforeSubmitState.badgeCount}, selected=${beforeSubmitState.selectedCount}, submitDisabled=${beforeSubmitState.submitDisabled}`
|
|
6525
6422
|
);
|
|
6526
6423
|
const submitted = await clickCaptchaAction(frame, config.submitTexts, {
|
|
6527
6424
|
...config,
|
|
6528
6425
|
page,
|
|
6529
|
-
logger:
|
|
6426
|
+
logger: logger10,
|
|
6530
6427
|
forceMouse: true,
|
|
6531
6428
|
actionVisibleTimeoutMs: config.submitReadyTimeoutMs
|
|
6532
6429
|
}).catch(() => false);
|
|
6533
6430
|
if (!submitted) {
|
|
6534
|
-
|
|
6431
|
+
logger10.warn("\u672A\u627E\u5230\u63D0\u4EA4\u6309\u94AE\uFF0C\u53EF\u80FD\u4F1A\u81EA\u52A8\u63D0\u4EA4\u3002");
|
|
6535
6432
|
}
|
|
6536
6433
|
await page.waitForTimeout(config.submitWaitMs);
|
|
6537
6434
|
const afterSubmitState = await readPromptCaptchaState(frame, config);
|
|
6538
|
-
|
|
6435
|
+
logger10.info(
|
|
6539
6436
|
`\u63D0\u4EA4\u540E\u9A8C\u8BC1\u7801\u72B6\u6001\uFF1Abadge=${afterSubmitState.badgeCount}, selected=${afterSubmitState.selectedCount}, submitDisabled=${afterSubmitState.submitDisabled}`
|
|
6540
6437
|
);
|
|
6541
6438
|
const stillVisible = await iframeLocator.isVisible({ timeout: config.containerVisibleTimeoutMs }).catch(() => false);
|
|
6542
6439
|
if (!stillVisible) {
|
|
6543
|
-
|
|
6440
|
+
logger10.info("\u9A8C\u8BC1\u7801\u8BC6\u522B\u5E76\u63D0\u4EA4\u6210\u529F\u3002");
|
|
6544
6441
|
return true;
|
|
6545
6442
|
}
|
|
6546
6443
|
await maybeCollectCaptchaDebugInfo(page, frame, iframeLocator, attempt, "submit-still-visible", config, {
|
|
6547
6444
|
beforeSubmitState,
|
|
6548
6445
|
afterSubmitState
|
|
6549
6446
|
}).catch((error) => {
|
|
6550
|
-
|
|
6447
|
+
logger10.warn(`\u63D0\u4EA4\u540E\u9A8C\u8BC1\u7801\u8C03\u8BD5\u6293\u53D6\u5931\u8D25\uFF1A${error?.message || error}`);
|
|
6551
6448
|
});
|
|
6552
|
-
|
|
6449
|
+
logger10.warn("\u63D0\u4EA4\u540E\u9A8C\u8BC1\u7801 iframe \u4ECD\u7136\u53EF\u89C1\uFF0C\u51C6\u5907\u5237\u65B0\u540E\u91CD\u8BD5\u3002");
|
|
6553
6450
|
await page.waitForTimeout(2e3);
|
|
6554
6451
|
await refreshCaptcha(page, frame, config);
|
|
6555
6452
|
} catch (error) {
|
|
6556
|
-
|
|
6453
|
+
logger10.error(`\u7B2C ${attempt}/${config.maxRetries} \u6B21\u9A8C\u8BC1\u7801\u8BC6\u522B\u5931\u8D25\uFF1A${error?.message || error}`);
|
|
6557
6454
|
}
|
|
6558
6455
|
if (attempt < config.maxRetries) {
|
|
6559
6456
|
await page.waitForTimeout(config.retryDelayBaseMs + attempt * config.retryDelayStepMs);
|
|
6560
6457
|
}
|
|
6561
6458
|
}
|
|
6562
|
-
|
|
6459
|
+
logger10.error(`\u91CD\u8BD5 ${config.maxRetries} \u6B21\u540E\uFF0C\u9A8C\u8BC1\u7801\u4ECD\u672A\u8BC6\u522B\u6210\u529F\u3002`);
|
|
6563
6460
|
return false;
|
|
6564
6461
|
}
|
|
6565
6462
|
var sloveCaptcha = solveCaptcha;
|
|
6566
6463
|
|
|
6567
6464
|
// src/chaptcha.js
|
|
6568
|
-
var
|
|
6465
|
+
var logger11 = createInternalLogger("Captcha");
|
|
6569
6466
|
var DEFAULT_CAPTCHA_RECOGNITION_OPTIONS = Object.freeze({
|
|
6570
6467
|
token: "eKJvBfwfN0YRav0-VD_44E2VBSfm7l0YtddUQ7cFySI",
|
|
6571
6468
|
apiUrl: "https://api.jfbym.com/api/YmServer/customApi"
|
|
@@ -6652,7 +6549,7 @@ function useCaptchaMonitor(page, options) {
|
|
|
6652
6549
|
};
|
|
6653
6550
|
})();
|
|
6654
6551
|
}, { selector: domSelector, callbackName: exposedFunctionName, cleanerName });
|
|
6655
|
-
|
|
6552
|
+
logger11.success("useCaptchaMonitor", `DOM \u76D1\u63A7\u5DF2\u542F\u7528\uFF1A${domSelector}`);
|
|
6656
6553
|
cleanupFns.push(async () => {
|
|
6657
6554
|
try {
|
|
6658
6555
|
await page.evaluate((name) => {
|
|
@@ -6676,14 +6573,14 @@ function useCaptchaMonitor(page, options) {
|
|
|
6676
6573
|
}
|
|
6677
6574
|
};
|
|
6678
6575
|
page.on("framenavigated", frameHandler);
|
|
6679
|
-
|
|
6576
|
+
logger11.success("useCaptchaMonitor", `URL \u76D1\u63A7\u5DF2\u542F\u7528\uFF1A${urlPattern}`);
|
|
6680
6577
|
cleanupFns.push(async () => {
|
|
6681
6578
|
page.off("framenavigated", frameHandler);
|
|
6682
6579
|
});
|
|
6683
6580
|
}
|
|
6684
6581
|
return {
|
|
6685
6582
|
stop: async () => {
|
|
6686
|
-
|
|
6583
|
+
logger11.info("\u6B63\u5728\u505C\u6B62\u9A8C\u8BC1\u7801\u76D1\u63A7...");
|
|
6687
6584
|
for (const fn of cleanupFns) {
|
|
6688
6585
|
await fn();
|
|
6689
6586
|
}
|
|
@@ -6722,7 +6619,7 @@ async function solveCaptchaWithStrategy(strategyName, page, options = {}) {
|
|
|
6722
6619
|
);
|
|
6723
6620
|
return strategy.sloveCaptcha(page, resolvedOptions, {
|
|
6724
6621
|
callCaptchaRecognitionApi,
|
|
6725
|
-
logger:
|
|
6622
|
+
logger: logger11
|
|
6726
6623
|
});
|
|
6727
6624
|
}
|
|
6728
6625
|
var Captcha = {
|
|
@@ -6733,7 +6630,7 @@ var Captcha = {
|
|
|
6733
6630
|
// src/mutation.js
|
|
6734
6631
|
import { createHash } from "node:crypto";
|
|
6735
6632
|
import { v4 as uuidv42 } from "uuid";
|
|
6736
|
-
var
|
|
6633
|
+
var logger12 = createInternalLogger("Mutation");
|
|
6737
6634
|
var MUTATION_MONITOR_MODE = Object.freeze({
|
|
6738
6635
|
Added: "added",
|
|
6739
6636
|
Changed: "changed",
|
|
@@ -6766,14 +6663,14 @@ var Mutation = {
|
|
|
6766
6663
|
const stableTime = options.stableTime ?? 5 * 1e3;
|
|
6767
6664
|
const timeout = options.timeout ?? 120 * 1e3;
|
|
6768
6665
|
const onMutation = options.onMutation;
|
|
6769
|
-
|
|
6666
|
+
logger12.start("waitForStable", `\u76D1\u63A7 ${selectorList.length} \u4E2A\u9009\u62E9\u5668, \u7A33\u5B9A\u65F6\u95F4=${stableTime}ms`);
|
|
6770
6667
|
if (initialTimeout > 0) {
|
|
6771
6668
|
const selectorQuery = selectorList.join(",");
|
|
6772
6669
|
try {
|
|
6773
6670
|
await page.waitForSelector(selectorQuery, { timeout: initialTimeout });
|
|
6774
|
-
|
|
6671
|
+
logger12.info(`waitForStable \u5DF2\u68C0\u6D4B\u5230\u5143\u7D20: ${selectorQuery}`);
|
|
6775
6672
|
} catch (e) {
|
|
6776
|
-
|
|
6673
|
+
logger12.warning(`waitForStable \u521D\u59CB\u7B49\u5F85\u8D85\u65F6 (${initialTimeout}ms): ${selectorQuery}`);
|
|
6777
6674
|
throw e;
|
|
6778
6675
|
}
|
|
6779
6676
|
}
|
|
@@ -6789,7 +6686,7 @@ var Mutation = {
|
|
|
6789
6686
|
return "__CONTINUE__";
|
|
6790
6687
|
}
|
|
6791
6688
|
});
|
|
6792
|
-
|
|
6689
|
+
logger12.info("waitForStable \u5DF2\u542F\u7528 onMutation \u56DE\u8C03");
|
|
6793
6690
|
} catch (e) {
|
|
6794
6691
|
}
|
|
6795
6692
|
}
|
|
@@ -6904,9 +6801,9 @@ var Mutation = {
|
|
|
6904
6801
|
{ selectorList, stableTime, timeout, callbackName, hasCallback: !!onMutation }
|
|
6905
6802
|
);
|
|
6906
6803
|
if (result.mutationCount === 0 && result.stableTime === 0) {
|
|
6907
|
-
|
|
6804
|
+
logger12.warning("waitForStable \u672A\u627E\u5230\u53EF\u76D1\u63A7\u7684\u5143\u7D20");
|
|
6908
6805
|
}
|
|
6909
|
-
|
|
6806
|
+
logger12.success("waitForStable", `DOM \u7A33\u5B9A, \u603B\u5171 ${result.mutationCount} \u6B21\u53D8\u5316${result.wasPaused ? ", \u66FE\u6682\u505C\u8BA1\u65F6" : ""}`);
|
|
6910
6807
|
return result;
|
|
6911
6808
|
},
|
|
6912
6809
|
/**
|
|
@@ -7078,29 +6975,29 @@ var Mutation = {
|
|
|
7078
6975
|
return "__CONTINUE__";
|
|
7079
6976
|
}
|
|
7080
6977
|
};
|
|
7081
|
-
|
|
6978
|
+
logger12.start(
|
|
7082
6979
|
"waitForStableAcrossRoots",
|
|
7083
6980
|
`\u76D1\u63A7 ${selectorList.length} \u4E2A\u9009\u62E9\u5668(\u8DE8 root), \u7A33\u5B9A\u65F6\u95F4=${waitForStableTime}ms`
|
|
7084
6981
|
);
|
|
7085
6982
|
if (initialTimeout > 0) {
|
|
7086
6983
|
try {
|
|
7087
6984
|
await page.waitForSelector(selectorQuery, { timeout: initialTimeout });
|
|
7088
|
-
|
|
6985
|
+
logger12.info(`waitForStableAcrossRoots \u5DF2\u68C0\u6D4B\u5230\u5143\u7D20: ${selectorQuery}`);
|
|
7089
6986
|
} catch (e) {
|
|
7090
|
-
|
|
6987
|
+
logger12.warning(`waitForStableAcrossRoots \u521D\u59CB\u7B49\u5F85\u8D85\u65F6 (${initialTimeout}ms): ${selectorQuery}`);
|
|
7091
6988
|
throw e;
|
|
7092
6989
|
}
|
|
7093
6990
|
}
|
|
7094
|
-
let
|
|
7095
|
-
if (!
|
|
7096
|
-
|
|
6991
|
+
let state2 = await buildState();
|
|
6992
|
+
if (!state2?.hasMatched) {
|
|
6993
|
+
logger12.warning("waitForStableAcrossRoots \u672A\u627E\u5230\u53EF\u76D1\u63A7\u7684\u5143\u7D20");
|
|
7097
6994
|
return { mutationCount: 0, stableTime: 0, wasPaused: false };
|
|
7098
6995
|
}
|
|
7099
6996
|
let mutationCount = 0;
|
|
7100
6997
|
let stableSince = 0;
|
|
7101
6998
|
let isPaused = false;
|
|
7102
6999
|
let wasPaused = false;
|
|
7103
|
-
let lastSnapshotKey =
|
|
7000
|
+
let lastSnapshotKey = state2.snapshotKey;
|
|
7104
7001
|
const applyPauseSignal = (signal) => {
|
|
7105
7002
|
const nextPaused = signal === "__PAUSE__";
|
|
7106
7003
|
if (nextPaused) {
|
|
@@ -7114,13 +7011,13 @@ var Mutation = {
|
|
|
7114
7011
|
};
|
|
7115
7012
|
const initialSignal = await invokeMutationCallback({
|
|
7116
7013
|
mutationCount: 0,
|
|
7117
|
-
html:
|
|
7118
|
-
text:
|
|
7119
|
-
mutationNodes:
|
|
7014
|
+
html: state2.html || "",
|
|
7015
|
+
text: state2.text || "",
|
|
7016
|
+
mutationNodes: state2.mutationNodes || []
|
|
7120
7017
|
});
|
|
7121
7018
|
applyPauseSignal(initialSignal);
|
|
7122
7019
|
const deadline = Date.now() + overallTimeout;
|
|
7123
|
-
let lastState =
|
|
7020
|
+
let lastState = state2;
|
|
7124
7021
|
while (Date.now() < deadline) {
|
|
7125
7022
|
await sleep(pollInterval);
|
|
7126
7023
|
lastState = await buildState();
|
|
@@ -7130,7 +7027,7 @@ var Mutation = {
|
|
|
7130
7027
|
if (lastState.snapshotKey !== lastSnapshotKey) {
|
|
7131
7028
|
lastSnapshotKey = lastState.snapshotKey;
|
|
7132
7029
|
mutationCount += 1;
|
|
7133
|
-
|
|
7030
|
+
logger12.info(
|
|
7134
7031
|
`waitForStableAcrossRoots \u53D8\u5316#${mutationCount}, len=${lastState.snapshotLength}, path=${lastState.primaryPath || "unknown"}, preview="${truncate(lastState.text, 120)}"`
|
|
7135
7032
|
);
|
|
7136
7033
|
const signal = await invokeMutationCallback({
|
|
@@ -7143,7 +7040,7 @@ var Mutation = {
|
|
|
7143
7040
|
continue;
|
|
7144
7041
|
}
|
|
7145
7042
|
if (!isPaused && stableSince > 0 && Date.now() - stableSince >= waitForStableTime) {
|
|
7146
|
-
|
|
7043
|
+
logger12.success("waitForStableAcrossRoots", `DOM \u7A33\u5B9A, \u603B\u5171 ${mutationCount} \u6B21\u53D8\u5316${wasPaused ? ", \u66FE\u6682\u505C\u8BA1\u65F6" : ""}`);
|
|
7147
7044
|
return {
|
|
7148
7045
|
mutationCount,
|
|
7149
7046
|
stableTime: waitForStableTime,
|
|
@@ -7170,7 +7067,7 @@ var Mutation = {
|
|
|
7170
7067
|
const onMutation = options.onMutation;
|
|
7171
7068
|
const rawMode = String(options.mode || MUTATION_MONITOR_MODE.Added).toLowerCase();
|
|
7172
7069
|
const mode = [MUTATION_MONITOR_MODE.Added, MUTATION_MONITOR_MODE.Changed, MUTATION_MONITOR_MODE.All].includes(rawMode) ? rawMode : MUTATION_MONITOR_MODE.Added;
|
|
7173
|
-
|
|
7070
|
+
logger12.start("useMonitor", `\u76D1\u63A7 ${selectorList.length} \u4E2A\u9009\u62E9\u5668, mode=${mode}`);
|
|
7174
7071
|
const monitorKey = generateKey("pk_mon");
|
|
7175
7072
|
const callbackName = generateKey("pk_mon_cb");
|
|
7176
7073
|
const cleanerName = generateKey("pk_mon_clean");
|
|
@@ -7313,7 +7210,7 @@ var Mutation = {
|
|
|
7313
7210
|
return total;
|
|
7314
7211
|
};
|
|
7315
7212
|
}, { selectorList, monitorKey, callbackName, cleanerName, hasCallback: !!onMutation, mode });
|
|
7316
|
-
|
|
7213
|
+
logger12.success("useMonitor", "\u76D1\u63A7\u5668\u5DF2\u542F\u52A8");
|
|
7317
7214
|
return {
|
|
7318
7215
|
stop: async () => {
|
|
7319
7216
|
let totalMutations = 0;
|
|
@@ -7326,7 +7223,7 @@ var Mutation = {
|
|
|
7326
7223
|
}, cleanerName);
|
|
7327
7224
|
} catch (e) {
|
|
7328
7225
|
}
|
|
7329
|
-
|
|
7226
|
+
logger12.success("useMonitor.stop", `\u76D1\u63A7\u5DF2\u505C\u6B62, \u5171 ${totalMutations} \u6B21\u53D8\u5316`);
|
|
7330
7227
|
return { totalMutations };
|
|
7331
7228
|
}
|
|
7332
7229
|
};
|
|
@@ -8195,7 +8092,7 @@ var createTemplateLogger = (baseLogger = createBaseLogger()) => {
|
|
|
8195
8092
|
};
|
|
8196
8093
|
var getDefaultBaseLogger = () => createBaseLogger("");
|
|
8197
8094
|
var Logger = {
|
|
8198
|
-
setLogger: (
|
|
8095
|
+
setLogger: (logger16) => setDefaultLogger(logger16),
|
|
8199
8096
|
info: (message) => getDefaultBaseLogger().info(message),
|
|
8200
8097
|
success: (message) => getDefaultBaseLogger().success(message),
|
|
8201
8098
|
warning: (message) => getDefaultBaseLogger().warning(message),
|
|
@@ -8203,8 +8100,8 @@ var Logger = {
|
|
|
8203
8100
|
error: (message) => getDefaultBaseLogger().error(message),
|
|
8204
8101
|
debug: (message) => getDefaultBaseLogger().debug(message),
|
|
8205
8102
|
start: (message) => getDefaultBaseLogger().start(message),
|
|
8206
|
-
useTemplate: (
|
|
8207
|
-
if (
|
|
8103
|
+
useTemplate: (logger16) => {
|
|
8104
|
+
if (logger16) return createTemplateLogger(createBaseLogger("", logger16));
|
|
8208
8105
|
return createTemplateLogger();
|
|
8209
8106
|
}
|
|
8210
8107
|
};
|
|
@@ -8278,7 +8175,7 @@ var LOCATION_NETWORK_SUFFIX_PATTERNS = [
|
|
|
8278
8175
|
];
|
|
8279
8176
|
var cachedStripLogoSrcPromise = null;
|
|
8280
8177
|
var cachedEnrichmentByContext = /* @__PURE__ */ new WeakMap();
|
|
8281
|
-
var
|
|
8178
|
+
var logger13 = createInternalLogger("Watermarkify");
|
|
8282
8179
|
var normalizeText = (value) => String(value || "").trim();
|
|
8283
8180
|
var toInline = (value, maxLen = 200) => {
|
|
8284
8181
|
const text = normalizeText(value);
|
|
@@ -8520,9 +8417,9 @@ var resolveWithCustomResolver = async (page, baseMeta, options = {}) => {
|
|
|
8520
8417
|
location: toInline(resolved.location, 80)
|
|
8521
8418
|
};
|
|
8522
8419
|
if (enrichment.ip || enrichment.location) {
|
|
8523
|
-
|
|
8420
|
+
logger13.info(`\u81EA\u5B9A\u4E49 resolver \u547D\u4E2D: ip=${enrichment.ip || "-"}, loc=${enrichment.location || "-"}`);
|
|
8524
8421
|
} else {
|
|
8525
|
-
|
|
8422
|
+
logger13.warning("\u81EA\u5B9A\u4E49 resolver \u5DF2\u6267\u884C\uFF0C\u4F46\u672A\u8FD4\u56DE IP/Loc");
|
|
8526
8423
|
}
|
|
8527
8424
|
return enrichment;
|
|
8528
8425
|
} finally {
|
|
@@ -8711,12 +8608,12 @@ var normalizeWatermarkifyRenderMode = (value) => {
|
|
|
8711
8608
|
};
|
|
8712
8609
|
var composeScreenshotBufferWithBrowser = async (page, buffer, overlaySvg, imageInfo = {}, options = {}) => {
|
|
8713
8610
|
if (!page || typeof page.context !== "function") {
|
|
8714
|
-
|
|
8611
|
+
logger13.warning("watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u8DF3\u8FC7: \u7F3A\u5C11\u53EF\u7528 page");
|
|
8715
8612
|
return buffer;
|
|
8716
8613
|
}
|
|
8717
8614
|
const renderScope = await openProbePage(page);
|
|
8718
8615
|
if (!renderScope?.page) {
|
|
8719
|
-
|
|
8616
|
+
logger13.warning("watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u8DF3\u8FC7: \u65E0\u6CD5\u521B\u5EFA render page");
|
|
8720
8617
|
return buffer;
|
|
8721
8618
|
}
|
|
8722
8619
|
try {
|
|
@@ -8781,13 +8678,13 @@ var composeScreenshotBufferWithBrowser = async (page, buffer, overlaySvg, imageI
|
|
|
8781
8678
|
fullPage: true,
|
|
8782
8679
|
animations: "disabled"
|
|
8783
8680
|
}).catch((error) => {
|
|
8784
|
-
|
|
8681
|
+
logger13.warning(`watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u5931\u8D25: ${error instanceof Error ? error.message : String(error)}`);
|
|
8785
8682
|
return null;
|
|
8786
8683
|
});
|
|
8787
8684
|
if (Buffer.isBuffer(composed) && composed.length > 0) {
|
|
8788
8685
|
return composed;
|
|
8789
8686
|
}
|
|
8790
|
-
|
|
8687
|
+
logger13.warning("watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u5931\u8D25: \u672A\u5F97\u5230\u6709\u6548\u622A\u56FE\u7ED3\u679C");
|
|
8791
8688
|
return buffer;
|
|
8792
8689
|
} finally {
|
|
8793
8690
|
await renderScope.close().catch(() => {
|
|
@@ -8800,7 +8697,7 @@ var resolveWithIpLookup = async (page, options = {}) => {
|
|
|
8800
8697
|
}
|
|
8801
8698
|
const probeScope = await openProbePage(page);
|
|
8802
8699
|
if (!probeScope?.page) {
|
|
8803
|
-
|
|
8700
|
+
logger13.warning("ipLookup \u8DF3\u8FC7: \u65E0\u6CD5\u521B\u5EFA probe page");
|
|
8804
8701
|
return null;
|
|
8805
8702
|
}
|
|
8806
8703
|
const timeoutMs = Math.max(
|
|
@@ -8809,12 +8706,12 @@ var resolveWithIpLookup = async (page, options = {}) => {
|
|
|
8809
8706
|
);
|
|
8810
8707
|
try {
|
|
8811
8708
|
const probePage = probeScope.page;
|
|
8812
|
-
|
|
8709
|
+
logger13.info(`ipLookup \u5C1D\u8BD5: url=${DEFAULT_IP_LOOKUP_URL}, timeoutMs=${timeoutMs}`);
|
|
8813
8710
|
const response = await probePage.goto(DEFAULT_IP_LOOKUP_URL, {
|
|
8814
8711
|
waitUntil: "commit",
|
|
8815
8712
|
timeout: timeoutMs
|
|
8816
8713
|
}).catch((error) => {
|
|
8817
|
-
|
|
8714
|
+
logger13.warning(`ipLookup \u8BF7\u6C42\u5931\u8D25: url=${DEFAULT_IP_LOOKUP_URL}, error=${error instanceof Error ? error.message : String(error)}`);
|
|
8818
8715
|
return null;
|
|
8819
8716
|
});
|
|
8820
8717
|
const status = response && typeof response.status === "function" ? response.status() : 0;
|
|
@@ -8836,13 +8733,13 @@ var resolveWithIpLookup = async (page, options = {}) => {
|
|
|
8836
8733
|
}
|
|
8837
8734
|
const parsed = parseIpIpJsonResponse(rawText);
|
|
8838
8735
|
if (parsed?.ip || parsed?.location) {
|
|
8839
|
-
|
|
8736
|
+
logger13.info(`ipLookup \u6210\u529F: url=${DEFAULT_IP_LOOKUP_URL}, status=${status || "-"}, contentType=${contentType || "-"}, ip=${parsed.ip || "-"}, loc=${parsed.location || "-"}`);
|
|
8840
8737
|
return parsed;
|
|
8841
8738
|
}
|
|
8842
|
-
|
|
8739
|
+
logger13.warning(`ipLookup \u672A\u89E3\u6790\u51FA IP/Loc: url=${DEFAULT_IP_LOOKUP_URL}, status=${status || "-"}, contentType=${contentType || "-"}, preview=${shortenTail(rawText, 120) || "[empty]"}`);
|
|
8843
8740
|
return null;
|
|
8844
8741
|
} catch (error) {
|
|
8845
|
-
|
|
8742
|
+
logger13.warning(`ipLookup \u6267\u884C\u5F02\u5E38\uFF0C\u672A\u83B7\u5F97 IP/Loc: ${error instanceof Error ? error.message : String(error)}`);
|
|
8846
8743
|
return null;
|
|
8847
8744
|
} finally {
|
|
8848
8745
|
await probeScope.close().catch(() => {
|
|
@@ -8856,10 +8753,10 @@ var resolveEnrichment = async (page, baseMeta, options) => {
|
|
|
8856
8753
|
ip: toInline(options.ip, 80),
|
|
8857
8754
|
location: toInline(options.location, 80)
|
|
8858
8755
|
};
|
|
8859
|
-
|
|
8756
|
+
logger13.info(`enrichment \u5F00\u59CB: host=${baseMeta.hostname || "-"}, hasPresetIp=${Boolean(merged.ip)}, hasPresetLoc=${Boolean(merged.location)}, ipLookup=${options.ipLookup !== false}`);
|
|
8860
8757
|
if (!merged.ip || !merged.location) {
|
|
8861
8758
|
if (cached?.ip || cached?.location) {
|
|
8862
|
-
|
|
8759
|
+
logger13.info(`enrichment \u547D\u4E2D\u4E0A\u4E0B\u6587\u7F13\u5B58: ip=${cached.ip || "-"}, loc=${cached.location || "-"}`);
|
|
8863
8760
|
}
|
|
8864
8761
|
fillEnrichment(merged, cached);
|
|
8865
8762
|
}
|
|
@@ -8883,15 +8780,15 @@ var resolveEnrichment = async (page, baseMeta, options) => {
|
|
|
8883
8780
|
"x-geo-country"
|
|
8884
8781
|
]), 80);
|
|
8885
8782
|
if (!merged.location || isWeakLocationValue(merged.location) && headerLocation) {
|
|
8886
|
-
|
|
8783
|
+
logger13.info(`enrichment \u4F7F\u7528\u54CD\u5E94\u5934\u8865\u5145 Loc: ${headerLocation || "-"}`);
|
|
8887
8784
|
merged.location = headerLocation || merged.location;
|
|
8888
8785
|
}
|
|
8889
8786
|
}
|
|
8890
8787
|
writeCachedEnrichment(page, merged);
|
|
8891
8788
|
if (merged.ip || merged.location) {
|
|
8892
|
-
|
|
8789
|
+
logger13.info(`enrichment \u5B8C\u6210: ip=${merged.ip || "-"}, loc=${merged.location || "-"}`);
|
|
8893
8790
|
} else {
|
|
8894
|
-
|
|
8791
|
+
logger13.warning("enrichment \u5B8C\u6210: \u672A\u83B7\u5F97 IP/Loc");
|
|
8895
8792
|
}
|
|
8896
8793
|
return merged;
|
|
8897
8794
|
};
|
|
@@ -9704,7 +9601,7 @@ var watermarkifyScreenshotBuffer = async (buffer, meta, page = null, options = {
|
|
|
9704
9601
|
}
|
|
9705
9602
|
const imageInfo = readImageInfo(buffer);
|
|
9706
9603
|
if (!imageInfo.width || !imageInfo.height || !imageInfo.mimeType) {
|
|
9707
|
-
|
|
9604
|
+
logger13.warning("watermarkify \u8DF3\u8FC7: \u65E0\u6CD5\u89E3\u6790\u622A\u56FE\u5C3A\u5BF8\u6216\u683C\u5F0F");
|
|
9708
9605
|
return buffer;
|
|
9709
9606
|
}
|
|
9710
9607
|
const isMobileStrip = normalizeDevice(meta.device) === Device.Mobile && hasStrip;
|
|
@@ -9722,7 +9619,7 @@ var watermarkifyScreenshotBuffer = async (buffer, meta, page = null, options = {
|
|
|
9722
9619
|
|
|
9723
9620
|
// src/internals/compression.js
|
|
9724
9621
|
import { Jimp, JimpMime, ResizeStrategy } from "jimp";
|
|
9725
|
-
var
|
|
9622
|
+
var logger14 = createInternalLogger("Compression");
|
|
9726
9623
|
var DEFAULT_SCREENSHOT_MAX_BYTES = 5 * 1024 * 1024;
|
|
9727
9624
|
var DEFAULT_SCREENSHOT_OUTPUT_TYPE = "jpeg";
|
|
9728
9625
|
var DEFAULT_SCREENSHOT_QUALITY = 0.72;
|
|
@@ -9841,18 +9738,18 @@ var compressImageBufferToBase64 = async (buffer, compression) => {
|
|
|
9841
9738
|
return buffer.toString("base64");
|
|
9842
9739
|
}
|
|
9843
9740
|
const result = await compressImageBuffer(buffer, compression).catch((error) => {
|
|
9844
|
-
|
|
9741
|
+
logger14.warning(`captureScreen \u538B\u7F29\u5931\u8D25\uFF0C\u8FD4\u56DE\u539F\u56FE: ${error instanceof Error ? error.message : String(error)}`);
|
|
9845
9742
|
return null;
|
|
9846
9743
|
});
|
|
9847
9744
|
if (!result?.buffer) {
|
|
9848
9745
|
return buffer.toString("base64");
|
|
9849
9746
|
}
|
|
9850
9747
|
if (result.withinLimit) {
|
|
9851
|
-
|
|
9748
|
+
logger14.info(
|
|
9852
9749
|
`captureScreen \u5DF2\u538B\u7F29: ${originalBytes} -> ${result.bytes} bytes, format=${result.format}, quality=${result.quality}, scale=${result.scale}, size=${result.width}x${result.height}`
|
|
9853
9750
|
);
|
|
9854
9751
|
} else {
|
|
9855
|
-
|
|
9752
|
+
logger14.warning(
|
|
9856
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}`
|
|
9857
9754
|
);
|
|
9858
9755
|
}
|
|
@@ -9860,7 +9757,7 @@ var compressImageBufferToBase64 = async (buffer, compression) => {
|
|
|
9860
9757
|
};
|
|
9861
9758
|
|
|
9862
9759
|
// src/share.js
|
|
9863
|
-
var
|
|
9760
|
+
var logger15 = createInternalLogger("Share");
|
|
9864
9761
|
var DEFAULT_TIMEOUT_MS2 = 50 * 1e3;
|
|
9865
9762
|
var DEFAULT_PAYLOAD_SNAPSHOT_MAX_LEN = 500;
|
|
9866
9763
|
var DEFAULT_POLL_INTERVAL_MS = 120;
|
|
@@ -9997,7 +9894,7 @@ var createDomShareMonitor = async (page, options = {}) => {
|
|
|
9997
9894
|
const onMatch = typeof options.onMatch === "function" ? options.onMatch : null;
|
|
9998
9895
|
const onTelemetry = typeof options.onTelemetry === "function" ? options.onTelemetry : null;
|
|
9999
9896
|
let matched = false;
|
|
10000
|
-
|
|
9897
|
+
logger15.info(`DOM \u76D1\u542C\u51C6\u5907\u6302\u8F7D: selectors=${toJsonInline(selectors, 120)}, mode=${mode}`);
|
|
10001
9898
|
const monitor = await Mutation.useMonitor(page, selectors, {
|
|
10002
9899
|
mode,
|
|
10003
9900
|
onMutation: (context = {}) => {
|
|
@@ -10015,12 +9912,12 @@ ${text}`;
|
|
|
10015
9912
|
});
|
|
10016
9913
|
}
|
|
10017
9914
|
if (mutationCount <= 5 || mutationCount % 50 === 0) {
|
|
10018
|
-
|
|
9915
|
+
logger15.info(`DOM \u53D8\u5316\u5DF2\u6355\u83B7: mutationCount=${mutationCount}, mutationNodes=${mutationNodes.length}`);
|
|
10019
9916
|
}
|
|
10020
9917
|
const [candidate] = Utils.parseLinks(rawDom, { prefix }) || [];
|
|
10021
9918
|
if (!candidate) return;
|
|
10022
9919
|
matched = true;
|
|
10023
|
-
|
|
9920
|
+
logger15.success("captureLink.domHit", `DOM \u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: mutationCount=${mutationCount}, link=${candidate}`);
|
|
10024
9921
|
if (onMatch) {
|
|
10025
9922
|
onMatch({
|
|
10026
9923
|
link: candidate,
|
|
@@ -10036,7 +9933,7 @@ ${text}`;
|
|
|
10036
9933
|
return {
|
|
10037
9934
|
stop: async () => {
|
|
10038
9935
|
const result = await monitor.stop();
|
|
10039
|
-
|
|
9936
|
+
logger15.info(`DOM \u76D1\u542C\u5DF2\u505C\u6B62: totalMutations=${result?.totalMutations || 0}`);
|
|
10040
9937
|
return result;
|
|
10041
9938
|
}
|
|
10042
9939
|
};
|
|
@@ -10085,8 +9982,8 @@ var Share = {
|
|
|
10085
9982
|
if (share.mode === "response" && apiMatchers.length === 0) {
|
|
10086
9983
|
throw new Error("Share.captureLink requires share.xurl[0] api matcher when mode=response");
|
|
10087
9984
|
}
|
|
10088
|
-
|
|
10089
|
-
|
|
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)}`);
|
|
10090
9987
|
const stats = {
|
|
10091
9988
|
actionTimedOut: false,
|
|
10092
9989
|
domMutationCount: 0,
|
|
@@ -10098,7 +9995,7 @@ var Share = {
|
|
|
10098
9995
|
responseSampleUrls: []
|
|
10099
9996
|
};
|
|
10100
9997
|
if (isAborted()) {
|
|
10101
|
-
|
|
9998
|
+
logger15.warning(`captureLink \u5DF2\u53D6\u6D88: ${abortReason()}`);
|
|
10102
9999
|
return {
|
|
10103
10000
|
link: null,
|
|
10104
10001
|
payloadText: "",
|
|
@@ -10121,7 +10018,7 @@ var Share = {
|
|
|
10121
10018
|
link: validated,
|
|
10122
10019
|
payloadText: String(payloadText || "")
|
|
10123
10020
|
};
|
|
10124
|
-
|
|
10021
|
+
logger15.info(`\u5019\u9009\u94FE\u63A5\u5DF2\u786E\u8BA4: source=${source}, link=${validated}`);
|
|
10125
10022
|
return true;
|
|
10126
10023
|
};
|
|
10127
10024
|
const resolveResponseCandidate = (responseText) => {
|
|
@@ -10156,7 +10053,7 @@ var Share = {
|
|
|
10156
10053
|
try {
|
|
10157
10054
|
await monitor.stop();
|
|
10158
10055
|
} catch (error) {
|
|
10159
|
-
|
|
10056
|
+
logger15.warning(`\u505C\u6B62 DOM \u76D1\u542C\u5931\u8D25: ${error instanceof Error ? error.message : String(error)}`);
|
|
10160
10057
|
}
|
|
10161
10058
|
};
|
|
10162
10059
|
const onResponse = async (response) => {
|
|
@@ -10170,29 +10067,29 @@ var Share = {
|
|
|
10170
10067
|
stats.responseSampleUrls.push(url);
|
|
10171
10068
|
}
|
|
10172
10069
|
if (stats.responseObserved <= 5) {
|
|
10173
|
-
|
|
10070
|
+
logger15.info(`\u63A5\u53E3\u54CD\u5E94\u91C7\u6837(${stats.responseObserved}): ${url}`);
|
|
10174
10071
|
}
|
|
10175
10072
|
if (!apiMatchers.some((matcher) => url.includes(matcher))) return;
|
|
10176
10073
|
stats.responseMatched += 1;
|
|
10177
10074
|
stats.lastMatchedUrl = url;
|
|
10178
|
-
|
|
10075
|
+
logger15.info(`\u63A5\u53E3\u547D\u4E2D\u5339\u914D(${stats.responseMatched}): ${url}`);
|
|
10179
10076
|
const text = await response.text();
|
|
10180
10077
|
const hit = resolveResponseCandidate(text);
|
|
10181
10078
|
if (!hit?.link) {
|
|
10182
10079
|
if (stats.responseMatched <= 3) {
|
|
10183
|
-
|
|
10080
|
+
logger15.info(`\u63A5\u53E3\u89E3\u6790\u5B8C\u6210\u4F46\u672A\u63D0\u53D6\u5230\u5206\u4EAB\u94FE\u63A5: payloadSize=${text.length}`);
|
|
10184
10081
|
}
|
|
10185
10082
|
return;
|
|
10186
10083
|
}
|
|
10187
10084
|
stats.responseResolved += 1;
|
|
10188
|
-
|
|
10085
|
+
logger15.success("captureLink.responseHit", `\u63A5\u53E3\u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: url=${url}, link=${hit.link}`);
|
|
10189
10086
|
setCandidate("response", hit.link, hit.payloadText);
|
|
10190
10087
|
} catch (error) {
|
|
10191
|
-
|
|
10088
|
+
logger15.warning(`\u63A5\u53E3\u54CD\u5E94\u5904\u7406\u5F02\u5E38: ${error instanceof Error ? error.message : String(error)}`);
|
|
10192
10089
|
}
|
|
10193
10090
|
};
|
|
10194
10091
|
if (share.mode === "dom") {
|
|
10195
|
-
|
|
10092
|
+
logger15.info("\u5F53\u524D\u4E3A DOM \u6A21\u5F0F\uFF0C\u4EC5\u542F\u7528 DOM \u76D1\u542C");
|
|
10196
10093
|
domMonitor = await createDomShareMonitor(page, {
|
|
10197
10094
|
prefix: share.prefix,
|
|
10198
10095
|
selectors: domSelectors,
|
|
@@ -10207,17 +10104,17 @@ var Share = {
|
|
|
10207
10104
|
});
|
|
10208
10105
|
}
|
|
10209
10106
|
if (share.mode === "response") {
|
|
10210
|
-
|
|
10107
|
+
logger15.info(`\u5F53\u524D\u4E3A\u63A5\u53E3\u6A21\u5F0F\uFF0C\u6302\u8F7D response \u76D1\u542C: apiMatchers=${toJsonInline(apiMatchers, 160)}`);
|
|
10211
10108
|
page.on("response", onResponse);
|
|
10212
10109
|
}
|
|
10213
10110
|
if (share.mode === "custom") {
|
|
10214
|
-
|
|
10111
|
+
logger15.info("\u5F53\u524D\u4E3A custom \u6A21\u5F0F\uFF0C\u5C06\u4F7F\u7528 performActions \u8FD4\u56DE\u503C");
|
|
10215
10112
|
}
|
|
10216
10113
|
const deadline = timeoutDisabled ? Infinity : Date.now() + timeoutMs;
|
|
10217
10114
|
const getRemainingMs = () => timeoutDisabled ? Infinity : Math.max(0, deadline - Date.now());
|
|
10218
10115
|
try {
|
|
10219
10116
|
const actionTimeout = getRemainingMs();
|
|
10220
|
-
|
|
10117
|
+
logger15.start("captureLink.performActions", `\u6267\u884C\u52A8\u4F5C\u9884\u7B97=${timeoutDisabled ? "disabled" : `${actionTimeout}ms`}`);
|
|
10221
10118
|
let actionValue;
|
|
10222
10119
|
if (!isAborted() && actionTimeout > 0) {
|
|
10223
10120
|
let timer = null;
|
|
@@ -10230,30 +10127,30 @@ var Share = {
|
|
|
10230
10127
|
]);
|
|
10231
10128
|
if (timer) clearTimeout(timer);
|
|
10232
10129
|
if (actionResult.type === "error") {
|
|
10233
|
-
|
|
10130
|
+
logger15.fail("captureLink.performActions", actionResult.error);
|
|
10234
10131
|
throw actionResult.error;
|
|
10235
10132
|
}
|
|
10236
10133
|
if (actionResult.type === "timeout") {
|
|
10237
10134
|
stats.actionTimedOut = true;
|
|
10238
|
-
|
|
10135
|
+
logger15.warning(`performActions \u5DF2\u8D85\u65F6 (${actionTimeout}ms)\uFF0C\u52A8\u4F5C\u53EF\u80FD\u4ECD\u5728\u5F02\u6B65\u6267\u884C`);
|
|
10239
10136
|
} else {
|
|
10240
10137
|
actionValue = actionResult.result;
|
|
10241
|
-
|
|
10138
|
+
logger15.success("captureLink.performActions", "\u6267\u884C\u52A8\u4F5C\u5B8C\u6210");
|
|
10242
10139
|
}
|
|
10243
10140
|
}
|
|
10244
10141
|
if (share.mode === "custom") {
|
|
10245
10142
|
const customLink = typeof actionValue === "string" ? actionValue : actionValue?.link || actionValue?.payloadText;
|
|
10246
10143
|
const customPayloadText = typeof actionValue === "string" ? actionValue : actionValue?.payloadText;
|
|
10247
10144
|
if (setCandidate("custom", customLink, customPayloadText)) {
|
|
10248
|
-
|
|
10145
|
+
logger15.success("captureLink.customResult", `custom \u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: link=${candidates.custom.link}`);
|
|
10249
10146
|
} else {
|
|
10250
|
-
|
|
10147
|
+
logger15.warning("performActions \u6267\u884C\u5B8C\u6210\u4F46\u672A\u8FD4\u56DE\u6709\u6548\u5206\u4EAB\u94FE\u63A5");
|
|
10251
10148
|
}
|
|
10252
10149
|
}
|
|
10253
10150
|
let nextProgressLogTs = Date.now() + 3e3;
|
|
10254
10151
|
while (true) {
|
|
10255
10152
|
if (isAborted()) {
|
|
10256
|
-
|
|
10153
|
+
logger15.warning(`captureLink \u5DF2\u53D6\u6D88: ${abortReason()}`);
|
|
10257
10154
|
return {
|
|
10258
10155
|
link: null,
|
|
10259
10156
|
payloadText: "",
|
|
@@ -10263,7 +10160,7 @@ var Share = {
|
|
|
10263
10160
|
}
|
|
10264
10161
|
const selected = candidates[share.mode];
|
|
10265
10162
|
if (selected?.link) {
|
|
10266
|
-
|
|
10163
|
+
logger15.success("captureLink", `\u6355\u83B7\u6210\u529F: source=${share.mode}, link=${selected.link}`);
|
|
10267
10164
|
return {
|
|
10268
10165
|
link: selected.link,
|
|
10269
10166
|
payloadText: selected.payloadText,
|
|
@@ -10276,7 +10173,7 @@ var Share = {
|
|
|
10276
10173
|
if (remaining <= 0) break;
|
|
10277
10174
|
const now = Date.now();
|
|
10278
10175
|
if (now >= nextProgressLogTs) {
|
|
10279
|
-
|
|
10176
|
+
logger15.info(
|
|
10280
10177
|
`captureLink \u7B49\u5F85\u4E2D: remaining=${timeoutDisabled ? "disabled" : `${remaining}ms`}, domMutationCount=${stats.domMutationCount}, responseMatched=${stats.responseMatched}`
|
|
10281
10178
|
);
|
|
10282
10179
|
nextProgressLogTs = now + 5e3;
|
|
@@ -10284,11 +10181,11 @@ var Share = {
|
|
|
10284
10181
|
await delay5(Math.max(0, Math.min(DEFAULT_POLL_INTERVAL_MS, remaining)));
|
|
10285
10182
|
}
|
|
10286
10183
|
if (!timeoutDisabled && share.mode === "response" && stats.responseMatched === 0) {
|
|
10287
|
-
|
|
10184
|
+
logger15.warning(
|
|
10288
10185
|
`\u63A5\u53E3\u76D1\u542C\u672A\u547D\u4E2D: apiMatchers=${toJsonInline(apiMatchers, 220)}, \u54CD\u5E94\u6837\u672CURLs=${toJsonInline(stats.responseSampleUrls, 420)}`
|
|
10289
10186
|
);
|
|
10290
10187
|
}
|
|
10291
|
-
|
|
10188
|
+
logger15.warning(
|
|
10292
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"}`
|
|
10293
10190
|
);
|
|
10294
10191
|
return {
|
|
@@ -10300,7 +10197,7 @@ var Share = {
|
|
|
10300
10197
|
} finally {
|
|
10301
10198
|
if (share.mode === "response") {
|
|
10302
10199
|
page.off("response", onResponse);
|
|
10303
|
-
|
|
10200
|
+
logger15.info("response \u76D1\u542C\u5DF2\u5378\u8F7D");
|
|
10304
10201
|
}
|
|
10305
10202
|
await stopDomMonitor();
|
|
10306
10203
|
}
|