boss-cli
August 19, 2026 · View on GitHub
官网主页:boss-cli.com
boss-cli(@joohw/boss-cli)是开源的 Boss直聘自动化命令行工具。基于 Puppeteer / CDP 协议驱动本机 Chrome,无需 Selenium,把 Boss直聘 B 端的核心 HR 操作搬进终端:候选人列表、批量发消息、自动打招呼、在线简历预览、深度搜索、职位管理。
适合 HR 日常提效,也适合 Claude / GPT / Gemini 等 AI Agent 通过子进程调用,搭建全自动化招聘流水线。
npm install -g @joohw/boss-cli@latest
boss login
boss help
纯 CLI,不内置对话式 Agent。每条命令输出结构化纯文本,Agent 可直接解析并编排多步流程。
为什么选择 boss-cli?
| 场景 | 命令 |
|---|---|
| Boss直聘批量发消息 | boss send --text "..." 配合脚本循环 |
| Boss直聘自动打招呼 | boss greet <姓名> [--job <岗位>] |
| Boss直聘候选人筛选 | boss list / boss list --unread |
| Boss直聘脚本自动化 | 本机 Chrome + CDP,Cookie 本地存储 |
| AI 招聘 Agent | 子进程调用,输出 Agent 友好 |
| 数据隐私 | 不经过第三方服务器,数据在 ~/.boss-cli/ |
安装
要求:Node.js ≥ 20,本机已安装 Chrome / Chromium。
npm install -g @joohw/boss-cli@latest
boss help
安装本 fork(含尚未进入上游的修复)
本仓库是 joohw/boss-cli 的 fork,包含风控页反弹熔断等
上游尚未发布的修复,以 @viyzhu/boss-cli-fork 单独发布:
npm install -g @viyzhu/boss-cli-fork@latest
boss version
两个包提供同名的 boss 命令,不要同时装;换装前先 npm uninstall -g @joohw/boss-cli。
也可以直接装仓库 tarball(等价于 main 最新提交):
npm install -g https://github.com/Viy1204/boss-cli/archive/refs/heads/main.tar.gz
别用
npm i -g github:Viy1204/boss-cli:npm 会把全局包链到 npm cache 里的临时 clone, 缓存清理后boss直接Cannot find module。
如果你觉得 boss-cli 好用,欢迎给本仓库一个 Star;使用中遇到问题请提交 Issue,新功能或改进也欢迎提交 PR。
macOS / Linux 权限问题:系统 Node 默认全局前缀在
/usr/local,当前账户无写权限。建议先把全局前缀挪到用户目录(一次性配置):mkdir -p ~/.npm-global npm config set prefix ~/.npm-global echo 'export PATH=~/.npm-global/bin:$PATH' >> ~/.zshrc # bash 用 ~/.bash_profile source ~/.zshrc使用
fnm/nvm/volta的用户可跳过此步。Windows 用户无需此步。
命令一览
| 命令 | 说明 |
|---|---|
boss login | 打开 Boss直聘登录页(扫码/验证后手动完成) |
boss update | 通过 npm 安装最新版 boss-cli |
boss list [--unread] | 读取聊天列表;--unread 仅未读 |
boss chat <姓名> [--strict] | 打开指定候选人会话 |
boss chat [姓名] --index <序号> [--unread] [--strict] | 按 boss list 输出序号打开会话;同名候选人建议用序号 |
boss send [--text <内容>] | 向当前会话发送消息 |
boss action <操作> | 索要简历 / 不合适 / 备注 / 交换微信等 |
boss recommend [岗位关键字] | 读取推荐候选人列表 |
boss search [关键词] | 常规搜索牛人列表 |
boss greet <姓名> [--job <岗位>] | 在当前推荐/深度搜索页对候选人打招呼(不会自动跳转) |
boss preview <姓名> | 在线简历预览(每日次数有限) |
boss deep-search [岗位关键字] [--core <要求>] [--bonus <加分项>] [--clear-core] [--clear-bonus] [--match] | 深度搜索表单状态;--core / --bonus 可重复,并按传入列表同步分组;--clear-* 清空分组;默认不输出候选列表,--match 输出最新 20 条 |
boss positions | 读取职位列表 |
boss jd <名称> | 抓取职位 JD 缓存到本地 |
完整用法:boss help
快速上手
# 1. 登录
boss login
# 2. 查看未读候选人
boss list --unread
# 3. 打开会话并发送消息
boss chat 张三
boss send --text "您好,请问方便发一下简历吗?"
# 同名或姓名定位失败时,按 list 序号打开;--unread 对应 list --unread 的序号
boss chat --index 2 --unread
boss chat 张三 --index 2 --unread --strict
# 4. 先进入推荐页,再在当前页打招呼
boss recommend 前端工程师
boss greet 张三 --job 前端工程师
# 5. 常规搜索牛人
boss search "langgraph"
# 6. 深度搜索:按传入列表同步分组条件,但不消耗匹配次数
boss deep-search --core "AI产品经理" --core "做过 RAG 或 Agent 产品落地" --bonus "有 ToB 平台经验"
# 只有明确添加 --match 才会点击「立即匹配」,会消耗今日匹配次数,并只输出最新 20 条
boss deep-search --match
与 AI Agent 集成
boss-cli 每条命令输出纯文本,适合 LLM 通过子进程编排:
1. boss list --unread → 获取未读候选人
2. boss chat <姓名> → 打开会话
同名时用 boss chat [姓名] --index <序号> [--unread]
3. boss action resume → 索要简历
4. boss send -t "..." → 发送消息
5. boss recommend → 读取推荐列表
6. boss search <关键词> → 读取常规搜索列表
7. boss greet <姓名> → 批量打招呼
详见 AGENTS.md。
常见问题
boss-cli 是什么? 开源 Boss直聘自动化 CLI,用终端命令代替手动操作 Boss直聘网页,支持 AI Agent 编排。
和 Selenium / Playwright 有什么区别? boss-cli 基于 CDP 连接本机 Chrome,复用已有登录态,针对 Boss直聘 B 端页面做了专用封装,开箱即用。
需要额外下载浏览器吗? 不需要。使用本机已安装的 Chrome / Chromium,通过 CDP 协议连接。
数据会上传到服务器吗?
不会。Cookie 和缓存仅存储在本地 ~/.boss-cli/,CLI 不经过任何第三方服务器。
浏览器是有头还是无头?能不能藏起来?
默认有头(真窗口,和上游一致)。代价是窗口启动时会抢一次键盘焦点。
不建议改成无头。 本 fork 2026-08-19 之前默认无头,理由是不抢焦点;后来观测到两个独立的账号事故都指向无头,于是翻回有头:
- 一个账号被 BOSS 限制 web 端登录,页面文案明确写「检测到您的账号存在使用第三方招聘管理系统、插件、外挂、软件等辅助工具」——判定的是工具指纹,不是打招呼频率。
- 另一个团队用上游版(默认有头)长期没事,他们的 AI 擅自改走无头之后当天封号。
无头 Chrome 的 User-Agent 会自报 HeadlessChrome/<ver>,而 Client Hints 仍说 Google Chrome——这个自相矛盾本身就是强信号。
注意 liepin-cli 那边默认仍是无头:猎聘的风控形态一次都没观测过,没有证据支持翻它的默认。所以 RECRUIT_BROWSER_HIDDEN 的语义是统一覆盖开关而非「提供默认值」——不设时两个 CLI 各用自己的默认(boss 有头、liepin 无头),显式设了才把两家拉平。
真要无头(清楚这是在拿账号冒险):
RECRUIT_BROWSER_HIDDEN=true boss list # 招聘工具链共读的开关(boss / liepin / DSH 面板都认)
BOSS_BROWSER_HEADLESS=true boss list # 只影响 boss-cli,优先级更高
换了变量不会让已经在跑的那只切换模式 —— 先 boss shutdown 关掉它,下条命令才会按新模式重启。
浏览器跨命令常驻(命令结束只断 CDP、不关窗口),跑完想释放内存就 boss shutdown(登录态保留)。
boss login 一直是有头的 —— 扫码必须看得见。真开了无头,它也会自己把无头实例关掉、以有头重启(登录态在 ~/.boss-cli/.cache/ 里,不会丢)。
想在不切窗口的前提下看浏览器在做什么,用 recruiting-copilot 的 DSH「招聘浏览器」面板:把画面推到 Web UI 里。面板默认折叠、默认只读——在面板里手动操作不受本 CLI 那套页面守卫的保护(守卫挂在 CLI 进程的 CDP session 上,进程一退出就全失效),所以招聘动作请走命令。
如何自定义操作蒙层品牌?
设置环境变量 BOSS_CLI_AGENT_BRAND=你的品牌名。
数据目录
| 路径 | 内容 |
|---|---|
~/.boss-cli/.cache/ | Cookie、浏览器用户数据 |
~/.boss-cli/jd/ | boss jd 缓存的岗位描述 |
开发
npm run build # 编译到 dist/
npm run dev # build + 交互模式
发布
仓库通过 GitHub Actions 自动发布,工作流文件是 .github/workflows/tag-publish.yml。
发布新版本时,本地只需要更新 package.json 版本号、提交代码、创建并推送 v* tag:
git tag -a v0.7.0 -m "v0.7.0"
git push origin main
git push origin v0.7.0
tag 推送后,workflow 会自动安装依赖、构建、检查 npm 版本、发布、更新 latest dist-tag,并创建或更新 GitHub Release。
本地不需要手动执行 npm publish。
别用 gh release create 顺带建 tag:那样 tag 是 Releases API 在服务端建的,
GitHub 不会为它发 push 事件,on: push.tags 因此不触发(v0.6.8 和 v0.7.0 就是这么漏掉的,
最后靠手动 workflow_dispatch 才发出去)。workflow 现在额外挂了 release: [published] 兜底,
所以先建 Release 也能发;但推荐仍是先 git push origin vX.Y.Z,让 Release 由 workflow 自动生成。
发的是哪个包:workflow 用 node -p "require('./package.json').name" 取包名,所以本 fork 发布的是
@viyzhu/boss-cli-fork,不是上游的 @joohw/boss-cli。(此处此前写着上游包名,已订正。)
npm 发布依赖仓库 Secret NPM_TOKEN;没配这个 secret 时 workflow 会打印
NPM_TOKEN secret is missing; skipping publish. 然后跳过发布,tag 推送本身仍然"成功"——
所以推完 tag 要去 Actions 里确认那一步真的跑了。同名同版本已发布过时也会跳过。
许可
相关链接
- 官网:boss-cli.com
- npm:@joohw/boss-cli
- GitHub:joohw/boss-cli
- 问题反馈:Issues