@joohw/boss-cli 0.1.7 → 0.1.9
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 +25 -25
- package/README.md +36 -16
- package/dist/browser/agent_operating_indicator.d.ts +9 -0
- package/dist/browser/agent_operating_indicator.d.ts.map +1 -0
- package/dist/browser/agent_operating_indicator.js +92 -0
- package/dist/browser/agent_operating_indicator.js.map +1 -0
- package/dist/browser/c_resume_capture.d.ts +11 -0
- package/dist/browser/c_resume_capture.d.ts.map +1 -0
- package/dist/browser/c_resume_capture.js +76 -0
- package/dist/browser/c_resume_capture.js.map +1 -0
- package/dist/browser/chat.d.ts +3 -3
- package/dist/browser/chat.d.ts.map +1 -1
- package/dist/browser/chat.js +20 -4
- package/dist/browser/chat.js.map +1 -1
- package/dist/browser/human_delay.d.ts +5 -0
- package/dist/browser/human_delay.d.ts.map +1 -1
- package/dist/browser/human_delay.js +5 -0
- package/dist/browser/human_delay.js.map +1 -1
- package/dist/browser/index.d.ts +3 -1
- package/dist/browser/index.d.ts.map +1 -1
- package/dist/browser/index.js +3 -1
- package/dist/browser/index.js.map +1 -1
- 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 +1 -1
- package/dist/cli/banner.d.ts.map +1 -1
- package/dist/cli/banner.js +40 -1
- package/dist/cli/banner.js.map +1 -1
- package/dist/cli/cliRouter.d.ts.map +1 -1
- package/dist/cli/cliRouter.js +116 -59
- package/dist/cli/cliRouter.js.map +1 -1
- package/dist/cli/index.js +2 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/version.d.ts +7 -0
- package/dist/cli/version.d.ts.map +1 -0
- package/dist/cli/version.js +59 -0
- package/dist/cli/version.js.map +1 -0
- package/dist/common/boss_paywall_popup.d.ts +16 -0
- package/dist/common/boss_paywall_popup.d.ts.map +1 -0
- package/dist/common/boss_paywall_popup.js +140 -0
- package/dist/common/boss_paywall_popup.js.map +1 -0
- package/dist/common/boss_sidebar_nav.d.ts +6 -0
- package/dist/common/boss_sidebar_nav.d.ts.map +1 -0
- package/dist/common/boss_sidebar_nav.js +37 -0
- package/dist/common/boss_sidebar_nav.js.map +1 -0
- package/dist/common/c_resume_capture.d.ts +11 -0
- package/dist/common/c_resume_capture.d.ts.map +1 -0
- package/dist/common/c_resume_capture.js +76 -0
- package/dist/common/c_resume_capture.js.map +1 -0
- package/dist/toolset/action.d.ts +1 -1
- package/dist/toolset/action.d.ts.map +1 -1
- package/dist/toolset/action.js +311 -228
- package/dist/toolset/action.js.map +1 -1
- package/dist/toolset/c_resume_capture.d.ts +11 -0
- package/dist/toolset/c_resume_capture.d.ts.map +1 -0
- package/dist/toolset/c_resume_capture.js +76 -0
- package/dist/toolset/c_resume_capture.js.map +1 -0
- package/dist/toolset/chat.d.ts.map +1 -1
- package/dist/toolset/chat.js +4 -3
- package/dist/toolset/chat.js.map +1 -1
- package/dist/toolset/deep-search.d.ts +24 -0
- package/dist/toolset/deep-search.d.ts.map +1 -0
- package/dist/toolset/deep-search.js +1039 -0
- package/dist/toolset/deep-search.js.map +1 -0
- package/dist/toolset/greet.d.ts +2 -0
- package/dist/toolset/greet.d.ts.map +1 -0
- package/dist/toolset/greet.js +47 -0
- package/dist/toolset/greet.js.map +1 -0
- package/dist/toolset/index.d.ts +15 -5
- package/dist/toolset/index.d.ts.map +1 -1
- package/dist/toolset/index.js +19 -10
- package/dist/toolset/index.js.map +1 -1
- package/dist/toolset/jd.d.ts.map +1 -1
- package/dist/toolset/jd.js +29 -35
- package/dist/toolset/jd.js.map +1 -1
- package/dist/toolset/list.d.ts +6 -0
- package/dist/toolset/list.d.ts.map +1 -1
- package/dist/toolset/list.js +36 -60
- package/dist/toolset/list.js.map +1 -1
- package/dist/toolset/login.d.ts.map +1 -1
- package/dist/toolset/login.js +2 -5
- package/dist/toolset/login.js.map +1 -1
- package/dist/toolset/recommend.d.ts +34 -0
- package/dist/toolset/recommend.d.ts.map +1 -0
- package/dist/toolset/recommend.js +445 -0
- package/dist/toolset/recommend.js.map +1 -0
- package/dist/toolset/recommend_greet.d.ts +2 -0
- package/dist/toolset/recommend_greet.d.ts.map +1 -0
- package/dist/toolset/recommend_greet.js +27 -0
- package/dist/toolset/recommend_greet.js.map +1 -0
- package/dist/toolset/search.d.ts +23 -1
- package/dist/toolset/search.d.ts.map +1 -1
- package/dist/toolset/search.js +556 -48
- package/dist/toolset/search.js.map +1 -1
- package/dist/toolset/send.d.ts +0 -6
- package/dist/toolset/send.d.ts.map +1 -1
- package/dist/toolset/send.js +22 -190
- package/dist/toolset/send.js.map +1 -1
- package/package.json +2 -2
- package/skills/README.md +0 -11
- package/skills/boss-cli/SKILL.md +0 -58
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { ONLINE_RESUME_IFRAME_WAIT_MAX_MS } from '../browser/human_delay.js';
|
|
2
|
+
import { sleepRandom } from '../browser/timing.js';
|
|
3
|
+
/** 与 {@link describeBossPaywallPopupIfPresent} 中付费层判定一致;先匹配到 c-resume iframe 则返回 iframe。 */
|
|
4
|
+
const WAIT_FOR_IFRAME_OR_PAYWALL_SCRIPT = `(() => {
|
|
5
|
+
const iframe = document.querySelector(
|
|
6
|
+
'iframe[src*="c-resume"], iframe[src*="frame/c-resume"]',
|
|
7
|
+
);
|
|
8
|
+
if (iframe instanceof HTMLElement) {
|
|
9
|
+
const r = iframe.getBoundingClientRect();
|
|
10
|
+
if (r.width > 8 && r.height > 8) return "iframe";
|
|
11
|
+
}
|
|
12
|
+
const roots = Array.from(
|
|
13
|
+
document.querySelectorAll(".boss-popup__wrapper, .boss-dialog__wrapper"),
|
|
14
|
+
);
|
|
15
|
+
for (const root of roots) {
|
|
16
|
+
if (!(root instanceof HTMLElement)) continue;
|
|
17
|
+
const st = window.getComputedStyle(root);
|
|
18
|
+
if (st.display === "none" || st.visibility === "hidden" || Number(st.opacity) < 0.05) {
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
const rect = root.getBoundingClientRect();
|
|
22
|
+
if (rect.width < 20 || rect.height < 20) continue;
|
|
23
|
+
const hasVipUi = root.querySelector(
|
|
24
|
+
".block-vip2, .vip2-layout, .payment-layout-v2, .rights-table-vip, .qrcode-v1, .pay-wrap-qrcode-v1, .panel-deadline",
|
|
25
|
+
);
|
|
26
|
+
const text = (root.textContent || "").replace(/\\s+/g, " ");
|
|
27
|
+
const hasPayText =
|
|
28
|
+
/VIP账号|商品需付|直豆|扫码支付|请使用.*支付宝|请使用.*微信|增值服务协议|VIP\\s*\\d+项|限时特惠|直豆抵扣/.test(
|
|
29
|
+
text,
|
|
30
|
+
);
|
|
31
|
+
if (!hasVipUi && !hasPayText) continue;
|
|
32
|
+
return "paywall";
|
|
33
|
+
}
|
|
34
|
+
return "";
|
|
35
|
+
})()`;
|
|
36
|
+
/**
|
|
37
|
+
* 轮询直到出现 c-resume iframe、或出现付费墙、或超时。付费墙出现时不必再等满 {@link ONLINE_RESUME_IFRAME_WAIT_MAX_MS}。
|
|
38
|
+
*/
|
|
39
|
+
export async function waitForCResumeIframeOrPaywall(page, timeoutMs = ONLINE_RESUME_IFRAME_WAIT_MAX_MS) {
|
|
40
|
+
try {
|
|
41
|
+
const handle = await page.waitForFunction(WAIT_FOR_IFRAME_OR_PAYWALL_SCRIPT, {
|
|
42
|
+
timeout: timeoutMs,
|
|
43
|
+
polling: 200,
|
|
44
|
+
});
|
|
45
|
+
const v = (await handle.jsonValue());
|
|
46
|
+
if (v === 'iframe' || v === 'paywall') {
|
|
47
|
+
return v;
|
|
48
|
+
}
|
|
49
|
+
return 'neither';
|
|
50
|
+
}
|
|
51
|
+
catch (e) {
|
|
52
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
53
|
+
if (/timeout|Timeout|exceeded|Waiting failed/i.test(msg)) {
|
|
54
|
+
return 'neither';
|
|
55
|
+
}
|
|
56
|
+
throw e;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* 若当前存在 VIP/付费类弹层(判定规则与 {@link describeBossPaywallPopupIfPresent} 一致),
|
|
61
|
+
* 则点击关闭按钮以恢复页面可操作状态。返回是否执行了关闭。
|
|
62
|
+
*/
|
|
63
|
+
export async function closeBossPaywallPopupIfPresent(page) {
|
|
64
|
+
const closed = (await page.evaluate(`(() => {
|
|
65
|
+
const roots = Array.from(
|
|
66
|
+
document.querySelectorAll(".boss-popup__wrapper, .boss-dialog__wrapper"),
|
|
67
|
+
);
|
|
68
|
+
for (const root of roots) {
|
|
69
|
+
if (!(root instanceof HTMLElement)) continue;
|
|
70
|
+
const st = window.getComputedStyle(root);
|
|
71
|
+
if (st.display === "none" || st.visibility === "hidden" || Number(st.opacity) < 0.05) {
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
const rect = root.getBoundingClientRect();
|
|
75
|
+
if (rect.width < 20 || rect.height < 20) continue;
|
|
76
|
+
const hasVipUi = root.querySelector(
|
|
77
|
+
".block-vip2, .vip2-layout, .payment-layout-v2, .rights-table-vip, .qrcode-v1, .pay-wrap-qrcode-v1, .panel-deadline",
|
|
78
|
+
);
|
|
79
|
+
const text = (root.textContent || "").replace(/\\s+/g, " ");
|
|
80
|
+
const hasPayText =
|
|
81
|
+
/VIP账号|商品需付|直豆|扫码支付|请使用.*支付宝|请使用.*微信|增值服务协议|VIP\\s*\\d+项|限时特惠|直豆抵扣/.test(
|
|
82
|
+
text,
|
|
83
|
+
);
|
|
84
|
+
if (!hasVipUi && !hasPayText) continue;
|
|
85
|
+
const closeBtn = root.querySelector(
|
|
86
|
+
".boss-popup__close, .boss-dialog__close, .drawer-close, .icon-close",
|
|
87
|
+
);
|
|
88
|
+
if (closeBtn instanceof HTMLElement) {
|
|
89
|
+
closeBtn.click();
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return false;
|
|
94
|
+
})()`));
|
|
95
|
+
if (closed) {
|
|
96
|
+
await sleepRandom(220, 480);
|
|
97
|
+
}
|
|
98
|
+
return closed;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* 检测 Boss 页面上是否出现 VIP/付费购买类弹层(如点击「在线简历」或推荐预览后拦截权益时)。
|
|
102
|
+
* 命中则返回简短中文说明,供与「未出现 c-resume iframe」类错误拼接。
|
|
103
|
+
*/
|
|
104
|
+
export async function describeBossPaywallPopupIfPresent(page) {
|
|
105
|
+
return (await page.evaluate(`(() => {
|
|
106
|
+
const roots = Array.from(
|
|
107
|
+
document.querySelectorAll(".boss-popup__wrapper, .boss-dialog__wrapper"),
|
|
108
|
+
);
|
|
109
|
+
for (const root of roots) {
|
|
110
|
+
if (!(root instanceof HTMLElement)) continue;
|
|
111
|
+
const st = window.getComputedStyle(root);
|
|
112
|
+
if (st.display === "none" || st.visibility === "hidden" || Number(st.opacity) < 0.05) {
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
const rect = root.getBoundingClientRect();
|
|
116
|
+
if (rect.width < 20 || rect.height < 20) continue;
|
|
117
|
+
const hasVipUi = root.querySelector(
|
|
118
|
+
".block-vip2, .vip2-layout, .payment-layout-v2, .rights-table-vip, .qrcode-v1, .pay-wrap-qrcode-v1, .panel-deadline",
|
|
119
|
+
);
|
|
120
|
+
const text = (root.textContent || "").replace(/\\s+/g, " ");
|
|
121
|
+
const hasPayText =
|
|
122
|
+
/VIP账号|商品需付|直豆|扫码支付|请使用.*支付宝|请使用.*微信|增值服务协议|VIP\\s*\\d+项|限时特惠|直豆抵扣/.test(
|
|
123
|
+
text,
|
|
124
|
+
);
|
|
125
|
+
if (!hasVipUi && !hasPayText) continue;
|
|
126
|
+
const h = root.querySelector("h3.title, h4.title, .card-header .title");
|
|
127
|
+
const title = (h?.textContent || "").replace(/\\s+/g, " ").trim();
|
|
128
|
+
if (title) {
|
|
129
|
+
return (
|
|
130
|
+
"页面出现付费弹层(" +
|
|
131
|
+
title +
|
|
132
|
+
"),可能需开通 VIP 或购买权益后才能查看在线简历。"
|
|
133
|
+
);
|
|
134
|
+
}
|
|
135
|
+
return "页面出现 VIP/付费购买弹层,可能需开通权益后才能查看在线简历。";
|
|
136
|
+
}
|
|
137
|
+
return null;
|
|
138
|
+
})()`));
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=boss_paywall_popup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boss_paywall_popup.js","sourceRoot":"","sources":["../../src/common/boss_paywall_popup.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gCAAgC,EAAE,MAAM,2BAA2B,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,4FAA4F;AAC5F,MAAM,iCAAiC,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA+BrC,CAAC;AAEN;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,IAAU,EACV,YAAoB,gCAAgC;IAEpD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,iCAAiC,EAAE;YAC3E,OAAO,EAAE,SAAS;YAClB,OAAO,EAAE,GAAG;SACb,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,CAAC,MAAM,MAAM,CAAC,SAAS,EAAE,CAAY,CAAC;QAChD,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YACtC,OAAO,CAAC,CAAC;QACX,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QACpB,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvD,IAAI,0CAA0C,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACzD,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAAC,IAAU;IAC7D,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA8B/B,CAAC,CAAY,CAAC;IACnB,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iCAAiC,CAAC,IAAU;IAChE,OAAO,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAiCvB,CAAC,CAAkB,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Page } from 'puppeteer-core';
|
|
2
|
+
/**
|
|
3
|
+
* 点击 Boss 左侧 `.menu-list` 中的菜单项,并等待导航到给定 pathname(如 `/web/chat/index`)。
|
|
4
|
+
*/
|
|
5
|
+
export declare function clickBossSidebarMenuToPath(page: Page, menuLabel: string, targetPath: string): Promise<void>;
|
|
6
|
+
//# sourceMappingURL=boss_sidebar_nav.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boss_sidebar_nav.d.ts","sourceRoot":"","sources":["../../src/common/boss_sidebar_nav.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAI3C;;GAEG;AACH,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAuCf"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
const SIDEBAR_NAV_WAIT_MS = 15_000;
|
|
2
|
+
/**
|
|
3
|
+
* 点击 Boss 左侧 `.menu-list` 中的菜单项,并等待导航到给定 pathname(如 `/web/chat/index`)。
|
|
4
|
+
*/
|
|
5
|
+
export async function clickBossSidebarMenuToPath(page, menuLabel, targetPath) {
|
|
6
|
+
const clicked = (await page.evaluate(({ label, path }) => {
|
|
7
|
+
const norm = (v) => (v ?? '').replace(/\s+/g, '');
|
|
8
|
+
const links = Array.from(document.querySelectorAll('.menu-list a'));
|
|
9
|
+
const target = links.find((a) => {
|
|
10
|
+
const href = a.getAttribute('href') ?? '';
|
|
11
|
+
if (href.includes(path)) {
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
const text = norm(a.querySelector('.menu-item-content span')?.textContent ?? a.textContent);
|
|
15
|
+
return text.includes(label);
|
|
16
|
+
});
|
|
17
|
+
if (!(target instanceof HTMLElement)) {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
target.scrollIntoView({ block: 'center', inline: 'nearest' });
|
|
21
|
+
target.click();
|
|
22
|
+
return true;
|
|
23
|
+
}, { label: menuLabel, path: targetPath }));
|
|
24
|
+
if (!clicked) {
|
|
25
|
+
throw new Error(`未找到侧边栏菜单“${menuLabel}”,无法跳转到 ${targetPath}。`);
|
|
26
|
+
}
|
|
27
|
+
await page.waitForFunction((path) => {
|
|
28
|
+
try {
|
|
29
|
+
const p = window.location.pathname.replace(/\/+$/, '') || '/';
|
|
30
|
+
return p === path;
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
}, { timeout: SIDEBAR_NAV_WAIT_MS }, targetPath);
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=boss_sidebar_nav.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boss_sidebar_nav.js","sourceRoot":"","sources":["../../src/common/boss_sidebar_nav.ts"],"names":[],"mappings":"AAEA,MAAM,mBAAmB,GAAG,MAAM,CAAC;AAEnC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,IAAU,EACV,SAAiB,EACjB,UAAkB;IAElB,MAAM,OAAO,GAAG,CAAC,MAAM,IAAI,CAAC,QAAQ,CAClC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE;QAClB,MAAM,IAAI,GAAG,CAAC,CAA4B,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC7E,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC,CAAC;QACpE,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;YAC9B,MAAM,IAAI,GAAG,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YAC1C,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxB,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,yBAAyB,CAAC,EAAE,WAAW,IAAI,CAAC,CAAC,WAAW,CAAC,CAAC;YAC5F,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,CAAC,MAAM,YAAY,WAAW,CAAC,EAAE,CAAC;YACrC,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QAC9D,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC,EACD,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,CACvC,CAAY,CAAC;IAEd,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,YAAY,SAAS,WAAW,UAAU,GAAG,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,IAAI,CAAC,eAAe,CACxB,CAAC,IAAI,EAAE,EAAE;QACP,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC;YAC9D,OAAO,CAAC,KAAK,IAAI,CAAC;QACpB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC,EACD,EAAE,OAAO,EAAE,mBAAmB,EAAE,EAChC,UAAU,CACX,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
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` 为打开弹层前的视口快照,请用 `snapshotBossPageViewport(page)`(`page.viewport()` 常为 null 时勿直接用默认尺寸)。
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"c_resume_capture.d.ts","sourceRoot":"","sources":["../../src/common/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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
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` 为打开弹层前的视口快照,请用 `snapshotBossPageViewport(page)`(`page.viewport()` 常为 null 时勿直接用默认尺寸)。
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"c_resume_capture.js","sourceRoot":"","sources":["../../src/common/c_resume_capture.ts"],"names":[],"mappings":"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"}
|
package/dist/toolset/action.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Page } from 'puppeteer-core';
|
|
2
|
-
export type ChatPageAction = 'resume' | 'not-fit' | 'remark' | 'agree-resume' | 'history';
|
|
2
|
+
export type ChatPageAction = 'resume' | 'not-fit' | 'remark' | 'agree-resume' | 'request-attachment-resume' | 'history' | 'exchange-wechat';
|
|
3
3
|
export declare function runChatActionOnCurrentConversation(page: Page, options: {
|
|
4
4
|
action: ChatPageAction;
|
|
5
5
|
remark?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../src/toolset/action.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../src/toolset/action.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAmiB3C,MAAM,MAAM,cAAc,GACtB,QAAQ,GACR,SAAS,GACT,QAAQ,GACR,cAAc,GACd,2BAA2B,GAC3B,SAAS,GACT,iBAAiB,CAAC;AAEtB,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,CAsCjB"}
|