@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,406 @@
|
|
|
1
|
+
import { access, readFile, writeFile } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { sleepRandom } from '../browser/index.js';
|
|
4
|
+
import { withBossSessionPage } from '../common/boss_session_page.js';
|
|
5
|
+
import { clickBossSidebarMenuToPath } from '../common/boss_sidebar_nav.js';
|
|
6
|
+
import { JD_DIR } from '../config.js';
|
|
7
|
+
const BOSS_CHAT_JOB_LIST_URL = 'https://www.zhipin.com/web/chat/job/list';
|
|
8
|
+
const JD_PAGE_SETTLE_MS = { min: 3200, max: 5600 };
|
|
9
|
+
const JD_DETAIL_DEFAULT_WAIT_MS = 10_000;
|
|
10
|
+
const CLICK_JD_BACK_BUTTON_SCRIPT = `(() => {
|
|
11
|
+
const isVisible = (el) => {
|
|
12
|
+
if (!(el instanceof HTMLElement)) return false;
|
|
13
|
+
const st = window.getComputedStyle(el);
|
|
14
|
+
if (st.display === "none" || st.visibility === "hidden") return false;
|
|
15
|
+
const r = el.getBoundingClientRect();
|
|
16
|
+
return r.width > 0 && r.height > 0;
|
|
17
|
+
};
|
|
18
|
+
const topNav = document.querySelector(".top-nav");
|
|
19
|
+
if (!(topNav instanceof HTMLElement)) {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
const backBtn = topNav.querySelector(".history-back-container .back-btn");
|
|
23
|
+
const icon = backBtn?.querySelector("i.iboss-right");
|
|
24
|
+
if (!(icon instanceof HTMLElement)) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
if (!(backBtn instanceof HTMLElement) || !isVisible(backBtn)) {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
backBtn.scrollIntoView({ block: "center", inline: "nearest" });
|
|
31
|
+
backBtn.dispatchEvent(new MouseEvent("click", { bubbles: true, cancelable: true }));
|
|
32
|
+
backBtn.click();
|
|
33
|
+
return true;
|
|
34
|
+
})()`;
|
|
35
|
+
function isBossChatJobListUrl(url) {
|
|
36
|
+
try {
|
|
37
|
+
const u = new URL(url);
|
|
38
|
+
if (!u.hostname.includes('zhipin.com')) {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
const p = u.pathname.replace(/\/+$/, '') || '/';
|
|
42
|
+
return p === '/web/chat/job/list';
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function resolveTargetJob(jobs, detailInput) {
|
|
49
|
+
const raw = detailInput.trim();
|
|
50
|
+
if (!raw)
|
|
51
|
+
return null;
|
|
52
|
+
const exact = jobs.find((job) => job.title === raw);
|
|
53
|
+
if (exact)
|
|
54
|
+
return exact;
|
|
55
|
+
const needle = raw.toLowerCase();
|
|
56
|
+
const fuzzy = jobs.filter((job) => job.title.toLowerCase().includes(needle));
|
|
57
|
+
if (fuzzy.length === 1) {
|
|
58
|
+
return fuzzy[0] ?? null;
|
|
59
|
+
}
|
|
60
|
+
if (fuzzy.length > 1) {
|
|
61
|
+
const picks = fuzzy
|
|
62
|
+
.slice(0, 8)
|
|
63
|
+
.map((j, idx) => `${idx + 1}. ${j.title}`)
|
|
64
|
+
.join('|');
|
|
65
|
+
throw new Error(`“${raw}”命中多个职位,请改用更精确名称。候选:${picks}`);
|
|
66
|
+
}
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
function stripControlChars(input) {
|
|
70
|
+
return input.replace(/[<>:"/\\|?*]/g, '_');
|
|
71
|
+
}
|
|
72
|
+
function cacheFileCandidates(projectDir, title) {
|
|
73
|
+
const exact = path.resolve(projectDir, `${title}.md`);
|
|
74
|
+
const safe = path.resolve(projectDir, `${stripControlChars(title)}.md`);
|
|
75
|
+
if (safe === exact) {
|
|
76
|
+
return [exact];
|
|
77
|
+
}
|
|
78
|
+
return [exact, safe];
|
|
79
|
+
}
|
|
80
|
+
async function fileExists(target) {
|
|
81
|
+
try {
|
|
82
|
+
await access(target);
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
async function readJobsFromFrame(frame) {
|
|
90
|
+
return (await frame.evaluate(`(() => {
|
|
91
|
+
const norm = (v) => (v ?? "").replace(/\\s+/g, " ").trim();
|
|
92
|
+
const rows = Array.from(document.querySelectorAll(".job-jobInfo-warp"));
|
|
93
|
+
const jobs = rows.map((el) => {
|
|
94
|
+
const statusText = norm(el.querySelector(".job-status-wrapper .status-box")?.textContent);
|
|
95
|
+
const labelText = norm(el.querySelector(".job-title .label-common")?.textContent);
|
|
96
|
+
const meta = Array.from(el.querySelectorAll(".job-main-info-wrapper .info-labels span"))
|
|
97
|
+
.map((x) => norm(x.textContent))
|
|
98
|
+
.filter(Boolean);
|
|
99
|
+
const nums = Array.from(el.querySelectorAll(".job-about-num-wrapper .inner-box .num"))
|
|
100
|
+
.map((x) => norm(x.textContent));
|
|
101
|
+
return {
|
|
102
|
+
id: norm(el.getAttribute("data-id")),
|
|
103
|
+
title: norm(el.querySelector(".job-title a")?.textContent),
|
|
104
|
+
label: labelText,
|
|
105
|
+
status: statusText,
|
|
106
|
+
meta,
|
|
107
|
+
viewed: nums[0] || "0",
|
|
108
|
+
chatted: nums[1] || "0",
|
|
109
|
+
interested: nums[2] || "0",
|
|
110
|
+
};
|
|
111
|
+
});
|
|
112
|
+
const totalText = norm(document.querySelector(".total-num")?.textContent);
|
|
113
|
+
const bodyText = norm(document.body?.innerText ?? "");
|
|
114
|
+
return {
|
|
115
|
+
rows: rows.length,
|
|
116
|
+
totalText,
|
|
117
|
+
title: document.title || "",
|
|
118
|
+
url: location.href,
|
|
119
|
+
bodyPreview: bodyText.slice(0, 120),
|
|
120
|
+
jobs,
|
|
121
|
+
};
|
|
122
|
+
})()`));
|
|
123
|
+
}
|
|
124
|
+
async function readJobsFromPageAnyFrame(page) {
|
|
125
|
+
const main = await readJobsFromFrame(page.mainFrame());
|
|
126
|
+
if (main.rows > 0 || main.totalText.length > 0) {
|
|
127
|
+
return {
|
|
128
|
+
frame: page.mainFrame(),
|
|
129
|
+
data: main,
|
|
130
|
+
fromFrame: false,
|
|
131
|
+
frameUrl: main.url,
|
|
132
|
+
mainState: main,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
const frames = page.frames();
|
|
136
|
+
for (const frame of frames) {
|
|
137
|
+
if (frame === page.mainFrame()) {
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
try {
|
|
141
|
+
const state = await readJobsFromFrame(frame);
|
|
142
|
+
if (state.rows > 0 || state.totalText.length > 0) {
|
|
143
|
+
return {
|
|
144
|
+
frame,
|
|
145
|
+
data: state,
|
|
146
|
+
fromFrame: true,
|
|
147
|
+
frameUrl: state.url,
|
|
148
|
+
mainState: main,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
// ignore cross-origin / detached frames
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return {
|
|
157
|
+
frame: page.mainFrame(),
|
|
158
|
+
data: main,
|
|
159
|
+
fromFrame: false,
|
|
160
|
+
frameUrl: main.url,
|
|
161
|
+
mainState: main,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
async function waitForJobRowsReady(page, timeoutMs) {
|
|
165
|
+
const start = Date.now();
|
|
166
|
+
while (Date.now() - start < timeoutMs) {
|
|
167
|
+
const state = await readJobsFromPageAnyFrame(page);
|
|
168
|
+
if (state.data.rows > 0 || state.data.totalText.length > 0) {
|
|
169
|
+
return state;
|
|
170
|
+
}
|
|
171
|
+
await sleepRandom(260, 520);
|
|
172
|
+
}
|
|
173
|
+
const last = await readJobsFromPageAnyFrame(page);
|
|
174
|
+
throw new Error([
|
|
175
|
+
'等待职位列表超时',
|
|
176
|
+
`main.rows=${last.mainState.rows}`,
|
|
177
|
+
`main.total="${last.mainState.totalText}"`,
|
|
178
|
+
`main.title="${last.mainState.title}"`,
|
|
179
|
+
`main.url=${last.mainState.url}`,
|
|
180
|
+
`main.body="${last.mainState.bodyPreview}"`,
|
|
181
|
+
`frameHit=${last.fromFrame ? 'yes' : 'no'}`,
|
|
182
|
+
`frame.url=${last.frameUrl}`,
|
|
183
|
+
].join(';'));
|
|
184
|
+
}
|
|
185
|
+
async function clickEditForJob(frame, job) {
|
|
186
|
+
const targetId = JSON.stringify(job.id ?? '');
|
|
187
|
+
const targetTitle = JSON.stringify(job.title ?? '');
|
|
188
|
+
const clicked = (await frame.evaluate(`(() => {
|
|
189
|
+
const jobId = ${targetId};
|
|
190
|
+
const title = ${targetTitle};
|
|
191
|
+
const norm = (v) => (v ?? "").replace(/\\s+/g, " ").trim();
|
|
192
|
+
const rows = Array.from(document.querySelectorAll(".job-jobInfo-warp"));
|
|
193
|
+
let row = null;
|
|
194
|
+
if (jobId) {
|
|
195
|
+
row = rows.find((el) => norm(el.getAttribute("data-id")) === jobId) ?? null;
|
|
196
|
+
}
|
|
197
|
+
if (!row && title) {
|
|
198
|
+
row = rows.find((el) => {
|
|
199
|
+
const t = norm(el.querySelector(".job-title a")?.textContent);
|
|
200
|
+
return t === title;
|
|
201
|
+
}) ?? null;
|
|
202
|
+
}
|
|
203
|
+
if (!row) return false;
|
|
204
|
+
const editBtn = row.querySelector(".position-edit");
|
|
205
|
+
if (!(editBtn instanceof HTMLElement)) return false;
|
|
206
|
+
editBtn.dispatchEvent(new MouseEvent("click", { bubbles: true, cancelable: true }));
|
|
207
|
+
editBtn.click();
|
|
208
|
+
return true;
|
|
209
|
+
})()`));
|
|
210
|
+
if (!clicked) {
|
|
211
|
+
throw new Error(`未找到职位“${job.title}”的编辑入口`);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
async function readJobDetailFromFrame(frame) {
|
|
215
|
+
const detail = (await frame.evaluate(`(() => {
|
|
216
|
+
const norm = (v) => (v ?? "").replace(/\\s+/g, " ").trim();
|
|
217
|
+
const root = document.querySelector(".job-edit-container.edit-job");
|
|
218
|
+
if (!root) {
|
|
219
|
+
return null;
|
|
220
|
+
}
|
|
221
|
+
const rows = Array.from(root.querySelectorAll(".form-row"));
|
|
222
|
+
const rowValueByTitle = {};
|
|
223
|
+
for (const row of rows) {
|
|
224
|
+
const title = norm(row.querySelector(".title")?.textContent);
|
|
225
|
+
if (!title) continue;
|
|
226
|
+
const content = norm(row.querySelector(".content")?.innerText);
|
|
227
|
+
if (content && !rowValueByTitle[title]) {
|
|
228
|
+
rowValueByTitle[title] = content;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
const salaryValues = Array.from(
|
|
232
|
+
root.querySelectorAll(".scope-selecter .scope-select .ui-select-selected-value"),
|
|
233
|
+
).map((el) => norm(el.textContent));
|
|
234
|
+
const keywordValues = Array.from(
|
|
235
|
+
root.querySelectorAll(".job-skill-content .job-skill-item, .job-skill-content .skill-tag, .job-skill-content .tag"),
|
|
236
|
+
)
|
|
237
|
+
.map((el) => norm(el.textContent))
|
|
238
|
+
.filter(Boolean);
|
|
239
|
+
const detail = {
|
|
240
|
+
pageTitle: document.title || "",
|
|
241
|
+
pageUrl: location.href,
|
|
242
|
+
company: norm(root.querySelector(".base-info .text-primary")?.textContent),
|
|
243
|
+
recruitmentType: norm(root.querySelector(".recruitment-type-wrap .ui-select-selected-value")?.textContent),
|
|
244
|
+
jobName:
|
|
245
|
+
norm(root.querySelector("input[name='jobName']")?.value) ||
|
|
246
|
+
norm(root.querySelector(".job-name input")?.value) ||
|
|
247
|
+
(rowValueByTitle["职位名称"] || ""),
|
|
248
|
+
description: norm(root.querySelector(".performance-row textarea")?.value),
|
|
249
|
+
overseas: norm(root.querySelector(".overseas-entry-container .chose-item.active")?.textContent),
|
|
250
|
+
jobCategory:
|
|
251
|
+
norm(root.querySelector("input[name='jobCategory']")?.value) ||
|
|
252
|
+
norm(root.querySelector(".job-category-tag-container")?.innerText),
|
|
253
|
+
experience:
|
|
254
|
+
norm(root.querySelector(".job-experience-row .experience-select .ui-select-selected-value")?.textContent) ||
|
|
255
|
+
(rowValueByTitle["经验"] || ""),
|
|
256
|
+
education:
|
|
257
|
+
norm(root.querySelector(".form-row .title")?.textContent?.includes("学历")
|
|
258
|
+
? root.querySelector(".form-row .experience-select .ui-select-selected-value")?.textContent
|
|
259
|
+
: "") ||
|
|
260
|
+
(rowValueByTitle["学历"] || ""),
|
|
261
|
+
salaryRange:
|
|
262
|
+
salaryValues.length >= 2 ? (salaryValues[0] + "-" + salaryValues[1]) : salaryValues.join("-"),
|
|
263
|
+
salaryMonths: norm(root.querySelector(".salaryMonth-select .ui-select-selected-value")?.textContent),
|
|
264
|
+
keywords: keywordValues.join("|"),
|
|
265
|
+
workLocation:
|
|
266
|
+
norm(root.querySelector(".job-address input.ipt")?.value) ||
|
|
267
|
+
(rowValueByTitle["工作地点"] || ""),
|
|
268
|
+
};
|
|
269
|
+
return detail;
|
|
270
|
+
})()`));
|
|
271
|
+
return detail;
|
|
272
|
+
}
|
|
273
|
+
async function waitForJobDetailReady(page, timeoutMs) {
|
|
274
|
+
const start = Date.now();
|
|
275
|
+
while (Date.now() - start < timeoutMs) {
|
|
276
|
+
for (const frame of page.frames()) {
|
|
277
|
+
try {
|
|
278
|
+
const detail = await readJobDetailFromFrame(frame);
|
|
279
|
+
if (detail) {
|
|
280
|
+
return detail;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
catch {
|
|
284
|
+
// ignore detached/cross-origin frame read errors
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
await sleepRandom(260, 520);
|
|
288
|
+
}
|
|
289
|
+
throw new Error('等待职位详情表单超时,未找到 .job-edit-container.edit-job');
|
|
290
|
+
}
|
|
291
|
+
async function closeJobDetailPanel(page, timeoutMs = 8_000) {
|
|
292
|
+
const start = Date.now();
|
|
293
|
+
while (Date.now() - start < timeoutMs) {
|
|
294
|
+
const backClicked = (await page.evaluate(CLICK_JD_BACK_BUTTON_SCRIPT));
|
|
295
|
+
if (backClicked) {
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
await sleepRandom(160, 360);
|
|
299
|
+
}
|
|
300
|
+
throw new Error('已读取职位详情,但未找到 top-nav 内可点击的返回按钮(.history-back-container .back-btn > i.iboss-right)。');
|
|
301
|
+
}
|
|
302
|
+
function formatJobDetailMarkdown(job, detail) {
|
|
303
|
+
return [
|
|
304
|
+
`# ${job.title}`,
|
|
305
|
+
'',
|
|
306
|
+
`- 状态: ${job.status || '未知'}`,
|
|
307
|
+
`- 标签: ${job.label || '无'}`,
|
|
308
|
+
'',
|
|
309
|
+
'## 基本信息',
|
|
310
|
+
`- 公司: ${detail.company || '未知'}`,
|
|
311
|
+
`- 招聘类型: ${detail.recruitmentType || '未知'}`,
|
|
312
|
+
`- 职位名称: ${detail.jobName || job.title}`,
|
|
313
|
+
`- 职位类型: ${detail.jobCategory || '未知'}`,
|
|
314
|
+
`- 是否驻外: ${detail.overseas || '未知'}`,
|
|
315
|
+
'',
|
|
316
|
+
'## 要求',
|
|
317
|
+
`- 经验: ${detail.experience || '未知'}`,
|
|
318
|
+
`- 学历: ${detail.education || '未知'}`,
|
|
319
|
+
`- 薪资范围: ${detail.salaryRange || '未知'}`,
|
|
320
|
+
`- 薪资月数: ${detail.salaryMonths || '未知'}`,
|
|
321
|
+
`- 关键词: ${detail.keywords || '无'}`,
|
|
322
|
+
`- 工作地点: ${detail.workLocation || '未知'}`,
|
|
323
|
+
'',
|
|
324
|
+
'## 职位描述',
|
|
325
|
+
detail.description || '(空)',
|
|
326
|
+
'',
|
|
327
|
+
].join('\n');
|
|
328
|
+
}
|
|
329
|
+
export async function runListOpenPositions(deps = {}) {
|
|
330
|
+
const settleMin = deps.settleWaitMsMin ?? JD_PAGE_SETTLE_MS.min;
|
|
331
|
+
const settleMax = deps.settleWaitMsMax ?? JD_PAGE_SETTLE_MS.max;
|
|
332
|
+
const detailMode = deps.detail === true;
|
|
333
|
+
const detailName = (deps.detailName ?? '').trim();
|
|
334
|
+
const projectDir = deps.projectDir ?? JD_DIR;
|
|
335
|
+
const detailWaitMs = deps.detailWaitMs ?? JD_DETAIL_DEFAULT_WAIT_MS;
|
|
336
|
+
if (detailMode && detailName) {
|
|
337
|
+
const candidates = cacheFileCandidates(projectDir, detailName);
|
|
338
|
+
for (const p of candidates) {
|
|
339
|
+
if (await fileExists(p)) {
|
|
340
|
+
return readFile(p, 'utf8');
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
try {
|
|
345
|
+
return await withBossSessionPage(async (page) => {
|
|
346
|
+
const currentUrl = page.url();
|
|
347
|
+
if (!isBossChatJobListUrl(currentUrl)) {
|
|
348
|
+
await clickBossSidebarMenuToPath(page, '职位管理', '/web/chat/job/list');
|
|
349
|
+
await sleepRandom(settleMin, settleMax);
|
|
350
|
+
}
|
|
351
|
+
if (!isBossChatJobListUrl(page.url())) {
|
|
352
|
+
throw new Error('通过侧边栏“职位管理”进入职位页失败,请确认已登录并可访问 /web/chat/job/list。');
|
|
353
|
+
}
|
|
354
|
+
const ready = await waitForJobRowsReady(page, 16_000);
|
|
355
|
+
await sleepRandom(350, 920);
|
|
356
|
+
const jobs = ready.data.jobs.filter((it) => it.title.length > 0);
|
|
357
|
+
const jobLines = jobs.map((it, idx) => {
|
|
358
|
+
const info = it.meta.length > 0 ? it.meta.join('|') : '信息缺失';
|
|
359
|
+
const stats = `看过我:${it.viewed}|沟通过:${it.chatted}|感兴趣:${it.interested}`;
|
|
360
|
+
const tag = it.label ? `|标签:${it.label}` : '';
|
|
361
|
+
const id = it.id ? `|ID:${it.id}` : '';
|
|
362
|
+
return `${idx + 1}. ${it.title}|状态:${it.status || '未知'}${tag}|${info}|${stats}${id}`;
|
|
363
|
+
});
|
|
364
|
+
const details = jobLines.length > 0 ? jobLines.join('\n') : '当前页面未读取到职位。';
|
|
365
|
+
const openCount = jobs.filter((it) => it.status.includes('开放中')).length;
|
|
366
|
+
const waitOpenCount = jobs.filter((it) => it.status.includes('待开放')).length;
|
|
367
|
+
const closedCount = jobs.filter((it) => it.status.includes('已关闭')).length;
|
|
368
|
+
const totalText = ready.data.totalText ? `(页面统计:${ready.data.totalText})` : '';
|
|
369
|
+
if (!detailMode) {
|
|
370
|
+
return [
|
|
371
|
+
`已读取 ${jobs.length} 个职位${totalText}。`,
|
|
372
|
+
`状态统计:开放中 ${openCount}|待开放 ${waitOpenCount}|已关闭 ${closedCount}`,
|
|
373
|
+
`来源页面:${BOSS_CHAT_JOB_LIST_URL}`,
|
|
374
|
+
`职位明细:\n${details}`,
|
|
375
|
+
].join('\n');
|
|
376
|
+
}
|
|
377
|
+
const targetJob = resolveTargetJob(jobs, detailName);
|
|
378
|
+
if (!targetJob) {
|
|
379
|
+
const available = jobs.slice(0, 8).map((j) => j.title).join('|');
|
|
380
|
+
throw new Error(`未找到职位“${detailName}”(支持名称和模糊匹配)。可选职位:${available || '(空)'}`);
|
|
381
|
+
}
|
|
382
|
+
const candidates = cacheFileCandidates(projectDir, targetJob.title);
|
|
383
|
+
const listCtx = await waitForJobRowsReady(page, 16_000);
|
|
384
|
+
await clickEditForJob(listCtx.frame, targetJob);
|
|
385
|
+
await sleepRandom(detailWaitMs, detailWaitMs);
|
|
386
|
+
const detail = await waitForJobDetailReady(page, 12_000);
|
|
387
|
+
const outPath = candidates[candidates.length - 1];
|
|
388
|
+
const markdown = formatJobDetailMarkdown(targetJob, detail);
|
|
389
|
+
await writeFile(outPath, markdown, 'utf8');
|
|
390
|
+
try {
|
|
391
|
+
await closeJobDetailPanel(page);
|
|
392
|
+
}
|
|
393
|
+
catch (closeError) {
|
|
394
|
+
const msg = closeError instanceof Error ? closeError.message : String(closeError);
|
|
395
|
+
console.warn(`[boss-cli] jd detail close warning: ${msg}`);
|
|
396
|
+
}
|
|
397
|
+
return markdown;
|
|
398
|
+
});
|
|
399
|
+
}
|
|
400
|
+
catch (e) {
|
|
401
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
402
|
+
console.error(`[boss-cli] list_open_positions error: ${message}`);
|
|
403
|
+
throw new Error(`获取岗位列表失败:${message}`);
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
//# sourceMappingURL=jd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jd.js","sourceRoot":"","sources":["../../src/toolset/jd.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Page } from 'puppeteer-core';
|
|
2
|
+
export declare function ensureChatListReady(page: Page, filter?: 'all' | 'unread'): Promise<void>;
|
|
3
|
+
export declare function runGetCandidateList(opts?: {
|
|
4
|
+
unreadOnly?: boolean;
|
|
5
|
+
}): Promise<string>;
|
|
6
|
+
//# sourceMappingURL=list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/toolset/list.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AA0F3C,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,IAAI,EACV,MAAM,GAAE,KAAK,GAAG,QAAgB,GAC/B,OAAO,CAAC,IAAI,CAAC,CA2Bf;AAED,wBAAsB,mBAAmB,CACvC,IAAI,GAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAO,GAClC,OAAO,CAAC,MAAM,CAAC,CA8DjB"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { LIST_FILTER_GAP_MS, LIST_MIN_BEFORE_EMPTY_OK_MS, LIST_POLL_MS, sleepRandom, } from '../browser/index.js';
|
|
2
|
+
import { BOSS_CHAT_INDEX_URL, isBossChatIndexUrl } from '../common/auth.js';
|
|
3
|
+
import { ensurePage } from '../common/ensure_page.js';
|
|
4
|
+
import { withBossSessionPage } from '../common/boss_session_page.js';
|
|
5
|
+
async function waitForCandidateListSettled(page, opts) {
|
|
6
|
+
const start = Date.now();
|
|
7
|
+
let prev = -1;
|
|
8
|
+
let stable = 0;
|
|
9
|
+
while (Date.now() - start < opts.timeoutMs) {
|
|
10
|
+
const n = (await page.evaluate(`(() => document.querySelectorAll(".geek-item").length)()`));
|
|
11
|
+
const elapsed = Date.now() - start;
|
|
12
|
+
if (n === prev) {
|
|
13
|
+
stable++;
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
prev = n;
|
|
17
|
+
stable = 1;
|
|
18
|
+
}
|
|
19
|
+
if (stable >= 2) {
|
|
20
|
+
if (n > 0) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
if (n === 0 && elapsed >= opts.minMsBeforeEmptyOk) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
await sleepRandom(opts.pollMsMin, opts.pollMsMax);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
async function clickChatFilterTab(page, label) {
|
|
31
|
+
const labelLiteral = JSON.stringify(label);
|
|
32
|
+
await page.evaluate(`(() => {
|
|
33
|
+
const targetText = ${labelLiteral};
|
|
34
|
+
const container = document.querySelector(".chat-message-filter-left");
|
|
35
|
+
if (!container) {
|
|
36
|
+
throw new Error("未找到聊天筛选容器:.chat-message-filter-left");
|
|
37
|
+
}
|
|
38
|
+
const spans = Array.from(container.querySelectorAll("span"));
|
|
39
|
+
const norm = (v) => (v ?? "").replace(/\\s+/g, "");
|
|
40
|
+
const target = spans.find((el) => norm(el.textContent).includes(targetText));
|
|
41
|
+
if (!target) {
|
|
42
|
+
const labels = spans.map((el) => norm(el.textContent)).filter(Boolean).join(",");
|
|
43
|
+
throw new Error("未找到聊天筛选项:" + targetText + ";当前筛选项:" + (labels || "空"));
|
|
44
|
+
}
|
|
45
|
+
target.dispatchEvent(new MouseEvent("click", { bubbles: true, cancelable: true }));
|
|
46
|
+
target.click();
|
|
47
|
+
})()`);
|
|
48
|
+
}
|
|
49
|
+
async function waitForChatFilterTabSelected(page, label) {
|
|
50
|
+
const labelLiteral = JSON.stringify(label);
|
|
51
|
+
await page.waitForFunction(`(() => {
|
|
52
|
+
const targetText = ${labelLiteral};
|
|
53
|
+
const container = document.querySelector(".chat-message-filter-left");
|
|
54
|
+
if (!container) return false;
|
|
55
|
+
const norm = (v) => (v ?? "").replace(/\\s+/g, "");
|
|
56
|
+
const tabs = Array.from(container.querySelectorAll("span"));
|
|
57
|
+
const tab = tabs.find((el) => norm(el.textContent).includes(targetText));
|
|
58
|
+
if (!tab) return false;
|
|
59
|
+
const cls = String(tab.className || "");
|
|
60
|
+
const selectedByClass = /active|selected|current|checked/.test(cls);
|
|
61
|
+
const selectedByAria = tab.getAttribute("aria-selected") === "true";
|
|
62
|
+
const selectedByAncestor = !!tab.closest(".active, .selected, .current, .checked");
|
|
63
|
+
return selectedByClass || selectedByAria || selectedByAncestor;
|
|
64
|
+
})()`, { timeout: 8_000 });
|
|
65
|
+
}
|
|
66
|
+
export async function ensureChatListReady(page, filter = 'all') {
|
|
67
|
+
await ensurePage(page, {
|
|
68
|
+
name: '沟通列表页',
|
|
69
|
+
targetUrl: BOSS_CHAT_INDEX_URL,
|
|
70
|
+
matches: isBossChatIndexUrl,
|
|
71
|
+
});
|
|
72
|
+
await page.waitForFunction(`(() => {
|
|
73
|
+
const filter = document.querySelector(".chat-message-filter-left");
|
|
74
|
+
if (!filter) return false;
|
|
75
|
+
const tabs = Array.from(filter.querySelectorAll("span"));
|
|
76
|
+
return tabs.length >= 2;
|
|
77
|
+
})()`, { timeout: 15_000 });
|
|
78
|
+
const filterLabel = filter === 'unread' ? '未读' : '全部';
|
|
79
|
+
await clickChatFilterTab(page, filterLabel);
|
|
80
|
+
await sleepRandom(LIST_FILTER_GAP_MS.min, LIST_FILTER_GAP_MS.max);
|
|
81
|
+
await waitForChatFilterTabSelected(page, filterLabel);
|
|
82
|
+
await waitForCandidateListSettled(page, {
|
|
83
|
+
timeoutMs: 18_000,
|
|
84
|
+
pollMsMin: LIST_POLL_MS.min,
|
|
85
|
+
pollMsMax: LIST_POLL_MS.max,
|
|
86
|
+
minMsBeforeEmptyOk: LIST_MIN_BEFORE_EMPTY_OK_MS,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
export async function runGetCandidateList(opts = {}) {
|
|
90
|
+
const unreadOnly = opts.unreadOnly === true;
|
|
91
|
+
try {
|
|
92
|
+
return await withBossSessionPage(async (page) => {
|
|
93
|
+
// 始终加载「全部」列表再在客户端按未读角标过滤:
|
|
94
|
+
// Boss v10718+ 改版后「未读」筛选 tab 点击失效/筛出空列表,不能依赖平台过滤。
|
|
95
|
+
await ensureChatListReady(page, 'all');
|
|
96
|
+
const items = (await page.evaluate(`(() => {
|
|
97
|
+
const norm = (v) => (v ?? "").replace(/\\s+/g, " ").trim();
|
|
98
|
+
return Array.from(document.querySelectorAll(".geek-item")).map((el) => {
|
|
99
|
+
const name = norm(el.querySelector(".geek-name")?.textContent);
|
|
100
|
+
const job = norm(el.querySelector(".source-job")?.textContent);
|
|
101
|
+
const time = norm(el.querySelector(".time")?.textContent);
|
|
102
|
+
const message = norm(el.querySelector(".push-text")?.textContent);
|
|
103
|
+
const badge = el.querySelector(".badge-count");
|
|
104
|
+
let unreadCount = 0;
|
|
105
|
+
if (badge) {
|
|
106
|
+
const digits = norm(badge.textContent).replace(/\\D/g, "");
|
|
107
|
+
if (digits) unreadCount = parseInt(digits, 10) || 0;
|
|
108
|
+
}
|
|
109
|
+
return { name, job, time, message, unreadCount };
|
|
110
|
+
});
|
|
111
|
+
})()`));
|
|
112
|
+
const candidates = items.filter((it) => it.name);
|
|
113
|
+
const withUnread = candidates.filter((it) => it.unreadCount > 0).length;
|
|
114
|
+
const visible = unreadOnly
|
|
115
|
+
? candidates.filter((it) => it.unreadCount > 0)
|
|
116
|
+
: candidates;
|
|
117
|
+
const lines = visible.map((it, idx) => {
|
|
118
|
+
const base = `${idx + 1}. ${it.name}${it.job ? `|${it.job}` : ''}`;
|
|
119
|
+
const meta = [
|
|
120
|
+
it.unreadCount > 0 ? `未读:${it.unreadCount}` : '',
|
|
121
|
+
it.time ? `时间:${it.time}` : '',
|
|
122
|
+
it.message ? `消息:${it.message}` : '',
|
|
123
|
+
]
|
|
124
|
+
.filter(Boolean)
|
|
125
|
+
.join('|');
|
|
126
|
+
return meta ? `${base}|${meta}` : base;
|
|
127
|
+
});
|
|
128
|
+
const previewText = lines.length > 0 ? `候选人明细:\n${lines.join('\n')}` : '候选人明细:暂无。';
|
|
129
|
+
return [
|
|
130
|
+
unreadOnly
|
|
131
|
+
? `未读筛选:共 ${visible.length} 人(从全量列表按未读角标筛选)。`
|
|
132
|
+
: `沟通列表共 ${candidates.length} 人,其中 ${withUnread} 人有未读消息。`,
|
|
133
|
+
previewText,
|
|
134
|
+
]
|
|
135
|
+
.filter(Boolean)
|
|
136
|
+
.join('\n');
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
catch (e) {
|
|
140
|
+
if (e instanceof Error) {
|
|
141
|
+
throw e;
|
|
142
|
+
}
|
|
143
|
+
throw new Error(`获取候选人列表失败:${String(e)}`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/toolset/list.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/toolset/login.ts"],"names":[],"mappings":"AAyCA;;;GAGG;AACH,wBAAsB,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,CA+ChD"}
|