@joohw/boss-cli 0.1.5 → 0.1.7
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/dist/browser/browser_session.d.ts.map +1 -1
- package/dist/browser/browser_session.js +38 -0
- package/dist/browser/browser_session.js.map +1 -1
- package/dist/browser/cdp_browser.d.ts +1 -2
- package/dist/browser/cdp_browser.d.ts.map +1 -1
- package/dist/browser/cdp_browser.js +29 -5
- package/dist/browser/cdp_browser.js.map +1 -1
- package/dist/browser/chat.d.ts +2 -2
- package/dist/browser/chat.d.ts.map +1 -1
- package/dist/browser/chat.js +48 -18
- package/dist/browser/chat.js.map +1 -1
- package/dist/browser/index.d.ts +0 -1
- package/dist/browser/index.d.ts.map +1 -1
- package/dist/browser/index.js +0 -1
- package/dist/browser/index.js.map +1 -1
- package/dist/cli/cliRouter.d.ts.map +1 -1
- package/dist/cli/cliRouter.js +69 -19
- package/dist/cli/cliRouter.js.map +1 -1
- package/dist/toolset/action.d.ts +7 -0
- package/dist/toolset/action.d.ts.map +1 -0
- package/dist/toolset/action.js +433 -0
- package/dist/toolset/action.js.map +1 -0
- package/dist/toolset/chat.d.ts +4 -0
- package/dist/toolset/chat.d.ts.map +1 -0
- package/dist/toolset/chat.js +434 -0
- package/dist/toolset/chat.js.map +1 -0
- package/dist/toolset/chat_action.d.ts +7 -0
- package/dist/toolset/chat_action.d.ts.map +1 -0
- package/dist/toolset/chat_action.js +355 -0
- package/dist/toolset/chat_action.js.map +1 -0
- package/dist/toolset/index.d.ts +13 -6
- package/dist/toolset/index.d.ts.map +1 -1
- package/dist/toolset/index.js +20 -6
- package/dist/toolset/index.js.map +1 -1
- package/dist/toolset/jd.d.ts +10 -0
- package/dist/toolset/jd.d.ts.map +1 -0
- package/dist/toolset/jd.js +418 -0
- package/dist/toolset/jd.js.map +1 -0
- package/dist/toolset/list.d.ts +4 -0
- package/dist/toolset/list.d.ts.map +1 -0
- package/dist/toolset/list.js +156 -0
- package/dist/toolset/list.js.map +1 -0
- package/dist/toolset/open_chat.d.ts +1 -4
- package/dist/toolset/open_chat.d.ts.map +1 -1
- package/dist/toolset/open_chat.js +66 -164
- package/dist/toolset/open_chat.js.map +1 -1
- package/dist/toolset/search.d.ts +2 -0
- package/dist/toolset/search.d.ts.map +1 -0
- package/dist/toolset/search.js +174 -0
- package/dist/toolset/search.js.map +1 -0
- package/dist/toolset/send.d.ts +12 -0
- package/dist/toolset/send.d.ts.map +1 -0
- package/dist/toolset/send.js +214 -0
- package/dist/toolset/send.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { createWaitManualLoginRequiredText, isBossChatIndexUrl, randomIntInclusive, SEND_AFTER_ENTER_MS, SEND_BEFORE_RESUME_MS, SEND_INPUT_CLICK_MS, SEND_TYPING_GAP_MS, sleepRandom, typeTextWithRandomKeyDelay, withChatPage, } from '../browser/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* 对方「附件简历」确认卡片上点击「同意」或「拒绝」。
|
|
4
|
+
* 对应按钮 disabled 时视为已处理。
|
|
5
|
+
*/
|
|
6
|
+
async function runIncomingResumeCardAction(page, which) {
|
|
7
|
+
const currentUrl = page.url();
|
|
8
|
+
if (!isBossChatIndexUrl(currentUrl)) {
|
|
9
|
+
throw new Error('请先进入聊天列表页(/web/chat/index)并打开候选人聊天。');
|
|
10
|
+
}
|
|
11
|
+
const inCandidateChat = await page.$('.base-info-single-container');
|
|
12
|
+
if (!inCandidateChat) {
|
|
13
|
+
throw new Error('请先打开候选人聊天详情页,再操作附件简历卡片。');
|
|
14
|
+
}
|
|
15
|
+
await sleepRandom(200, 550);
|
|
16
|
+
const result = (await page.evaluate((w) => {
|
|
17
|
+
function norm(v) {
|
|
18
|
+
return (v ?? "").replace(/\\s+/g, " ").trim();
|
|
19
|
+
}
|
|
20
|
+
function isDisabledBtn(el) {
|
|
21
|
+
const cls = el.className ?? "";
|
|
22
|
+
if (/disabled|forbid|ban/i.test(cls))
|
|
23
|
+
return true;
|
|
24
|
+
if (el.getAttribute("disabled") !== null)
|
|
25
|
+
return true;
|
|
26
|
+
const st = window.getComputedStyle(el);
|
|
27
|
+
return st.pointerEvents === "none" || Number(st.opacity) < 0.35;
|
|
28
|
+
}
|
|
29
|
+
function matchesLabel(t, mode) {
|
|
30
|
+
if (mode === "agree") {
|
|
31
|
+
return t === "同意" || t.indexOf("同意") === 0;
|
|
32
|
+
}
|
|
33
|
+
return t === "拒绝" || t.indexOf("拒绝") === 0;
|
|
34
|
+
}
|
|
35
|
+
const items = Array.from(document.querySelectorAll(".chat-message-list .message-item"));
|
|
36
|
+
for (let i = items.length - 1; i >= 0; i--) {
|
|
37
|
+
const friend = items[i].querySelector(".item-friend");
|
|
38
|
+
if (!friend)
|
|
39
|
+
continue;
|
|
40
|
+
const title = norm(friend.querySelector(".message-card-top-title")?.textContent);
|
|
41
|
+
if (!title || title.indexOf("附件简历") === -1)
|
|
42
|
+
continue;
|
|
43
|
+
const buttons = friend.querySelectorAll(".message-card-buttons .card-btn");
|
|
44
|
+
for (let j = 0; j < buttons.length; j++) {
|
|
45
|
+
const btn = buttons[j];
|
|
46
|
+
const t = norm(btn.textContent);
|
|
47
|
+
if (!matchesLabel(t, w))
|
|
48
|
+
continue;
|
|
49
|
+
if (isDisabledBtn(btn)) {
|
|
50
|
+
return { kind: "already_handled", which: w };
|
|
51
|
+
}
|
|
52
|
+
btn.scrollIntoView({ block: "center", inline: "nearest" });
|
|
53
|
+
btn.click();
|
|
54
|
+
return { kind: "clicked", which: w };
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return { kind: "not_found", which: w };
|
|
58
|
+
}, which));
|
|
59
|
+
if (result.kind === 'not_found') {
|
|
60
|
+
throw new Error('未找到待处理的「对方发送附件简历」确认卡片(标题需含「附件简历」)。');
|
|
61
|
+
}
|
|
62
|
+
if (result.kind === 'already_handled') {
|
|
63
|
+
return result.which === 'agree'
|
|
64
|
+
? '对方发来的附件简历请求已处理(同意按钮已禁用)。'
|
|
65
|
+
: '对方发来的附件简历请求已处理(拒绝按钮已禁用)。';
|
|
66
|
+
}
|
|
67
|
+
await sleepRandom(350, 900);
|
|
68
|
+
return result.which === 'agree'
|
|
69
|
+
? '已点击「同意」,接受对方发送的附件简历。'
|
|
70
|
+
: '已点击「拒绝」,拒绝接收对方附件简历。';
|
|
71
|
+
}
|
|
72
|
+
async function runRequestOfflineResume(page) {
|
|
73
|
+
try {
|
|
74
|
+
const currentUrl = page.url();
|
|
75
|
+
if (!isBossChatIndexUrl(currentUrl)) {
|
|
76
|
+
throw new Error('请先进入聊天列表页(/web/chat/index)并打开候选人聊天。');
|
|
77
|
+
}
|
|
78
|
+
const inCandidateChat = await page.$('.base-info-single-container');
|
|
79
|
+
if (!inCandidateChat) {
|
|
80
|
+
throw new Error('请先打开候选人聊天详情页,再执行索取离线简历。');
|
|
81
|
+
}
|
|
82
|
+
const hasFriendResumeAttachment = (await page.evaluate(`(() => {
|
|
83
|
+
const items = Array.from(document.querySelectorAll(".chat-message-list .message-item"));
|
|
84
|
+
return items.some((item) => !!item.querySelector(".item-friend .resume-icon"));
|
|
85
|
+
})()`));
|
|
86
|
+
if (hasFriendResumeAttachment) {
|
|
87
|
+
return '历史消息中已有候选人发来的附件简历,已跳过索取离线简历。';
|
|
88
|
+
}
|
|
89
|
+
const availability = (await page.evaluate(`(() => {
|
|
90
|
+
const items = Array.from(document.querySelectorAll(".operate-icon-item"));
|
|
91
|
+
const target = items.find((el) => {
|
|
92
|
+
const text = (el.querySelector(".operate-btn")?.textContent ?? "").replace(/\\s+/g, "");
|
|
93
|
+
return text.includes("求简历");
|
|
94
|
+
});
|
|
95
|
+
if (!target) return { found: false, available: false };
|
|
96
|
+
const btn = target.querySelector(".operate-btn");
|
|
97
|
+
const className = [target.className ?? "", btn?.className ?? ""].join(" ");
|
|
98
|
+
const disabled = /disabled|forbid|ban/.test(className);
|
|
99
|
+
return { found: true, available: !disabled };
|
|
100
|
+
})()`));
|
|
101
|
+
if (!availability.found || !availability.available) {
|
|
102
|
+
throw new Error('当前不可索取离线简历。通常需要双方至少各发送过一条消息后,才会变为可索取状态。');
|
|
103
|
+
}
|
|
104
|
+
await sleepRandom(280, 720);
|
|
105
|
+
const clicked = (await page.evaluate(`(() => {
|
|
106
|
+
const items = Array.from(document.querySelectorAll(".operate-icon-item"));
|
|
107
|
+
const target = items.find((el) => {
|
|
108
|
+
const text = (el.querySelector(".operate-btn")?.textContent ?? "").replace(/\\s+/g, "");
|
|
109
|
+
return text.includes("求简历");
|
|
110
|
+
});
|
|
111
|
+
if (!target) return false;
|
|
112
|
+
const host = target;
|
|
113
|
+
host.scrollIntoView({ block: "center", inline: "nearest" });
|
|
114
|
+
const btn = target.querySelector(".operate-btn");
|
|
115
|
+
(btn || host).click();
|
|
116
|
+
return true;
|
|
117
|
+
})()`));
|
|
118
|
+
if (!clicked) {
|
|
119
|
+
throw new Error('未找到“求简历”按钮,无法执行索取。');
|
|
120
|
+
}
|
|
121
|
+
await sleepRandom(400, 980);
|
|
122
|
+
const confirmed = (await page.evaluate(`(() => {
|
|
123
|
+
const confirms = Array.from(document.querySelectorAll(".exchange-tooltip .boss-btn-primary.boss-btn"));
|
|
124
|
+
const visible = confirms.find((el) => {
|
|
125
|
+
const style = window.getComputedStyle(el);
|
|
126
|
+
return style.display !== "none" && style.visibility !== "hidden";
|
|
127
|
+
});
|
|
128
|
+
if (!visible) return false;
|
|
129
|
+
visible.click();
|
|
130
|
+
return true;
|
|
131
|
+
})()`));
|
|
132
|
+
if (!confirmed) {
|
|
133
|
+
throw new Error('已点击“求简历”,但未找到确认按钮(确定)。');
|
|
134
|
+
}
|
|
135
|
+
return '已发起索取离线简历请求。';
|
|
136
|
+
}
|
|
137
|
+
catch (e) {
|
|
138
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
139
|
+
if (e instanceof Error) {
|
|
140
|
+
throw e;
|
|
141
|
+
}
|
|
142
|
+
throw new Error(`索取离线简历失败:${message}`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
export async function runSendChatMessage(options) {
|
|
146
|
+
const messageText = (options.text ?? '').trim();
|
|
147
|
+
const action = options.action;
|
|
148
|
+
const signal = options.signal;
|
|
149
|
+
if (!messageText && !action) {
|
|
150
|
+
throw new Error('请指定 --text 或 --action 至少其一。');
|
|
151
|
+
}
|
|
152
|
+
try {
|
|
153
|
+
return await withChatPage(async (page) => {
|
|
154
|
+
const currentUrl = page.url();
|
|
155
|
+
if (!isBossChatIndexUrl(currentUrl)) {
|
|
156
|
+
throw new Error('请先进入聊天列表页(/web/chat/index)并打开候选人聊天。');
|
|
157
|
+
}
|
|
158
|
+
const lines = [];
|
|
159
|
+
if (messageText) {
|
|
160
|
+
const input = await page.$('#boss-chat-editor-input');
|
|
161
|
+
if (!input) {
|
|
162
|
+
throw new Error('未找到聊天输入框(#boss-chat-editor-input)。');
|
|
163
|
+
}
|
|
164
|
+
await input.click({
|
|
165
|
+
delay: randomIntInclusive(SEND_INPUT_CLICK_MS.min, SEND_INPUT_CLICK_MS.max),
|
|
166
|
+
});
|
|
167
|
+
await sleepRandom(60, 220, signal);
|
|
168
|
+
await page.keyboard.down('Control');
|
|
169
|
+
await page.keyboard.press('KeyA');
|
|
170
|
+
await page.keyboard.up('Control');
|
|
171
|
+
await sleepRandom(45, 180, signal);
|
|
172
|
+
await page.keyboard.press('Backspace');
|
|
173
|
+
await sleepRandom(80, 260, signal);
|
|
174
|
+
await typeTextWithRandomKeyDelay(page, messageText, SEND_TYPING_GAP_MS.min, SEND_TYPING_GAP_MS.max, signal);
|
|
175
|
+
await sleepRandom(120, 420, signal);
|
|
176
|
+
await page.keyboard.press('Enter');
|
|
177
|
+
await sleepRandom(SEND_AFTER_ENTER_MS.min, SEND_AFTER_ENTER_MS.max, signal);
|
|
178
|
+
lines.push(`已发送消息:${messageText}`);
|
|
179
|
+
}
|
|
180
|
+
if (action) {
|
|
181
|
+
if (lines.length > 0) {
|
|
182
|
+
await sleepRandom(SEND_BEFORE_RESUME_MS.min, SEND_BEFORE_RESUME_MS.max, signal);
|
|
183
|
+
}
|
|
184
|
+
switch (action) {
|
|
185
|
+
case 'request-resume':
|
|
186
|
+
lines.push(await runRequestOfflineResume(page));
|
|
187
|
+
break;
|
|
188
|
+
case 'agree-resume':
|
|
189
|
+
lines.push(await runIncomingResumeCardAction(page, 'agree'));
|
|
190
|
+
break;
|
|
191
|
+
case 'confuse-resume':
|
|
192
|
+
lines.push(await runIncomingResumeCardAction(page, 'refuse'));
|
|
193
|
+
break;
|
|
194
|
+
default: {
|
|
195
|
+
const _x = action;
|
|
196
|
+
throw new Error(`未知的 action: ${String(_x)}`);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return lines.join('\n\n');
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
catch (e) {
|
|
204
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
205
|
+
if (e instanceof Error) {
|
|
206
|
+
if (e.message.includes('浏览器会话尚未初始化')) {
|
|
207
|
+
throw new Error(createWaitManualLoginRequiredText('发送消息'));
|
|
208
|
+
}
|
|
209
|
+
throw e;
|
|
210
|
+
}
|
|
211
|
+
throw new Error(`发送消息失败:${message}`);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=send.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"send.js","sourceRoot":"","sources":["../../src/toolset/send.ts"],"names":[],"mappings":"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"}
|