254 lines
11 KiB
Markdown
Executable File
254 lines
11 KiB
Markdown
Executable File
# Windows 远程抓取环境配置
|
||
|
||
## 连接方式
|
||
|
||
| 网络 | 地址 | 备注 |
|
||
|------|------|------|
|
||
| **外网(当前)** | `sshpass -p 'xxx' ssh -p 7022 sshadmin@8.152.213.143` | 通过内网穿透NAT端口转发,**当前唯一可用** |
|
||
| 内网 | `sshadmin@192.168.100.176` | Windows内网IP,外部不可达 |
|
||
| ~~旧内网~~ | `~~sshadmin@192.168.50.99~~` | **已失效**(2026-06-22 迁移后) |
|
||
|
||
SSH 使用 sshpass 密码认证(无密钥认证)。`~/.ssh/config` 中配置了 `Host windows-hr` 别名。
|
||
|
||
## 环境状态(截至 2025-05-20)
|
||
|
||
- **环境状态(截至 2025-05-20)**
|
||
- **Chrome:** ✅ 已安装(`C:\Program Files\Google\Chrome\Application\chrome.exe`)
|
||
- **Node.js:** ✅ v22.18.0 + npm 10.9.3(MSI 静默安装)
|
||
- **Playwright:** ✅ playwright-core(`npm install playwright-core`)
|
||
- **better-sqlite3:** ✅(`npm install better-sqlite3`)
|
||
- **工作目录:** `C:\recruitment\`
|
||
- **数据库路径:** `C:\recruitment\recruitment.db`(从 Linux SCP 同步)
|
||
- **脚本路径:** `C:\recruitment\zhaopin-scrape.js`(跨平台,通过 `RECRUITMENT_DB` 环境变量指定数据库路径)
|
||
|
||
## 已完成的部署步骤
|
||
|
||
```powershell
|
||
# 1. 安装 Node.js(MSI 静默安装)
|
||
# 下载地址:https://nodejs.org/dist/v22.18.0/node-v22.18.0-x64.msi
|
||
msiexec /i node-v22.18.0-x64.msi /quiet /norestart
|
||
|
||
# 2. 创建工作目录
|
||
mkdir C:\recruitment
|
||
cd C:\recruitment
|
||
npm init -y
|
||
|
||
# 3. 安装依赖
|
||
npm install playwright-core better-sqlite3
|
||
|
||
# 4. 部署数据库(从 Linux SCP)
|
||
# Linux 端:scp ~/.hermes/data/recruitment/recruitment.db sshadmin@192.168.50.99:C:/recruitment/
|
||
|
||
# 5. 部署脚本(注意跨平台路径处理)
|
||
# 脚本通过 process.env.RECRUITMENT_DB 获取数据库路径
|
||
# Windows 端设置:set RECRUITMENT_DB=C:\recruitment\recruitment.db
|
||
```
|
||
|
||
## ✅ 已解决:SSH 会话隔离导致 CDP 端口不可达
|
||
|
||
### 现象
|
||
|
||
Chrome 通过 SSH 会话以 `--remote-debugging-port=9222` 启动后:
|
||
- `netstat -ano | findstr 9222` 显示端口 LISTENING ✅
|
||
- `curl http://127.0.0.1:9222/json/version` 连接失败 ❌
|
||
|
||
### 根因
|
||
|
||
**Windows Session 隔离** — SSH 会话和 Chrome 进程运行在不同的 Windows 会话中,网络命名空间不共享。
|
||
|
||
### ✅ 已验证的解决方案:RDP + SSH 端口转发
|
||
|
||
**实际使用的工作流程(已验证通过):**
|
||
|
||
1. 用户 RDP 登录 Windows 桌面
|
||
2. 在 Windows 桌面用快捷方式启动 Chrome(调试模式 + 独立 user-data-dir)
|
||
3. Linux 端建立 SSH 端口隧道:`ssh -N -L 9223:127.0.0.1:9222 sshadmin@192.168.50.99`
|
||
4. 脚本在 Linux 上运行,通过 `CDP_PORT=9223` 环境变量连接隧道端口
|
||
5. 数据直接写入 Linux 本地 SQLite 数据库,无需同步
|
||
|
||
**关键细节:**
|
||
- 隧道端口用 9223 避免和 Linux 本地 9222 冲突
|
||
- Chrome 必须用 `--user-data-dir` 指定独立目录(默认目录被锁定,不能直接用)
|
||
- SSH 隧道必须保持连接,断开就失效
|
||
- `headless` 模式下 CDP 端口可达,但推荐用桌面模式(用户可可视监控)
|
||
|
||
### ❌ 已验证无效的方案
|
||
|
||
| 方案 | 结果 |
|
||
|------|------|
|
||
| SSH 会话内 `start "" "chrome.exe" --remote-debugging-port=9222` | 进程不启动(session 隔离) |
|
||
| SSH 会话内 `powershell Start-Process "chrome.exe" -ArgumentList ...` | 进程不启动(session 隔离) |
|
||
| SSH 会话内直接执行 `chrome.exe --remote-debugging-port=9222` | 端口 LISTENING 但不可达 |
|
||
| `curl http://127.0.0.1:9222/json/version`(SSH 会话内) | 连接失败 |
|
||
| `--remote-allow-origins=*` | 无关,这是 CORS 配置 |
|
||
|
||
### ✅ 推荐:Windows 计划任务远程启动(2026-06-02 验证)
|
||
|
||
**Windows 上已配置两个计划任务,可通过 SSH 远程启动浏览器(绕过 session 隔离):**
|
||
|
||
```bash
|
||
# 启动 Chrome Debug(hr1,CDP 9222)
|
||
sshpass -p 'xxx' ssh -p 7022 sshadmin@8.152.213.143 "schtasks /run /TN \"ChromeDebug\""
|
||
|
||
# 启动 Edge Debug(hr2,CDP 9224)
|
||
sshpass -p 'xxx' ssh -p 7022 sshadmin@8.152.213.143 "schtasks /run /TN \"LaunchEdgeDebug\""
|
||
```
|
||
|
||
**命令:**
|
||
| 计划任务名 | 启动内容 |
|
||
|-----------|---------|
|
||
| `ChromeDebug` | `"C:\Program Files\Google\Chrome\Application\chrome.exe" --remote-debugging-port=9222` |
|
||
| `LaunchEdgeDebug` | `"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" --remote-debugging-port=9224 --user-data-dir=C:\temp\edge-debug` |
|
||
|
||
**原理:** 计划任务在桌面 session(Session 1)中执行,与 RDP 登录同 session,所以 GUI 进程能正常启动且 CDP 端口可达。`start` 和 `Start-Process` 通过 SSH(Session 0)执行,进程要么不启动要么 CDP 不可达。
|
||
|
||
**验证步骤(Edge 启动后需 ~6 秒才能 CDP 就绪):**
|
||
```bash
|
||
sleep 6
|
||
ssh sshadmin@192.168.50.99 "curl -s --connect-timeout 5 http://127.0.0.1:9224/json/version"
|
||
# 应返回 {"Browser":"Edg/148.0.3967.96",...,"webSocketDebuggerUrl":"ws://..."}
|
||
```
|
||
|
||
**Edge 启动后默认只打开空白 newtab 页**,需要通过 CDP 导航到推荐页或用户在桌面手动操作。
|
||
|
||
## Edge 启动方式(双账号 hr2)
|
||
|
||
### 安装路径
|
||
|
||
```
|
||
C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe
|
||
```
|
||
|
||
### ⚠️ Windows 用户目录实际路径(2026-06-26 确认)
|
||
|
||
通过 SSH `echo %USERPROFILE%` 确认实际用户目录为 `C:\Users\sshadmin.WIN-3NKO8I5R9IJ`(不是 `C:\Users\sshadmin`)。
|
||
|
||
- Chrome user-data-dir 应检查是否也需要更新(当前配置为 `C:\temp\chrome-debug`)
|
||
- Edge user-data-dir 需用完整路径:`C:\Users\sshadmin.WIN-3NKO8I5R9IJ\AppData\Local\Microsoft\Edge\UserData-hr2`
|
||
- **路径中避免空格**(用 `UserData-hr2` 不用 `User Data hr2`),PowerShell `Start-Process -ArgumentList` 解析含空格路径时可能出错
|
||
|
||
### 远程启动(推荐:schtasks)
|
||
|
||
```bash
|
||
# 通过 SSH 用计划任务启动(绕过 session 隔离)
|
||
sshpass -p 'xxx' ssh -p 7022 sshadmin@8.152.213.143 "schtasks /run /TN \"LaunchEdgeDebug\""
|
||
sleep 6 # Edge 启动较慢
|
||
```
|
||
|
||
**⚠️ 计划任务 `LaunchEdgeDebug` 的 user-data-dir 可能需要更新:** 当前配置为 `C:\temp\edge-debug`,需在 Windows 上检查该目录是否还存在,必要时更新为 `C:\Users\sshadmin.WIN-3NKO8I5R9IJ\AppData\Local\Microsoft\Edge\UserData-hr2`。
|
||
|
||
### ❌ SSH 远程启动 Edge(已确认无效,pitfalls #74)
|
||
|
||
通过 SSH 用 `powershell Start-Process` 或 `cmd /c start` 启动 Edge:
|
||
- 进程可能启动(`tasklist` 可见 msedge.exe)
|
||
- 端口可能短暂 LISTENING
|
||
- 但 **CDP 端口不可达**(curl 返回空或连接失败)
|
||
- 端口 LISTENING 后会自动释放(Edge 在 Session 0 中运行异常)
|
||
- **即使是 `powershell Start-Process` 也会失败** — 2026-06-26 实测确认
|
||
|
||
**根因:** SSH 登录在 Session 0(services session),Edge 启动在 Session 0 而非桌面 Session 1。GUI 进程在 Session 0 中 CDP 端口不稳定,会短暂监听后释放。
|
||
|
||
**唯一可靠远程方式:`schtasks /run`**(计划任务在桌面 session 执行)。
|
||
|
||
### 桌面快捷方式(备选)
|
||
|
||
> ⚠️ **2026-06-02 发现:桌面无 Edge Debug.lnk 快捷方式**,只有 Chrome Debug.lnk。计划任务 `LaunchEdgeDebug` 是唯一远程启动方式。如需创建快捷方式:
|
||
```powershell
|
||
$WshShell = New-Object -ComObject WScript.Shell
|
||
$Shortcut = $WshShell.CreateShortcut("C:\Users\Administrator\Desktop\Edge Debug.lnk")
|
||
$Shortcut.TargetPath = "C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"
|
||
$Shortcut.Arguments = "--remote-debugging-port=9224 --user-data-dir=C:\temp\edge-debug"
|
||
$Shortcut.Save()
|
||
```
|
||
|
||
### ⚠️ Edge 同样受 Windows Session 隔离限制
|
||
|
||
通过 SSH 会话远程 `Start-Process` 启动的 Edge,CDP 端口 9224 虽然显示 LISTENING 但**不可达**,和 Chrome 完全相同的问题。**必须通过计划任务或桌面快捷方式启动**。详见上方"已验证无效方案"章节。
|
||
|
||
### 验证 CDP 连通性
|
||
|
||
```bash
|
||
# Linux 端,通过隧道验证
|
||
curl -s --connect-timeout 5 http://127.0.0.1:9225/json/version
|
||
# 应返回 JSON,含 Browser 字段为 "Microsoft Edge/..."
|
||
```
|
||
|
||
## Chrome 启动方式
|
||
|
||
### 方式1:桌面快捷方式(推荐,已验证)
|
||
|
||
在 Windows 桌面创建快捷方式,用户双击启动:
|
||
```powershell
|
||
# 通过 SSH 创建桌面快捷方式(一次性)
|
||
$WshShell = New-Object -ComObject WScript.Shell
|
||
$Shortcut = $WshShell.CreateShortcut('C:\Users\Administrator\Desktop\Chrome Debug.lnk')
|
||
$Shortcut.TargetPath = 'C:\Program Files\Google\Chrome\Application\chrome.exe'
|
||
$Shortcut.Arguments = '--remote-debugging-port=9222 --user-data-dir=C:\temp\chrome-debug'
|
||
$Shortcut.Save()
|
||
```
|
||
|
||
**⚠️ user-data-dir 必须用独立目录:** Chrome 默认的 User Data 目录被已运行的 Chrome 实例锁定,直接使用会报错。必须先复制一份:
|
||
```powershell
|
||
# 首次使用:复制默认 Chrome 配置(保留登录态和 Cookie)
|
||
robocopy "C:\Users\Administrator\AppData\Local\Google\Chrome\User Data" "C:\temp\chrome-debug" /E
|
||
```
|
||
|
||
### 方式2:SSH 命令行启动
|
||
|
||
```powershell
|
||
# headless 模式(SSH 会话内 CDP 端口可达,但用户看不到浏览器)
|
||
& "C:\Program Files\Google\Chrome\Application\chrome.exe" --headless=new --remote-debugging-port=9222 --user-data-dir=C:\temp\chrome-debug
|
||
```
|
||
|
||
## Linux 端操作
|
||
|
||
```bash
|
||
# 1. 建立 SSH 端口隧道(后台运行,保持连接)
|
||
ssh -N -L 9223:127.0.0.1:9222 sshadmin@192.168.50.99 &
|
||
|
||
# 2. 验证 CDP 连接
|
||
curl -s http://localhost:9223/json/version
|
||
|
||
# 3. 运行抓取脚本(通过环境变量指定端口)
|
||
cd /home/kt/scripts && CDP_PORT=9223 node zhaopin-scrape.js 20
|
||
```
|
||
|
||
## 数据存储
|
||
|
||
**当前方案:脚本在 Linux 运行,数据直接写入 Linux 本地数据库,无需同步。**
|
||
|
||
- 数据库路径:`/home/kt/.hermes/data/recruitment/recruitment.db`
|
||
- Windows 上不需要维护数据库副本
|
||
- 脚本通过 `RECRUITMENT_DB` 环境变量自动检测系统并使用对应路径(Linux 默认,Windows 通过环境变量覆盖)
|
||
|
||
## 网络环境限制(重要)
|
||
|
||
**⚠️ Windows 机器无法插网线(用户确认 2026-06-01),WiFi 是唯一网络方式。**
|
||
|
||
| 项目 | 值 |
|
||
|------|------|
|
||
| WiFi 网卡 | Qualcomm QCA9565 802.11b/g/n |
|
||
| 连接 AP | HUAWEI-2.4G-HHVT (2.4GHz, 频道1) |
|
||
| 信号强度 | ~34% |
|
||
| 链路速度 | 72.2 Mbps |
|
||
| 以太网口 | Realtek PCIe GbE,状态 Disconnected(不可用) |
|
||
|
||
**影响:** 2.4GHz WiFi 信号弱 + 干扰大 → SSH 隧道间歇性断连。物理层无法优化。
|
||
|
||
**应对措施(三层防御):**
|
||
1. SSH 双向保活(ServerAliveInterval=15 + ClientAliveInterval=30)
|
||
2. `ssh-tunnel-watchdog.sh` 隧道守护(每10秒检测,断了自动重建)
|
||
3. `batch-runner.js` 内置 `waitForCdpRecovery()`(CDP断开等5分钟恢复,不直接停止)
|
||
|
||
## 注意事项
|
||
|
||
1. Windows SSH 服务器是 OpenSSH for Windows,部分 Linux 命令不可用
|
||
2. 路径分隔符是 `\\`,脚本中注意跨平台兼容
|
||
3. PowerShell 和 CMD 行为不同,脚本中优先用 Node.js API 而非 shell 命令
|
||
4. Windows 防火墙可能阻止 CDP 端口(9222),需确认放行
|
||
5. SSH 端口隧道的本地端口用 9223(避免和 Linux 本地 9222 冲突)
|
||
6. Chrome `--user-data-dir` 必须是独立目录,默认目录被锁定
|
||
7. SSH 隧道必须保持连接,断开后脚本无法连接 Chrome
|
||
8. Windows 端 PowerShell 转义引号复杂,建议通过 `powershell -Command "..."` 执行
|
||
9. 脚本通过 `CDP_PORT` 环境变量指定 CDP 端口,默认 9222
|