81 lines
3.7 KiB
Markdown
81 lines
3.7 KiB
Markdown
# 登录脚本实现笔记
|
||
|
||
本文记录当前版本豆瓣登录脚本的实现细节、关键函数以及后续可扩展点。滑块验证码相关逻辑已移除,若页面出现额外验证需人工完成。
|
||
|
||
## 文件结构
|
||
|
||
```
|
||
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 体验**:封装命令行参数解析,避免频繁依赖环境变量。
|
||
|
||
以上内容覆盖当前脚本主要实现。若后续重新引入滑块自动化,可在此文档扩展新的模块说明。
|