Files
douban-login/README.md
2025-10-25 23:39:25 +08:00

138 lines
5.9 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.

# douban-crawler
**版本**: v1.1.0
> Playwright + TypeScript 脚本,用于完成豆瓣短信验证码登录,并将登录态持久化到本地 Cookie 文件。**已集成 AI 驱动的滑块验证码自动识别和求解功能**。
## ✨ 核心功能
- 🔐 **自动登录**: 支持短信验证码登录流程
- 🧩 **智能滑块识别**: 基于图像处理算法自动识别和求解滑块验证码
- 🎯 **高成功率**: 采用多策略检测算法暗区检测、边缘检测、颜色量化、LAB色彩空间分析
- 🔄 **自动重试**: 验证失败时自动刷新并重试,最多 10 次
- 📊 **详细日志**: 完整的调试信息和截图保存,便于问题追溯
- 🖼️ **可视化调试**: 自动标注检测到的滑块位置,保存带红框标记的图片
- 🍪 **Cookie 持久化**: 自动保存登录态,下次可直接复用
## 环境准备
```bash
npm install
npx playwright install chromium
```
需要 Node.js ≥ 18。Playwright 会自动下载 Chromium首次运行请确保网络可访问 Playwright CDN。
## 使用方式
1. 设置手机号环境变量并运行登录脚本:
```bash
DOUBAN_PHONE=13800000000 npm run login
```
2. 启用自动滑块验证(可选):
```bash
DOUBAN_AUTO_SLIDER=1 DOUBAN_PHONE=13800000000 npm run login
```
3. 浏览器会自动打开豆瓣登录页,脚本完成以下操作:
- 填入手机号并点击「获取验证码」;
- 如果启用了自动滑块验证,会自动检测并滑动;否则等待用户手动完成;
- 控制台等待用户输入短信验证码;
- 验证码提交成功后,脚本将登录态写入 `~/douban-cookie.json` 并退出。
4. 下次运行会优先尝试加载该 Cookie 文件,若仍在有效期内可直接登录。
## 命令列表
| 命令 | 说明 |
| --------------- | ---------------------------- |
| `npm run login` | 启动豆瓣登录流程并保存 Cookie |
## 可配置项
当前脚本支持以下环境变量:
| 变量名 | 说明 | 是否必填 | 默认值 |
| --------------------- | ------------------------------ | -------- | ------ |
| `DOUBAN_PHONE` | 登录手机号(大陆) | 必填 | - |
| `DOUBAN_AUTO_SLIDER` | 是否启用自动滑块验证1/true | 可选 | false |
若需要更改 Cookie 保存位置,可在 `src/login.ts` 中调整 `COOKIES_PATH` 定义。
## 工作流程说明
1. 读取 `DOUBAN_PHONE`,未提供则直接退出;
2. 若存在 `~/douban-cookie.json`,加载后访问登录页并校验登录态;
3. 如未登录,执行短信验证码流程,期间需手动处理页面可能出现的滑块或图形验证码;
4. 用户在终端输入收到的短信验证码;
5. 验证通过后,将当前浏览器上下文的 `storageState` 写入 `~/douban-cookie.json`。
## 常见问题
- **登录后仍提示手机号未填写?** 确认 Playwright 浏览器窗口焦点在页面内,避免浏览器阻止自动填充。
- **自动滑块验证失败?** 系统会提示手动完成,或者尝试不启用自动滑块功能。
- **Cookie 未生成?** 只有当脚本确认登录成功时才会写入 Cookie。若终端未看到 "登录成功Cookies 已保存…" 的日志,请检查短信验证码是否正确。
## 滑块验证模块
本项目包含了从 `captcha_cracker` 移植并优化的滑块检测功能,位于 `src/slider/` 目录。
详细说明请查看 [src/slider/README.md](./src/slider/README.md)
### 滑块验证工作流程
1. **自动检测**: 点击"获取验证码"后自动检测滑块验证码窗口
2. **图像采集**: 截取验证码图片并放大到 800px 宽度以提高识别精度
3. **多策略检测**:
- 暗区检测:识别滑块缺口的阴影区域
- 边缘检测:使用 Canny 算法识别轮廓
- 颜色量化:分析色彩分布找出异常区域
- LAB 色彩空间:在更符合人类视觉的空间中检测差异
4. **双滑块识别**: 同时检测左侧滑块和右侧缺口,计算精确距离
5. **距离计算**:
- 双滑块模式:`距离 = (缺口X - 滑块X) / scaleX`
- 单滑块模式:基于 DOM 位置和图像分析综合计算
6. **拟人化滑动**: 模拟真实人类操作的加速-匀速-减速轨迹
7. **结果验证**: 检测成功标识或窗口消失,失败则自动刷新重试(最多 10 次)
8. **可视化输出**: 在 `output/` 或 `noflag/` 目录保存带红框标记的检测结果图片
### 滑块识别算法
核心算法移植自 `captcha_cracker` 项目,包括:
- **候选框搜索** (`detection/candidate-search.ts`): 四种策略并行搜索可疑区域
- **边界框优化** (`detector.ts`): 使用 Canny 边缘检测精确定位
- **自学习模板匹配** (`detector-self-learning.ts`): 动态学习滑块模板提高准确率
- **几何与图像工具** (`utils/`): IoU 计算、形态学操作、Sobel 算子等
### 调试与问题排查
所有截图和检测结果保存在:
- `output/`: 常规调试输出
- `noflag/`: 完整尺寸800px的检测图片
- 文件命名格式:`captcha-{timestamp}.png` 和 `captcha-{timestamp}-detected.png`
查看 `-detected.png` 文件可以确认:
- 红框标记的位置是否准确识别了滑块缺口
- 如有两个框,左边的应该是滑块,右边的是缺口
## 声明
该项目仅供学习与功能验证,请勿用于违反豆瓣平台服务条款的场景。开发者需自行承担使用风险。
## 开发文档
- `src/login.ts`:主登录流程,负责 Cookie 复用、短信登录以及滑块自动化;
- `src/slider/`:滑块验证模块,包含检测、移动等完整功能;
- `ARCHITECTURE.md`:整体架构与流程说明;
- `IMPLEMENTATION.md`:关键实现细节记录;
- `login.md`:原始业务需求与操作步骤;
- `typescript-spec.md`:团队 TypeScript 编码规范与示例。
## 许可
本项目仅用于功能验证和学习,使用时请遵守目标网站的服务条款。