@joohw/boss-cli 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +170 -172
- 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.d.ts.map +1 -1
- package/dist/cli/cliRouter.js +56 -43
- package/dist/cli/cliRouter.js.map +1 -1
- package/dist/cli/version.d.ts +22 -0
- package/dist/cli/version.d.ts.map +1 -1
- package/dist/cli/version.js +127 -6
- package/dist/cli/version.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.map +1 -1
- package/dist/common/boss_session_lock.js +7 -1
- package/dist/common/boss_session_lock.js.map +1 -1
- 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 +18 -29
- 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.map +1 -1
- package/dist/toolset/deep-search.js +289 -265
- package/dist/toolset/deep-search.js.map +1 -1
- package/dist/toolset/greet.d.ts.map +1 -1
- package/dist/toolset/greet.js +1 -6
- package/dist/toolset/greet.js.map +1 -1
- package/dist/toolset/jd.d.ts.map +1 -1
- package/dist/toolset/jd.js +132 -136
- 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 +6 -8
- package/dist/toolset/preview.js.map +1 -1
- package/dist/toolset/recommend.d.ts.map +1 -1
- package/dist/toolset/recommend.js +222 -196
- 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 -65
- 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,9 +1,6 @@
|
|
|
1
|
-
import { sleepRandom } from '../browser/index.js';
|
|
2
|
-
import { createWaitManualLoginRequiredText } from '../common/auth.js';
|
|
3
1
|
import { withBossSessionPage } from '../common/boss_session_page.js';
|
|
4
2
|
import { clickBossSidebarMenuToPath } from '../common/boss_sidebar_nav.js';
|
|
5
3
|
const BOSS_CHAT_RECOMMEND_URL = 'https://www.zhipin.com/web/chat/recommend';
|
|
6
|
-
const RECOMMEND_SETTLE_MS = { min: 1400, max: 2400 };
|
|
7
4
|
/** 会话内记录:通过 greet 新出现的推荐卡片(以 geekId 识别) */
|
|
8
5
|
const sessionGreetProducedGeekIds = new Set();
|
|
9
6
|
/**
|
|
@@ -44,77 +41,109 @@ async function getRecommendFrame(page) {
|
|
|
44
41
|
throw new Error('已检测到推荐 iframe,但无法获取其页面上下文(recommendFrame)。');
|
|
45
42
|
}
|
|
46
43
|
async function ensureRecommendFrameReady(frame) {
|
|
47
|
-
await frame.waitForFunction(`(() => {
|
|
48
|
-
const sel = ${JSON.stringify(RECOMMEND_CARD_ROOT_SELECTOR)};
|
|
49
|
-
if (document.querySelector(sel)) return true;
|
|
50
|
-
const root = document.querySelector(".card-list, .geek-list-wrap .geek-list");
|
|
51
|
-
return !!root;
|
|
44
|
+
await frame.waitForFunction(`(() => {
|
|
45
|
+
const sel = ${JSON.stringify(RECOMMEND_CARD_ROOT_SELECTOR)};
|
|
46
|
+
if (document.querySelector(sel)) return true;
|
|
47
|
+
const root = document.querySelector(".card-list, .geek-list-wrap .geek-list");
|
|
48
|
+
return !!root;
|
|
52
49
|
})()`, { timeout: 15_000 });
|
|
53
50
|
}
|
|
54
51
|
async function readCurrentRecommendJobLabel(frame) {
|
|
55
|
-
return (await frame.evaluate(`(() => {
|
|
56
|
-
const norm = (v) => (v ?? "").replace(/\\s+/g, " ").trim();
|
|
57
|
-
return norm(document.querySelector(".job-selecter-wrap .ui-dropmenu-label")?.textContent);
|
|
52
|
+
return (await frame.evaluate(`(() => {
|
|
53
|
+
const norm = (v) => (v ?? "").replace(/\\s+/g, " ").trim();
|
|
54
|
+
return norm(document.querySelector(".job-selecter-wrap .ui-dropmenu-label")?.textContent);
|
|
58
55
|
})()`));
|
|
59
56
|
}
|
|
57
|
+
async function waitForRecommendJobDropdownReady(frame) {
|
|
58
|
+
await frame.waitForFunction(`(() => {
|
|
59
|
+
const options = document.querySelector(".job-selecter-options");
|
|
60
|
+
if (!(options instanceof HTMLElement)) return false;
|
|
61
|
+
const rect = options.getBoundingClientRect();
|
|
62
|
+
const style = window.getComputedStyle(options);
|
|
63
|
+
if (rect.width <= 0 || rect.height <= 0 || style.display === "none" || style.visibility === "hidden") {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
return !!options.querySelector(".top-chat-search .chat-job-search");
|
|
67
|
+
})()`, { timeout: 6_000 });
|
|
68
|
+
}
|
|
69
|
+
async function waitForRecommendJobSearchResults(frame, keyword) {
|
|
70
|
+
await frame.waitForFunction(`((kw) => {
|
|
71
|
+
const norm = (v) => (v ?? "").replace(/\\s+/g, "").trim().toLowerCase();
|
|
72
|
+
const rows = Array.from(document.querySelectorAll(".job-selecter-options .job-list .job-item"));
|
|
73
|
+
if (rows.length === 0) return false;
|
|
74
|
+
if (!kw) return true;
|
|
75
|
+
return rows.some((el) => {
|
|
76
|
+
const label = norm(el.querySelector(".label")?.textContent || el.textContent || "");
|
|
77
|
+
return label.includes(norm(kw));
|
|
78
|
+
});
|
|
79
|
+
})`, { timeout: 8_000 }, keyword);
|
|
80
|
+
}
|
|
81
|
+
async function waitForRecommendJobSelected(frame, expectedLabel) {
|
|
82
|
+
await frame.waitForFunction(`((label) => {
|
|
83
|
+
const norm = (v) => (v ?? "").replace(/\\s+/g, " ").trim();
|
|
84
|
+
const current = norm(document.querySelector(".job-selecter-wrap .ui-dropmenu-label")?.textContent);
|
|
85
|
+
return !!current && current === label;
|
|
86
|
+
})`, { timeout: 8_000 }, expectedLabel);
|
|
87
|
+
await ensureRecommendFrameReady(frame);
|
|
88
|
+
}
|
|
60
89
|
export async function selectRecommendJob(frame, keyword) {
|
|
61
90
|
const kw = keyword.trim();
|
|
62
91
|
if (!kw) {
|
|
63
92
|
return readCurrentRecommendJobLabel(frame);
|
|
64
93
|
}
|
|
65
94
|
const kwLiteral = JSON.stringify(kw);
|
|
66
|
-
const opened = (await frame.evaluate(`(() => {
|
|
67
|
-
const host = document.querySelector(".job-selecter-wrap .ui-dropmenu-label");
|
|
68
|
-
if (!(host instanceof HTMLElement)) return false;
|
|
69
|
-
host.scrollIntoView({ block: "center", inline: "nearest" });
|
|
70
|
-
host.click();
|
|
71
|
-
return true;
|
|
95
|
+
const opened = (await frame.evaluate(`(() => {
|
|
96
|
+
const host = document.querySelector(".job-selecter-wrap .ui-dropmenu-label");
|
|
97
|
+
if (!(host instanceof HTMLElement)) return false;
|
|
98
|
+
host.scrollIntoView({ block: "center", inline: "nearest" });
|
|
99
|
+
host.click();
|
|
100
|
+
return true;
|
|
72
101
|
})()`));
|
|
73
102
|
if (!opened) {
|
|
74
103
|
throw new Error('未找到岗位下拉入口(.job-selecter-wrap .ui-dropmenu-label)。');
|
|
75
104
|
}
|
|
76
|
-
await
|
|
77
|
-
const searched = (await frame.evaluate(`(() => {
|
|
78
|
-
const kw = ${kwLiteral};
|
|
79
|
-
const input = document.querySelector(".job-selecter-options .top-chat-search .chat-job-search");
|
|
80
|
-
if (!(input instanceof HTMLInputElement)) return false;
|
|
81
|
-
input.focus();
|
|
82
|
-
input.value = kw;
|
|
83
|
-
input.dispatchEvent(new Event("input", { bubbles: true }));
|
|
84
|
-
input.dispatchEvent(new Event("change", { bubbles: true }));
|
|
85
|
-
return true;
|
|
105
|
+
await waitForRecommendJobDropdownReady(frame);
|
|
106
|
+
const searched = (await frame.evaluate(`(() => {
|
|
107
|
+
const kw = ${kwLiteral};
|
|
108
|
+
const input = document.querySelector(".job-selecter-options .top-chat-search .chat-job-search");
|
|
109
|
+
if (!(input instanceof HTMLInputElement)) return false;
|
|
110
|
+
input.focus();
|
|
111
|
+
input.value = kw;
|
|
112
|
+
input.dispatchEvent(new Event("input", { bubbles: true }));
|
|
113
|
+
input.dispatchEvent(new Event("change", { bubbles: true }));
|
|
114
|
+
return true;
|
|
86
115
|
})()`));
|
|
87
116
|
if (!searched) {
|
|
88
117
|
throw new Error('已打开岗位下拉,但未找到职位搜索框(.chat-job-search)。');
|
|
89
118
|
}
|
|
90
|
-
await
|
|
91
|
-
const picked = (await frame.evaluate(`(() => {
|
|
92
|
-
const kw = ${kwLiteral};
|
|
93
|
-
const norm = (v) => (v ?? "").replace(/\\s+/g, "").trim().toLowerCase();
|
|
94
|
-
const rows = Array.from(document.querySelectorAll(".job-selecter-options .job-list .job-item"));
|
|
95
|
-
if (rows.length === 0) return { ok: false, reason: "empty" };
|
|
96
|
-
const target = rows.find((el) => {
|
|
97
|
-
const label = norm(el.querySelector(".label")?.textContent || el.textContent || "");
|
|
98
|
-
return label.includes(norm(kw));
|
|
99
|
-
});
|
|
100
|
-
if (!(target instanceof HTMLElement)) return { ok: false, reason: "not_found" };
|
|
101
|
-
const label = (target.querySelector(".label")?.textContent ?? target.textContent ?? "")
|
|
102
|
-
.replace(/\\s+/g, " ")
|
|
103
|
-
.trim();
|
|
104
|
-
target.scrollIntoView({ block: "center", inline: "nearest" });
|
|
105
|
-
target.click();
|
|
106
|
-
return { ok: true, label };
|
|
119
|
+
await waitForRecommendJobSearchResults(frame, kw);
|
|
120
|
+
const picked = (await frame.evaluate(`(() => {
|
|
121
|
+
const kw = ${kwLiteral};
|
|
122
|
+
const norm = (v) => (v ?? "").replace(/\\s+/g, "").trim().toLowerCase();
|
|
123
|
+
const rows = Array.from(document.querySelectorAll(".job-selecter-options .job-list .job-item"));
|
|
124
|
+
if (rows.length === 0) return { ok: false, reason: "empty" };
|
|
125
|
+
const target = rows.find((el) => {
|
|
126
|
+
const label = norm(el.querySelector(".label")?.textContent || el.textContent || "");
|
|
127
|
+
return label.includes(norm(kw));
|
|
128
|
+
});
|
|
129
|
+
if (!(target instanceof HTMLElement)) return { ok: false, reason: "not_found" };
|
|
130
|
+
const label = (target.querySelector(".label")?.textContent ?? target.textContent ?? "")
|
|
131
|
+
.replace(/\\s+/g, " ")
|
|
132
|
+
.trim();
|
|
133
|
+
target.scrollIntoView({ block: "center", inline: "nearest" });
|
|
134
|
+
target.click();
|
|
135
|
+
return { ok: true, label };
|
|
107
136
|
})()`));
|
|
108
137
|
if (!picked.ok) {
|
|
109
138
|
throw new Error(`未找到匹配岗位“${kw}”。`);
|
|
110
139
|
}
|
|
111
|
-
|
|
112
|
-
|
|
140
|
+
const label = picked.label ?? kw;
|
|
141
|
+
await waitForRecommendJobSelected(frame, label);
|
|
142
|
+
return label;
|
|
113
143
|
}
|
|
114
144
|
export async function ensureInRecommendPage(page) {
|
|
115
145
|
if (!isBossChatRecommendUrl(page.url())) {
|
|
116
146
|
await clickBossSidebarMenuToPath(page, '推荐', '/web/chat/recommend');
|
|
117
|
-
await sleepRandom(RECOMMEND_SETTLE_MS.min, RECOMMEND_SETTLE_MS.max);
|
|
118
147
|
}
|
|
119
148
|
if (!isBossChatRecommendUrl(page.url())) {
|
|
120
149
|
throw new Error('通过侧边栏“推荐”进入页面失败,请确认已登录并可访问 /web/chat/recommend。');
|
|
@@ -135,71 +164,71 @@ export async function assertRecommendPageReadyForPreview(page) {
|
|
|
135
164
|
return frame;
|
|
136
165
|
}
|
|
137
166
|
export async function readRecommendList(frame) {
|
|
138
|
-
return (await frame.evaluate(`(() => {
|
|
139
|
-
const norm = (v) => (v ?? "").replace(/\\s+/g, " ").trim();
|
|
140
|
-
const cardSel = ${JSON.stringify(RECOMMEND_CARD_ROOT_SELECTOR)};
|
|
141
|
-
const cards = Array.from(document.querySelectorAll(cardSel));
|
|
142
|
-
return cards.map((item) => {
|
|
143
|
-
const inner = item.querySelector(".card-inner") || item;
|
|
144
|
-
const wrap = item.matches(".candidate-card-wrap")
|
|
145
|
-
? item
|
|
146
|
-
: item.querySelector(".candidate-card-wrap");
|
|
147
|
-
const hasViewed = Boolean(
|
|
148
|
-
(wrap && wrap.classList.contains("has-viewed")) ||
|
|
149
|
-
(inner && inner.classList.contains("has-viewed")),
|
|
150
|
-
);
|
|
151
|
-
const geekId =
|
|
152
|
-
inner?.getAttribute("data-geekid") ??
|
|
153
|
-
inner?.getAttribute("data-geek") ??
|
|
154
|
-
"";
|
|
155
|
-
const name =
|
|
156
|
-
norm(item.querySelector(".name-wrap .name")?.textContent) ||
|
|
157
|
-
norm(item.querySelector(".name")?.textContent);
|
|
158
|
-
const salary = norm(item.querySelector(".salary-wrap span")?.textContent);
|
|
159
|
-
const baseInfo = Array.from(item.querySelectorAll(".base-info span"))
|
|
160
|
-
.map((el) => norm(el.textContent))
|
|
161
|
-
.filter(Boolean)
|
|
162
|
-
.join(" / ");
|
|
163
|
-
const expect =
|
|
164
|
-
norm(item.querySelector(".expect-wrap .content")?.textContent) ||
|
|
165
|
-
norm(item.querySelector(".expect-wrap .join-text-wrap")?.textContent);
|
|
166
|
-
const experience = norm(item.querySelector(".experience-wrap .join-text-wrap")?.textContent);
|
|
167
|
-
const advantage = norm(item.querySelector(".geek-desc .content")?.textContent);
|
|
168
|
-
const highlightLabels = [
|
|
169
|
-
...Array.from(item.querySelectorAll(".operate .labels .label")),
|
|
170
|
-
...Array.from(item.querySelectorAll(".tags-wrap .tag-item")),
|
|
171
|
-
]
|
|
172
|
-
.map((el) => norm(el.textContent))
|
|
173
|
-
.filter(Boolean);
|
|
174
|
-
const highlights = [...new Set(highlightLabels)];
|
|
175
|
-
const greetBtn = item.querySelector(".button-chat-wrap .btn.btn-greet");
|
|
176
|
-
const btnCls = greetBtn?.className ?? "";
|
|
177
|
-
const disabled =
|
|
178
|
-
!greetBtn ||
|
|
179
|
-
/disabled|forbid|ban/i.test(btnCls) ||
|
|
180
|
-
greetBtn.getAttribute("disabled") !== null;
|
|
181
|
-
const hasHistoryChat = (() => {
|
|
182
|
-
if (item.querySelector(".tooltip-wrap.chat-history .icon-chat-history")) return true;
|
|
183
|
-
const uses = Array.from(item.querySelectorAll("use"));
|
|
184
|
-
return uses.some((u) => {
|
|
185
|
-
const href = u.getAttribute("href") ?? u.getAttributeNS("http://www.w3.org/1999/xlink", "href") ?? "";
|
|
186
|
-
return href.includes("icon-chat-history");
|
|
187
|
-
});
|
|
188
|
-
})();
|
|
189
|
-
return {
|
|
190
|
-
geekId,
|
|
191
|
-
name,
|
|
192
|
-
salary,
|
|
193
|
-
baseInfo,
|
|
194
|
-
expect,
|
|
195
|
-
experience,
|
|
196
|
-
advantage,
|
|
197
|
-
highlights,
|
|
198
|
-
canGreet: !disabled,
|
|
199
|
-
hasHistoryChat,
|
|
200
|
-
hasViewed,
|
|
201
|
-
};
|
|
202
|
-
}).filter((x) => x.name);
|
|
167
|
+
return (await frame.evaluate(`(() => {
|
|
168
|
+
const norm = (v) => (v ?? "").replace(/\\s+/g, " ").trim();
|
|
169
|
+
const cardSel = ${JSON.stringify(RECOMMEND_CARD_ROOT_SELECTOR)};
|
|
170
|
+
const cards = Array.from(document.querySelectorAll(cardSel));
|
|
171
|
+
return cards.map((item) => {
|
|
172
|
+
const inner = item.querySelector(".card-inner") || item;
|
|
173
|
+
const wrap = item.matches(".candidate-card-wrap")
|
|
174
|
+
? item
|
|
175
|
+
: item.querySelector(".candidate-card-wrap");
|
|
176
|
+
const hasViewed = Boolean(
|
|
177
|
+
(wrap && wrap.classList.contains("has-viewed")) ||
|
|
178
|
+
(inner && inner.classList.contains("has-viewed")),
|
|
179
|
+
);
|
|
180
|
+
const geekId =
|
|
181
|
+
inner?.getAttribute("data-geekid") ??
|
|
182
|
+
inner?.getAttribute("data-geek") ??
|
|
183
|
+
"";
|
|
184
|
+
const name =
|
|
185
|
+
norm(item.querySelector(".name-wrap .name")?.textContent) ||
|
|
186
|
+
norm(item.querySelector(".name")?.textContent);
|
|
187
|
+
const salary = norm(item.querySelector(".salary-wrap span")?.textContent);
|
|
188
|
+
const baseInfo = Array.from(item.querySelectorAll(".base-info span"))
|
|
189
|
+
.map((el) => norm(el.textContent))
|
|
190
|
+
.filter(Boolean)
|
|
191
|
+
.join(" / ");
|
|
192
|
+
const expect =
|
|
193
|
+
norm(item.querySelector(".expect-wrap .content")?.textContent) ||
|
|
194
|
+
norm(item.querySelector(".expect-wrap .join-text-wrap")?.textContent);
|
|
195
|
+
const experience = norm(item.querySelector(".experience-wrap .join-text-wrap")?.textContent);
|
|
196
|
+
const advantage = norm(item.querySelector(".geek-desc .content")?.textContent);
|
|
197
|
+
const highlightLabels = [
|
|
198
|
+
...Array.from(item.querySelectorAll(".operate .labels .label")),
|
|
199
|
+
...Array.from(item.querySelectorAll(".tags-wrap .tag-item")),
|
|
200
|
+
]
|
|
201
|
+
.map((el) => norm(el.textContent))
|
|
202
|
+
.filter(Boolean);
|
|
203
|
+
const highlights = [...new Set(highlightLabels)];
|
|
204
|
+
const greetBtn = item.querySelector(".button-chat-wrap .btn.btn-greet");
|
|
205
|
+
const btnCls = greetBtn?.className ?? "";
|
|
206
|
+
const disabled =
|
|
207
|
+
!greetBtn ||
|
|
208
|
+
/disabled|forbid|ban/i.test(btnCls) ||
|
|
209
|
+
greetBtn.getAttribute("disabled") !== null;
|
|
210
|
+
const hasHistoryChat = (() => {
|
|
211
|
+
if (item.querySelector(".tooltip-wrap.chat-history .icon-chat-history")) return true;
|
|
212
|
+
const uses = Array.from(item.querySelectorAll("use"));
|
|
213
|
+
return uses.some((u) => {
|
|
214
|
+
const href = u.getAttribute("href") ?? u.getAttributeNS("http://www.w3.org/1999/xlink", "href") ?? "";
|
|
215
|
+
return href.includes("icon-chat-history");
|
|
216
|
+
});
|
|
217
|
+
})();
|
|
218
|
+
return {
|
|
219
|
+
geekId,
|
|
220
|
+
name,
|
|
221
|
+
salary,
|
|
222
|
+
baseInfo,
|
|
223
|
+
expect,
|
|
224
|
+
experience,
|
|
225
|
+
advantage,
|
|
226
|
+
highlights,
|
|
227
|
+
canGreet: !disabled,
|
|
228
|
+
hasHistoryChat,
|
|
229
|
+
hasViewed,
|
|
230
|
+
};
|
|
231
|
+
}).filter((x) => x.name);
|
|
203
232
|
})()`));
|
|
204
233
|
}
|
|
205
234
|
export function renderRecommendList(candidates) {
|
|
@@ -252,44 +281,44 @@ export function renderRecommendList(candidates) {
|
|
|
252
281
|
}
|
|
253
282
|
export async function clickGreet(frame, target) {
|
|
254
283
|
const targetLiteral = JSON.stringify(target.trim());
|
|
255
|
-
const result = (await frame.evaluate(`(() => {
|
|
256
|
-
const raw = ${targetLiteral};
|
|
257
|
-
const norm = (v) => (v ?? "").replace(/\\s+/g, " ").trim();
|
|
258
|
-
const cardSel = ${JSON.stringify(RECOMMEND_CARD_ROOT_SELECTOR)};
|
|
259
|
-
const cards = Array.from(document.querySelectorAll(cardSel));
|
|
260
|
-
if (cards.length === 0) {
|
|
261
|
-
return { kind: "empty" };
|
|
262
|
-
}
|
|
263
|
-
const targetCard = cards.find((item) => {
|
|
264
|
-
const name =
|
|
265
|
-
norm(item.querySelector(".name-wrap .name")?.textContent) ||
|
|
266
|
-
norm(item.querySelector(".name")?.textContent);
|
|
267
|
-
return name === raw || name.includes(raw);
|
|
268
|
-
}) ?? null;
|
|
269
|
-
if (!targetCard) {
|
|
270
|
-
return { kind: "not_found", target: raw };
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
const name =
|
|
274
|
-
norm(targetCard.querySelector(".name-wrap .name")?.textContent) ||
|
|
275
|
-
norm(targetCard.querySelector(".name")?.textContent);
|
|
276
|
-
const inner = targetCard.querySelector(".card-inner") || targetCard;
|
|
277
|
-
const geekId =
|
|
278
|
-
inner?.getAttribute("data-geekid") ??
|
|
279
|
-
inner?.getAttribute("data-geek") ??
|
|
280
|
-
"";
|
|
281
|
-
const btn = targetCard.querySelector(".button-chat-wrap .btn.btn-greet");
|
|
282
|
-
if (!(btn instanceof HTMLElement)) {
|
|
283
|
-
return { kind: "no_btn", name };
|
|
284
|
-
}
|
|
285
|
-
const cls = btn.className ?? "";
|
|
286
|
-
const disabled = /disabled|forbid|ban/i.test(cls) || btn.getAttribute("disabled") !== null;
|
|
287
|
-
if (disabled) {
|
|
288
|
-
return { kind: "disabled", name };
|
|
289
|
-
}
|
|
290
|
-
btn.scrollIntoView({ block: "center", inline: "nearest" });
|
|
291
|
-
btn.click();
|
|
292
|
-
return { kind: "clicked", name, geekId };
|
|
284
|
+
const result = (await frame.evaluate(`(() => {
|
|
285
|
+
const raw = ${targetLiteral};
|
|
286
|
+
const norm = (v) => (v ?? "").replace(/\\s+/g, " ").trim();
|
|
287
|
+
const cardSel = ${JSON.stringify(RECOMMEND_CARD_ROOT_SELECTOR)};
|
|
288
|
+
const cards = Array.from(document.querySelectorAll(cardSel));
|
|
289
|
+
if (cards.length === 0) {
|
|
290
|
+
return { kind: "empty" };
|
|
291
|
+
}
|
|
292
|
+
const targetCard = cards.find((item) => {
|
|
293
|
+
const name =
|
|
294
|
+
norm(item.querySelector(".name-wrap .name")?.textContent) ||
|
|
295
|
+
norm(item.querySelector(".name")?.textContent);
|
|
296
|
+
return name === raw || name.includes(raw);
|
|
297
|
+
}) ?? null;
|
|
298
|
+
if (!targetCard) {
|
|
299
|
+
return { kind: "not_found", target: raw };
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
const name =
|
|
303
|
+
norm(targetCard.querySelector(".name-wrap .name")?.textContent) ||
|
|
304
|
+
norm(targetCard.querySelector(".name")?.textContent);
|
|
305
|
+
const inner = targetCard.querySelector(".card-inner") || targetCard;
|
|
306
|
+
const geekId =
|
|
307
|
+
inner?.getAttribute("data-geekid") ??
|
|
308
|
+
inner?.getAttribute("data-geek") ??
|
|
309
|
+
"";
|
|
310
|
+
const btn = targetCard.querySelector(".button-chat-wrap .btn.btn-greet");
|
|
311
|
+
if (!(btn instanceof HTMLElement)) {
|
|
312
|
+
return { kind: "no_btn", name };
|
|
313
|
+
}
|
|
314
|
+
const cls = btn.className ?? "";
|
|
315
|
+
const disabled = /disabled|forbid|ban/i.test(cls) || btn.getAttribute("disabled") !== null;
|
|
316
|
+
if (disabled) {
|
|
317
|
+
return { kind: "disabled", name };
|
|
318
|
+
}
|
|
319
|
+
btn.scrollIntoView({ block: "center", inline: "nearest" });
|
|
320
|
+
btn.click();
|
|
321
|
+
return { kind: "clicked", name, geekId };
|
|
293
322
|
})()`));
|
|
294
323
|
switch (result.kind) {
|
|
295
324
|
case 'empty':
|
|
@@ -325,49 +354,49 @@ export function markGreetProduced(before, after) {
|
|
|
325
354
|
export async function openRecommendResumePreview(frame, target) {
|
|
326
355
|
const raw = target.trim();
|
|
327
356
|
const targetLiteral = JSON.stringify(raw);
|
|
328
|
-
return (await frame.evaluate(`(() => {
|
|
329
|
-
const raw = ${targetLiteral};
|
|
330
|
-
const norm = (v) => (v ?? "").replace(/\\s+/g, " ").trim();
|
|
331
|
-
const cardSel = ${JSON.stringify(RECOMMEND_CARD_ROOT_SELECTOR)};
|
|
332
|
-
const cards = Array.from(document.querySelectorAll(cardSel));
|
|
333
|
-
if (cards.length === 0) return false;
|
|
334
|
-
const targetCard = cards.find((item) => {
|
|
335
|
-
const name =
|
|
336
|
-
norm(item.querySelector(".name-wrap .name")?.textContent) ||
|
|
337
|
-
norm(item.querySelector(".name")?.textContent);
|
|
338
|
-
return name === raw || name.includes(raw);
|
|
339
|
-
}) ?? null;
|
|
340
|
-
if (!targetCard) return false;
|
|
341
|
-
|
|
342
|
-
function tryOpen(el) {
|
|
343
|
-
if (!(el instanceof HTMLElement)) return false;
|
|
344
|
-
if (el.classList.contains("disabled")) return false;
|
|
345
|
-
const st = window.getComputedStyle(el);
|
|
346
|
-
if (st.pointerEvents === "none" || Number(st.opacity) < 0.3) return false;
|
|
347
|
-
el.scrollIntoView({ block: "center", inline: "nearest" });
|
|
348
|
-
el.click();
|
|
349
|
-
return true;
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
const inner = targetCard.querySelector(".card-inner");
|
|
353
|
-
if (inner instanceof HTMLElement) {
|
|
354
|
-
inner.scrollIntoView({ block: "center", inline: "nearest" });
|
|
355
|
-
inner.click();
|
|
356
|
-
return true;
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
const resumeOnline = targetCard.querySelector("a.resume-btn-online");
|
|
360
|
-
if (tryOpen(resumeOnline)) return true;
|
|
361
|
-
const hrefResume = targetCard.querySelector('a[href*="c-resume"], a[href*="frame/c-resume"]');
|
|
362
|
-
if (tryOpen(hrefResume)) return true;
|
|
363
|
-
|
|
364
|
-
const links = Array.from(targetCard.querySelectorAll("a, button, .btn")).filter((node) => {
|
|
365
|
-
const t = norm(node.textContent);
|
|
366
|
-
return /在线简历|查看简历|简历预览|预览/.test(t);
|
|
367
|
-
});
|
|
368
|
-
if (links.length > 0 && tryOpen(links[0])) return true;
|
|
369
|
-
|
|
370
|
-
return false;
|
|
357
|
+
return (await frame.evaluate(`(() => {
|
|
358
|
+
const raw = ${targetLiteral};
|
|
359
|
+
const norm = (v) => (v ?? "").replace(/\\s+/g, " ").trim();
|
|
360
|
+
const cardSel = ${JSON.stringify(RECOMMEND_CARD_ROOT_SELECTOR)};
|
|
361
|
+
const cards = Array.from(document.querySelectorAll(cardSel));
|
|
362
|
+
if (cards.length === 0) return false;
|
|
363
|
+
const targetCard = cards.find((item) => {
|
|
364
|
+
const name =
|
|
365
|
+
norm(item.querySelector(".name-wrap .name")?.textContent) ||
|
|
366
|
+
norm(item.querySelector(".name")?.textContent);
|
|
367
|
+
return name === raw || name.includes(raw);
|
|
368
|
+
}) ?? null;
|
|
369
|
+
if (!targetCard) return false;
|
|
370
|
+
|
|
371
|
+
function tryOpen(el) {
|
|
372
|
+
if (!(el instanceof HTMLElement)) return false;
|
|
373
|
+
if (el.classList.contains("disabled")) return false;
|
|
374
|
+
const st = window.getComputedStyle(el);
|
|
375
|
+
if (st.pointerEvents === "none" || Number(st.opacity) < 0.3) return false;
|
|
376
|
+
el.scrollIntoView({ block: "center", inline: "nearest" });
|
|
377
|
+
el.click();
|
|
378
|
+
return true;
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
const inner = targetCard.querySelector(".card-inner");
|
|
382
|
+
if (inner instanceof HTMLElement) {
|
|
383
|
+
inner.scrollIntoView({ block: "center", inline: "nearest" });
|
|
384
|
+
inner.click();
|
|
385
|
+
return true;
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
const resumeOnline = targetCard.querySelector("a.resume-btn-online");
|
|
389
|
+
if (tryOpen(resumeOnline)) return true;
|
|
390
|
+
const hrefResume = targetCard.querySelector('a[href*="c-resume"], a[href*="frame/c-resume"]');
|
|
391
|
+
if (tryOpen(hrefResume)) return true;
|
|
392
|
+
|
|
393
|
+
const links = Array.from(targetCard.querySelectorAll("a, button, .btn")).filter((node) => {
|
|
394
|
+
const t = norm(node.textContent);
|
|
395
|
+
return /在线简历|查看简历|简历预览|预览/.test(t);
|
|
396
|
+
});
|
|
397
|
+
if (links.length > 0 && tryOpen(links[0])) return true;
|
|
398
|
+
|
|
399
|
+
return false;
|
|
371
400
|
})()`));
|
|
372
401
|
}
|
|
373
402
|
export async function runRecommend(jobKeyword) {
|
|
@@ -382,9 +411,6 @@ export async function runRecommend(jobKeyword) {
|
|
|
382
411
|
}
|
|
383
412
|
catch (e) {
|
|
384
413
|
const message = e instanceof Error ? e.message : String(e);
|
|
385
|
-
if (e instanceof Error && e.message.includes('浏览器会话尚未初始化')) {
|
|
386
|
-
throw new Error(createWaitManualLoginRequiredText('查看推荐列表'));
|
|
387
|
-
}
|
|
388
414
|
throw new Error(`读取推荐列表失败:${message}`);
|
|
389
415
|
}
|
|
390
416
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recommend.js","sourceRoot":"","sources":["../../src/toolset/recommend.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"recommend.js","sourceRoot":"","sources":["../../src/toolset/recommend.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"send.d.ts","sourceRoot":"","sources":["../../src/toolset/send.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"send.d.ts","sourceRoot":"","sources":["../../src/toolset/send.ts"],"names":[],"mappings":"AAaA,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,CAAC;AAEF,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,CAyDzF"}
|
package/dist/toolset/send.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { randomIntInclusive, SEND_AFTER_ENTER_MS, SEND_INPUT_CLICK_MS, SEND_TYPING_GAP_MS, sleepRandom, typeTextWithRandomKeyDelay, } from '../browser/index.js';
|
|
2
|
-
import {
|
|
1
|
+
import { randomIntInclusive, selectAllModifierKey, SEND_AFTER_ENTER_MS, SEND_INPUT_CLICK_MS, SEND_TYPING_GAP_MS, sleepRandom, typeTextWithRandomKeyDelay, } from '../browser/index.js';
|
|
2
|
+
import { isBossChatIndexUrl } from '../common/auth.js';
|
|
3
3
|
import { withBossSessionPage } from '../common/boss_session_page.js';
|
|
4
4
|
import { runRequestAttachmentResume } from './action.js';
|
|
5
5
|
export async function runSendChatMessage(options) {
|
|
@@ -23,9 +23,10 @@ export async function runSendChatMessage(options) {
|
|
|
23
23
|
delay: randomIntInclusive(SEND_INPUT_CLICK_MS.min, SEND_INPUT_CLICK_MS.max),
|
|
24
24
|
});
|
|
25
25
|
await sleepRandom(60, 220, signal);
|
|
26
|
-
|
|
26
|
+
const selectAllMod = selectAllModifierKey();
|
|
27
|
+
await page.keyboard.down(selectAllMod);
|
|
27
28
|
await page.keyboard.press('KeyA');
|
|
28
|
-
await page.keyboard.up(
|
|
29
|
+
await page.keyboard.up(selectAllMod);
|
|
29
30
|
await sleepRandom(45, 180, signal);
|
|
30
31
|
await page.keyboard.press('Backspace');
|
|
31
32
|
await sleepRandom(80, 260, signal);
|
|
@@ -42,14 +43,10 @@ export async function runSendChatMessage(options) {
|
|
|
42
43
|
});
|
|
43
44
|
}
|
|
44
45
|
catch (e) {
|
|
45
|
-
const message = e instanceof Error ? e.message : String(e);
|
|
46
46
|
if (e instanceof Error) {
|
|
47
|
-
if (e.message.includes('浏览器会话尚未初始化')) {
|
|
48
|
-
throw new Error(createWaitManualLoginRequiredText('发送消息'));
|
|
49
|
-
}
|
|
50
47
|
throw e;
|
|
51
48
|
}
|
|
52
|
-
throw new Error(`发送消息失败:${
|
|
49
|
+
throw new Error(`发送消息失败:${String(e)}`);
|
|
53
50
|
}
|
|
54
51
|
}
|
|
55
52
|
//# sourceMappingURL=send.js.map
|
package/dist/toolset/send.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"send.js","sourceRoot":"","sources":["../../src/toolset/send.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,WAAW,EACX,0BAA0B,GAC3B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"send.js","sourceRoot":"","sources":["../../src/toolset/send.ts"],"names":[],"mappings":"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"}
|