--- id: T-560 title: ① 采集前批量确保账号 Chrome 就绪 + 登录预检(自动开、不自动登录) phase: 2 deps: [T-203, T-205, T-105b, T-103b, T-523] status: DONE created: 2026-07-08 --- ## 问题 / 背景 需求(客户要求):① 导入采集点「采集」后,让程序**自动**把本批**匹配到账号的**各店铺 Chrome 一个个确保就绪、逐账号检查蝦皮登录态,未登录的账号标记并跳过其任务、最后弹窗汇总要补登录的账号;避免运营在几百个任务前**逐个手动开 Chrome、逐个肉眼确认登录**。用户机器日常已能并发开 ~10 个店铺 Chrome,资源可承受。 **这与现有明文规则冲突**:当前 ①③ 预检**"不自动启动 Chrome、不无提示批量启动所有账号"**(T-205/T-402),未就绪就中止并引导去④手动处理。本任务是**有意在①采集侧推翻该规则**(③更新侧不改,形成有意的不对称)。 **架构选择(已定)**:方案 A——预检期把本批需要的账号 Chrome 都**开着保留**(不关),采集复用;不做逐账号懒开懒关。**预检 ≠ 保证**:几百任务可能跑数小时,登录会中途失效,采集期必须逐任务/逐账号处理掉登录。 ## 方案(settled 一句话) 点采集 → 对本批**匹配到的每个账号**:确保其 Chrome 在跑(已开则复用、没开才启动;开失败则中止+弹窗)→ 就地查蝦皮登录 → 未登录账号标记、其任务整组跳过 → **全部保持开着** → 挨个采集(复用这些 Chrome)→ 中途掉登录 = 该账号剩余任务 skip 记因 → 结束弹窗汇总(哪些账号要补登录)+ 提示用户自行关闭 Chrome。 ## 验收要点(7 条约束) 1. **确保就绪=幂等**:先 `chrome.is_running(debug_port)`,已响应则**复用**现有 Chrome(沿用 T-105b),没开才 `launch`;绝不为已开账号重复开窗/撞端口。 2. **中途掉登录=账号级跳过**:采集期某账号被判掉登录,**把该账号剩余任务整组标 `skipped`、记原因("采集中途掉登录")**,不逐任务撞死刷一屏失败。 3. **两类跳过合并汇总**:预检未登录的账号 + 中途掉登录的账号,在结束弹窗里一起列出,提示"这些账号要补登录"。 4. **开 Chrome 失败=中止+弹窗**:端口冲突、Chrome 路径错、OOM、CDP 未就绪等任一开失败 → 中止本轮采集并弹窗说明(沿用/扩展现有端口冲突阻断口径)。 5. **不自动关**:采集结束**不关 Chrome**,弹窗提示用户自行关闭;不得关闭用户日常开着的窗口。 6. **只为匹配账号开 Chrome**:未匹配账号的别名照旧逐行 `skipped` 记原因,不为其开浏览器。 7. **不自动登录/不绕过风控**:全程只**检测**登录、不自动填密码、不绕验证码;未登录只标记引导人工去④补登录。 ## 文档同步(推翻 T-205 规则,必须一起改) - 更新 `AGENTS.md`、`docs/current-state.md`、`docs/routes.md`、`docs/04-architecture.md` 里"①③预检不自动启动 Chrome"的表述:**①采集改为自动确保就绪**;否则代码与文档打架、后续 agent 会照旧文档把本功能当 bug 改回去。 - **明确 ①③ 不对称**:① 采集自动开 Chrome、③ 更新仍需手动就绪(T-402 不改)——写清这是有意设计,不是遗漏。 - 归档任务 T-205 状态不改(历史),但在上述现状文档里注明"① 采集就绪策略已由 T-560 改为自动"。 ## 单测点(`tests/test_gui.py` + 相关) - 预检:某账号 Chrome 已在跑 → 复用、不调用 `launch`;没跑 → 调用 `launch`。 - 预检开 Chrome 失败(端口冲突/启动异常)→ 中止、不进入采集、弹窗提示。 - 某账号预检未登录 → 其任务整组 `skipped` 记因、其余账号照常采集。 - 采集中途某账号掉登录 → 该账号剩余任务 `skipped` 记因、不逐任务重复失败、其余账号继续。 - 结束汇总:未登录 + 中途掉登录的账号都出现在汇总提示里。 - 未匹配别名仍逐行 `skipped`、不为其开 Chrome。 - 不自动登录/不填密码(沿用现有断言口径)。 ## 边界(不改什么) 只改 ① 采集就绪/登录预检链路(`CollectWorker` + `accounts`/`chrome` 就绪、`editor` 登录检测复用)、① 结束汇总弹窗、相关现状文档、单测;不改 ③ 更新侧就绪规则(T-402 保持手动)、不改 CDP 选择器/采集读取逻辑本身、DB schema、AI、Excel、Shopee 交互事实。 ## 执行记录 - 2026-07-08:同步 `AGENTS.md`、`docs/04-architecture.md`、`docs/routes.md`、`docs/current-state.md`,明确 T-560 后 ①采集会自动确保匹配账号 Chrome 就绪,③更新仍保持只检测不自动启动的高风险边界。 - 2026-07-08:`CollectWorker` 采集预检从“Chrome 未启动即 blocked”改为“先幂等确保 Chrome 就绪”:已运行账号复用,未运行账号调用 `accounts.launch_for_login()` 启动;启动失败才 blocked 并弹窗中止。 - 2026-07-08:预检未登录账号不再 blocked,改为把该账号任务整组 `skipped` 并记原因;采集过程中若二次登录检测发现掉登录,则把该账号当前和剩余任务整组 `skipped` 为“采集中途掉登录”,不逐条重复失败。 - 2026-07-08:①采集完成后新增账号汇总弹窗:列出自动启动账号、需要补登录账号,并提示采集结束不会自动关闭账号 Chrome;未匹配别名仍逐行略过且不启动 Chrome。 - 2026-07-08:更新 GUI 单测,覆盖 Chrome 未运行时自动启动、启动失败阻断、预检未登录账号级略过、中途掉登录账号级略过、结束汇总弹窗;③更新侧不自动启动 Chrome 的测试保持不变。 - 验证通过:`python -m ruff check app tests main.py`、`py -3.10 -m compileall app main.py`、`py -3.10 -m unittest discover -s tests`。