diff --git a/docs/筛选规则与流程总览.md b/docs/筛选规则与流程总览.md new file mode 100644 index 0000000..4389193 --- /dev/null +++ b/docs/筛选规则与流程总览.md @@ -0,0 +1,151 @@ +# 智联简历筛选机器人 — 规则与流程总览 + +> 更新:2026-08-27 · 代码版本 zhaopin-scrape.js v10.6 / daily-runner.js v1.3 +> 岗位:二手车出口外贸业务员 · 双账号:hr1(Chrome·合塑)/ hr2(Edge·派卡) + +--- + +## 一、总体架构 + +``` +┌────────────────────────────────────────────────────────────┐ +│ Hermes 容器(服务器) │ +│ │ +│ cron 定时任务 ×3 │ +│ ├─ 09:30 启动 hr1 runner ─┐ │ +│ ├─ 09:30 启动 hr2 runner ─┤→ daily-runner.js(守护循环) │ +│ └─ 18:05 强制收队+异常检测 → enforce-cutoff.js │ +│ │ +│ 数据库:/opt/data/recruitment-data/recruitment-live.db │ +│ 日报:daily-report.js(固定模板,仅18点发) │ +└──────────────┬─────────────────────────────────────────────┘ + │ SSH 隧道(9223→Chrome / 9225→Edge) + ▼ + 任务机 100.64.0.7(Tailscale 组网) + ├─ Chrome(hr1·合塑账号)→ 智联推荐页 + └─ Edge (hr2·派卡账号)→ 智联推荐页 +``` + +--- + +## 二、每日时间线 + +``` +09:30 ─── cron 触发,双账号 runner 启动 + │ 每批 50-100 人(随机)|批间休息 10-20 分钟(随机) + │ 循环跑批,直到 ↓ 三种结束条件之一 + │ + ├── 聊天次数耗尽(智联每日上限)→ 收工 + ├── 北京时间 18:00 → 收工 + └── 异常(见第四节)→ 停止/等待 + │ +18:05 ─── 强制收队任务:强杀残留进程 → 状态核对 → 日报发群(每日仅此1条统计) +``` + +--- + +## 三、单个候选人处理流程(核心筛选链) + +``` +列表卡片(不开弹窗的快速预筛) + │ + ├─ 同事已聊过 ──────────────────→ 跳过 + ├─ 已打招呼(显示"继续沟通")─────→ 跳过 + ├─ 年龄 > 35 ───────────────────→ 跳过(一票否决) + ├─ 卡片文本命中黑名单企业 ────────→ 跳过(当前黑名单:合塑、派卡) + │ + ▼ 打开简历弹窗 + │ + ├─ ⛔ 阻碍即停:弹窗无有效简历数据(日浏览1000份限额/提示页) + │ → 不入库 → 二次核查 → 私聊告警 → 当日终态停止 + │ + ├─ 弹窗"人才处理记录" > 2条 ─────→ 通过筛选也不打招呼(照常评分入库) + │ + ▼ 硬性预筛门槛(v10,任一不过即"不相关",不评分不打招呼) + │ + │ A 外贸经验关键词(仅看工作经历):外贸/外销/国际贸易/国贸/海外销售/ + │ 出口/跨境电商/跨境/二手车出口/汽车出口/整车出口/海外市场 —— 必须命中 + │ D 毕业年份 2020-2026(教育经历中最晚年份;解析不到不硬拒) + │ 年龄 ≤ 35 + │ (B 专业 / C 证书 命中只作加分记录,不单独放行) + │ + ▼ 七维评分(满分35) + │ + │ 行业匹配 / 外贸核心能力 / 语言能力 / 客户开发获客 / + │ 专业背景 / 稳定性 / 活跃度 各 1-5 分 + │ ⚠ highTrade/获客 只从工作经历匹配(求职意向写的不算) + │ ⚠ 外贸经验强时语言保底 2 分(语言不一票否决) + │ + ▼ 分级(动态阈值) + │ + │ 行业≥4 时:≥24 推荐 ✅ | 其他:≥26 推荐 ✅ + │ ≥18 待定 ⏳ | <18 不推荐 ❌ + │ + ▼ 打招呼(弹窗内点击,天然绑定正确的人) + │ + ├─ 推荐/待定 且 门槛通过 且 处理记录≤2 且 未打过 → ✋ 打招呼 + └─ 其余 → 跳过(照常入库) + │ + ▼ 入库(弹窗完整内容:raw_text 全文 + 结构化拆分字段 + 评分明细) +``` + +--- + +## 四、异常场景处理矩阵 + +| 场景 | 检测方式 | 动作 | 通知 | +|------|---------|------|------| +| **登录失效** | URL 跳登录页 / 页面报登录失效 | 刷新登录页抓二维码 → 进入扫码监听 | 🚨 群(文字+二维码+"今日不需要可忽略") | +| **被顶号**(他人登录) | km-modal弹窗+"账号已在其他设备或浏览器登录"文案+重登按钮 三重判定 | 点掉弹窗 → 抓二维码 → 进入扫码监听 | 🚨 群(同上样式) | +| **扫码监听** | 每30秒读页面:登录成功 / 二维码过期 / 17:30到时 | 成功→自动复工+群内回应扫码人;过期或到时→当日收工 | ✅ 群("扫码登录成功,任务已自动恢复") | +| **平台阻碍**(日浏览1000份限额等) | 弹窗有效性核查:缺姓名或缺全部结构信号=无效页 | 碰到即终态停止,当日不恢复(start 命令也拒绝) | 🚨 私聊(附弹窗原文) | +| **风控/验证码** | 验证码DOM / "操作过于频繁"等文案 | 立即停止(不自动恢复,需人工评估) | 🚨 私聊 | +| **隧道断连** | CDP 端口探测 | 重建隧道(最多等10分钟) | 失败才 🚨 私聊 | +| **触底** | .recommend-indicator "已经到底啦" | 立即刷新页面取新数据 | 无(日志) | +| **累计200人** | 账号当日累计计数 | 刷新页面(清理DOM/内存) | 无(日志) | + +--- + +## 五、消息策略(渠道纪律) + +| 消息 | 渠道 | 频次 | +|------|------|------| +| 登录失效/被顶号告警(带二维码) | 群(数字HR) | 事件触发 | +| 扫码成功回应 | 群 | 事件触发 | +| 📊 每日数据日报 | 群 | 每日 1 条(仅 18:05,异常中止不发) | +| 平台阻碍 / 风控 / 隧道失败 | 私聊(管理员) | 事件触发 | +| 批次过程消息(人数/聊天剩/累计等) | ❌ 不发 | 只写日志 | + +- 所有消息文案写死在代码模板里,禁止手写改写、不用礼貌用语 +- 日报由 daily-report.js 确定性生成(双账号分开统计合并在一条消息) + +--- + +## 六、运行控制命令 + +```bash +bash stop-tasks.sh status # 查状态(含卡死检测) +bash stop-tasks.sh stop # 全停(hr1+hr2) +bash stop-tasks.sh stop hr2 # 只停 hr2 +bash stop-tasks.sh start hr1 # 启动(platform_blocked 当日拒绝) +bash stop-tasks.sh restart hr2 # 重启(先停干净再启) +``` + +停止机制三层:STOP.flag 旗标优雅退出(不打断进行中的打招呼)→ SIGTERM/3秒/SIGKILL → ps 复验无残留。 + +--- + +## 七、关键文件 + +| 文件 | 用途 | +|------|------| +| scripts/zhaopin-scrape.js | 单批抓取+评分+打招呼(v10.6) | +| scripts/daily-runner.js | 每日守护循环+异常处理+扫码监听(v1.3) | +| scripts/enforce-cutoff.js | 18:05 强制收队+异常检测+日报兜底 | +| scripts/daily-report.js | 日报固定模板生成 | +| scripts/login-qrcode.js | 登录二维码抓取 | +| scripts/stop-tasks.sh | 启停控制 | +| scripts/scoring.js | 门槛+评分纯逻辑(改关键词改这里) | +| templates/report-format.md | 消息模板纪律文档 | + +**改筛选关键词/毕业年份窗口** → 改 `scoring.js` 顶部 CONFIG,跑 `node scoring.js` 自测,然后 git 提交推送。