boss-client
by CindyRIng
README.md
# boss-client
BOSS直聘(网页版)**本地只读客户端**:复用 `cloak-env` 的 cloakbrowser 运行环境与独立 profile 保活登录态,把「岗位搜索 / 岗位详情 / 公司列表 / 公司详情(含工商信息)/ 公司全部职位 / 状态」以 **CLI / REST / MCP / SKILL** 四种形态暴露给 Agent 与业务系统。
> 本项目与 BOSS直聘官方无关;仅使用本人/授权账号做低频只读查询,请遵守平台服务条款。
## 状态
- 2026-11-11 已用非无头 cloakbrowser 在真实账号上实测:二维码获取、短信验证码 + 极验、登录、岗位搜索、翻页、岗位详情、公司详情、公司全部职位、状态检查。
- PRD v0.1:[docs/01-需求文档.md](docs/01-需求文档.md)
- 接口草案 v0.1:[docs/02-接口草案.md](docs/02-接口草案.md)
- 实测记录:[exploration/2026-11-11/REPORT.md](exploration/2026-11-11/REPORT.md)
## 能力
| 能力 | CLI | REST | MCP |
| --- | --- | --- | --- |
| 健康检查 | `boss health` | `GET /v1/health` | `boss_health` |
| 登录态/会话/风控 | `boss status` | `GET /v1/status` | `boss_status` |
| 登录(短信/扫码/极验中继) | `boss login` | `POST /v1/session/login*` | `boss_login_*` |
| 岗位搜索 | `boss search jobs` | `POST /v1/search/jobs` | `boss_search_jobs` |
| 岗位翻页 | `boss jobs list` | `GET /v1/jobs` | `boss_list_jobs` |
| 岗位详情 | `boss jobs detail` | `GET /v1/jobs/{jobId}` | `boss_job_detail` |
| 去重公司列表 | `boss companies list` | `GET /v1/companies` | `boss_list_companies` |
| 公司详情(含工商) | `boss companies detail` | `GET /v1/companies/{companyId}` | `boss_company_detail` |
| 公司全部职位 | `boss companies jobs` | `GET /v1/companies/{companyId}/jobs` | `boss_company_jobs` |
| 城市注册表 | `boss cities list` | `GET /v1/cities` | `boss_cities` |
| 缓存统计/清理 | `boss cache stats/clear` | `GET/DELETE /v1/cache*` | `boss_cache_*` |
## 架构
```mermaid
flowchart TB
W["BOSS直聘网页版<br/>www.zhipin.com"]
subgraph BC["boss-client(本机)"]
CB["cloak browser session<br/>headful 登录 / 可选 headless 只读<br/>独立 profile"]
LC[("SQLite 结构化缓存<br/>queries / jobs / details / companies")]
CAP["能力层"]
IF["CLI · REST(127.0.0.1:8788) · MCP stdio"]
SK["SKILL"]
CB <--> LC
CAP --> IF
SK --> IF
end
CB <-->|"页面操作 + 页面内 fetch"| W
AG["Agent / 业务系统"] --> SK
AG --> IF
```
- **浏览器**:复用 `~/cloak-env`(cloakbrowser 0.6.5 + Chromium 146);使用独立 profile(默认 `~/.boss-client/profile`),不与 tanji-client / fuma 共用。
- **只读**:不沟通、不投递、不改简历、不切换招聘者身份;不写 CRM。
- **结构化缓存**:SQLite,不落 raw 响应/HTML、不存 cookie/token/验证码。
## 快速开始
### 0. 前置
- Linux(已在 NixOS 验证);Node.js ≥ 22.5(FHS 内为 Node 22.23.2)
- `~/cloak-env`:共享 cloakbrowser FHS 环境(见 [docs/04-环境配套.md](docs/04-环境配套.md))
- 一个可登录 BOSS直聘的求职者账号
- 桌面显示(登录/验证码需要 headful);无桌面服务器用 Xvfb
```bash
# 检查 cloak 环境
~/cloak-env/bin/cloak-env-info
```
### 1. 安装
```bash
git clone https://github.com/CindyRIng/boss-client.git
cd boss-client
npm install
cp .env.example .env
# 编辑 .env:至少设置 BOSS_API_TOKEN;短信登录再设置 BOSS_PHONE
npm run build
npm test
npm run gen
```
把 CLI 放到 PATH:
```bash
ln -sf "$PWD/bin/boss-run" ~/.local/bin/boss
# 确认
boss health
```
### 2. 登录(首次/掉线人工一次)
```bash
# 默认短信验证码:会打开 headful 浏览器;浏览器中完成极验,终端输入短信码
boss login
# 二维码:终端直接渲染二维码(也可 REST 返回 Base64)
boss login --qr
# 仅启动并输出 LoginSession(含 QR/captcha base64),适合远程 agent
boss login --relay
```
> BOSS 的极验无法可靠自动破解;首次登录/掉线重登必须人工(浏览器或 REST 中继)一次。之后 profile 复用,实测会话约 10 天。
### 3. 查询
```bash
boss status
boss search jobs --keyword 外贸 --city 101090100 --page-size 15 --pages 1
boss jobs list --query-id q_20261111_ab12cd --page 2
boss jobs detail --job-id 9b480e5d72caccd303Zz3du6FFFS
boss companies list --query-id q_20261111_ab12cd --fetch-pages 1
boss companies detail --id 'd6c15290231e61e21Hd70965EFY~'
boss companies jobs --id 'd6c15290231e61e21Hd70965EFY~'
```
输出默认是统一 envelope JSON;`--format table` 可输出简表。
## REST
```bash
boss serve --port 8788
# 文档
curl http://127.0.0.1:8788/docs
curl http://127.0.0.1:8788/openapi.json
# 鉴权(除 /v1/health)
curl -H "Authorization: Bearer $BOSS_API_TOKEN" http://127.0.0.1:8788/v1/status
# 搜索
curl -X POST http://127.0.0.1:8788/v1/search/jobs \
-H "Authorization: Bearer $BOSS_API_TOKEN" -H "content-type: application/json" \
-d '{"keyword":"外贸","cityCode":"101090100","page":1,"pageSize":15,"pages":1}'
```
REST 仅监听 `127.0.0.1`,必须设置非默认 `BOSS_API_TOKEN`。
## MCP
```json
{
"mcpServers": {
"boss-client": {
"command": "/path/to/boss-client/bin/boss-run",
"args": ["mcp"],
"env": { "BOSS_API_TOKEN": "change-me" }
}
}
}
```
工具清单见 `spec/mcp-tools.json`;SKILL 见 [skills/boss/SKILL.md](skills/boss/SKILL.md)。
## 配置
完整环境变量见 [.env.example](.env.example) 与 [docs/03-部署与使用.md](docs/03-部署与使用.md)。
关键项:
| 变量 | 默认 | 说明 |
| --- | --- | --- |
| `BOSS_API_TOKEN` | `change-me` | REST/MCP Bearer,部署必须修改 |
| `BOSS_PHONE` | 空 | 短信登录手机号 |
| `BOSS_PROFILE_DIR` | `~/.boss-client/profile` | 独立浏览器 profile |
| `BOSS_CACHE_DB` | `~/.boss-client/cache.db` | SQLite 缓存 |
| `BOSS_HEADLESS` | `false` | 登录/验证码需 false;已有登录态可设 true |
| `BOSS_CITIES` | `101090100` | 默认城市码,逗号分隔多城市 |
| `BOSS_PORT` | `8788` | REST 端口 |
| `BOSS_RATE_PER_MIN` | `12` | 上游限频 |
| `BOSS_MAX_PAGES` | `5` | 单任务最多页数 |
## 目录
```
src/
api/ 操作注册表 + dispatch(单一事实源)
adapters/boss/ 端点、页面内 API、DOM 提取、映射、限频
browser/ cloak 浏览器宿主
cache/ SQLite / 内存缓存
config/ 配置
domain/ zod 领域模型
generators/ OpenAPI / MCP / CLI / schema 生成
session/ 会话/登录中继/心跳
transports/ REST / CLI / MCP
service.ts 服务层
tests/ 单元测试(无浏览器)
spec/ 生成物(openapi.json / mcp-tools.json / schemas / operations)
docs/ PRD、接口草案、部署、环境配套
skills/boss/ SKILL
systemd/ systemd user unit
exploration/ 2026-11-11 实测记录(artifacts 不入库)
```
## 部署
systemd user:
```bash
mkdir -p ~/.config/systemd/user
cp systemd/boss-client.service ~/.config/systemd/user/
systemctl --user daemon-reload
systemctl --user enable --now boss-client
systemctl --user status boss-client
```
详见 [docs/03-部署与使用.md](docs/03-部署与使用.md)。
## 安全与合规
- REST 仅 `127.0.0.1` + Bearer;profile/cache/log 权限 600/700。
- 二维码、验证码、短信码、cookie/token 不落长期日志;登录中继仅本机。
- 只读;低频;单账号;不做账号共享/批量导流。
- 请遵守 BOSS直聘用户协议与当地法律;因使用产生的账号/合规风险由使用者承担。
## License
[MIT](LICENSE) © 2026 CindyRIng
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessNo recent community issues