@viyzhu/boss-cli-fork 0.7.3 → 0.8.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 CHANGED
@@ -1,284 +1,346 @@
1
- # boss-cli — Boss直聘自动化 CLI | 批量发消息 · 自动打招呼 · AI Agent 招聘工具
2
-
3
- [![npm version](https://img.shields.io/npm/v/@joohw/boss-cli)](https://www.npmjs.com/package/@joohw/boss-cli)
4
- [![npm downloads](https://img.shields.io/npm/dm/@joohw/boss-cli)](https://www.npmjs.com/package/@joohw/boss-cli)
5
- [![license](https://img.shields.io/github/license/joohw/boss-cli)](./LICENSE)
6
- [![GitHub stars](https://img.shields.io/github/stars/joohw/boss-cli)](https://github.com/joohw/boss-cli)
7
-
8
- 官网主页:[boss-cli.com](https://boss-cli.com)
9
-
10
- **boss-cli**(`@joohw/boss-cli`)是开源的 **Boss直聘自动化命令行工具**。基于 Puppeteer / CDP 协议驱动本机 Chrome,无需 Selenium,把 Boss直聘 B 端的核心 HR 操作搬进终端:**候选人列表**、**批量发消息**、**自动打招呼**、**在线简历预览**、**深度搜索**、**职位管理**。
11
-
12
- 适合 HR 日常提效,也适合 Claude / GPT / Gemini 等 **AI Agent** 通过子进程调用,搭建全自动化招聘流水线。
13
-
14
- ```bash
15
- npm install -g @joohw/boss-cli@latest
16
- boss login
17
- boss help
18
- ```
19
-
20
- > 纯 CLI,不内置对话式 Agent。每条命令输出结构化纯文本,Agent 可直接解析并编排多步流程。
21
-
22
- ---
23
-
24
- ## 为什么选择 boss-cli?
25
-
26
- | 场景 | 命令 |
27
- | --- | --- |
28
- | Boss直聘批量发消息 | `boss send --text "..."` 配合脚本循环 |
29
- | Boss直聘自动打招呼 | `boss greet <姓名> [--job <岗位>]` |
30
- | Boss直聘候选人筛选 | `boss list` / `boss list --unread` |
31
- | Boss直聘脚本自动化 | 本机 Chrome + CDP,Cookie 本地存储 |
32
- | AI 招聘 Agent | 子进程调用,输出 Agent 友好 |
33
- | 数据隐私 | 不经过第三方服务器,数据在 `~/.boss-cli/` |
34
-
35
- ---
36
-
37
- ## 安装
38
-
39
- **要求**:Node.js ≥ 20,本机已安装 Chrome / Chromium。
40
-
41
- ```bash
42
- npm install -g @joohw/boss-cli@latest
43
- boss help
44
- ```
45
-
46
- ### 安装本 fork(含尚未进入上游的修复)
47
-
48
- 本仓库是 [`joohw/boss-cli`](https://github.com/joohw/boss-cli) 的 fork,包含风控页反弹熔断等
49
- 上游尚未发布的修复,以 `@viyzhu/boss-cli-fork` 单独发布:
50
-
51
- ```bash
52
- npm install -g @viyzhu/boss-cli-fork@latest
53
- boss version
54
- ```
55
-
56
- 两个包提供同名的 `boss` 命令,**不要同时装**;换装前先 `npm uninstall -g @joohw/boss-cli`。
57
- 也可以直接装仓库 tarball(等价于 main 最新提交):
58
-
59
- ```bash
60
- npm install -g https://github.com/Viy1204/boss-cli/archive/refs/heads/main.tar.gz
61
- ```
62
-
63
- > 别用 `npm i -g github:Viy1204/boss-cli`:npm 会把全局包链到 npm cache 里的临时 clone,
64
- > 缓存清理后 `boss` 直接 `Cannot find module`。
65
-
66
- 如果你觉得 boss-cli 好用,欢迎给本仓库一个 Star;使用中遇到问题请提交 Issue,新功能或改进也欢迎提交 PR。
67
-
68
- > **macOS / Linux 权限问题**:系统 Node 默认全局前缀在 `/usr/local`,当前账户无写权限。建议先把全局前缀挪到用户目录(一次性配置):
69
- >
70
- > ```bash
71
- > mkdir -p ~/.npm-global
72
- > npm config set prefix ~/.npm-global
73
- > echo 'export PATH=~/.npm-global/bin:$PATH' >> ~/.zshrc # bash 用 ~/.bash_profile
74
- > source ~/.zshrc
75
- > ```
76
- >
77
- > 使用 `fnm` / `nvm` / `volta` 的用户可跳过此步。Windows 用户无需此步。
78
-
79
- ---
80
-
81
- ## 命令一览
82
-
83
- | 命令 | 说明 |
84
- | --- | --- |
85
- | `boss login` | 打开 Boss直聘登录页(扫码/验证后手动完成) |
86
- | `boss update` | 通过 npm 安装最新版 boss-cli |
87
- | `boss list [--unread]` | 读取聊天列表;`--unread` 仅未读 |
88
- | `boss chat <姓名> [--strict]` | 打开指定候选人会话 |
89
- | `boss chat [姓名] --index <序号> [--unread] [--strict]` | 按 `boss list` 输出序号打开会话;同名候选人建议用序号 |
90
- | `boss send [--text <内容>]` | 向当前会话发送消息 |
91
- | `boss action <操作>` | 索要简历 / 不合适 / 备注 / 交换微信等 |
92
- | `boss recommend [岗位关键字]` | 读取推荐候选人列表 |
93
- | `boss search [关键词]` | 常规搜索牛人列表 |
94
- | `boss greet <姓名> [--job <岗位>]` | 在当前推荐/深度搜索页对候选人打招呼(不会自动跳转) |
95
- | `boss preview <姓名>` | 在线简历预览(每日次数有限) |
96
- | `boss deep-search [岗位关键字] [--core <要求>] [--bonus <加分项>] [--clear-core] [--clear-bonus] [--match]` | 深度搜索表单状态;`--core` / `--bonus` 可重复,并按传入列表同步分组;`--clear-*` 清空分组;默认不输出候选列表,`--match` 输出最新 20 条 |
97
- | `boss positions` | 读取职位列表 |
98
- | `boss jd <名称>` | 抓取职位 JD 缓存到本地 |
99
-
100
- 完整用法:`boss help`
101
-
102
- ---
103
-
104
- ## 快速上手
105
-
106
- ```bash
107
- # 1. 登录
108
- boss login
109
-
110
- # 2. 查看未读候选人
111
- boss list --unread
112
-
113
- # 3. 打开会话并发送消息
114
- boss chat 张三
115
- boss send --text "您好,请问方便发一下简历吗?"
116
-
117
- # 同名或姓名定位失败时,按 list 序号打开;--unread 对应 list --unread 的序号
118
- boss chat --index 2 --unread
119
- boss chat 张三 --index 2 --unread --strict
120
-
121
- # 4. 先进入推荐页,再在当前页打招呼
122
- boss recommend 前端工程师
123
- boss greet 张三 --job 前端工程师
124
-
125
- # 5. 常规搜索牛人
126
- boss search "langgraph"
127
-
128
- # 6. 深度搜索:按传入列表同步分组条件,但不消耗匹配次数
129
- boss deep-search --core "AI产品经理" --core "做过 RAG 或 Agent 产品落地" --bonus "有 ToB 平台经验"
130
-
131
- # 只有明确添加 --match 才会点击「立即匹配」,会消耗今日匹配次数,并只输出最新 20 条
132
- boss deep-search --match
133
- ```
134
-
135
- ---
136
-
137
- ## 与 AI Agent 集成
138
-
139
- boss-cli 每条命令输出纯文本,适合 LLM 通过子进程编排:
140
-
141
- ```
142
- 1. boss list --unread → 获取未读候选人
143
- 2. boss chat <姓名> → 打开会话
144
- 同名时用 boss chat [姓名] --index <序号> [--unread]
145
- 3. boss action resume → 索要简历
146
- 4. boss send -t "..." → 发送消息
147
- 5. boss recommend → 读取推荐列表
148
- 6. boss search <关键词> → 读取常规搜索列表
149
- 7. boss greet <姓名> → 批量打招呼
150
- ```
151
-
152
- 详见 [AGENTS.md](./AGENTS.md)。
153
-
154
- ---
155
-
156
- ## 常见问题
157
-
158
- **boss-cli 是什么?**
159
- 开源 Boss直聘自动化 CLI,用终端命令代替手动操作 Boss直聘网页,支持 AI Agent 编排。
160
-
161
- **和 Selenium / Playwright 有什么区别?**
162
- boss-cli 基于 CDP 连接本机 Chrome,复用已有登录态,针对 Boss直聘 B 端页面做了专用封装,开箱即用。
163
-
164
- **需要额外下载浏览器吗?**
165
- 不需要。使用本机已安装的 Chrome / Chromium,通过 CDP 协议连接。
166
-
167
- **数据会上传到服务器吗?**
168
- 不会。Cookie 和缓存仅存储在本地 `~/.boss-cli/`,CLI 不经过任何第三方服务器。
169
-
170
- **浏览器是有头还是无头?能不能藏起来?**
171
-
172
- **默认有头**(真窗口,和上游一致)。代价是窗口启动时会抢一次键盘焦点。
173
-
174
- **不建议改成无头。** 本 fork 2026-08-19 之前默认无头,理由是不抢焦点;后来观测到两个独立的账号事故都指向无头,于是翻回有头:
175
-
176
- - 一个账号被 BOSS 限制 **web 端登录**,页面文案明确写「检测到您的账号存在使用第三方招聘管理系统、插件、外挂、软件等辅助工具」——判定的是**工具指纹**,不是打招呼频率。
177
- - 另一个团队用上游版(默认有头)长期没事,他们的 AI 擅自改走无头之后当天封号。
178
-
179
- 无头 Chrome 的 `User-Agent` 会自报 `HeadlessChrome/<ver>`,而 Client Hints 仍说 `Google Chrome`——这个自相矛盾本身就是强信号。
180
-
181
- **注意 liepin-cli 那边默认仍是无头**:猎聘的风控形态一次都没观测过,没有证据支持翻它的默认。所以 `RECRUIT_BROWSER_HIDDEN` 的语义是**统一覆盖开关**而非「提供默认值」——不设时两个 CLI 各用自己的默认(boss 有头、liepin 无头),显式设了才把两家拉平。
182
-
183
- 真要无头(清楚这是在拿账号冒险):
184
-
185
- ```bash
186
- RECRUIT_BROWSER_HIDDEN=true boss list # 招聘工具链共读的开关(boss / liepin / DSH 面板都认)
187
- BOSS_BROWSER_HEADLESS=true boss list # 只影响 boss-cli,优先级更高
188
- ```
189
-
190
- **换了变量不会让已经在跑的那只切换模式** —— 先 `boss shutdown` 关掉它,下条命令才会按新模式重启。
191
-
192
- **窗口会不会弹到前台?** 每条命令开头会把 Boss 标签页激活(`bringToFront`),Windows 上这会把**最小化**的窗口还原并抢焦点。现在的规则:窗口已被你最小化就不动它;想彻底禁止抢前台(比如把 CLI 接进后台系统定时跑),设:
193
-
194
- ```bash
195
- BOSS_BROWSER_NO_FOREGROUND=true boss list
196
- ```
197
-
198
- `boss login` 不受此开关影响,扫码必须看得见。
199
-
200
- 浏览器跨命令常驻(命令结束只断 CDP、不关窗口),跑完想释放内存就 `boss shutdown`(登录态保留)。
201
-
202
- `boss login` **一直是有头的** —— 扫码必须看得见。真开了无头,它也会自己把无头实例关掉、以有头重启(登录态在 `~/.boss-cli/.cache/` 里,不会丢)。
203
-
204
- 想在不切窗口的前提下看浏览器在做什么,用 recruiting-copilot 的 DSH「招聘浏览器」面板:把画面推到 Web UI 里。**面板默认折叠、默认只读**——在面板里手动操作不受本 CLI 那套页面守卫的保护(守卫挂在 CLI 进程的 CDP session 上,进程一退出就全失效),所以招聘动作请走命令。
205
-
206
- **如何自定义操作蒙层品牌?**
207
- 设置环境变量 `BOSS_CLI_AGENT_BRAND=你的品牌名`。
208
-
209
- **`boss preview` 报「截图疑似空壳」是什么意思?**
210
-
211
- 截出来的 PNG 只有水印、没有简历正文。连续 preview 很多人时会出现([recruiting-copilot#37](https://github.com/Viy1204/recruiting-copilot/issues/37):约第 9 人起稳定复现,但**人眼看浏览器里正文是在的**,所以是截图路径的问题,不是平台不让看)。
212
-
213
- 0.7.2 起遇到这种情况会**直接报错**,不再假报成功;PNG 仍然落盘,方便你自己看。判据是 PNG 字节数 / 截图像素数,两个可调项:
214
-
215
- ```bash
216
- BOSS_RESUME_BLANK_BYTES_PER_PIXEL=0.015 # 空壳阈值,设 0 关掉这个检查
217
- BOSS_RESUME_SCREENSHOT_VIEWPORT_HEIGHT=1600 # 截图时临时拉高的视口高度(默认 5000)
218
- ```
219
-
220
- 如果报错里还提到「有 N 个可见在线简历面板」,说明上一次弹层没关净、截到了残留的旧面板 —— `boss shutdown` 重启浏览器可恢复。
221
-
222
- **别把 preview 当批量工具**:它吃平台的每日查看额度,也是最容易踩上面这些坑的路径。先用列表卡片做硬否决,只对强候选 preview,其余走「打招呼 → 要简历附件」。
223
-
224
- ---
225
-
226
- ## 数据目录
227
-
228
- | 路径 | 内容 |
229
- | --- | --- |
230
- | `~/.boss-cli/.cache/` | Cookie、浏览器用户数据 |
231
- | `~/.boss-cli/jd/` | `boss jd` 缓存的岗位描述 |
232
-
233
- ---
234
-
235
- ## 开发
236
-
237
- ```bash
238
- npm run build # 编译到 dist/
239
- npm run dev # build + 交互模式
240
- ```
241
-
242
- ---
243
-
244
- ## 发布
245
-
246
- 仓库通过 GitHub Actions 自动发布,工作流文件是 `.github/workflows/tag-publish.yml`。
247
-
248
- 发布新版本时,本地只需要更新 `package.json` 版本号、提交代码、创建并推送 `v*` tag:
249
-
250
- ```bash
251
- git tag -a v0.7.0 -m "v0.7.0"
252
- git push origin main
253
- git push origin v0.7.0
254
- ```
255
-
256
- tag 推送后,workflow 会自动安装依赖、构建、检查 npm 版本、发布、更新 `latest` dist-tag,并创建或更新 GitHub Release。
257
- 本地不需要手动执行 `npm publish`。
258
-
259
- **别用 `gh release create` 顺带建 tag**:那样 tag 是 Releases API 在服务端建的,
260
- GitHub **不会**为它发 `push` 事件,`on: push.tags` 因此不触发(v0.6.8 和 v0.7.0 就是这么漏掉的,
261
- 最后靠手动 `workflow_dispatch` 才发出去)。workflow 现在额外挂了 `release: [published]` 兜底,
262
- 所以先建 Release 也能发;但推荐仍是先 `git push origin vX.Y.Z`,让 Release 由 workflow 自动生成。
263
-
264
- **发的是哪个包**:workflow 用 `node -p "require('./package.json').name"` 取包名,所以本 fork 发布的是
265
- **`@viyzhu/boss-cli-fork`**,不是上游的 `@joohw/boss-cli`。(此处此前写着上游包名,已订正。)
266
-
267
- npm 发布依赖仓库 Secret `NPM_TOKEN`;**没配这个 secret 时 workflow 会打印
268
- `NPM_TOKEN secret is missing; skipping publish.` 然后跳过发布,tag 推送本身仍然"成功"**——
269
- 所以推完 tag 要去 Actions 里确认那一步真的跑了。同名同版本已发布过时也会跳过。
270
-
271
- ---
272
-
273
- ## 许可
274
-
275
- [GPL-3.0](./LICENSE)
276
-
277
- ---
278
-
279
- ## 相关链接
280
-
281
- - 官网:[boss-cli.com](https://boss-cli.com)
282
- - npm:[@joohw/boss-cli](https://www.npmjs.com/package/@joohw/boss-cli)
283
- - GitHub:[joohw/boss-cli](https://github.com/joohw/boss-cli)
284
- - 问题反馈:[Issues](https://github.com/joohw/boss-cli/issues)
1
+ # boss-cli — Boss直聘自动化 CLI | 批量发消息 · 自动打招呼 · AI Agent 招聘工具
2
+
3
+ [![npm version](https://img.shields.io/npm/v/@joohw/boss-cli)](https://www.npmjs.com/package/@joohw/boss-cli)
4
+ [![npm downloads](https://img.shields.io/npm/dm/@joohw/boss-cli)](https://www.npmjs.com/package/@joohw/boss-cli)
5
+ [![license](https://img.shields.io/github/license/joohw/boss-cli)](./LICENSE)
6
+ [![GitHub stars](https://img.shields.io/github/stars/joohw/boss-cli)](https://github.com/joohw/boss-cli)
7
+
8
+ 官网主页:[boss-cli.com](https://boss-cli.com)
9
+
10
+ **boss-cli**(`@joohw/boss-cli`)是开源的 **Boss直聘自动化命令行工具**。基于 Puppeteer / CDP 协议驱动本机 Chrome,无需 Selenium,把 Boss直聘 B 端的核心 HR 操作搬进终端:**候选人列表**、**批量发消息**、**自动打招呼**、**在线简历预览**、**深度搜索**、**职位管理**。
11
+
12
+ 适合 HR 日常提效,也适合 Claude / GPT / Gemini 等 **AI Agent** 通过子进程调用,搭建全自动化招聘流水线。
13
+
14
+ ```bash
15
+ npm install -g @joohw/boss-cli@latest
16
+ boss login
17
+ boss help
18
+ ```
19
+
20
+ > 纯 CLI,不内置对话式 Agent。每条命令输出结构化纯文本,Agent 可直接解析并编排多步流程。
21
+
22
+ ---
23
+
24
+ ## 为什么选择 boss-cli?
25
+
26
+ | 场景 | 命令 |
27
+ | --- | --- |
28
+ | Boss直聘批量发消息 | `boss send --text "..."` 配合脚本循环 |
29
+ | Boss直聘自动打招呼 | `boss greet <姓名> [--job <岗位>]` |
30
+ | Boss直聘候选人筛选 | `boss list` / `boss list --unread` |
31
+ | Boss直聘脚本自动化 | 本机 Chrome + CDP,Cookie 本地存储 |
32
+ | AI 招聘 Agent | 子进程调用,输出 Agent 友好 |
33
+ | 数据隐私 | 不经过第三方服务器,数据在 `~/.boss-cli/` |
34
+
35
+ ---
36
+
37
+ ## 安装
38
+
39
+ **要求**:Node.js ≥ 20,本机已安装 Chrome / Chromium。
40
+
41
+ ```bash
42
+ npm install -g @joohw/boss-cli@latest
43
+ boss help
44
+ ```
45
+
46
+ ### 安装本 fork(含尚未进入上游的修复)
47
+
48
+ 本仓库是 [`joohw/boss-cli`](https://github.com/joohw/boss-cli) 的 fork,包含风控页反弹熔断等
49
+ 上游尚未发布的修复,以 `@viyzhu/boss-cli-fork` 单独发布:
50
+
51
+ ```bash
52
+ npm install -g @viyzhu/boss-cli-fork@latest
53
+ boss version
54
+ ```
55
+
56
+ 两个包提供同名的 `boss` 命令,**不要同时装**;换装前先 `npm uninstall -g @joohw/boss-cli`。
57
+ 也可以直接装仓库 tarball(等价于 main 最新提交):
58
+
59
+ ```bash
60
+ npm install -g https://github.com/Viy1204/boss-cli/archive/refs/heads/main.tar.gz
61
+ ```
62
+
63
+ > 别用 `npm i -g github:Viy1204/boss-cli`:npm 会把全局包链到 npm cache 里的临时 clone,
64
+ > 缓存清理后 `boss` 直接 `Cannot find module`。
65
+
66
+ 如果你觉得 boss-cli 好用,欢迎给本仓库一个 Star;使用中遇到问题请提交 Issue,新功能或改进也欢迎提交 PR。
67
+
68
+ > **macOS / Linux 权限问题**:系统 Node 默认全局前缀在 `/usr/local`,当前账户无写权限。建议先把全局前缀挪到用户目录(一次性配置):
69
+ >
70
+ > ```bash
71
+ > mkdir -p ~/.npm-global
72
+ > npm config set prefix ~/.npm-global
73
+ > echo 'export PATH=~/.npm-global/bin:$PATH' >> ~/.zshrc # bash 用 ~/.bash_profile
74
+ > source ~/.zshrc
75
+ > ```
76
+ >
77
+ > 使用 `fnm` / `nvm` / `volta` 的用户可跳过此步。Windows 用户无需此步。
78
+
79
+ ---
80
+
81
+ ## 命令一览
82
+
83
+ | 命令 | 说明 |
84
+ | --- | --- |
85
+ | `boss login` | 打开 Boss直聘登录页(扫码/验证后手动完成) |
86
+ | `boss update` | 通过 npm 安装最新版 boss-cli |
87
+ | `boss list [--unread]` | 读取聊天列表;`--unread` 仅未读 |
88
+ | `boss chat <姓名> [--strict]` | 打开指定候选人会话 |
89
+ | `boss chat [姓名] --index <序号> [--unread] [--strict]` | 按 `boss list` 输出序号打开会话;同名候选人建议用序号 |
90
+ | `boss send [--text <内容>]` | 向当前会话发送消息 |
91
+ | `boss action <操作>` | 索要简历 / 不合适 / 备注 / 交换微信等 |
92
+ | `boss recommend [岗位关键字]` | 读取推荐候选人列表 |
93
+ | `boss search [关键词] [--job] [--city] [--degree(-range)] [--school] [--exp(-range)] [--age(-range)] [--status] [--job-hop] [--major]` | 常规搜索牛人列表,可带城市 / 学历 / 院校 / 经验 / 年龄 / 求职状态 / 跳槽频率 / 专业筛选(见下方「搜索筛选条件」) |
94
+ | `boss greet <姓名> [--job <岗位>]` | 在当前推荐/深度搜索页对候选人打招呼(不会自动跳转) |
95
+ | `boss preview <姓名>` | 在线简历预览(每日次数有限) |
96
+ | `boss deep-search [岗位关键字] [--core <要求>] [--bonus <加分项>] [--clear-core] [--clear-bonus] [--match]` | 深度搜索表单状态;`--core` / `--bonus` 可重复,并按传入列表同步分组;`--clear-*` 清空分组;默认不输出候选列表,`--match` 输出最新 20 条 |
97
+ | `boss positions` | 读取职位列表 |
98
+ | `boss jd <名称>` | 抓取职位 JD 缓存到本地 |
99
+
100
+ 完整用法:`boss help`
101
+
102
+ ---
103
+
104
+ ## 快速上手
105
+
106
+ ```bash
107
+ # 1. 登录
108
+ boss login
109
+
110
+ # 2. 查看未读候选人
111
+ boss list --unread
112
+
113
+ # 3. 打开会话并发送消息
114
+ boss chat 张三
115
+ boss send --text "您好,请问方便发一下简历吗?"
116
+
117
+ # 同名或姓名定位失败时,按 list 序号打开;--unread 对应 list --unread 的序号
118
+ boss chat --index 2 --unread
119
+ boss chat 张三 --index 2 --unread --strict
120
+
121
+ # 4. 先进入推荐页,再在当前页打招呼
122
+ boss recommend 前端工程师
123
+ boss greet 张三 --job 前端工程师
124
+
125
+ # 5. 常规搜索牛人(可带筛选)
126
+ boss search "langgraph"
127
+ boss search "短视频" --city 深圳 --school 统招本科
128
+ boss search "投放" --job 数字广告 --degree 本科及以上
129
+ boss search "剪辑" --status 离职-随时到岗 --major 计算机科学与技术
130
+
131
+ # 6. 深度搜索:按传入列表同步分组条件,但不消耗匹配次数
132
+ boss deep-search --core "AI产品经理" --core "做过 RAG 或 Agent 产品落地" --bonus "有 ToB 平台经验"
133
+
134
+ # 只有明确添加 --match 才会点击「立即匹配」,会消耗今日匹配次数,并只输出最新 20 条
135
+ boss deep-search --match
136
+ ```
137
+
138
+ ---
139
+
140
+ ## 搜索筛选条件
141
+
142
+ `boss search` 可以把平台自带的筛选条件一起设好再搜,省掉「搜出一大堆再人工剔」。
143
+
144
+ **每次 `boss search` 都会先点一次「清空筛选」**,再按本次参数重设。也就是说:这一轮生效的条件
145
+ 只有你这条命令里写的,上一条命令设过的不会粘下来。
146
+
147
+ | 参数 | 说明 |
148
+ |---|---|
149
+ | `--job <岗位关键字>` | 岗位下拉里模糊匹配并切换。**不传则切「不限职位」** |
150
+ | `--city <城市>` | 如 `--city 深圳`。不传则读 `BOSS_SEARCH_CITY`,仍为空就不碰城市控件 |
151
+ | `--degree <学历>` | 不限 / 本科及以上 / 硕士及以上 / 博士 |
152
+ | `--school <院校要求>` | 统招本科 / 双一流院校 / 211院校 / 985院校 / 留学生 / QS 100 / QS 500 / 只看第一学历。多选用逗号分隔,中英文逗号都认 |
153
+ | `--degree-range <下限-上限>` | 自定义学历区间(拖滑块),如 `大专-本科`。两端取值:初中及以下 / 中专/中技 / 高中 / 大专 / 本科 / 硕士 / 博士。与 `--degree` 互斥 |
154
+ | `--exp <经验要求>` | 在校/应届 / 25年毕业 / 26年毕业 / 26年后毕业 / 1-3年 / 3-5年 / 5-10年。单选 |
155
+ | `--exp-range <下限-上限>` | 自定义经验区间(拖页面上那个滑块),如 `3-8`。两端收 `应届`、1-10 的整数年、`10+`。与 `--exp` 互斥 |
156
+ | `--age <年龄要求>` | 20-25 / 25-30 / 30-35 / 35-40 / 40-50 / 50以上。单选 |
157
+ | `--age-range <下限-上限>` | 自定义年龄区间,如 `23-27`。两端收 16-46 的整数、`46+`。与 `--age` 互斥 |
158
+ | `--status <求职状态>` | 离职-随时到岗 / 在职-暂不考虑 / 在职-考虑机会 / 在职-月内到岗。可多选 |
159
+ | `--job-hop <跳槽频率>` | 5年少于3份 / 时间≥1年。单选;`≥` 可以写成 `>=` |
160
+ | `--major <专业>` | 只认完全匹配的专业名(如「计算机科学与技术」)。可多选,最多 10 个 |
161
+
162
+ ```bash
163
+ export BOSS_SEARCH_CITY=深圳 # 每次都从深圳搜,不用每条命令都带 --city
164
+ boss search "短视频" --school 统招本科,985院校
165
+ boss search "剪辑" --status 离职-随时到岗 --major 计算机科学与技术
166
+ boss search "剪辑" --degree-range 大专-本科 --exp-range 3-8 --age-range 24-32
167
+ ```
168
+
169
+ 生效的条件会回显在结果标题里,便于确认这一轮到底按什么口径搜的:
170
+
171
+ ```
172
+ 常规搜索结果(关键词:剪辑;当前岗位:不限职位;城市:深圳;院校:统招本科;在职-考虑机会/离职-随时到岗;专业:软件工程/计算机科学与技术)
173
+ 共 15 人
174
+ ```
175
+
176
+ 几个要注意的点:
177
+
178
+ - **不传 `--job` 会切「不限职位」**,而不是沿用上次的岗位。以前跨命令沿用平台上的残留状态,
179
+ 同一条命令跑两次可能搜的是两个池子。**这是相对 0.7.x 的行为变更。**
180
+ - **城市只认完全匹配**。`--city 深圳市` 匹配不到就直接报错并列出候选,不会替你猜——
181
+ 猜错的代价是整轮搜索白跑且你不知道。`--major` 同理。
182
+ - **城市不在「清空筛选」的范围内**,它会跨命令留着(换 `--job` 时平台会自己把它清掉)。
183
+ 但城市一直在标题里实时回显,所以不会出现「悄悄挂着」的情况。
184
+ - **`只看第一学历`** 这一项页面提示写的是「第一学历为全日制本科」,卡非全日制学历时用它,
185
+ 比事后按「年龄减年限」推算可靠。
186
+ - 标题里的每一项都是**从页面实时读出来的**,不是把你传的参数原样打印——所以标题里没写的条件
187
+ 就是真没生效,写了的就是真生效了。
188
+ - `--major` 传多个时会**一个一个开弹层选**(平台的搜索框选中一项后就不再出联想,只能关掉重开),
189
+ 所以专业越多,这条命令越慢。
190
+ - 学历 / 经验 / 年龄的**自定义区间**用 `--degree-range` / `--exp-range` / `--age-range`,和对应的预设参数互斥
191
+ (页面上本来就是二选一,选了自定义,预设那排的「不限」会自动取消)。
192
+ `--degree-range` / `--exp-range` 是真的去拖那个滑块,比点选项慢几秒,而且拖完会按滑块的真实档位校验、
193
+ 不对就重拖——**拖偏一格就是搜错人群,且标题上看不出来**,所以宁可慢也不赌。
194
+ - 平台自带的「性别」「薪资区间」「牛人活跃度」「牛人职位要求」「资格证书」也没做
195
+ (资格证书那一项平台本身就是隐藏的)。
196
+
197
+ ---
198
+
199
+ ## 与 AI Agent 集成
200
+
201
+ boss-cli 每条命令输出纯文本,适合 LLM 通过子进程编排:
202
+
203
+ ```
204
+ 1. boss list --unread → 获取未读候选人
205
+ 2. boss chat <姓名> → 打开会话
206
+ 同名时用 boss chat [姓名] --index <序号> [--unread]
207
+ 3. boss action resume → 索要简历
208
+ 4. boss send -t "..." → 发送消息
209
+ 5. boss recommend → 读取推荐列表
210
+ 6. boss search <关键词> → 读取常规搜索列表
211
+ 7. boss greet <姓名> → 批量打招呼
212
+ ```
213
+
214
+ 详见 [AGENTS.md](./AGENTS.md)。
215
+
216
+ ---
217
+
218
+ ## 常见问题
219
+
220
+ **boss-cli 是什么?**
221
+ 开源 Boss直聘自动化 CLI,用终端命令代替手动操作 Boss直聘网页,支持 AI Agent 编排。
222
+
223
+ **和 Selenium / Playwright 有什么区别?**
224
+ boss-cli 基于 CDP 连接本机 Chrome,复用已有登录态,针对 Boss直聘 B 端页面做了专用封装,开箱即用。
225
+
226
+ **需要额外下载浏览器吗?**
227
+ 不需要。使用本机已安装的 Chrome / Chromium,通过 CDP 协议连接。
228
+
229
+ **数据会上传到服务器吗?**
230
+ 不会。Cookie 和缓存仅存储在本地 `~/.boss-cli/`,CLI 不经过任何第三方服务器。
231
+
232
+ **浏览器是有头还是无头?能不能藏起来?**
233
+
234
+ **默认有头**(真窗口,和上游一致)。代价是窗口启动时会抢一次键盘焦点。
235
+
236
+ **不建议改成无头。** 本 fork 2026-08-19 之前默认无头,理由是不抢焦点;后来观测到两个独立的账号事故都指向无头,于是翻回有头:
237
+
238
+ - 一个账号被 BOSS 限制 **web 端登录**,页面文案明确写「检测到您的账号存在使用第三方招聘管理系统、插件、外挂、软件等辅助工具」——判定的是**工具指纹**,不是打招呼频率。
239
+ - 另一个团队用上游版(默认有头)长期没事,他们的 AI 擅自改走无头之后当天封号。
240
+
241
+ 无头 Chrome 的 `User-Agent` 会自报 `HeadlessChrome/<ver>`,而 Client Hints 仍说 `Google Chrome`——这个自相矛盾本身就是强信号。
242
+
243
+ **注意 liepin-cli 那边默认仍是无头**:猎聘的风控形态一次都没观测过,没有证据支持翻它的默认。所以 `RECRUIT_BROWSER_HIDDEN` 的语义是**统一覆盖开关**而非「提供默认值」——不设时两个 CLI 各用自己的默认(boss 有头、liepin 无头),显式设了才把两家拉平。
244
+
245
+ 真要无头(清楚这是在拿账号冒险):
246
+
247
+ ```bash
248
+ RECRUIT_BROWSER_HIDDEN=true boss list # 招聘工具链共读的开关(boss / liepin / DSH 面板都认)
249
+ BOSS_BROWSER_HEADLESS=true boss list # 只影响 boss-cli,优先级更高
250
+ ```
251
+
252
+ **换了变量不会让已经在跑的那只切换模式** —— 先 `boss shutdown` 关掉它,下条命令才会按新模式重启。
253
+
254
+ **窗口会不会弹到前台?** 每条命令开头会把 Boss 标签页激活(`bringToFront`),Windows 上这会把**最小化**的窗口还原并抢焦点。现在的规则:窗口已被你最小化就不动它;想彻底禁止抢前台(比如把 CLI 接进后台系统定时跑),设:
255
+
256
+ ```bash
257
+ BOSS_BROWSER_NO_FOREGROUND=true boss list
258
+ ```
259
+
260
+ `boss login` 不受此开关影响,扫码必须看得见。
261
+
262
+ 浏览器跨命令常驻(命令结束只断 CDP、不关窗口),跑完想释放内存就 `boss shutdown`(登录态保留)。
263
+
264
+ `boss login` **一直是有头的** —— 扫码必须看得见。真开了无头,它也会自己把无头实例关掉、以有头重启(登录态在 `~/.boss-cli/.cache/` 里,不会丢)。
265
+
266
+ 想在不切窗口的前提下看浏览器在做什么,用 recruiting-copilot 的 DSH「招聘浏览器」面板:把画面推到 Web UI 里。**面板默认折叠、默认只读**——在面板里手动操作不受本 CLI 那套页面守卫的保护(守卫挂在 CLI 进程的 CDP session 上,进程一退出就全失效),所以招聘动作请走命令。
267
+
268
+ **如何自定义操作蒙层品牌?**
269
+ 设置环境变量 `BOSS_CLI_AGENT_BRAND=你的品牌名`。
270
+
271
+ **`boss preview` 报「截图疑似空壳」是什么意思?**
272
+
273
+ 截出来的 PNG 只有水印、没有简历正文。连续 preview 很多人时会出现([recruiting-copilot#37](https://github.com/Viy1204/recruiting-copilot/issues/37):约第 9 人起稳定复现,但**人眼看浏览器里正文是在的**,所以是截图路径的问题,不是平台不让看)。
274
+
275
+ 0.7.2 起遇到这种情况会**直接报错**,不再假报成功;PNG 仍然落盘,方便你自己看。判据是 PNG 字节数 / 截图像素数,两个可调项:
276
+
277
+ ```bash
278
+ BOSS_RESUME_BLANK_BYTES_PER_PIXEL=0.015 # 空壳阈值,设 0 关掉这个检查
279
+ BOSS_RESUME_SCREENSHOT_VIEWPORT_HEIGHT=1600 # 截图时临时拉高的视口高度(默认 5000)
280
+ ```
281
+
282
+ 如果报错里还提到「有 N 个可见在线简历面板」,说明上一次弹层没关净、截到了残留的旧面板 —— `boss shutdown` 重启浏览器可恢复。
283
+
284
+ **别把 preview 当批量工具**:它吃平台的每日查看额度,也是最容易踩上面这些坑的路径。先用列表卡片做硬否决,只对强候选 preview,其余走「打招呼 → 要简历附件」。
285
+
286
+ ---
287
+
288
+ ## 数据目录
289
+
290
+ | 路径 | 内容 |
291
+ | --- | --- |
292
+ | `~/.boss-cli/.cache/` | Cookie、浏览器用户数据 |
293
+ | `~/.boss-cli/jd/` | `boss jd` 缓存的岗位描述 |
294
+
295
+ ---
296
+
297
+ ## 开发
298
+
299
+ ```bash
300
+ npm run build # 编译到 dist/
301
+ npm run dev # build + 交互模式
302
+ ```
303
+
304
+ ---
305
+
306
+ ## 发布
307
+
308
+ 仓库通过 GitHub Actions 自动发布,工作流文件是 `.github/workflows/tag-publish.yml`。
309
+
310
+ 发布新版本时,本地只需要更新 `package.json` 版本号、提交代码、创建并推送 `v*` tag:
311
+
312
+ ```bash
313
+ git tag -a v0.7.0 -m "v0.7.0"
314
+ git push origin main
315
+ git push origin v0.7.0
316
+ ```
317
+
318
+ tag 推送后,workflow 会自动安装依赖、构建、检查 npm 版本、发布、更新 `latest` dist-tag,并创建或更新 GitHub Release。
319
+ 本地不需要手动执行 `npm publish`。
320
+
321
+ **别用 `gh release create` 顺带建 tag**:那样 tag 是 Releases API 在服务端建的,
322
+ GitHub **不会**为它发 `push` 事件,`on: push.tags` 因此不触发(v0.6.8 和 v0.7.0 就是这么漏掉的,
323
+ 最后靠手动 `workflow_dispatch` 才发出去)。workflow 现在额外挂了 `release: [published]` 兜底,
324
+ 所以先建 Release 也能发;但推荐仍是先 `git push origin vX.Y.Z`,让 Release 由 workflow 自动生成。
325
+
326
+ **发的是哪个包**:workflow 用 `node -p "require('./package.json').name"` 取包名,所以本 fork 发布的是
327
+ **`@viyzhu/boss-cli-fork`**,不是上游的 `@joohw/boss-cli`。(此处此前写着上游包名,已订正。)
328
+
329
+ npm 发布依赖仓库 Secret `NPM_TOKEN`;**没配这个 secret 时 workflow 会打印
330
+ `NPM_TOKEN secret is missing; skipping publish.` 然后跳过发布,tag 推送本身仍然"成功"**——
331
+ 所以推完 tag 要去 Actions 里确认那一步真的跑了。同名同版本已发布过时也会跳过。
332
+
333
+ ---
334
+
335
+ ## 许可
336
+
337
+ [GPL-3.0](./LICENSE)
338
+
339
+ ---
340
+
341
+ ## 相关链接
342
+
343
+ - 官网:[boss-cli.com](https://boss-cli.com)
344
+ - npm:[@joohw/boss-cli](https://www.npmjs.com/package/@joohw/boss-cli)
345
+ - GitHub:[joohw/boss-cli](https://github.com/joohw/boss-cli)
346
+ - 问题反馈:[Issues](https://github.com/joohw/boss-cli/issues)