@skrillex1224/playwright-toolkit 2.1.24 → 2.1.26
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/README.md +25 -25
- package/dist/index.cjs +9 -9
- package/dist/index.cjs.map +3 -3
- package/dist/index.js +9 -9
- package/dist/index.js.map +3 -3
- package/index.d.ts +2 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -23,7 +23,7 @@ import { usePlaywrightToolKit } from '@skrillex1224/playwright-toolkit';
|
|
|
23
23
|
await Actor.init();
|
|
24
24
|
|
|
25
25
|
// 初始化工具箱
|
|
26
|
-
const { ApifyKit: KitHook, Launch,
|
|
26
|
+
const { ApifyKit: KitHook, Launch, AntiCheat, Humanize, Captcha, LiveView, Constants } = usePlaywrightToolKit();
|
|
27
27
|
|
|
28
28
|
// ⚠️ ApifyKit 需要异步初始化
|
|
29
29
|
const ApifyKit = await KitHook.useApifyKit();
|
|
@@ -39,7 +39,7 @@ const crawler = new PlaywrightCrawler({
|
|
|
39
39
|
preNavigationHooks: [
|
|
40
40
|
async ({ page }) => {
|
|
41
41
|
// 统一反爬:时区/语言/权限/视口
|
|
42
|
-
await
|
|
42
|
+
await AntiCheat.applyPage(page);
|
|
43
43
|
|
|
44
44
|
// 验证码监控
|
|
45
45
|
Captcha.useCaptchaMonitor(page, {
|
|
@@ -77,32 +77,32 @@ await Actor.exit();
|
|
|
77
77
|
|
|
78
78
|
### 架构
|
|
79
79
|
|
|
80
|
-
| 层次
|
|
81
|
-
|
|
82
|
-
| **指纹层** | UA/屏幕/语言/时区一致性 | Crawlee `useFingerprints` + `
|
|
83
|
-
| **行为层** | 机械输入/点击/滚动
|
|
84
|
-
| **页面层** | 验证码/风控检测
|
|
80
|
+
| 层次 | 问题 | 解决方案 |
|
|
81
|
+
| ---------- | ----------------------- | --------------------------------------- |
|
|
82
|
+
| **指纹层** | UA/屏幕/语言/时区一致性 | Crawlee `useFingerprints` + `AntiCheat` |
|
|
83
|
+
| **行为层** | 机械输入/点击/滚动 | `ghost-cursor-playwright` + Humanize |
|
|
84
|
+
| **页面层** | 验证码/风控检测 | Captcha 监控器 |
|
|
85
85
|
|
|
86
86
|
### API 一览
|
|
87
87
|
|
|
88
|
-
| 模块
|
|
89
|
-
|
|
90
|
-
| `Launch`
|
|
91
|
-
| `Launch`
|
|
92
|
-
| `Launch`
|
|
93
|
-
| `
|
|
94
|
-
| `
|
|
95
|
-
| `
|
|
96
|
-
| `
|
|
97
|
-
| `Humanize`
|
|
98
|
-
| `Humanize`
|
|
99
|
-
| `Humanize`
|
|
100
|
-
| `Humanize`
|
|
101
|
-
| `Humanize`
|
|
102
|
-
| `Humanize`
|
|
103
|
-
| `Humanize`
|
|
104
|
-
| `Humanize`
|
|
105
|
-
| `Captcha`
|
|
88
|
+
| 模块 | 方法 | 说明 |
|
|
89
|
+
| ----------- | ---------------------------------------------------- | -------------------------------------- |
|
|
90
|
+
| `Launch` | `getAdvancedLaunchOptions()` | 增强版启动参数 |
|
|
91
|
+
| `Launch` | `getLaunchOptions()` | 基础启动参数 |
|
|
92
|
+
| `Launch` | `getFingerprintGeneratorOptions()` | 指纹生成器选项 |
|
|
93
|
+
| `AntiCheat` | `applyPage(page, options?)` | 应用时区/语言/权限/视口 |
|
|
94
|
+
| `AntiCheat` | `applyContext(context, options?)` | 仅应用 Context 设置 |
|
|
95
|
+
| `AntiCheat` | `syncViewportWithScreen(page)` | 同步视口与屏幕 |
|
|
96
|
+
| `AntiCheat` | `getTlsFingerprintOptions(userAgent?)` | got-scraping TLS 指纹 |
|
|
97
|
+
| `Humanize` | `initializeCursor(page)` | 初始化 Cursor (必须先调用) |
|
|
98
|
+
| `Humanize` | `jitterMs(base, jitterPercent?)` | 生成带抖动的毫秒数 (同步,返回 number) |
|
|
99
|
+
| `Humanize` | `humanType(page, selector, text, options?)` | 人类化输入 (baseDelay=180ms ±40%) |
|
|
100
|
+
| `Humanize` | `humanClick(page, selector, options?)` | 人类化点击 (reactionDelay=250ms ±40%) |
|
|
101
|
+
| `Humanize` | `warmUpBrowsing(page, baseDuration?)` | 页面预热 (3500ms ±40%) |
|
|
102
|
+
| `Humanize` | `naturalScroll(page, direction?, distance?, steps?)` | 自然滚动 (带惯性+抖动) |
|
|
103
|
+
| `Humanize` | `simulateGaze(page, baseDurationMs?)` | 模拟注视 (2500ms ±40%) |
|
|
104
|
+
| `Humanize` | `randomSleep(baseMs, jitterPercent?)` | 随机延迟 (±30% 抖动) |
|
|
105
|
+
| `Captcha` | `useCaptchaMonitor(page, options)` | 验证码监控 |
|
|
106
106
|
|
|
107
107
|
---
|
|
108
108
|
|
package/dist/index.cjs
CHANGED
|
@@ -351,8 +351,8 @@ var Utils = {
|
|
|
351
351
|
}
|
|
352
352
|
};
|
|
353
353
|
|
|
354
|
-
// src/
|
|
355
|
-
var logger3 = createLogger("
|
|
354
|
+
// src/anti-cheat.js
|
|
355
|
+
var logger3 = createLogger("AntiCheat");
|
|
356
356
|
var BASE_CONFIG = Object.freeze({
|
|
357
357
|
locale: "zh-CN",
|
|
358
358
|
acceptLanguage: "zh-CN,zh;q=0.9",
|
|
@@ -474,7 +474,7 @@ function resolveConfig(overrides = {}) {
|
|
|
474
474
|
geolocation: overrides.geolocation === null ? null : overrides.geolocation || BASE_CONFIG.geolocation
|
|
475
475
|
};
|
|
476
476
|
}
|
|
477
|
-
var
|
|
477
|
+
var AntiCheat = {
|
|
478
478
|
/**
|
|
479
479
|
* 获取统一的基础配置(中国、桌面端、中文语言)。
|
|
480
480
|
*/
|
|
@@ -1076,7 +1076,7 @@ var Launch = {
|
|
|
1076
1076
|
getLaunchOptions(customArgs = []) {
|
|
1077
1077
|
return {
|
|
1078
1078
|
args: [
|
|
1079
|
-
...
|
|
1079
|
+
...AntiCheat.getLaunchArgs(),
|
|
1080
1080
|
...customArgs
|
|
1081
1081
|
],
|
|
1082
1082
|
ignoreDefaultArgs: ["--enable-automation"]
|
|
@@ -1088,7 +1088,7 @@ var Launch = {
|
|
|
1088
1088
|
getAdvancedLaunchOptions(customArgs = []) {
|
|
1089
1089
|
return {
|
|
1090
1090
|
args: [
|
|
1091
|
-
...
|
|
1091
|
+
...AntiCheat.getAdvancedLaunchArgs(),
|
|
1092
1092
|
...customArgs
|
|
1093
1093
|
],
|
|
1094
1094
|
ignoreDefaultArgs: ["--enable-automation"]
|
|
@@ -1099,7 +1099,7 @@ var Launch = {
|
|
|
1099
1099
|
* 确保生成的是桌面端、较新的 Chrome,以匹配我们的脚本逻辑
|
|
1100
1100
|
*/
|
|
1101
1101
|
getFingerprintGeneratorOptions() {
|
|
1102
|
-
return
|
|
1102
|
+
return AntiCheat.getFingerprintGeneratorOptions();
|
|
1103
1103
|
}
|
|
1104
1104
|
};
|
|
1105
1105
|
|
|
@@ -1628,7 +1628,7 @@ var Interception = {
|
|
|
1628
1628
|
const reqHeaders = await request.allHeaders();
|
|
1629
1629
|
delete reqHeaders["host"];
|
|
1630
1630
|
const currentAcceptLanguage = reqHeaders["accept-language"] || "";
|
|
1631
|
-
|
|
1631
|
+
AntiCheat.applyLocaleHeaders(reqHeaders, currentAcceptLanguage);
|
|
1632
1632
|
const resolvedAcceptLanguage = reqHeaders["accept-language"] || "";
|
|
1633
1633
|
const userAgent = reqHeaders["user-agent"] || "";
|
|
1634
1634
|
const method = request.method();
|
|
@@ -1643,7 +1643,7 @@ var Interception = {
|
|
|
1643
1643
|
responseType: "buffer",
|
|
1644
1644
|
// 强制获取 Buffer
|
|
1645
1645
|
// 模拟浏览器 TLS 指纹
|
|
1646
|
-
headerGeneratorOptions:
|
|
1646
|
+
headerGeneratorOptions: AntiCheat.getTlsFingerprintOptions(userAgent, resolvedAcceptLanguage),
|
|
1647
1647
|
// 使用共享的 Agent 单例(keepAlive: false,不会池化连接)
|
|
1648
1648
|
agent: {
|
|
1649
1649
|
http: SHARED_HTTP_AGENT,
|
|
@@ -1727,7 +1727,7 @@ function isIgnorableError(error) {
|
|
|
1727
1727
|
var usePlaywrightToolKit = () => {
|
|
1728
1728
|
return {
|
|
1729
1729
|
ApifyKit,
|
|
1730
|
-
|
|
1730
|
+
AntiCheat,
|
|
1731
1731
|
Humanize,
|
|
1732
1732
|
Launch,
|
|
1733
1733
|
LiveView,
|