Files
zhaopin-admin/public/rules.md
T

7.4 KiB
Raw Blame History

智联简历筛选机器人 — 规则与流程总览

更新: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 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 提交推送。