Files
cmshoppe/docs/tasks/T-563.md
T

64 lines
4.6 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.
---
id: T-563
title: ①采集中途登录检测容错,避免 NO_SESSION_COOKIE 误判批量略过
phase: 2
deps: [T-207, T-560, T-562]
status: TODO
created: 2026-07-08
---
## 问题 / 背景
运行①「导入采集」时,偶发出现部分任务被标记为“略过”,但再次点击采集后又能成功。最近本地运行日志显示,触发原因是:
`采集中途掉登录: 账号未登录: NO_SESSION_COOKIE`
这不一定代表账号真的退出登录。当前 `CollectWorker` 在每条商品采集前都会再次调用 `accounts.detect_login()`,只要某一次检测结果为未登录,就会把该账号后续未采集任务全部写成 `status=skipped`。如果检测时 Chrome 页面刚好在跳转、商品 tab 刚被关闭/新建、CDP 暂时读不到 Shopee Cookie,`detect_login()` 可能返回 `NO_SESSION_COOKIE`,从而造成误判和批量略过。
需要把“明确未登录”和“登录状态暂时不确定”区分开:明确登录页可以跳过该账号后续任务;`NO_SESSION_COOKIE`、短暂 CDP 读取失败、检测超时等不应一次性跳过同账号剩余任务。
## 方案
1. **保留采集前账号预检**
- ①采集开始前仍按账号确保 Chrome 就绪,并做登录检测。
- 若明确检测到 `LOGIN_PAGE` 或登录页 URL(如 `accounts.shopee.tw/seller/login`),该账号任务仍整组略过并提示用户去④账号管理补登录。
- 采集前预检中的 `NO_SESSION_COOKIE` 应增加短暂重试,避免刚启动 Chrome 或页面尚未稳定时误判。
2. **中途登录检测改为容错判定**
- 在 `CollectWorker` 中封装中途登录检测确认逻辑,例如 `_midrun_login_status(account)`。
- 对 `NO_SESSION_COOKIE`、`LOGIN_CHECK_FAILED`、CDP 读取异常等不确定结果,等待短暂间隔后重试 2-3 次,并把每次 reason、URL、cookie 名称列表写入运行日志或诊断日志;不得记录 Cookie 值。
- 只有明确检测到登录页 URL / `LOGIN_PAGE` 时,才把该账号加入 `login_skip_reasons`,并跳过该账号后续任务。
- 连续 `NO_SESSION_COOKIE` 仍视为“不确定”,不批量略过后续任务;继续尝试当前商品采集,让 `open_product()` 的真实页面结果决定成功或失败。
3. **避免级联略过**
- 当前商品采集前如果登录状态不确定,不调用 `db.mark_skipped()`。
- 若后续 `editor.collect()` 打开商品页失败,应按现有失败链路写 `status=failed`、`last_error` 和 run log,不影响同账号后续任务。
- 只有明确掉登录时,才沿用现有“该账号剩余任务略过,并在结束汇总中提示补登录”的语义。
4. **日志与用户提示**
- 运行日志中把“不确定”写成用户能理解的中文,例如:`登录状态检测暂时不稳定,继续尝试采集当前商品`。
- 结束弹窗中的“以下账号需要补登录”只展示明确登录页/明确未登录的账号,不把单次 `NO_SESSION_COOKIE` 放进去。
- DB 运行日志和本地诊断日志保留脱敏细节:reason、URL、cookie 名称、重试次数、最终判定。
5. **测试**
- 增加/更新 `CollectWorker` 单测:
- 中途第一次 `NO_SESSION_COOKIE`、重试后已登录:当前任务继续采集成功,不跳过后续任务。
- 中途连续 `NO_SESSION_COOKIE`:当前任务继续走 `editor.collect()`;如果 collect 成功则成功,不产生 skipped。
- 中途明确 `LOGIN_PAGE`:当前账号当前及后续任务仍标记 `skipped`,并出现在 `login_required_accounts`。
- `LOGIN_CHECK_FAILED` 不应导致同账号后续任务批量略过。
## 验收要点
- 同一账号采集过程中,单次或连续 `NO_SESSION_COOKIE` 不会把该账号剩余任务批量标记为“略过”。
- 明确检测到 Shopee 登录页时,仍会跳过该账号剩余任务并提示用户补登录。
- 再次采集成功的瞬时波动场景,第一次运行应尽量继续采集;即使当前商品失败,也不能级联跳过后续全部商品。
- 用户可见日志使用中文,不暴露 Cookie 值、密码、token 或其它敏感信息。
- `python -m ruff check app tests main.py`、`py -3.10 -m compileall app main.py`、`py -3.10 -m unittest discover -s tests`、`git diff --check` 通过。
## 边界(不改什么)
只改①采集 worker 的登录检测容错和日志提示;不改账号自动登录,不保存或读取账号密码,不绕过 Shopee 验证码/风控,不改商品采集选择器,不改②AI生成、③更新蝦皮、Excel schema、DB schema 或 cmhub 逻辑。
## 执行记录