Files
douban-login/IMPLEMENTATION.md
2025-10-24 22:25:24 +08:00

81 lines
3.7 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.

# 登录脚本实现笔记
本文记录当前版本豆瓣登录脚本的实现细节、关键函数以及后续可扩展点。滑块验证码相关逻辑已移除,若页面出现额外验证需人工完成。
## 文件结构
```
src/
└── login.ts # Playwright 入口脚本
```
辅助文档位于项目根目录:
- `README.md`:使用说明与常见问题;
- `ARCHITECTURE.md`:整体架构与流程拆解;
- `login.md`:早期需求说明,可作为手动操作参考。
## 核心流程
1. **读取配置**
通过 `process.env.DOUBAN_PHONE` 获取手机号,缺失时直接退出。
2. **准备浏览器上下文** (`prepareContext`)
- 若存在 `~/douban-cookie.json`,以 `storageState` 形式加载;
- 打开登录页并调用 `isLoggedIn` 校验是否仍在登录态;
- 失效时关闭旧上下文并创建全新 session。
3. **执行短信登录** (`loginWithSms`)
- 输入手机号 → 点击「获取验证码」;
- 控制台提醒用户在浏览器中手动完成滑块等页面验证;
- 通过 `prompt` 等待用户输入短信验证码并提交;
- 等待 Playwright 检测到页面离开登录地址或抛出超时。
4. **确认状态并写入 Cookie 文件**
- `isLoggedIn` 再次判断是否登录成功;
- 调用 `context.storageState({ path })` 将状态写入 `~/douban-cookie.json`
- 终端提示成功信息,方便用户确认文件路径。
## 关键函数
### `isLoggedIn(page: Page): Promise<boolean>`
检查 `dbcl2` Cookie 是否存在,并确认登录表单元素是否仍可见。该组合可较准确判断是否处于登录态,同时避免依赖豆瓣首页 DOM。
### `prepareContext(browser: Browser)`
负责上下文复用策略:优先尝试加载本地 Cookie 创建上下文,如果判定仍未登录则回退到全新会话并跳转登录页。函数返回 `{ context, page, usedCookies }`,调用方可据此判断是否需要重走登录流程。
### `loginWithSms(page: Page, phone: string)`
串联短信验证码登录的主要逻辑,所有用户交互点都通过控制台提示:
- 页面操作由脚本自动完成(填手机号、点击按钮);
- 人机验证与短信输入由用户处理;
- 函数内部对提交过程设置合理的等待时间,避免过早关闭浏览器。
### `main()`
作为 CLI 入口,负责整体 orchestrate校验配置 → 启动浏览器 → 调用上述函数 → 捕获异常并设置 `process.exitCode`
## 错误处理与提示
- 打印清晰的步骤提示,例如“请等待短信验证码…”、“正在提交验证码…”;
- 捕获 Playwright 的超时异常,允许在页面未完全跳转时通过 `isLoggedIn` 再次确认;
- 如登录失败会输出明确日志并保持退出码非零,方便在 CI 或脚本中检测。
## 手动操作注意事项
- Playwright 会以非无头模式启动 Chromium务必保持窗口前台以便人工处理滑块或图形验证码
- 如短信验证码输入错误,可重新运行脚本并继续人工操作;
- 保存的 `douban-cookie.json` 与账号强绑定,若切换账号需手动删除或覆盖该文件。
## 后续拓展建议
1. **多账号支持**:通过配置文件或命令行参数管理多组手机号与存储路径;
2. **验证码服务集成**:接入外部短信/验证码平台以减少人工步骤;
3. **任务编排**:在登录后追加业务逻辑(例如抓取列表、导出数据),可在 `main` 函数成功分支追加调用;
4. **CLI 体验**:封装命令行参数解析,避免频繁依赖环境变量。
以上内容覆盖当前脚本主要实现。若后续重新引入滑块自动化,可在此文档扩展新的模块说明。