下载地址
https://www.zhengdianxue.com/wp-content/uploads/skills/koseninfo--zhilian-talent-searcher.zip将提示词发送给你的 AI 安装该 skills
请根据 https://skillhub.cn/install/skillhub.md,安装 @koseninfo/zhilian-talent-searcher。智联人才搜索器(智联招聘企业端·主动搜索人才+IM索要简历)。通过 RPA(CDP
阅读全文 (展开查看完整说明)
概述
智联人才搜索器(智联招聘企业端 · 主动搜索人才 + IM 索要简历)
核心架构
- RPA(由脚本完成):
scripts/zhilian_talent_searcher_cdp.py启动 Edge(调试端口 9222),
打开智联企业端登录页(passport.zhaopin.com/org/login,bkurl 回跳 rd.zhaopin.com)→ 用户手工登录 → Cookie 全量落盘(Network.getAllCookies,下次免登录)→ 进入左侧「搜索人才」栏目 → 读取在招岗位(岗位筛选下拉 / 职位管理页兜底)→ 预算均分 → 逐岗位搜索 → 逐条打开候选人简历 → IM 会话发送索要简历话术→ 直到该岗位预算用完 / 当天总量耗尽。
- 预算分配:账号「可聊天数量」默认均分给全部在招岗位(总量 ÷ 岗位数,
除不尽时余数给第一个岗位);也可 --per-job N 固定每岗位次数;当天总量上限--daily-quota(或自动尝试读取页面「今日剩余可沟通 N」文案)。
- 发送内容:进入候选人 IM 会话后逐字拟人输入索要简历话术(
--greeting-text
可覆盖),点「发送」(找不到发送按钮时回车兜底),以「输入框清空 / 会话区出现该文本」确认发送成功。
- 拟人化(默认开启):真实鼠标(CDP
Input.dispatchMouseEvent,带抖动)、
点击前随机停顿、逐字打字(70~160ms 间隔)、候选人之间 2.5~6s 随机停顿(约 18%概率出现 8~20s 长停顿),模拟真人翻看节奏、降低风控。--fast 可关闭。
- 安全门禁:仅当登录成功(URL 在企业端域 +
/app/路由 / 认证 Cookie / DOM
特征)且进入搜索人才页后才操作;未登录绝不动作。
- 结果落盘:结束写入
~/.zhilian_talent_searcher/completion.json,由对话层汇报。
只有该文件里 login_ok == true 且 day_sent > 0(或 dry_run)才可对用户说「已发送」。
⚠️ 智联版关键说明(务必先读)
- 登录链路复用下载器/发布器已验证机制:登录域
passport.zhaopin.com/org/login,
企业端 rd.zhaopin.com / rd6.zhaopin.com。登录用手机号 + 短信验证码(智联登录无滑块,已验证),验证码由用户手工输入,脚本纯等待。Cookie 必须用Network.getAllCookies 全量保存(getCookies 按域读实测 0 条)。
- 不硬编码 class。智联企业端是 Vue/React 类 SPA,DOM class 随版本变化。脚本用
「标签文本 / placeholder / 按钮文案」启发式定位(见 references/search_selectors.md)。
- 「搜索人才」页已实测校准(2026-08-25):真实路由
https://rd6.zhaopin.com/app/search,
顶部菜单「搜索」进入(SEARCH_MENU_TEXTS 含「搜索」)。首次使用仍建议跑--analyze 确认;页面改版后再校准。
- 岗位来源:职位管理页(2026-08-25 实测校准):搜索人才页无岗位列表(「不限职位」
是职位关键词输入框),真正的在招岗位在 rd6.zhaopin.com/app/job,卡片文本「岗位名 / 热门职位 / 手动下线 / 9千-1.2万 / 3-5年 / 广州-越秀区 / 新招呼 / 上线…」。脚本读默认「全部职位」视图,剔除含「手动下线」的岗位(非在招),同名不同地点(如 Java 广州/深圳)分别保留。账号无在线岗位时脚本明确报告并停止(不会拿页面杂项当岗位硬跑)。
- 索要简历走 IM 会话(与下载器聊天链路一致):点候选人卡片 → 找「立即沟通/
打招呼/聊一聊」按钮 → 输入框逐字输入话术 → 点发送(Enter 兜底)→ 确认。智联 IM对 Vue 绑定需真实鼠标点击(Input.dispatchMouseEvent),普通 el.click() 可能不触发。
- 每日可聊量(2026-08-26 实测校准):搜索人才页显示「今日搜索聊剩:聊天N次」。
搜索前可能显示 0 次占位,搜索出结果后二次确认(脚本自动处理:读到的 N>0作为当天总量上限;二次确认仍为 0 → 判定今日无搜索聊天额度,停止发送并如实报告)。推荐让用户直接提供 --daily-quota N(账号真实可聊数量)。均分模式无需用户算除法,脚本自动处理(总量÷岗位数,余数给第一个岗位)。
- 候选人识别(2026-08-26 实测校准):搜索结果候选人卡片为
.resume-item__content / .search-resume-item-wrap(文本「骆先生 2小时前有投递29岁 10年 大专 离职-正在找工作 期望: 广州 网络信息安全工程师 1.2万-1.5万 …打电话 打招呼」)。不依赖「打招呼」按钮(实测渲染为不可见 w=0/h=0,hover 才显示);姓名 = 卡片文本首词(如「骆先生」,勿把先生/女士当功能词过滤);按姓名去重(多层级 resume-item 容器会重复匹配同一人)。
- 搜索按钮(2026-08-26 实测校准):主搜索按钮文案为「搜 索」(带空格),
SEARCH_BTN_TEXTS 必须把「搜 索」放最前(「搜索」会先命中页面其它元素)。
- 弹窗清理:登录后可能出现「我知道了」通知弹层、首次进入搜索页的引导浮层
(「全部跳过 / 下一步(1/4)」),脚本自动关闭(DISMISS_MODALS_JS)。
- Windows 路径:所有参数路径用带盘符路径(
C:/Users/...),勿用/c/Users/...。
WorkBuddy 对话层执行流程
执行顺序(必须):Phase 1 确认参数 → Phase 2 首跑校准(–analyze + –dry-run)
→ Phase 3 正式运行 → Phase 4 读 completion.json 汇报。
Phase 1:确认参数
向用户确认(或按默认值执行,用户无异议即默认):
- 当天可聊天总量:用户提供(如「今天一共 50 次」→
--daily-quota 50);
用户未提供 → 默认自动尝试读取页面「今日剩余可沟通 N」作为总量上限。
- 每岗位预算:默认均分模式(可聊天总量 ÷ 全部在招岗位数,余数给第一个岗位);
用户说「每个岗位撩 N 人」→ --per-job N 固定值。
- 发送内容:默认索要简历话术;用户给了话术 →
--greeting-text。
Phase 2:首跑校准(页面改版时才需重新校准)
脚本已内置启发式定位,但「搜索人才」页真实路由/菜单文案未实测,首次必跑校准:
cd <skill_dir>/scripts && python zhilian_talent_searcher_cdp.py --analyze --login-timeout 600- 弹出 Edge 企业端登录页,用户手工登录;登录后脚本导出
~/.zhilian_talent_searcher/analyze_search.json(菜单/按钮/输入框真实文案 + URL)。
- 对照
references/search_selectors.md,把SEARCH_MENU_TEXTS/SEARCH_URLS等
常量更新为真实文案。
试运行(只走到候选人列表,不实际发送消息):
python zhilian_talent_searcher_cdp.py --dry-run --per-job 2- 确认:能读到在招岗位、能搜出候选人列表。无误后再正式跑。
Phase 3:正式运行
必须后台运行(run_in_background: true),因为人工登录会阻塞等待:
cd <skill_dir>/scripts && python zhilian_talent_searcher_cdp.py
--non-interactive --login-timeout 600- 首次运行自动
pip install aiohttp,并自动以调试模式启动 Edge(端口 9222)。 - 脚本会打开智联企业端登录页,等用户在 Edge 里手工登录(手机号+验证码/扫码均可),
检测到登录成功后自动继续;Cookie 存 ~/.zhilian_talent_searcher/cookies.json,下次免登录。
- 告知用户:「请在弹出的 Edge 窗口完成企业端登录,登录后脚本会自动开始搜索人才并发消息」。
- 当天总量上限:
--daily-quota 50手动指定,或自动读取页面配额(--no-auto-quota关闭)。
常用变体:
- 当天总量限制:
--daily-quota 50(覆盖自动读取值) - 每岗位固定预算:
--per-job 10 - 只处理部分岗位:
--job-filter "Java,前端"(名称子串匹配,逗号分隔) - 最多处理 N 个岗位:
--max-jobs 3 - 中途中断后续跑(不重复发消息):
--resume-quota(读取当天已发计数,剩余额度继续) - 自定义话术:
--greeting-text "您好,方便发份简历吗?"
Phase 4:读取结果并汇报
脚本退出后读 ~/.zhilian_talent_searcher/completion.json:
{
"completed": true, "login_ok": true, "search_page_opened": true,
"day": "2026-08-24", "per_job_budget": null, "daily_quota": 50,
"day_sent_before": 0, "day_sent": 24,
"total_positions": 3,
"positions": [
{"name": "Java开发工程师", "location": "广州", "budget_target": 17, "budget": 17, "greeted": 17},
{"name": "前端开发工程师", "location": "广州", "budget_target": 17, "budget": 17, "greeted": 7},
{"name": "测试工程师", "location": "广州", "budget_target": 16, "budget": 16, "greeted": 0}
],
"sent_list": [{"job": "Java开发工程师", "name": "张三", "method": "sent"}],
"failed": [], "quota_reached": false, "dry_run": false,
"message": "共处理 3 个岗位,实际发送 24 次。"
}汇报口径:
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 佐证的情况下声称已发送。
可用参数(zhilian_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_search.json(首次必跑) |
--dry-run | 试运行:走到候选人列表不实际发送(首跑推荐) |
--fast | 关闭拟人化停顿(调试用) |
--keep-open | 结束后保留浏览器窗口 |
--no-auto-edge | 不自动管理 Edge(已手动开调试端口时用) |
--login-timeout SEC | 人工登录等待超时(秒),默认 600 |
--port N | Edge 调试端口,默认 9222 |
--reset | 重置所有状态(清 Cookie / 配置 / 报告) |
目录结构
zhilian-talent-searcher/
├── SKILL.md # 本文件
├── scripts/
│ ├── zhilian_talent_searcher_cdp.py # 核心 CDP 自动化(登录+导航+岗位预算+搜索+IM索要简历+报告)
│ ├── config_manager.py # 配置 / Cookie / 当日计数持久化(~/.zhilian_talent_searcher/)
│ ├── raw_cdp_client.py # CDP 传输层(复用智联下载器成熟实现,含 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
登录超时 / 反复要求登录
- 必须登录企业端(
passport.zhaopin.com/org/login),个人求职端登录不算。 - 超时(默认 600s)脚本会退出
login_ok=false,重跑即可。 - Cookie 失效:
--reset后重跑,重新人工登录。
未进入搜索人才页(search_page_opened=false)
- 跑
--analyze,看analyze_search.json→url与menus里菜单真实文案,
把它加进 zhilian_talent_searcher_cdp.py 顶部的 SEARCH_MENU_TEXTS /SEARCH_URLS。
- 也可用
--search-url <真实URL>直接指定搜索人才页地址。
读不到在招岗位(total_positions=0)
- 跑
--analyze,看inputs/buttons里岗位筛选控件的真实 placeholder 或按钮文案,
更新 POSITION_FIELD_KEYWORDS / POSITION_PANEL_SELECTORS。
- 确认职位管理页(rd6.zhaopin.com/app/job)有在招岗位;脚本会优先读搜索页岗位筛选,
读不到自动降级职位管理页。
搜不出简历 / 简历列表读不到
- 看搜索结果页的真实列表项 class,更新
CANDIDATE_ITEM_SELECTORS/
READ_CANDIDATES_JS 的姓名启发式。
- 确认岗位点选后搜索按钮被真实点击(日志
clicked:搜索)。
找不到沟通入口 / IM 输入框(no_im_input)
- 候选人卡片上可能没有「立即沟通」按钮(需点开简历详情才有):脚本已自动
「先点卡片再找按钮」;仍失败则跑 --analyze 看 buttons 里真实文案,更新 COMMUNICATE_BTN_TEXTS。
- IM 输入框可能在 iframe / 新标签页:脚本会重挂;仍失败跑
--analyze校准
IM_INPUT_KEYWORDS。
发送未确认(sent_unconfirmed)
- 智联 IM 通常支持回车发送,脚本已兜底;确认逻辑为「输入框清空 / 会话区出现文本」。
- 若反复未确认,可能账号当日额度已用完,看页面提示。
触发风控(页面不渲染 / 频繁掉线)
关闭调试 Edge,--reset 清 Cookie 与 profile,隔几分钟重走一次人工登录;正式运行务必保持拟人化节奏(勿用 --fast)。