67 lines
5.3 KiB
Markdown
67 lines
5.3 KiB
Markdown
---
|
||
id: T-563
|
||
title: ①采集中途登录检测容错,避免 NO_SESSION_COOKIE 误判批量略过
|
||
phase: 2
|
||
deps: [T-207, T-560, T-562]
|
||
status: DONE
|
||
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` 中封装登录检测确认逻辑,例如 `_confirmed_login_status(account, context, task=None)`。
|
||
- 对 `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 逻辑。
|
||
|
||
## 执行记录
|
||
|
||
- 2026-07-08:完成。`CollectWorker` 增加登录检测重试与明确/不确定判定:`LOGIN_PAGE` 或登录页 URL 才整组略过;`NO_SESSION_COOKIE`、`LOGIN_CHECK_FAILED`、CDP 短暂异常重试后仍不确定时继续采集当前商品,不缓存到同账号后续任务。已同步 `docs/04-architecture.md` 和 `docs/routes.md`。
|
||
- 2026-07-08:补充单测覆盖中途 `NO_SESSION_COOKIE` 重试成功、连续 `NO_SESSION_COOKIE` 不略过、`LOGIN_CHECK_FAILED` 不批量略过、预检 `NO_SESSION_COOKIE` 不整组略过、明确 `LOGIN_PAGE` 仍整组略过。
|
||
- 2026-07-08:验证通过:`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`。
|