72 lines
3.5 KiB
Markdown
72 lines
3.5 KiB
Markdown
# 架构说明
|
||
|
||
本文档梳理项目中的主要模块、职责划分以及核心流程,帮助维护者快速了解整体结构。当前版本仅关注短信验证码登录与 Cookie 持久化,滑块验证码需人工操作。
|
||
|
||
## 模块概览
|
||
|
||
```
|
||
├── README.md // 使用说明与运行指引
|
||
├── ARCHITECTURE.md // 架构概览与流程说明(本文档)
|
||
├── IMPLEMENTATION.md // 关键实现细节记录
|
||
├── login.md // 早期需求与操作步骤
|
||
├── src/
|
||
│ └── login.ts // 豆瓣登录脚本入口(Cookie 复用 + 短信登录)
|
||
└── typescript-spec.md // 团队 TypeScript 编码规范
|
||
```
|
||
|
||
## 登录流程分层
|
||
|
||
```
|
||
┌────────────────────────────────────┐
|
||
│ main() │
|
||
│ - 启动 Chromium │
|
||
│ - 复用或创建上下文 │
|
||
│ - 调用 loginWithSms() │
|
||
│ - 保存 Cookies │
|
||
└────────────────────────────────────┘
|
||
│
|
||
┌────────────────▼──────────────────┐
|
||
│ loginWithSms() │
|
||
│ - 输入手机号 │
|
||
│ - 触发短信验证码 │
|
||
│ - 提示用户完成页面额外验证 │
|
||
│ - 等待并提交短信验证码 │
|
||
│ - 校验是否登录成功 │
|
||
└────────────────────────────────────┘
|
||
│
|
||
┌────────────────▼──────────────────┐
|
||
│ isLoggedIn() │
|
||
│ - 检查关键 Cookie(dbcl2) │
|
||
│ - 确认登录表单是否仍然可见 │
|
||
└────────────────────────────────────┘
|
||
```
|
||
|
||
- `prepareContext()`:负责加载已有 Cookie、创建新上下文以及兜底跳转登录页。
|
||
- `loginWithSms()`:串联短信登录流程,涵盖用户输入与结果确认。
|
||
- `isLoggedIn()`:封装判定逻辑,避免各处重复编写 Cookie/页面检查。
|
||
|
||
## 依赖与交互
|
||
|
||
- **Playwright**:启动浏览器、操作页面元素、持久化 `storageState`。
|
||
- **Node.js**:文件读写、路径与环境变量处理。
|
||
- **readline**:在控制台等待用户输入短信验证码。
|
||
- **环境变量**:当前仅使用 `DOUBAN_PHONE` 指定登录手机号。
|
||
- **`~/douban-cookie.json`**:保存登录态的 storageState 文件,下次运行直接复用。
|
||
|
||
## 数据流
|
||
|
||
1. 读取 `DOUBAN_PHONE`,未配置则终止;
|
||
2. 若存在本地 Cookie 文件,加载后访问登录页以确认是否仍然有效;
|
||
3. 无有效登录态时执行短信登录:
|
||
- Playwright 填写手机号并请求验证码;
|
||
- 用户在浏览器中手动完成滑块等验证;
|
||
- 控制台输入短信验证码并提交;
|
||
4. 登录成功后调用 `context.storageState()` 写入 `~/douban-cookie.json`;
|
||
5. 浏览器关闭,后续脚本可直接复用该文件。
|
||
|
||
## 日志与错误处理
|
||
|
||
- 关键步骤均在控制台打印提示,便于追踪流程;
|
||
- 验证码相关操作采用提示 + `prompt` 方式等待人工输入;
|
||
- 登录失败或异常会设置 `process.exitCode` 并输出详细错误信息。
|