Files
zhaopin-admin/public/rules.md
T

152 lines
7.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 智联简历筛选机器人 — 规则与流程总览
> 更新: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 提交推送。