一键导入
boss-resume-downloader
批量下载 BOSS 直聘候选人简历(增量同步 + 防封去重)。 **本 Skill 是 boss-hr-auto 编排流程的子步骤(Step 2),通常在 boss-hr-auto 工作流中调用,不应作为入口 Skill 直接加载。**
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
批量下载 BOSS 直聘候选人简历(增量同步 + 防封去重)。 **本 Skill 是 boss-hr-auto 编排流程的子步骤(Step 2),通常在 boss-hr-auto 工作流中调用,不应作为入口 Skill 直接加载。**
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
**这是整个 BOSS 直聘 HR Skill 包的唯一入口。** BOSS 直聘 HR 简历筛选全流程自动化编排。当用户要求"筛选简历"、走完整流程时使用。 **触发场景**: - "筛选简历" / "筛一下这个岗位" / "帮我筛选候选人" - 需要从 BOSS 岗位提取 JD → 下载简历 → 评分 → 生成报告 - 任何"一条龙"简历筛选需求 - "下载推荐牛人简历" — 使用 boss-recommend-downloader 子流程 **不触发场景**: - 仅问单条消息怎么回复(直接用 message 工具) - 非 BOSS 直聘的其他招聘平台 **子 Skill 说明**:本包的 boss-job-detail、boss-resume-downloader、boss-recommend-downloader、resume-screener、html-report 均为此编排流程的子步骤,不应作为入口直接加载。请始终先加载本 Skill 获取完整工作流,再按 Step 顺序调用子 Skill。
推荐牛人简历批量下载器。通过真实浏览器指纹安全获取推荐牛人页面的完整在线简历。 **本 Skill 是 boss-hr-auto 编排流程的子步骤(Step 2B),由 boss-hr-auto 在提取 JD 后调用,不应作为入口 Skill 直接加载。** **触发场景**: - "下载推荐牛人简历" - "获取推荐候选人完整简历" - "批量下载推荐人才" **不触发场景**: - 仅查看推荐列表(不下载完整简历) - 从沟通/互动页面下载简历(用 boss-resume-downloader) **依赖**:本 skill 依赖 `boss-hr-auto` skill 完成环境准备和登录。请先确保已完成登录流程。
生成美观、可读性强的 HTML 可视化报告。包含渐变色头部、卡片式布局、排名表格、5 维度进度条、评分依据列表、个性化行动建议(含沟通策略)等排版元素。 **本 Skill 是 boss-hr-auto 编排流程的子步骤(Step 4),由 boss-hr-auto 在评分完成后调用,不应作为入口 Skill 直接加载。** **重要更新**: - 行动建议必须根据候选人具体经历个性化,禁止模板化 - 每个人的沟通方向和需确认问题必须不同
简历筛选与评分系统(boss-hr-auto 工作流的 Step 3)。基于 JD 自动提取特征 → 硬门槛过滤 → 权重加权评分 → 排名输出。 支持动态学历分档和双模式权重(技术岗/管培岗)。 **本 Skill 是 boss-hr-auto 编排流程的子步骤,通常由 boss-hr-auto 在 Step 3 阶段调用,不应作为入口 Skill 直接加载。** **重要更新**: - 学历评分必须严格执行学校分档标准,禁止给所有人打相同分数 - 行动建议必须根据候选人具体经历个性化,禁止模板化
BOSS 直聘 CLI 命令参考手册 — 34 个顶层命令,招聘者/求职者双模式。 本 Skill 是 boss-hr-auto 编排流程的参考引用,不应作为入口直接加载。
通过 CDP 浏览器提取 BOSS 直聘岗位完整 JD(职责、要求等)。 **本 Skill 是 boss-hr-auto 编排流程的子步骤(Step 1),通常在 boss-hr-auto 工作流中调用,不应作为入口 Skill 直接加载。**
| name | boss-resume-downloader |
| description | 批量下载 BOSS 直聘候选人简历(增量同步 + 防封去重)。 **本 Skill 是 boss-hr-auto 编排流程的子步骤(Step 2),通常在 boss-hr-auto 工作流中调用,不应作为入口 Skill 直接加载。** |
| type | workflow |
Install and operate a deterministic BOSS/Zhipin recruiter resume synchronization workflow. Standardize the boss-agent-cli command path, CDP endpoint, Chrome launch convention, auth data directory, resume storage root, and resume download fallback logic so that the workflow is reproducible across machines and across agent harnesses (Claude Code, Claude Desktop, Cursor, etc.).
Use this skill for two related goals:
securityId fallback behavior.Prefer these defaults unless the user explicitly requests otherwise. Paths shown with ~ are POSIX (macOS/Linux); the Windows equivalent uses %USERPROFILE%.
| Item | Value (POSIX) | Value (Windows) |
|---|---|---|
| Platform | zhipin | zhipin |
| Role | recruiter | recruiter |
| CDP URL | http://localhost:9222 | http://localhost:9222 |
| boss command | boss (on PATH) | boss (on PATH) or %USERPROFILE%\bin\boss.cmd |
| boss-agent-cli auth data dir | ~/.boss-agent | %USERPROFILE%\.boss-agent |
| Resume output root | ~/WorkBuddy/boss-resumes | %USERPROFILE%\WorkBuddy\boss-resumes |
| Sync script | scripts/sync_boss_resumes.py (relative to this SKILL.md) | same |
Invoke the CLI like this (assumes boss is on PATH):
boss --role recruiter --platform zhipin --cdp-url http://localhost:9222 <command>
Important known facts:
zhipin, not zhipin-recruiter.http://localhost:9222 when recruiter authentication is needed.~/.boss-agent (POSIX) / %USERPROFILE%\.boss-agent (Windows). Do not guess .boss-agent-cli.boss is not resolvable from subprocess, fall back to %USERPROFILE%\bin\boss.cmd.securityId.hr applications can list applied candidates but may not expose securityId in all outputs.hr chat can expose candidate names but may still omit securityId.friend_detail(friendIds) as a fallback to resolve securityId from numeric friendId. This fallback requires the boss_agent_cli Python package to be importable from the active environment.hr candidates can be used as an additional fallback source.encryptFriendId equals securityId.Strongly recommended over one-shot bulk downloads.
Use your agent harness's scheduled task capability (e.g., Claude Code /loop, cron, or any recurring job) to run sync-all every hour:
# Run once per hour, keep Chrome open in the background
python "${SKILL_DIR}/scripts/sync_boss_resumes.py" sync-all
In Claude Code you can set this up with:
/loop 1h python "${SKILL_DIR}/scripts/sync_boss_resumes.py" sync-all
Each run only downloads candidates not yet in candidate_index.json, so an hourly job downloads at most the few new applicants from the past hour — typically 1–5 requests per run.
Why this is better than a one-shot bulk sync:
Avoids risk control. BOSS/Zhipin detects abnormal access patterns. Downloading 50+ resumes in one session looks like scraping and may trigger a temporary block or CAPTCHA. Spreading the same work across 24 hourly runs of 1–3 resumes each is indistinguishable from normal recruiter browsing.
Local analysis is fast and free. Once resumes are on disk as resume.md, any analysis (filtering by keyword, comparing candidates, summarizing, ranking) runs entirely locally — no network round-trips, no rate limits, no extra API calls to BOSS.
After sync, all resumes are at:
~/WorkBuddy/boss-resumes/jobs/<jobId>_<jobName>/resumes/<name>_<id>/resume.md
To analyze them, read the local files directly. Example prompts that work well once files are synced:
This is faster and more reliable than querying BOSS live for each analysis question.
boss --help
If boss is not on PATH, locate the installed entrypoint and either add it to PATH or pass it via --boss-bin to the bundled script. On Windows the entrypoint is typically %USERPROFILE%\bin\boss.cmd (a wrapper around the env's boss.exe).
Prefer an already-running Chrome session that exposes http://localhost:9222. If status checks fail because CDP is unavailable, launch Chrome manually with remote debugging enabled and a dedicated profile. Common executable locations:
/Applications/Google Chrome.app/Contents/MacOS/Google Chromegoogle-chrome or chromium on PATHC:\Program Files\Google\Chrome\Application\chrome.exe, C:\Program Files (x86)\Google\Chrome\Application\chrome.exe, or %LOCALAPPDATA%\Google\Chrome\Application\chrome.exeRecommended launch shapes:
# macOS
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \
--remote-debugging-port=9222 \
--user-data-dir="$HOME/.workbuddy/chrome-profiles/boss-cdp"
# Linux
google-chrome \
--remote-debugging-port=9222 \
--user-data-dir="$HOME/.workbuddy/chrome-profiles/boss-cdp"
:: Windows
"<chrome.exe>" --remote-debugging-port=9222 --user-data-dir="%USERPROFILE%\.workbuddy\chrome-profiles\boss-cdp"
Do not randomize the CDP port or profile directory unless port 9222 is occupied.
boss --role recruiter --platform zhipin --cdp-url http://localhost:9222 status
If not logged in, run CDP login and let the user complete any browser-side QR/login step:
boss --role recruiter --platform zhipin --cdp-url http://localhost:9222 login --cdp
boss --role recruiter --platform zhipin --cdp-url http://localhost:9222 hr jobs list
Proceed only after the command returns the expected recruiter jobs.
Use this default resume root unless the user specifies another directory:
~/WorkBuddy/boss-resumes%USERPROFILE%\WorkBuddy\boss-resumesExpected structure:
boss-resumes/
config.json
job_index.json
jobs/
<jobId>_<safeJobName>/
job.json
candidate_index.json
resumes/
<safeCandidateName>_<candidateId>/
resume.json
resume.md
raw_response.json
Run status first. If authentication is missing or expired, use the CDP login flow.
boss --role recruiter --platform zhipin --cdp-url http://localhost:9222 status
boss --role recruiter --platform zhipin --cdp-url http://localhost:9222 hr jobs list
Persist all currently online jobs into job_index.json, keyed by stable job ID and encrypted job ID.
For every online job, create a directory named:
<jobId>_<safeJobName>
Store raw job metadata in job.json.
For each job, call applications with the encrypted job ID when available:
boss --role recruiter --platform zhipin --cdp-url http://localhost:9222 hr applications --job-id <encryptJobId>
Paginate if the CLI output indicates more pages.
For each applied candidate, resolve:
encryptGeekId / encrypted candidate IDsecurityIdUse applications first. If securityId is absent, resolve it by numeric friendId through the internal boss-agent-cli friend_detail(friendIds) API. This endpoint returns candidate name, securityId, encryptUid, jobId, and encryptJobId. Use hr candidates or hr chat only as additional fallback sources. Do not assume encryptFriendId equals securityId.
If securityId cannot be resolved, record the candidate as pending_security_id in candidate_index.json and skip resume download for that candidate. Do not mark as permanently failed.
When all parameters are present, call:
boss --role recruiter --platform zhipin --cdp-url http://localhost:9222 hr resume <encryptGeekId> --job-id <encryptJobId> --security-id <securityId>
Save:
raw_response.jsonresume.jsonresume.mdBefore downloading, inspect candidate_index.json.
Skip a candidate when:
downloaded, and--force option was requested.Update candidates when:
pending_security_id, failed, or partial,--force is set.During bulk downloads, apply a random delay between successful/attempted candidate downloads:
3-6 seconds
Do not delay for dry-run/list-only operations.
The script lives next to this SKILL.md at scripts/sync_boss_resumes.py. Resolve ${SKILL_DIR} to the directory containing this SKILL.md, then call:
# Sync all online jobs incrementally
python "${SKILL_DIR}/scripts/sync_boss_resumes.py" sync-all
# Sync all online jobs with command echoing; --verbose is a global option and must be placed before the subcommand
python "${SKILL_DIR}/scripts/sync_boss_resumes.py" --verbose sync-all
# Sync one job by numeric jobId or encrypted jobId
python "${SKILL_DIR}/scripts/sync_boss_resumes.py" sync-job --job-id <jobId>
# Refresh job index only
python "${SKILL_DIR}/scripts/sync_boss_resumes.py" refresh-jobs
# Dry run without downloading resumes
python "${SKILL_DIR}/scripts/sync_boss_resumes.py" sync-all --dry-run
Use the Python interpreter that has boss_agent_cli importable, otherwise the friend_detail fallback will be disabled. The script prints a warning to stderr (with --verbose) when this happens.
If boss is not on PATH, override with --boss-bin <path> or set BOSS_BIN=<path> in the environment.
applications returns 0 for recommended/chat-based candidatesboss hr applications only returns candidates who formally applied to the job. It returns 0 for:
friendSource != 0 in the friend listDetection: Run boss hr chat — if it also returns 0 or only 1-3 entries, your candidates are likely from recommendations, not formal applications.
Fix — CDP friend list → CLI resume download (proven approach):
Instead of relying on sync_boss_resumes.py (which calls applications), use this two-phase approach:
Phase 1: CDP browser captures the full friend list
from patchright.sync_api import sync_playwright
import json
captured = {}
def on_resp(resp):
if 'getBossFriendListV2' in resp.url:
try: captured['fl'] = resp.json()
except: pass
with sync_playwright() as p:
browser = p.chromium.connect_over_cdp('http://localhost:9222')
pg = browser.contexts[0].pages[0] # NEVER new_page()
pg.on('response', on_resp)
pg.goto('https://www.zhipin.com/web/chat/index', wait_until='networkidle', timeout=30000)
time.sleep(5)
friends = captured['fl']['zpData']['friendList']
# Each friend has: name, uid, encryptUid, securityId, encryptJobId, jobName
# uid = friendId, encryptUid = encryptGeekId (for hr resume)
See references/resume-download-via-friend-list.md for the complete working script.
Phase 2: CLI downloads each resume individually
import subprocess
for f in friends:
result = subprocess.run([
'boss.exe', '--role', 'recruiter', '--platform', 'zhipin',
'--cdp-url', 'http://localhost:9222',
'hr', 'resume', f['encryptUid'],
'--job-id', f['encryptJobId'],
'--security-id', f['securityId']
], capture_output=True, timeout=45, env=BOSS_ENV)
# Save raw_response.json + resume.json + resume.md
# Apply 3-6s random delay between downloads
Parameter mapping (friend list → CLI):
| friendList field | CLI parameter | Purpose |
|---|---|---|
encryptUid | encryptGeekId | boss hr resume first arg |
securityId | --security-id | Resume download auth token |
encryptJobId | --job-id | Required job context |
uid | — | Unique ID for file naming |
⚠️ This approach requires the CLI to be properly logged in (not a false positive). Run the login verification from boss-agent-cli first.
| Symptom | Likely cause | Fix |
|---|---|---|
unrecognized arguments: --verbose | Global option placed after the subcommand | Put --verbose before sync-all or sync-job |
[WinError 2] 系统找不到指定的文件 / FileNotFoundError: boss | Subprocess cannot find boss on PATH | Pass --boss-bin <path> or set BOSS_BIN; on Windows use %USERPROFILE%\bin\boss.cmd |
| Not logged in despite browser login | Wrong auth data dir | Use --data-dir ~/.boss-agent (Windows: %USERPROFILE%\.boss-agent) |
| CDP connection refused | Chrome was not started with remote debugging | Relaunch Chrome with --remote-debugging-port=9222 |
All candidates are pending_security_id | applications output lacks securityId and internal fallback failed | Run the script with a Python that has boss_agent_cli importable, or pass --verbose to see the import error |
zhipin-recruiter platform error | Wrong platform name | Use --platform zhipin |
| Applications pagination stopped at page 100 | Hard cap reached | Re-run on the specific job, or split by other filters; the script warns to stderr when the cap is hit |
Report the following after each sync:
securityIdA successful sync envelope shape:
{
"ok": true,
"resume_root": "<resolved path>",
"mode": "sync-all",
"totals": {
"candidates_discovered": 0,
"downloaded": 0,
"skipped_existing": 0,
"pending_security_id": 0,
"failed": 0
}
}