@joohw/boss-cli 0.2.1 → 0.3.0

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.
Files changed (35) hide show
  1. package/dist/browser/browser_session.d.ts.map +1 -1
  2. package/dist/browser/browser_session.js +6 -0
  3. package/dist/browser/browser_session.js.map +1 -1
  4. package/dist/browser/cdp_browser.d.ts +8 -1
  5. package/dist/browser/cdp_browser.d.ts.map +1 -1
  6. package/dist/browser/cdp_browser.js +54 -66
  7. package/dist/browser/cdp_browser.js.map +1 -1
  8. package/dist/cli/cliRouter.d.ts.map +1 -1
  9. package/dist/cli/cliRouter.js +21 -2
  10. package/dist/cli/cliRouter.js.map +1 -1
  11. package/dist/common/baidu_user_env.d.ts +7 -0
  12. package/dist/common/baidu_user_env.d.ts.map +1 -0
  13. package/dist/common/baidu_user_env.js +56 -0
  14. package/dist/common/baidu_user_env.js.map +1 -0
  15. package/dist/common/boss_page_guards.d.ts +4 -0
  16. package/dist/common/boss_page_guards.d.ts.map +1 -0
  17. package/dist/common/boss_page_guards.js +499 -0
  18. package/dist/common/boss_page_guards.js.map +1 -0
  19. package/dist/common/boss_session_page.d.ts +1 -1
  20. package/dist/common/boss_session_page.d.ts.map +1 -1
  21. package/dist/common/boss_session_page.js +10 -11
  22. package/dist/common/boss_session_page.js.map +1 -1
  23. package/dist/ocr/baidu_ocr.d.ts +2 -0
  24. package/dist/ocr/baidu_ocr.d.ts.map +1 -1
  25. package/dist/ocr/baidu_ocr.js +4 -0
  26. package/dist/ocr/baidu_ocr.js.map +1 -1
  27. package/dist/toolset/baidu_credentials.d.ts +5 -0
  28. package/dist/toolset/baidu_credentials.d.ts.map +1 -0
  29. package/dist/toolset/baidu_credentials.js +24 -0
  30. package/dist/toolset/baidu_credentials.js.map +1 -0
  31. package/dist/toolset/index.d.ts +1 -0
  32. package/dist/toolset/index.d.ts.map +1 -1
  33. package/dist/toolset/index.js +1 -0
  34. package/dist/toolset/index.js.map +1 -1
  35. package/package.json +1 -1
@@ -0,0 +1,499 @@
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
+ * `about:blank` 是浏览器内置 URL,不会进入 CDP 网络拦截,因此不放在 Fetch.enable 模式里;
28
+ * 该路径只能靠页面内 Location 守卫与 framenavigated 兜底处理。
29
+ */
30
+ const RISK_NAVIGATION_PATTERNS = [
31
+ { urlPattern: '*/web/common/403.html*', requestStage: 'Request' },
32
+ { urlPattern: '*/web/common/nonsupport.html*', requestStage: 'Request' },
33
+ { urlPattern: '*/web/user/safe/verify*', requestStage: 'Request' },
34
+ { urlPattern: '*/web/passport/zp/403.html*', requestStage: 'Request' },
35
+ { urlPattern: '*/web/passport/zp/verify.html*', requestStage: 'Request' },
36
+ { urlPattern: '*/web/passport/zp/security.html*', requestStage: 'Request' },
37
+ { urlPattern: '*/web/passport/cm/403.html*', requestStage: 'Request' },
38
+ { urlPattern: '*/web/passport/cm/verify.html*', requestStage: 'Request' },
39
+ { urlPattern: '*/web/passport/cm/security-check.html*', requestStage: 'Request' },
40
+ ];
41
+ 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;
42
+ 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;
43
+ const PAUSED_LABEL = {
44
+ report: 'report:204',
45
+ security_script: 'block:script',
46
+ risk_navigation: 'block:nav',
47
+ };
48
+ const POST_DATA_PREVIEW_LIMIT = 200;
49
+ function isReportRequestUrl(url) {
50
+ return REPORT_REQUEST_RE.test(url);
51
+ }
52
+ function isRiskNavigationUrl(url) {
53
+ return RISK_NAVIGATION_RE.test(url);
54
+ }
55
+ function classifyPausedRequest(url) {
56
+ if (REPORT_REQUEST_RE.test(url))
57
+ return 'report';
58
+ if (RISK_NAVIGATION_RE.test(url))
59
+ return 'risk_navigation';
60
+ // 落到这里的都是命中 BLOCKED_SECURITY_SCRIPT_PATTERNS 的请求;不再做 fallback 判定,
61
+ // 一旦后续新增 patterns 但忘记同步分类正则,调用方能立刻发现而不是被静默归错类。
62
+ return 'security_script';
63
+ }
64
+ function previewPostData(raw) {
65
+ if (!raw)
66
+ return '';
67
+ const compact = raw.replace(/\s+/g, ' ').trim();
68
+ if (!compact)
69
+ return '';
70
+ return compact.length > POST_DATA_PREVIEW_LIMIT
71
+ ? `${compact.slice(0, POST_DATA_PREVIEW_LIMIT)}…`
72
+ : compact;
73
+ }
74
+ /**
75
+ * 把一行诊断信息打到 **页面 DevTools Console**(不进 Node stderr / stdout)。
76
+ *
77
+ * 走 CDP `Runtime.evaluate` 直接在页面默认执行上下文调 `console.info`:
78
+ * - 终端输出完全保持干净,对非交互命令(list / recommend / chat 管道)无副作用。
79
+ * - 只有用户主动打开 DevTools Console 才能看到,匹配 "排查时才需要" 的语义。
80
+ * - 极早期请求(Runtime 上下文尚未创建)会失败,silently 忽略——拦截动作本身不依赖此日志。
81
+ *
82
+ * 注意:本函数会经过页面里 §5 的 `console.info` 包装(字符串参数原样通过),
83
+ * 不会触发 V8 inspector 的对象序列化慢路径,对 DevTools 时间差检测无影响。
84
+ */
85
+ function logToPageConsole(cdp, message) {
86
+ void cdp
87
+ .send('Runtime.evaluate', {
88
+ expression: `console.info(${JSON.stringify(message)})`,
89
+ awaitPromise: false,
90
+ returnByValue: true,
91
+ })
92
+ .catch(() => {
93
+ /* 页面无可用执行上下文(极早期 / 卸载中)时丢弃此条日志即可 */
94
+ });
95
+ }
96
+ function readRequestHeader(headers, name) {
97
+ const lowerName = name.toLowerCase();
98
+ const entry = Object.entries(headers).find(([key]) => key.toLowerCase() === lowerName);
99
+ return entry?.[1];
100
+ }
101
+ function buildNoContentResponseHeaders(headers) {
102
+ const origin = readRequestHeader(headers, 'origin') ?? 'https://www.zhipin.com';
103
+ const requestedHeaders = readRequestHeader(headers, 'access-control-request-headers') ??
104
+ 'content-type,x-requested-with,traceid,zp_token,__zp_stoken__';
105
+ return [
106
+ { name: 'access-control-allow-origin', value: origin },
107
+ { name: 'access-control-allow-credentials', value: 'true' },
108
+ { name: 'access-control-allow-methods', value: 'GET,POST,PUT,PATCH,DELETE,OPTIONS' },
109
+ { name: 'access-control-allow-headers', value: requestedHeaders },
110
+ { name: 'cache-control', value: 'no-store' },
111
+ ];
112
+ }
113
+ /**
114
+ * 守卫脚本设计要点:
115
+ * - 不在 `window` 上挂任何 Symbol/字符串自描述属性,避免成为指纹。
116
+ * - 替换的方法保留 `name`,并通过包装后的 `Function.prototype.toString` 让 `fn.toString()` 返回原生形态。
117
+ * - 改写的 accessor / 方法尽量落在 prototype 上,descriptor 形态对齐原生(`configurable: true`)。
118
+ * - 对 `Location.prototype.href` 的 setter 也加拦截,覆盖 `location.href = ...` 直接赋值场景。
119
+ * - 不再伪造 `navigator.plugins` 与 `window.chrome.*`:现代 Chrome 默认值已经合理,伪造反而会被
120
+ * `instanceof PluginArray`、对象形态比对等检测一眼分辨。
121
+ * - 不再覆盖 `window.closed`:`close()` 已经被改写为 noop,`closed` 自然保持原生默认值。
122
+ */
123
+ const BOSS_PAGE_GUARD_SCRIPT_TEMPLATE = `(function() {
124
+ 'use strict';
125
+
126
+ var _Object = Object;
127
+ var _defineProperty = _Object.defineProperty;
128
+ var _getOwnPropertyDescriptor = _Object.getOwnPropertyDescriptor;
129
+ var _Function = Function;
130
+ var _origFunctionToString = _Function.prototype.toString;
131
+ var _String = String;
132
+ var _Map = Map;
133
+
134
+ /** 让我们包装的函数对 fn.toString() 返回 "function NAME() { [native code] }"。 */
135
+ var nativeSourceMap = new _Map();
136
+ var fakeToString = function toString() {
137
+ if (this != null) {
138
+ var mapped = nativeSourceMap.get(this);
139
+ if (typeof mapped === 'string') return mapped;
140
+ }
141
+ return _origFunctionToString.call(this);
142
+ };
143
+ nativeSourceMap.set(fakeToString, 'function toString() { [native code] }');
144
+ try {
145
+ _defineProperty(_Function.prototype, 'toString', {
146
+ value: fakeToString,
147
+ writable: true,
148
+ configurable: true,
149
+ enumerable: false,
150
+ });
151
+ } catch (e) {}
152
+
153
+ /** 包装替身函数:把它伪装成 "function NAME() { [native code] }"。 */
154
+ var asNative = function(replacement, nativeName) {
155
+ var src = 'function ' + nativeName + '() { [native code] }';
156
+ nativeSourceMap.set(replacement, src);
157
+ try {
158
+ _defineProperty(replacement, 'name', {
159
+ value: nativeName,
160
+ writable: false,
161
+ configurable: true,
162
+ enumerable: false,
163
+ });
164
+ } catch (e) {}
165
+ return replacement;
166
+ };
167
+
168
+ /** 替换 prototype 上的方法(保持原 descriptor 形态:默认 configurable+writable)。 */
169
+ var replaceProtoMethod = function(proto, key, replacement) {
170
+ try {
171
+ var desc = _getOwnPropertyDescriptor(proto, key);
172
+ if (!desc) return null;
173
+ if (!desc.configurable) return null;
174
+ _defineProperty(proto, key, {
175
+ value: replacement,
176
+ writable: 'writable' in desc ? !!desc.writable : true,
177
+ configurable: true,
178
+ enumerable: !!desc.enumerable,
179
+ });
180
+ return desc.value;
181
+ } catch (e) {
182
+ return null;
183
+ }
184
+ };
185
+
186
+ /** 改写 prototype 上的 accessor:仅替换 getter/setter,保留 configurable/enumerable 形态。 */
187
+ var replaceProtoAccessor = function(proto, key, options) {
188
+ try {
189
+ var desc = _getOwnPropertyDescriptor(proto, key);
190
+ if (!desc || !desc.configurable) return null;
191
+ var nextDesc = {
192
+ configurable: true,
193
+ enumerable: !!desc.enumerable,
194
+ };
195
+ if (options.get || desc.get) nextDesc.get = options.get || desc.get;
196
+ if (options.set || desc.set) nextDesc.set = options.set || desc.set;
197
+ _defineProperty(proto, key, nextDesc);
198
+ return desc;
199
+ } catch (e) {
200
+ return null;
201
+ }
202
+ };
203
+
204
+ // ===== navigator.webdriver:在 Navigator.prototype 上覆盖 getter,保持 accessor 形态 =====
205
+ try {
206
+ var navProto = Object.getPrototypeOf(navigator);
207
+ if (navProto) {
208
+ replaceProtoAccessor(navProto, 'webdriver', {
209
+ get: asNative(function() { return false; }, 'get webdriver'),
210
+ });
211
+ }
212
+ } catch (e) {}
213
+
214
+ // ===== navigator.languages:仅在为空时回填,使用 prototype getter =====
215
+ try {
216
+ if (!navigator.languages || navigator.languages.length === 0) {
217
+ var navProto2 = Object.getPrototypeOf(navigator);
218
+ if (navProto2) {
219
+ var langs = ['zh-CN', 'zh', 'en'];
220
+ replaceProtoAccessor(navProto2, 'languages', {
221
+ get: asNative(function() { return langs; }, 'get languages'),
222
+ });
223
+ }
224
+ }
225
+ } catch (e) {}
226
+
227
+ // ===== window.close:改为空函数(保留 native 形态)=====
228
+ try {
229
+ var winProto = Object.getPrototypeOf(window);
230
+ if (winProto) {
231
+ replaceProtoMethod(winProto, 'close', asNative(function close() {}, 'close'));
232
+ }
233
+ } catch (e) {}
234
+
235
+ // ===== history.back / forward / go =====
236
+ try {
237
+ var historyProto = Object.getPrototypeOf(history);
238
+ if (historyProto) {
239
+ var origGo = historyProto.go;
240
+ replaceProtoMethod(historyProto, 'back', asNative(function back() {}, 'back'));
241
+ replaceProtoMethod(historyProto, 'forward', asNative(function forward() {}, 'forward'));
242
+ replaceProtoMethod(historyProto, 'go', asNative(function go(n) {
243
+ if (typeof n === 'number' && n < 0) return undefined;
244
+ return origGo.call(this, n);
245
+ }, 'go'));
246
+ }
247
+ } catch (e) {}
248
+
249
+ // ===== Location.assign / replace / href setter =====
250
+ 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;
251
+ var isBlockedTarget = function(value) {
252
+ var s = _String(value);
253
+ if (s === 'about:blank') return true;
254
+ return BLOCK_PATH.test(s);
255
+ };
256
+ try {
257
+ var locProto = Location.prototype;
258
+ var origAssign = locProto.assign;
259
+ var origReplace = locProto.replace;
260
+ replaceProtoMethod(locProto, 'assign', asNative(function assign(url) {
261
+ if (isBlockedTarget(url)) return undefined;
262
+ return origAssign.call(this, url);
263
+ }, 'assign'));
264
+ replaceProtoMethod(locProto, 'replace', asNative(function replace(url) {
265
+ if (isBlockedTarget(url)) return undefined;
266
+ return origReplace.call(this, url);
267
+ }, 'replace'));
268
+
269
+ var hrefDesc = _getOwnPropertyDescriptor(locProto, 'href');
270
+ if (hrefDesc && hrefDesc.configurable && hrefDesc.set) {
271
+ var origHrefSet = hrefDesc.set;
272
+ _defineProperty(locProto, 'href', {
273
+ get: hrefDesc.get,
274
+ set: asNative(function(value) {
275
+ if (isBlockedTarget(value)) return undefined;
276
+ return origHrefSet.call(this, value);
277
+ }, 'set href'),
278
+ configurable: true,
279
+ enumerable: !!hrefDesc.enumerable,
280
+ });
281
+ }
282
+ } catch (e) {}
283
+
284
+ // ===== beforeunload / unload:阻止破坏性卸载 =====
285
+ try {
286
+ var stopUnload = function(e) {
287
+ if (!e) return;
288
+ try { e.preventDefault(); } catch (_) {}
289
+ try { e.returnValue = ''; } catch (_) {}
290
+ };
291
+ window.addEventListener('beforeunload', stopUnload);
292
+ window.addEventListener('unload', stopUnload, true);
293
+ } catch (e) {}
294
+
295
+ // ===== console.clear:可选替身,原生形态空函数 =====
296
+ if (!__SHOULD_ALLOW_CONSOLE_CLEAR__) {
297
+ try {
298
+ var consoleProtoForClear = Object.getPrototypeOf(console);
299
+ var ownClearDesc = Object.getOwnPropertyDescriptor(console, 'clear');
300
+ var protoClearDesc = consoleProtoForClear
301
+ ? _getOwnPropertyDescriptor(consoleProtoForClear, 'clear')
302
+ : null;
303
+ var clearSrcDesc = ownClearDesc || protoClearDesc;
304
+ if (clearSrcDesc && typeof clearSrcDesc.value === 'function') {
305
+ try {
306
+ _defineProperty(console, 'clear', {
307
+ value: asNative(function clear() {}, 'clear'),
308
+ writable: 'writable' in clearSrcDesc ? clearSrcDesc.writable !== false : true,
309
+ configurable: true,
310
+ enumerable: !!clearSrcDesc.enumerable,
311
+ });
312
+ } catch (_) {}
313
+ }
314
+ } catch (e) {}
315
+ }
316
+
317
+ // ===== console 时间差探测对抗 =====
318
+ // 主包用 \`console.log\` / \`console.table\` 重复打印大对象(典型:50 次 × 0..500 数组),
319
+ // 比较前后 \`performance.now()\`,DevTools 打开时 V8 inspector 会把对象逐一序列化送去,
320
+ // 耗时显著上升即判定 DevTools 打开。对抗手段:把所有对象参数在我们这层先归一化为
321
+ // \`[object Type]\` 这种 O(1) 字符串再交给原生方法,inspector 序列化路径只看到短字符串,
322
+ // 耗时不再随 DevTools 状态变化。代价:DevTools 控制台中对象会显示成 \`[object Type]\`,
323
+ // 失去对象树展开 UX;断点 / Watch / Sources / 调用栈不受影响。
324
+ if (!__SHOULD_ALLOW_VERBOSE_CONSOLE__) {
325
+ try {
326
+ var _objToString = Object.prototype.toString;
327
+ var sanitizeArgs = function(rawArgs) {
328
+ var len = rawArgs.length;
329
+ var out = new Array(len);
330
+ for (var i = 0; i < len; i++) {
331
+ var a = rawArgs[i];
332
+ if (a !== null && typeof a === 'object') {
333
+ try {
334
+ out[i] = _objToString.call(a);
335
+ } catch (_) {
336
+ out[i] = '[object Object]';
337
+ }
338
+ } else if (typeof a === 'function') {
339
+ // 函数也别交给 inspector,避免 toString 串走慢路径
340
+ out[i] = '[Function: ' + (a.name || 'anonymous') + ']';
341
+ } else {
342
+ out[i] = a;
343
+ }
344
+ }
345
+ return out;
346
+ };
347
+ var consoleProtoForLog = Object.getPrototypeOf(console);
348
+ var consoleMethodNames = [
349
+ 'log', 'info', 'debug', 'warn', 'error',
350
+ 'table', 'dir', 'dirxml', 'trace',
351
+ 'group', 'groupCollapsed',
352
+ ];
353
+ for (var ci = 0; ci < consoleMethodNames.length; ci++) {
354
+ (function(method) {
355
+ // Chrome 把这些方法挂在 console 实例的 own property 上;
356
+ // 部分浏览器(含历史 Firefox)会挂在 Console.prototype 上。
357
+ // 优先取 own,否则退回 prototype;patch 一律 define 到实例上,
358
+ // 这样既能覆盖 own 写法,又能在 prototype 形态下 shadow 掉原方法。
359
+ var ownDesc = Object.getOwnPropertyDescriptor(console, method);
360
+ var protoDesc = consoleProtoForLog
361
+ ? _getOwnPropertyDescriptor(consoleProtoForLog, method)
362
+ : null;
363
+ var srcDesc = ownDesc || protoDesc;
364
+ if (!srcDesc || typeof srcDesc.value !== 'function') return;
365
+ var orig = srcDesc.value;
366
+ var wrapped = asNative(function() {
367
+ return orig.apply(this, sanitizeArgs(arguments));
368
+ }, method);
369
+ try {
370
+ _defineProperty(console, method, {
371
+ value: wrapped,
372
+ writable: 'writable' in srcDesc ? srcDesc.writable !== false : true,
373
+ configurable: true,
374
+ enumerable: !!srcDesc.enumerable,
375
+ });
376
+ } catch (_) {}
377
+ })(consoleMethodNames[ci]);
378
+ }
379
+ } catch (e) {}
380
+ }
381
+ })();`;
382
+ function buildPageGuardScript() {
383
+ return BOSS_PAGE_GUARD_SCRIPT_TEMPLATE
384
+ .replace('__SHOULD_ALLOW_CONSOLE_CLEAR__', SHOULD_ALLOW_CONSOLE_CLEAR ? 'true' : 'false')
385
+ .replace('__SHOULD_ALLOW_VERBOSE_CONSOLE__', SHOULD_ALLOW_VERBOSE_CONSOLE ? 'true' : 'false');
386
+ }
387
+ const browsersWithTargetGuard = new WeakSet();
388
+ const pagesWithInitGuard = new WeakSet();
389
+ const pagesWithNavigationGuard = new WeakSet();
390
+ const pagesWithRequestGuard = new WeakSet();
391
+ async function ensurePageInitGuard(page) {
392
+ if (pagesWithInitGuard.has(page))
393
+ return;
394
+ const script = buildPageGuardScript();
395
+ // 走 puppeteer 的 evaluateOnNewDocument:内部会把脚本同步注册到主 frame CDP session,
396
+ // 并在 OOPIF/iframe target 通过 `onAttachedToTarget` attach 时再次 addScript,
397
+ // 因此可以覆盖隐藏 iframe 反检测对照场景。
398
+ await page.evaluateOnNewDocument(script);
399
+ // 当前文档已在加载中或已加载完成时,evaluateOnNewDocument 不会回溯执行;
400
+ // 这里对当前主 frame 直接注入一次,让幂等的 try/catch 守卫立即生效。
401
+ await page.evaluate(script).catch(() => {
402
+ /* 当前文档可能还没创建执行上下文,由后续 navigation 触发 evaluateOnNewDocument 即可 */
403
+ });
404
+ pagesWithInitGuard.add(page);
405
+ }
406
+ function ensurePageNavigationGuard(page) {
407
+ if (pagesWithNavigationGuard.has(page))
408
+ return;
409
+ page.on('framenavigated', (frame) => {
410
+ if (frame !== page.mainFrame())
411
+ return;
412
+ const url = frame.url();
413
+ if (!isRiskNavigationUrl(url))
414
+ return;
415
+ void page.goto(BOSS_CHAT_INDEX_URL, { waitUntil: 'load', timeout: 60_000 }).catch(() => {
416
+ console.error(`[boss-cli] 风险页导航恢复失败:${url}`);
417
+ });
418
+ });
419
+ pagesWithNavigationGuard.add(page);
420
+ }
421
+ async function ensurePageRequestGuard(page) {
422
+ if (pagesWithRequestGuard.has(page))
423
+ return;
424
+ const cdp = await page.createCDPSession();
425
+ await cdp.send('Network.setCacheDisabled', { cacheDisabled: true });
426
+ await cdp.send('Fetch.enable', {
427
+ patterns: [
428
+ ...BLOCKED_SECURITY_SCRIPT_PATTERNS,
429
+ ...REPORT_REQUEST_PATTERNS,
430
+ ...RISK_NAVIGATION_PATTERNS,
431
+ ],
432
+ });
433
+ cdp.on('Fetch.requestPaused', (params) => {
434
+ const url = params.request.url;
435
+ const method = params.request.method;
436
+ const kind = classifyPausedRequest(url);
437
+ const label = PAUSED_LABEL[kind];
438
+ // 命中即记录到 **页面 DevTools Console**(不污染终端输出)。
439
+ if (kind === 'report') {
440
+ const body = previewPostData(params.request.postData);
441
+ logToPageConsole(cdp, body
442
+ ? `[boss-cli][${label}] ${method} ${url} body=${body}`
443
+ : `[boss-cli][${label}] ${method} ${url}`);
444
+ void cdp
445
+ .send('Fetch.fulfillRequest', {
446
+ requestId: params.requestId,
447
+ responseCode: 204,
448
+ responsePhrase: 'No Content',
449
+ responseHeaders: buildNoContentResponseHeaders(params.request.headers),
450
+ })
451
+ .catch(() => {
452
+ // CDP send 本身失败属于真实 ops 异常,仍然报到 Node stderr,方便外层定位。
453
+ console.error(`[boss-cli] 日志上报请求拦截响应失败:${url}`);
454
+ });
455
+ return;
456
+ }
457
+ logToPageConsole(cdp, `[boss-cli][${label}] ${method} ${url}`);
458
+ void cdp
459
+ .send('Fetch.failRequest', {
460
+ requestId: params.requestId,
461
+ errorReason: 'BlockedByClient',
462
+ })
463
+ .catch(() => {
464
+ console.error(`[boss-cli] 风险请求阻断失败:${url}`);
465
+ });
466
+ });
467
+ pagesWithRequestGuard.add(page);
468
+ }
469
+ export async function installBossPageGuards(page) {
470
+ if (page.isClosed())
471
+ return;
472
+ await ensurePageInitGuard(page);
473
+ ensurePageNavigationGuard(page);
474
+ await ensurePageRequestGuard(page);
475
+ }
476
+ async function installTargetPageGuards(target) {
477
+ if (target.type() !== 'page')
478
+ return;
479
+ const page = await target.page();
480
+ if (!page || page.isClosed())
481
+ return;
482
+ await installBossPageGuards(page);
483
+ }
484
+ export async function installBossBrowserPageGuards(browser) {
485
+ if (!browsersWithTargetGuard.has(browser)) {
486
+ browser.on('targetcreated', (target) => {
487
+ void installTargetPageGuards(target).catch((e) => {
488
+ const msg = e instanceof Error ? e.message : String(e);
489
+ console.error(`[boss-cli] 新页面防护安装失败:${msg}`);
490
+ });
491
+ });
492
+ browsersWithTargetGuard.add(browser);
493
+ }
494
+ const pages = (await browser.pages()).filter((p) => !p.isClosed());
495
+ for (const page of pages) {
496
+ await installBossPageGuards(page);
497
+ }
498
+ }
499
+ //# 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":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAEhD,MAAM,0BAA0B,GAC9B,OAAO,CAAC,GAAG,CAAC,gCAAgC,KAAK,MAAM;IACvD,OAAO,CAAC,GAAG,CAAC,gCAAgC,KAAK,GAAG,CAAC;AAEvD;;;;;;GAMG;AACH,MAAM,4BAA4B,GAChC,OAAO,CAAC,GAAG,CAAC,kCAAkC,KAAK,MAAM;IACzD,OAAO,CAAC,GAAG,CAAC,kCAAkC,KAAK,GAAG,CAAC;AAEzD,MAAM,gCAAgC,GAAG;IACvC,EAAE,UAAU,EAAE,6BAA6B,EAAE,YAAY,EAAE,SAAS,EAAE;IACtE,EAAE,UAAU,EAAE,8BAA8B,EAAE,YAAY,EAAE,SAAS,EAAE;IACvE,EAAE,UAAU,EAAE,0CAA0C,EAAE,YAAY,EAAE,SAAS,EAAE;CAC3E,CAAC;AAEX,MAAM,uBAAuB,GAAG;IAC9B,EAAE,UAAU,EAAE,kCAAkC,EAAE,YAAY,EAAE,SAAS,EAAE;IAC3E,EAAE,UAAU,EAAE,yCAAyC,EAAE,YAAY,EAAE,SAAS,EAAE;IAClF,EAAE,UAAU,EAAE,iCAAiC,EAAE,YAAY,EAAE,SAAS,EAAE;IAC1E,EAAE,UAAU,EAAE,uCAAuC,EAAE,YAAY,EAAE,SAAS,EAAE;IAChF,EAAE,UAAU,EAAE,oCAAoC,EAAE,YAAY,EAAE,SAAS,EAAE;IAC7E,EAAE,UAAU,EAAE,wCAAwC,EAAE,YAAY,EAAE,SAAS,EAAE;CACzE,CAAC;AAEX;;;GAGG;AACH,MAAM,wBAAwB,GAAG;IAC/B,EAAE,UAAU,EAAE,wBAAwB,EAAE,YAAY,EAAE,SAAS,EAAE;IACjE,EAAE,UAAU,EAAE,+BAA+B,EAAE,YAAY,EAAE,SAAS,EAAE;IACxE,EAAE,UAAU,EAAE,yBAAyB,EAAE,YAAY,EAAE,SAAS,EAAE;IAClE,EAAE,UAAU,EAAE,6BAA6B,EAAE,YAAY,EAAE,SAAS,EAAE;IACtE,EAAE,UAAU,EAAE,gCAAgC,EAAE,YAAY,EAAE,SAAS,EAAE;IACzE,EAAE,UAAU,EAAE,kCAAkC,EAAE,YAAY,EAAE,SAAS,EAAE;IAC3E,EAAE,UAAU,EAAE,6BAA6B,EAAE,YAAY,EAAE,SAAS,EAAE;IACtE,EAAE,UAAU,EAAE,gCAAgC,EAAE,YAAY,EAAE,SAAS,EAAE;IACzE,EAAE,UAAU,EAAE,wCAAwC,EAAE,YAAY,EAAE,SAAS,EAAE;CACzE,CAAC;AAEX,MAAM,iBAAiB,GACrB,0MAA0M,CAAC;AAE7M,MAAM,kBAAkB,GACtB,+KAA+K,CAAC;AAMlL,MAAM,YAAY,GAA+B;IAC/C,MAAM,EAAE,YAAY;IACpB,eAAe,EAAE,cAAc;IAC/B,eAAe,EAAE,WAAW;CAC7B,CAAC;AAEF,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAEpC,SAAS,kBAAkB,CAAC,GAAW;IACrC,OAAO,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAW;IACtC,OAAO,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,qBAAqB,CAAC,GAAW;IACxC,IAAI,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,QAAQ,CAAC;IACjD,IAAI,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,iBAAiB,CAAC;IAC3D,kEAAkE;IAClE,+CAA+C;IAC/C,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED,SAAS,eAAe,CAAC,GAAuB;IAC9C,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAChD,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IACxB,OAAO,OAAO,CAAC,MAAM,GAAG,uBAAuB;QAC7C,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,uBAAuB,CAAC,GAAG;QACjD,CAAC,CAAC,OAAO,CAAC;AACd,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,gBAAgB,CAAC,GAAe,EAAE,OAAe;IACxD,KAAK,GAAG;SACL,IAAI,CAAC,kBAAkB,EAAE;QACxB,UAAU,EAAE,gBAAgB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG;QACtD,YAAY,EAAE,KAAK;QACnB,aAAa,EAAE,IAAI;KACpB,CAAC;SACD,KAAK,CAAC,GAAG,EAAE;QACV,oCAAoC;IACtC,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAuB,EAAE,IAAY;IAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,SAAS,CAAC,CAAC;IACvF,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC;AAED,SAAS,6BAA6B,CAAC,OAAuB;IAC5D,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,wBAAwB,CAAC;IAChF,MAAM,gBAAgB,GACpB,iBAAiB,CAAC,OAAO,EAAE,gCAAgC,CAAC;QAC5D,8DAA8D,CAAC;IACjE,OAAO;QACL,EAAE,IAAI,EAAE,6BAA6B,EAAE,KAAK,EAAE,MAAM,EAAE;QACtD,EAAE,IAAI,EAAE,kCAAkC,EAAE,KAAK,EAAE,MAAM,EAAE;QAC3D,EAAE,IAAI,EAAE,8BAA8B,EAAE,KAAK,EAAE,mCAAmC,EAAE;QACpF,EAAE,IAAI,EAAE,8BAA8B,EAAE,KAAK,EAAE,gBAAgB,EAAE;QACjE,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,UAAU,EAAE;KAC7C,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,+BAA+B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAkQlC,CAAC;AAEP,SAAS,oBAAoB;IAC3B,OAAO,+BAA+B;SACnC,OAAO,CAAC,gCAAgC,EAAE,0BAA0B,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;SACxF,OAAO,CAAC,kCAAkC,EAAE,4BAA4B,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;AAClG,CAAC;AAED,MAAM,uBAAuB,GAAG,IAAI,OAAO,EAAW,CAAC;AACvD,MAAM,kBAAkB,GAAG,IAAI,OAAO,EAAQ,CAAC;AAC/C,MAAM,wBAAwB,GAAG,IAAI,OAAO,EAAQ,CAAC;AACrD,MAAM,qBAAqB,GAAG,IAAI,OAAO,EAAQ,CAAC;AAElD,KAAK,UAAU,mBAAmB,CAAC,IAAU;IAC3C,IAAI,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO;IACzC,MAAM,MAAM,GAAG,oBAAoB,EAAE,CAAC;IACtC,sEAAsE;IACtE,uEAAuE;IACvE,2BAA2B;IAC3B,MAAM,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;IACzC,iDAAiD;IACjD,6CAA6C;IAC7C,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;QACrC,gEAAgE;IAClE,CAAC,CAAC,CAAC;IACH,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,yBAAyB,CAAC,IAAU;IAC3C,IAAI,wBAAwB,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO;IAC/C,IAAI,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,KAAK,EAAE,EAAE;QAClC,IAAI,KAAK,KAAK,IAAI,CAAC,SAAS,EAAE;YAAE,OAAO;QACvC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;QACxB,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC;YAAE,OAAO;QACtC,KAAK,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;YACrF,OAAO,CAAC,KAAK,CAAC,wBAAwB,GAAG,EAAE,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,wBAAwB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC;AAED,KAAK,UAAU,sBAAsB,CAAC,IAAU;IAC9C,IAAI,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO;IAC5C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC1C,MAAM,GAAG,CAAC,IAAI,CAAC,0BAA0B,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACpE,MAAM,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE;QAC7B,QAAQ,EAAE;YACR,GAAG,gCAAgC;YACnC,GAAG,uBAAuB;YAC1B,GAAG,wBAAwB;SAC5B;KACF,CAAC,CAAC;IACH,GAAG,CAAC,EAAE,CAAC,qBAAqB,EAAE,CAAC,MAAM,EAAE,EAAE;QACvC,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;QAC/B,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QACrC,MAAM,IAAI,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QAEjC,2CAA2C;QAC3C,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACtD,gBAAgB,CACd,GAAG,EACH,IAAI;gBACF,CAAC,CAAC,cAAc,KAAK,KAAK,MAAM,IAAI,GAAG,SAAS,IAAI,EAAE;gBACtD,CAAC,CAAC,cAAc,KAAK,KAAK,MAAM,IAAI,GAAG,EAAE,CAC5C,CAAC;YACF,KAAK,GAAG;iBACL,IAAI,CAAC,sBAAsB,EAAE;gBAC5B,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,YAAY,EAAE,GAAG;gBACjB,cAAc,EAAE,YAAY;gBAC5B,eAAe,EAAE,6BAA6B,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;aACvE,CAAC;iBACD,KAAK,CAAC,GAAG,EAAE;gBACV,oDAAoD;gBACpD,OAAO,CAAC,KAAK,CAAC,2BAA2B,GAAG,EAAE,CAAC,CAAC;YAClD,CAAC,CAAC,CAAC;YACL,OAAO;QACT,CAAC;QAED,gBAAgB,CAAC,GAAG,EAAE,cAAc,KAAK,KAAK,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC;QAC/D,KAAK,GAAG;aACL,IAAI,CAAC,mBAAmB,EAAE;YACzB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,WAAW,EAAE,iBAAiB;SAC/B,CAAC;aACD,KAAK,CAAC,GAAG,EAAE;YACV,OAAO,CAAC,KAAK,CAAC,uBAAuB,GAAG,EAAE,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IACH,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,IAAU;IACpD,IAAI,IAAI,CAAC,QAAQ,EAAE;QAAE,OAAO;IAC5B,MAAM,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAChC,yBAAyB,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,sBAAsB,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC;AAED,KAAK,UAAU,uBAAuB,CAAC,MAAc;IACnD,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,MAAM;QAAE,OAAO;IACrC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;IACjC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE;QAAE,OAAO;IACrC,MAAM,qBAAqB,CAAC,IAAI,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAAC,OAAgB;IACjE,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1C,OAAO,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,MAAM,EAAE,EAAE;YACrC,KAAK,uBAAuB,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC/C,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBACvD,OAAO,CAAC,KAAK,CAAC,wBAAwB,GAAG,EAAE,CAAC,CAAC;YAC/C,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,uBAAuB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IACnE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,qBAAqB,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;AACH,CAAC"}
@@ -5,7 +5,7 @@
5
5
  import type { Page } from 'puppeteer-core';
6
6
  /**
7
7
  * 在已连接浏览器、且当前页为 Boss 已登录主壳(含侧栏 `.menu-list` 稳定)的前提下执行回调。
8
- * 若当前不在 zhipin.com 则先进入沟通页 `/web/chat/index`,再校验侧栏;已在 Boss 站内(如推荐页)则不强制跳转。
8
+ * 会先按 URL 确保落在沟通页 `/web/chat/index`,再校验侧栏;回调内可再导航到职位/推荐等业务路由。
9
9
  */
10
10
  export declare function withBossSessionPage<T>(callback: (page: Page) => Promise<T>): Promise<T>;
11
11
  //# sourceMappingURL=boss_session_page.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"boss_session_page.d.ts","sourceRoot":"","sources":["../../src/common/boss_session_page.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAW,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAwIpD;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAuD7F"}
1
+ {"version":3,"file":"boss_session_page.d.ts","sourceRoot":"","sources":["../../src/common/boss_session_page.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAW,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAsIpD;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CA0D7F"}
@@ -1,8 +1,9 @@
1
- import { BOSS_CHAT_INDEX_URL, isBossZhipinSiteUrl } from './auth.js';
1
+ import { BOSS_CHAT_INDEX_URL, isBossChatIndexUrl } from './auth.js';
2
2
  import { hideAgentOperatingIndicator, showAgentOperatingIndicator, } from '../browser/agent_operating_indicator.js';
3
3
  import { ensureBrowserSession, getBrowserRef, getPageRef, setSessionPage, } from '../browser/browser_session.js';
4
4
  import { CONTEXT_DESTROY_RETRY_MS } from '../browser/human_delay.js';
5
5
  import { sleepRandom } from '../browser/timing.js';
6
+ import { installBossPageGuards } from './boss_page_guards.js';
6
7
  const SHOULD_DISABLE_JS = process.env.BOSS_BROWSER_DISABLE_JS === 'true' || process.env.BOSS_BROWSER_DISABLE_JS === '1';
7
8
  /** 设为 `1` / `true` 时不注入顶栏滚动提示(调试或截图对比用)。 */
8
9
  const SKIP_AGENT_OPERATING_OVERLAY = process.env.BOSS_CLI_NO_AGENT_OVERLAY === '1' ||
@@ -53,9 +54,9 @@ async function readMenuListSnapshot(page) {
53
54
  return { exists: true, signature: entries.join("|") };
54
55
  })()`));
55
56
  }
56
- /** 仅当当前页不在 Boss 站点(非 zhipin.com / 空白等)时进入沟通页,再交由 {@link ensureMenuListStableAfterLoad} 查 `.menu-list` */
57
- async function ensureBossZhipinLandingBeforeMenuList(page) {
58
- if (isBossZhipinSiteUrl(page.url())) {
57
+ /** 先按 URL 判断:非 `/web/chat/index` 则进入沟通页,再交由 {@link ensureMenuListStableAfterLoad} 查 `.menu-list` */
58
+ async function ensureBossChatIndexUrlBeforeMenuList(page) {
59
+ if (isBossChatIndexUrl(page.url())) {
59
60
  return;
60
61
  }
61
62
  await page.goto(BOSS_CHAT_INDEX_URL, { waitUntil: 'load', timeout: 60_000 });
@@ -87,17 +88,14 @@ async function ensureMenuListStableAfterLoad(page) {
87
88
  while (Date.now() < deadline) {
88
89
  await sleepRandom(pollMs, pollMs);
89
90
  const snap = await readMenuListSnapshot(page);
90
- if (!snap.exists) {
91
- throw new Error('页面中的 .menu-list 在 3 秒稳定检测内消失,疑似未登录或页面仍在跳转。');
92
- }
93
- if (snap.signature !== expected) {
94
- throw new Error('页面中的 .menu-list 在 3 秒稳定检测内发生变化,疑似页面仍在重定向或刷新。');
91
+ if (!snap.exists || snap.signature !== expected) {
92
+ throw new Error('登录状态校验失败,页面可能还未登录,请登录后再试');
95
93
  }
96
94
  }
97
95
  }
98
96
  /**
99
97
  * 在已连接浏览器、且当前页为 Boss 已登录主壳(含侧栏 `.menu-list` 稳定)的前提下执行回调。
100
- * 若当前不在 zhipin.com 则先进入沟通页 `/web/chat/index`,再校验侧栏;已在 Boss 站内(如推荐页)则不强制跳转。
98
+ * 会先按 URL 确保落在沟通页 `/web/chat/index`,再校验侧栏;回调内可再导航到职位/推荐等业务路由。
101
99
  */
102
100
  export async function withBossSessionPage(callback) {
103
101
  const isContextDestroyed = (e) => {
@@ -121,7 +119,8 @@ export async function withBossSessionPage(callback) {
121
119
  }
122
120
  setSessionPage(page);
123
121
  await page.bringToFront();
124
- await ensureBossZhipinLandingBeforeMenuList(page);
122
+ await installBossPageGuards(page);
123
+ await ensureBossChatIndexUrlBeforeMenuList(page);
125
124
  if (SHOULD_DISABLE_JS) {
126
125
  await page.setJavaScriptEnabled(false);
127
126
  }
@@ -1 +1 @@
1
- {"version":3,"file":"boss_session_page.js","sourceRoot":"","sources":["../../src/common/boss_session_page.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"boss_session_page.js","sourceRoot":"","sources":["../../src/common/boss_session_page.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AACpE,OAAO,EACL,2BAA2B,EAC3B,2BAA2B,GAC5B,MAAM,yCAAyC,CAAC;AACjD,OAAO,EACL,oBAAoB,EACpB,aAAa,EACb,UAAU,EACV,cAAc,GACf,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,MAAM,iBAAiB,GACrB,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,GAAG,CAAC;AAEhG,4CAA4C;AAC5C,MAAM,4BAA4B,GAChC,OAAO,CAAC,GAAG,CAAC,yBAAyB,KAAK,GAAG;IAC7C,OAAO,CAAC,GAAG,CAAC,yBAAyB,KAAK,MAAM,CAAC;AAEnD,wDAAwD;AACxD,MAAM,0BAA0B,GAAG,MAAM,CAAC;AAE1C,KAAK,UAAU,gBAAgB,CAAC,OAAgB;IAC9C,MAAM,KAAK,GAAG,CAAC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IACnE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEpC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,GAAG,CAC5B,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACd,IAAI,CAAC;YACH,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC;QACjB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC,CAAC,CACH,CAAC;IAEF,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACjC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACxB,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,aAAa,IAAI,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IACH,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1B,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACnC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACxB,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,aAAa,CAAC;IAC7C,CAAC,CAAC,CAAC;IACH,OAAO,QAAQ,IAAI,IAAI,CAAC;AAC1B,CAAC;AAOD,SAAS,iBAAiB,CAAC,GAA8B;IACvD,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AACjD,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,IAAU;IAC5C,OAAO,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC;;;;;;;;;;;;;;OAcvB,CAAC,CAAqB,CAAC;AAC9B,CAAC;AAED,oGAAoG;AACpG,KAAK,UAAU,oCAAoC,CAAC,IAAU;IAC5D,IAAI,kBAAkB,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;QACnC,OAAO;IACT,CAAC;IACD,MAAM,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;AAC/E,CAAC;AAED,KAAK,UAAU,6BAA6B,CAAC,IAAU;IACrD,MAAM,IAAI,CAAC,eAAe,CACxB,uFAAuF,EACvF,EAAE,OAAO,EAAE,MAAM,EAAE,CACpB,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,eAAe,CACxB,kDAAkD,EAClD,EAAE,OAAO,EAAE,0BAA0B,EAAE,CACxC,CAAC;IACJ,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,MAAM,QAAQ,GACZ,GAAG,CAAC,IAAI,KAAK,cAAc,IAAI,yBAAyB,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC7E,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CACb,KAAK,0BAA0B,GAAG,IAAI,0CAA0C,CACjF,CAAC;QACJ,CAAC;QACD,MAAM,CAAC,CAAC;IACV,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAC/C,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC;IACD,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,cAAc,GAAG,KAAK,CAAC;IAC7B,MAAM,MAAM,GAAG,GAAG,CAAC;IACnB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc,CAAC;IAC7C,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC;IAEjC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,MAAM,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAClC,MAAM,IAAI,GAAG,MAAM,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;YAChD,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAI,QAAoC;IAC/E,MAAM,kBAAkB,GAAG,CAAC,CAAU,EAAW,EAAE;QACjD,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvD,OAAO,CACL,GAAG,CAAC,QAAQ,CAAC,iCAAiC,CAAC;YAC/C,GAAG,CAAC,QAAQ,CAAC,uCAAuC,CAAC;YACrD,GAAG,CAAC,QAAQ,CAAC,qCAAqC,CAAC,CACpD,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,CAAC,CAAC;IACtB,IAAI,OAAgB,CAAC;IACrB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;QACvD,IAAI,CAAC;YACH,MAAM,oBAAoB,EAAE,CAAC;YAC7B,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;YAChC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;YAChC,CAAC;YAED,IAAI,IAAI,GAAgB,UAAU,EAAE,CAAC;YACrC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;gBAC7B,IAAI,GAAG,CAAC,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;YACxE,CAAC;YACD,cAAc,CAAC,IAAI,CAAC,CAAC;YACrB,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;YAE1B,MAAM,qBAAqB,CAAC,IAAI,CAAC,CAAC;YAElC,MAAM,oCAAoC,CAAC,IAAI,CAAC,CAAC;YACjD,IAAI,iBAAiB,EAAE,CAAC;gBACtB,MAAM,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;YACzC,CAAC;YACD,MAAM,6BAA6B,CAAC,IAAI,CAAC,CAAC;YAE1C,IAAI,CAAC,iBAAiB,IAAI,CAAC,4BAA4B,EAAE,CAAC;gBACxD,MAAM,2BAA2B,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;oBACjD,eAAe;gBACjB,CAAC,CAAC,CAAC;YACL,CAAC;YACD,IAAI,CAAC;gBACH,OAAO,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC9B,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC,iBAAiB,IAAI,CAAC,4BAA4B,EAAE,CAAC;oBACxD,MAAM,2BAA2B,CAAC,IAAI,CAAC,CAAC;gBAC1C,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,GAAG,CAAC,CAAC;YACZ,IAAI,OAAO,GAAG,WAAW,GAAG,CAAC,IAAI,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvD,uCAAuC;gBACvC,MAAM,WAAW,CAAC,wBAAwB,CAAC,GAAG,EAAE,wBAAwB,CAAC,GAAG,CAAC,CAAC;gBAC9E,SAAS;YACX,CAAC;YACD,MAAM,CAAC,CAAC;QACV,CAAC;IACH,CAAC;IACD,MAAM,OAAO,YAAY,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;AACxE,CAAC"}
@@ -4,6 +4,8 @@
4
4
  * @see https://ai.baidu.com/ai-doc/OCR/zk3h7xz52
5
5
  */
6
6
  export declare function isBaiduOcrConfigured(): boolean;
7
+ /** 更换密钥后应调用,避免沿用旧 access_token。 */
8
+ export declare function clearBaiduTokenCache(): void;
7
9
  /** 获取 access_token(带简单内存缓存,过期前 1 分钟刷新)。 */
8
10
  export declare function getBaiduAccessToken(): Promise<string>;
9
11
  /** 对整张 PNG/JPG 做高精度识别,返回合并文本(按行拼接)。 */
@@ -1 +1 @@
1
- {"version":3,"file":"baidu_ocr.d.ts","sourceRoot":"","sources":["../../src/ocr/baidu_ocr.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAaH,wBAAgB,oBAAoB,IAAI,OAAO,CAE9C;AAID,2CAA2C;AAC3C,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC,CA4C3D;AAID,uCAAuC;AACvC,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgC9E"}
1
+ {"version":3,"file":"baidu_ocr.d.ts","sourceRoot":"","sources":["../../src/ocr/baidu_ocr.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAaH,wBAAgB,oBAAoB,IAAI,OAAO,CAE9C;AAID,mCAAmC;AACnC,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C;AAED,2CAA2C;AAC3C,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC,CA4C3D;AAID,uCAAuC;AACvC,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgC9E"}
@@ -15,6 +15,10 @@ export function isBaiduOcrConfigured() {
15
15
  return !!(apiKey() && secretKey());
16
16
  }
17
17
  let cachedToken = null;
18
+ /** 更换密钥后应调用,避免沿用旧 access_token。 */
19
+ export function clearBaiduTokenCache() {
20
+ cachedToken = null;
21
+ }
18
22
  /** 获取 access_token(带简单内存缓存,过期前 1 分钟刷新)。 */
19
23
  export async function getBaiduAccessToken() {
20
24
  const client_id = apiKey();
@@ -1 +1 @@
1
- {"version":3,"file":"baidu_ocr.js","sourceRoot":"","sources":["../../src/ocr/baidu_ocr.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"baidu_ocr.js","sourceRoot":"","sources":["../../src/ocr/baidu_ocr.ts"],"names":[],"mappings":"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"}