@viyzhu/boss-cli-fork 0.6.8
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/AGENTS.md +30 -0
- package/LICENSE +674 -0
- package/README.md +223 -0
- package/dist/browser/browser_session.d.ts +27 -0
- package/dist/browser/browser_session.d.ts.map +1 -0
- package/dist/browser/browser_session.js +246 -0
- package/dist/browser/browser_session.js.map +1 -0
- package/dist/browser/cdp_browser.d.ts +50 -0
- package/dist/browser/cdp_browser.d.ts.map +1 -0
- package/dist/browser/cdp_browser.js +315 -0
- package/dist/browser/cdp_browser.js.map +1 -0
- package/dist/browser/human_delay.d.ts +117 -0
- package/dist/browser/human_delay.d.ts.map +1 -0
- package/dist/browser/human_delay.js +71 -0
- package/dist/browser/human_delay.js.map +1 -0
- package/dist/browser/index.d.ts +9 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +9 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/timing.d.ts +7 -0
- package/dist/browser/timing.d.ts.map +1 -0
- package/dist/browser/timing.js +34 -0
- package/dist/browser/timing.js.map +1 -0
- package/dist/browser/viewport_temp.d.ts +15 -0
- package/dist/browser/viewport_temp.d.ts.map +1 -0
- package/dist/browser/viewport_temp.js +78 -0
- package/dist/browser/viewport_temp.js.map +1 -0
- package/dist/cli/banner.d.ts +2 -0
- package/dist/cli/banner.d.ts.map +1 -0
- package/dist/cli/banner.js +69 -0
- package/dist/cli/banner.js.map +1 -0
- package/dist/cli/cliRouter.d.ts +9 -0
- package/dist/cli/cliRouter.d.ts.map +1 -0
- package/dist/cli/cliRouter.js +604 -0
- package/dist/cli/cliRouter.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +34 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/version.d.ts +29 -0
- package/dist/cli/version.d.ts.map +1 -0
- package/dist/cli/version.js +180 -0
- package/dist/cli/version.js.map +1 -0
- package/dist/common/auth.d.ts +44 -0
- package/dist/common/auth.d.ts.map +1 -0
- package/dist/common/auth.js +168 -0
- package/dist/common/auth.js.map +1 -0
- package/dist/common/baidu_user_env.d.ts +7 -0
- package/dist/common/baidu_user_env.d.ts.map +1 -0
- package/dist/common/baidu_user_env.js +56 -0
- package/dist/common/baidu_user_env.js.map +1 -0
- package/dist/common/boss_availability.d.ts +5 -0
- package/dist/common/boss_availability.d.ts.map +1 -0
- package/dist/common/boss_availability.js +245 -0
- package/dist/common/boss_availability.js.map +1 -0
- package/dist/common/boss_modal.d.ts +14 -0
- package/dist/common/boss_modal.d.ts.map +1 -0
- package/dist/common/boss_modal.js +81 -0
- package/dist/common/boss_modal.js.map +1 -0
- package/dist/common/boss_page_guards.d.ts +14 -0
- package/dist/common/boss_page_guards.d.ts.map +1 -0
- package/dist/common/boss_page_guards.js +596 -0
- package/dist/common/boss_page_guards.js.map +1 -0
- package/dist/common/boss_paywall_popup.d.ts +28 -0
- package/dist/common/boss_paywall_popup.d.ts.map +1 -0
- package/dist/common/boss_paywall_popup.js +158 -0
- package/dist/common/boss_paywall_popup.js.map +1 -0
- package/dist/common/boss_session_lock.d.ts +2 -0
- package/dist/common/boss_session_lock.d.ts.map +1 -0
- package/dist/common/boss_session_lock.js +127 -0
- package/dist/common/boss_session_lock.js.map +1 -0
- package/dist/common/boss_session_page.d.ts +27 -0
- package/dist/common/boss_session_page.d.ts.map +1 -0
- package/dist/common/boss_session_page.js +173 -0
- package/dist/common/boss_session_page.js.map +1 -0
- package/dist/common/boss_sidebar_nav.d.ts +7 -0
- package/dist/common/boss_sidebar_nav.d.ts.map +1 -0
- package/dist/common/boss_sidebar_nav.js +53 -0
- package/dist/common/boss_sidebar_nav.js.map +1 -0
- package/dist/common/c_resume_capture.d.ts +19 -0
- package/dist/common/c_resume_capture.d.ts.map +1 -0
- package/dist/common/c_resume_capture.js +185 -0
- package/dist/common/c_resume_capture.js.map +1 -0
- package/dist/common/ensure_page.d.ts +9 -0
- package/dist/common/ensure_page.d.ts.map +1 -0
- package/dist/common/ensure_page.js +14 -0
- package/dist/common/ensure_page.js.map +1 -0
- package/dist/config.d.ts +22 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +57 -0
- package/dist/config.js.map +1 -0
- package/dist/ocr/baidu_ocr.d.ts +13 -0
- package/dist/ocr/baidu_ocr.d.ts.map +1 -0
- package/dist/ocr/baidu_ocr.js +80 -0
- package/dist/ocr/baidu_ocr.js.map +1 -0
- package/dist/ocr/index.d.ts +3 -0
- package/dist/ocr/index.d.ts.map +1 -0
- package/dist/ocr/index.js +3 -0
- package/dist/ocr/index.js.map +1 -0
- package/dist/ocr/resume_ocr.d.ts +13 -0
- package/dist/ocr/resume_ocr.d.ts.map +1 -0
- package/dist/ocr/resume_ocr.js +38 -0
- package/dist/ocr/resume_ocr.js.map +1 -0
- package/dist/toolset/action.d.ts +12 -0
- package/dist/toolset/action.d.ts.map +1 -0
- package/dist/toolset/action.js +521 -0
- package/dist/toolset/action.js.map +1 -0
- package/dist/toolset/baidu_credentials.d.ts +5 -0
- package/dist/toolset/baidu_credentials.d.ts.map +1 -0
- package/dist/toolset/baidu_credentials.js +24 -0
- package/dist/toolset/baidu_credentials.js.map +1 -0
- package/dist/toolset/chat.d.ts +10 -0
- package/dist/toolset/chat.d.ts.map +1 -0
- package/dist/toolset/chat.js +763 -0
- package/dist/toolset/chat.js.map +1 -0
- package/dist/toolset/deep-search.d.ts +35 -0
- package/dist/toolset/deep-search.d.ts.map +1 -0
- package/dist/toolset/deep-search.js +1505 -0
- package/dist/toolset/deep-search.js.map +1 -0
- package/dist/toolset/greet.d.ts +6 -0
- package/dist/toolset/greet.d.ts.map +1 -0
- package/dist/toolset/greet.js +81 -0
- package/dist/toolset/greet.js.map +1 -0
- package/dist/toolset/index.d.ts +48 -0
- package/dist/toolset/index.d.ts.map +1 -0
- package/dist/toolset/index.js +71 -0
- package/dist/toolset/index.js.map +1 -0
- package/dist/toolset/jd.d.ts +10 -0
- package/dist/toolset/jd.d.ts.map +1 -0
- package/dist/toolset/jd.js +406 -0
- package/dist/toolset/jd.js.map +1 -0
- package/dist/toolset/list.d.ts +6 -0
- package/dist/toolset/list.d.ts.map +1 -0
- package/dist/toolset/list.js +146 -0
- package/dist/toolset/list.js.map +1 -0
- package/dist/toolset/login.d.ts +6 -0
- package/dist/toolset/login.d.ts.map +1 -0
- package/dist/toolset/login.js +76 -0
- package/dist/toolset/login.js.map +1 -0
- package/dist/toolset/normal-search.d.ts +12 -0
- package/dist/toolset/normal-search.d.ts.map +1 -0
- package/dist/toolset/normal-search.js +301 -0
- package/dist/toolset/normal-search.js.map +1 -0
- package/dist/toolset/preview.d.ts +5 -0
- package/dist/toolset/preview.d.ts.map +1 -0
- package/dist/toolset/preview.js +100 -0
- package/dist/toolset/preview.js.map +1 -0
- package/dist/toolset/recommend.d.ts +36 -0
- package/dist/toolset/recommend.d.ts.map +1 -0
- package/dist/toolset/recommend.js +428 -0
- package/dist/toolset/recommend.js.map +1 -0
- package/dist/toolset/send.d.ts +7 -0
- package/dist/toolset/send.d.ts.map +1 -0
- package/dist/toolset/send.js +52 -0
- package/dist/toolset/send.js.map +1 -0
- package/package.json +69 -0
- package/skills/boss-frontend-analysis/SKILL.md +58 -0
- package/skills/boss-frontend-analysis/agents/openai.yaml +4 -0
- package/skills/boss-frontend-analysis/scripts/capture_boss_frontend.mjs +604 -0
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import readline from 'node:readline';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import puppeteer from 'puppeteer-core';
|
|
6
|
+
import { BROWSER_USER_DATA_DIR, ensureAppDataLayout } from '../config.js';
|
|
7
|
+
/** 与 @puppeteer/browsers 一致,解析 Chrome 启动日志中的 CDP WebSocket URL(可能在 stdout 或 stderr)。 */
|
|
8
|
+
const CDP_WEBSOCKET_ENDPOINT_REGEX = /^DevTools listening on (ws:\/\/.*)$/;
|
|
9
|
+
const LAUNCH_READY_MS = 30_000;
|
|
10
|
+
/**
|
|
11
|
+
* 固定的远程调试端口:boss-cli 使用独立的 user-data-dir,因此可以稳定占用一个端口,
|
|
12
|
+
* 让多个命令直接通过 `http://127.0.0.1:<port>/json/version` 复用同一只浏览器。
|
|
13
|
+
* 可用 `BOSS_BROWSER_REMOTE_DEBUGGING_PORT` 覆盖。
|
|
14
|
+
*/
|
|
15
|
+
export const REMOTE_DEBUGGING_PORT = (() => {
|
|
16
|
+
const raw = process.env.BOSS_BROWSER_REMOTE_DEBUGGING_PORT?.trim();
|
|
17
|
+
if (raw) {
|
|
18
|
+
const n = Number.parseInt(raw, 10);
|
|
19
|
+
if (Number.isFinite(n) && n > 0 && n <= 65535)
|
|
20
|
+
return n;
|
|
21
|
+
}
|
|
22
|
+
return 53470;
|
|
23
|
+
})();
|
|
24
|
+
let spawnedChromeChild = null;
|
|
25
|
+
/** 最近一次 `connectBrowser` 是否以无头方式启动(`browser.process()` 在 connect 模式下不可用,供 login 等逻辑判断)。 */
|
|
26
|
+
let lastChromeLaunchHeadless = false;
|
|
27
|
+
export function clearSpawnedChromeProcessRef() {
|
|
28
|
+
spawnedChromeChild = null;
|
|
29
|
+
}
|
|
30
|
+
/** 最近一次启动是否为无头(仅本进程内、与当前会话一致时有效)。 */
|
|
31
|
+
export function wasLastChromeLaunchHeadless() {
|
|
32
|
+
return lastChromeLaunchHeadless;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* 探测固定调试端口上是否已有在跑的 Chrome:直接命中 `/json/version` 拿当前
|
|
36
|
+
* `webSocketDebuggerUrl`,避免依赖 `DevToolsActivePort` 这种二级状态文件
|
|
37
|
+
* (可能被陈旧/清理/路径 UUID 漂移影响)。命中即可复用,未命中表示需要 spawn。
|
|
38
|
+
*/
|
|
39
|
+
async function probeRemoteDebuggingWsEndpoint(port, timeoutMs) {
|
|
40
|
+
const ctrl = new AbortController();
|
|
41
|
+
const timer = setTimeout(() => ctrl.abort(), timeoutMs);
|
|
42
|
+
try {
|
|
43
|
+
const res = await fetch(`http://127.0.0.1:${port}/json/version`, {
|
|
44
|
+
signal: ctrl.signal,
|
|
45
|
+
});
|
|
46
|
+
if (!res.ok)
|
|
47
|
+
return undefined;
|
|
48
|
+
const data = (await res.json());
|
|
49
|
+
const ws = data.webSocketDebuggerUrl;
|
|
50
|
+
return typeof ws === 'string' && ws.length > 0 ? ws : undefined;
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
finally {
|
|
56
|
+
clearTimeout(timer);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function waitForDevToolsWebSocketUrl(proc, userDataDir, timeoutMs) {
|
|
60
|
+
const streams = [proc.stdout, proc.stderr].filter((s) => s != null);
|
|
61
|
+
if (streams.length === 0) {
|
|
62
|
+
return Promise.reject(new Error('浏览器子进程无 stdout/stderr,无法获取 CDP 地址'));
|
|
63
|
+
}
|
|
64
|
+
return new Promise((resolve, reject) => {
|
|
65
|
+
const rls = [];
|
|
66
|
+
let settled = false;
|
|
67
|
+
let timer;
|
|
68
|
+
const cleanup = () => {
|
|
69
|
+
for (const rl of rls) {
|
|
70
|
+
try {
|
|
71
|
+
rl.close();
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
/* ignore */
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
rls.length = 0;
|
|
78
|
+
};
|
|
79
|
+
const finish = (fn) => {
|
|
80
|
+
if (settled)
|
|
81
|
+
return;
|
|
82
|
+
settled = true;
|
|
83
|
+
if (timer !== undefined) {
|
|
84
|
+
clearTimeout(timer);
|
|
85
|
+
timer = undefined;
|
|
86
|
+
}
|
|
87
|
+
proc.off('exit', onExit);
|
|
88
|
+
proc.off('error', onProcError);
|
|
89
|
+
cleanup();
|
|
90
|
+
fn();
|
|
91
|
+
};
|
|
92
|
+
timer = setTimeout(() => {
|
|
93
|
+
finish(() => {
|
|
94
|
+
reject(new Error(`等待 Chrome 输出 DevTools 地址超时(${timeoutMs}ms)`));
|
|
95
|
+
});
|
|
96
|
+
}, timeoutMs);
|
|
97
|
+
const onExit = (code) => {
|
|
98
|
+
finish(() => {
|
|
99
|
+
reject(new Error(code === 0
|
|
100
|
+
? `浏览器进程立即以代码 0 退出:user-data-dir「${userDataDir}」可能正被另一只「无远程调试端口」的 Chrome 持有(Chrome 单例锁会让我们 spawn 的新进程把命令行交还给它后立刻退出)。请关闭占用该目录的 Chrome 窗口后重试。`
|
|
101
|
+
: `浏览器进程在就绪前退出(代码 ${code ?? 'unknown'})`));
|
|
102
|
+
});
|
|
103
|
+
};
|
|
104
|
+
const onProcError = (err) => {
|
|
105
|
+
finish(() => {
|
|
106
|
+
reject(err);
|
|
107
|
+
});
|
|
108
|
+
};
|
|
109
|
+
const onLine = (line) => {
|
|
110
|
+
const m = line.trim().match(CDP_WEBSOCKET_ENDPOINT_REGEX);
|
|
111
|
+
if (m?.[1]) {
|
|
112
|
+
finish(() => {
|
|
113
|
+
resolve(m[1]);
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
proc.once('exit', onExit);
|
|
118
|
+
proc.once('error', onProcError);
|
|
119
|
+
for (const s of streams) {
|
|
120
|
+
const rl = readline.createInterface(s);
|
|
121
|
+
rls.push(rl);
|
|
122
|
+
rl.on('line', onLine);
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
/** 在未配置路径时,尝试常见安装位置(Chrome / Edge / Chromium)。 */
|
|
127
|
+
function findLocalChromiumExecutable() {
|
|
128
|
+
const candidates = [];
|
|
129
|
+
if (process.platform === 'win32') {
|
|
130
|
+
const local = process.env.LOCALAPPDATA;
|
|
131
|
+
const pf = process.env.PROGRAMFILES;
|
|
132
|
+
const pf86 = process.env['PROGRAMFILES(X86)'];
|
|
133
|
+
if (local) {
|
|
134
|
+
candidates.push(path.join(local, 'Google', 'Chrome', 'Application', 'chrome.exe'));
|
|
135
|
+
}
|
|
136
|
+
if (pf) {
|
|
137
|
+
candidates.push(path.join(pf, 'Google', 'Chrome', 'Application', 'chrome.exe'));
|
|
138
|
+
candidates.push(path.join(pf, 'Microsoft', 'Edge', 'Application', 'msedge.exe'));
|
|
139
|
+
}
|
|
140
|
+
if (pf86) {
|
|
141
|
+
candidates.push(path.join(pf86, 'Google', 'Chrome', 'Application', 'chrome.exe'));
|
|
142
|
+
candidates.push(path.join(pf86, 'Microsoft', 'Edge', 'Application', 'msedge.exe'));
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
else if (process.platform === 'darwin') {
|
|
146
|
+
candidates.push('/Applications/Google Chrome.app/Contents/MacOS/Google Chrome', '/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge', '/Applications/Chromium.app/Contents/MacOS/Chromium');
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
candidates.push('/usr/bin/google-chrome-stable', '/usr/bin/google-chrome', '/usr/bin/chromium', '/usr/bin/chromium-browser', '/usr/bin/microsoft-edge-stable', '/usr/bin/microsoft-edge');
|
|
150
|
+
}
|
|
151
|
+
for (const p of candidates) {
|
|
152
|
+
if (existsSync(p))
|
|
153
|
+
return p;
|
|
154
|
+
}
|
|
155
|
+
return undefined;
|
|
156
|
+
}
|
|
157
|
+
/** 减轻「正受到自动测试软件的控制」提示与常见自动化特征(非万能,站点仍可能用其它方式检测)。手动开 Chrome 并接 CDP 时可复用。 */
|
|
158
|
+
export const LAUNCH_ARGS_LESS_AUTOMATION = [
|
|
159
|
+
'--disable-infobars',
|
|
160
|
+
];
|
|
161
|
+
/** 仅用于本地调试:尽量放宽同源/CORS 限制,便于跨域 iframe/canvas 处理。 */
|
|
162
|
+
export const LAUNCH_ARGS_ALLOW_ALL_CORS = [
|
|
163
|
+
'--disable-web-security',
|
|
164
|
+
'--allow-running-insecure-content',
|
|
165
|
+
];
|
|
166
|
+
/**
|
|
167
|
+
* 启动本机浏览器(puppeteer-core 底层为 Chrome DevTools Protocol)。
|
|
168
|
+
*
|
|
169
|
+
* 环境变量(可选):
|
|
170
|
+
* - `CHROME_PATH` / `PUPPETEER_EXECUTABLE_PATH` — 启动本机浏览器可执行文件路径(高于自动探测)
|
|
171
|
+
* - `BOSS_BROWSER_USER_DATA_DIR` — 启动浏览器时复用的用户数据目录;未设置时默认 `~/.boss-cli/.cache/browser-data`
|
|
172
|
+
* - `BOSS_BROWSER_PROFILE_DIRECTORY` — 启动浏览器时指定 profile(如 `Default`)
|
|
173
|
+
* - `BOSS_BROWSER_REMOTE_DEBUGGING_PORT` — 远程调试端口(默认 53470);同一 user-data-dir 跨命令复用该端口
|
|
174
|
+
* - `BOSS_BROWSER_ALLOW_ALL_CORS` — 设为 `true` 时附加放宽同源/CORS 的启动参数(仅调试)
|
|
175
|
+
* - `BOSS_BROWSER_DISABLE_GPU` — 设为 `true` 时附加 `--disable-gpu`
|
|
176
|
+
*
|
|
177
|
+
* 若以上均未设置,会按系统尝试常见 Chrome / Edge / Chromium 安装路径。
|
|
178
|
+
* - `BOSS_BROWSER_HEADLESS` — 设为 `true` 时启用无头;默认**有界面**。
|
|
179
|
+
* - `BOSS_BROWSER_VIEWPORT_WIDTH` / `BOSS_BROWSER_VIEWPORT_HEIGHT` — 启动时显式指定视口;未设置时不覆盖浏览器窗口尺寸
|
|
180
|
+
*/
|
|
181
|
+
/** 启动浏览器时的默认视口(与环境变量一致);截图恢复时 `viewport()` 为 null 也可用其兜底。 */
|
|
182
|
+
export function defaultViewportFromEnv() {
|
|
183
|
+
const w = Number.parseInt(process.env.BOSS_BROWSER_VIEWPORT_WIDTH?.trim() ?? '', 10);
|
|
184
|
+
const h = Number.parseInt(process.env.BOSS_BROWSER_VIEWPORT_HEIGHT?.trim() ?? '', 10);
|
|
185
|
+
return {
|
|
186
|
+
width: Number.isFinite(w) && w > 0 ? w : 1280,
|
|
187
|
+
height: Number.isFinite(h) && h > 0 ? h : 1200,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
/** 仅在显式配置了视口环境变量时返回启动视口;否则返回 null,不覆盖浏览器实际窗口尺寸。 */
|
|
191
|
+
function launchViewportFromEnv() {
|
|
192
|
+
const rawW = process.env.BOSS_BROWSER_VIEWPORT_WIDTH?.trim() ?? '';
|
|
193
|
+
const rawH = process.env.BOSS_BROWSER_VIEWPORT_HEIGHT?.trim() ?? '';
|
|
194
|
+
if (!rawW && !rawH) {
|
|
195
|
+
return null;
|
|
196
|
+
}
|
|
197
|
+
return defaultViewportFromEnv();
|
|
198
|
+
}
|
|
199
|
+
export async function connectBrowser(options = {}) {
|
|
200
|
+
const executablePath = options.executablePath?.trim() ||
|
|
201
|
+
process.env.CHROME_PATH?.trim() ||
|
|
202
|
+
process.env.PUPPETEER_EXECUTABLE_PATH?.trim() ||
|
|
203
|
+
findLocalChromiumExecutable();
|
|
204
|
+
const envUserData = process.env.BOSS_BROWSER_USER_DATA_DIR?.trim();
|
|
205
|
+
if (!envUserData) {
|
|
206
|
+
ensureAppDataLayout();
|
|
207
|
+
}
|
|
208
|
+
const userDataDir = options.userDataDir?.trim() || envUserData || BROWSER_USER_DATA_DIR;
|
|
209
|
+
const profileDirectory = options.profileDirectory?.trim() || process.env.BOSS_BROWSER_PROFILE_DIRECTORY?.trim();
|
|
210
|
+
if (!executablePath) {
|
|
211
|
+
throw new Error('未找到本机 Chrome/Edge:请设置 CHROME_PATH / PUPPETEER_EXECUTABLE_PATH(可执行文件路径)。');
|
|
212
|
+
}
|
|
213
|
+
const headless = options.headless ?? process.env.BOSS_BROWSER_HEADLESS === 'true';
|
|
214
|
+
const allowAllCors = options.allowAllCors ?? process.env.BOSS_BROWSER_ALLOW_ALL_CORS === 'true';
|
|
215
|
+
const disableGpu = process.env.BOSS_BROWSER_DISABLE_GPU === 'true';
|
|
216
|
+
clearSpawnedChromeProcessRef();
|
|
217
|
+
lastChromeLaunchHeadless = !!headless;
|
|
218
|
+
/**
|
|
219
|
+
* 优先直连固定调试端口上的已有实例:boss-cli 使用独立 user-data-dir,
|
|
220
|
+
* 端口稳定可期,命中即跨命令复用同一只浏览器(同一登录态、同一标签)。
|
|
221
|
+
*/
|
|
222
|
+
const existingWsUrl = await probeRemoteDebuggingWsEndpoint(REMOTE_DEBUGGING_PORT, 800);
|
|
223
|
+
if (existingWsUrl) {
|
|
224
|
+
return await puppeteer.connect({
|
|
225
|
+
browserWSEndpoint: existingWsUrl,
|
|
226
|
+
defaultViewport: launchViewportFromEnv(),
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
// 默认保留 WebAssembly:`typeof WebAssembly === 'undefined'` 本身就是强自动化指纹。
|
|
230
|
+
// aegis_bg.wasm 已在 CDP `Fetch.enable` 层被阻断,不需要再禁用 WASM 引擎。
|
|
231
|
+
// 仅当显式设置 BOSS_BROWSER_DISABLE_WASM=true/1 时才追加 --noexpose_wasm。
|
|
232
|
+
const disableWasm = process.env.BOSS_BROWSER_DISABLE_WASM === 'true' || process.env.BOSS_BROWSER_DISABLE_WASM === '1';
|
|
233
|
+
const userArgs = [
|
|
234
|
+
...LAUNCH_ARGS_LESS_AUTOMATION,
|
|
235
|
+
...(disableGpu ? ['--disable-gpu'] : []),
|
|
236
|
+
...(disableWasm ? ['--js-flags=--noexpose_wasm'] : []),
|
|
237
|
+
...(allowAllCors ? LAUNCH_ARGS_ALLOW_ALL_CORS : []),
|
|
238
|
+
...(profileDirectory ? [`--profile-directory=${profileDirectory}`] : []),
|
|
239
|
+
];
|
|
240
|
+
let chromeArgs = puppeteer
|
|
241
|
+
.defaultArgs({
|
|
242
|
+
browser: 'chrome',
|
|
243
|
+
userDataDir,
|
|
244
|
+
headless,
|
|
245
|
+
args: userArgs,
|
|
246
|
+
})
|
|
247
|
+
.filter((a) => a !== '--enable-automation' && a !== 'about:blank' && a !== 'data:,');
|
|
248
|
+
if (!chromeArgs.some((a) => a.startsWith('--remote-debugging-'))) {
|
|
249
|
+
chromeArgs.push(`--remote-debugging-port=${REMOTE_DEBUGGING_PORT}`);
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* 不使用 `puppeteer.launch()`:其依赖的 `@puppeteer/browsers` 会在 **Node 进程 `exit` 时 kill 浏览器子进程**,
|
|
253
|
+
* 导致交互模式 / `npm run dev` 退出时窗口被一并关掉。改为自行 `spawn` + `connect`,退出时只断 CDP,浏览器可保留。
|
|
254
|
+
*/
|
|
255
|
+
const proc = spawn(executablePath, chromeArgs, {
|
|
256
|
+
detached: true,
|
|
257
|
+
env: process.env,
|
|
258
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
259
|
+
});
|
|
260
|
+
spawnedChromeChild = proc;
|
|
261
|
+
let wsUrl;
|
|
262
|
+
try {
|
|
263
|
+
wsUrl = await waitForDevToolsWebSocketUrl(proc, userDataDir, LAUNCH_READY_MS);
|
|
264
|
+
}
|
|
265
|
+
catch (e) {
|
|
266
|
+
try {
|
|
267
|
+
proc.kill();
|
|
268
|
+
}
|
|
269
|
+
catch {
|
|
270
|
+
/* ignore */
|
|
271
|
+
}
|
|
272
|
+
clearSpawnedChromeProcessRef();
|
|
273
|
+
throw e;
|
|
274
|
+
}
|
|
275
|
+
try {
|
|
276
|
+
proc.stdout?.resume();
|
|
277
|
+
proc.stderr?.resume();
|
|
278
|
+
}
|
|
279
|
+
catch {
|
|
280
|
+
/* ignore */
|
|
281
|
+
}
|
|
282
|
+
/** 单例移交时子进程已退出,无句柄可 unref;仅在本进程真正拉起 Chrome 时 unref,避免拖住 Node 退出。 */
|
|
283
|
+
if (proc.exitCode === null && proc.signalCode === null) {
|
|
284
|
+
try {
|
|
285
|
+
proc.unref();
|
|
286
|
+
}
|
|
287
|
+
catch {
|
|
288
|
+
/* ignore */
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
clearSpawnedChromeProcessRef();
|
|
293
|
+
}
|
|
294
|
+
try {
|
|
295
|
+
return await puppeteer.connect({
|
|
296
|
+
browserWSEndpoint: wsUrl,
|
|
297
|
+
defaultViewport: launchViewportFromEnv(),
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
catch (e) {
|
|
301
|
+
try {
|
|
302
|
+
proc.kill();
|
|
303
|
+
}
|
|
304
|
+
catch {
|
|
305
|
+
/* ignore */
|
|
306
|
+
}
|
|
307
|
+
clearSpawnedChromeProcessRef();
|
|
308
|
+
throw e;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
/** 对某一页创建原生 CDP Session(需要低层域如 `Network.*`、`Fetch.*` 时使用)。 */
|
|
312
|
+
export async function createPageCDPSession(page) {
|
|
313
|
+
return page.createCDPSession();
|
|
314
|
+
}
|
|
315
|
+
//# sourceMappingURL=cdp_browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cdp_browser.js","sourceRoot":"","sources":["../../src/browser/cdp_browser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import type { Page } from 'puppeteer-core';
|
|
2
|
+
/** macOS 用 Meta,其余平台用 Control */
|
|
3
|
+
export declare function selectAllModifierKey(): 'Meta' | 'Control';
|
|
4
|
+
/** 导航到沟通页并 load 后,等待 SPA/接口渲染 */
|
|
5
|
+
export declare const CHAT_GOTO_SETTLE_MS: {
|
|
6
|
+
readonly min: 2800;
|
|
7
|
+
readonly max: 5200;
|
|
8
|
+
};
|
|
9
|
+
/** 页面执行上下文被销毁后重试前 */
|
|
10
|
+
export declare const CONTEXT_DESTROY_RETRY_MS: {
|
|
11
|
+
readonly min: 900;
|
|
12
|
+
readonly max: 1800;
|
|
13
|
+
};
|
|
14
|
+
/** 侧栏导航点击后,等待路由与 SPA 状态开始变化 */
|
|
15
|
+
export declare const SIDEBAR_NAV_AFTER_CLICK_MS: {
|
|
16
|
+
readonly min: 420;
|
|
17
|
+
readonly max: 1100;
|
|
18
|
+
};
|
|
19
|
+
/** 列表滚动查找候选人时,每轮之间的间隔 */
|
|
20
|
+
export declare const OPEN_CHAT_SCROLL_GAP_MS: {
|
|
21
|
+
readonly min: 240;
|
|
22
|
+
readonly max: 760;
|
|
23
|
+
};
|
|
24
|
+
/** 点击会话行后,等待右侧面板出现的短停顿 */
|
|
25
|
+
export declare const OPEN_CHAT_AFTER_ROW_CLICK_MS: {
|
|
26
|
+
readonly min: 420;
|
|
27
|
+
readonly max: 1200;
|
|
28
|
+
};
|
|
29
|
+
/** mouse.click 的按下/抬起间隔(Puppeteer delay 选项) */
|
|
30
|
+
export declare const MOUSE_CLICK_PRESS_MS: {
|
|
31
|
+
readonly min: 55;
|
|
32
|
+
readonly max: 180;
|
|
33
|
+
};
|
|
34
|
+
/** 筛选「全部」等操作之间的停顿 */
|
|
35
|
+
export declare const LIST_FILTER_GAP_MS: {
|
|
36
|
+
readonly min: 780;
|
|
37
|
+
readonly max: 1400;
|
|
38
|
+
};
|
|
39
|
+
/** 岗位下拉打开、搜索输入、选择岗位等连续动作之间的停顿 */
|
|
40
|
+
export declare const JOB_SELECT_ACTION_GAP_MS: {
|
|
41
|
+
readonly min: 280;
|
|
42
|
+
readonly max: 760;
|
|
43
|
+
};
|
|
44
|
+
/** 岗位搜索输入后,等待前端过滤/接口刷新开始响应 */
|
|
45
|
+
export declare const JOB_SEARCH_ACTION_GAP_MS: {
|
|
46
|
+
readonly min: 420;
|
|
47
|
+
readonly max: 980;
|
|
48
|
+
};
|
|
49
|
+
/** 点击候选人卡片打开简历预览后,等待弹层/iframe 开始挂载 */
|
|
50
|
+
export declare const RESUME_PREVIEW_OPEN_GAP_MS: {
|
|
51
|
+
readonly min: 420;
|
|
52
|
+
readonly max: 1100;
|
|
53
|
+
};
|
|
54
|
+
/** 列表稳定轮询间隔(随机) */
|
|
55
|
+
export declare const LIST_POLL_MS: {
|
|
56
|
+
readonly min: 420;
|
|
57
|
+
readonly max: 780;
|
|
58
|
+
};
|
|
59
|
+
/** 列表为空时至少等待多久才认为稳定 */
|
|
60
|
+
export declare const LIST_MIN_BEFORE_EMPTY_OK_MS = 5000;
|
|
61
|
+
/** 登录态探测轮询间隔 */
|
|
62
|
+
export declare const PROBE_LOGIN_POLL_MS: {
|
|
63
|
+
readonly min: 520;
|
|
64
|
+
readonly max: 980;
|
|
65
|
+
};
|
|
66
|
+
/** 点击聊天输入框 */
|
|
67
|
+
export declare const SEND_INPUT_CLICK_MS: {
|
|
68
|
+
readonly min: 45;
|
|
69
|
+
readonly max: 160;
|
|
70
|
+
};
|
|
71
|
+
/** 逐字输入:字符间隔(随机) */
|
|
72
|
+
export declare const SEND_TYPING_GAP_MS: {
|
|
73
|
+
readonly min: 38;
|
|
74
|
+
readonly max: 125;
|
|
75
|
+
};
|
|
76
|
+
/** 按下 Enter 后、流程结束前短停顿 */
|
|
77
|
+
export declare const SEND_AFTER_ENTER_MS: {
|
|
78
|
+
readonly min: 260;
|
|
79
|
+
readonly max: 920;
|
|
80
|
+
};
|
|
81
|
+
/** `send` 中先发完文字后、再执行 `--action` 前的默认随机间隔(求简历 / 同意或拒绝附件等) */
|
|
82
|
+
export declare const SEND_BEFORE_RESUME_MS: {
|
|
83
|
+
readonly min: 2800;
|
|
84
|
+
readonly max: 5600;
|
|
85
|
+
};
|
|
86
|
+
/** 点击「沟通记录」后等待弹窗与列表渲染 */
|
|
87
|
+
export declare const CHAT_HISTORY_DIALOG_WAIT_MS: {
|
|
88
|
+
readonly min: 500;
|
|
89
|
+
readonly max: 1400;
|
|
90
|
+
};
|
|
91
|
+
/** 「同事沟通」/「我的沟通」切换后等待列表刷新 */
|
|
92
|
+
export declare const CHAT_HISTORY_TAB_SWITCH_MS: {
|
|
93
|
+
readonly min: 350;
|
|
94
|
+
readonly max: 900;
|
|
95
|
+
};
|
|
96
|
+
/** 点击「在线简历」后等待 iframe 出现 */
|
|
97
|
+
export declare const ONLINE_RESUME_IFRAME_APPEAR_MS: {
|
|
98
|
+
readonly min: 600;
|
|
99
|
+
readonly max: 1600;
|
|
100
|
+
};
|
|
101
|
+
/**
|
|
102
|
+
* 点击后等待 c-resume iframe 出现、或判定为付费墙弹层的上限(毫秒)。
|
|
103
|
+
* 仅在未出现付费墙时才会接近该时长;若先出现付费墙会提前结束(见 `waitForCResumeIframeOrPaywall`)。
|
|
104
|
+
*/
|
|
105
|
+
export declare const ONLINE_RESUME_IFRAME_WAIT_MAX_MS = 15000;
|
|
106
|
+
/** 打招呼点击后主文档付费弹层轮询上限(毫秒);命中则提前结束,未命中时最多增加约此时长。 */
|
|
107
|
+
export declare const GREET_PAYWALL_WAIT_MAX_MS = 3500;
|
|
108
|
+
/** iframe 出现后等待简历区域渲染 */
|
|
109
|
+
export declare const ONLINE_RESUME_IFRAME_SETTLE_MS: {
|
|
110
|
+
readonly min: 1800;
|
|
111
|
+
readonly max: 4200;
|
|
112
|
+
};
|
|
113
|
+
/**
|
|
114
|
+
* 逐字符输入,字符之间为随机间隔(末尾字符后不再额外等待)。
|
|
115
|
+
*/
|
|
116
|
+
export declare function typeTextWithRandomKeyDelay(page: Page, text: string, minGapMs: number, maxGapMs: number, signal?: AbortSignal): Promise<void>;
|
|
117
|
+
//# sourceMappingURL=human_delay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"human_delay.d.ts","sourceRoot":"","sources":["../../src/browser/human_delay.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAG3C,iCAAiC;AACjC,wBAAgB,oBAAoB,IAAI,MAAM,GAAG,SAAS,CAEzD;AAED,iCAAiC;AACjC,eAAO,MAAM,mBAAmB;;;CAAoC,CAAC;AAErE,qBAAqB;AACrB,eAAO,MAAM,wBAAwB;;;CAAmC,CAAC;AAEzE,+BAA+B;AAC/B,eAAO,MAAM,0BAA0B;;;CAAmC,CAAC;AAE3E,yBAAyB;AACzB,eAAO,MAAM,uBAAuB;;;CAAkC,CAAC;AAEvE,0BAA0B;AAC1B,eAAO,MAAM,4BAA4B;;;CAAmC,CAAC;AAE7E,+CAA+C;AAC/C,eAAO,MAAM,oBAAoB;;;CAAiC,CAAC;AAEnE,qBAAqB;AACrB,eAAO,MAAM,kBAAkB;;;CAAmC,CAAC;AAEnE,iCAAiC;AACjC,eAAO,MAAM,wBAAwB;;;CAAkC,CAAC;AAExE,8BAA8B;AAC9B,eAAO,MAAM,wBAAwB;;;CAAkC,CAAC;AAExE,sCAAsC;AACtC,eAAO,MAAM,0BAA0B;;;CAAmC,CAAC;AAE3E,mBAAmB;AACnB,eAAO,MAAM,YAAY;;;CAAkC,CAAC;AAE5D,uBAAuB;AACvB,eAAO,MAAM,2BAA2B,OAAO,CAAC;AAEhD,gBAAgB;AAChB,eAAO,MAAM,mBAAmB;;;CAAkC,CAAC;AAEnE,cAAc;AACd,eAAO,MAAM,mBAAmB;;;CAAiC,CAAC;AAElE,oBAAoB;AACpB,eAAO,MAAM,kBAAkB;;;CAAiC,CAAC;AAEjE,0BAA0B;AAC1B,eAAO,MAAM,mBAAmB;;;CAAkC,CAAC;AAEnE,6DAA6D;AAC7D,eAAO,MAAM,qBAAqB;;;CAAoC,CAAC;AAEvE,yBAAyB;AACzB,eAAO,MAAM,2BAA2B;;;CAAmC,CAAC;AAE5E,6BAA6B;AAC7B,eAAO,MAAM,0BAA0B;;;CAAkC,CAAC;AAE1E,4BAA4B;AAC5B,eAAO,MAAM,8BAA8B;;;CAAmC,CAAC;AAE/E;;;GAGG;AACH,eAAO,MAAM,gCAAgC,QAAS,CAAC;AAEvD,kDAAkD;AAClD,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAE9C,yBAAyB;AACzB,eAAO,MAAM,8BAA8B;;;CAAoC,CAAC;AAEhF;;GAEG;AACH,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC,CAYf"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { randomIntInclusive, sleep } from './timing.js';
|
|
2
|
+
/** macOS 用 Meta,其余平台用 Control */
|
|
3
|
+
export function selectAllModifierKey() {
|
|
4
|
+
return process.platform === 'darwin' ? 'Meta' : 'Control';
|
|
5
|
+
}
|
|
6
|
+
/** 导航到沟通页并 load 后,等待 SPA/接口渲染 */
|
|
7
|
+
export const CHAT_GOTO_SETTLE_MS = { min: 2800, max: 5200 };
|
|
8
|
+
/** 页面执行上下文被销毁后重试前 */
|
|
9
|
+
export const CONTEXT_DESTROY_RETRY_MS = { min: 900, max: 1800 };
|
|
10
|
+
/** 侧栏导航点击后,等待路由与 SPA 状态开始变化 */
|
|
11
|
+
export const SIDEBAR_NAV_AFTER_CLICK_MS = { min: 420, max: 1100 };
|
|
12
|
+
/** 列表滚动查找候选人时,每轮之间的间隔 */
|
|
13
|
+
export const OPEN_CHAT_SCROLL_GAP_MS = { min: 240, max: 760 };
|
|
14
|
+
/** 点击会话行后,等待右侧面板出现的短停顿 */
|
|
15
|
+
export const OPEN_CHAT_AFTER_ROW_CLICK_MS = { min: 420, max: 1200 };
|
|
16
|
+
/** mouse.click 的按下/抬起间隔(Puppeteer delay 选项) */
|
|
17
|
+
export const MOUSE_CLICK_PRESS_MS = { min: 55, max: 180 };
|
|
18
|
+
/** 筛选「全部」等操作之间的停顿 */
|
|
19
|
+
export const LIST_FILTER_GAP_MS = { min: 780, max: 1400 };
|
|
20
|
+
/** 岗位下拉打开、搜索输入、选择岗位等连续动作之间的停顿 */
|
|
21
|
+
export const JOB_SELECT_ACTION_GAP_MS = { min: 280, max: 760 };
|
|
22
|
+
/** 岗位搜索输入后,等待前端过滤/接口刷新开始响应 */
|
|
23
|
+
export const JOB_SEARCH_ACTION_GAP_MS = { min: 420, max: 980 };
|
|
24
|
+
/** 点击候选人卡片打开简历预览后,等待弹层/iframe 开始挂载 */
|
|
25
|
+
export const RESUME_PREVIEW_OPEN_GAP_MS = { min: 420, max: 1100 };
|
|
26
|
+
/** 列表稳定轮询间隔(随机) */
|
|
27
|
+
export const LIST_POLL_MS = { min: 420, max: 780 };
|
|
28
|
+
/** 列表为空时至少等待多久才认为稳定 */
|
|
29
|
+
export const LIST_MIN_BEFORE_EMPTY_OK_MS = 5000;
|
|
30
|
+
/** 登录态探测轮询间隔 */
|
|
31
|
+
export const PROBE_LOGIN_POLL_MS = { min: 520, max: 980 };
|
|
32
|
+
/** 点击聊天输入框 */
|
|
33
|
+
export const SEND_INPUT_CLICK_MS = { min: 45, max: 160 };
|
|
34
|
+
/** 逐字输入:字符间隔(随机) */
|
|
35
|
+
export const SEND_TYPING_GAP_MS = { min: 38, max: 125 };
|
|
36
|
+
/** 按下 Enter 后、流程结束前短停顿 */
|
|
37
|
+
export const SEND_AFTER_ENTER_MS = { min: 260, max: 920 };
|
|
38
|
+
/** `send` 中先发完文字后、再执行 `--action` 前的默认随机间隔(求简历 / 同意或拒绝附件等) */
|
|
39
|
+
export const SEND_BEFORE_RESUME_MS = { min: 2800, max: 5600 };
|
|
40
|
+
/** 点击「沟通记录」后等待弹窗与列表渲染 */
|
|
41
|
+
export const CHAT_HISTORY_DIALOG_WAIT_MS = { min: 500, max: 1400 };
|
|
42
|
+
/** 「同事沟通」/「我的沟通」切换后等待列表刷新 */
|
|
43
|
+
export const CHAT_HISTORY_TAB_SWITCH_MS = { min: 350, max: 900 };
|
|
44
|
+
/** 点击「在线简历」后等待 iframe 出现 */
|
|
45
|
+
export const ONLINE_RESUME_IFRAME_APPEAR_MS = { min: 600, max: 1600 };
|
|
46
|
+
/**
|
|
47
|
+
* 点击后等待 c-resume iframe 出现、或判定为付费墙弹层的上限(毫秒)。
|
|
48
|
+
* 仅在未出现付费墙时才会接近该时长;若先出现付费墙会提前结束(见 `waitForCResumeIframeOrPaywall`)。
|
|
49
|
+
*/
|
|
50
|
+
export const ONLINE_RESUME_IFRAME_WAIT_MAX_MS = 15_000;
|
|
51
|
+
/** 打招呼点击后主文档付费弹层轮询上限(毫秒);命中则提前结束,未命中时最多增加约此时长。 */
|
|
52
|
+
export const GREET_PAYWALL_WAIT_MAX_MS = 3500;
|
|
53
|
+
/** iframe 出现后等待简历区域渲染 */
|
|
54
|
+
export const ONLINE_RESUME_IFRAME_SETTLE_MS = { min: 1800, max: 4200 };
|
|
55
|
+
/**
|
|
56
|
+
* 逐字符输入,字符之间为随机间隔(末尾字符后不再额外等待)。
|
|
57
|
+
*/
|
|
58
|
+
export async function typeTextWithRandomKeyDelay(page, text, minGapMs, maxGapMs, signal) {
|
|
59
|
+
const codepoints = Array.from(text);
|
|
60
|
+
for (let i = 0; i < codepoints.length; i++) {
|
|
61
|
+
if (signal?.aborted) {
|
|
62
|
+
throw new Error('Aborted');
|
|
63
|
+
}
|
|
64
|
+
const ch = codepoints[i];
|
|
65
|
+
await page.keyboard.type(ch, { delay: 0 });
|
|
66
|
+
if (i < codepoints.length - 1) {
|
|
67
|
+
await sleep(randomIntInclusive(minGapMs, maxGapMs), signal);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=human_delay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"human_delay.js","sourceRoot":"","sources":["../../src/browser/human_delay.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAExD,iCAAiC;AACjC,MAAM,UAAU,oBAAoB;IAClC,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AAC5D,CAAC;AAED,iCAAiC;AACjC,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAW,CAAC;AAErE,qBAAqB;AACrB,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAW,CAAC;AAEzE,+BAA+B;AAC/B,MAAM,CAAC,MAAM,0BAA0B,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAW,CAAC;AAE3E,yBAAyB;AACzB,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAW,CAAC;AAEvE,0BAA0B;AAC1B,MAAM,CAAC,MAAM,4BAA4B,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAW,CAAC;AAE7E,+CAA+C;AAC/C,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAW,CAAC;AAEnE,qBAAqB;AACrB,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAW,CAAC;AAEnE,iCAAiC;AACjC,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAW,CAAC;AAExE,8BAA8B;AAC9B,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAW,CAAC;AAExE,sCAAsC;AACtC,MAAM,CAAC,MAAM,0BAA0B,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAW,CAAC;AAE3E,mBAAmB;AACnB,MAAM,CAAC,MAAM,YAAY,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAW,CAAC;AAE5D,uBAAuB;AACvB,MAAM,CAAC,MAAM,2BAA2B,GAAG,IAAI,CAAC;AAEhD,gBAAgB;AAChB,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAW,CAAC;AAEnE,cAAc;AACd,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAW,CAAC;AAElE,oBAAoB;AACpB,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAW,CAAC;AAEjE,0BAA0B;AAC1B,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAW,CAAC;AAEnE,6DAA6D;AAC7D,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAW,CAAC;AAEvE,yBAAyB;AACzB,MAAM,CAAC,MAAM,2BAA2B,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAW,CAAC;AAE5E,6BAA6B;AAC7B,MAAM,CAAC,MAAM,0BAA0B,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAW,CAAC;AAE1E,4BAA4B;AAC5B,MAAM,CAAC,MAAM,8BAA8B,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAW,CAAC;AAE/E;;;GAGG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAAG,MAAM,CAAC;AAEvD,kDAAkD;AAClD,MAAM,CAAC,MAAM,yBAAyB,GAAG,IAAI,CAAC;AAE9C,yBAAyB;AACzB,MAAM,CAAC,MAAM,8BAA8B,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAW,CAAC;AAEhF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,IAAU,EACV,IAAY,EACZ,QAAgB,EAChB,QAAgB,EAChB,MAAoB;IAEpB,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;QAC7B,CAAC;QACD,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,CAAE,CAAC;QAC1B,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAC3C,IAAI,CAAC,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,MAAM,KAAK,CAAC,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 浏览器:CDP 连接与会话(统一出口)。
|
|
3
|
+
*/
|
|
4
|
+
export * from './timing.js';
|
|
5
|
+
export * from './human_delay.js';
|
|
6
|
+
export { resumeHeight, setTempHeight, snapshotBossPageViewport, type BossViewportSnapshot, } from './viewport_temp.js';
|
|
7
|
+
export { connectBrowser, createPageCDPSession, defaultViewportFromEnv, LAUNCH_ARGS_ALLOW_ALL_CORS, LAUNCH_ARGS_LESS_AUTOMATION, type ConnectBrowserOptions, wasLastChromeLaunchHeadless, } from './cdp_browser.js';
|
|
8
|
+
export { detachBrowserSession, disconnectBrowserSession, ensureAndGetBrowser, ensureBrowserSession, getBrowserRef, getPageRef, setSessionPage, } from './browser_session.js';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/browser/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,OAAO,EACL,YAAY,EACZ,aAAa,EACb,wBAAwB,EACxB,KAAK,oBAAoB,GAC1B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,sBAAsB,EACtB,0BAA0B,EAC1B,2BAA2B,EAC3B,KAAK,qBAAqB,EAC1B,2BAA2B,GAC5B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,mBAAmB,EACnB,oBAAoB,EACpB,aAAa,EACb,UAAU,EACV,cAAc,GACf,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 浏览器:CDP 连接与会话(统一出口)。
|
|
3
|
+
*/
|
|
4
|
+
export * from './timing.js';
|
|
5
|
+
export * from './human_delay.js';
|
|
6
|
+
export { resumeHeight, setTempHeight, snapshotBossPageViewport, } from './viewport_temp.js';
|
|
7
|
+
export { connectBrowser, createPageCDPSession, defaultViewportFromEnv, LAUNCH_ARGS_ALLOW_ALL_CORS, LAUNCH_ARGS_LESS_AUTOMATION, wasLastChromeLaunchHeadless, } from './cdp_browser.js';
|
|
8
|
+
export { detachBrowserSession, disconnectBrowserSession, ensureAndGetBrowser, ensureBrowserSession, getBrowserRef, getPageRef, setSessionPage, } from './browser_session.js';
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/browser/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,OAAO,EACL,YAAY,EACZ,aAAa,EACb,wBAAwB,GAEzB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,sBAAsB,EACtB,0BAA0B,EAC1B,2BAA2B,EAE3B,2BAA2B,GAC5B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,mBAAmB,EACnB,oBAAoB,EACpB,aAAa,EACb,UAAU,EACV,cAAc,GACf,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** 固定休眠(支持 AbortSignal,与原先 auth.sleep 行为一致) */
|
|
2
|
+
export declare function sleep(ms: number, signal?: AbortSignal): Promise<void>;
|
|
3
|
+
/** 含两端在内的随机整数(使用 crypto.randomInt) */
|
|
4
|
+
export declare function randomIntInclusive(min: number, max: number): number;
|
|
5
|
+
/** 在 [minMs, maxMs] 内随机等待 */
|
|
6
|
+
export declare function sleepRandom(minMs: number, maxMs: number, signal?: AbortSignal): Promise<void>;
|
|
7
|
+
//# sourceMappingURL=timing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timing.d.ts","sourceRoot":"","sources":["../../src/browser/timing.ts"],"names":[],"mappings":"AAEA,+CAA+C;AAC/C,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBrE;AAED,sCAAsC;AACtC,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAOnE;AAED,6BAA6B;AAC7B,wBAAsB,WAAW,CAC/B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC,CAGf"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { randomInt } from 'node:crypto';
|
|
2
|
+
/** 固定休眠(支持 AbortSignal,与原先 auth.sleep 行为一致) */
|
|
3
|
+
export function sleep(ms, signal) {
|
|
4
|
+
return new Promise((resolve, reject) => {
|
|
5
|
+
if (signal?.aborted) {
|
|
6
|
+
reject(new Error('Aborted'));
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
const id = setTimeout(() => {
|
|
10
|
+
signal?.removeEventListener('abort', onAbort);
|
|
11
|
+
resolve();
|
|
12
|
+
}, ms);
|
|
13
|
+
const onAbort = () => {
|
|
14
|
+
clearTimeout(id);
|
|
15
|
+
reject(new Error('Aborted'));
|
|
16
|
+
};
|
|
17
|
+
signal?.addEventListener('abort', onAbort, { once: true });
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
/** 含两端在内的随机整数(使用 crypto.randomInt) */
|
|
21
|
+
export function randomIntInclusive(min, max) {
|
|
22
|
+
if (max < min) {
|
|
23
|
+
const t = min;
|
|
24
|
+
min = max;
|
|
25
|
+
max = t;
|
|
26
|
+
}
|
|
27
|
+
return randomInt(min, max + 1);
|
|
28
|
+
}
|
|
29
|
+
/** 在 [minMs, maxMs] 内随机等待 */
|
|
30
|
+
export async function sleepRandom(minMs, maxMs, signal) {
|
|
31
|
+
const ms = randomIntInclusive(minMs, maxMs);
|
|
32
|
+
return sleep(ms, signal);
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=timing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timing.js","sourceRoot":"","sources":["../../src/browser/timing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,+CAA+C;AAC/C,MAAM,UAAU,KAAK,CAAC,EAAU,EAAE,MAAoB;IACpD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YACpB,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;YAC7B,OAAO;QACT,CAAC;QACD,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE;YACzB,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC9C,OAAO,EAAE,CAAC;QACZ,CAAC,EAAE,EAAE,CAAC,CAAC;QACP,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,YAAY,CAAC,EAAE,CAAC,CAAC;YACjB,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;QAC/B,CAAC,CAAC;QACF,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACL,CAAC;AAED,sCAAsC;AACtC,MAAM,UAAU,kBAAkB,CAAC,GAAW,EAAE,GAAW;IACzD,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC;QACd,MAAM,CAAC,GAAG,GAAG,CAAC;QACd,GAAG,GAAG,GAAG,CAAC;QACV,GAAG,GAAG,CAAC,CAAC;IACV,CAAC;IACD,OAAO,SAAS,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;AACjC,CAAC;AAED,6BAA6B;AAC7B,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,KAAa,EACb,KAAa,EACb,MAAoB;IAEpB,MAAM,EAAE,GAAG,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC5C,OAAO,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Page } from 'puppeteer-core';
|
|
2
|
+
type ViewportState = Awaited<ReturnType<Page['viewport']>>;
|
|
3
|
+
export type BossViewportSnapshot = NonNullable<ViewportState>;
|
|
4
|
+
/**
|
|
5
|
+
* 供临时拉高/恢复视口使用。未设置 Puppeteer 固定视口时 `page.viewport()` 常为 `null`;
|
|
6
|
+
* 若此时仍用 {@link defaultViewportFromEnv}(如 1280×1200)恢复,会改掉用户真实窗口对应的布局视口。
|
|
7
|
+
* 在打开弹层/截图**之前**调用,用页面 `innerWidth`/`innerHeight` 作为恢复基准。
|
|
8
|
+
*/
|
|
9
|
+
export declare function snapshotBossPageViewport(page: Page): Promise<BossViewportSnapshot>;
|
|
10
|
+
/** 截图前临时拉高视口高度;`prev` 一般为进入流程前 `await page.viewport()` 的快照。 */
|
|
11
|
+
export declare function setTempHeight(page: Page, prev: ViewportState, heightPx?: number): Promise<void>;
|
|
12
|
+
/** 与 {@link setTempHeight} 配对,恢复截图前的视口。 */
|
|
13
|
+
export declare function resumeHeight(page: Page, prev: ViewportState): Promise<void>;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=viewport_temp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"viewport_temp.d.ts","sourceRoot":"","sources":["../../src/browser/viewport_temp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAM3C,KAAK,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AAC3D,MAAM,MAAM,oBAAoB,GAAG,WAAW,CAAC,aAAa,CAAC,CAAC;AAwC9D;;;;GAIG;AACH,wBAAsB,wBAAwB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA2BxF;AAED,+DAA+D;AAC/D,wBAAsB,aAAa,CACjC,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,aAAa,EACnB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAEf;AAED,2CAA2C;AAC3C,wBAAsB,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAEjF"}
|