Files
zhaopin/references/dual-account-setup.md
T

9.7 KiB
Executable File
Raw Blame History

双账号筛选 — Chrome + Edge 方案 (v0.2 已实施)

背景

两个智联招聘账号同时筛选简历,扩大覆盖面和打招呼配额。

方案选型

对比项 双 Chrome 实例 Chrome + Edge
profile 隔离 手动 robocopy 一份 profile 天然隔离,各用各的
登录互踢风险 同浏览器同协议,有风险 不同浏览器,cookie 完全隔离,不会互踢
启动方式 要记哪个是哪个 桌面图标一目了然
CDP 连接 playwright connectOverCDP 完全相同,脚本零改动
脚本改动 零差异 零差异

结论:Chrome + Edge 方案更优,已采用。

架构

┌──────────────────────────────────────────────────────────┐
│                    Linux (Hermes)                         │
│                                                          │
│  batch-runner (ACCOUNT=hr1) ─CDP_PORT=9223──→ SSH 9223→9222 │
│  batch-runner (ACCOUNT=hr2) ─CDP_PORT=9225──→ SSH 9225→9224 │
│                                                          │
│  recruitment.db (candidates.account 区分来源)             │
└──────────────────────────────────────────────────────────┘
         │                              │
    SSH 隧道 9223→9222            SSH 隧道 9225→9224
         │                              │
┌────────┴──────────┐          ┌────────┴──────────┐
│  Windows 桌面      │          │  Windows 桌面      │
│  Chrome (hr1)     │          │  Edge (hr2)       │
│  CDP :9222        │          │  CDP :9224        │
│  user-data-dir:   │          │  user-data-dir:   │
│  C:\temp\         │          │  C:\temp\         │
│  chrome-debug     │          │  edge-debug       │
└───────────────────┘          └───────────────────┘

端口映射

账号 浏览器 Windows CDP Linux 本地 SSH 隧道
hr1 Chrome 9222 9223 sshpass -p 'xxx' ssh -fN -p 7022 -L 9223:127.0.0.1:9222 sshadmin@8.152.213.143
hr2 Edge 9224 9225 sshpass -p 'xxx' ssh -fN -p 7022 -L 9225:127.0.0.1:9224 sshadmin@8.152.213.143

Edge 配置

安装路径(已确认)

C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe

user-data-dir

C:\temp\edge-debug

首次使用无需从默认 profile 复制,Edge 会在该目录创建新 profile。手动登录第二个智联账号后,登录态自动保存在此目录。

桌面快捷方式(已创建 ✅)

桌面路径:C:\Users\sshadmin.WIN-3NKO8I5R9IJ\Desktop\Edge Debug Mode.lnk

创建方法(通过 scp + cscript):

  1. 本地写 VBS 脚本到 /tmp/mksc.vbs
  2. scp /tmp/mksc.vbs sshadmin@8.152.213.143:\"C:/temp/mksc.vbs\"
  3. sshpass -p 'xxx' ssh -p 7022 sshadmin@8.152.213.143 "cscript //nologo C:\\temp\\mksc.vbs"

⚠️ 桌面实际路径是 C:\Users\sshadmin.WIN-3NKO8I5R9IJ\Desktop(非 Administrator),通过 ws.SpecialFolders("Desktop") 自动获取正确路径。

⚠️ CDP 启动方式

SSH 会话内直接启动 Edge → CDP 端口不可达(Windows Session 隔离)。

解决方案:schtasks 计划任务

# 注册(只需一次)
schtasks /Create /IT /RU Administrator /TN LaunchEdgeDebug /TR "\"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe\" --remote-debugging-port=9224 --user-data-dir=C:\temp\edge-debug" /SC ONLOGON /RL HIGHEST

# 每次启动
schtasks /Run /TN LaunchEdgeDebug

/IT = Interactive,在交互式桌面 session 中运行。详见 windows-remote-scraping.md。

数据库改造(已完成 ✅)

ALTER TABLE candidates ADD COLUMN account TEXT DEFAULT 'hr1';
ALTER TABLE greet_log ADD COLUMN account TEXT DEFAULT 'hr1';
CREATE INDEX idx_cand_account ON candidates(account);

现有 2817 条 hr1 数据自动标记 hr1。脚本通过 ACCOUNT 环境变量写入该字段,查询时按 account 过滤。

脚本改造(已完成 ✅)

zhaopin-scrape.js v9.2

改动点:

  1. const ACCOUNT = process.env.ACCOUNT || 'hr1' — 文件顶部
  2. CREATE TABLE 加 account TEXT NOT NULL DEFAULT 'hr1'
  3. upsertCandidate() — INSERT 加 account 列和参数
  4. logGreet() — INSERT 加 account 列和参数
  5. getExistingFingerprints() — WHERE account = ? 过滤
  6. 启动快速跳过指纹加载 — WHERE account = ? 过滤

batch-runner.js v2 (多账号版)

改动点:

  1. ACCOUNT/CDP_PORT/TARGET_CITY 均从环境变量读取(默认 hr1/9223/郑州)
  2. runBatch() 传 ACCOUNT=xxx 给子进程
  3. generateBatchReport() — 按 account 过滤
  4. generateFinalReport() — 所有 13 处 SQL 加 WHERE account = ?
  5. getDbCount() — 按 account 过滤
  6. 汇报标题带 [hr1]/[hr2] 标识

运行方式

# hr1(Chrome)
ACCOUNT=hr1 CDP_PORT=9223 node zhaopin-scrape.js 50
ACCOUNT=hr1 CDP_PORT=9223 nohup node batch-runner.js > /tmp/batch-runner-hr1.log 2>&1 &

# hr2(Edge)
ACCOUNT=hr2 CDP_PORT=9225 node zhaopin-scrape.js 50
ACCOUNT=hr2 CDP_PORT=9225 nohup node batch-runner.js > /tmp/batch-runner-hr2.log 2>&1 &

Cron 定时任务(已创建 ✅)

任务 时间 账号 说明
工作日简历筛选 hr1 周一至周五 09:50 hr1/Chrome/9223 原 cron 更新,加 ACCOUNT=hr1
工作日简历筛选 hr2 周一至周五 09:55 hr2/Edge/9225 新建,错开 5 分钟避免 DB 锁争用

两个任务错开 5 分钟,避免同时启动时的数据库竞争。各自独立汇报到飞书群。

汇报规则

两个账号各自独立汇报,标题带 [hr1]/[hr2] 标识。recruitment-report 查询时按 account 过滤。如需汇总两个账号,去掉 account 过滤条件。

SSH 隧道保活配置(2026-06-01 修复)⚠️ 关键

SSH 隧道频繁断连的根因:客户端和服务端都没有心跳保活。空闲连接被网络/NAT 丢弃后,batch-runner 的 getChatCount() 读到 null,误判为"聊天耗尽"并发群汇报。

客户端保活(Linux ~/.ssh/config):

Host windows-hr
    HostName 8.152.213.143
    Port 7022
    User sshadmin
    ServerAliveInterval 15
    ServerAliveCountMax 3
    TCPKeepAlive yes
    ExitOnForwardFailure yes
    StrictHostKeyChecking no

服务端保活(Windows C:\ProgramData\ssh\sshd_config):

TCPKeepAlive yes
ClientAliveInterval 30
ClientAliveCountMax 3

修改后需重启 sshd:net stop sshd && net start sshd

两端必须同时配置,仅客户端保活在 Windows OpenSSH 上不可靠。

建隧道命令

# 外网连接(通过内网穿透),需 sshpass 密码认证
sshpass -p 'xxx' ssh -fN -p 7022 -L 9223:127.0.0.1:9222 sshadmin@8.152.213.143
sshpass -p 'xxx' ssh -fN -p 7022 -L 9225:127.0.0.1:9224 sshadmin@8.152.213.143

验证隧道

ss -tlnp | grep -E "9223|9225"   # 确认端口监听
curl -s http://127.0.0.1:9223/json/version | head -1  # 确认 CDP 可达
curl -s http://127.0.0.1:9225/json/version | head -1

隧道守护脚本(自动重连)

心跳保活只能降低断连概率,无法 100% 防止。ssh-tunnel-watchdog.sh 作为兜底,每 10 秒检测端口,断了自动重建:

# 启动(与 batch-runner 同时运行)
nohup /home/kt/scripts/ssh-tunnel-watchdog.sh > /tmp/ssh-tunnel-watchdog.log 2>&1 &

脚本路径:/home/kt/scripts/ssh-tunnel-watchdog.sh 监控端口:9223(hr1)、9225(hr2) 日志:/tmp/ssh-tunnel-watchdog.log(仅断连重连时有输出)

batch-runner.js 聊天耗尽验证机制(2026-06-01 新增)

batch-runner.js 现在内置三层防护,防止误判"聊天耗尽":

1. getChatCount() 区分 CDP 状态

  • 返回数字:正常读取到聊天次数
  • 返回 null:CDP 可达但页面读取失败(弹窗遮挡等)
  • 返回 'cdp_down':CDP 端口不通(隧道断开/浏览器关闭)
  • 通过 net.createConnection 先探测端口,5秒超时

2. verifyChatExhausted(reason) 二次确认

所有 5 个判定点(启动、主循环、子进程 chat_empty、批次后检查×2)都调用此函数:

  • CDP 不通 → 等待 30 秒重试,连续 3 次 CDP 不通 → 判定"连接异常"(不发最终汇报)
  • 读到 0 → 连续 3 次确认后才判定真正耗尽
  • 读到 >0 → 判定误判,返回剩余次数继续运行

3. stopReason 控制最终汇报

  • chat_empty:聊天真正耗尽 → ✅ 发最终汇报
  • cdp_down:连接异常 → ❌ 不发汇报,只发"CDP 连接断开"错误通知
  • normal:正常结束 → 不发汇报

日常启动流程

  1. Windows 桌面:双击「Chrome Debug」→ 打开智联推荐页(hr1)
  2. Windows 桌面:双击「Edge Debug Mode」→ 打开智联推荐页(hr2)
  3. Linux:确认两条 SSH 隧道都通(ss -tlnp | grep -E "9223|9225" + curl http://127.0.0.1:9223/json/version)
  4. Linux:启动隧道守护(nohup /home/kt/scripts/ssh-tunnel-watchdog.sh > /tmp/ssh-tunnel-watchdog.log 2>&1 &)
  5. Linux:两个 batch-runner 并行启动(或等 cron 自动启动)

已知问题

  1. SSH 隧道不稳定(2026-06-01 已修复:双向心跳保活)
  2. CDP 连接失败与聊天耗尽共用退出路径(2026-06-01 已修复:verifyChatExhausted + stopReason)