@joohw/boss-cli 0.3.5 → 0.4.1
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/README.md +11 -14
- package/dist/browser/agent_operating_indicator.js +51 -51
- package/dist/browser/human_delay.d.ts +2 -0
- package/dist/browser/human_delay.d.ts.map +1 -1
- package/dist/browser/human_delay.js +4 -0
- package/dist/browser/human_delay.js.map +1 -1
- package/dist/cli/cliRouter.js +10 -10
- package/dist/cli/cliRouter.js.map +1 -1
- package/dist/common/auth.js +49 -49
- package/dist/common/boss_paywall_popup.js +87 -87
- 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 +2 -2
- package/dist/common/boss_session_page.d.ts.map +1 -1
- package/dist/common/boss_session_page.js +66 -74
- package/dist/common/boss_session_page.js.map +1 -1
- package/dist/common/boss_sidebar_nav.js +25 -26
- package/dist/common/boss_sidebar_nav.js.map +1 -1
- package/dist/common/c_resume_capture.d.ts +1 -0
- package/dist/common/c_resume_capture.d.ts.map +1 -1
- package/dist/common/c_resume_capture.js +69 -32
- package/dist/common/c_resume_capture.js.map +1 -1
- package/dist/ocr/resume_ocr.d.ts.map +1 -1
- package/dist/ocr/resume_ocr.js +4 -1
- package/dist/ocr/resume_ocr.js.map +1 -1
- package/dist/toolset/action.d.ts.map +1 -1
- package/dist/toolset/action.js +11 -7
- package/dist/toolset/action.js.map +1 -1
- package/dist/toolset/chat.d.ts.map +1 -1
- package/dist/toolset/chat.js +246 -230
- package/dist/toolset/chat.js.map +1 -1
- package/dist/toolset/deep-search.d.ts +1 -1
- package/dist/toolset/deep-search.d.ts.map +1 -1
- package/dist/toolset/deep-search.js +291 -281
- package/dist/toolset/deep-search.js.map +1 -1
- package/dist/toolset/greet.d.ts.map +1 -1
- package/dist/toolset/greet.js +2 -7
- package/dist/toolset/greet.js.map +1 -1
- package/dist/toolset/jd.d.ts.map +1 -1
- package/dist/toolset/jd.js +134 -142
- package/dist/toolset/jd.js.map +1 -1
- package/dist/toolset/list.d.ts.map +1 -1
- package/dist/toolset/list.js +52 -45
- package/dist/toolset/list.js.map +1 -1
- package/dist/toolset/preview.d.ts.map +1 -1
- package/dist/toolset/preview.js +7 -9
- package/dist/toolset/preview.js.map +1 -1
- package/dist/toolset/recommend.d.ts +1 -1
- package/dist/toolset/recommend.d.ts.map +1 -1
- package/dist/toolset/recommend.js +223 -210
- package/dist/toolset/recommend.js.map +1 -1
- package/dist/toolset/send.d.ts.map +1 -1
- package/dist/toolset/send.js +6 -9
- package/dist/toolset/send.js.map +1 -1
- package/package.json +65 -63
- package/dist/browser/auth.d.ts +0 -33
- package/dist/browser/auth.d.ts.map +0 -1
- package/dist/browser/auth.js +0 -137
- package/dist/browser/auth.js.map +0 -1
- package/dist/browser/c_resume_capture.d.ts +0 -11
- package/dist/browser/c_resume_capture.d.ts.map +0 -1
- package/dist/browser/c_resume_capture.js +0 -76
- package/dist/browser/c_resume_capture.js.map +0 -1
- package/dist/browser/chat.d.ts +0 -7
- package/dist/browser/chat.d.ts.map +0 -1
- package/dist/browser/chat.js +0 -155
- package/dist/browser/chat.js.map +0 -1
- package/dist/browser/withLoggedInPage.d.ts +0 -7
- package/dist/browser/withLoggedInPage.d.ts.map +0 -1
- package/dist/browser/withLoggedInPage.js +0 -19
- package/dist/browser/withLoggedInPage.js.map +0 -1
- package/dist/facebook-cli/index.d.ts +0 -2
- package/dist/facebook-cli/index.d.ts.map +0 -1
- package/dist/facebook-cli/index.js +0 -2
- package/dist/facebook-cli/index.js.map +0 -1
- package/dist/toolset/c_resume_capture.d.ts +0 -11
- package/dist/toolset/c_resume_capture.d.ts.map +0 -1
- package/dist/toolset/c_resume_capture.js +0 -76
- package/dist/toolset/c_resume_capture.js.map +0 -1
- package/dist/toolset/chat_action.d.ts +0 -7
- package/dist/toolset/chat_action.d.ts.map +0 -1
- package/dist/toolset/chat_action.js +0 -355
- package/dist/toolset/chat_action.js.map +0 -1
- package/dist/toolset/list_candidates.d.ts +0 -4
- package/dist/toolset/list_candidates.d.ts.map +0 -1
- package/dist/toolset/list_candidates.js +0 -120
- package/dist/toolset/list_candidates.js.map +0 -1
- package/dist/toolset/list_positions.d.ts +0 -9
- package/dist/toolset/list_positions.d.ts.map +0 -1
- package/dist/toolset/list_positions.js +0 -41
- package/dist/toolset/list_positions.js.map +0 -1
- package/dist/toolset/open_chat.d.ts +0 -3
- package/dist/toolset/open_chat.d.ts.map +0 -1
- package/dist/toolset/open_chat.js +0 -423
- package/dist/toolset/open_chat.js.map +0 -1
- package/dist/toolset/recommend_greet.d.ts +0 -2
- package/dist/toolset/recommend_greet.d.ts.map +0 -1
- package/dist/toolset/recommend_greet.js +0 -27
- package/dist/toolset/recommend_greet.js.map +0 -1
- package/dist/toolset/search.d.ts +0 -24
- package/dist/toolset/search.d.ts.map +0 -1
- package/dist/toolset/search.js +0 -682
- package/dist/toolset/search.js.map +0 -1
- package/dist/toolset/send_message.d.ts +0 -12
- package/dist/toolset/send_message.d.ts.map +0 -1
- package/dist/toolset/send_message.js +0 -214
- package/dist/toolset/send_message.js.map +0 -1
- package/dist/toolset/skill.d.ts +0 -13
- package/dist/toolset/skill.d.ts.map +0 -1
- package/dist/toolset/skill.js +0 -85
- package/dist/toolset/skill.js.map +0 -1
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import type { Page } from 'puppeteer-core';
|
|
2
|
-
/** 截图文件名安全段(在线简历 / 推荐预览共用) */
|
|
3
|
-
export declare function safeResumeScreenshotFileBase(name: string): string;
|
|
4
|
-
/** 关闭含 `c-resume` iframe 的弹层(聊天「在线简历」与推荐「预览」共用)。 */
|
|
5
|
-
export declare function closeCResumePanel(page: Page): Promise<void>;
|
|
6
|
-
/**
|
|
7
|
-
* 在已出现 `c-resume` iframe 的页面上,对 iframe 整框截图并关闭弹层。
|
|
8
|
-
* `preOpenViewport` 为打开弹层前 `page.viewport()` 的快照(与在线简历截图一致)。
|
|
9
|
-
*/
|
|
10
|
-
export declare function captureCResumeIframeToFile(page: Page, preOpenViewport: Awaited<ReturnType<Page['viewport']>>, absPath: string): Promise<boolean>;
|
|
11
|
-
//# sourceMappingURL=c_resume_capture.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"c_resume_capture.d.ts","sourceRoot":"","sources":["../../src/toolset/c_resume_capture.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAI3C,8BAA8B;AAC9B,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGjE;AAED,oDAAoD;AACpD,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BjE;AAED;;;GAGG;AACH,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,IAAI,EACV,eAAe,EAAE,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EACtD,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,OAAO,CAAC,CAmClB"}
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
import { sleepRandom } from '../browser/timing.js';
|
|
2
|
-
import { resumeHeight, setTempHeight } from '../browser/viewport_temp.js';
|
|
3
|
-
/** 截图文件名安全段(在线简历 / 推荐预览共用) */
|
|
4
|
-
export function safeResumeScreenshotFileBase(name) {
|
|
5
|
-
const t = name.replace(/[/\\?%*:|"<>]/g, '_').trim().slice(0, 64);
|
|
6
|
-
return t.length > 0 ? t : 'candidate';
|
|
7
|
-
}
|
|
8
|
-
/** 关闭含 `c-resume` iframe 的弹层(聊天「在线简历」与推荐「预览」共用)。 */
|
|
9
|
-
export async function closeCResumePanel(page) {
|
|
10
|
-
try {
|
|
11
|
-
await page.evaluate(() => {
|
|
12
|
-
const wraps = Array.from(document.querySelectorAll('.boss-popup__wrapper'));
|
|
13
|
-
for (const w of wraps) {
|
|
14
|
-
if (w.querySelector('iframe[src*="c-resume"], iframe[src*="frame/c-resume"]')) {
|
|
15
|
-
const c = w.querySelector('.boss-popup__close');
|
|
16
|
-
if (c) {
|
|
17
|
-
c.click();
|
|
18
|
-
return;
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
const iframe = document.querySelector('iframe[src*="c-resume"], iframe[src*="frame/c-resume"]');
|
|
23
|
-
let node = iframe?.parentElement ?? null;
|
|
24
|
-
for (let i = 0; i < 12 && node; i++) {
|
|
25
|
-
const c = node.querySelector('.boss-popup__close, .drawer-close, .icon-close');
|
|
26
|
-
if (c) {
|
|
27
|
-
c.click();
|
|
28
|
-
return;
|
|
29
|
-
}
|
|
30
|
-
node = node.parentElement;
|
|
31
|
-
}
|
|
32
|
-
});
|
|
33
|
-
await sleepRandom(200, 450);
|
|
34
|
-
}
|
|
35
|
-
catch {
|
|
36
|
-
/* ignore */
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* 在已出现 `c-resume` iframe 的页面上,对 iframe 整框截图并关闭弹层。
|
|
41
|
-
* `preOpenViewport` 为打开弹层前 `page.viewport()` 的快照(与在线简历截图一致)。
|
|
42
|
-
*/
|
|
43
|
-
export async function captureCResumeIframeToFile(page, preOpenViewport, absPath) {
|
|
44
|
-
try {
|
|
45
|
-
await setTempHeight(page, preOpenViewport);
|
|
46
|
-
await sleepRandom(100, 320);
|
|
47
|
-
const iframe = await page.$('iframe[src*="c-resume"], iframe[src*="frame/c-resume"]');
|
|
48
|
-
if (!iframe) {
|
|
49
|
-
return false;
|
|
50
|
-
}
|
|
51
|
-
await iframe.evaluate((el) => {
|
|
52
|
-
el.scrollIntoView({ block: 'start', inline: 'nearest' });
|
|
53
|
-
});
|
|
54
|
-
const box = await iframe.boundingBox();
|
|
55
|
-
if (!box) {
|
|
56
|
-
await iframe.dispose();
|
|
57
|
-
return false;
|
|
58
|
-
}
|
|
59
|
-
try {
|
|
60
|
-
await iframe.screenshot({
|
|
61
|
-
path: absPath,
|
|
62
|
-
type: 'png',
|
|
63
|
-
captureBeyondViewport: true,
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
finally {
|
|
67
|
-
await iframe.dispose();
|
|
68
|
-
}
|
|
69
|
-
await closeCResumePanel(page);
|
|
70
|
-
return true;
|
|
71
|
-
}
|
|
72
|
-
finally {
|
|
73
|
-
await resumeHeight(page, preOpenViewport);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
//# sourceMappingURL=c_resume_capture.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"c_resume_capture.js","sourceRoot":"","sources":["../../src/toolset/c_resume_capture.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import type { Page } from 'puppeteer-core';
|
|
2
|
-
export type ChatPageAction = 'online-resume' | 'not-fit' | 'remark';
|
|
3
|
-
export declare function runChatActionOnCurrentConversation(page: Page, options: {
|
|
4
|
-
action: ChatPageAction;
|
|
5
|
-
remark?: string;
|
|
6
|
-
}): Promise<string>;
|
|
7
|
-
//# sourceMappingURL=chat_action.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"chat_action.d.ts","sourceRoot":"","sources":["../../src/toolset/chat_action.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAoX3C,MAAM,MAAM,cAAc,GAAG,eAAe,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEpE,wBAAsB,kCAAkC,CACtD,IAAI,EAAE,IAAI,EACV,OAAO,EAAE;IAAE,MAAM,EAAE,cAAc,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACnD,OAAO,CAAC,MAAM,CAAC,CA8BjB"}
|
|
@@ -1,355 +0,0 @@
|
|
|
1
|
-
import { join } from 'node:path';
|
|
2
|
-
import { defaultViewportFromEnv, isBossChatIndexUrl, ONLINE_RESUME_IFRAME_APPEAR_MS, ONLINE_RESUME_IFRAME_SETTLE_MS, sleepRandom, } from '../browser/index.js';
|
|
3
|
-
import { ensureAppDataLayout, RESUME_SCREENSHOTS_DIR } from '../config.js';
|
|
4
|
-
import { isResumeOcrEnabled, ocrResumePngToTextFile } from '../ocr/index.js';
|
|
5
|
-
/** 在线简历截图前临时拉高的视口高度(CSS px)。可用 `BOSS_RESUME_SCREENSHOT_VIEWPORT_HEIGHT` 覆盖。 */
|
|
6
|
-
const ONLINE_RESUME_SNAPSHOT_VIEWPORT_HEIGHT_PX = 5000;
|
|
7
|
-
function safeResumeFileBase(name) {
|
|
8
|
-
const t = name.replace(/[/\\?%*:|"<>]/g, '_').trim().slice(0, 64);
|
|
9
|
-
return t.length > 0 ? t : 'candidate';
|
|
10
|
-
}
|
|
11
|
-
function viewportForOnlineResumeSnapshot(prev) {
|
|
12
|
-
const envH = Number.parseInt(process.env.BOSS_RESUME_SCREENSHOT_VIEWPORT_HEIGHT?.trim() ?? '', 10);
|
|
13
|
-
const height = Number.isFinite(envH) && envH > 0 ? envH : ONLINE_RESUME_SNAPSHOT_VIEWPORT_HEIGHT_PX;
|
|
14
|
-
const base = defaultViewportFromEnv();
|
|
15
|
-
return {
|
|
16
|
-
width: prev?.width ?? base.width,
|
|
17
|
-
height,
|
|
18
|
-
deviceScaleFactor: prev?.deviceScaleFactor ?? 1,
|
|
19
|
-
isMobile: prev?.isMobile ?? false,
|
|
20
|
-
hasTouch: prev?.hasTouch ?? false,
|
|
21
|
-
isLandscape: prev?.isLandscape ?? false,
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
function viewportRestoreAfterResumeSnapshot(prev) {
|
|
25
|
-
if (prev) {
|
|
26
|
-
return prev;
|
|
27
|
-
}
|
|
28
|
-
const d = defaultViewportFromEnv();
|
|
29
|
-
return {
|
|
30
|
-
width: d.width,
|
|
31
|
-
height: d.height,
|
|
32
|
-
deviceScaleFactor: 1,
|
|
33
|
-
isMobile: false,
|
|
34
|
-
hasTouch: false,
|
|
35
|
-
isLandscape: false,
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
function ensureInCandidateChat(page, actionLabel) {
|
|
39
|
-
return (async () => {
|
|
40
|
-
const currentUrl = page.url();
|
|
41
|
-
if (!isBossChatIndexUrl(currentUrl)) {
|
|
42
|
-
throw new Error('请先进入聊天列表页(/web/chat/index)并打开候选人聊天。');
|
|
43
|
-
}
|
|
44
|
-
const inCandidateChat = await page.$('.base-info-single-container');
|
|
45
|
-
if (!inCandidateChat) {
|
|
46
|
-
throw new Error(`请先打开候选人聊天详情页,再执行“${actionLabel}”操作。`);
|
|
47
|
-
}
|
|
48
|
-
})();
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* 在聊天页右侧操作区执行「不合适」:
|
|
52
|
-
* 仅点击入口与底部确认按钮,不选择任何原因。
|
|
53
|
-
*/
|
|
54
|
-
async function markCandidateNotFitWithoutReason(page) {
|
|
55
|
-
await ensureInCandidateChat(page, '不合适');
|
|
56
|
-
const opened = (await page.evaluate(`(() => {
|
|
57
|
-
const norm = (v) => (v ?? "").replace(/\\s+/g, "").trim();
|
|
58
|
-
const roots = Array.from(document.querySelectorAll(".operate-exchange-right .operate-icon-item, .operate-icon-item"));
|
|
59
|
-
const target = roots.find((el) => {
|
|
60
|
-
const t = norm(el.querySelector(".operate-btn")?.textContent || el.textContent || "");
|
|
61
|
-
return t.includes("不合适");
|
|
62
|
-
});
|
|
63
|
-
if (!target) return false;
|
|
64
|
-
const btn = target.querySelector(".operate-btn");
|
|
65
|
-
const host = btn || target;
|
|
66
|
-
host.scrollIntoView({ block: "center", inline: "nearest" });
|
|
67
|
-
host.click();
|
|
68
|
-
return true;
|
|
69
|
-
})()`));
|
|
70
|
-
if (!opened) {
|
|
71
|
-
throw new Error('未找到“不合适”按钮,无法执行操作。');
|
|
72
|
-
}
|
|
73
|
-
await sleepRandom(260, 620);
|
|
74
|
-
const confirmed = (await page.evaluate(`(() => {
|
|
75
|
-
function norm(v) {
|
|
76
|
-
return (v ?? "").replace(/\\s+/g, "").trim();
|
|
77
|
-
}
|
|
78
|
-
function isVisible(el) {
|
|
79
|
-
if (!(el instanceof HTMLElement)) return false;
|
|
80
|
-
const st = window.getComputedStyle(el);
|
|
81
|
-
if (st.display === "none" || st.visibility === "hidden") return false;
|
|
82
|
-
const r = el.getBoundingClientRect();
|
|
83
|
-
return r.width > 0 && r.height > 0;
|
|
84
|
-
}
|
|
85
|
-
const wrappers = Array.from(document.querySelectorAll(".not-fit-wrap"))
|
|
86
|
-
.filter((el) => isVisible(el) && !!el.querySelector(".main-content"));
|
|
87
|
-
if (wrappers.length === 0) return false;
|
|
88
|
-
const wrapper = wrappers[wrappers.length - 1];
|
|
89
|
-
const candidates = Array.from(
|
|
90
|
-
wrapper.querySelectorAll(
|
|
91
|
-
".boss-btn-primary, .boss-btn, button, .footer .btn, .bottom .btn, .submit-btn, .confirm-btn",
|
|
92
|
-
),
|
|
93
|
-
).filter((el) => isVisible(el));
|
|
94
|
-
if (candidates.length === 0) return false;
|
|
95
|
-
|
|
96
|
-
const preferred = candidates.filter((el) => {
|
|
97
|
-
const t = norm(el.textContent);
|
|
98
|
-
return (
|
|
99
|
-
t.includes("确定") ||
|
|
100
|
-
t.includes("确认") ||
|
|
101
|
-
t.includes("提交") ||
|
|
102
|
-
t.includes("完成") ||
|
|
103
|
-
t.includes("不合适")
|
|
104
|
-
);
|
|
105
|
-
});
|
|
106
|
-
const pool = preferred.length > 0 ? preferred : candidates;
|
|
107
|
-
pool.sort((a, b) => a.getBoundingClientRect().top - b.getBoundingClientRect().top);
|
|
108
|
-
const target = pool[pool.length - 1];
|
|
109
|
-
target.scrollIntoView({ block: "center", inline: "nearest" });
|
|
110
|
-
target.click();
|
|
111
|
-
return true;
|
|
112
|
-
})()`));
|
|
113
|
-
if (!confirmed) {
|
|
114
|
-
throw new Error('已点击“不合适”,但未找到底部确认按钮。');
|
|
115
|
-
}
|
|
116
|
-
await sleepRandom(320, 880);
|
|
117
|
-
return '已标记为不合适(未选择原因,已点击底部确认按钮)。';
|
|
118
|
-
}
|
|
119
|
-
/**
|
|
120
|
-
* 在聊天页通过「更多 -> 备注」更新候选人备注,并点击确认保存。
|
|
121
|
-
*/
|
|
122
|
-
async function updateCandidateRemark(page, remarkText) {
|
|
123
|
-
const nextRemark = remarkText.trim();
|
|
124
|
-
if (!nextRemark) {
|
|
125
|
-
throw new Error('备注内容不能为空。');
|
|
126
|
-
}
|
|
127
|
-
if (nextRemark.length > 120) {
|
|
128
|
-
throw new Error(`备注内容过长(${nextRemark.length}/120),请缩短后重试。`);
|
|
129
|
-
}
|
|
130
|
-
await ensureInCandidateChat(page, '备注');
|
|
131
|
-
const openedMoreMenu = (await page.evaluate(`(() => {
|
|
132
|
-
function norm(v) {
|
|
133
|
-
return (v ?? "").replace(/\\s+/g, "").trim();
|
|
134
|
-
}
|
|
135
|
-
const items = Array.from(
|
|
136
|
-
document.querySelectorAll(".operate-exchange-right .operate-icon-item, .operate-icon-item"),
|
|
137
|
-
);
|
|
138
|
-
const more = items.find((el) => {
|
|
139
|
-
const t = norm(el.querySelector(".operate-btn")?.textContent || el.textContent || "");
|
|
140
|
-
return t.includes("更多");
|
|
141
|
-
});
|
|
142
|
-
if (!more) return false;
|
|
143
|
-
const btn = more.querySelector(".operate-btn");
|
|
144
|
-
const host = btn || more;
|
|
145
|
-
host.scrollIntoView({ block: "center", inline: "nearest" });
|
|
146
|
-
host.click();
|
|
147
|
-
return true;
|
|
148
|
-
})()`));
|
|
149
|
-
if (!openedMoreMenu) {
|
|
150
|
-
throw new Error('未找到“更多”按钮,无法打开备注菜单。');
|
|
151
|
-
}
|
|
152
|
-
await sleepRandom(120, 300);
|
|
153
|
-
const clickedRemarkItem = (await page.evaluate(`(() => {
|
|
154
|
-
function norm(v) {
|
|
155
|
-
return (v ?? "").replace(/\\s+/g, "").trim();
|
|
156
|
-
}
|
|
157
|
-
function isVisible(el) {
|
|
158
|
-
if (!(el instanceof HTMLElement)) return false;
|
|
159
|
-
const st = window.getComputedStyle(el);
|
|
160
|
-
if (st.display === "none" || st.visibility === "hidden") return false;
|
|
161
|
-
const r = el.getBoundingClientRect();
|
|
162
|
-
return r.width > 0 && r.height > 0;
|
|
163
|
-
}
|
|
164
|
-
const items = Array.from(document.querySelectorAll(".more-list .item"))
|
|
165
|
-
.filter((el) => isVisible(el));
|
|
166
|
-
const remark = items.find((el) => norm(el.textContent).includes("备注"));
|
|
167
|
-
if (!remark) return false;
|
|
168
|
-
remark.scrollIntoView({ block: "center", inline: "nearest" });
|
|
169
|
-
remark.click();
|
|
170
|
-
return true;
|
|
171
|
-
})()`));
|
|
172
|
-
if (!clickedRemarkItem) {
|
|
173
|
-
throw new Error('未找到“备注”菜单项,无法打开备注弹窗。');
|
|
174
|
-
}
|
|
175
|
-
const textareaSel = '.boss-dialog__wrapper.dialog-default-v2 .dialog-geek-remark textarea.input, ' +
|
|
176
|
-
'.boss-popup__wrapper.dialog-default-v2 .dialog-geek-remark textarea.input';
|
|
177
|
-
const textarea = await page.waitForSelector(textareaSel, { timeout: 12_000 }).catch(() => null);
|
|
178
|
-
if (!textarea) {
|
|
179
|
-
throw new Error('已点击“备注”,但未出现备注输入弹窗。');
|
|
180
|
-
}
|
|
181
|
-
const filled = (await page.evaluate(`((text, selector) => {
|
|
182
|
-
const el = document.querySelector(selector);
|
|
183
|
-
if (!(el instanceof HTMLTextAreaElement)) return false;
|
|
184
|
-
el.focus();
|
|
185
|
-
el.value = text;
|
|
186
|
-
el.dispatchEvent(new Event("input", { bubbles: true }));
|
|
187
|
-
el.dispatchEvent(new Event("change", { bubbles: true }));
|
|
188
|
-
return true;
|
|
189
|
-
})`, nextRemark, textareaSel));
|
|
190
|
-
if (!filled) {
|
|
191
|
-
throw new Error('未找到备注输入框,无法填写备注。');
|
|
192
|
-
}
|
|
193
|
-
await sleepRandom(120, 280);
|
|
194
|
-
const confirmed = (await page.evaluate(`(() => {
|
|
195
|
-
function norm(v) {
|
|
196
|
-
return (v ?? "").replace(/\\s+/g, "").trim();
|
|
197
|
-
}
|
|
198
|
-
function isVisible(el) {
|
|
199
|
-
if (!(el instanceof HTMLElement)) return false;
|
|
200
|
-
const st = window.getComputedStyle(el);
|
|
201
|
-
if (st.display === "none" || st.visibility === "hidden") return false;
|
|
202
|
-
const r = el.getBoundingClientRect();
|
|
203
|
-
return r.width > 0 && r.height > 0;
|
|
204
|
-
}
|
|
205
|
-
const wrappers = Array.from(document.querySelectorAll(".dialog-default-v2"))
|
|
206
|
-
.filter((el) => isVisible(el) && !!el.querySelector(".dialog-geek-remark"));
|
|
207
|
-
if (wrappers.length === 0) return false;
|
|
208
|
-
const wrapper = wrappers[wrappers.length - 1];
|
|
209
|
-
const buttons = Array.from(wrapper.querySelectorAll(".boss-dialog__footer .boss-dialog__button, .boss-btn"))
|
|
210
|
-
.filter((el) => isVisible(el));
|
|
211
|
-
const confirmBtn = buttons.find((el) => norm(el.textContent).includes("确认"));
|
|
212
|
-
if (!confirmBtn) return false;
|
|
213
|
-
confirmBtn.scrollIntoView({ block: "center", inline: "nearest" });
|
|
214
|
-
confirmBtn.click();
|
|
215
|
-
return true;
|
|
216
|
-
})()`));
|
|
217
|
-
if (!confirmed) {
|
|
218
|
-
throw new Error('已填写备注,但未找到“确认”按钮。');
|
|
219
|
-
}
|
|
220
|
-
await sleepRandom(220, 580);
|
|
221
|
-
return `已更新备注: ${nextRemark}`;
|
|
222
|
-
}
|
|
223
|
-
async function closeOnlineResumePanel(page) {
|
|
224
|
-
try {
|
|
225
|
-
await page.evaluate(() => {
|
|
226
|
-
const wraps = Array.from(document.querySelectorAll('.boss-popup__wrapper'));
|
|
227
|
-
for (const w of wraps) {
|
|
228
|
-
if (w.querySelector('iframe[src*="c-resume"], iframe[src*="frame/c-resume"]')) {
|
|
229
|
-
const c = w.querySelector('.boss-popup__close');
|
|
230
|
-
if (c) {
|
|
231
|
-
c.click();
|
|
232
|
-
return;
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
const iframe = document.querySelector('iframe[src*="c-resume"], iframe[src*="frame/c-resume"]');
|
|
237
|
-
let node = iframe?.parentElement ?? null;
|
|
238
|
-
for (let i = 0; i < 12 && node; i++) {
|
|
239
|
-
const c = node.querySelector('.boss-popup__close, .drawer-close, .icon-close');
|
|
240
|
-
if (c) {
|
|
241
|
-
c.click();
|
|
242
|
-
return;
|
|
243
|
-
}
|
|
244
|
-
node = node.parentElement;
|
|
245
|
-
}
|
|
246
|
-
});
|
|
247
|
-
await sleepRandom(200, 450);
|
|
248
|
-
}
|
|
249
|
-
catch {
|
|
250
|
-
/* ignore */
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
async function getCandidateLabelForResumeShot(page) {
|
|
254
|
-
const name = (await page.evaluate(`(() => {
|
|
255
|
-
const node = document.querySelector(".base-info-single-container .name-box");
|
|
256
|
-
const text = node?.textContent ?? "";
|
|
257
|
-
return text.replace(/\\s+/g, " ").trim();
|
|
258
|
-
})()`));
|
|
259
|
-
return name || 'candidate';
|
|
260
|
-
}
|
|
261
|
-
/**
|
|
262
|
-
* 点击「在线简历」,对 `iframe` 元素整框截图(含视口外部分,见 `captureBeyondViewport`)。
|
|
263
|
-
* 不依赖 `contentFrame()`,与内页是否 canvas / 跨域无关。
|
|
264
|
-
*
|
|
265
|
-
* 进入前记录 `page.viewport()`,截图前临时 `setViewport` 拉高(默认高度 5000),结束后恢复。
|
|
266
|
-
*/
|
|
267
|
-
async function captureOnlineResumeScreenshot(page, candidateLabel) {
|
|
268
|
-
ensureAppDataLayout();
|
|
269
|
-
const savedViewport = await page.viewport();
|
|
270
|
-
const opened = await page.evaluate(() => {
|
|
271
|
-
const a = document.querySelector('a.resume-btn-online');
|
|
272
|
-
if (!a || a.classList.contains('disabled'))
|
|
273
|
-
return false;
|
|
274
|
-
a.scrollIntoView({ block: 'center', inline: 'nearest' });
|
|
275
|
-
a.click();
|
|
276
|
-
return true;
|
|
277
|
-
});
|
|
278
|
-
if (!opened) {
|
|
279
|
-
return null;
|
|
280
|
-
}
|
|
281
|
-
await sleepRandom(ONLINE_RESUME_IFRAME_APPEAR_MS.min, ONLINE_RESUME_IFRAME_APPEAR_MS.max);
|
|
282
|
-
const hasIframe = await page
|
|
283
|
-
.waitForSelector('iframe[src*="c-resume"], iframe[src*="frame/c-resume"]', { timeout: 22_000 })
|
|
284
|
-
.catch(() => null);
|
|
285
|
-
if (!hasIframe) {
|
|
286
|
-
return null;
|
|
287
|
-
}
|
|
288
|
-
await sleepRandom(ONLINE_RESUME_IFRAME_SETTLE_MS.min, ONLINE_RESUME_IFRAME_SETTLE_MS.max);
|
|
289
|
-
const fileName = `online-resume-${safeResumeFileBase(candidateLabel)}-${Date.now()}.png`;
|
|
290
|
-
const absPath = join(RESUME_SCREENSHOTS_DIR, fileName);
|
|
291
|
-
try {
|
|
292
|
-
await page.setViewport(viewportForOnlineResumeSnapshot(savedViewport));
|
|
293
|
-
await sleepRandom(100, 320);
|
|
294
|
-
const iframe = await page.$('iframe[src*="c-resume"], iframe[src*="frame/c-resume"]');
|
|
295
|
-
if (!iframe) {
|
|
296
|
-
return null;
|
|
297
|
-
}
|
|
298
|
-
await iframe.evaluate((el) => {
|
|
299
|
-
el.scrollIntoView({ block: 'start', inline: 'nearest' });
|
|
300
|
-
});
|
|
301
|
-
const box = await iframe.boundingBox();
|
|
302
|
-
if (!box) {
|
|
303
|
-
await iframe.dispose();
|
|
304
|
-
return null;
|
|
305
|
-
}
|
|
306
|
-
try {
|
|
307
|
-
await iframe.screenshot({
|
|
308
|
-
path: absPath,
|
|
309
|
-
type: 'png',
|
|
310
|
-
captureBeyondViewport: true,
|
|
311
|
-
});
|
|
312
|
-
}
|
|
313
|
-
finally {
|
|
314
|
-
await iframe.dispose();
|
|
315
|
-
}
|
|
316
|
-
await closeOnlineResumePanel(page);
|
|
317
|
-
return absPath;
|
|
318
|
-
}
|
|
319
|
-
finally {
|
|
320
|
-
await page.setViewport(viewportRestoreAfterResumeSnapshot(savedViewport));
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
export async function runChatActionOnCurrentConversation(page, options) {
|
|
324
|
-
const action = options.action;
|
|
325
|
-
switch (action) {
|
|
326
|
-
case 'not-fit':
|
|
327
|
-
return markCandidateNotFitWithoutReason(page);
|
|
328
|
-
case 'remark':
|
|
329
|
-
return updateCandidateRemark(page, options.remark ?? '');
|
|
330
|
-
case 'online-resume': {
|
|
331
|
-
await ensureInCandidateChat(page, '在线简历');
|
|
332
|
-
const candidateLabel = await getCandidateLabelForResumeShot(page);
|
|
333
|
-
const resumeShotPath = await captureOnlineResumeScreenshot(page, candidateLabel);
|
|
334
|
-
if (resumeShotPath === null) {
|
|
335
|
-
throw new Error('未找到在线简历入口,或在线简历弹层未正常出现。');
|
|
336
|
-
}
|
|
337
|
-
if (!isResumeOcrEnabled()) {
|
|
338
|
-
return `在线简历操作成功,截图文件:${resumeShotPath}`;
|
|
339
|
-
}
|
|
340
|
-
try {
|
|
341
|
-
const ocr = await ocrResumePngToTextFile(resumeShotPath);
|
|
342
|
-
return `在线简历操作成功,截图文件:${resumeShotPath}\nOCR 文本文件:${ocr.textPath}`;
|
|
343
|
-
}
|
|
344
|
-
catch (e) {
|
|
345
|
-
const msg = e instanceof Error ? e.message : String(e);
|
|
346
|
-
throw new Error(`在线简历截图成功,但 OCR 失败:${msg}`);
|
|
347
|
-
}
|
|
348
|
-
}
|
|
349
|
-
default: {
|
|
350
|
-
const _x = action;
|
|
351
|
-
throw new Error(`未知的 chat action: ${String(_x)}`);
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
//# sourceMappingURL=chat_action.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"chat_action.js","sourceRoot":"","sources":["../../src/toolset/chat_action.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"list_candidates.d.ts","sourceRoot":"","sources":["../../src/toolset/list_candidates.ts"],"names":[],"mappings":"AA+DA,wBAAsB,mBAAmB,CACvC,IAAI,GAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAO,GAClC,OAAO,CAAC,MAAM,CAAC,CA0FjB"}
|
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
import { createWaitManualLoginRequiredText, isBossChatIndexUrl, LIST_FILTER_GAP_MS, LIST_MIN_BEFORE_EMPTY_OK_MS, LIST_POLL_MS, sleepRandom, withChatPage, } from '../browser/index.js';
|
|
2
|
-
async function waitForCandidateListSettled(page, opts) {
|
|
3
|
-
const start = Date.now();
|
|
4
|
-
let prev = -1;
|
|
5
|
-
let stable = 0;
|
|
6
|
-
while (Date.now() - start < opts.timeoutMs) {
|
|
7
|
-
const n = (await page.evaluate(`(() => document.querySelectorAll(".geek-item").length)()`));
|
|
8
|
-
const elapsed = Date.now() - start;
|
|
9
|
-
if (n === prev) {
|
|
10
|
-
stable++;
|
|
11
|
-
}
|
|
12
|
-
else {
|
|
13
|
-
prev = n;
|
|
14
|
-
stable = 1;
|
|
15
|
-
}
|
|
16
|
-
if (stable >= 2) {
|
|
17
|
-
if (n > 0) {
|
|
18
|
-
return;
|
|
19
|
-
}
|
|
20
|
-
if (n === 0 && elapsed >= opts.minMsBeforeEmptyOk) {
|
|
21
|
-
return;
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
await sleepRandom(opts.pollMsMin, opts.pollMsMax);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
async function clickChatFilterTabAll(page) {
|
|
28
|
-
await page.evaluate(`(() => {
|
|
29
|
-
const targetText = "全部";
|
|
30
|
-
const container = document.querySelector(".chat-message-filter-left");
|
|
31
|
-
if (!container) return;
|
|
32
|
-
const spans = Array.from(container.querySelectorAll("span"));
|
|
33
|
-
const norm = (v) => (v ?? "").replace(/\\s+/g, "");
|
|
34
|
-
const target = spans.find((el) => norm(el.textContent).includes(targetText));
|
|
35
|
-
if (!target) return;
|
|
36
|
-
target.dispatchEvent(new MouseEvent("click", { bubbles: true, cancelable: true }));
|
|
37
|
-
target.click();
|
|
38
|
-
})()`);
|
|
39
|
-
}
|
|
40
|
-
export async function runGetCandidateList(opts = {}) {
|
|
41
|
-
const unreadOnly = opts.unreadOnly === true;
|
|
42
|
-
try {
|
|
43
|
-
return await withChatPage(async (page) => {
|
|
44
|
-
const currentUrl = page.url();
|
|
45
|
-
if (!isBossChatIndexUrl(currentUrl)) {
|
|
46
|
-
throw new Error('请先进入聊天列表页(/web/chat/index)再获取候选人列表。');
|
|
47
|
-
}
|
|
48
|
-
await page.waitForFunction(`(() => {
|
|
49
|
-
const filter = document.querySelector(".chat-message-filter-left");
|
|
50
|
-
if (!filter) return false;
|
|
51
|
-
const tabs = Array.from(filter.querySelectorAll("span"));
|
|
52
|
-
if (tabs.length < 2) return false;
|
|
53
|
-
const list = document.querySelector(".chat-list, .chat-item-list, .geek-list");
|
|
54
|
-
const hasItems = document.querySelectorAll(".geek-item").length > 0;
|
|
55
|
-
return !!list || hasItems;
|
|
56
|
-
})()`, { timeout: 12_000 });
|
|
57
|
-
await clickChatFilterTabAll(page);
|
|
58
|
-
await sleepRandom(LIST_FILTER_GAP_MS.min, LIST_FILTER_GAP_MS.max);
|
|
59
|
-
await sleepRandom(LIST_FILTER_GAP_MS.min, LIST_FILTER_GAP_MS.max);
|
|
60
|
-
await clickChatFilterTabAll(page);
|
|
61
|
-
await sleepRandom(LIST_FILTER_GAP_MS.min, LIST_FILTER_GAP_MS.max);
|
|
62
|
-
await waitForCandidateListSettled(page, {
|
|
63
|
-
timeoutMs: 14_000,
|
|
64
|
-
pollMsMin: LIST_POLL_MS.min,
|
|
65
|
-
pollMsMax: LIST_POLL_MS.max,
|
|
66
|
-
minMsBeforeEmptyOk: LIST_MIN_BEFORE_EMPTY_OK_MS,
|
|
67
|
-
});
|
|
68
|
-
const items = (await page.evaluate(`(() => {
|
|
69
|
-
const norm = (v) => (v ?? "").replace(/\\s+/g, " ").trim();
|
|
70
|
-
return Array.from(document.querySelectorAll(".geek-item")).map((el) => {
|
|
71
|
-
const name = norm(el.querySelector(".geek-name")?.textContent);
|
|
72
|
-
const job = norm(el.querySelector(".source-job")?.textContent);
|
|
73
|
-
const time = norm(el.querySelector(".time")?.textContent);
|
|
74
|
-
const message = norm(el.querySelector(".push-text")?.textContent);
|
|
75
|
-
const badge = el.querySelector(".badge-count");
|
|
76
|
-
let unreadCount = 0;
|
|
77
|
-
if (badge) {
|
|
78
|
-
const digits = norm(badge.textContent).replace(/\\D/g, "");
|
|
79
|
-
if (digits) unreadCount = parseInt(digits, 10) || 0;
|
|
80
|
-
}
|
|
81
|
-
return { name, job, time, message, unreadCount };
|
|
82
|
-
});
|
|
83
|
-
})()`));
|
|
84
|
-
const candidates = items.filter((it) => it.name);
|
|
85
|
-
const withUnread = candidates.filter((it) => it.unreadCount > 0).length;
|
|
86
|
-
const visible = unreadOnly ? candidates.filter((it) => it.unreadCount > 0) : candidates;
|
|
87
|
-
const lines = visible.map((it, idx) => {
|
|
88
|
-
const base = `${idx + 1}. ${it.name}${it.job ? `|${it.job}` : ''}`;
|
|
89
|
-
const meta = [
|
|
90
|
-
it.unreadCount > 0 ? `未读:${it.unreadCount}` : '',
|
|
91
|
-
it.time ? `时间:${it.time}` : '',
|
|
92
|
-
it.message ? `消息:${it.message}` : '',
|
|
93
|
-
]
|
|
94
|
-
.filter(Boolean)
|
|
95
|
-
.join('|');
|
|
96
|
-
return meta ? `${base}|${meta}` : base;
|
|
97
|
-
});
|
|
98
|
-
const previewText = lines.length > 0 ? `候选人明细:\n${lines.join('\n')}` : '候选人明细:暂无。';
|
|
99
|
-
return [
|
|
100
|
-
unreadOnly
|
|
101
|
-
? `未读筛选:共 ${visible.length} 人(全部列表 ${candidates.length} 人中有未读角标者 ${withUnread} 人)。`
|
|
102
|
-
: `沟通列表共 ${candidates.length} 人,其中 ${withUnread} 人有未读消息。`,
|
|
103
|
-
previewText,
|
|
104
|
-
]
|
|
105
|
-
.filter(Boolean)
|
|
106
|
-
.join('\n');
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
catch (e) {
|
|
110
|
-
const message = e instanceof Error ? e.message : String(e);
|
|
111
|
-
if (e instanceof Error) {
|
|
112
|
-
if (e.message.includes('浏览器会话尚未初始化')) {
|
|
113
|
-
throw new Error(createWaitManualLoginRequiredText('获取候选人列表'));
|
|
114
|
-
}
|
|
115
|
-
throw e;
|
|
116
|
-
}
|
|
117
|
-
throw new Error(`获取候选人列表失败:${message}`);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
//# sourceMappingURL=list_candidates.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"list_candidates.js","sourceRoot":"","sources":["../../src/toolset/list_candidates.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
export type ListOpenPositionsDeps = {
|
|
2
|
-
/**
|
|
3
|
-
* 存放岗位 JD 的目录(每个岗位一个 .md/.MD 文件)。
|
|
4
|
-
* 默认:`~/.boss-cli/d1`(Windows 为 `%USERPROFILE%\.boss-cli\d1`)。
|
|
5
|
-
*/
|
|
6
|
-
jdDir?: string;
|
|
7
|
-
};
|
|
8
|
-
export declare function runListOpenPositions(deps?: ListOpenPositionsDeps): Promise<string>;
|
|
9
|
-
//# sourceMappingURL=list_positions.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"list_positions.d.ts","sourceRoot":"","sources":["../../src/toolset/list_positions.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,qBAAqB,GAAG;IAClC;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAUF,wBAAsB,oBAAoB,CACxC,IAAI,GAAE,qBAA0B,GAC/B,OAAO,CAAC,MAAM,CAAC,CAkCjB"}
|