BOSS 直聘自动打招呼 + 每日简历看板
把「找简历」这件事收成一条流水线:浏览器里打招呼 → 索要简历 → 采集在线简历文本 → 打分去重入库 → 出当日 HTML 看板。
评分、去重、看板全部由脚本离线完成,可重复执行;浏览器操作只负责真实触达,复用用户自己已登录的会话,不新开浏览器、不绕验证码。
何时使用
用户说出这类话时触发:
- "帮我在 BOSS 上打招呼 / 主动打招呼 / 批量打招呼"
- "今天招 XX 岗,帮我筛人收简历"
- "跑一遍每日简历看板 / 刷新看板 / 生成今天的看板"
- "把这批简历重新打分 / 按新标准重排"
- "下载简历并汇总成看板"
不适用:只想看某个候选人的简历内容(用普通浏览器读取即可,不必跑整条流水线);已投递邮件的简历筛选(用 boss-resume-screening 邮件通道)。
前置条件(缺一不可)
- 浏览器控制已开启:
设置 > Agent > 浏览器控制,对应浏览器已安装并连接 WorkBuddy 扩展。未开启就先引导用户开启,不要退化成另起一个干净浏览器 —— BOSS 会判定异常登录,要验证码,账号还可能被限流。 - 用户已登录 BOSS 招聘者账号:脚本和 agent 都不碰账号密码、不代收验证码、不自动过滑块。
- 本机有 Python 3.9+(WorkBuddy 自带 python 即可,无需第三方库)。
首次配置(每个招聘岗位一次)
python <skill>/scripts/init_workspace.py --workspace "<工作区目录>"
生成 config.json,先和用户确认四件事再动手:
| 配置项 | 说明 | 默认 |
|---|---|---|
job.title_keywords / job.cities |
招什么岗、在哪些城市 | 内容运营/TikTok运营,深圳 |
greet.template |
打招呼话术(≤60 字,说清我们是谁+什么岗+为什么找你) | 已给模板 |
greet.daily_limit |
每日打招呼上限 | 40(新号建议 20) |
scoring.dimensions |
岗位画像与权重(合计 100) | 内容运营导向 7 维 |
配置细节与换岗位改法见 references/scoring.md。
主流程:每日一轮
Step 1 读额度与目标
python <skill>/scripts/ingest.py stats --workspace "<ws>"
取 remaining_today 与 config.greet.daily_limit 的较小值作为本轮上限。remaining_today ≤ 0 就直接跳到 Step 6 出看板,不要硬发。
Step 2 浏览器触达(逐人循环)
打开 https://www.zhipin.com/web/boss/recommend(或 /web/boss/search),确认顶部沟通职位与 job.title_keywords 一致,然后对每个候选人:
- 读卡片字段(姓名/年龄/城市/经验/学历/公司/职位/期望薪资)
- 本地预筛:命中
skip_if_title_contains、filters.exclude_any、或已打过招呼 → 跳过 - 点「打招呼」,按模板生成话术并发送,确认出现成功提示才算发出
- 进聊天页:点「求简历」/「交换简历」,没有该按钮就补一句索要话术
- 打开「在线简历」,核对姓名一致后抓全文
- 有附件简历就下载,稍后归档
节奏硬约束:两人之间随机等 min_interval_seconds~max_interval_seconds(默认 25–55s);只在 active_hours 内跑;出现验证码 / "操作过于频繁" / 重新登录 → 立即停止并告知用户。
完整操作细则、文案定位策略、风控红线见 references/boss-workflow.md。
Step 3 落原始数据
把本轮采集结果写成 data/raw/<YYYY-MM-DD>-<HHMM>.json(数组,一人一条):
[{
"name": "王小明", "age": 26, "city": "深圳", "experience": "3年",
"education": "本科", "school": "深圳大学",
"current_company": "XX照明科技", "current_title": "内容运营",
"expect_salary": "15-18K", "expect_job": "内容运营",
"phone": "138****0001", "email": "a@b.com",
"greet_text": "已发送的话术", "greet_time": "2026-10-28 09:40",
"replied": false, "source": "推荐牛人",
"resume_file": "",
"resume_text": "在线简历全文(关键:工作经历/业绩数字/平台/算法/数据)"
}]
字段名同时接受中文键(姓名/公司/简历…),见 scripts/common.py 的 ALIASES。
Step 4 入库(去重 + 评分)
python <skill>/scripts/ingest.py add --workspace "<ws>" --file "data/raw/<file>.json"
- 去重:手机号 / 邮箱 / 姓名+公司;无强键时用「同名且至少一方无公司」兜底
- 评分:按
config.scoring算总分与维度明细,命中硬过滤直接判"不合适" - 返回
added/merged计数和每人分数,可直接念给用户
Step 5 归档附件简历
python <skill>/scripts/ingest.py attach --workspace "<ws>" --id "<id或姓名>" --file "<下载路径>"
文件复制进 resumes/,回填相对路径并重算分数。
Step 6 生成并交付看板
python <skill>/scripts/build_dashboard.py --workspace "<ws>" --open
产物:dashboards/简历看板-YYYY-MM-DD.html(同时刷新 dashboards/latest.html)。用 present_files 打开给用户。
看板能力:KPI(候选数/已打招呼/已获取简历/推荐/已回复/已约面)、分数分布、流程漏斗、时间范围切换(今日/7天/30天/全部)、结论与阶段筛选、搜索、卡片/表格双视图、评分构成与简历全文弹窗、CSV 导出、进度导出、打印成 PDF。单文件、离线可用、无外部依赖。
Step 7 汇报
一句话结论 + 数字:本轮打招呼 N 人、新增简历 M 份、推荐 K 人、剩余额度 R;需要人接手的事项(待人工过验证码、待补简历文本)单独列出。
其他常用入口
| 场景 | 命令 |
|---|---|
| 只刷新看板(数据没变) | build_dashboard.py --workspace <ws> |
| 改了评分规则后重算 | ingest.py rescore --workspace <ws> |
| 改候选人阶段/备注 | ingest.py set --workspace <ws> --id <id> --stage 已约面 --note "约周三下午" |
| 标记已回复 | ingest.py set --workspace <ws> --id <id> --replied true |
| 看分数排行 | ingest.py list --workspace <ws> --limit 30 |
| 导出给 Excel | ingest.py export --workspace <ws> --out 候选人.csv |
| 指定日期出看板 | build_dashboard.py --workspace <ws> --date 2026-10-27 |
合规与边界(必须遵守)
- 只操作用户本人的账号,只在用户确认的岗位范围内打招呼。
- 不绕过、不自动完成任何验证码/滑块/短信验证;触发即停,交回人工。
- 严格遵守每日上限与发送间隔;不做多标签并发、不改 UA、不注入请求。
- 简历属个人信息:默认只存本地工作区,未经用户同意不要把简历或看板发布成公开链接。
- 用户明确表示"不合适/别联系"的候选人,标记后不再发任何消息。
交付物结构
<workspace>/
├── config.json 岗位/话术/评分/上限
├── data/candidates.jsonl 候选人库(唯一数据源)
├── data/raw/*.json 每轮原始采集
├── resumes/ 简历归档
└── dashboards/ 每日看板 + latest.html
参考文件
references/boss-workflow.md—— 浏览器逐人操作细则、文案定位策略、风控红线references/scoring.md—— 评分模型、换岗位改法、调参排错references/troubleshooting.md—— 浏览器/数据/看板三类问题排查