Boss直聘简历下载器
下载地址
https://www.zhengdianxue.com/wp-content/uploads/skills/koseninfo--boss-resume-downloader.zip将提示词发送给你的 AI 安装该 skills
请根据 https://skillhub.cn/install/skillhub.md,安装 @koseninfo/boss-resume-downloader。自动从 BOSS直聘下载候选人简历。通过 CDP 远程调试协议操控用户本地 Edge
阅读全文 (展开查看完整说明)
概述
BOSS直聘简历自动下载器(人工登录 + Cookie 持久化版)
核心架构
- 登录方式:不再自动填手机号/收短信/解滑块。改为人工登录——脚本打开 BOSS 企业登录页,用户在浏览器中自行完成登录(滑块/扫码/账号密码均可);登录成功后脚本自动把 Cookie 持久化到
~/.zhipin_downloader/cookies.json。后续运行直接恢复 Cookie 自动登录,无需再次人工干预。 - 存储目录:首次运行弹出系统文件夹选择框(PowerShell FolderBrowserDialog 主用 / tkinter / SHBrowseForFolderW 兜底)让用户选定简历存放位置;之后默认该目录,不再询问。
- 下载机制:BOSS 的简历多为「在线简历」DOM 渲染,未必有独立下载按钮。本脚本采用三策略兜底落盘:
- 点击「下载简历 / 导出」按钮(若 BOSS 提供直接下载,Edge 会落盘到目标目录);
- 捕获简历 PDF 直链(
Network.responseReceived监听,命中 BOSS CDN 关键字后用 Python 直接拉取,校验%PDF-头); Page.printToPDF兜底:对当前渲染的在线简历页打印为 PDF(最稳,适配无下载按钮的情况)。
- 索要简历:点击候选人后检测「在线简历 / 附件简历」按钮是否存在。若不存在(候选人未提供简历),自动发送索要简历消息("您好,方便的话请发一份完整的简历给我,谢谢!");同一候选人在冷却期(3天)内不重复发送。索要记录持久化在
processed.json的messaged字段。 - 按岗位/日期归档:下载的简历按
岗位与日期自动分目录存放:
<存储目录>/<岗位>/<日期(YYYY-MM-DD)>/<姓名>.pdf(岗位/日期无法识别时回退为「未分类岗位」/当天日期)。
- 结果展示:脚本结束写入
~/.zhipin_downloader/completion.json(不写入简历存储目录),由 WorkBuddy 对话层弹窗展示执行结果;下载完成后自动关闭浏览器。
⚠️ BOSS 专属说明(务必先读):BOSS直聘的 DOM 结构与企业版差异较大,且改版频繁。本技能中所有带「⚠️需按实际页面验证」的 JS 选择器常量(见
scripts/boss_cdp.py顶部IS_TRULY_LOGGED_IN_JS/CANDIDATE_JS/OPEN_RESUME_JS等,以及references/site_selectors.md)均依据 BOSS 公开页面结构推断。首次运行前请用浏览器开发者工具(F12)核对选择器,如有出入按references/site_selectors.md修正。改版后只需调整这些常量,流程逻辑无需改动。
🔑 关键修正(招聘者 / 企业账号)
本技能面向 BOSS 招聘者(企业)账号,与求职者账号页面结构不同,以下为实测结论:
- 入口 URL:招聘者「沟通」页入口是
https://www.zhipin.com/web/boss/(会自动跳转https://www.zhipin.com/web/chat/index)。不要用求职者的/web/im或/web/geek—— 招聘者访问会被踢回首页,导致扫描 0 候选人。脚本常量IM_URL已固定为/web/boss/。 - 候选人列表:在
/web/chat/index左侧.user-list .geek-item,每条含 姓名 / 职位 / 日期。点击采用按索引精确点击(CLICK_CANDIDATE_JS取第i个可见.geek-item),比按姓名文本匹配更稳(姓名解析易随排版变化而失败)。 - 简历形态:招聘者的简历是「在线简历」弹层(容器
.resume-detail-wrap/.boss-dialog/.resume-content-wrap),通常没有独立下载按钮。脚本优先抓取弹层内iframe的 PDF 直链;否则用Page.printToPDF把当前弹层打印为 PDF 兜底(弹层可能带遮罩背景,但简历正文在)。 - 列表加载时机:候选人列表由 XHR 异步加载,
scan_candidates()已内置重试(最多 5 次、每次轮询容器出现 + 等待),避免刚跳转/登录后列表未渲染导致的「0 候选人」竞态。 - ⚠️ 反爬 / 风控提示:BOSS 对频繁自动化 Cookie 恢复 + 反复跳转敏感,可能触发滑块验证或让候选人列表不渲染(页面仍是
/web/chat/index但.geek-item为空)。首次运行请走人工登录(设计内的流程),不要靠反复自动登录去试;若已触发风控,关掉调试 Edge、清掉edge_profile与cookies.json后重新人工登录一次即可恢复。
WorkBuddy 对话层执行流程
执行顺序(必须):Phase 1 启动脚本(内部完成目录选择 + 登录 + 下载)→ Phase 2 读取 completion.json → Phase 3 弹窗展示结果。
脚本内部已封装「首次弹窗选目录 / 人工登录 / Cookie 自动登录 / 按岗位日期下载 / 关闭浏览器」,对话层只需:运行脚本 → 等结果 → 弹窗汇报。
Phase 1: 运行下载脚本
直接用 venv 解释器运行核心脚本(脚本会自动处理目录选择、启动 Edge、登录、下载、关闭):
cd <skill_dir>/scripts && <venv_python> boss_cdp.py --non-interactivePython 解释器:优先用 WorkBuddy 管理的 venv(路径形如
~/.workbuddy/binaries/python/envs/default/Scripts/python.exe)。首次运行脚本会自动
pip install所需依赖(aiohttp / numpy / Pillow)。
脚本在运行期会:
- 首次运行:弹出系统文件夹选择框 → 选定后写入配置。
- 启动 Edge(调试端口 9222)→ 打开 BOSS 企业登录页。
- 登录:若已保存且有效的 Cookie → 自动登录;否则等待用户在浏览器中人工登录(最长等待
--login-timeout秒,默认 300)→ 登录成功后保存 Cookie。 - 下载:进入「沟通」页扫描候选人 → 按岗位/日期归档下载简历到所选目录。
- 收尾:关闭浏览器 → 写入
completion.json(在~/.zhipin_downloader/,不在简历目录)。
🔒 安全门禁(硬性):下载阶段只有在真正登录成功后才允许执行;
is_truly_logged_in()未命中则直接拒绝扫描/下载,绝不落盘任何简历。🏁 任务完成判定(硬性):仅当「登录成功 + 下载阶段真正跑完」同时满足时,
completion.json.completed == true且脚本exit 0;否则exit 1,不会被误报为完成。💬 结果弹窗门禁(对话层,硬性):只有
completed == true,Agent 才弹「✅ 任务完成」并附摘要;completed == false时改弹「❌ 任务未完成」并说明原因(登录超时 / 未真正登录 / 扫描失败)。
⚠️ 人工登录期间脚本会阻塞等待(最长 5 分钟)。建议:在后台运行(
run_in_background)并在回复中告知用户在 Edge 中完成登录;脚本完成(含下载)后会通知,再读completion.json弹窗汇报。
Phase 2: 读取结果
脚本退出后读取 ~/.zhipin_downloader/completion.json:
{"completed": true, "login_ok": true, "download_done": true,
"downloaded": 5, "messaged": 0, "skipped": 1, "errors": 0, "total": 6,
"download_dir": "<用户选择的目录>", "report_path": ""}Phase 3: 弹窗展示结果
用 AskUserQuestion 弹窗向用户汇报(摘要字段同上:总数 / 下载 / 跳过 / 出错 / 目录)。completed == false 时弹「❌ 任务未完成」并附 errors 与可能原因。
可用参数
setup_wizard.py(配置向导)
| 参数 | 说明 |
|---|---|
--check | 检查当前配置状态,输出 JSON(first_run / storage_dir_set / download_dir / has_cookies / do_download / do_message) |
--select-dir | 弹出系统文件夹选择框并保存存储目录(一般无需单独调用,boss_cdp.py 首次运行会自动处理) |
boss_cdp.py(登录+下载)
| 参数 | 说明 |
|---|---|
--download-dir DIR | 指定简历下载目录(覆盖配置) |
--non-interactive | 非交互模式(WorkBuddy 中必须使用) |
--no-download | 跳过简历下载(仅登录 / 仅恢复 Cookie) |
--no-message | 跳过消息发送(默认已跳过,仅在有「无简历」候选人时可选发送催简历) |
--no-auto-edge | 不自动管理 Edge(已手动以调试模式启动时用) |
--login-timeout SEC | 人工登录等待超时(秒),默认 300 |
--limit N | 仅处理前 N 个候选人(0=全部),用于测试/控量 |
--reset | 重置所有状态到首次使用(清除 Cookie / 下载标记 / 索要简历标记 / 配置 / Edge profile) |
目录结构
boss-resume-downloader/
├── SKILL.md # 本文件
├── scripts/
│ ├── boss_cdp.py # 核心 CDP 自动化脚本(人工登录+Cookie+下载+归档+关闭+completion.json)
│ ├── setup_wizard.py # 配置向导(--check / --select-dir)
│ ├── config_manager.py # 配置管理(目录选择 / Cookie / 已处理记录)
│ └── anti_detect.py # 反检测脚本(可选、非致命)
├── references/
│ └── site_selectors.md # BOSS直聘 CSS 选择器参考(⚠️需按实际页面验证)
└── assets/
└── config_template.json # 配置模板注:旧版短信/滑块登录相关的
gap_detector.py/drag_solver.py/win32_input.py已移除,本版人工登录流程不再需要。
故障排除
CDP 连接失败
- 确保 Edge 已关闭:
taskkill /F /IM msedge.exe - 重新运行
boss_cdp.py(会自动以调试模式启动 Edge) - 浏览器访问
http://127.0.0.1:9222/json/version验证
登录超时 / 未进入已登录态
- 人工登录时务必在弹出的 Edge 窗口中完成(含滑块/扫码),并真正进入「沟通」或「人才」页面。
- 若等待超时(默认 5 分钟),脚本退出
completed=false,重跑即可(已登录的 Cookie 通常会被保存,下次自动登录)。 - Cookie 失效:删除
~/.zhipin_downloader/cookies.json后重跑,会重新走人工登录。
候选人列表为空 / 扫描失败
- ⚠️ 首要排查:选择器与当前 BOSS 页面结构不符。用 F12 开发者工具核对
references/site_selectors.md中的选择器,按实际 class 修正boss_cdp.py顶部的CANDIDATE_JS/OPEN_RESUME_JS等常量。 - 招聘者账号请确认在「沟通」页(
/web/boss/→ 跳转/web/chat/index),不是求职者 IM 页(/web/im)或人才页(/web/geek);脚本IM_URL已固定为招聘者入口。 - 若 URL 正确但
.geek-item仍为空:多半是 BOSS 风控(滑块/验证拦截)导致列表不渲染。关掉调试 Edge、删除~/.zhipin_downloader/cookies.json与edge_profile/后重跑,走人工登录即可恢复(脚本会自动重试扫描,给列表加载留了时间)。
⚠️ 触发 BOSS 风控(滑块/列表不渲染/自动登录失效)
- 症状:页面停在
/web/chat/index但候选列表为空;或 Cookie 自动登录后很快掉线,脚本转入 300s 人工等待。 - 原因:
~/.zhipin_downloader/edge_profile下的调试浏览器被 BOSS 识别为异常环境 + 反复自动恢复 Cookie/跳转触发反爬。 - 处理:停止自动重试。关闭该调试 Edge(
taskkill /F /IM msedge.exe),删除~/.zhipin_downloader/cookies.json与edge_profile/目录,重跑脚本走人工登录一次(正常浏览器环境下人工登录极少触发风控)。
简历下载为空白 / 失败
- 首选排查
OPEN_RESUME_JS/CLICK_DOWNLOAD_JS选择器:BOSS 简历入口随版本变化,需用 F12 核对「简历 / 在线简历」按钮的真实 class/text。 - 若 BOSS 无独立下载按钮,脚本会自动用
Page.printToPDF输出当前在线简历页为 PDF(仍可能受页面渲染影响)。 - 直链捕获命中 BOSS CDN 关键字失败时不强制下载,回退 printToPDF。
系统文件夹选择框未弹出 / 无法选择 / 每次都弹
- 首次运行若选择框未出现或被取消,脚本会回退到默认目录
~/Downloads/BOSS简历并在控制台告警;可在配置中重跑--select-dir重新选择。 - 每次都弹窗但选不了:根因是 64 位 Python 下
ctypes调用SHBrowseForFolderW/SHGetPathFromIDListW缺少restype/argtypes声明,指针被截断为 32 位导致 access violation。已修复:显式声明restype = ctypes.c_void_p和argtypes。 - 后台运行弹窗不可交互:脚本通过
subprocess调 PowerShell 或 ctypes 弹窗在后台run_in_background模式下对话框不可见/不可交互。解决方案:先在前台运行独立弹窗脚本选目录 → 写入 config → 再后台运行主脚本。 - 如需完全重置(包括存储目录选择状态),运行
boss_cdp.py --reset。
登录超时 / 已登录但检测不到(httpOnly Cookie 问题)
- 根因:BOSS 的认证 Cookie(
zp_at、wt2、wbg)是 httpOnly 的,document.cookie无法读取。旧版IS_TRULY_LOGGED_IN_JS通过document.cookie检查认证 Cookie,导致用户已登录(页面有候选人列表、显示招聘者姓名)但脚本判定未登录 → 等待超时。 - 修复:
IS_TRULY_LOGGED_IN_JS不再依赖document.cookie,改为检查:1) URL 在/web/(chat|boss)/→ 2) 无登录提示文本 → 3) 页面有.geek-item候选人或招聘者 UI 元素。 - Cookie 保存:CDP 的
Network.getCookies可以拿到 httpOnly Cookie,脚本已使用此方法保存。 - 若仍超时:检查 Edge 是否在调试模式(端口 9222)下运行,页面是否在
/web/chat/index。
完全重置到首次使用状态
- 运行
boss_cdp.py --reset:自动清除 Cookie / 下载标记 / 索要简历标记 / 配置 / Edge profile。 - 下次运行将完全以首次模式启动(弹窗选目录 + 人工登录)。