下载地址
https://www.zhengdianxue.com/wp-content/uploads/skills/org-s25cw6k2--aoling-recruitment-screener.zip将提示词发送给你的 AI 安装该 skills
请根据 https://skillhub.cn/install/skillhub.md,安装 @org-s25cw6k2/aoling-recruitment-screener。Boss直聘招聘筛选与建联自动化(通用版,不限定公司)。自动拉取平台上「主动打招呼」和「平台推荐」两类候选人简历,按用户自定义标准打分分级(A/B/C),通过IM双向确认后批量建联,对不匹配的未回复打招呼者一键婉拒,建联后自动管理人才库(企微智能表格)和面试流程(邀约→心跳检测→日程创建)。当用户说「帮我筛简历」「招聘候选人筛查」「Boss直聘建联」「帮我招人」「筛一下候选人」「婉拒不合适的」「清理打招呼」「每天帮我处理招聘消息」时触发。
依赖 opencli(Boss直聘浏览器桥接),可选飞书多维表格/日历和钉钉/企微IM。
阅读全文 (展开查看完整说明)
概述
Boss 招聘筛选与建联(通用版)
通过 opencli 桥接 Chrome 上的 Boss 直聘,自动完成「拉简历 → 按标准打分 → 生成报告 → 确认后建联」的闭环。本 Skill 不绑定任何特定公司/岗位,所有岗位、标准、话术都由用户每次运行时提供。
⚠️ 铁律
- opencli boss 命令必须严格串行执行,绝不能并行(同时跑多个会 cookie 冲突导致失败)。一次只发一条命令,等返回再发下一条。
- 候选人唯一标识统一用
uid(来自 chatlist / recommend 输出)。 - 建联前必须拿到用户确认(见 Step 4)。未经确认不得发送任何
send/greet。 - 必须先确认浏览器处于 招聘端(BOSS 端),否则简历/聊天接口会被拦截。
- 建联 ≠ 自动回复:Skill 不为用户代回复 Boss 消息。检测到未回复时只发 IM 提醒,不自动
send。
Step 0 — 环境准备与安装引导(必须最先执行,不可跳过)
本 Skill 依赖三个组件。Agent 应按以下顺序逐一检查并处理:能自动装的绝不问用户,不能自动装的给出明确引导 URL。
0.1 Node.js 环境
opencli 要求 Node.js >= 20。
# 检查版本
node --version- 若 Node.js 不存在或版本 < 20 → Agent 自动安装(使用
install_binary安装 Node.js 22.x managed 版本)。 - 安装完成后把 Node 路径写入
PATH或使用绝对路径调用。
0.2 opencli CLI
opencli 是 @jackwener/opencli npm 包,用于调用 Chrome 上的 Boss 直聘。
检查:
opencli --version 2>&1 || echo "NOT_FOUND"自动安装(若 NOT_FOUND):
# 使用 managed Node.js 安装
$(node -e "console.log(process.execPath)") install @jackwener/opencli安装后会生成 opencli.cmd shim。验证:
opencli --version注意:opencli 从 v1.8.x 开始功能稳定,最低可用版本 v1.8.0。若安装后版本较低,
npm update @jackwener/opencli。
0.3 Chrome 浏览器扩展(OpenCLI Bridge)
这是最关键的组件——没有它,所有 opencli 命令都会返回 Extension not connected。
检查:
opencli doctor 2>&1或直接试:
opencli boss whoami -f json --window foreground 2>/dev/null若返回 user_type 即成功;若返回 Extension not connected 则需安装扩展。
手动安装引导(Agent 不能自动装浏览器扩展,给出明确引导):
⚠️ 需要你在 Chrome 浏览器中安装 OpenCLI Bridge 扩展:
方式一(推荐):Chrome 网上应用店安装
→ https://chromewebstore.google.com/detail/opencli/ildkmabpimmkaediidaifkhjpohdnifk
方式二:手动安装 CRX
→ 下载:https://github.com/jackwener/opencli/releases(选最新
opencli-extension-v{version}.zip)→ 解压 → 打开
chrome://extensions→ 启用「开发者模式」→ 「加载已解压的扩展程序」→ 选解压文件夹装好后扩展图标常驻 Chrome 右上角。请确认图标显示「已连接」后告诉我,继续下一步。
常见坑:
- 若 Chrome 打开的是隐身窗口 / Guest 模式,扩展不会注入,请用普通窗口。
- 若
attach failed: Cannot access a chrome-extension:// URL,可能其他扩展干扰,临时禁用可疑扩展后再试。- Daemon 自动启动,无需手动管理;可用
curl localhost:19825/status验证 daemon 存活。
0.4 Boss 直聘会话验证
扩展连接后,验证 Boss 直聘已登录且处于招聘端:
# 验证聊天列表可访问(双端通用)
opencli boss chatlist -f json --window foreground --site-session persistent --keep-tab false 2>/dev/null
# 验证招聘端专属功能
opencli boss joblist -f json --window foreground --site-session persistent --keep-tab false 2>/dev/null- 若
chatlist/joblist返回空或 AUTH_ERROR:请先在 Chrome 中手动打开 Boss 直聘并登录招聘端(zhipin.com 的「我是老板」视图),登录后重试。 - 若
chatlist成功但joblist报 AUTH / 找不到页面:在 Chrome 把 Boss 直聘页面切到「我是老板 / 招聘端」视图,再重试。 whoami返回的user_type: geek只是账号原始类型,不代表当前页面状态——以joblist是否成功为准。
0.5 完整性确认
上述 4 项全部通过后,输出确认摘要:
✅ Node.js vXX | ✅ opencli vX.X.X | ✅ Chrome 扩展已连接 | ✅ Boss 招聘端已登录
环境就绪,开始进入招聘筛选流程。
不通过不继续:任一组件未就绪就停止在此步骤,逐项引导用户修复,直到全部通过再进入 Step 1。
0.6 IM 平台选择(一次性设置)
环境就绪后,询问用户平时使用哪个 IM 平台。后续所有通知、确认、提醒都默认发到该平台:
你平时主用哪个 IM 平台?后续所有通知(确认名单、未回复提醒等)都发到这里:
① 企业微信(默认,已连接)
② 飞书
③ 钉钉
选定后 Agent 自动:
- 记录选择 → 后续 Steps 全部沿用,不再重复询问
- 检查并安装所选平台的依赖(Skill / CLI):
- 企业微信:
wecomcli-msg+wecomcli-smartsheet+wecomcli-schedule+wecomcli-meeting(已内置) - 飞书:安装
feishu-proSkill(SkillHub slug=feishu-pro)+ 引导完成飞书连接器配置 - 钉钉:安装
dingtalk-unifiedSkill(本地 marketplace)+npm install -g dingtalk-workspace-cli
- 企业微信:
平台选择写入本地配置,下次运行 Skill 时直接复用。
交互协议(严格按此 4 步顺序,每步都与用户交互)
Step 1 — 目标岗位确认
目的:确定本次筛查针对哪个在招岗位,并拿到它的 encrypt_job_id(建联时用)。
- 拉取在招岗位:
opencli boss joblist -f json --window foreground --site-session persistent --keep-tab false 2>/dev/null- 把岗位列表(岗位名 / 城市 / 薪资 /
encrypt_job_id)呈现给用户,默认以用户账号当前正在招聘的岗位为准,询问是否就用该岗位,或切换到其他岗位。 - 记录用户选定的
encrypt_job_id,后续greet必填。
提示话术示例:
我已拉取到你在招的岗位:①后端开发工程师(城市·薪资)②…。默认用第①个作为本次筛查目标,OK 吗?或告诉我改用哪个。
Step 2 — 筛查数量 + 婉拒时间边界设置
目的:设定筛查数量上限、主动打招呼的处理策略,以及婉拒的时间回溯范围。
用 AskUserQuestion 分别询问三个参数(可给默认值):
- 平台推荐候选人数量(
--limit):默认20。对应opencli boss recommend --limit N。 - 主动打招呼候选人筛选数量(
--chatlist-target=N):只筛选 从未互动的候选人(chatmsg 中没有任何from='我'的消息)。不设默认值,每次 Step 2 必须向用户确认。Agent 会自动拉取足够多的 chatlist(必要时翻页),逐人检查 chatmsg,按打招呼时间排序(最近的在前面),取前 N 个。可选项:50、100、200、0(不筛选 chatlist,仅筛 recommend)。 - 婉拒不匹配候选人的时间边界(
reject_time_window_days):对于 chatlist 中主动打招呼但用户未回复且评分 C 级的候选人,回溯多少天内打招呼的才纳入婉拒范围。默认7天。可选项:3(近三天)、7(近一周)、30(近一个月)、0(本次不婉拒,仅报告)。
⚠️ 婉拒只会对「用户未回复 + 评分 C 级」的 chatlist 候选人执行。已回复过的、评分 A/B 的、recommend 来源的均不触发婉拒。
提示话术示例:
接下来设置筛查策略:
- 平台推荐:每天拉多少推荐简历?(默认 20)
- 从未互动的打招呼者:筛选多少个从未互动的人?按最近打招呼时间排序。(可选 50/100/200/不筛选)
- 自动婉拒:对不匹配的打招呼者,回溯几天内的一键婉拒?(默认 7 天,可选 3/7/30/不婉拒)
⚠️ 「从未互动」通过
opencli boss chatmsg <uid>判断:对话历史中没有任何from='我'的消息 = 从未互动。按最近打招呼时间降序排列,取目标数量。
Step 3 — 筛选标准获取
目的:拿到硬性筛选条件,转为打分配置。
- 向用户询问筛选标准,覆盖维度(按需多选):
- 工作经验年限(最低 X 年)
- 学历要求(本科 / 硕士 / 985·211 / 特定院校 / 专业方向)
- 核心技能 / 能力(必须掌握的技术栈、工具、方法论——用户列出关键词)
- 薪资 / 城市 / 远程意向(期望薪资区间、所在城市、是否接受异地)
- 若用户暂无标准:立即暂停,给出标准模板建议其先制定,不要凭空打分。
你还没有给出筛选标准。建议先明确以下硬性条件,再运行本 Skill:
- 经验年限下限:___
- 学历门槛:___
- 必会技能:___
- 城市/薪资意向:___
准备好后告诉我,我据此打分。
- 收到标准后,将其翻译为打分配置(维度、权重、关键词、淘汰项),参见 [references/02-scoring-rubric.md](references/02-scoring-rubric.md)。可把配置写进
score_resumes.py顶部的CONFIG段。
Step 4 — 执行筛查 + IM 确认 + 建联/婉拒(关键闸门)
目的:拉简历、打分、出报告 → 推送名单到用户 IM → 用户回复确认 → 建联 A 级 + 婉拒 C 级未回复者。
建联和婉拒在同一个确认流程中完成:用户一次确认,Agent 串行执行两类操作。
4.1 筛查 & 打分
- 批量拉取两类简历(串行,务必用 [assets/fetch_resumes.py](assets/fetch_resumes.py)):
- chatlist 预过滤(若
--chatlist-target=N):脚本先对 chatlist 候选人逐人调chatmsg,判断是否从未互动(无from='我'消息),按最近打招呼时间降序排列,取前 N 个。若初始 chatlist 不够,自动翻页拉取更多。 - 来源一(主动打招呼且从未互动):过滤后的 chatlist → 逐人
resume <uid> - 来源二(平台推荐):
recommend --limit N→ 逐人resume <uid> - ⚠️ 源头过滤(杜绝过期浪费):
recommend输出自带last_time,平台回收悬崖干净(~7-8 天)。脚本在调resume之前先解析last_time年龄,>7 天的候选直接标stale_skipped并跳过resume——0 次无效调用、0 条死人进报告。根因是 Boss 推荐流「漏的」(通道已回收的过期条目仍挂在列表),我们改不了 Boss,但能在自己这侧用last_time从源头挡掉。 - ⚠️ 推荐池优先 + 即时抓取:
recommend候选有 ~7 天平台推荐窗口(实测过期悬崖在 7–8 天),比已建联、永久有效的chatlist易挥发。应在拿到 recommend 池后立即抓取,不要在中间穿插耗时问答/读文件;脚本默认RECOMMEND_FIRST=True,先抓 recommend 再抓 chatlist。 - 失败分类 + 自动回填:脚本把
resume失败分成expired(平台已回收通道,如「无法在聊天列表中找到该用户」,不可挽回、不重试)与transient(超时/空输出/网络抖动,可退避重试)。当推荐池expired比例 ≥FAIL_RATE_THRESHOLD(默认 30%)时,自动用更大的--limit重拉 recommend 池做回填、补进新候选(最多BACKFILL_MAX_ROUNDS轮)。 - 批量拉取详见 [references/01-screening-workflow.md](references/01-screening-workflow.md)。
- chatlist 预过滤(若
- 按标准打分,分级:
- A 级(≥阈值,如 75):优先建联
- B 级(中档,如 55–74):备选,暂不触达
- C 级(<阈值 或硬性条件不达标):不触达
- 生成完整报告(HTML,落
output/目录)。
4.2 IM 推送确认(建联 + 婉拒,同一确认流程)
⛔ 建联和婉拒都必须经过用户确认。优先通过 IM 推送名单,让用户随时查看并回复确认。
确认流程分四步:
① 推送两份名单:将以下内容合并为一条消息发到用户 IM:
- A 级名单(优先建联,每人含姓名/评分/来源/履历亮点)
- 婉拒名单(仅含 chatlist 来源 + 用户未回复 + C 级 + 在时间边界内的候选人,每人含姓名/评分/不匹配原因)
- 如果婉拒名单为空,注明「本次无符合婉拒条件的候选人」
② 轮询:推送后立即开始每 30s 拉取用户回复,检测指令:
| 用户回复 | 动作 |
|---|---|
确认 / OK / 好的 | 建联 A 级 + 婉拒名单全部发送 |
只建联,不婉拒 | 仅建联 A 级,跳过婉拒 |
去掉 N / 去掉 姓名 | 从对应名单移除 → 重新推送 |
只看Top N | 缩减 A 级到前 N → 重新推送 |
③ 执行建联:对 A 级串行发送(来源一 send / 来源二 greet)。
④ 执行婉拒:对婉拒名单串行 send 发送婉拒话术。话术模板见 [references/09-rejection-templates.md](references/09-rejection-templates.md)。
⚠️ 推送后 Agent 必须主动轮询企微回复,不要停留等用户回到对话窗口说"已回复"。
⚠️ 婉拒仅对 chatlist 中「最后消息发送者=对方」的 C 级候选人执行。已回复过的、A/B 级、recommend 来源的一律不触发婉拒。
详见 [references/08-im-channels.md](references/08-im-channels.md)(推送/轮询命令)和 [references/09-rejection-templates.md](references/09-rejection-templates.md)(婉拒话术)。
4.3 执行建联 / 婉拒
建联(A 级):
- 来源一(chatlist / both)已打招呼 →
opencli boss send <uid> "<话术>"(回复式) - 来源二(recommend)未建聊 →
opencli boss greet <uid> --security-id <sid> --job-id <jid> --text "<话术>"
婉拒(C 级 chatlist 未回复):
opencli boss send <uid> "<婉拒话术>"
⛔ 仅在用户明确确认后执行。建联和婉拒均需串行,不可并行。
Step 5 — 人才库管理(可选,支持企微/飞书/钉钉)
触发:建联完成后 →「把 XXX 存入人才库」「更新 XXX 的状态」「记一条决策记录」
前置:选定平台并帮助用户创建表格(详见 [references/05-talent-pool.md](references/05-talent-pool.md))。平台选择规则:
| 优先级 | 平台 | Skill | 说明 |
|---|---|---|---|
| ① 默认 | 企业微信 | wecomcli-smartsheet | 智能表格,企微已连接 |
| ② | 飞书 | lark-base | 多维表格 |
| ③ | 钉钉 | dingtalk-unified → dws | AI 表格 |
首次使用时,Agent 帮助创建「人才库」和「决策记录」两张表(含预设字段)。
核心操作(跨平台):
| 能力 | 企业微信 | 飞书 | 钉钉 |
|---|---|---|---|
| 查全表 | smartsheet_get_records | lark-cli base +record-list | dws table record-list |
| 存候选人 | smartsheet_add_records | lark-cli base +record-create | dws table record-create |
| 更新状态 | smartsheet_update_records | lark-cli base +record-upsert | dws table record-update |
决策标签(通用):加入库 / 建联 / 约面试 / 跟进 / 发Offer / 归档
Step 6 — 面试管理(可选,支持企微/飞书/钉钉)
触发:候选人有面试意向 →「帮我约 XXX 面试」「帮 XXX 安排面试」
完整流程见 [references/06-interview-flow.md](references/06-interview-flow.md),核心链:
发邀约 → 写决策 → 启动30min心跳
└→ 候选人回复 → 查日程 → 确认时间 → 回复候选人
└→ 创建会议/日程 → 发链接 → 终止心跳| 步骤 | 企业微信 | 飞书 | 钉钉 |
|---|---|---|---|
| 查日程 | schedule check_availability | lark-cli calendar +agenda | dws calendar agenda |
| 创建会议 | meeting create_meeting | lark-cli calendar +create | dws calendar create |
| 心跳检测 | automation_update(平台无关) | 同左 | 同左 |
心跳任务:使用 automation_update mode=create rrule="FREQ=MINUTELY;INTERVAL=30",每 30 分钟用 opencli boss chatmsg <uid> 检查候选人回复。面试约好后 delete。
Step 7 — 未回复消息监控(推荐开启)
触发:「帮我监控 Boss 未回复消息」「有候选人发消息提醒我」
核心原则:只提醒,不代回复。Skill 检测到候选人的未回复消息后,将提醒发送到用户在 Step 0.6 选择的 IM 平台。
完整流程见 [references/07-unreplied-monitor.md](references/07-unreplied-monitor.md):
定时任务(每15min) → 拉 chatlist → 逐人 chatmsg → 判断最后一条消息发送者
├→ 发送者 = 候选人(非本人)→ 未回复 → 发 IM 提醒
└→ 发送者 = 用户自己 → 已回复 → 跳过创建监控任务:
automation_update mode=create scheduleType=recurring
rrule="FREQ=MINUTELY;INTERVAL=15"
prompt="
用 opencli boss chatlist --window foreground --site-session persistent 拉取聊天列表。
对每个对话,用 opencli boss chatmsg <uid> 查最后一条消息。
判断最后消息的发送者:
- 如果是候选人发送(不是你自己)→ 说明用户还没回复 → 通过 IM 发提醒:「<姓名> 在 Boss直聘 给你发了新消息,已超过 N 分钟未回复。岗位:<岗位名>」
- 如果是你发送的 → 已回复 → 跳过
提醒只发一次(用已提醒标记避免重复骚扰)。
每次检查后用 opencli boss chatlist 结果更新本地状态。
"
name="Boss未回复监控"停止监控:
automation_update mode=delete id=<JOB_ID>💡 建议在 Step 4 批量建联完成后自动创建监控任务,覆盖所有已建联的沟通中候选人。
命令速查
Boss直聘(opencli)
| 用途 | 命令 |
|---|---|
| 在招岗位 | opencli boss joblist -f json |
| 聊天列表(主动打招呼) | opencli boss chatlist -f json |
| 单条聊天记录 | opencli boss chatmsg <uid> -f json |
| 获取简历 | opencli boss resume <uid> -f json |
| 平台推荐 | opencli boss recommend --limit N -f json |
| 回复已打招呼者 | opencli boss send <uid> "<文本>"(含建联话术和婉拒话术) |
| 向推荐者发起招呼 | opencli boss greet <uid> --security-id <sid> --job-id <jid> --text "<文本>" |
婉拒流程
详见 [references/09-rejection-templates.md](references/09-rejection-templates.md)。
| 步骤 | 操作 |
|---|---|
| 1. 判断未回复 | opencli boss chatmsg <uid> -f json → 最后消息发送者 ≠ 用户 → 未回复 |
| 2. 检查时间边界 | chatlist 的 last_time ≤ reject_time_window_days 天前 |
| 3. 确认 C 级 | 已通过 score_resumes.py 打分 |
| 4. 发送婉拒 | opencli boss send <uid> "<婉拒话术>" |
通用后缀:--window foreground --site-session persistent --keep-tab false
IM 确认(三通道)
详见 [references/08-im-channels.md](references/08-im-channels.md)。
人才库 & 面试(三平台通用)
详见 [references/05-talent-pool.md](references/05-talent-pool.md) 和 [references/06-interview-flow.md](references/06-interview-flow.md)。
已知坑点(务必先读)
详见 [references/04-troubleshooting.md](references/04-troubleshooting.md),重点:
- 简历过期(≈7 天窗口,实测干净的时间悬崖):
recommend候选的聊天通道约 7 天后被平台回收,resume/greet返回「无法在聊天列表中找到该用户」,任何方式都无法复活(不是客户端刷新/操作触发,纯时间驱动;实测过期组 last_time 全部 ≥8 天前,成功组全部 ≤3 天前,分界线在 7–8 天)。应对三件套:① 每日跑(在窗口内就触达);② 推荐池优先 + 即时抓取(拿到池子立刻抓,别在中间穿插耗时步骤);③ 失败时扩大基数回填(脚本已内置:expired 比例超阈值自动用更大--limit重拉 recommend 池);④ 源头过滤(脚本在调resume前用last_time预筛掉 >7 天候选,标stale_skipped并跳过调用,从根上杜绝把过期死人拉进流水线)。新鲜(1–3 天内)候选人可直接resume。 - 必须招聘端:非招聘端时简历/聊天接口被拦截。
- 串行:并行 opencli 命令必失败。
- 飞书前置:人才库(Step 5)和面试(Step 6)依赖飞书连接器;首次使用需帮助用户创建多维表格。
- 心跳任务:面试约好后记得
delete心跳任务,避免资源浪费。