5.9 KiB
5.9 KiB
Douyin Login Entry Design
Goal
将当前“手动先开浏览器登录,再让 Douyin.py 附着到调试端口抓取”的隐式流程,固化为稳定、明确、可复用的两步式命令行入口。
Current Context
- 现有抓取实现位于
Douyin.py。 Douyin.py已支持通过--browser-port附着到已启动的 Chrome 调试端口。- 本次实测已经证明:用户先在可见 Chrome 中登录抖音并通过验证码后,
Douyin.py --browser-port 9223可以成功抓到web/aweme/post/接口并下载视频。 - 当前缺少一个明确的“登录准备入口”,导致可操作性依赖人工记忆和临时命令。
Requirements
Functional
- 提供一个独立脚本,用于启动可见 Chrome,并固定:
- 调试端口,默认
9223 - 用户数据目录,默认使用一个项目约定路径
- 打开的初始 URL,默认指向现有抖音博主页
- 调试端口,默认
- 登录脚本只负责“打开浏览器并提示用户手动登录”,不负责抓取。
Douyin.py继续负责抓取,并保持“附着已有浏览器”的职责边界。- 当
Douyin.py指定了--browser-port但端口不可连通时,应给出清晰错误,提示先运行登录脚本。 - 文档应给出最短可执行流程:
- 第一步:启动浏览器并登录
- 第二步:运行抓取命令
Non-Functional
- 不改变现有抓包、解析、下载的主逻辑。
- 保持现有命令参数兼容。
- 入口职责清晰,便于排查“登录问题”和“抓取问题”。
- 新增行为应具备可自动化测试的核心单元。
Chosen Approach
采用双脚本方案:
- 新增
login_douyin.py- 负责启动可见 Chrome
- 固定 remote debugging port
- 固定 profile 目录
- 打开目标用户主页
- 输出明确提示,引导用户完成手动登录和验证码
- 保留
Douyin.py- 继续承担附着浏览器、监听接口、下载视频的职责
- 增强附着前检查与报错信息
Rejected Alternatives
Alternative 1: 将“启动浏览器”直接并入 Douyin.py
不采用。原因:
- 会让
Douyin.py同时承担登录准备和抓取职责。 - 错误定位会变差,用户更难区分是登录失败还是抓取失败。
- 未来若需要“先登录、稍后再抓”,这种合并入口不灵活。
Alternative 2: 只写 shell 脚本串联所有步骤
不采用。原因:
- 逻辑容易散落在 shell 中,测试性差。
- 浏览器启动参数、等待逻辑和抓取命令耦合度高。
- 后续若要扩展默认参数或跨平台兼容,shell 方案维护成本更高。
Proposed CLI UX
Step 1: 启动登录浏览器
./.venv/bin/python login_douyin.py
默认行为:
- 启动可见 Chrome
- 调试端口为
9223 - profile 目录为项目约定的本地路径
- 打开默认的抖音主页 URL
- 输出“请在浏览器中完成登录/验证码,然后再运行抓取命令”
可选扩展参数:
--browser-port--profile-dir--user-url--chrome-path
Step 2: 运行抓取
./.venv/bin/python Douyin.py --pages 1 --browser-port 9223
Design Details
login_douyin.py
建议拆分为可测试的小函数:
build_login_command(...)- 输入 Chrome 路径、profile 目录、端口、URL
- 输出适合
subprocess.Popen(...)的参数列表
launch_browser(...)- 调用
subprocess.Popen(...)
- 调用
build_parser()- 定义 CLI 参数
main()- 解析参数
- 启动浏览器
- 打印下一步指引
Douyin.py
新增一个显式的端口检查函数,例如:
ensure_browser_debug_port_ready(browser_port: int) -> None
行为:
- 仅当用户传入
--browser-port时执行 - 尝试连接
127.0.0.1:<port> - 若失败,抛出清晰错误,提示:
- 先启动
login_douyin.py - 确认 Chrome 仍在运行
- 确认端口与抓取命令一致
- 先启动
Error Handling
登录脚本
- Chrome 可执行文件不存在:直接报错并退出。
- 浏览器启动失败:输出异常原因并返回非零退出码。
- profile 目录不存在:自动创建。
抓取脚本
- 指定
--browser-port但端口不可达:立即失败,不进入抓取流程。 - 登录未完成导致页面异常:保留现有抓包等待与警告逻辑。
Testing Strategy
Unit Tests
新增或扩展 test_douyin.py,覆盖:
build_login_command()生成的命令参数正确。- 默认调试地址仍为
127.0.0.1:<port>。 ensure_browser_debug_port_ready()在端口不可达时抛出可读错误。ensure_browser_debug_port_ready()在端口可达时正常返回。
如测试边界过大,可新增 test_login_douyin.py。
Manual Verification
- 运行
./.venv/bin/python login_douyin.py - 在打开的 Chrome 中登录抖音并通过验证码
- 运行
./.venv/bin/python Douyin.py --pages 1 --browser-port 9223 - 确认
video/下生成新的 mp4 文件
Implementation Boundaries
本次只做以下改动:
- 新增登录入口脚本
- 为抓取入口补充附着前端口检查
- 更新测试
- 更新使用文档
本次不做以下改动:
- 不重写抓取主流程
- 不改成单命令自动等待登录
- 不引入 Playwright 作为正式运行时依赖
- 不增加下载调度、断点续传或批量任务管理
Risks
- 本机 Chrome 路径可能与预设不同,因此需要保留
--chrome-path覆盖能力。 - profile 目录固定后,用户可能重复复用登录态,这是预期行为,但文档需说明。
- 若目标端口被其他进程占用,登录脚本需要给出可诊断的失败信息或允许端口覆盖。
Success Criteria
满足以下条件即视为完成:
- 用户可以通过固定命令启动登录浏览器。
- 用户登录完成后,可通过固定命令让
Douyin.py成功附着并抓取。 - 当浏览器未启动或端口错误时,抓取脚本会给出明确提示,而不是模糊失败。