@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,245 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
const CHECK_ENTRY_URL = 'https://www.zhipin.com/web/chat/index';
|
|
3
|
+
const CHECK_LOGIN_URL = 'https://www.zhipin.com/web/user/?ka=header-login';
|
|
4
|
+
const CHECK_TIMEOUT_MS = 45_000;
|
|
5
|
+
const VERIFIED_CAPTURE_LABEL = '2026-07-17 boss-online-js snapshot';
|
|
6
|
+
const VERIFIED_BOSS_INDEX_VERSION = 'v10753';
|
|
7
|
+
const VERIFIED_BOSS_BUNDLE_VERSION = 'v6240';
|
|
8
|
+
const VERIFIED_ZHIPIN_SIGN_VERSION = 'v5312';
|
|
9
|
+
const CHECK_HEADERS = {
|
|
10
|
+
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36',
|
|
11
|
+
accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
|
|
12
|
+
};
|
|
13
|
+
const REQUIRED_ENTRY_SCRIPT_URLS = [
|
|
14
|
+
'https://static.zhipin.com/assets/sdk/warlock/warlockdata.min.2.2.14.js',
|
|
15
|
+
'https://static.zhipin.com/assets/sdk/apm/patas-compat.2.1.0.min.js',
|
|
16
|
+
'https://static.zhipin.com/assets/zhipin/chat/mqtt-v1.2.min.js',
|
|
17
|
+
'https://static.zhipin.com/zhipin-boss/index/v10753/static/js/polyfill.js',
|
|
18
|
+
'https://static.zhipin.com/zhipin-boss/index/v10753/static/js/app.js',
|
|
19
|
+
'https://static.zhipin.com/zhipin-boss/index/v10753/static/js/risk-detection.js',
|
|
20
|
+
];
|
|
21
|
+
const REQUIRED_LOGIN_SCRIPT_URLS = [
|
|
22
|
+
'https://img.bosszhipin.com/static/zhipin/geek/sdk/browser-check-v2.js',
|
|
23
|
+
'https://static.zhipin.com/assets/sdk/apm/patas.2.3.0.min.js',
|
|
24
|
+
'https://static.zhipin.com/assets/sdk/warlock/warlockdata.min.2.2.15.js',
|
|
25
|
+
'https://static.zhipin.com/zhipin-sign/v5312/static/js/iframe-core.7fa9fa18.js',
|
|
26
|
+
'https://static.zhipin.com/zhipin-sign/v5312/static/js/vendors~app.daefb1ca.js',
|
|
27
|
+
'https://static.zhipin.com/zhipin-sign/v5312/static/js/app.e89e7a3f.js',
|
|
28
|
+
];
|
|
29
|
+
const GUARDED_SCRIPT_HASHES = [
|
|
30
|
+
{
|
|
31
|
+
label: 'browser-check-v2',
|
|
32
|
+
url: 'https://img.bosszhipin.com/static/zhipin/geek/sdk/browser-check-v2.js',
|
|
33
|
+
sha256: '0ba94a338ed00ba353384a091f36fca73c67651cf6fe28c588c5e926aaa0399e',
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
label: 'chat apm patas-compat',
|
|
37
|
+
url: 'https://static.zhipin.com/assets/sdk/apm/patas-compat.2.1.0.min.js',
|
|
38
|
+
sha256: '2c8d059c16800f91639bc7eb2040bfa8a211425d02a8b702831c9cd5b2f6315a',
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
label: 'login apm patas',
|
|
42
|
+
url: 'https://static.zhipin.com/assets/sdk/apm/patas.2.3.0.min.js',
|
|
43
|
+
sha256: 'cf96ad9e6da919b4a88d623b53d7ba2cc49529df9d12ef7d886164c3482424cc',
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
label: 'chat warlock',
|
|
47
|
+
url: 'https://static.zhipin.com/assets/sdk/warlock/warlockdata.min.2.2.14.js',
|
|
48
|
+
sha256: '5979a30734aa6ce729989e545c61f52a8b6e717bdd544e894e3c60db893e7d68',
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
label: 'login warlock',
|
|
52
|
+
url: 'https://static.zhipin.com/assets/sdk/warlock/warlockdata.min.2.2.15.js',
|
|
53
|
+
sha256: '51bd06ef6a77d5ceecef040c5ff8c44324f425104bb505137302de1e20327345',
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
label: 'chat mqtt',
|
|
57
|
+
url: 'https://static.zhipin.com/assets/zhipin/chat/mqtt-v1.2.min.js',
|
|
58
|
+
sha256: 'd63db9287a0aba5dc81c3b1fb393303a63b1a6c0dd0aec5bc26ddc84b0dfc67f',
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
label: 'boss-index app',
|
|
62
|
+
url: 'https://static.zhipin.com/zhipin-boss/index/v10753/static/js/app.js',
|
|
63
|
+
sha256: '65e0437bee4563f498572da71130121ac90f0835e9e1c111b3f8a781883ccfb3',
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
label: 'boss-index polyfill',
|
|
67
|
+
url: 'https://static.zhipin.com/zhipin-boss/index/v10753/static/js/polyfill.js',
|
|
68
|
+
sha256: 'bb9690cfd41a2c19a779ecf26642478d4820f8fd69ff9c6f1f660cb6ed988c50',
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
label: 'boss-index risk-detection',
|
|
72
|
+
url: 'https://static.zhipin.com/zhipin-boss/index/v10753/static/js/risk-detection.js',
|
|
73
|
+
sha256: 'cb85c270ef9616a54a35024d81ea289b2a00f6d7366b29f24e7ea0a7e4b86f84',
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
label: 'boss-bundle remoteEntry',
|
|
77
|
+
url: 'https://static.zhipin.com/zhipin-boss/bundle/v6240/static/remoteEntry.js',
|
|
78
|
+
sha256: '9a98ad5c9a36fae39ca56aca0ce002943b9090ea74d50ac194e65d0b9a52281a',
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
label: 'zhipin-sign app',
|
|
82
|
+
url: 'https://static.zhipin.com/zhipin-sign/v5312/static/js/app.e89e7a3f.js',
|
|
83
|
+
sha256: '8cd89ecc89118e959637efe42b61663db7d617fad3435f8f2c27eba2d8dc6af6',
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
label: 'zhipin-sign iframe-core',
|
|
87
|
+
url: 'https://static.zhipin.com/zhipin-sign/v5312/static/js/iframe-core.7fa9fa18.js',
|
|
88
|
+
sha256: '2170fa54732f95da0b233a80a5cec6858bb2c8aec15361febe4764200a4eb02d',
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
label: 'zhipin-sign vendor',
|
|
92
|
+
url: 'https://static.zhipin.com/zhipin-sign/v5312/static/js/vendors~app.daefb1ca.js',
|
|
93
|
+
sha256: 'a9dde3db277a8cb9c4da030353fd59cdc5a388be022e6f82a3a0389c47b0191d',
|
|
94
|
+
},
|
|
95
|
+
];
|
|
96
|
+
export class BossAvailabilityError extends Error {
|
|
97
|
+
constructor(message) {
|
|
98
|
+
super(message);
|
|
99
|
+
this.name = 'BossAvailabilityError';
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
function normalizeRemoteUrl(raw, baseUrl) {
|
|
103
|
+
try {
|
|
104
|
+
return new URL(raw, baseUrl).toString();
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
function extractAssetUrls(html, baseUrl) {
|
|
111
|
+
const urls = new Set();
|
|
112
|
+
const attrRe = /<(?:script|link)\b[^>]+(?:src|href)=["']([^"']+)["']/gi;
|
|
113
|
+
for (const match of html.matchAll(attrRe)) {
|
|
114
|
+
const raw = match[1];
|
|
115
|
+
if (!raw) {
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
const url = normalizeRemoteUrl(raw, baseUrl);
|
|
119
|
+
if (url) {
|
|
120
|
+
urls.add(url);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return Array.from(urls).sort();
|
|
124
|
+
}
|
|
125
|
+
async function fetchBufferStrict(url) {
|
|
126
|
+
const res = await fetch(url, {
|
|
127
|
+
headers: CHECK_HEADERS,
|
|
128
|
+
redirect: 'follow',
|
|
129
|
+
signal: AbortSignal.timeout(CHECK_TIMEOUT_MS),
|
|
130
|
+
});
|
|
131
|
+
if (!res.ok) {
|
|
132
|
+
throw new Error(`HTTP ${res.status} ${res.statusText} while fetching ${url}`);
|
|
133
|
+
}
|
|
134
|
+
const body = Buffer.from(await res.arrayBuffer());
|
|
135
|
+
return { buffer: body, finalUrl: res.url || url };
|
|
136
|
+
}
|
|
137
|
+
function sha256(buffer) {
|
|
138
|
+
return createHash('sha256').update(buffer).digest('hex');
|
|
139
|
+
}
|
|
140
|
+
const VERSIONED_SCRIPT_RE = /\/(?:zhipin-boss\/index|zhipin-sign)\/v\d+\//;
|
|
141
|
+
function toStableScriptIdentity(url) {
|
|
142
|
+
return url
|
|
143
|
+
.replace(VERSIONED_SCRIPT_RE, (segment) => segment.replace(/\/v\d+\//, '/v*/'))
|
|
144
|
+
.replace(/\/static\/js\/([^/.]+(?:~[^/.]+)?)\.[a-f0-9]{8,}\.js$/i, '/static/js/$1.*.js');
|
|
145
|
+
}
|
|
146
|
+
function findCurrentScriptUrl(assetUrls, expectedUrl) {
|
|
147
|
+
if (assetUrls.includes(expectedUrl)) {
|
|
148
|
+
return { url: expectedUrl, reason: null };
|
|
149
|
+
}
|
|
150
|
+
const expectedIdentity = toStableScriptIdentity(expectedUrl);
|
|
151
|
+
if (expectedIdentity === expectedUrl) {
|
|
152
|
+
return { url: null, reason: null };
|
|
153
|
+
}
|
|
154
|
+
const matches = assetUrls.filter((url) => toStableScriptIdentity(url) === expectedIdentity);
|
|
155
|
+
if (matches.length === 0) {
|
|
156
|
+
return { url: null, reason: null };
|
|
157
|
+
}
|
|
158
|
+
if (matches.length > 1) {
|
|
159
|
+
return {
|
|
160
|
+
url: null,
|
|
161
|
+
reason: `多个当前脚本匹配同一个已验证身份 ${expectedIdentity}: ${matches.join(', ')}`,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
return { url: matches[0], reason: null };
|
|
165
|
+
}
|
|
166
|
+
function formatDisabledMessage(reasons) {
|
|
167
|
+
return [
|
|
168
|
+
'Boss CLI 已禁用:Boss 线上前端 JS 与已验证基线不一致。',
|
|
169
|
+
`已验证基线:${VERIFIED_CAPTURE_LABEL},Boss index ${VERIFIED_BOSS_INDEX_VERSION},Boss bundle ${VERIFIED_BOSS_BUNDLE_VERSION},Zhipin sign ${VERIFIED_ZHIPIN_SIGN_VERSION}。`,
|
|
170
|
+
'',
|
|
171
|
+
'触发原因:',
|
|
172
|
+
...reasons.map((reason) => `- ${reason}`),
|
|
173
|
+
'',
|
|
174
|
+
'处理方式:重新归档 Boss 线上原始 JS,复核反调试/风控策略,然后更新 boss_availability 基线后再发版。',
|
|
175
|
+
].join('\n');
|
|
176
|
+
}
|
|
177
|
+
async function assertEntryPageMatches(params) {
|
|
178
|
+
try {
|
|
179
|
+
const reasons = [];
|
|
180
|
+
const { buffer, finalUrl } = await fetchBufferStrict(params.url);
|
|
181
|
+
if (finalUrl !== params.url) {
|
|
182
|
+
reasons.push(`${params.pageLabel} 发生跳转:${params.url} -> ${finalUrl}`);
|
|
183
|
+
}
|
|
184
|
+
const assetUrls = extractAssetUrls(buffer.toString('utf8'), params.url);
|
|
185
|
+
for (const url of params.requiredScripts) {
|
|
186
|
+
const current = findCurrentScriptUrl(assetUrls, url);
|
|
187
|
+
if (current.reason) {
|
|
188
|
+
reasons.push(`${params.pageLabel} ${current.reason}`);
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
191
|
+
if (!current.url) {
|
|
192
|
+
reasons.push(`${params.pageLabel} 缺少已验证脚本:${url}`);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return { reasons, assetUrls };
|
|
196
|
+
}
|
|
197
|
+
catch (e) {
|
|
198
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
199
|
+
return { reasons: [`无法读取 ${params.pageLabel} ${params.url}:${msg}`], assetUrls: [] };
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
export async function assertBossCliAvailable() {
|
|
203
|
+
const entryPage = await assertEntryPageMatches({
|
|
204
|
+
pageLabel: 'Boss 聊天入口页',
|
|
205
|
+
url: CHECK_ENTRY_URL,
|
|
206
|
+
requiredScripts: REQUIRED_ENTRY_SCRIPT_URLS,
|
|
207
|
+
});
|
|
208
|
+
const loginPage = await assertEntryPageMatches({
|
|
209
|
+
pageLabel: 'Boss 登录入口页',
|
|
210
|
+
url: CHECK_LOGIN_URL,
|
|
211
|
+
requiredScripts: REQUIRED_LOGIN_SCRIPT_URLS,
|
|
212
|
+
});
|
|
213
|
+
const reasons = [...entryPage.reasons, ...loginPage.reasons];
|
|
214
|
+
const currentAssetUrls = [...entryPage.assetUrls, ...loginPage.assetUrls];
|
|
215
|
+
if (reasons.length > 0) {
|
|
216
|
+
throw new BossAvailabilityError(formatDisabledMessage(reasons));
|
|
217
|
+
}
|
|
218
|
+
for (const guarded of GUARDED_SCRIPT_HASHES) {
|
|
219
|
+
const current = findCurrentScriptUrl(currentAssetUrls, guarded.url);
|
|
220
|
+
if (current.reason) {
|
|
221
|
+
reasons.push(`${guarded.label} ${current.reason}`);
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
const guardedUrl = current.url ?? guarded.url;
|
|
225
|
+
try {
|
|
226
|
+
const { buffer, finalUrl } = await fetchBufferStrict(guardedUrl);
|
|
227
|
+
if (finalUrl !== guardedUrl) {
|
|
228
|
+
reasons.push(`${guarded.label} 发生跳转:${guardedUrl} -> ${finalUrl}`);
|
|
229
|
+
continue;
|
|
230
|
+
}
|
|
231
|
+
const actualSha256 = sha256(buffer);
|
|
232
|
+
if (actualSha256 !== guarded.sha256) {
|
|
233
|
+
reasons.push(`${guarded.label} SHA-256 不一致:url ${guardedUrl}, expected ${guarded.sha256}, actual ${actualSha256}`);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
catch (e) {
|
|
237
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
238
|
+
reasons.push(`${guarded.label} 读取失败:${msg}`);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
if (reasons.length > 0) {
|
|
242
|
+
throw new BossAvailabilityError(formatDisabledMessage(reasons));
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=boss_availability.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boss_availability.js","sourceRoot":"","sources":["../../src/common/boss_availability.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Page } from 'puppeteer-core';
|
|
2
|
+
/**
|
|
3
|
+
* 关闭当前可见的 Boss 弹层(通常同一时刻只会出现一个)。
|
|
4
|
+
* 覆盖 `.boss-popup__wrapper` / `.boss-dialog__wrapper` / `.dialog-container`,
|
|
5
|
+
* 以及含 c-resume 的简历预览层(`.close-btn`)。
|
|
6
|
+
* 会在主文档与各子 frame 中尝试。返回是否执行了关闭。
|
|
7
|
+
*/
|
|
8
|
+
export declare function closeBossModalIfPresent(page: Page): Promise<boolean>;
|
|
9
|
+
/**
|
|
10
|
+
* 轮询直到出现可见弹层并关闭,或超时。
|
|
11
|
+
* 用于操作完成后清理延迟出现的提示框(如「当前职位尚未开放」)。
|
|
12
|
+
*/
|
|
13
|
+
export declare function waitAndCloseBossModalIfPresent(page: Page, timeoutMs: number): Promise<boolean>;
|
|
14
|
+
//# sourceMappingURL=boss_modal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boss_modal.d.ts","sourceRoot":"","sources":["../../src/common/boss_modal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAgD3C;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAa1E;AAED;;;GAGG;AACH,wBAAsB,8BAA8B,CAClD,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC,CASlB"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { C_RESUME_IFRAME_SELECTOR } from './c_resume_capture.js';
|
|
2
|
+
import { sleepRandom } from '../browser/timing.js';
|
|
3
|
+
const CLOSE_BOSS_MODAL_SCRIPT = `(() => {
|
|
4
|
+
function isVisible(el) {
|
|
5
|
+
if (!(el instanceof HTMLElement)) return false;
|
|
6
|
+
const st = window.getComputedStyle(el);
|
|
7
|
+
if (st.display === "none" || st.visibility === "hidden" || Number(st.opacity) < 0.05) {
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
10
|
+
const rect = el.getBoundingClientRect();
|
|
11
|
+
return rect.width >= 20 && rect.height >= 20;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function tryClickClose(root) {
|
|
15
|
+
const closeBtn =
|
|
16
|
+
root.querySelector(".boss-popup__close, .boss-dialog__close, .drawer-close") ||
|
|
17
|
+
root.querySelector(".dialog-header .close") ||
|
|
18
|
+
root.querySelector(".close-btn") ||
|
|
19
|
+
root.querySelector(".icon-close");
|
|
20
|
+
if (closeBtn instanceof HTMLElement) {
|
|
21
|
+
closeBtn.click();
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const roots = Array.from(
|
|
28
|
+
document.querySelectorAll(".boss-popup__wrapper, .boss-dialog__wrapper, .dialog-container"),
|
|
29
|
+
);
|
|
30
|
+
for (const root of roots) {
|
|
31
|
+
if (!isVisible(root)) continue;
|
|
32
|
+
if (tryClickClose(root)) return true;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const resumeIframe = document.querySelector(${JSON.stringify(C_RESUME_IFRAME_SELECTOR)});
|
|
36
|
+
if (resumeIframe instanceof HTMLElement && isVisible(resumeIframe)) {
|
|
37
|
+
let node = resumeIframe.parentElement;
|
|
38
|
+
for (let i = 0; i < 15 && node; i++) {
|
|
39
|
+
if (tryClickClose(node)) return true;
|
|
40
|
+
node = node.parentElement;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return false;
|
|
45
|
+
})()`;
|
|
46
|
+
/**
|
|
47
|
+
* 关闭当前可见的 Boss 弹层(通常同一时刻只会出现一个)。
|
|
48
|
+
* 覆盖 `.boss-popup__wrapper` / `.boss-dialog__wrapper` / `.dialog-container`,
|
|
49
|
+
* 以及含 c-resume 的简历预览层(`.close-btn`)。
|
|
50
|
+
* 会在主文档与各子 frame 中尝试。返回是否执行了关闭。
|
|
51
|
+
*/
|
|
52
|
+
export async function closeBossModalIfPresent(page) {
|
|
53
|
+
for (const frame of page.frames()) {
|
|
54
|
+
try {
|
|
55
|
+
const closed = (await frame.evaluate(CLOSE_BOSS_MODAL_SCRIPT));
|
|
56
|
+
if (closed) {
|
|
57
|
+
await sleepRandom(220, 480);
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
/* detached / 无权限 */
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* 轮询直到出现可见弹层并关闭,或超时。
|
|
69
|
+
* 用于操作完成后清理延迟出现的提示框(如「当前职位尚未开放」)。
|
|
70
|
+
*/
|
|
71
|
+
export async function waitAndCloseBossModalIfPresent(page, timeoutMs) {
|
|
72
|
+
const deadline = Date.now() + timeoutMs;
|
|
73
|
+
while (Date.now() < deadline) {
|
|
74
|
+
if (await closeBossModalIfPresent(page)) {
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
await sleepRandom(160, 240);
|
|
78
|
+
}
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=boss_modal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boss_modal.js","sourceRoot":"","sources":["../../src/common/boss_modal.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,MAAM,uBAAuB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gDAgCgB,IAAI,CAAC,SAAS,CAAC,wBAAwB,CAAC;;;;;;;;;;KAUnF,CAAC;AAEN;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,IAAU;IACtD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,CAAC,MAAM,KAAK,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAY,CAAC;YAC1E,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBAC5B,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,oBAAoB;QACtB,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,IAAU,EACV,SAAiB;IAEjB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IACxC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,IAAI,MAAM,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC;YACxC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Browser, Page } from 'puppeteer-core';
|
|
2
|
+
export type BossPageRiskKind = 'risk_navigation' | 'reload_loop';
|
|
3
|
+
export type BossPageRiskState = {
|
|
4
|
+
kind: BossPageRiskKind;
|
|
5
|
+
url: string;
|
|
6
|
+
message: string;
|
|
7
|
+
};
|
|
8
|
+
/** 当前页是否已熔断(风控页反弹 / 刷新循环);命令层据此明确报错而不是继续空转。 */
|
|
9
|
+
export declare function getBossPageRiskState(page: Page): BossPageRiskState | null;
|
|
10
|
+
/** 用户手动处理完验证后,可清掉熔断状态继续跑。 */
|
|
11
|
+
export declare function clearBossPageRiskState(page: Page): void;
|
|
12
|
+
export declare function installBossPageGuards(page: Page): Promise<void>;
|
|
13
|
+
export declare function installBossBrowserPageGuards(browser: Browser): Promise<void>;
|
|
14
|
+
//# sourceMappingURL=boss_page_guards.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boss_page_guards.d.ts","sourceRoot":"","sources":["../../src/common/boss_page_guards.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAc,IAAI,EAAU,MAAM,gBAAgB,CAAC;AAyaxE,MAAM,MAAM,gBAAgB,GAAG,iBAAiB,GAAG,aAAa,CAAC;AAEjE,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,gBAAgB,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAKF,+CAA+C;AAC/C,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,IAAI,GAAG,iBAAiB,GAAG,IAAI,CAEzE;AAED,6BAA6B;AAC7B,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAEvD;AAyKD,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAMrE;AASD,wBAAsB,4BAA4B,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAelF"}
|