Files
douban-login/ARCHITECTURE.md
2025-10-24 20:23:16 +08:00

82 lines
4.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.

# 架构说明
本文档描述项目中的主要模块、职责划分以及关键流程,帮助维护者快速理解整体结构。
## 模块概览
```
├── README.md // 使用说明与命令入口
├── ARCHITECTURE.md // 架构与流程说明(本文档)
├── login.md // 需求与步骤原始描述
├── block.md // 滑块破解背景与参考脚本
├── src/
│ ├── login.ts // 豆瓣登录主流程Cookie 复用、短信登录、滑块自动化)
│ └── slider.ts // 滑块模拟工具函数与命令行入口
└── typescript-spec.md // TypeScript 编码规范与示例
```
## 登录流程分层
```
┌─────────────────────────────────────────────┐
│ main() │
│ - 创建浏览器 │
│ - 复用或创建上下文 │
│ - 调用 loginWithSms() │
│ - 保存 Cookies │
└─────────────────────────────────────────────┘
┌────────────────▼────────────────────────────┐
│ loginWithSms() │
│ - 输入手机号 │
│ - 点击“获取验证码” │
│ - trySolveSlider() 自动滑块(可选) │
│ - 提示人工输入短信验证码 │
│ - 提交并校验登录状态 │
└────────────────▲────────────────────────────┘
┌────────────────▼────────────────────────────┐
│ trySolveSlider() │
│ - locateSlider() 识别滑块所在 frame/元素 │
│ - inferSliderDistance() 推测拖动距离 │
│ - performSlide() 实际模拟拖动(来自 slider.ts
│ - 检查滑块成功标记 │
└─────────────────────────────────────────────┘
```
- `prepareContext()`:独立负责 Cookie 复用与上下文创建。
- `isLoggedIn()`:封装登录状态检测逻辑,避免主流程重复判断。
- `slider.ts`:抽离通用滑块控制方法,既服务登录流程,也支持命令行调试。
## 依赖与交互
- Playwright浏览器自动化
- Node.js运行环境、文件/路径操作;
- readline控制台交互输入验证码
- 环境变量:控制手机号、滑块自动化开关与参数;
- `~/cookies.json`:持久化登录态,供下一次运行直接复用。
## 扩展点
- **滑块识别**`sliderHandleSelectors``sliderTrackSelectors` 可按需扩充、覆盖,以支持不同验证码厂商。
- **距离计算**:先截取背景图与拼图块做模板匹配确定缺口位置,必要时退回二值化列分析,再配合多组偏移反复尝试;也可用 `DOUBAN_SLIDER_DISTANCE` / `DOUBAN_SLIDER_OFFSETS` 手动覆盖。
- **距离推断**:默认通过轨道宽度估算,特殊情况可直接设置 `DOUBAN_SLIDER_DISTANCE`
- **验证码输入**:目前依赖人工短信验证码,可接入短信网关或 API 进一步自动化。
- **多账号管理**:现仅支持单账号,可通过配置文件或参数改造为批量登录。
## 数据流
1. 启动脚本读取 `DOUBAN_PHONE`、Cookies 路径等基础配置;
2. 初始化浏览器上下文,必要时进入登录页面;
3. 提交手机号,触发滑块验证;
4. 若启用自动滑块,定位组件并拖动;否则提示人工操作;
5. 读取短信验证码,提交登录表单;
6. 验证成功后将 `storageState` 写入 `cookies.json`
7. 后续执行逻辑复用当前登录态或退出浏览器。
## 日志与错误处理
- 主流程捕获未处理异常并输出错误信息;
- 自动滑块阶段出现异常时仅发出警告并回退到人工操作;
- CLI 提示说明每一步的执行结果,便于排查问题。