@skrillex1224/playwright-toolkit 2.1.276 → 2.1.277
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 +22 -1
- package/dist/browser.js.map +3 -3
- package/dist/index.cjs +661 -125
- package/dist/index.cjs.map +4 -4
- package/dist/index.js +661 -125
- package/dist/index.js.map +4 -4
- package/index.d.ts +12 -2
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -13,9 +13,11 @@ __export(constants_exports, {
|
|
|
13
13
|
ActorInfo: () => ActorInfo,
|
|
14
14
|
Code: () => Code,
|
|
15
15
|
Device: () => Device,
|
|
16
|
+
Mode: () => Mode,
|
|
16
17
|
PresetOfLiveViewKey: () => PresetOfLiveViewKey,
|
|
17
18
|
Status: () => Status,
|
|
18
|
-
normalizeDevice: () => normalizeDevice
|
|
19
|
+
normalizeDevice: () => normalizeDevice,
|
|
20
|
+
normalizeMode: () => normalizeMode
|
|
19
21
|
});
|
|
20
22
|
var Code = {
|
|
21
23
|
Success: 0,
|
|
@@ -35,6 +37,10 @@ var Device = Object.freeze({
|
|
|
35
37
|
Desktop: "desktop",
|
|
36
38
|
Mobile: "mobile"
|
|
37
39
|
});
|
|
40
|
+
var Mode = Object.freeze({
|
|
41
|
+
Default: "default",
|
|
42
|
+
CloakBrowser: "cloakbrowser"
|
|
43
|
+
});
|
|
38
44
|
var normalizeDevice = (value, fallback = Device.Desktop) => {
|
|
39
45
|
const normalizedFallback = String(fallback || "").trim().toLowerCase() === Device.Mobile ? Device.Mobile : Device.Desktop;
|
|
40
46
|
const raw = String(value || "").trim().toLowerCase();
|
|
@@ -42,6 +48,13 @@ var normalizeDevice = (value, fallback = Device.Desktop) => {
|
|
|
42
48
|
if (raw === Device.Desktop) return Device.Desktop;
|
|
43
49
|
return normalizedFallback;
|
|
44
50
|
};
|
|
51
|
+
var normalizeMode = (value, fallback = Mode.Default) => {
|
|
52
|
+
const normalizedFallback = String(fallback || "").trim().toLowerCase() === Mode.CloakBrowser ? Mode.CloakBrowser : Mode.Default;
|
|
53
|
+
const raw = String(value || "").trim().toLowerCase();
|
|
54
|
+
if (raw === Mode.CloakBrowser) return Mode.CloakBrowser;
|
|
55
|
+
if (raw === Mode.Default) return Mode.Default;
|
|
56
|
+
return normalizedFallback;
|
|
57
|
+
};
|
|
45
58
|
var createActorInfo = (info) => {
|
|
46
59
|
const normalizeDomain = (value) => {
|
|
47
60
|
if (!value) return "";
|
|
@@ -2449,8 +2462,7 @@ var Utils = {
|
|
|
2449
2462
|
}
|
|
2450
2463
|
};
|
|
2451
2464
|
|
|
2452
|
-
// src/anti-cheat.js
|
|
2453
|
-
var logger5 = createInternalLogger("AntiCheat");
|
|
2465
|
+
// src/internals/anti-cheat/default.js
|
|
2454
2466
|
var BASE_CONFIG = Object.freeze({
|
|
2455
2467
|
locale: "zh-CN",
|
|
2456
2468
|
acceptLanguage: "zh-CN,zh;q=0.9",
|
|
@@ -2485,7 +2497,7 @@ function buildFingerprintOptions({ locale = BASE_CONFIG.locale, browserMajorVers
|
|
|
2485
2497
|
}
|
|
2486
2498
|
return options;
|
|
2487
2499
|
}
|
|
2488
|
-
var
|
|
2500
|
+
var DefaultAntiCheat = {
|
|
2489
2501
|
/**
|
|
2490
2502
|
* 获取统一的基础配置
|
|
2491
2503
|
*/
|
|
@@ -2522,6 +2534,44 @@ var AntiCheat = {
|
|
|
2522
2534
|
}
|
|
2523
2535
|
};
|
|
2524
2536
|
|
|
2537
|
+
// src/internals/anti-cheat/cloakbrowser.js
|
|
2538
|
+
var CloakBrowserAntiCheat = DefaultAntiCheat;
|
|
2539
|
+
|
|
2540
|
+
// src/internals/toolkit-mode.js
|
|
2541
|
+
var currentMode = Mode.Default;
|
|
2542
|
+
var getToolkitMode = () => currentMode;
|
|
2543
|
+
var setToolkitMode = (mode = Mode.Default) => {
|
|
2544
|
+
currentMode = normalizeMode(mode, Mode.Default);
|
|
2545
|
+
return currentMode;
|
|
2546
|
+
};
|
|
2547
|
+
|
|
2548
|
+
// src/anti-cheat.js
|
|
2549
|
+
var resolveAntiCheatDelegate = () => getToolkitMode() === Mode.CloakBrowser ? CloakBrowserAntiCheat : DefaultAntiCheat;
|
|
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 = {
|
|
2558
|
+
getBaseConfig() {
|
|
2559
|
+
return callAntiCheat("getBaseConfig");
|
|
2560
|
+
},
|
|
2561
|
+
getFingerprintGeneratorOptions(options = {}) {
|
|
2562
|
+
return callAntiCheat("getFingerprintGeneratorOptions", options);
|
|
2563
|
+
},
|
|
2564
|
+
getLaunchArgs(options = {}) {
|
|
2565
|
+
return callAntiCheat("getLaunchArgs", options);
|
|
2566
|
+
},
|
|
2567
|
+
getTlsFingerprintOptions(userAgent = "", acceptLanguage = "", options = {}) {
|
|
2568
|
+
return callAntiCheat("getTlsFingerprintOptions", userAgent, acceptLanguage, options);
|
|
2569
|
+
},
|
|
2570
|
+
applyLocaleHeaders(headers, acceptLanguage = "") {
|
|
2571
|
+
return callAntiCheat("applyLocaleHeaders", headers, acceptLanguage);
|
|
2572
|
+
}
|
|
2573
|
+
};
|
|
2574
|
+
|
|
2525
2575
|
// src/device-input.js
|
|
2526
2576
|
var resolveDeviceFromPage = (page) => normalizeDevice(page?.[PageRuntimeStateKey]?.device);
|
|
2527
2577
|
var assertPage = (page, method) => {
|
|
@@ -3075,7 +3125,7 @@ var DeviceView = {
|
|
|
3075
3125
|
// src/internals/humanize/desktop.js
|
|
3076
3126
|
import delay2 from "delay";
|
|
3077
3127
|
import { createCursor } from "ghost-cursor-playwright";
|
|
3078
|
-
var
|
|
3128
|
+
var logger5 = createInternalLogger("Humanize");
|
|
3079
3129
|
var $CursorWeakMap = /* @__PURE__ */ new WeakMap();
|
|
3080
3130
|
function $GetCursor(page) {
|
|
3081
3131
|
const cursor = $CursorWeakMap.get(page);
|
|
@@ -3103,13 +3153,13 @@ var Humanize = {
|
|
|
3103
3153
|
*/
|
|
3104
3154
|
async initializeCursor(page) {
|
|
3105
3155
|
if ($CursorWeakMap.has(page)) {
|
|
3106
|
-
|
|
3156
|
+
logger5.debug("initializeCursor: cursor already exists, skipping");
|
|
3107
3157
|
return;
|
|
3108
3158
|
}
|
|
3109
|
-
|
|
3159
|
+
logger5.start("initializeCursor", "creating cursor");
|
|
3110
3160
|
const cursor = await createCursor(page);
|
|
3111
3161
|
$CursorWeakMap.set(page, cursor);
|
|
3112
|
-
|
|
3162
|
+
logger5.success("initializeCursor", "cursor initialized");
|
|
3113
3163
|
},
|
|
3114
3164
|
/**
|
|
3115
3165
|
* 人类化鼠标移动 - 使用 ghost-cursor 移动到指定位置或元素
|
|
@@ -3119,17 +3169,17 @@ var Humanize = {
|
|
|
3119
3169
|
*/
|
|
3120
3170
|
async humanMove(page, target) {
|
|
3121
3171
|
const cursor = $GetCursor(page);
|
|
3122
|
-
|
|
3172
|
+
logger5.start("humanMove", `target=${typeof target === "string" ? target : "element/coords"}`);
|
|
3123
3173
|
try {
|
|
3124
3174
|
if (typeof target === "string") {
|
|
3125
3175
|
const element = await page.$(target);
|
|
3126
3176
|
if (!element) {
|
|
3127
|
-
|
|
3177
|
+
logger5.warn(`humanMove: \u5143\u7D20\u4E0D\u5B58\u5728 ${target}`);
|
|
3128
3178
|
return false;
|
|
3129
3179
|
}
|
|
3130
3180
|
const box = await element.boundingBox();
|
|
3131
3181
|
if (!box) {
|
|
3132
|
-
|
|
3182
|
+
logger5.warn(`humanMove: \u65E0\u6CD5\u83B7\u53D6\u4F4D\u7F6E ${target}`);
|
|
3133
3183
|
return false;
|
|
3134
3184
|
}
|
|
3135
3185
|
const x = box.x + box.width / 2 + (Math.random() - 0.5) * box.width * 0.2;
|
|
@@ -3145,10 +3195,10 @@ var Humanize = {
|
|
|
3145
3195
|
await cursor.actions.move({ x, y });
|
|
3146
3196
|
}
|
|
3147
3197
|
}
|
|
3148
|
-
|
|
3198
|
+
logger5.success("humanMove");
|
|
3149
3199
|
return true;
|
|
3150
3200
|
} catch (error) {
|
|
3151
|
-
|
|
3201
|
+
logger5.fail("humanMove", error);
|
|
3152
3202
|
throw error;
|
|
3153
3203
|
}
|
|
3154
3204
|
},
|
|
@@ -3172,12 +3222,12 @@ var Humanize = {
|
|
|
3172
3222
|
maxDurationMs = maxSteps * 220 + 800
|
|
3173
3223
|
} = options;
|
|
3174
3224
|
const targetDesc = typeof target === "string" ? target : "ElementHandle";
|
|
3175
|
-
|
|
3225
|
+
logger5.start("humanScroll", `target=${targetDesc}`);
|
|
3176
3226
|
let element;
|
|
3177
3227
|
if (typeof target === "string") {
|
|
3178
3228
|
element = await page.$(target);
|
|
3179
3229
|
if (!element) {
|
|
3180
|
-
|
|
3230
|
+
logger5.warn(`humanScroll | \u5143\u7D20\u672A\u627E\u5230: ${target}`);
|
|
3181
3231
|
return { element: null, didScroll: false };
|
|
3182
3232
|
}
|
|
3183
3233
|
} else {
|
|
@@ -3252,26 +3302,26 @@ var Humanize = {
|
|
|
3252
3302
|
try {
|
|
3253
3303
|
for (let i = 0; i < maxSteps; i++) {
|
|
3254
3304
|
if (Date.now() - startTime > maxDurationMs) {
|
|
3255
|
-
|
|
3305
|
+
logger5.warn(`humanScroll | \u8D85\u65F6\u4FDD\u62A4\u89E6\u53D1 (${maxDurationMs}ms)`);
|
|
3256
3306
|
return { element, didScroll };
|
|
3257
3307
|
}
|
|
3258
3308
|
const status = await checkVisibility();
|
|
3259
3309
|
if (status.code === "VISIBLE") {
|
|
3260
3310
|
if (status.isFixed) {
|
|
3261
|
-
|
|
3311
|
+
logger5.info("humanScroll | fixed \u5BB9\u5668\u5185\uFF0C\u8DF3\u8FC7\u6EDA\u52A8");
|
|
3262
3312
|
} else {
|
|
3263
|
-
|
|
3313
|
+
logger5.debug("humanScroll | \u5143\u7D20\u53EF\u89C1\u4E14\u65E0\u906E\u6321");
|
|
3264
3314
|
}
|
|
3265
|
-
|
|
3315
|
+
logger5.success("humanScroll", didScroll ? "\u5DF2\u6EDA\u52A8" : "\u65E0\u9700\u6EDA\u52A8");
|
|
3266
3316
|
return { element, didScroll };
|
|
3267
3317
|
}
|
|
3268
|
-
|
|
3318
|
+
logger5.debug(`humanScroll | \u6B65\u9AA4 ${i + 1}/${maxSteps}: ${status.reason} ${status.direction ? `(${status.direction})` : ""}`);
|
|
3269
3319
|
if (status.code === "OBSTRUCTED" && status.obstruction) {
|
|
3270
|
-
|
|
3320
|
+
logger5.debug(`humanScroll | \u88AB\u4EE5\u4E0B\u5143\u7D20\u906E\u6321 <${status.obstruction.tag} id="${status.obstruction.id}">`);
|
|
3271
3321
|
}
|
|
3272
3322
|
const scrollRect = await getScrollableRect2();
|
|
3273
3323
|
if (!scrollRect && status.isFixed) {
|
|
3274
|
-
|
|
3324
|
+
logger5.warn("humanScroll | fixed \u5BB9\u5668\u5185\u4E14\u65E0\u53EF\u6EDA\u52A8\u7956\u5148\uFF0C\u8DF3\u8FC7\u6EDA\u52A8");
|
|
3275
3325
|
return { element, didScroll };
|
|
3276
3326
|
}
|
|
3277
3327
|
const stepMin = scrollRect ? Math.min(minStep, Math.max(60, scrollRect.height * 0.4)) : minStep;
|
|
@@ -3307,10 +3357,10 @@ var Humanize = {
|
|
|
3307
3357
|
didScroll = true;
|
|
3308
3358
|
await delay2(this.jitterMs(20 + Math.random() * 40, 0.2));
|
|
3309
3359
|
}
|
|
3310
|
-
|
|
3360
|
+
logger5.warn(`humanScroll | \u5728 ${maxSteps} \u6B65\u540E\u65E0\u6CD5\u786E\u4FDD\u53EF\u89C1\u6027`);
|
|
3311
3361
|
return { element, didScroll };
|
|
3312
3362
|
} catch (error) {
|
|
3313
|
-
|
|
3363
|
+
logger5.fail("humanScroll", error);
|
|
3314
3364
|
throw error;
|
|
3315
3365
|
}
|
|
3316
3366
|
},
|
|
@@ -3328,7 +3378,7 @@ var Humanize = {
|
|
|
3328
3378
|
const cursor = $GetCursor(page);
|
|
3329
3379
|
const { reactionDelay = 250, throwOnMissing = true, scrollIfNeeded = true, restore = false } = options;
|
|
3330
3380
|
const targetDesc = target == null ? "Current Position" : typeof target === "string" ? target : "ElementHandle";
|
|
3331
|
-
|
|
3381
|
+
logger5.start("humanClick", `target=${targetDesc}`);
|
|
3332
3382
|
const restoreOnce = async () => {
|
|
3333
3383
|
if (restoreOnce.restored) return;
|
|
3334
3384
|
restoreOnce.restored = true;
|
|
@@ -3337,14 +3387,14 @@ var Humanize = {
|
|
|
3337
3387
|
await delay2(this.jitterMs(1e3));
|
|
3338
3388
|
await restoreOnce.do();
|
|
3339
3389
|
} catch (restoreError) {
|
|
3340
|
-
|
|
3390
|
+
logger5.warn(`humanClick: \u6062\u590D\u6EDA\u52A8\u4F4D\u7F6E\u5931\u8D25: ${restoreError.message}`);
|
|
3341
3391
|
}
|
|
3342
3392
|
};
|
|
3343
3393
|
try {
|
|
3344
3394
|
if (target == null) {
|
|
3345
3395
|
await delay2(this.jitterMs(reactionDelay, 0.4));
|
|
3346
3396
|
await cursor.actions.click();
|
|
3347
|
-
|
|
3397
|
+
logger5.success("humanClick", "Clicked current position");
|
|
3348
3398
|
return true;
|
|
3349
3399
|
}
|
|
3350
3400
|
let element;
|
|
@@ -3354,7 +3404,7 @@ var Humanize = {
|
|
|
3354
3404
|
if (throwOnMissing) {
|
|
3355
3405
|
throw new Error(`\u627E\u4E0D\u5230\u5143\u7D20 ${target}`);
|
|
3356
3406
|
}
|
|
3357
|
-
|
|
3407
|
+
logger5.warn(`humanClick: \u5143\u7D20\u4E0D\u5B58\u5728\uFF0C\u8DF3\u8FC7\u70B9\u51FB ${target}`);
|
|
3358
3408
|
return false;
|
|
3359
3409
|
}
|
|
3360
3410
|
} else {
|
|
@@ -3370,7 +3420,7 @@ var Humanize = {
|
|
|
3370
3420
|
if (throwOnMissing) {
|
|
3371
3421
|
throw new Error("\u65E0\u6CD5\u83B7\u53D6\u5143\u7D20\u4F4D\u7F6E");
|
|
3372
3422
|
}
|
|
3373
|
-
|
|
3423
|
+
logger5.warn("humanClick: \u65E0\u6CD5\u83B7\u53D6\u4F4D\u7F6E\uFF0C\u8DF3\u8FC7\u70B9\u51FB");
|
|
3374
3424
|
return false;
|
|
3375
3425
|
}
|
|
3376
3426
|
const x = box.x + box.width / 2 + (Math.random() - 0.5) * box.width * 0.3;
|
|
@@ -3379,11 +3429,11 @@ var Humanize = {
|
|
|
3379
3429
|
await delay2(this.jitterMs(reactionDelay, 0.4));
|
|
3380
3430
|
await cursor.actions.click();
|
|
3381
3431
|
await restoreOnce();
|
|
3382
|
-
|
|
3432
|
+
logger5.success("humanClick");
|
|
3383
3433
|
return true;
|
|
3384
3434
|
} catch (error) {
|
|
3385
3435
|
await restoreOnce();
|
|
3386
|
-
|
|
3436
|
+
logger5.fail("humanClick", error);
|
|
3387
3437
|
throw error;
|
|
3388
3438
|
}
|
|
3389
3439
|
},
|
|
@@ -3394,9 +3444,9 @@ var Humanize = {
|
|
|
3394
3444
|
*/
|
|
3395
3445
|
async randomSleep(baseMs, jitterPercent = 0.3) {
|
|
3396
3446
|
const ms = this.jitterMs(baseMs, jitterPercent);
|
|
3397
|
-
|
|
3447
|
+
logger5.start("randomSleep", `base=${baseMs}, actual=${ms}ms`);
|
|
3398
3448
|
await delay2(ms);
|
|
3399
|
-
|
|
3449
|
+
logger5.success("randomSleep");
|
|
3400
3450
|
},
|
|
3401
3451
|
/**
|
|
3402
3452
|
* 模拟人类"注视"或"阅读"行为:鼠标在页面上随机微动
|
|
@@ -3406,7 +3456,7 @@ var Humanize = {
|
|
|
3406
3456
|
async simulateGaze(page, baseDurationMs = 2500) {
|
|
3407
3457
|
const cursor = $GetCursor(page);
|
|
3408
3458
|
const durationMs = this.jitterMs(baseDurationMs, 0.4);
|
|
3409
|
-
|
|
3459
|
+
logger5.start("simulateGaze", `duration=${durationMs}ms`);
|
|
3410
3460
|
const startTime = Date.now();
|
|
3411
3461
|
const viewportSize = page.viewportSize() || { width: 1920, height: 1080 };
|
|
3412
3462
|
while (Date.now() - startTime < durationMs) {
|
|
@@ -3415,7 +3465,7 @@ var Humanize = {
|
|
|
3415
3465
|
await cursor.actions.move({ x, y });
|
|
3416
3466
|
await delay2(this.jitterMs(600, 0.5));
|
|
3417
3467
|
}
|
|
3418
|
-
|
|
3468
|
+
logger5.success("simulateGaze");
|
|
3419
3469
|
},
|
|
3420
3470
|
/**
|
|
3421
3471
|
* 人类化输入 - 带节奏变化(快-慢-停顿-偶尔加速)
|
|
@@ -3428,7 +3478,7 @@ var Humanize = {
|
|
|
3428
3478
|
* @param {number} [options.pauseBase=800] - 停顿时长基础值 (ms),实际 ±50% 抖动
|
|
3429
3479
|
*/
|
|
3430
3480
|
async humanType(page, selector, text, options = {}) {
|
|
3431
|
-
|
|
3481
|
+
logger5.start("humanType", `selector=${selector}, textLen=${text.length}`);
|
|
3432
3482
|
const {
|
|
3433
3483
|
baseDelay = 180,
|
|
3434
3484
|
pauseProbability = 0.08,
|
|
@@ -3452,13 +3502,13 @@ var Humanize = {
|
|
|
3452
3502
|
await delay2(charDelay);
|
|
3453
3503
|
if (Math.random() < pauseProbability && i < text.length - 1) {
|
|
3454
3504
|
const pauseTime = this.jitterMs(pauseBase, 0.5);
|
|
3455
|
-
|
|
3505
|
+
logger5.debug(`\u505C\u987F ${pauseTime}ms...`);
|
|
3456
3506
|
await delay2(pauseTime);
|
|
3457
3507
|
}
|
|
3458
3508
|
}
|
|
3459
|
-
|
|
3509
|
+
logger5.success("humanType");
|
|
3460
3510
|
} catch (error) {
|
|
3461
|
-
|
|
3511
|
+
logger5.fail("humanType", error);
|
|
3462
3512
|
throw error;
|
|
3463
3513
|
}
|
|
3464
3514
|
},
|
|
@@ -3482,7 +3532,7 @@ var Humanize = {
|
|
|
3482
3532
|
keyboardOptions = {}
|
|
3483
3533
|
} = pressOptions || {};
|
|
3484
3534
|
const targetDesc = hasTarget ? typeof targetOrKey === "string" ? targetOrKey : "ElementHandle" : "current focus";
|
|
3485
|
-
|
|
3535
|
+
logger5.start("humanPress", `key=${key}, target=${targetDesc}`);
|
|
3486
3536
|
try {
|
|
3487
3537
|
if (hasTarget) {
|
|
3488
3538
|
await this.humanClick(page, targetOrKey, { reactionDelay: focusDelay, scrollIfNeeded, throwOnMissing });
|
|
@@ -3492,10 +3542,10 @@ var Humanize = {
|
|
|
3492
3542
|
...keyboardOptions,
|
|
3493
3543
|
delay: this.jitterMs(holdDelay, 0.5)
|
|
3494
3544
|
});
|
|
3495
|
-
|
|
3545
|
+
logger5.success("humanPress");
|
|
3496
3546
|
return true;
|
|
3497
3547
|
} catch (error) {
|
|
3498
|
-
|
|
3548
|
+
logger5.fail("humanPress", error);
|
|
3499
3549
|
throw error;
|
|
3500
3550
|
}
|
|
3501
3551
|
},
|
|
@@ -3505,22 +3555,22 @@ var Humanize = {
|
|
|
3505
3555
|
* @param {string} selector - 输入框选择器
|
|
3506
3556
|
*/
|
|
3507
3557
|
async humanClear(page, selector) {
|
|
3508
|
-
|
|
3558
|
+
logger5.start("humanClear", `selector=${selector}`);
|
|
3509
3559
|
try {
|
|
3510
3560
|
const locator = page.locator(selector);
|
|
3511
3561
|
await locator.click();
|
|
3512
3562
|
await delay2(this.jitterMs(200, 0.4));
|
|
3513
3563
|
const currentValue = await locator.inputValue();
|
|
3514
3564
|
if (!currentValue || currentValue.length === 0) {
|
|
3515
|
-
|
|
3565
|
+
logger5.success("humanClear", "already empty");
|
|
3516
3566
|
return;
|
|
3517
3567
|
}
|
|
3518
3568
|
await page.keyboard.press("Meta+A");
|
|
3519
3569
|
await delay2(this.jitterMs(100, 0.4));
|
|
3520
3570
|
await page.keyboard.press("Backspace");
|
|
3521
|
-
|
|
3571
|
+
logger5.success("humanClear");
|
|
3522
3572
|
} catch (error) {
|
|
3523
|
-
|
|
3573
|
+
logger5.fail("humanClear", error);
|
|
3524
3574
|
throw error;
|
|
3525
3575
|
}
|
|
3526
3576
|
},
|
|
@@ -3532,7 +3582,7 @@ var Humanize = {
|
|
|
3532
3582
|
async warmUpBrowsing(page, baseDuration = 3500) {
|
|
3533
3583
|
const cursor = $GetCursor(page);
|
|
3534
3584
|
const durationMs = this.jitterMs(baseDuration, 0.4);
|
|
3535
|
-
|
|
3585
|
+
logger5.start("warmUpBrowsing", `duration=${durationMs}ms`);
|
|
3536
3586
|
const startTime = Date.now();
|
|
3537
3587
|
const viewportSize = page.viewportSize() || { width: 1920, height: 1080 };
|
|
3538
3588
|
try {
|
|
@@ -3551,9 +3601,9 @@ var Humanize = {
|
|
|
3551
3601
|
await delay2(this.jitterMs(800, 0.5));
|
|
3552
3602
|
}
|
|
3553
3603
|
}
|
|
3554
|
-
|
|
3604
|
+
logger5.success("warmUpBrowsing");
|
|
3555
3605
|
} catch (error) {
|
|
3556
|
-
|
|
3606
|
+
logger5.fail("warmUpBrowsing", error);
|
|
3557
3607
|
throw error;
|
|
3558
3608
|
}
|
|
3559
3609
|
},
|
|
@@ -3567,7 +3617,7 @@ var Humanize = {
|
|
|
3567
3617
|
async naturalScroll(page, direction = "down", distance = 300, baseSteps = 5) {
|
|
3568
3618
|
const steps = Math.max(3, baseSteps + Math.floor(Math.random() * 3) - 1);
|
|
3569
3619
|
const actualDistance = this.jitterMs(distance, 0.15);
|
|
3570
|
-
|
|
3620
|
+
logger5.start("naturalScroll", `dir=${direction}, dist=${actualDistance}, steps=${steps}`);
|
|
3571
3621
|
const sign = direction === "down" ? 1 : -1;
|
|
3572
3622
|
const stepDistance = actualDistance / steps;
|
|
3573
3623
|
try {
|
|
@@ -3579,9 +3629,9 @@ var Humanize = {
|
|
|
3579
3629
|
const baseDelay = 60 + i * 25;
|
|
3580
3630
|
await delay2(this.jitterMs(baseDelay, 0.3));
|
|
3581
3631
|
}
|
|
3582
|
-
|
|
3632
|
+
logger5.success("naturalScroll");
|
|
3583
3633
|
} catch (error) {
|
|
3584
|
-
|
|
3634
|
+
logger5.fail("naturalScroll", error);
|
|
3585
3635
|
throw error;
|
|
3586
3636
|
}
|
|
3587
3637
|
}
|
|
@@ -3610,7 +3660,7 @@ var resolveElement = async (page, target, { throwOnMissing = true } = {}) => {
|
|
|
3610
3660
|
var waitJitter = (base, jitterPercent = 0.3) => delay3(jitterMs(base, jitterPercent));
|
|
3611
3661
|
|
|
3612
3662
|
// src/internals/humanize/mobile.js
|
|
3613
|
-
var
|
|
3663
|
+
var logger6 = createInternalLogger("Humanize.Mobile");
|
|
3614
3664
|
var initializedPages = /* @__PURE__ */ new WeakSet();
|
|
3615
3665
|
var DEFAULT_TAP_TIMEOUT_MS = 2500;
|
|
3616
3666
|
var DEFAULT_MOUSE_TAP_FALLBACK_TIMEOUT_MS = 1200;
|
|
@@ -4067,7 +4117,7 @@ var dispatchTouchSwipe = async (page, deltaY, options = {}) => {
|
|
|
4067
4117
|
}
|
|
4068
4118
|
return true;
|
|
4069
4119
|
} catch (error) {
|
|
4070
|
-
|
|
4120
|
+
logger6.debug(`touch swipe fallback: ${error?.message || error}`);
|
|
4071
4121
|
try {
|
|
4072
4122
|
await page.evaluate((amount) => window.scrollBy(0, amount), deltaY);
|
|
4073
4123
|
await waitJitter(120, 0.35);
|
|
@@ -4101,7 +4151,7 @@ var tapPoint = async (page, point, options = {}) => {
|
|
|
4101
4151
|
);
|
|
4102
4152
|
return { method: "touchscreen" };
|
|
4103
4153
|
} catch (error) {
|
|
4104
|
-
|
|
4154
|
+
logger6.warn(`tapPoint | touchscreen.tap \u5931\u8D25\u6216\u8D85\u65F6\uFF0C\u5C1D\u8BD5\u9F20\u6807\u515C\u5E95: ${error?.message || error}`);
|
|
4105
4155
|
if (!allowMouseFallback) throw error;
|
|
4106
4156
|
}
|
|
4107
4157
|
}
|
|
@@ -4117,10 +4167,10 @@ var MobileHumanize = {
|
|
|
4117
4167
|
async initializeCursor(page) {
|
|
4118
4168
|
if (initializedPages.has(page)) return;
|
|
4119
4169
|
initializedPages.add(page);
|
|
4120
|
-
|
|
4170
|
+
logger6.debug("initializeCursor: mobile mode uses touch gestures, cursor init skipped");
|
|
4121
4171
|
},
|
|
4122
4172
|
async humanMove(page, target) {
|
|
4123
|
-
|
|
4173
|
+
logger6.debug(`humanMove: mobile no-op target=${typeof target === "string" ? target : "element/coords"}`);
|
|
4124
4174
|
if (typeof target === "string" || target && typeof target.boundingBox === "function") {
|
|
4125
4175
|
const element = await resolveElement(page, target, { throwOnMissing: false });
|
|
4126
4176
|
if (!element) {
|
|
@@ -4139,10 +4189,10 @@ var MobileHumanize = {
|
|
|
4139
4189
|
throwOnMissing = false
|
|
4140
4190
|
} = options;
|
|
4141
4191
|
const targetDesc = describeTarget(target);
|
|
4142
|
-
|
|
4192
|
+
logger6.start("humanScroll", `target=${targetDesc}`);
|
|
4143
4193
|
const element = await resolveElement(page, target, { throwOnMissing });
|
|
4144
4194
|
if (!element) {
|
|
4145
|
-
|
|
4195
|
+
logger6.warn(`humanScroll | \u5143\u7D20\u672A\u627E\u5230: ${targetDesc}`);
|
|
4146
4196
|
return { element: null, didScroll: false, restore: null };
|
|
4147
4197
|
}
|
|
4148
4198
|
const startTime = Date.now();
|
|
@@ -4151,42 +4201,42 @@ var MobileHumanize = {
|
|
|
4151
4201
|
const status = await checkElementVisibility(element);
|
|
4152
4202
|
if (status.code === "VISIBLE") {
|
|
4153
4203
|
if (status.isFixed) {
|
|
4154
|
-
|
|
4204
|
+
logger6.info("humanScroll | fixed/sticky \u5BB9\u5668\u5185\uFF0C\u8DF3\u8FC7\u6EDA\u52A8");
|
|
4155
4205
|
} else {
|
|
4156
|
-
|
|
4206
|
+
logger6.debug("humanScroll | \u5143\u7D20\u53EF\u89C1\u4E14\u65E0\u906E\u6321");
|
|
4157
4207
|
}
|
|
4158
|
-
|
|
4208
|
+
logger6.success("humanScroll", didScroll ? "\u5DF2\u6EDA\u52A8" : "\u65E0\u9700\u6EDA\u52A8");
|
|
4159
4209
|
return { element, didScroll, restore: null };
|
|
4160
4210
|
}
|
|
4161
4211
|
if (status.code === "ZERO_DIMENSIONS" || status.code === "NOT_INTERACTABLE") {
|
|
4162
|
-
|
|
4212
|
+
logger6.warn(`humanScroll | \u5143\u7D20\u4E0D\u53EF\u6EDA\u52A8\u81F3\u53EF\u70B9\u51FB\u72B6\u6001: ${status.reason || status.code}`);
|
|
4163
4213
|
return { element, didScroll, restore: null };
|
|
4164
4214
|
}
|
|
4165
4215
|
const scrollRect = await getScrollableRect(element);
|
|
4166
4216
|
if (!scrollRect && status.isFixed && status.code === "OUT_OF_VIEWPORT") {
|
|
4167
|
-
|
|
4217
|
+
logger6.warn(`humanScroll | fixed/sticky \u76EE\u6807\u4E0D\u5728\u89C6\u53E3\u5185\uFF0C\u9875\u9762\u6EDA\u52A8\u65E0\u6CD5\u6539\u53D8\u5176\u4F4D\u7F6E (direction=${status.direction || "unknown"})`);
|
|
4168
4218
|
return { element, didScroll, restore: null, unscrollable: true };
|
|
4169
4219
|
}
|
|
4170
4220
|
if (!scrollRect && status.isFixed && status.code === "OBSTRUCTED") {
|
|
4171
|
-
|
|
4221
|
+
logger6.warn(`humanScroll | fixed/sticky \u76EE\u6807\u88AB\u906E\u6321\uFF0C\u6EDA\u52A8\u65E0\u6CD5\u89E3\u9664 (${status.obstruction?.tag || "unknown"})`);
|
|
4172
4222
|
return { element, didScroll, restore: null, unscrollable: true };
|
|
4173
4223
|
}
|
|
4174
4224
|
if (scrollRect && status.code === "OBSTRUCTED" && status.obstruction?.isFixed) {
|
|
4175
4225
|
const moved = await scrollAwayFromObstruction(element, status);
|
|
4176
4226
|
if (moved.moved) {
|
|
4177
|
-
|
|
4227
|
+
logger6.debug(`humanScroll | sticky/fixed \u906E\u6321\u8865\u507F\u6EDA\u52A8 top=${Math.round(moved.scrollTop || 0)}`);
|
|
4178
4228
|
await waitJitter(90, 0.3);
|
|
4179
4229
|
didScroll = true;
|
|
4180
4230
|
continue;
|
|
4181
4231
|
}
|
|
4182
4232
|
}
|
|
4183
4233
|
if (Date.now() - startTime > maxDurationMs) {
|
|
4184
|
-
|
|
4234
|
+
logger6.warn(`humanScroll | mobile timeout (${maxDurationMs}ms, status=${status.code}, direction=${status.direction || "unknown"}, fixed=${Boolean(status.isFixed)})`);
|
|
4185
4235
|
return { element, didScroll, restore: null };
|
|
4186
4236
|
}
|
|
4187
4237
|
const stepMin = scrollRect ? Math.min(minStep, Math.max(60, scrollRect.height * 0.4)) : minStep;
|
|
4188
4238
|
const stepMax = scrollRect ? Math.min(maxStep, Math.max(stepMin + 40, scrollRect.height * 0.8)) : maxStep;
|
|
4189
|
-
|
|
4239
|
+
logger6.debug(`humanScroll | \u6B65\u9AA4 ${i + 1}/${maxSteps}: ${status.reason || status.code} ${status.direction ? `(${status.direction})` : ""}`);
|
|
4190
4240
|
const distance = stepMin + Math.random() * Math.max(1, stepMax - stepMin);
|
|
4191
4241
|
let deltaY = status.direction === "up" ? -distance : distance;
|
|
4192
4242
|
if (status.code === "OBSTRUCTED") {
|
|
@@ -4227,7 +4277,7 @@ var MobileHumanize = {
|
|
|
4227
4277
|
const afterWindowState = await page.evaluate(() => ({ x: window.scrollX, y: window.scrollY }));
|
|
4228
4278
|
if (Math.abs(afterWindowState.x - beforeWindowState.x) > 2 || Math.abs(afterWindowState.y - beforeWindowState.y) > 2) {
|
|
4229
4279
|
await page.evaluate((state) => window.scrollTo(state.x, state.y), beforeWindowState);
|
|
4230
|
-
|
|
4280
|
+
logger6.debug(`humanScroll | \u7A97\u53E3\u6EDA\u52A8\u56DE\u6536 from=${Math.round(afterWindowState.y)} to=${Math.round(beforeWindowState.y)}`);
|
|
4231
4281
|
}
|
|
4232
4282
|
}
|
|
4233
4283
|
let afterElementSnapshot = null;
|
|
@@ -4241,7 +4291,7 @@ var MobileHumanize = {
|
|
|
4241
4291
|
const afterSnapshot = await readAfterElementSnapshot();
|
|
4242
4292
|
if (isTargetImmobileAfterScroll(beforeElementSnapshot, afterSnapshot)) {
|
|
4243
4293
|
await restoreWindowFromSnapshot(page, beforeElementSnapshot, afterSnapshot);
|
|
4244
|
-
|
|
4294
|
+
logger6.warn(`humanScroll | \u76EE\u6807\u4E0D\u968F\u9875\u9762\u6EDA\u52A8\u79FB\u52A8\uFF0C\u9875\u9762\u6EDA\u52A8\u65E0\u6CD5\u6539\u53D8\u5176\u4F4D\u7F6E (status=${status.code}, direction=${status.direction || "unknown"})`);
|
|
4245
4295
|
return { element, didScroll, restore: null, unscrollable: true };
|
|
4246
4296
|
}
|
|
4247
4297
|
}
|
|
@@ -4273,12 +4323,12 @@ var MobileHumanize = {
|
|
|
4273
4323
|
const moved = beforeState.kind !== afterState.kind || Math.abs(topDelta) > 2 || Math.abs(leftDelta) > 2;
|
|
4274
4324
|
if (!moved) {
|
|
4275
4325
|
const fallback = await scrollScrollableAncestor(element, deltaY);
|
|
4276
|
-
|
|
4326
|
+
logger6.debug(`humanScroll | \u5BB9\u5668\u89E6\u6478\u65E0\u6548\uFF0C\u76F4\u63A5\u6EDA\u52A8 fallback=${fallback.scroller ? "ancestor" : "window"} top=${Math.round(fallback.scrollTop || 0)}`);
|
|
4277
4327
|
} else if (beforeState.kind === afterState.kind && Math.abs(expectedDelta) > 24 && Math.sign(topDelta || expectedDelta) === Math.sign(expectedDelta) && Math.abs(topDelta) < Math.min(Math.abs(expectedDelta) * 0.45, 96)) {
|
|
4278
4328
|
const residualDelta = expectedDelta - topDelta;
|
|
4279
4329
|
if (Math.sign(residualDelta) === Math.sign(expectedDelta) && Math.abs(residualDelta) > 24) {
|
|
4280
4330
|
const fallback = await scrollScrollableAncestor(element, residualDelta);
|
|
4281
|
-
|
|
4331
|
+
logger6.debug(`humanScroll | \u5BB9\u5668\u89E6\u6478\u8DDD\u79BB\u4E0D\u8DB3\uFF0C\u8865\u507F\u6EDA\u52A8 fallback=${fallback.scroller ? "ancestor" : "window"} top=${Math.round(fallback.scrollTop || 0)}`);
|
|
4282
4332
|
}
|
|
4283
4333
|
}
|
|
4284
4334
|
}
|
|
@@ -4286,7 +4336,7 @@ var MobileHumanize = {
|
|
|
4286
4336
|
const afterSnapshot = await getElementViewportSnapshot(element).catch(() => null);
|
|
4287
4337
|
if (isTargetImmobileAfterScroll(beforeElementSnapshot, afterSnapshot)) {
|
|
4288
4338
|
await restoreWindowFromSnapshot(page, beforeElementSnapshot, afterSnapshot);
|
|
4289
|
-
|
|
4339
|
+
logger6.warn(`humanScroll | \u76EE\u6807\u4E0D\u968F\u6EDA\u52A8\u5BB9\u5668\u79FB\u52A8\uFF0C\u6EDA\u52A8\u65E0\u6CD5\u6539\u53D8\u5176\u4F4D\u7F6E (status=${status.code}, direction=${status.direction || "unknown"})`);
|
|
4290
4340
|
return { element, didScroll, restore: null, unscrollable: true };
|
|
4291
4341
|
}
|
|
4292
4342
|
}
|
|
@@ -4297,14 +4347,14 @@ var MobileHumanize = {
|
|
|
4297
4347
|
await waitJitter(80, 0.3);
|
|
4298
4348
|
const finalStatus = await checkElementVisibility(element);
|
|
4299
4349
|
if (finalStatus.code === "VISIBLE") {
|
|
4300
|
-
|
|
4301
|
-
|
|
4350
|
+
logger6.info("humanScroll | \u539F\u751F scrollIntoViewIfNeeded \u515C\u5E95\u6210\u529F");
|
|
4351
|
+
logger6.success("humanScroll", didScroll ? "\u5DF2\u6EDA\u52A8" : "\u65E0\u9700\u6EDA\u52A8");
|
|
4302
4352
|
return { element, didScroll: true, restore: null };
|
|
4303
4353
|
}
|
|
4304
4354
|
} catch (fallbackError) {
|
|
4305
|
-
|
|
4355
|
+
logger6.debug(`humanScroll | native fallback failed: ${fallbackError?.message || fallbackError}`);
|
|
4306
4356
|
}
|
|
4307
|
-
|
|
4357
|
+
logger6.warn(`humanScroll | \u5728 ${maxSteps} \u6B65\u540E\u65E0\u6CD5\u786E\u4FDD\u53EF\u89C1\u6027`);
|
|
4308
4358
|
return { element, didScroll, restore: null };
|
|
4309
4359
|
},
|
|
4310
4360
|
async humanClick(page, target, options = {}) {
|
|
@@ -4319,7 +4369,7 @@ var MobileHumanize = {
|
|
|
4319
4369
|
fallbackDomClickOnTapError = true
|
|
4320
4370
|
} = options;
|
|
4321
4371
|
const targetDesc = describeTarget(target);
|
|
4322
|
-
|
|
4372
|
+
logger6.start("humanClick", `target=${targetDesc}`);
|
|
4323
4373
|
try {
|
|
4324
4374
|
if (target == null) {
|
|
4325
4375
|
const viewport = resolveViewport(page);
|
|
@@ -4331,12 +4381,12 @@ var MobileHumanize = {
|
|
|
4331
4381
|
timeoutMs: tapTimeoutMs,
|
|
4332
4382
|
mouseFallbackTimeoutMs
|
|
4333
4383
|
});
|
|
4334
|
-
|
|
4384
|
+
logger6.success("humanClick", "Tapped current position");
|
|
4335
4385
|
return true;
|
|
4336
4386
|
}
|
|
4337
4387
|
const element = await resolveElement(page, target, { throwOnMissing });
|
|
4338
4388
|
if (!element) {
|
|
4339
|
-
|
|
4389
|
+
logger6.warn(`humanClick: \u5143\u7D20\u4E0D\u5B58\u5728\uFF0C\u8DF3\u8FC7\u70B9\u51FB ${targetDesc}`);
|
|
4340
4390
|
return false;
|
|
4341
4391
|
}
|
|
4342
4392
|
const scrollResult = scrollIfNeeded ? await MobileHumanize.humanScroll(page, element, { throwOnMissing }) : null;
|
|
@@ -4360,19 +4410,19 @@ var MobileHumanize = {
|
|
|
4360
4410
|
).catch(() => null);
|
|
4361
4411
|
}
|
|
4362
4412
|
if (fallback?.activated) {
|
|
4363
|
-
|
|
4413
|
+
logger6.warn(`humanClick: \u4E0D\u53EF\u6EDA\u52A8\u76EE\u6807\u4E0D\u53EF\u7269\u7406\u70B9\u51FB\uFF0C\u5DF2\u7528 ${fallback.method} \u6FC0\u6D3B`);
|
|
4364
4414
|
return true;
|
|
4365
4415
|
}
|
|
4366
4416
|
}
|
|
4367
4417
|
const message = `\u5143\u7D20\u4E0D\u53EF\u70B9\u51FB: ${status.reason || status.code}`;
|
|
4368
4418
|
if (throwOnMissing) throw new Error(message);
|
|
4369
|
-
|
|
4419
|
+
logger6.warn(`humanClick: ${message}\uFF0C\u8DF3\u8FC7\u70B9\u51FB`);
|
|
4370
4420
|
return false;
|
|
4371
4421
|
}
|
|
4372
4422
|
const box = await element.boundingBox();
|
|
4373
4423
|
if (!box) {
|
|
4374
4424
|
if (throwOnMissing) throw new Error("\u65E0\u6CD5\u83B7\u53D6\u5143\u7D20\u4F4D\u7F6E");
|
|
4375
|
-
|
|
4425
|
+
logger6.warn("humanClick: \u65E0\u6CD5\u83B7\u53D6\u4F4D\u7F6E\uFF0C\u8DF3\u8FC7\u70B9\u51FB");
|
|
4376
4426
|
return false;
|
|
4377
4427
|
}
|
|
4378
4428
|
await waitJitter(reactionDelay, 0.45);
|
|
@@ -4393,13 +4443,13 @@ var MobileHumanize = {
|
|
|
4393
4443
|
"activation fallback"
|
|
4394
4444
|
).catch(() => null);
|
|
4395
4445
|
if (!fallback?.activated) throw tapError;
|
|
4396
|
-
|
|
4446
|
+
logger6.warn(`humanClick: tap \u5931\u8D25\u540E\u5DF2\u7528 ${fallback.method} \u515C\u5E95: ${tapError?.message || tapError}`);
|
|
4397
4447
|
}
|
|
4398
4448
|
await waitJitter(120, 0.35);
|
|
4399
|
-
|
|
4449
|
+
logger6.success("humanClick");
|
|
4400
4450
|
return true;
|
|
4401
4451
|
} catch (error) {
|
|
4402
|
-
|
|
4452
|
+
logger6.fail("humanClick", error);
|
|
4403
4453
|
throw error;
|
|
4404
4454
|
}
|
|
4405
4455
|
},
|
|
@@ -4452,7 +4502,7 @@ var MobileHumanize = {
|
|
|
4452
4502
|
keyboardOptions = {}
|
|
4453
4503
|
} = pressOptions || {};
|
|
4454
4504
|
const targetDesc = hasTarget ? describeTarget(targetOrKey) : "current focus";
|
|
4455
|
-
|
|
4505
|
+
logger6.start("humanPress", `key=${key}, target=${targetDesc}`);
|
|
4456
4506
|
try {
|
|
4457
4507
|
if (hasTarget) {
|
|
4458
4508
|
await MobileHumanize.humanClick(page, targetOrKey, {
|
|
@@ -4466,10 +4516,10 @@ var MobileHumanize = {
|
|
|
4466
4516
|
...keyboardOptions,
|
|
4467
4517
|
delay: jitterMs(holdDelay, 0.5)
|
|
4468
4518
|
});
|
|
4469
|
-
|
|
4519
|
+
logger6.success("humanPress");
|
|
4470
4520
|
return true;
|
|
4471
4521
|
} catch (error) {
|
|
4472
|
-
|
|
4522
|
+
logger6.fail("humanPress", error);
|
|
4473
4523
|
throw error;
|
|
4474
4524
|
}
|
|
4475
4525
|
},
|
|
@@ -4536,7 +4586,7 @@ var MobileHumanize = {
|
|
|
4536
4586
|
}
|
|
4537
4587
|
};
|
|
4538
4588
|
|
|
4539
|
-
// src/humanize.js
|
|
4589
|
+
// src/internals/humanize/default.js
|
|
4540
4590
|
var resolveDeviceFromPage2 = (page) => normalizeDevice(page?.[PageRuntimeStateKey]?.device);
|
|
4541
4591
|
var resolveDelegate = (page) => {
|
|
4542
4592
|
return resolveDeviceFromPage2(page) === Device.Mobile ? MobileHumanize : Humanize;
|
|
@@ -4545,7 +4595,7 @@ var callDelegate = (method, page, args) => {
|
|
|
4545
4595
|
const delegate = resolveDelegate(page);
|
|
4546
4596
|
return delegate[method](page, ...args);
|
|
4547
4597
|
};
|
|
4548
|
-
var
|
|
4598
|
+
var DefaultHumanize = {
|
|
4549
4599
|
jitterMs(base, jitterPercent = 0.3) {
|
|
4550
4600
|
return Humanize.jitterMs(base, jitterPercent);
|
|
4551
4601
|
},
|
|
@@ -4591,7 +4641,480 @@ var Humanize2 = {
|
|
|
4591
4641
|
}
|
|
4592
4642
|
};
|
|
4593
4643
|
|
|
4594
|
-
// src/
|
|
4644
|
+
// src/internals/humanize/cloakbrowser.js
|
|
4645
|
+
import delay4 from "delay";
|
|
4646
|
+
var logger7 = createInternalLogger("Humanize.CloakBrowser");
|
|
4647
|
+
var humanizedPages = /* @__PURE__ */ new WeakSet();
|
|
4648
|
+
var cachedCloakHumanModulePromise = null;
|
|
4649
|
+
var isPageLike2 = (value) => value && typeof value === "object" && typeof value.evaluate === "function";
|
|
4650
|
+
var isPoint2 = (value) => value && typeof value === "object" && Number.isFinite(Number(value.x)) && Number.isFinite(Number(value.y));
|
|
4651
|
+
var resolveDeviceFromPage3 = (page) => normalizeDevice(page?.[PageRuntimeStateKey]?.device);
|
|
4652
|
+
var isMobilePage = (page) => resolveDeviceFromPage3(page) === Device.Mobile;
|
|
4653
|
+
var loadCloakHumanModule = async () => {
|
|
4654
|
+
if (!cachedCloakHumanModulePromise) {
|
|
4655
|
+
cachedCloakHumanModulePromise = import("cloakbrowser/human").catch((error) => {
|
|
4656
|
+
cachedCloakHumanModulePromise = null;
|
|
4657
|
+
throw new Error("cloakbrowser/human \u6A21\u5757\u52A0\u8F7D\u5931\u8D25\uFF0C\u8BF7\u786E\u8BA4\u5F53\u524D\u8FD0\u884C\u73AF\u5883\u5DF2\u5B89\u88C5 cloakbrowser\u3002", {
|
|
4658
|
+
cause: error
|
|
4659
|
+
});
|
|
4660
|
+
});
|
|
4661
|
+
}
|
|
4662
|
+
return cachedCloakHumanModulePromise;
|
|
4663
|
+
};
|
|
4664
|
+
var buildTypingHumanConfig = (options = {}) => {
|
|
4665
|
+
const humanConfig = {};
|
|
4666
|
+
if (Number.isFinite(Number(options.baseDelay))) {
|
|
4667
|
+
humanConfig.typing_delay = Number(options.baseDelay);
|
|
4668
|
+
}
|
|
4669
|
+
if (Number.isFinite(Number(options.pauseProbability))) {
|
|
4670
|
+
humanConfig.typing_pause_chance = Number(options.pauseProbability);
|
|
4671
|
+
}
|
|
4672
|
+
if (Number.isFinite(Number(options.pauseBase))) {
|
|
4673
|
+
const basePause = Math.max(40, Number(options.pauseBase));
|
|
4674
|
+
humanConfig.typing_pause_range = [
|
|
4675
|
+
Math.round(basePause * 0.5),
|
|
4676
|
+
Math.round(basePause * 1.5)
|
|
4677
|
+
];
|
|
4678
|
+
}
|
|
4679
|
+
return Object.keys(humanConfig).length > 0 ? humanConfig : null;
|
|
4680
|
+
};
|
|
4681
|
+
var buildActionOptions = (options = {}) => {
|
|
4682
|
+
const actionOptions = {};
|
|
4683
|
+
if (options && options.timeout != null) {
|
|
4684
|
+
actionOptions.timeout = options.timeout;
|
|
4685
|
+
}
|
|
4686
|
+
if (options && options.force != null) {
|
|
4687
|
+
actionOptions.force = options.force;
|
|
4688
|
+
}
|
|
4689
|
+
const humanConfig = buildTypingHumanConfig(options);
|
|
4690
|
+
if (humanConfig) {
|
|
4691
|
+
actionOptions.human_config = humanConfig;
|
|
4692
|
+
}
|
|
4693
|
+
return actionOptions;
|
|
4694
|
+
};
|
|
4695
|
+
var ensureDesktopHumanized = async (page) => {
|
|
4696
|
+
if (!page || typeof page !== "object") {
|
|
4697
|
+
throw new Error("Humanize requires a Playwright page");
|
|
4698
|
+
}
|
|
4699
|
+
const humanModule = await loadCloakHumanModule();
|
|
4700
|
+
if (page._original && page._humanCursor) {
|
|
4701
|
+
humanizedPages.add(page);
|
|
4702
|
+
return humanModule;
|
|
4703
|
+
}
|
|
4704
|
+
if (humanizedPages.has(page)) {
|
|
4705
|
+
return humanModule;
|
|
4706
|
+
}
|
|
4707
|
+
const config = page._humanCfg || humanModule.resolveConfig?.("default") || humanModule.resolveConfig?.();
|
|
4708
|
+
const cursor = page._humanCursor || { x: 0, y: 0, initialized: false };
|
|
4709
|
+
humanModule.patchPage(page, config, cursor);
|
|
4710
|
+
humanizedPages.add(page);
|
|
4711
|
+
return humanModule;
|
|
4712
|
+
};
|
|
4713
|
+
var patchHandle = async (page, handle) => {
|
|
4714
|
+
if (!handle || typeof handle !== "object") return handle;
|
|
4715
|
+
const humanModule = await ensureDesktopHumanized(page);
|
|
4716
|
+
humanModule.patchSingleElementHandle(
|
|
4717
|
+
handle,
|
|
4718
|
+
page,
|
|
4719
|
+
page._humanCfg,
|
|
4720
|
+
page._humanCursor,
|
|
4721
|
+
page._humanRaw,
|
|
4722
|
+
page._humanRawKb,
|
|
4723
|
+
page._humanOriginals,
|
|
4724
|
+
page._stealth
|
|
4725
|
+
);
|
|
4726
|
+
return handle;
|
|
4727
|
+
};
|
|
4728
|
+
var resolvePatchedTarget = async (page, target, { throwOnMissing = true } = {}) => {
|
|
4729
|
+
if (target == null) {
|
|
4730
|
+
return { target: null, dispose: null };
|
|
4731
|
+
}
|
|
4732
|
+
if (typeof target === "string") {
|
|
4733
|
+
const handle = await page.$(target);
|
|
4734
|
+
if (!handle) {
|
|
4735
|
+
if (throwOnMissing) {
|
|
4736
|
+
throw new Error(`\u627E\u4E0D\u5230\u5143\u7D20 ${String(target)}`);
|
|
4737
|
+
}
|
|
4738
|
+
return { target: null, dispose: null };
|
|
4739
|
+
}
|
|
4740
|
+
return { target: handle, dispose: null };
|
|
4741
|
+
}
|
|
4742
|
+
if (typeof target.elementHandle === "function") {
|
|
4743
|
+
const handle = await target.elementHandle();
|
|
4744
|
+
if (!handle) {
|
|
4745
|
+
if (throwOnMissing) {
|
|
4746
|
+
throw new Error("\u627E\u4E0D\u5230 locator \u5BF9\u5E94\u7684\u5143\u7D20");
|
|
4747
|
+
}
|
|
4748
|
+
return { target: null, dispose: null };
|
|
4749
|
+
}
|
|
4750
|
+
await patchHandle(page, handle);
|
|
4751
|
+
return {
|
|
4752
|
+
target: handle,
|
|
4753
|
+
dispose: async () => {
|
|
4754
|
+
await handle.dispose().catch(() => {
|
|
4755
|
+
});
|
|
4756
|
+
}
|
|
4757
|
+
};
|
|
4758
|
+
}
|
|
4759
|
+
await patchHandle(page, target);
|
|
4760
|
+
return { target, dispose: null };
|
|
4761
|
+
};
|
|
4762
|
+
var jitterSleep = async (baseMs, jitterPercent = 0.3) => {
|
|
4763
|
+
await delay4(jitterMs(baseMs, jitterPercent));
|
|
4764
|
+
};
|
|
4765
|
+
var humanMoveToPoint = async (page, point) => {
|
|
4766
|
+
await ensureDesktopHumanized(page);
|
|
4767
|
+
await page.mouse.move(Number(point.x), Number(point.y));
|
|
4768
|
+
return true;
|
|
4769
|
+
};
|
|
4770
|
+
var doDesktopHumanClick = async (page, target, options = {}) => {
|
|
4771
|
+
await ensureDesktopHumanized(page);
|
|
4772
|
+
if (target == null) {
|
|
4773
|
+
const cursor = page._humanCursor || { x: 0, y: 0 };
|
|
4774
|
+
await page.mouse.click(cursor.x || 0, cursor.y || 0);
|
|
4775
|
+
return true;
|
|
4776
|
+
}
|
|
4777
|
+
if (isPoint2(target)) {
|
|
4778
|
+
return humanMoveToPoint(page, target).then(async () => {
|
|
4779
|
+
await page.mouse.click(Number(target.x), Number(target.y));
|
|
4780
|
+
return true;
|
|
4781
|
+
});
|
|
4782
|
+
}
|
|
4783
|
+
const throwOnMissing = options.throwOnMissing !== false;
|
|
4784
|
+
if (typeof target === "string") {
|
|
4785
|
+
if (!throwOnMissing) {
|
|
4786
|
+
const existingHandle = await page.$(target);
|
|
4787
|
+
if (!existingHandle) {
|
|
4788
|
+
return false;
|
|
4789
|
+
}
|
|
4790
|
+
await existingHandle.click(buildActionOptions(options));
|
|
4791
|
+
return true;
|
|
4792
|
+
}
|
|
4793
|
+
await page.click(target, buildActionOptions(options));
|
|
4794
|
+
return true;
|
|
4795
|
+
}
|
|
4796
|
+
const { target: resolvedTarget, dispose } = await resolvePatchedTarget(page, target, { throwOnMissing });
|
|
4797
|
+
try {
|
|
4798
|
+
if (!resolvedTarget) {
|
|
4799
|
+
return false;
|
|
4800
|
+
}
|
|
4801
|
+
if (typeof resolvedTarget.click === "function") {
|
|
4802
|
+
await resolvedTarget.click(buildActionOptions(options));
|
|
4803
|
+
return true;
|
|
4804
|
+
}
|
|
4805
|
+
const box = await resolvedTarget.boundingBox?.();
|
|
4806
|
+
if (!box) {
|
|
4807
|
+
if (throwOnMissing) {
|
|
4808
|
+
throw new Error("\u65E0\u6CD5\u83B7\u53D6\u5143\u7D20\u4F4D\u7F6E");
|
|
4809
|
+
}
|
|
4810
|
+
return false;
|
|
4811
|
+
}
|
|
4812
|
+
await page.mouse.click(box.x + box.width / 2, box.y + box.height / 2);
|
|
4813
|
+
return true;
|
|
4814
|
+
} finally {
|
|
4815
|
+
if (typeof dispose === "function") {
|
|
4816
|
+
await dispose();
|
|
4817
|
+
}
|
|
4818
|
+
}
|
|
4819
|
+
};
|
|
4820
|
+
var CloakBrowserHumanize = {
|
|
4821
|
+
jitterMs(base, jitterPercent = 0.3) {
|
|
4822
|
+
return jitterMs(base, jitterPercent);
|
|
4823
|
+
},
|
|
4824
|
+
async initializeCursor(page) {
|
|
4825
|
+
if (isMobilePage(page)) {
|
|
4826
|
+
return MobileHumanize.initializeCursor(page);
|
|
4827
|
+
}
|
|
4828
|
+
await ensureDesktopHumanized(page);
|
|
4829
|
+
logger7.debug("initializeCursor: cloakbrowser human layer ready");
|
|
4830
|
+
},
|
|
4831
|
+
async humanMove(page, target) {
|
|
4832
|
+
if (isMobilePage(page)) {
|
|
4833
|
+
return await MobileHumanize.humanMove(page, target);
|
|
4834
|
+
}
|
|
4835
|
+
await ensureDesktopHumanized(page);
|
|
4836
|
+
if (isPoint2(target)) {
|
|
4837
|
+
return await humanMoveToPoint(page, target);
|
|
4838
|
+
}
|
|
4839
|
+
const { target: resolvedTarget, dispose } = await resolvePatchedTarget(page, target, { throwOnMissing: false });
|
|
4840
|
+
try {
|
|
4841
|
+
if (!resolvedTarget) {
|
|
4842
|
+
return false;
|
|
4843
|
+
}
|
|
4844
|
+
if (typeof resolvedTarget.hover === "function") {
|
|
4845
|
+
await resolvedTarget.hover();
|
|
4846
|
+
return true;
|
|
4847
|
+
}
|
|
4848
|
+
const box = await resolvedTarget.boundingBox?.();
|
|
4849
|
+
if (!box) {
|
|
4850
|
+
return false;
|
|
4851
|
+
}
|
|
4852
|
+
await page.mouse.move(box.x + box.width / 2, box.y + box.height / 2);
|
|
4853
|
+
return true;
|
|
4854
|
+
} finally {
|
|
4855
|
+
if (typeof dispose === "function") {
|
|
4856
|
+
await dispose();
|
|
4857
|
+
}
|
|
4858
|
+
}
|
|
4859
|
+
},
|
|
4860
|
+
async humanScroll(page, target, options = {}) {
|
|
4861
|
+
if (isMobilePage(page)) {
|
|
4862
|
+
return await MobileHumanize.humanScroll(page, target, options);
|
|
4863
|
+
}
|
|
4864
|
+
const humanModule = await ensureDesktopHumanized(page);
|
|
4865
|
+
if (typeof target === "string") {
|
|
4866
|
+
const { x = 0, y = 0 } = page._humanCursor || {};
|
|
4867
|
+
try {
|
|
4868
|
+
const result = await humanModule.scrollToElement(
|
|
4869
|
+
page,
|
|
4870
|
+
page._humanRaw,
|
|
4871
|
+
target,
|
|
4872
|
+
x,
|
|
4873
|
+
y,
|
|
4874
|
+
page._humanCfg,
|
|
4875
|
+
options.timeout
|
|
4876
|
+
);
|
|
4877
|
+
if (page._humanCursor) {
|
|
4878
|
+
page._humanCursor.x = result.cursorX;
|
|
4879
|
+
page._humanCursor.y = result.cursorY;
|
|
4880
|
+
}
|
|
4881
|
+
return {
|
|
4882
|
+
element: await page.$(target),
|
|
4883
|
+
didScroll: Boolean(result.didScroll),
|
|
4884
|
+
restore: null
|
|
4885
|
+
};
|
|
4886
|
+
} catch (error) {
|
|
4887
|
+
logger7.warn(`humanScroll: cloakbrowser \u6EDA\u52A8\u5931\u8D25\uFF0C\u8DF3\u8FC7 (${error?.message || error})`);
|
|
4888
|
+
return { element: null, didScroll: false, restore: null };
|
|
4889
|
+
}
|
|
4890
|
+
}
|
|
4891
|
+
const { target: resolvedTarget, dispose } = await resolvePatchedTarget(page, target, { throwOnMissing: false });
|
|
4892
|
+
try {
|
|
4893
|
+
if (!resolvedTarget) {
|
|
4894
|
+
return { element: null, didScroll: false, restore: null };
|
|
4895
|
+
}
|
|
4896
|
+
const before = await page.evaluate(() => ({ x: window.scrollX, y: window.scrollY }));
|
|
4897
|
+
await resolvedTarget.scrollIntoViewIfNeeded?.();
|
|
4898
|
+
const after = await page.evaluate(() => ({ x: window.scrollX, y: window.scrollY }));
|
|
4899
|
+
return {
|
|
4900
|
+
element: resolvedTarget,
|
|
4901
|
+
didScroll: before.x !== after.x || before.y !== after.y,
|
|
4902
|
+
restore: null
|
|
4903
|
+
};
|
|
4904
|
+
} finally {
|
|
4905
|
+
if (typeof dispose === "function") {
|
|
4906
|
+
await dispose();
|
|
4907
|
+
}
|
|
4908
|
+
}
|
|
4909
|
+
},
|
|
4910
|
+
async humanClick(page, target, options = {}) {
|
|
4911
|
+
if (isMobilePage(page)) {
|
|
4912
|
+
return await MobileHumanize.humanClick(page, target, options);
|
|
4913
|
+
}
|
|
4914
|
+
return await doDesktopHumanClick(page, target, options);
|
|
4915
|
+
},
|
|
4916
|
+
async randomSleep(pageOrBaseMs, maybeBaseMs, maybeJitterPercent) {
|
|
4917
|
+
if (isPageLike2(pageOrBaseMs)) {
|
|
4918
|
+
if (isMobilePage(pageOrBaseMs)) {
|
|
4919
|
+
return await MobileHumanize.randomSleep(maybeBaseMs, maybeJitterPercent);
|
|
4920
|
+
}
|
|
4921
|
+
await jitterSleep(maybeBaseMs, maybeJitterPercent ?? 0.3);
|
|
4922
|
+
return;
|
|
4923
|
+
}
|
|
4924
|
+
await jitterSleep(pageOrBaseMs, maybeBaseMs ?? 0.3);
|
|
4925
|
+
},
|
|
4926
|
+
async simulateGaze(page, baseDurationMs = 2500) {
|
|
4927
|
+
if (isMobilePage(page)) {
|
|
4928
|
+
return await MobileHumanize.simulateGaze(page, baseDurationMs);
|
|
4929
|
+
}
|
|
4930
|
+
await ensureDesktopHumanized(page);
|
|
4931
|
+
const durationMs = jitterMs(baseDurationMs, 0.4);
|
|
4932
|
+
const startTime = Date.now();
|
|
4933
|
+
const viewportSize = page.viewportSize() || { width: 1365, height: 900 };
|
|
4934
|
+
while (Date.now() - startTime < durationMs) {
|
|
4935
|
+
await page.mouse.move(
|
|
4936
|
+
100 + Math.random() * Math.max(120, viewportSize.width - 200),
|
|
4937
|
+
100 + Math.random() * Math.max(120, viewportSize.height - 200)
|
|
4938
|
+
);
|
|
4939
|
+
await jitterSleep(600, 0.5);
|
|
4940
|
+
}
|
|
4941
|
+
},
|
|
4942
|
+
async humanType(page, selector, text, options = {}) {
|
|
4943
|
+
if (isMobilePage(page)) {
|
|
4944
|
+
return await MobileHumanize.humanType(page, selector, text, options);
|
|
4945
|
+
}
|
|
4946
|
+
await ensureDesktopHumanized(page);
|
|
4947
|
+
const actionOptions = buildActionOptions(options);
|
|
4948
|
+
if (typeof selector === "string") {
|
|
4949
|
+
await page.type(selector, text, actionOptions);
|
|
4950
|
+
return;
|
|
4951
|
+
}
|
|
4952
|
+
const { target: resolvedTarget, dispose } = await resolvePatchedTarget(page, selector, { throwOnMissing: true });
|
|
4953
|
+
try {
|
|
4954
|
+
if (!resolvedTarget || typeof resolvedTarget.type !== "function") {
|
|
4955
|
+
throw new Error("\u76EE\u6807\u5143\u7D20\u4E0D\u652F\u6301 type()");
|
|
4956
|
+
}
|
|
4957
|
+
await resolvedTarget.type(text, actionOptions);
|
|
4958
|
+
} finally {
|
|
4959
|
+
if (typeof dispose === "function") {
|
|
4960
|
+
await dispose();
|
|
4961
|
+
}
|
|
4962
|
+
}
|
|
4963
|
+
},
|
|
4964
|
+
async humanPress(page, targetOrKey, maybeKey, options = {}) {
|
|
4965
|
+
if (isMobilePage(page)) {
|
|
4966
|
+
return await MobileHumanize.humanPress(page, targetOrKey, maybeKey, options);
|
|
4967
|
+
}
|
|
4968
|
+
await ensureDesktopHumanized(page);
|
|
4969
|
+
const hasTarget = typeof maybeKey === "string";
|
|
4970
|
+
const key = hasTarget ? maybeKey : targetOrKey;
|
|
4971
|
+
const pressOptions = hasTarget ? options : maybeKey || options;
|
|
4972
|
+
if (!hasTarget) {
|
|
4973
|
+
await jitterSleep(pressOptions.reactionDelay ?? 180, 0.45);
|
|
4974
|
+
await page.keyboard.press(key, {
|
|
4975
|
+
...pressOptions.keyboardOptions || {},
|
|
4976
|
+
delay: jitterMs(pressOptions.holdDelay ?? 45, 0.5)
|
|
4977
|
+
});
|
|
4978
|
+
return true;
|
|
4979
|
+
}
|
|
4980
|
+
if (typeof targetOrKey === "string") {
|
|
4981
|
+
await page.press(targetOrKey, key, buildActionOptions(pressOptions));
|
|
4982
|
+
return true;
|
|
4983
|
+
}
|
|
4984
|
+
const { target: resolvedTarget, dispose } = await resolvePatchedTarget(page, targetOrKey, {
|
|
4985
|
+
throwOnMissing: pressOptions.throwOnMissing !== false
|
|
4986
|
+
});
|
|
4987
|
+
try {
|
|
4988
|
+
if (!resolvedTarget) {
|
|
4989
|
+
return false;
|
|
4990
|
+
}
|
|
4991
|
+
if (typeof resolvedTarget.press === "function") {
|
|
4992
|
+
await resolvedTarget.press(key, buildActionOptions(pressOptions));
|
|
4993
|
+
return true;
|
|
4994
|
+
}
|
|
4995
|
+
await doDesktopHumanClick(page, targetOrKey, {
|
|
4996
|
+
...pressOptions,
|
|
4997
|
+
reactionDelay: pressOptions.focusDelay ?? 180
|
|
4998
|
+
});
|
|
4999
|
+
await jitterSleep(pressOptions.reactionDelay ?? 180, 0.45);
|
|
5000
|
+
await page.keyboard.press(key, {
|
|
5001
|
+
...pressOptions.keyboardOptions || {},
|
|
5002
|
+
delay: jitterMs(pressOptions.holdDelay ?? 45, 0.5)
|
|
5003
|
+
});
|
|
5004
|
+
return true;
|
|
5005
|
+
} finally {
|
|
5006
|
+
if (typeof dispose === "function") {
|
|
5007
|
+
await dispose();
|
|
5008
|
+
}
|
|
5009
|
+
}
|
|
5010
|
+
},
|
|
5011
|
+
async humanClear(page, selector) {
|
|
5012
|
+
if (isMobilePage(page)) {
|
|
5013
|
+
return await MobileHumanize.humanClear(page, selector);
|
|
5014
|
+
}
|
|
5015
|
+
await ensureDesktopHumanized(page);
|
|
5016
|
+
if (typeof page.clear === "function") {
|
|
5017
|
+
await page.clear(selector);
|
|
5018
|
+
return;
|
|
5019
|
+
}
|
|
5020
|
+
await page.fill(selector, "");
|
|
5021
|
+
},
|
|
5022
|
+
async warmUpBrowsing(page, baseDuration = 3500) {
|
|
5023
|
+
if (isMobilePage(page)) {
|
|
5024
|
+
return await MobileHumanize.warmUpBrowsing(page, baseDuration);
|
|
5025
|
+
}
|
|
5026
|
+
await ensureDesktopHumanized(page);
|
|
5027
|
+
const durationMs = jitterMs(baseDuration, 0.4);
|
|
5028
|
+
const startTime = Date.now();
|
|
5029
|
+
const viewportSize = page.viewportSize() || { width: 1365, height: 900 };
|
|
5030
|
+
while (Date.now() - startTime < durationMs) {
|
|
5031
|
+
const action = Math.random();
|
|
5032
|
+
if (action < 0.4) {
|
|
5033
|
+
await page.mouse.move(
|
|
5034
|
+
100 + Math.random() * Math.max(120, viewportSize.width - 200),
|
|
5035
|
+
100 + Math.random() * Math.max(120, viewportSize.height - 200)
|
|
5036
|
+
);
|
|
5037
|
+
await jitterSleep(350, 0.4);
|
|
5038
|
+
continue;
|
|
5039
|
+
}
|
|
5040
|
+
if (action < 0.7) {
|
|
5041
|
+
await page.mouse.wheel(0, (Math.random() - 0.5) * 220);
|
|
5042
|
+
await jitterSleep(500, 0.4);
|
|
5043
|
+
continue;
|
|
5044
|
+
}
|
|
5045
|
+
await jitterSleep(800, 0.5);
|
|
5046
|
+
}
|
|
5047
|
+
},
|
|
5048
|
+
async naturalScroll(page, direction = "down", distance = 300, baseSteps = 5) {
|
|
5049
|
+
if (isMobilePage(page)) {
|
|
5050
|
+
return await MobileHumanize.naturalScroll(page, direction, distance, baseSteps);
|
|
5051
|
+
}
|
|
5052
|
+
await ensureDesktopHumanized(page);
|
|
5053
|
+
const steps = Math.max(3, baseSteps + Math.floor(Math.random() * 3) - 1);
|
|
5054
|
+
const actualDistance = jitterMs(distance, 0.15);
|
|
5055
|
+
const sign = direction === "down" ? 1 : -1;
|
|
5056
|
+
const stepDistance = actualDistance / steps;
|
|
5057
|
+
for (let index = 0; index < steps; index += 1) {
|
|
5058
|
+
const factor = 1 - index / steps * 0.5;
|
|
5059
|
+
const jitter = 0.9 + Math.random() * 0.2;
|
|
5060
|
+
await page.mouse.wheel(0, stepDistance * factor * sign * jitter);
|
|
5061
|
+
await jitterSleep(60 + index * 25, 0.3);
|
|
5062
|
+
}
|
|
5063
|
+
}
|
|
5064
|
+
};
|
|
5065
|
+
|
|
5066
|
+
// src/humanize.js
|
|
5067
|
+
var resolveHumanizeDelegate = () => getToolkitMode() === Mode.CloakBrowser ? CloakBrowserHumanize : DefaultHumanize;
|
|
5068
|
+
var callHumanize = (method, ...args) => {
|
|
5069
|
+
const delegate = resolveHumanizeDelegate();
|
|
5070
|
+
if (typeof delegate?.[method] !== "function") {
|
|
5071
|
+
throw new Error(`Humanize.${method} is not available in ${getToolkitMode()} mode`);
|
|
5072
|
+
}
|
|
5073
|
+
return delegate[method](...args);
|
|
5074
|
+
};
|
|
5075
|
+
var Humanize2 = {
|
|
5076
|
+
jitterMs(base, jitterPercent = 0.3) {
|
|
5077
|
+
return callHumanize("jitterMs", base, jitterPercent);
|
|
5078
|
+
},
|
|
5079
|
+
initializeCursor(page) {
|
|
5080
|
+
return callHumanize("initializeCursor", page);
|
|
5081
|
+
},
|
|
5082
|
+
humanMove(page, target) {
|
|
5083
|
+
return callHumanize("humanMove", page, target);
|
|
5084
|
+
},
|
|
5085
|
+
humanScroll(page, target, options = {}) {
|
|
5086
|
+
return callHumanize("humanScroll", page, target, options);
|
|
5087
|
+
},
|
|
5088
|
+
humanClick(page, target, options = {}) {
|
|
5089
|
+
return callHumanize("humanClick", page, target, options);
|
|
5090
|
+
},
|
|
5091
|
+
randomSleep(pageOrBaseMs, maybeBaseMs, maybeJitterPercent) {
|
|
5092
|
+
return callHumanize("randomSleep", pageOrBaseMs, maybeBaseMs, maybeJitterPercent);
|
|
5093
|
+
},
|
|
5094
|
+
simulateGaze(page, baseDurationMs = 2500) {
|
|
5095
|
+
return callHumanize("simulateGaze", page, baseDurationMs);
|
|
5096
|
+
},
|
|
5097
|
+
humanType(page, selector, text, options = {}) {
|
|
5098
|
+
return callHumanize("humanType", page, selector, text, options);
|
|
5099
|
+
},
|
|
5100
|
+
humanPress(page, targetOrKey, maybeKey, options = {}) {
|
|
5101
|
+
if (typeof maybeKey === "string") {
|
|
5102
|
+
return callHumanize("humanPress", page, targetOrKey, maybeKey, options);
|
|
5103
|
+
}
|
|
5104
|
+
return callHumanize("humanPress", page, targetOrKey, maybeKey || options);
|
|
5105
|
+
},
|
|
5106
|
+
humanClear(page, selector) {
|
|
5107
|
+
return callHumanize("humanClear", page, selector);
|
|
5108
|
+
},
|
|
5109
|
+
warmUpBrowsing(page, baseDuration = 3500) {
|
|
5110
|
+
return callHumanize("warmUpBrowsing", page, baseDuration);
|
|
5111
|
+
},
|
|
5112
|
+
naturalScroll(page, direction = "down", distance = 300, baseSteps = 5) {
|
|
5113
|
+
return callHumanize("naturalScroll", page, direction, distance, baseSteps);
|
|
5114
|
+
}
|
|
5115
|
+
};
|
|
5116
|
+
|
|
5117
|
+
// src/internals/launch/default.js
|
|
4595
5118
|
import { execFileSync } from "node:child_process";
|
|
4596
5119
|
import { FingerprintGenerator } from "fingerprint-generator";
|
|
4597
5120
|
import { FingerprintInjector } from "fingerprint-injector";
|
|
@@ -4676,7 +5199,7 @@ var ByPass = {
|
|
|
4676
5199
|
resolveRouteByProxy
|
|
4677
5200
|
};
|
|
4678
5201
|
|
|
4679
|
-
// src/launch.js
|
|
5202
|
+
// src/internals/launch/default.js
|
|
4680
5203
|
var logger8 = createInternalLogger("Launch");
|
|
4681
5204
|
var REQUEST_HOOK_FLAG = Symbol("playwright-toolkit-request-hook");
|
|
4682
5205
|
var injectedContexts = /* @__PURE__ */ new WeakSet();
|
|
@@ -4743,7 +5266,7 @@ var resolveCoreDevice = (core = {}) => {
|
|
|
4743
5266
|
};
|
|
4744
5267
|
var buildFingerprintGenerator = ({ locale, browserMajorVersion, device }) => {
|
|
4745
5268
|
return new FingerprintGenerator(
|
|
4746
|
-
|
|
5269
|
+
DefaultAntiCheat.getFingerprintGeneratorOptions({
|
|
4747
5270
|
locale,
|
|
4748
5271
|
browserMajorVersion,
|
|
4749
5272
|
device
|
|
@@ -4787,7 +5310,7 @@ var buildReplayableBrowserProfile = (runtimeState, launcher) => {
|
|
|
4787
5310
|
}
|
|
4788
5311
|
let nextState = RuntimeEnv.rememberState(runtimeState);
|
|
4789
5312
|
let browserProfileCore = RuntimeEnv.getBrowserProfileCore(nextState);
|
|
4790
|
-
const timezoneId = String(browserProfileCore?.timezone_id || "").trim() ||
|
|
5313
|
+
const timezoneId = String(browserProfileCore?.timezone_id || "").trim() || DefaultAntiCheat.getBaseConfig().timezoneId;
|
|
4791
5314
|
const locale = DEFAULT_LOCALE;
|
|
4792
5315
|
const currentBrowserMajorVersion = detectBrowserMajorVersion(launcher);
|
|
4793
5316
|
const storedBrowserMajorVersion = Number(browserProfileCore?.browser_major_version || 0);
|
|
@@ -4896,7 +5419,7 @@ var buildReplayBrowserPoolOptions = (browserProfileCore) => {
|
|
|
4896
5419
|
]
|
|
4897
5420
|
};
|
|
4898
5421
|
};
|
|
4899
|
-
var
|
|
5422
|
+
var DefaultLaunch = {
|
|
4900
5423
|
getPlaywrightCrawlerOptions(options = {}) {
|
|
4901
5424
|
const normalizedOptions = Array.isArray(options) ? { customArgs: options } : options || {};
|
|
4902
5425
|
const {
|
|
@@ -4924,7 +5447,7 @@ var Launch = {
|
|
|
4924
5447
|
const launchLocale = String(replayContext.browserProfileCore?.locale || DEFAULT_LOCALE).trim() || DEFAULT_LOCALE;
|
|
4925
5448
|
const launchOptions = {
|
|
4926
5449
|
args: [
|
|
4927
|
-
...
|
|
5450
|
+
...DefaultAntiCheat.getLaunchArgs({ locale: launchLocale }),
|
|
4928
5451
|
...customArgs
|
|
4929
5452
|
],
|
|
4930
5453
|
ignoreDefaultArgs: ["--enable-automation"]
|
|
@@ -4992,7 +5515,7 @@ var Launch = {
|
|
|
4992
5515
|
browserPoolOptions: replayBrowserPoolOptions || {
|
|
4993
5516
|
useFingerprints: true,
|
|
4994
5517
|
fingerprintOptions: {
|
|
4995
|
-
fingerprintGeneratorOptions:
|
|
5518
|
+
fingerprintGeneratorOptions: DefaultAntiCheat.getFingerprintGeneratorOptions({
|
|
4996
5519
|
locale: launchLocale,
|
|
4997
5520
|
device
|
|
4998
5521
|
})
|
|
@@ -5000,7 +5523,7 @@ var Launch = {
|
|
|
5000
5523
|
prePageCreateHooks: [
|
|
5001
5524
|
(_pageId, browserController, pageOptions = {}) => {
|
|
5002
5525
|
const fingerprintWithHeaders = browserController?.launchContext?.fingerprint;
|
|
5003
|
-
const timezoneId =
|
|
5526
|
+
const timezoneId = DefaultAntiCheat.getBaseConfig().timezoneId;
|
|
5004
5527
|
applyFingerprintPageOptions(pageOptions, {
|
|
5005
5528
|
fingerprintWithHeaders,
|
|
5006
5529
|
locale: launchLocale,
|
|
@@ -5027,7 +5550,7 @@ var Launch = {
|
|
|
5027
5550
|
}
|
|
5028
5551
|
};
|
|
5029
5552
|
|
|
5030
|
-
// src/cloakbrowser.js
|
|
5553
|
+
// src/internals/launch/cloakbrowser.js
|
|
5031
5554
|
import { execFile } from "node:child_process";
|
|
5032
5555
|
import { promisify } from "node:util";
|
|
5033
5556
|
var logger9 = createInternalLogger("CloakBrowser");
|
|
@@ -5169,7 +5692,7 @@ var forceTerminateBrowsersByFingerprintArg = async (fingerprintArg) => {
|
|
|
5169
5692
|
logger9.info(`\u5F3A\u5236\u5173\u95ED CloakBrowser \u8FDB\u7A0B\u5931\u8D25\uFF08\u5FFD\u7565\uFF09: ${error?.message || String(error)}`);
|
|
5170
5693
|
});
|
|
5171
5694
|
};
|
|
5172
|
-
var
|
|
5695
|
+
var CloakBrowserLaunch = {
|
|
5173
5696
|
resolveProxyConfiguration(proxyConfiguration = {}) {
|
|
5174
5697
|
return resolveCloakBrowserProxy(proxyConfiguration);
|
|
5175
5698
|
},
|
|
@@ -5179,6 +5702,10 @@ var CloakBrowser = {
|
|
|
5179
5702
|
createStableGotoHook(recommendedGotoOptions = DEFAULT_CLOAK_GOTO_OPTIONS) {
|
|
5180
5703
|
return createStableGotoHook(recommendedGotoOptions);
|
|
5181
5704
|
},
|
|
5705
|
+
async getPlaywrightCrawlerOptions(options = {}) {
|
|
5706
|
+
const { crawlerOptions } = await CloakBrowserLaunch.createPlaywrightCrawlerRuntime(options);
|
|
5707
|
+
return crawlerOptions;
|
|
5708
|
+
},
|
|
5182
5709
|
async buildLaunchOptions(options = {}) {
|
|
5183
5710
|
return await buildCloakLaunchOptions(options);
|
|
5184
5711
|
},
|
|
@@ -5256,26 +5783,35 @@ var CloakBrowser = {
|
|
|
5256
5783
|
};
|
|
5257
5784
|
}
|
|
5258
5785
|
};
|
|
5259
|
-
|
|
5260
|
-
|
|
5261
|
-
|
|
5262
|
-
|
|
5263
|
-
|
|
5264
|
-
|
|
5265
|
-
}
|
|
5266
|
-
|
|
5267
|
-
|
|
5268
|
-
|
|
5269
|
-
|
|
5270
|
-
|
|
5271
|
-
|
|
5272
|
-
|
|
5273
|
-
|
|
5274
|
-
|
|
5275
|
-
|
|
5276
|
-
|
|
5277
|
-
|
|
5278
|
-
}
|
|
5786
|
+
|
|
5787
|
+
// src/launch.js
|
|
5788
|
+
var resolveLaunchDelegate = () => getToolkitMode() === Mode.CloakBrowser ? CloakBrowserLaunch : DefaultLaunch;
|
|
5789
|
+
var callLaunch = (method, ...args) => {
|
|
5790
|
+
const delegate = resolveLaunchDelegate();
|
|
5791
|
+
if (typeof delegate?.[method] !== "function") {
|
|
5792
|
+
throw new Error(`Launch.${method} is not available in ${getToolkitMode()} mode`);
|
|
5793
|
+
}
|
|
5794
|
+
return delegate[method](...args);
|
|
5795
|
+
};
|
|
5796
|
+
var Launch = {
|
|
5797
|
+
getPlaywrightCrawlerOptions(options = {}) {
|
|
5798
|
+
return callLaunch("getPlaywrightCrawlerOptions", options);
|
|
5799
|
+
},
|
|
5800
|
+
resolveProxyConfiguration(proxyConfiguration = {}) {
|
|
5801
|
+
return callLaunch("resolveProxyConfiguration", proxyConfiguration);
|
|
5802
|
+
},
|
|
5803
|
+
extractFingerprintArg(launchOptions = {}) {
|
|
5804
|
+
return callLaunch("extractFingerprintArg", launchOptions);
|
|
5805
|
+
},
|
|
5806
|
+
createStableGotoHook(recommendedGotoOptions = {}) {
|
|
5807
|
+
return callLaunch("createStableGotoHook", recommendedGotoOptions);
|
|
5808
|
+
},
|
|
5809
|
+
buildLaunchOptions(options = {}) {
|
|
5810
|
+
return callLaunch("buildLaunchOptions", options);
|
|
5811
|
+
},
|
|
5812
|
+
createPlaywrightCrawlerRuntime(options = {}) {
|
|
5813
|
+
return callLaunch("createPlaywrightCrawlerRuntime", options);
|
|
5814
|
+
}
|
|
5279
5815
|
};
|
|
5280
5816
|
|
|
5281
5817
|
// src/live-view.js
|
|
@@ -7645,7 +8181,7 @@ var Logger = {
|
|
|
7645
8181
|
};
|
|
7646
8182
|
|
|
7647
8183
|
// src/share.js
|
|
7648
|
-
import
|
|
8184
|
+
import delay5 from "delay";
|
|
7649
8185
|
|
|
7650
8186
|
// src/internals/watermarkify.js
|
|
7651
8187
|
var DEFAULT_TIMEZONE_OFFSET = 8;
|
|
@@ -9716,7 +10252,7 @@ var Share = {
|
|
|
9716
10252
|
);
|
|
9717
10253
|
nextProgressLogTs = now + 5e3;
|
|
9718
10254
|
}
|
|
9719
|
-
await
|
|
10255
|
+
await delay5(Math.max(0, Math.min(DEFAULT_POLL_INTERVAL_MS, remaining)));
|
|
9720
10256
|
}
|
|
9721
10257
|
if (!timeoutDisabled && share.mode === "response" && stats.responseMatched === 0) {
|
|
9722
10258
|
logger16.warning(
|
|
@@ -9782,14 +10318,14 @@ var Share = {
|
|
|
9782
10318
|
// entrys/node.js
|
|
9783
10319
|
Logger.setLogger(crawleeLog);
|
|
9784
10320
|
var usePlaywrightToolKit = (mode = "default") => {
|
|
9785
|
-
|
|
10321
|
+
setToolkitMode(mode);
|
|
9786
10322
|
const toolkit = {
|
|
9787
10323
|
ApifyKit,
|
|
9788
10324
|
AntiCheat,
|
|
9789
10325
|
DeviceInput,
|
|
9790
10326
|
DeviceView,
|
|
9791
10327
|
Humanize: Humanize2,
|
|
9792
|
-
Launch
|
|
10328
|
+
Launch,
|
|
9793
10329
|
LiveView,
|
|
9794
10330
|
Constants: constants_exports,
|
|
9795
10331
|
Utils,
|