下载地址
https://www.zhengdianxue.com/wp-content/uploads/skills/koseninfo--boss-talent-searcher.zip将提示词发送给你的 AI 安装该 skills
请根据 https://skillhub.cn/install/skillhub.md,安装 @koseninfo/boss-talent-searcher。Boss直聘人才搜索器(BOSS直聘招聘者端·主动搜索人才+打招呼索要简历)。通过 RPA(CDP
阅读全文 (展开查看完整说明)
概述
Boss直聘人才搜索器(BOSS直聘招聘者端 · 主动搜索人才 + 打招呼索要简历)
核心架构
- RPA(由脚本完成):
scripts/boss_talent_searcher_cdp.py启动 Edge(调试端口 9222),
打开 Boss直聘招聘者端入口(https://www.zhipin.com/web/boss/,未登录自动跳转登录页)→ 用户手工登录(扫码 / 滑块 / 手机号均可)→ Cookie 全量落盘(Network.getAllCookies,下次免登录)→ 进入「搜索人才」栏目→ 读取在招岗位(职位筛选下拉 / 职位管理页兜底)→ 预算均分 → 逐岗位搜索→ 逐条点击候选人「打招呼」→ 直到该岗位预算用完 / 当天总量耗尽。
- 预算分配:账号「可聊天数量」默认均分给全部在招岗位(总量 ÷ 岗位数,
除不尽时余数给第一个岗位);也可 --per-job N 固定每岗位次数;当天总量上限--daily-quota(或自动尝试读取页面「可打招呼 N 次」文案)。
- 打招呼方式(2026-08-26 实测确认):候选人列表在同源 iframe
/web/frame/search/?jobId=... 内,卡片根节点为 <li class="geek-info-card">,整张卡片的<a data-contact="1"> 是真实联系入口(卡片内 .btn-getcontact 为 0×0 隐藏模板,不可点)。真实「联系Ta/联系他」按钮在 hover 候选人后,于【主文档】弹出的固定位置操作条上 (当前实测约 (1103,118),面积 11440),不在 iframe 内。流程:弯曲悬停卡片中心 →FIND_MAIN_CONTACT_BTN_JS 定位主文档按钮 → 真实鼠标点击;JS el.click() 兜底。点击后 BOSS 通常打开聊天窗并自动发预设话术;脚本检测输入框:已清空(已自动发送)→ 关闭;未清空 → 补发话术(--greeting-text)。按钮含「已」字(已联系/已打招呼)→ 自动跳过。⚠️ 账号需有生效的「搜索畅聊卡/畅聊卡」权益,否则「联系Ta」点击无反应(不报错也不发送), 热搜牛人还提示「需消耗多次畅聊卡权益」。
- 拟人化(默认开启):真实鼠标(CDP
Input.dispatchMouseEvent,带抖动)、
点击前随机停顿、逐字打字(70~160ms 间隔)、候选人之间 2.5~6s 随机停顿(约 18%概率出现 8~20s 长停顿),模拟真人翻看节奏、降低风控。--fast 可关闭。
- 安全门禁:仅当登录成功(招聘者端 URL
/web/boss/web/chat或招聘者 UI 特征文本)
且进入搜索人才页后才操作;未登录绝不动作。
- 任务完成判定:全部岗位预算用完 / 当天总量耗尽 / 无更多候选人后,
关闭打开的 Edge 窗口(默认)才算任务完成(用户标准:沟通完之后关闭企业端)。
- 结果落盘:结束写入
~/.zhipin_talent_searcher/completion.json,由对话层汇报。
只有该文件里 login_ok == true 且 day_sent > 0(或 dry_run)才可对用户说「已发送」。
⚠️ Boss直聘版关键说明(务必先读,2026-08-26 实测校准)
- 招聘者端新版路由(/web/chat/ 体系,实测):登录后落地
https://www.zhipin.com/web/chat/index(沟通页)。导航菜单:职位管理 / 推荐牛人(→/web/chat/recommend)/ 深度搜索 / 搜索(→/web/chat/search)/ 沟通 / 意向沟通。旧路由 /web/boss/job 已停止维护(页面提示自动跳转)。搜索入口SEARCH_URLS[0] = /web/chat/search(URL 直达实测可用;菜单点击不稳定)。
- 登录:招聘者端入口
https://www.zhipin.com/web/boss/,未登录自动跳转登录页
/web/user/(角色选择页:选「我要招聘」→ 手机号验证码/扫码)。认证 Cookie(zp_at/wt2/wbg,httpOnly)必须用 Network.getAllCookies 保存/检测。⚠️ BOSS 风控极严:认证 Cookie 登录后存在时间极短(实测约 1~2 秒),handle_login 检测到登录后必须立即保存(脚本已内置无延迟保存);新会话首次恢复Cookie 可自动登录成功,但短时间内第二次恢复必被踢。Page.navigate 后旧 WS target 失效,必须 _reattach 重连(已内置),否则后续操作全部落空。
- 岗位读取(已打通):
/web/chat/search没有「全部职位」下拉;真正的岗位下拉在
沟通页 /web/chat/index(左侧会话列表上方「全部职位」),展开后选项格式岗位名 _ 城市 薪资(如 java开发工程师 _ 广州 10-12K),含「(关闭)」= 已下线岗位需剔除。该下拉是 React 组件,el.click() 不触发,必须真实鼠标点击(_click_coord_guarded,已内置)。
- 候选人搜索+打招呼(2026-08-26 晚间已打通 ✅):原以为搜人才页主体空白,实测是因为
未给搜索 iframe 注入 jobId。正确做法:SET_IFRAME_SRC_JS 直接设 iframe src=/web/frame/search/?jobId=<岗位id>(岗位 id 从沟通页「全部职位」下拉选项的 value取),列表 5 秒内刷新出候选人。卡片识别用 .geek-info-card(非文本启发式),真实联系入口见上方「打招呼方式」。仅剩唯一阻塞:账号需有生效的「搜索畅聊卡/畅聊卡」权益,否则「联系Ta」点击无反应(见第 9 条)。
- 不硬编码 class。BOSS 是 React SPA,DOM class 随版本变化。脚本用
「标签文本 / placeholder / 按钮文案」启发式定位(见 references/search_selectors.md)。
- 每日可聊量文案(未实测):
READ_DAILY_QUOTA_JS已含多模式
(「今日可打招呼 N 次」等);推荐让用户直接提供 --daily-quota N(最准)。均分模式脚本自动处理(总量÷岗位数,余数给第一个岗位)。
- ⚠️ 反爬 / 风控(BOSS 对 CDP 自动化极敏感):首次运行务必走人工登录;
若触发滑块验证或列表不渲染,关闭调试 Edge、删除 ~/.zhipin_talent_searcher/cookies.json与 edge_profile/ 后重跑人工登录一次即可恢复。正式运行保持拟人化节奏(勿用 --fast)。
- Windows 路径:所有参数路径用带盘符路径(
C:/Users/...),勿用/c/Users/...。 - ⚠️ 畅聊卡门槛(唯一剩余阻塞,2026-08-26 确认):BOSS「搜索人才」打招呼受
「搜索畅聊卡/畅聊卡」权益限制。账号无生效畅聊卡时,「联系Ta」点击完全无反应(不报错、不弹窗、不发送),部分热搜牛人明确提示「联系Ta热搜牛人需消耗多次畅聊卡权益(该牛人很受欢迎)」。READ_CANDIDATES_JS 已把这类提示计入 btnText,可作「需畅聊卡」信号。脚本无法绕过该门槛——必须账号先有生效畅聊卡,才能真正发出打招呼。自动化前请确认账号畅聊卡状态。
- 「推荐牛人」路径 = 默认主路径,免搜索畅聊卡 ✅(2026-08-27 实测):
--mode recommend
(默认)走 /web/chat/recommend,点候选人常驻「打招呼」按钮即用该岗位【预设】话术直接发出,不打聊天窗、不输入话术、不受畅聊卡门槛限制;发送成功按钮变「继续沟通」、/web/chat/index出现「[送达]」会话。关键坑:该路由不能冷加载(Page.navigate 直达会被 SPA 重定向到/web/user/ 登录页),必须先在已登录 dashboard 点击左侧「推荐牛人」导航(Vue RouterLink)走 SPA 客户端路由进入。候选人卡片 li.card-item、按钮 div.button-chat-wrap、岗位下拉div.ui-dropmenu.ui-dropmenu-label-arrow(裸 div.ui-dropmenu 是右上角账号菜单,勿混淆)、选项面板 div.ui-dropmenu-list,均见 references/search_selectors.md「推荐牛人」一节。
WorkBuddy 对话层执行流程
执行顺序(必须):Phase 1 确认参数 → Phase 2 首跑校准(–analyze + –dry-run)
→ Phase 3 正式运行 → Phase 4 读 completion.json 汇报。
Phase 1:确认参数
向用户确认(或按默认值执行,用户无异议即默认):
- 当天可聊天总量:用户提供(如「今天一共 30 次」→
--daily-quota 30);
用户未提供 → 默认自动尝试读取页面「可打招呼 N 次」作为总量上限。
- 每岗位预算:默认均分模式(可聊天总量 ÷ 全部在招岗位数,余数给第一个岗位);
用户说「每个岗位撩 N 人」→ --per-job N 固定值。
- 沟通内容:默认索要简历话术(BOSS 打招呼多为账号预设话术,脚本只在聊天窗未
自动发送时补发);用户给了话术 → --greeting-text。
- 告知用户:首次运行会弹出 Edge 等其手工登录(约 1~2 分钟),登录后自动跑完并关闭窗口。
Phase 2:首跑校准(页面改版时才需重新校准)
脚本已内置启发式定位,但 BOSS「搜索人才」页真实路由/菜单文案未实测,首次必跑校准:
cd <skill_dir>/scripts && python boss_talent_searcher_cdp.py --analyze --login-timeout 600- 弹出 Edge 招聘者端,用户手工登录;登录后脚本导出
~/.zhipin_talent_searcher/analyze_search.json(菜单/按钮/输入框真实文案 + URL)、analyze_job_manage.json(职位管理页)、analyze_search_result.json(搜索结果页)、analyze_chat.json(打招呼后的聊天窗)。
- 对照
references/search_selectors.md,把SEARCH_URLS/SEARCH_MENU_TEXTS/
CHAT_BTN_TEXTS 等常量更新为真实文案。
试运行(只走到候选人列表,不实际打招呼):
python boss_talent_searcher_cdp.py --dry-run --per-job 2- 确认:能读到在招岗位、能搜出候选人列表、能定位到「打招呼」按钮。无误后再正式跑。
Phase 3:正式运行
必须后台运行(run_in_background: true),因为人工登录会阻塞等待:
cd <skill_dir>/scripts && python boss_talent_searcher_cdp.py
--non-interactive --login-timeout 600- 首次运行自动
pip install aiohttp,并自动以调试模式启动 Edge(端口 9222)。 - 脚本会打开 Boss直聘招聘者端,等用户在 Edge 里手工登录(扫码/滑块/手机号均可),
检测到登录成功后自动继续;Cookie 存 ~/.zhipin_talent_searcher/cookies.json,下次免登录。
- 告知用户:「请在弹出的 Edge 窗口完成招聘者登录,登录后脚本会自动开始搜索人才并打招呼」。
- 当天总量上限:
--daily-quota 30手动指定,或自动读取页面配额(--no-auto-quota关闭)。
常用变体:
- 当天总量限制:
--daily-quota 30(覆盖自动读取值) - 每岗位固定预算:
--per-job 10 - 只处理部分岗位:
--job-filter "Java,前端"(名称子串匹配,逗号分隔) - 最多处理 N 个岗位:
--max-jobs 3 - 中途中断后续跑(不重复打招呼):
--resume-quota(读取当天已发计数,剩余额度继续) - 自定义补发话术:
--greeting-text "您好,方便发份简历吗?"
Phase 4:读取结果并汇报
脚本退出(窗口已关闭)后读 ~/.zhipin_talent_searcher/completion.json:
{
"completed": true, "login_ok": true, "search_page_opened": true,
"day": "2026-08-26", "per_job_budget": null, "daily_quota": 30,
"day_sent_before": 0, "day_sent": 12,
"total_positions": 2, "total_positions_all": 2,
"positions": [
{"name": "Java开发工程师", "location": "广州", "budget_target": 15, "budget": 15, "greeted": 12},
{"name": "前端开发工程师", "location": "广州", "budget_target": 15, "budget": 15, "greeted": 0}
],
"sent_list": [{"job": "Java开发工程师", "name": "张三", "method": "sent"}],
"failed": [], "quota_reached": false, "dry_run": false,
"message": "共处理 2 个岗位,实际发送 12 次。任务结束后企业端窗口已关闭。"
}汇报口径:
login_ok == false→ 登录失败/超时,提示用户在浏览器完成登录后重跑。search_page_opened == false→ 未进入搜索人才页,跑--analyze校准菜单文案/URL。total_positions == 0→ 没读到在招岗位,跑--analyze校准职位筛选结构,
或确认职位管理页有在招岗位。
day_sent > 0→ 「✅ 已对 X 个岗位打招呼共 N 次」+ 每个岗位的
已发送/预算 + 若 quota_reached 提示「已达到当天总量上限」。
dry_run == true→ 说明是试运行,未实际打招呼。- 禁止在没有 completion.json 佐证的情况下声称已打招呼。
可用参数(boss_talent_searcher_cdp.py)
| 参数 | 说明 |
|---|---|
--non-interactive | 非交互模式(WorkBuddy 中使用) |
--per-job N | 每岗位打招呼预算(固定值);不指定默认「均分模式」:当天可聊天数量÷岗位数 |
--daily-quota N | 当天可聊天总量上限,0=自动尝试读取页面配额(默认) |
--no-auto-quota | 不自动读取页面配额 |
--resume-quota | 续跑:读取当天已发计数作为初始值(配合 --daily-quota 防止超量) |
--greeting-text TEXT | 补发内容(聊天窗未自动发送时用),默认索要简历话术 |
--job-filter "A,B" | 只处理名称包含 A 或 B 的岗位 |
--max-jobs N | 最多处理 N 个岗位(0=不限) |
--search-url URL | 搜索人才页 URL(覆盖默认候选) |
--analyze | 只做结构分析,导出 analyze_*.json(首次必跑) |
--dry-run | 试运行:走到候选人列表不实际打招呼(首跑推荐) |
--fast | 关闭拟人化停顿(调试用) |
--keep-open | 结束后保留浏览器窗口(默认关闭,用户要求关闭才算完成) |
--no-auto-edge | 不自动管理 Edge(已手动开调试端口时用) |
--login-timeout SEC | 人工登录等待超时(秒),默认 600 |
--port N | Edge 调试端口,默认 9222 |
--reset | 重置所有状态(清 Cookie / 配置 / 报告) |
目录结构
boss-talent-searcher/
├── SKILL.md # 本文件
├── scripts/
│ ├── boss_talent_searcher_cdp.py # 核心 CDP 自动化(登录+导航+岗位预算+搜索+打招呼+报告)
│ ├── config_manager.py # 配置 / Cookie / 当日计数持久化(~/.zhipin_talent_searcher/)
│ ├── raw_cdp_client.py # CDP 传输层(复用 boss 下载器成熟实现,含 port 支持)
│ └── anti_detect.py # 反检测脚本(可选、非致命)
└── references/
└── search_selectors.md # 定位策略、关键词校准手册、页面结构参考故障排除
CDP 连接失败
- 关闭所有 Edge:
taskkill /F /IM msedge.exe - 重跑脚本(会自动以调试模式启动 Edge)
- 浏览器访问
http://127.0.0.1:9222/json/version验证 - 与其它简历下载器/发布器技能共用 9222 端口,先关掉别的实例,或用
--port 9223
登录超时 / 反复要求登录
- 必须登录招聘者端(
/web/boss/),个人求职端登录不算。 - 超时(默认 600s)脚本会退出
login_ok=false,重跑即可。 - Cookie 失效:
--reset后重跑,重新人工登录。
未进入搜索人才页(search_page_opened=false)
- 跑
--analyze,看analyze_search.json→url与menus里菜单真实文案,
把它加进 boss_talent_searcher_cdp.py 顶部的 SEARCH_MENU_TEXTS / SEARCH_URLS。
- 也可用
--search-url <真实URL>直接指定搜索人才页地址。
读不到在招岗位(total_positions=0)
- 跑
--analyze,看inputs/buttons里职位筛选控件的真实 placeholder 或按钮文案,
更新 OPEN_POS_FILTER_JS 的触发词。
- 确认职位管理页(/web/boss/job)有在招岗位;脚本会优先读搜索页职位筛选下拉,
读不到自动降级职位管理页。
搜不出简历 / 简历列表读不到
- 跑
--analyze看analyze_search_result.json里候选人卡片的真实结构;
更新 CARD_COUNT_JS / READ_CANDIDATES_JS 的「打招呼」按钮识别逻辑。
- 确认岗位筛选选中后搜索按钮被真实点击(日志
clicked:搜索)或列表自动刷新。
找不到「打招呼」按钮(no_chat_btn)
- 候选人卡片可能没有「打招呼」按钮(需点开详情才有):脚本已自动
「先点卡片再找按钮」;仍失败则跑 --analyze 看 buttons 里真实文案,更新 CHAT_BTN_TEXTS。
- 已打招呼的候选人按钮变「已打招呼」→ 脚本自动跳过(不计失败)。
打招呼未确认(sent_unconfirmed / 聊天窗补发失败)
- BOSS 点击打招呼通常自动发送预设话术;若聊天窗未自动发送,脚本补发
--greeting-text 并点发送(回车兜底);确认逻辑为「输入框清空」。
- 若反复未确认,可能账号当日额度已用完,看页面提示。
触发风控(滑块 / 列表不渲染 / 频繁掉线)
关闭调试 Edge,--reset 清 Cookie 与 profile,隔几分钟重走一次人工登录;正式运行务必保持拟人化节奏(勿用 --fast),单日用量别顶满。