# 架构说明 本文档梳理项目中的主要模块、职责划分以及核心流程,帮助维护者快速了解整体结构。当前版本仅关注短信验证码登录与 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` 并输出详细错误信息。