boss-cli

August 19, 2026 · View on GitHub

npm version npm downloads license GitHub stars

官网主页: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 里确认那一步真的跑了。同名同版本已发布过时也会跳过。


许可

GPL-3.0


相关链接