@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,596 @@
|
|
|
1
|
+
import { BOSS_CHAT_INDEX_URL } from './auth.js';
|
|
2
|
+
const SHOULD_ALLOW_CONSOLE_CLEAR = process.env.BOSS_BROWSER_ALLOW_CONSOLE_CLEAR === 'true' ||
|
|
3
|
+
process.env.BOSS_BROWSER_ALLOW_CONSOLE_CLEAR === '1';
|
|
4
|
+
/**
|
|
5
|
+
* 主包用 `console.log` / `console.table` 重复打印大对象,比对耗时差判断 DevTools 是否打开。
|
|
6
|
+
* 默认开启对抗:把传入对象参数全部归一化为 `[object Type]` 字符串再交给原生方法,
|
|
7
|
+
* V8 inspector 序列化路径只看到短字符串,耗时不再随 DevTools 状态变化。
|
|
8
|
+
*
|
|
9
|
+
* 设为 `true` 可恢复完整 console 形态(保留对象树展开 UX,但会重新被时间差检测命中)。
|
|
10
|
+
*/
|
|
11
|
+
const SHOULD_ALLOW_VERBOSE_CONSOLE = process.env.BOSS_BROWSER_ALLOW_VERBOSE_CONSOLE === 'true' ||
|
|
12
|
+
process.env.BOSS_BROWSER_ALLOW_VERBOSE_CONSOLE === '1';
|
|
13
|
+
const BLOCKED_SECURITY_SCRIPT_PATTERNS = [
|
|
14
|
+
{ urlPattern: '*zhipin-security/web/boss/*', requestStage: 'Request' },
|
|
15
|
+
{ urlPattern: '*zhipin-boss*risk-detection*', requestStage: 'Request' },
|
|
16
|
+
{ urlPattern: '*bosszhipin.com/static/zhipin/geek/sdk/*', requestStage: 'Request' },
|
|
17
|
+
];
|
|
18
|
+
const REPORT_REQUEST_PATTERNS = [
|
|
19
|
+
{ urlPattern: '*logapi.zhipin.com/dap/api/json*', requestStage: 'Request' },
|
|
20
|
+
{ urlPattern: '*logapi-dev.weizhipin.com/dap/api/json*', requestStage: 'Request' },
|
|
21
|
+
{ urlPattern: '*apm-fe.zhipin.com/wapi/zpApm/*', requestStage: 'Request' },
|
|
22
|
+
{ urlPattern: '*apm-fe-qa.weizhipin.com/wapi/zpApm/*', requestStage: 'Request' },
|
|
23
|
+
{ urlPattern: '*warlock.zhipin.com/wapi/warlock/*', requestStage: 'Request' },
|
|
24
|
+
{ urlPattern: '*shink.zhipin.com/wapi/dapCommon/json*', requestStage: 'Request' },
|
|
25
|
+
];
|
|
26
|
+
/**
|
|
27
|
+
* 设为 `true` / `1` 时完全不拦截风险页导航(403 / verify / security-check):
|
|
28
|
+
* Boss 真的要求人工验证时,让验证页正常渲染,用户手动完成后再跑命令。
|
|
29
|
+
*/
|
|
30
|
+
const SHOULD_ALLOW_RISK_NAV = process.env.BOSS_BROWSER_ALLOW_RISK_NAV === 'true' ||
|
|
31
|
+
process.env.BOSS_BROWSER_ALLOW_RISK_NAV === '1';
|
|
32
|
+
/**
|
|
33
|
+
* `about:blank` 是浏览器内置 URL,不会进入 CDP 网络拦截,因此不放在 Fetch.enable 模式里;
|
|
34
|
+
* 该路径只能靠页面内 Location 守卫与 framenavigated 兜底处理。
|
|
35
|
+
*/
|
|
36
|
+
const RISK_NAVIGATION_PATTERNS = [
|
|
37
|
+
{ urlPattern: '*/web/common/403.html*', requestStage: 'Request' },
|
|
38
|
+
{ urlPattern: '*/web/common/nonsupport.html*', requestStage: 'Request' },
|
|
39
|
+
{ urlPattern: '*/web/user/safe/verify*', requestStage: 'Request' },
|
|
40
|
+
{ urlPattern: '*/web/passport/zp/403.html*', requestStage: 'Request' },
|
|
41
|
+
{ urlPattern: '*/web/passport/zp/verify.html*', requestStage: 'Request' },
|
|
42
|
+
{ urlPattern: '*/web/passport/zp/security.html*', requestStage: 'Request' },
|
|
43
|
+
{ urlPattern: '*/web/passport/cm/403.html*', requestStage: 'Request' },
|
|
44
|
+
{ urlPattern: '*/web/passport/cm/verify.html*', requestStage: 'Request' },
|
|
45
|
+
{ urlPattern: '*/web/passport/cm/security-check.html*', requestStage: 'Request' },
|
|
46
|
+
];
|
|
47
|
+
const REPORT_REQUEST_RE = /(?:logapi(?:-dev)?\.(?:zhipin|weizhipin)\.com\/dap\/api\/json|apm-fe(?:-qa)?\.(?:zhipin|weizhipin)\.com\/wapi\/zpApm\/|warlock\.zhipin\.com\/wapi\/warlock\/|shink\.zhipin\.com\/wapi\/dapCommon\/json)/i;
|
|
48
|
+
const RISK_NAVIGATION_RE = /about:blank|\/web\/common\/(?:403|nonsupport)\.html|\/web\/user\/safe\/verify|\/web\/passport\/(?:zp\/(?:403|verify|security)\.html|cm\/(?:403|verify|security-check)\.html)/i;
|
|
49
|
+
const PAUSED_LABEL = {
|
|
50
|
+
report: 'report:204',
|
|
51
|
+
security_script: 'block:script',
|
|
52
|
+
risk_navigation: 'block:nav',
|
|
53
|
+
};
|
|
54
|
+
const POST_DATA_PREVIEW_LIMIT = 200;
|
|
55
|
+
function isReportRequestUrl(url) {
|
|
56
|
+
return REPORT_REQUEST_RE.test(url);
|
|
57
|
+
}
|
|
58
|
+
function isRiskNavigationUrl(url) {
|
|
59
|
+
return RISK_NAVIGATION_RE.test(url);
|
|
60
|
+
}
|
|
61
|
+
function classifyPausedRequest(url) {
|
|
62
|
+
if (REPORT_REQUEST_RE.test(url))
|
|
63
|
+
return 'report';
|
|
64
|
+
if (RISK_NAVIGATION_RE.test(url))
|
|
65
|
+
return 'risk_navigation';
|
|
66
|
+
// 落到这里的都是命中 BLOCKED_SECURITY_SCRIPT_PATTERNS 的请求;不再做 fallback 判定,
|
|
67
|
+
// 一旦后续新增 patterns 但忘记同步分类正则,调用方能立刻发现而不是被静默归错类。
|
|
68
|
+
return 'security_script';
|
|
69
|
+
}
|
|
70
|
+
function previewPostData(raw) {
|
|
71
|
+
if (!raw)
|
|
72
|
+
return '';
|
|
73
|
+
const compact = raw.replace(/\s+/g, ' ').trim();
|
|
74
|
+
if (!compact)
|
|
75
|
+
return '';
|
|
76
|
+
return compact.length > POST_DATA_PREVIEW_LIMIT
|
|
77
|
+
? `${compact.slice(0, POST_DATA_PREVIEW_LIMIT)}…`
|
|
78
|
+
: compact;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* 把一行诊断信息打到 **页面 DevTools Console**(不进 Node stderr / stdout)。
|
|
82
|
+
*
|
|
83
|
+
* 走 CDP `Runtime.evaluate` 直接在页面默认执行上下文调 `console.info`:
|
|
84
|
+
* - 终端输出完全保持干净,对非交互命令(list / recommend / chat 管道)无副作用。
|
|
85
|
+
* - 只有用户主动打开 DevTools Console 才能看到,匹配 "排查时才需要" 的语义。
|
|
86
|
+
* - 极早期请求(Runtime 上下文尚未创建)会失败,silently 忽略——拦截动作本身不依赖此日志。
|
|
87
|
+
*
|
|
88
|
+
* 注意:本函数会经过页面里 §5 的 `console.info` 包装(字符串参数原样通过),
|
|
89
|
+
* 不会触发 V8 inspector 的对象序列化慢路径,对 DevTools 时间差检测无影响。
|
|
90
|
+
*/
|
|
91
|
+
function logToPageConsole(cdp, message) {
|
|
92
|
+
void cdp
|
|
93
|
+
.send('Runtime.evaluate', {
|
|
94
|
+
expression: `console.info(${JSON.stringify(message)})`,
|
|
95
|
+
awaitPromise: false,
|
|
96
|
+
returnByValue: true,
|
|
97
|
+
})
|
|
98
|
+
.catch(() => {
|
|
99
|
+
/* 页面无可用执行上下文(极早期 / 卸载中)时丢弃此条日志即可 */
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
function readRequestHeader(headers, name) {
|
|
103
|
+
const lowerName = name.toLowerCase();
|
|
104
|
+
const entry = Object.entries(headers).find(([key]) => key.toLowerCase() === lowerName);
|
|
105
|
+
return entry?.[1];
|
|
106
|
+
}
|
|
107
|
+
function buildNoContentResponseHeaders(headers) {
|
|
108
|
+
const origin = readRequestHeader(headers, 'origin') ?? 'https://www.zhipin.com';
|
|
109
|
+
const requestedHeaders = readRequestHeader(headers, 'access-control-request-headers') ??
|
|
110
|
+
'content-type,x-requested-with,traceid,zp_token,__zp_stoken__';
|
|
111
|
+
return [
|
|
112
|
+
{ name: 'access-control-allow-origin', value: origin },
|
|
113
|
+
{ name: 'access-control-allow-credentials', value: 'true' },
|
|
114
|
+
{ name: 'access-control-allow-methods', value: 'GET,POST,PUT,PATCH,DELETE,OPTIONS' },
|
|
115
|
+
{ name: 'access-control-allow-headers', value: requestedHeaders },
|
|
116
|
+
{ name: 'cache-control', value: 'no-store' },
|
|
117
|
+
];
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* 守卫脚本设计要点:
|
|
121
|
+
* - 不在 `window` 上挂任何 Symbol/字符串自描述属性,避免成为指纹。
|
|
122
|
+
* - 替换的方法保留 `name`,并通过包装后的 `Function.prototype.toString` 让 `fn.toString()` 返回原生形态。
|
|
123
|
+
* - 改写的 accessor / 方法尽量落在 prototype 上,descriptor 形态对齐原生(`configurable: true`)。
|
|
124
|
+
* - 对 `Location.prototype.href` 的 setter 也加拦截,覆盖 `location.href = ...` 直接赋值场景。
|
|
125
|
+
* - 不再伪造 `navigator.plugins` 与 `window.chrome.*`:现代 Chrome 默认值已经合理,伪造反而会被
|
|
126
|
+
* `instanceof PluginArray`、对象形态比对等检测一眼分辨。
|
|
127
|
+
* - 不再覆盖 `window.closed`:`close()` 已经被改写为 noop,`closed` 自然保持原生默认值。
|
|
128
|
+
*/
|
|
129
|
+
const BOSS_PAGE_GUARD_SCRIPT_TEMPLATE = `(function() {
|
|
130
|
+
'use strict';
|
|
131
|
+
|
|
132
|
+
var _Object = Object;
|
|
133
|
+
var _defineProperty = _Object.defineProperty;
|
|
134
|
+
var _getOwnPropertyDescriptor = _Object.getOwnPropertyDescriptor;
|
|
135
|
+
var _Function = Function;
|
|
136
|
+
var _origFunctionToString = _Function.prototype.toString;
|
|
137
|
+
var _String = String;
|
|
138
|
+
var _Map = Map;
|
|
139
|
+
|
|
140
|
+
/** 让我们包装的函数对 fn.toString() 返回 "function NAME() { [native code] }"。 */
|
|
141
|
+
var nativeSourceMap = new _Map();
|
|
142
|
+
var fakeToString = function toString() {
|
|
143
|
+
if (this != null) {
|
|
144
|
+
var mapped = nativeSourceMap.get(this);
|
|
145
|
+
if (typeof mapped === 'string') return mapped;
|
|
146
|
+
}
|
|
147
|
+
return _origFunctionToString.call(this);
|
|
148
|
+
};
|
|
149
|
+
nativeSourceMap.set(fakeToString, 'function toString() { [native code] }');
|
|
150
|
+
try {
|
|
151
|
+
_defineProperty(_Function.prototype, 'toString', {
|
|
152
|
+
value: fakeToString,
|
|
153
|
+
writable: true,
|
|
154
|
+
configurable: true,
|
|
155
|
+
enumerable: false,
|
|
156
|
+
});
|
|
157
|
+
} catch (e) {}
|
|
158
|
+
|
|
159
|
+
/** 包装替身函数:把它伪装成 "function NAME() { [native code] }"。 */
|
|
160
|
+
var asNative = function(replacement, nativeName) {
|
|
161
|
+
var src = 'function ' + nativeName + '() { [native code] }';
|
|
162
|
+
nativeSourceMap.set(replacement, src);
|
|
163
|
+
try {
|
|
164
|
+
_defineProperty(replacement, 'name', {
|
|
165
|
+
value: nativeName,
|
|
166
|
+
writable: false,
|
|
167
|
+
configurable: true,
|
|
168
|
+
enumerable: false,
|
|
169
|
+
});
|
|
170
|
+
} catch (e) {}
|
|
171
|
+
return replacement;
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
/** 替换 prototype 上的方法(保持原 descriptor 形态:默认 configurable+writable)。 */
|
|
175
|
+
var replaceProtoMethod = function(proto, key, replacement) {
|
|
176
|
+
try {
|
|
177
|
+
var desc = _getOwnPropertyDescriptor(proto, key);
|
|
178
|
+
if (!desc) return null;
|
|
179
|
+
if (!desc.configurable) return null;
|
|
180
|
+
_defineProperty(proto, key, {
|
|
181
|
+
value: replacement,
|
|
182
|
+
writable: 'writable' in desc ? !!desc.writable : true,
|
|
183
|
+
configurable: true,
|
|
184
|
+
enumerable: !!desc.enumerable,
|
|
185
|
+
});
|
|
186
|
+
return desc.value;
|
|
187
|
+
} catch (e) {
|
|
188
|
+
return null;
|
|
189
|
+
}
|
|
190
|
+
};
|
|
191
|
+
|
|
192
|
+
/** 改写 prototype 上的 accessor:仅替换 getter/setter,保留 configurable/enumerable 形态。 */
|
|
193
|
+
var replaceProtoAccessor = function(proto, key, options) {
|
|
194
|
+
try {
|
|
195
|
+
var desc = _getOwnPropertyDescriptor(proto, key);
|
|
196
|
+
if (!desc || !desc.configurable) return null;
|
|
197
|
+
var nextDesc = {
|
|
198
|
+
configurable: true,
|
|
199
|
+
enumerable: !!desc.enumerable,
|
|
200
|
+
};
|
|
201
|
+
if (options.get || desc.get) nextDesc.get = options.get || desc.get;
|
|
202
|
+
if (options.set || desc.set) nextDesc.set = options.set || desc.set;
|
|
203
|
+
_defineProperty(proto, key, nextDesc);
|
|
204
|
+
return desc;
|
|
205
|
+
} catch (e) {
|
|
206
|
+
return null;
|
|
207
|
+
}
|
|
208
|
+
};
|
|
209
|
+
|
|
210
|
+
// ===== navigator.webdriver:在 Navigator.prototype 上覆盖 getter,保持 accessor 形态 =====
|
|
211
|
+
try {
|
|
212
|
+
var navProto = Object.getPrototypeOf(navigator);
|
|
213
|
+
if (navProto) {
|
|
214
|
+
replaceProtoAccessor(navProto, 'webdriver', {
|
|
215
|
+
get: asNative(function() { return false; }, 'get webdriver'),
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
} catch (e) {}
|
|
219
|
+
|
|
220
|
+
// ===== navigator.languages:仅在为空时回填,使用 prototype getter =====
|
|
221
|
+
try {
|
|
222
|
+
if (!navigator.languages || navigator.languages.length === 0) {
|
|
223
|
+
var navProto2 = Object.getPrototypeOf(navigator);
|
|
224
|
+
if (navProto2) {
|
|
225
|
+
var langs = ['zh-CN', 'zh', 'en'];
|
|
226
|
+
replaceProtoAccessor(navProto2, 'languages', {
|
|
227
|
+
get: asNative(function() { return langs; }, 'get languages'),
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
} catch (e) {}
|
|
232
|
+
|
|
233
|
+
// ===== window.close:改为空函数(保留 native 形态)=====
|
|
234
|
+
try {
|
|
235
|
+
var winProto = Object.getPrototypeOf(window);
|
|
236
|
+
if (winProto) {
|
|
237
|
+
replaceProtoMethod(winProto, 'close', asNative(function close() {}, 'close'));
|
|
238
|
+
}
|
|
239
|
+
} catch (e) {}
|
|
240
|
+
|
|
241
|
+
// ===== history.back / forward / go =====
|
|
242
|
+
try {
|
|
243
|
+
var historyProto = Object.getPrototypeOf(history);
|
|
244
|
+
if (historyProto) {
|
|
245
|
+
var origGo = historyProto.go;
|
|
246
|
+
replaceProtoMethod(historyProto, 'back', asNative(function back() {}, 'back'));
|
|
247
|
+
replaceProtoMethod(historyProto, 'forward', asNative(function forward() {}, 'forward'));
|
|
248
|
+
replaceProtoMethod(historyProto, 'go', asNative(function go(n) {
|
|
249
|
+
if (typeof n === 'number' && n < 0) return undefined;
|
|
250
|
+
return origGo.call(this, n);
|
|
251
|
+
}, 'go'));
|
|
252
|
+
}
|
|
253
|
+
} catch (e) {}
|
|
254
|
+
|
|
255
|
+
// ===== Location.assign / replace / href setter =====
|
|
256
|
+
var BLOCK_PATH = /\\/web\\/common\\/(?:403|nonsupport)\\.html|\\/web\\/user\\/safe\\/verify|\\/web\\/passport\\/(?:zp\\/(?:403|verify|security)\\.html|cm\\/(?:403|verify|security-check)\\.html)/i;
|
|
257
|
+
var isBlockedTarget = function(value) {
|
|
258
|
+
var s = _String(value);
|
|
259
|
+
if (s === 'about:blank') return true;
|
|
260
|
+
return BLOCK_PATH.test(s);
|
|
261
|
+
};
|
|
262
|
+
try {
|
|
263
|
+
var locProto = Location.prototype;
|
|
264
|
+
var origAssign = locProto.assign;
|
|
265
|
+
var origReplace = locProto.replace;
|
|
266
|
+
replaceProtoMethod(locProto, 'assign', asNative(function assign(url) {
|
|
267
|
+
if (isBlockedTarget(url)) return undefined;
|
|
268
|
+
return origAssign.call(this, url);
|
|
269
|
+
}, 'assign'));
|
|
270
|
+
replaceProtoMethod(locProto, 'replace', asNative(function replace(url) {
|
|
271
|
+
if (isBlockedTarget(url)) return undefined;
|
|
272
|
+
return origReplace.call(this, url);
|
|
273
|
+
}, 'replace'));
|
|
274
|
+
|
|
275
|
+
var hrefDesc = _getOwnPropertyDescriptor(locProto, 'href');
|
|
276
|
+
if (hrefDesc && hrefDesc.configurable && hrefDesc.set) {
|
|
277
|
+
var origHrefSet = hrefDesc.set;
|
|
278
|
+
_defineProperty(locProto, 'href', {
|
|
279
|
+
get: hrefDesc.get,
|
|
280
|
+
set: asNative(function(value) {
|
|
281
|
+
if (isBlockedTarget(value)) return undefined;
|
|
282
|
+
return origHrefSet.call(this, value);
|
|
283
|
+
}, 'set href'),
|
|
284
|
+
configurable: true,
|
|
285
|
+
enumerable: !!hrefDesc.enumerable,
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
} catch (e) {}
|
|
289
|
+
|
|
290
|
+
// ===== console.clear:可选替身,原生形态空函数 =====
|
|
291
|
+
if (!__SHOULD_ALLOW_CONSOLE_CLEAR__) {
|
|
292
|
+
try {
|
|
293
|
+
var consoleProtoForClear = Object.getPrototypeOf(console);
|
|
294
|
+
var ownClearDesc = Object.getOwnPropertyDescriptor(console, 'clear');
|
|
295
|
+
var protoClearDesc = consoleProtoForClear
|
|
296
|
+
? _getOwnPropertyDescriptor(consoleProtoForClear, 'clear')
|
|
297
|
+
: null;
|
|
298
|
+
var clearSrcDesc = ownClearDesc || protoClearDesc;
|
|
299
|
+
if (clearSrcDesc && typeof clearSrcDesc.value === 'function') {
|
|
300
|
+
try {
|
|
301
|
+
_defineProperty(console, 'clear', {
|
|
302
|
+
value: asNative(function clear() {}, 'clear'),
|
|
303
|
+
writable: 'writable' in clearSrcDesc ? clearSrcDesc.writable !== false : true,
|
|
304
|
+
configurable: true,
|
|
305
|
+
enumerable: !!clearSrcDesc.enumerable,
|
|
306
|
+
});
|
|
307
|
+
} catch (_) {}
|
|
308
|
+
}
|
|
309
|
+
} catch (e) {}
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
// ===== console 时间差探测对抗 =====
|
|
313
|
+
// 主包用 \`console.log\` / \`console.table\` 重复打印大对象(典型:50 次 × 0..500 数组),
|
|
314
|
+
// 比较前后 \`performance.now()\`,DevTools 打开时 V8 inspector 会把对象逐一序列化送去,
|
|
315
|
+
// 耗时显著上升即判定 DevTools 打开。对抗手段:把所有对象参数在我们这层先归一化为
|
|
316
|
+
// \`[object Type]\` 这种 O(1) 字符串再交给原生方法,inspector 序列化路径只看到短字符串,
|
|
317
|
+
// 耗时不再随 DevTools 状态变化。代价:DevTools 控制台中对象会显示成 \`[object Type]\`,
|
|
318
|
+
// 失去对象树展开 UX;断点 / Watch / Sources / 调用栈不受影响。
|
|
319
|
+
if (!__SHOULD_ALLOW_VERBOSE_CONSOLE__) {
|
|
320
|
+
try {
|
|
321
|
+
var _objToString = Object.prototype.toString;
|
|
322
|
+
var sanitizeArgs = function(rawArgs) {
|
|
323
|
+
var len = rawArgs.length;
|
|
324
|
+
var out = new Array(len);
|
|
325
|
+
for (var i = 0; i < len; i++) {
|
|
326
|
+
var a = rawArgs[i];
|
|
327
|
+
if (a !== null && typeof a === 'object') {
|
|
328
|
+
try {
|
|
329
|
+
out[i] = _objToString.call(a);
|
|
330
|
+
} catch (_) {
|
|
331
|
+
out[i] = '[object Object]';
|
|
332
|
+
}
|
|
333
|
+
} else if (typeof a === 'function') {
|
|
334
|
+
// 函数也别交给 inspector,避免 toString 串走慢路径
|
|
335
|
+
out[i] = '[Function: ' + (a.name || 'anonymous') + ']';
|
|
336
|
+
} else {
|
|
337
|
+
out[i] = a;
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
return out;
|
|
341
|
+
};
|
|
342
|
+
var consoleProtoForLog = Object.getPrototypeOf(console);
|
|
343
|
+
var consoleMethodNames = [
|
|
344
|
+
'log', 'info', 'debug', 'warn', 'error',
|
|
345
|
+
'table', 'dir', 'dirxml', 'trace',
|
|
346
|
+
'group', 'groupCollapsed',
|
|
347
|
+
];
|
|
348
|
+
for (var ci = 0; ci < consoleMethodNames.length; ci++) {
|
|
349
|
+
(function(method) {
|
|
350
|
+
// Chrome 把这些方法挂在 console 实例的 own property 上;
|
|
351
|
+
// 部分浏览器(含历史 Firefox)会挂在 Console.prototype 上。
|
|
352
|
+
// 优先取 own,否则退回 prototype;patch 一律 define 到实例上,
|
|
353
|
+
// 这样既能覆盖 own 写法,又能在 prototype 形态下 shadow 掉原方法。
|
|
354
|
+
var ownDesc = Object.getOwnPropertyDescriptor(console, method);
|
|
355
|
+
var protoDesc = consoleProtoForLog
|
|
356
|
+
? _getOwnPropertyDescriptor(consoleProtoForLog, method)
|
|
357
|
+
: null;
|
|
358
|
+
var srcDesc = ownDesc || protoDesc;
|
|
359
|
+
if (!srcDesc || typeof srcDesc.value !== 'function') return;
|
|
360
|
+
var orig = srcDesc.value;
|
|
361
|
+
var wrapped = asNative(function() {
|
|
362
|
+
return orig.apply(this, sanitizeArgs(arguments));
|
|
363
|
+
}, method);
|
|
364
|
+
try {
|
|
365
|
+
_defineProperty(console, method, {
|
|
366
|
+
value: wrapped,
|
|
367
|
+
writable: 'writable' in srcDesc ? srcDesc.writable !== false : true,
|
|
368
|
+
configurable: true,
|
|
369
|
+
enumerable: !!srcDesc.enumerable,
|
|
370
|
+
});
|
|
371
|
+
} catch (_) {}
|
|
372
|
+
})(consoleMethodNames[ci]);
|
|
373
|
+
}
|
|
374
|
+
} catch (e) {}
|
|
375
|
+
}
|
|
376
|
+
})();`;
|
|
377
|
+
function buildPageGuardScript() {
|
|
378
|
+
return BOSS_PAGE_GUARD_SCRIPT_TEMPLATE
|
|
379
|
+
.replace('__SHOULD_ALLOW_CONSOLE_CLEAR__', SHOULD_ALLOW_CONSOLE_CLEAR ? 'true' : 'false')
|
|
380
|
+
.replace('__SHOULD_ALLOW_VERBOSE_CONSOLE__', SHOULD_ALLOW_VERBOSE_CONSOLE ? 'true' : 'false');
|
|
381
|
+
}
|
|
382
|
+
const browsersWithTargetGuard = new WeakSet();
|
|
383
|
+
const pagesWithInitGuard = new WeakSet();
|
|
384
|
+
const pagesWithNavigationGuard = new WeakSet();
|
|
385
|
+
const pagesWithRequestGuard = new WeakSet();
|
|
386
|
+
/**
|
|
387
|
+
* 风控页反弹熔断:Boss 判定风控后会反复把主 frame 推向 verify / 403 页,
|
|
388
|
+
* 而拦截 + 跳回沟通页会把「一次风控」放大成「无限刷新」。
|
|
389
|
+
* 窗口期内反弹超过阈值即熔断:停止反弹、放行验证页、由命令层报错停下来。
|
|
390
|
+
*/
|
|
391
|
+
const RISK_BOUNCE_WINDOW_MS = 60_000;
|
|
392
|
+
const RISK_BOUNCE_LIMIT = 3;
|
|
393
|
+
/** 同一 URL 在窗口期内反复 commit(Boss 自身 reload 循环,常见于安全脚本被拦后 SPA 自救)。 */
|
|
394
|
+
const RELOAD_LOOP_WINDOW_MS = 15_000;
|
|
395
|
+
const RELOAD_LOOP_LIMIT = 5;
|
|
396
|
+
const riskStateByPage = new WeakMap();
|
|
397
|
+
const cdpSessionByPage = new WeakMap();
|
|
398
|
+
/** 当前页是否已熔断(风控页反弹 / 刷新循环);命令层据此明确报错而不是继续空转。 */
|
|
399
|
+
export function getBossPageRiskState(page) {
|
|
400
|
+
return riskStateByPage.get(page) ?? null;
|
|
401
|
+
}
|
|
402
|
+
/** 用户手动处理完验证后,可清掉熔断状态继续跑。 */
|
|
403
|
+
export function clearBossPageRiskState(page) {
|
|
404
|
+
riskStateByPage.delete(page);
|
|
405
|
+
}
|
|
406
|
+
/** 熔断后放开风险页拦截,让 verify / security-check 正常渲染,用户才能手动过验证。 */
|
|
407
|
+
async function relaxRiskNavigationBlocking(page) {
|
|
408
|
+
const cdp = cdpSessionByPage.get(page);
|
|
409
|
+
if (!cdp)
|
|
410
|
+
return;
|
|
411
|
+
await cdp
|
|
412
|
+
.send('Fetch.enable', {
|
|
413
|
+
patterns: [...BLOCKED_SECURITY_SCRIPT_PATTERNS, ...REPORT_REQUEST_PATTERNS],
|
|
414
|
+
})
|
|
415
|
+
.catch(() => {
|
|
416
|
+
/* 页面/会话已销毁时忽略:熔断状态本身已足够让命令层停下 */
|
|
417
|
+
});
|
|
418
|
+
}
|
|
419
|
+
function tripPageRisk(page, state) {
|
|
420
|
+
if (riskStateByPage.has(page))
|
|
421
|
+
return;
|
|
422
|
+
riskStateByPage.set(page, state);
|
|
423
|
+
console.error(`[boss-cli] ${state.message}`);
|
|
424
|
+
}
|
|
425
|
+
async function ensurePageInitGuard(page) {
|
|
426
|
+
if (pagesWithInitGuard.has(page))
|
|
427
|
+
return;
|
|
428
|
+
const script = buildPageGuardScript();
|
|
429
|
+
// 走 puppeteer 的 evaluateOnNewDocument:内部会把脚本同步注册到主 frame CDP session,
|
|
430
|
+
// 并在 OOPIF/iframe target 通过 `onAttachedToTarget` attach 时再次 addScript,
|
|
431
|
+
// 因此可以覆盖隐藏 iframe 反检测对照场景。
|
|
432
|
+
await page.evaluateOnNewDocument(script);
|
|
433
|
+
// 当前文档已在加载中或已加载完成时,evaluateOnNewDocument 不会回溯执行;
|
|
434
|
+
// 这里对当前主 frame 直接注入一次,让幂等的 try/catch 守卫立即生效。
|
|
435
|
+
await page.evaluate(script).catch(() => {
|
|
436
|
+
/* 当前文档可能还没创建执行上下文,由后续 navigation 触发 evaluateOnNewDocument 即可 */
|
|
437
|
+
});
|
|
438
|
+
pagesWithInitGuard.add(page);
|
|
439
|
+
}
|
|
440
|
+
function ensurePageNavigationGuard(page) {
|
|
441
|
+
if (pagesWithNavigationGuard.has(page))
|
|
442
|
+
return;
|
|
443
|
+
const bounceAt = [];
|
|
444
|
+
const commitAt = new Map();
|
|
445
|
+
const withinWindow = (stamps, now, windowMs) => {
|
|
446
|
+
const kept = stamps.filter((t) => now - t <= windowMs);
|
|
447
|
+
stamps.length = 0;
|
|
448
|
+
stamps.push(...kept);
|
|
449
|
+
return stamps;
|
|
450
|
+
};
|
|
451
|
+
page.on('framenavigated', (frame) => {
|
|
452
|
+
if (frame !== page.mainFrame())
|
|
453
|
+
return;
|
|
454
|
+
const url = frame.url();
|
|
455
|
+
const now = Date.now();
|
|
456
|
+
if (!isRiskNavigationUrl(url)) {
|
|
457
|
+
// 非风险页也可能陷入循环:安全脚本被拦后 Boss SPA 会自己反复 reload。
|
|
458
|
+
const stamps = commitAt.get(url) ?? [];
|
|
459
|
+
stamps.push(now);
|
|
460
|
+
commitAt.set(url, withinWindow(stamps, now, RELOAD_LOOP_WINDOW_MS));
|
|
461
|
+
if (stamps.length >= RELOAD_LOOP_LIMIT) {
|
|
462
|
+
tripPageRisk(page, {
|
|
463
|
+
kind: 'reload_loop',
|
|
464
|
+
url,
|
|
465
|
+
message: `页面在 ${RELOAD_LOOP_WINDOW_MS / 1000}s 内重复加载 ${stamps.length} 次(${url}),疑似 Boss 侧风控或安全脚本被拦导致自刷新。已停止自动干预,请在浏览器中确认页面状态。`,
|
|
466
|
+
});
|
|
467
|
+
}
|
|
468
|
+
return;
|
|
469
|
+
}
|
|
470
|
+
if (riskStateByPage.has(page) || SHOULD_ALLOW_RISK_NAV)
|
|
471
|
+
return;
|
|
472
|
+
bounceAt.push(now);
|
|
473
|
+
withinWindow(bounceAt, now, RISK_BOUNCE_WINDOW_MS);
|
|
474
|
+
if (bounceAt.length > RISK_BOUNCE_LIMIT) {
|
|
475
|
+
tripPageRisk(page, {
|
|
476
|
+
kind: 'risk_navigation',
|
|
477
|
+
url,
|
|
478
|
+
message: `检测到 Boss 反复跳转风控/验证页(${url}),${RISK_BOUNCE_WINDOW_MS / 1000}s 内已 ${bounceAt.length} 次。已停止跳回沟通页并放行该页面:请在浏览器中完成验证/登录后重试;继续自动操作可能触发封号。`,
|
|
479
|
+
});
|
|
480
|
+
void relaxRiskNavigationBlocking(page)
|
|
481
|
+
.then(() => page.goto(url, { waitUntil: 'load', timeout: 60_000 }))
|
|
482
|
+
.catch(() => {
|
|
483
|
+
/* 验证页本身加载失败不再重试,熔断状态已让命令层停下 */
|
|
484
|
+
});
|
|
485
|
+
return;
|
|
486
|
+
}
|
|
487
|
+
void page.goto(BOSS_CHAT_INDEX_URL, { waitUntil: 'load', timeout: 60_000 }).catch(() => {
|
|
488
|
+
console.error(`[boss-cli] 风险页导航恢复失败:${url}`);
|
|
489
|
+
});
|
|
490
|
+
});
|
|
491
|
+
pagesWithNavigationGuard.add(page);
|
|
492
|
+
}
|
|
493
|
+
async function ensurePageRequestGuard(page) {
|
|
494
|
+
if (pagesWithRequestGuard.has(page))
|
|
495
|
+
return;
|
|
496
|
+
const cdp = await page.createCDPSession();
|
|
497
|
+
cdpSessionByPage.set(page, cdp);
|
|
498
|
+
await cdp.send('Network.setCacheDisabled', { cacheDisabled: true });
|
|
499
|
+
await cdp.send('Fetch.enable', {
|
|
500
|
+
patterns: [
|
|
501
|
+
...BLOCKED_SECURITY_SCRIPT_PATTERNS,
|
|
502
|
+
...REPORT_REQUEST_PATTERNS,
|
|
503
|
+
...(SHOULD_ALLOW_RISK_NAV ? [] : RISK_NAVIGATION_PATTERNS),
|
|
504
|
+
],
|
|
505
|
+
});
|
|
506
|
+
cdp.on('Fetch.requestPaused', (params) => {
|
|
507
|
+
const url = params.request.url;
|
|
508
|
+
const method = params.request.method;
|
|
509
|
+
const kind = classifyPausedRequest(url);
|
|
510
|
+
const label = PAUSED_LABEL[kind];
|
|
511
|
+
// 命中即记录到 **页面 DevTools Console**(不污染终端输出)。
|
|
512
|
+
if (kind === 'report') {
|
|
513
|
+
const body = previewPostData(params.request.postData);
|
|
514
|
+
logToPageConsole(cdp, body
|
|
515
|
+
? `[boss-cli][${label}] ${method} ${url} body=${body}`
|
|
516
|
+
: `[boss-cli][${label}] ${method} ${url}`);
|
|
517
|
+
void cdp
|
|
518
|
+
.send('Fetch.fulfillRequest', {
|
|
519
|
+
requestId: params.requestId,
|
|
520
|
+
responseCode: 204,
|
|
521
|
+
responsePhrase: 'No Content',
|
|
522
|
+
responseHeaders: buildNoContentResponseHeaders(params.request.headers),
|
|
523
|
+
})
|
|
524
|
+
.catch(() => {
|
|
525
|
+
// CDP send 本身失败属于真实 ops 异常,仍然报到 Node stderr,方便外层定位。
|
|
526
|
+
console.error(`[boss-cli] 日志上报请求拦截响应失败:${url}`);
|
|
527
|
+
});
|
|
528
|
+
return;
|
|
529
|
+
}
|
|
530
|
+
logToPageConsole(cdp, `[boss-cli][${label}] ${method} ${url}`);
|
|
531
|
+
void cdp
|
|
532
|
+
.send('Fetch.failRequest', {
|
|
533
|
+
requestId: params.requestId,
|
|
534
|
+
errorReason: 'BlockedByClient',
|
|
535
|
+
})
|
|
536
|
+
.catch(() => {
|
|
537
|
+
console.error(`[boss-cli] 风险请求阻断失败:${url}`);
|
|
538
|
+
});
|
|
539
|
+
});
|
|
540
|
+
pagesWithRequestGuard.add(page);
|
|
541
|
+
}
|
|
542
|
+
/**
|
|
543
|
+
* 上一条命令(另一个进程)已经把页面留在验证/风控页时,直接熔断:
|
|
544
|
+
* 这种状态下再跳回沟通页只会重复被弹走,不如立刻让调用方报错。
|
|
545
|
+
* `about:blank` 属于新标签的正常初始态,不计入。
|
|
546
|
+
*/
|
|
547
|
+
function tripIfAlreadyOnRiskPage(page) {
|
|
548
|
+
if (SHOULD_ALLOW_RISK_NAV)
|
|
549
|
+
return;
|
|
550
|
+
let url = '';
|
|
551
|
+
try {
|
|
552
|
+
url = page.url();
|
|
553
|
+
}
|
|
554
|
+
catch {
|
|
555
|
+
return;
|
|
556
|
+
}
|
|
557
|
+
if (!url || url === 'about:blank' || !isRiskNavigationUrl(url))
|
|
558
|
+
return;
|
|
559
|
+
tripPageRisk(page, {
|
|
560
|
+
kind: 'risk_navigation',
|
|
561
|
+
url,
|
|
562
|
+
message: `当前页面停留在 Boss 验证/风控页(${url})。已停止自动操作:请在浏览器中完成验证或重新登录后重试。`,
|
|
563
|
+
});
|
|
564
|
+
}
|
|
565
|
+
export async function installBossPageGuards(page) {
|
|
566
|
+
if (page.isClosed())
|
|
567
|
+
return;
|
|
568
|
+
await ensurePageInitGuard(page);
|
|
569
|
+
ensurePageNavigationGuard(page);
|
|
570
|
+
await ensurePageRequestGuard(page);
|
|
571
|
+
tripIfAlreadyOnRiskPage(page);
|
|
572
|
+
}
|
|
573
|
+
async function installTargetPageGuards(target) {
|
|
574
|
+
if (target.type() !== 'page')
|
|
575
|
+
return;
|
|
576
|
+
const page = await target.page();
|
|
577
|
+
if (!page || page.isClosed())
|
|
578
|
+
return;
|
|
579
|
+
await installBossPageGuards(page);
|
|
580
|
+
}
|
|
581
|
+
export async function installBossBrowserPageGuards(browser) {
|
|
582
|
+
if (!browsersWithTargetGuard.has(browser)) {
|
|
583
|
+
browser.on('targetcreated', (target) => {
|
|
584
|
+
void installTargetPageGuards(target).catch((e) => {
|
|
585
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
586
|
+
console.error(`[boss-cli] 新页面防护安装失败:${msg}`);
|
|
587
|
+
});
|
|
588
|
+
});
|
|
589
|
+
browsersWithTargetGuard.add(browser);
|
|
590
|
+
}
|
|
591
|
+
const pages = (await browser.pages()).filter((p) => !p.isClosed());
|
|
592
|
+
for (const page of pages) {
|
|
593
|
+
await installBossPageGuards(page);
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
//# sourceMappingURL=boss_page_guards.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boss_page_guards.js","sourceRoot":"","sources":["../../src/common/boss_page_guards.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Page } from 'puppeteer-core';
|
|
2
|
+
/**
|
|
3
|
+
* 轮询直到出现 c-resume iframe、或出现付费墙、或超时。
|
|
4
|
+
* c-resume 可能在主文档,也可能在 `recommendFrame` 等子 frame 内(推荐预览),故遍历 {@link Page.frames}。
|
|
5
|
+
*/
|
|
6
|
+
export declare function waitForCResumeIframeOrPaywall(page: Page, timeoutMs?: number): Promise<'iframe' | 'paywall' | 'neither'>;
|
|
7
|
+
/**
|
|
8
|
+
* 单次探测:主文档是否当前正显示付费弹层(与 {@link describeBossPaywallPopupIfPresent} 判定一致)。
|
|
9
|
+
* 供合并轮询(同一循环内同时检测多类弹层)使用,避免重复编写检测脚本。
|
|
10
|
+
*/
|
|
11
|
+
export declare function detectBossPaywallPopup(page: Page): Promise<boolean>;
|
|
12
|
+
/**
|
|
13
|
+
* 打招呼等操作后,轮询主文档是否出现付费弹层(与 {@link describeBossPaywallPopupIfPresent} 判定一致)。
|
|
14
|
+
* 命中则返回 true;超时未出现则返回 false。
|
|
15
|
+
*/
|
|
16
|
+
export declare function waitForBossPaywallPopup(page: Page, timeoutMs?: number): Promise<boolean>;
|
|
17
|
+
/**
|
|
18
|
+
* 若当前存在 VIP/付费类弹层(判定规则与 {@link describeBossPaywallPopupIfPresent} 一致),
|
|
19
|
+
* 则点击关闭按钮以恢复页面可操作状态。返回是否执行了关闭。
|
|
20
|
+
*/
|
|
21
|
+
export declare function closeBossPaywallPopupIfPresent(page: Page): Promise<boolean>;
|
|
22
|
+
/**
|
|
23
|
+
* 检测 Boss 页面上是否出现 VIP/付费购买类弹层(如点击「在线简历」、推荐预览或打招呼后拦截权益时)。
|
|
24
|
+
* 命中则返回简短中文说明,供与「未出现 c-resume iframe」类错误拼接。
|
|
25
|
+
* @param purpose `greet` 时将「查看在线简历」类措辞改为适合打招呼的说明。
|
|
26
|
+
*/
|
|
27
|
+
export declare function describeBossPaywallPopupIfPresent(page: Page, purpose?: 'resume' | 'greet'): Promise<string | null>;
|
|
28
|
+
//# sourceMappingURL=boss_paywall_popup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boss_paywall_popup.d.ts","sourceRoot":"","sources":["../../src/common/boss_paywall_popup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAgC3C;;;GAGG;AACH,wBAAsB,6BAA6B,CACjD,IAAI,EAAE,IAAI,EACV,SAAS,GAAE,MAAyC,GACnD,OAAO,CAAC,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC,CAkB3C;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAEzE;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,IAAI,EACV,SAAS,GAAE,MAAkC,GAC5C,OAAO,CAAC,OAAO,CAAC,CASlB;AAED;;;GAGG;AACH,wBAAsB,8BAA8B,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAoCjF;AAED;;;;GAIG;AACH,wBAAsB,iCAAiC,CACrD,IAAI,EAAE,IAAI,EACV,OAAO,GAAE,QAAQ,GAAG,OAAkB,GACrC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAuCxB"}
|