识别失效 PDD 商品链接返回首页并安全终止当前任务 #111

Closed
opened 2026-08-10 17:37:04 +08:00 by ila · 5 comments
Owner

基本信息

  • 类型:缺陷
  • 父级大工单:#1
  • 所属 MVP / 版本:MVP 后续 / PDD 页面识别与采购安全
  • 阶段:商品链接打开与页面分类
  • 关联工单:#72、#75、#109、#110

要解决什么

人工真机测试确认,失效的 PDD 商品链接具有以下实际跳转流程:

Android 浏览器打开商品 URL
→ 唤起 PDD App
→ PDD 尝试进入商品详情页
→ 打开失败
→ 返回 PDD 首页

当前 Client 在调用 open_url() 后主要等待商品详情页的“立即购买、发起拼单”等就绪标志。浏览器属于暂态页面,PDD 首页又不满足商品页标志,因此失效链接通常只能等待到 PDD_PAGE_TIMEOUT,无法与网络慢、浏览器未跳转、登录失效、验证码或风控区分。

此外,如果打开链接前设备停留在上一个商品页,仅判断商品页标志可能误用旧页面。采购任务必须在不可逆动作前确认本次链接确实打开了目标商品。

复现步骤

  1. 在 Android 浏览器打开一条已确认失效的 PDD 商品 URL。
  2. 浏览器唤起 PDD App。
  3. PDD 尝试进入商品详情页失败并返回首页。
  4. 当前 Client 未识别“商品不可用”,最终等待超时或停留在无法明确分类的页面。

做什么 / 不做什么

做

  • 为打开商品链接增加明确的页面跳转状态,至少区分:
    • 浏览器或外部应用跳转中;
    • PDD 启动或加载中;
    • 目标商品详情页;
    • PDD 首页;
    • 网络/服务异常页;
    • 登录页;
    • 验证码页;
    • 风控页;
    • 其他未知页。
  • 使用真实失效链接产生的脱敏控件树建立 PDD 首页测试夹具。
  • PDD 首页必须使用组合特征识别,不能只匹配单个“首页”文字:
    • PDD 包名或 PDD 控件树;
    • 首页底部导航等稳定结构;
    • 缺少商品详情页的可靠购买栏、标题和规格入口;
    • 页面已结束加载;
    • 连续多次读取保持相同页面类型。
  • 首次稳定返回首页只标记为“疑似商品不可用”,自动重新打开同一 URL 一次。
  • 第二次再次走到 PDD 首页,且始终没有识别到商品详情页,才返回:
    • 错误码:PDD_GOODS_UNAVAILABLE
    • 提示:商品链接已失效,PDD 无法打开商品详情页并返回了首页
    • 不可重试的当前任务业务失败。
  • 浏览器停留、网络异常、持续加载、登录、验证码和风控继续使用独立结果,不得归为商品失效。
  • 采集和采购使用同一页面分类规则或同一组经过测试的分类基础,避免两套规则漂移。
  • 当前任务确认商品失效后停止采集或采购,不选择规格、不创建订单;持续自动任务模式继续领取下一条任务。
  • 打开前后记录不含敏感信息的页面类型和跳转阶段,便于诊断。
  • 在采购不可逆动作前确认已进入本次任务对应的商品页;无法确认或商品身份不匹配时禁止继续。

不做

  • 不因一次短暂出现 PDD 首页就立即判定商品失效。
  • 不把单纯超时、白屏、网络失败或浏览器未唤起 PDD 判断为永久失效。
  • 不复用上一个任务的 XML、页面分类、标题、规格或坐标。
  • 不修改 Admin API、数据库结构、pdd_data 和任务状态定义;如实施时发现必须修改,先更新工单并重新确认范围。
  • 不绕过登录、验证码、风控和平台安全机制。
  • 不打开真实下单默认开关,不自动付款。
  • 不使用真实下单验证本工单。

已确认的实现方案

  1. 在现有打开商品页等待逻辑中引入有限状态分类,不使用单一固定文本作为页面结论。
  2. 调用 open_url() 前记录当前页面类型或脱敏签名,用于发现“仍停留在上一个商品页”;不得将该签名作为新任务的业务数据复用。
  3. 调用后允许浏览器、PDD 启动页和短暂首页作为过渡状态,持续观察到以下终态之一:
    • 目标商品详情页:成功;
    • 登录/验证码/风控:按现有人工处理错误结束;
    • 网络错误或持续加载:返回可重试加载失败;
    • 稳定 PDD 首页:进入一次受控重试;
    • 未知页面达到超时:返回未知或加载超时。
  4. 首页稳定条件至少包含连续 2~3 次相同分类,并预留足够的深链跳转宽限时间,避免“先首页、后详情”的正常慢跳转被误判。
  5. 只允许为“疑似商品不可用”重新打开链接一次。第二次仍稳定回到首页才生成 PDD_GOODS_UNAVAILABLE。
  6. 商品失效属于当前任务不可重试的业务失败,但不能让持续自动获取停止;调度层应继续处理下一条任务。
  7. 采购路径在任何规格选择和不可逆动作前调用相同的可靠商品页确认;页面未知、旧商品页或商品身份不匹配均不得继续。
  8. 保存脱敏诊断时仅记录 task_id、页面类型、跳转阶段、尝试次数和必要的夹具引用,不记录 token、Cookie、密码、收货信息或完整个人数据。

预计修改文件(Codex 实施前按实际代码确认):

  • client/src/pdd_collect_service.py
  • client/src/pdd_u2_purchase_adapter.py
  • client/src/collect_task_service.py
  • client/src/purchase_task_service.py
  • client/src/task_dispatcher.py 或实际自动调度分类位置
  • Client 页面识别相关测试与脱敏 XML fixture
  • 必要的 docs/client/ 稳定错误码或流程文档

验收标准

  • 有效链接经过“浏览器 → PDD → 商品详情页”后正常继续,不被首页过渡误判。
  • 已确认失效的链接第一次稳定回到 PDD 首页时只触发一次受控重试。
  • 同一失效链接第二次仍稳定返回首页时,返回 PDD_GOODS_UNAVAILABLE 和明确中文提示。
  • 商品失效后不选择规格、不创建订单、不进入任何不可逆动作。
  • 商品失效只结束当前任务;持续自动任务模式继续处理下一条任务。
  • 浏览器未跳转、网络错误、持续加载、登录、验证码、风控和未知页面不会被错误归类为商品失效。
  • 打开失败后停留在上一个商品详情页时,不会误认为本次目标商品打开成功。
  • 采购路径无法确认目标商品身份时返回明确错误并禁止继续。
  • 首页识别由真实真机脱敏 XML fixture 覆盖,且至少包含首页、有效商品页、失效返回首页、网络异常、登录和验证码用例。
  • 采集和采购页面分类结果一致,或共享同一经过测试的分类基础。
  • 日志和测试夹具不包含凭据、Cookie、收货信息等敏感数据。
  • 相关专项测试和 Client 全量测试通过。
  • 真实下单开关仍默认关闭,未执行真实下单或付款。

验证方式

从 client/ 目录执行:

C:/Python310/python.exe -m unittest discover -s test -p "test_pdd_collect_service.py"
C:/Python310/python.exe -m unittest discover -s test -p "test_pdd_u2_purchase_adapter.py"
C:/Python310/python.exe -m unittest discover -s test -p "test_purchase_task_service.py"
C:/Python310/python.exe -m unittest discover -s test -p "test_pdd_ui_event.py"
C:/Python310/python.exe -m unittest discover -s test -p "test_*.py"

真机验证:

  1. 使用一条有效 PDD 商品链接,确认浏览器唤起 PDD 后进入详情页。
  2. 使用一条已确认失效的链接,确认两次均返回首页后得到 PDD_GOODS_UNAVAILABLE。
  3. 模拟断网或网络异常,确认结果是可重试加载失败而非商品失效。
  4. 验证登录、验证码或风控页面保持独立分类。
  5. 在上一个商品页停留时打开另一条失效链接,确认不会误用旧商品页面。
  6. 全程使用采集或采购 dry_run,不执行真实下单。

风险和回退

  • 风险:首页 UI 会随 PDD 版本、灰度配置和设备分辨率变化;过早判定会把慢跳转误认为失效;过宽的商品页判断可能误用旧商品。
  • 控制:使用组合结构特征、连续稳定读数、一次受控重试及真实 XML fixture;安全判断默认失败关闭,无法确认时禁止采购。
  • 回退:页面分类和 PDD_GOODS_UNAVAILABLE 映射保持独立提交,可回退到原超时行为;不涉及数据库和 Admin 数据回滚。
## 基本信息 - 类型:缺陷 - 父级大工单:#1 - 所属 MVP / 版本:MVP 后续 / PDD 页面识别与采购安全 - 阶段:商品链接打开与页面分类 - 关联工单:#72、#75、#109、#110 ## 要解决什么 人工真机测试确认,失效的 PDD 商品链接具有以下实际跳转流程: ```text Android 浏览器打开商品 URL → 唤起 PDD App → PDD 尝试进入商品详情页 → 打开失败 → 返回 PDD 首页 ``` 当前 Client 在调用 `open_url()` 后主要等待商品详情页的“立即购买、发起拼单”等就绪标志。浏览器属于暂态页面,PDD 首页又不满足商品页标志,因此失效链接通常只能等待到 `PDD_PAGE_TIMEOUT`,无法与网络慢、浏览器未跳转、登录失效、验证码或风控区分。 此外,如果打开链接前设备停留在上一个商品页,仅判断商品页标志可能误用旧页面。采购任务必须在不可逆动作前确认本次链接确实打开了目标商品。 ### 复现步骤 1. 在 Android 浏览器打开一条已确认失效的 PDD 商品 URL。 2. 浏览器唤起 PDD App。 3. PDD 尝试进入商品详情页失败并返回首页。 4. 当前 Client 未识别“商品不可用”,最终等待超时或停留在无法明确分类的页面。 ## 做什么 / 不做什么 ### 做 - 为打开商品链接增加明确的页面跳转状态,至少区分: - 浏览器或外部应用跳转中; - PDD 启动或加载中; - 目标商品详情页; - PDD 首页; - 网络/服务异常页; - 登录页; - 验证码页; - 风控页; - 其他未知页。 - 使用真实失效链接产生的脱敏控件树建立 PDD 首页测试夹具。 - PDD 首页必须使用组合特征识别,不能只匹配单个“首页”文字: - PDD 包名或 PDD 控件树; - 首页底部导航等稳定结构; - 缺少商品详情页的可靠购买栏、标题和规格入口; - 页面已结束加载; - 连续多次读取保持相同页面类型。 - 首次稳定返回首页只标记为“疑似商品不可用”,自动重新打开同一 URL 一次。 - 第二次再次走到 PDD 首页,且始终没有识别到商品详情页,才返回: - 错误码:`PDD_GOODS_UNAVAILABLE` - 提示:`商品链接已失效,PDD 无法打开商品详情页并返回了首页` - 不可重试的当前任务业务失败。 - 浏览器停留、网络异常、持续加载、登录、验证码和风控继续使用独立结果,不得归为商品失效。 - 采集和采购使用同一页面分类规则或同一组经过测试的分类基础,避免两套规则漂移。 - 当前任务确认商品失效后停止采集或采购,不选择规格、不创建订单;持续自动任务模式继续领取下一条任务。 - 打开前后记录不含敏感信息的页面类型和跳转阶段,便于诊断。 - 在采购不可逆动作前确认已进入本次任务对应的商品页;无法确认或商品身份不匹配时禁止继续。 ### 不做 - 不因一次短暂出现 PDD 首页就立即判定商品失效。 - 不把单纯超时、白屏、网络失败或浏览器未唤起 PDD 判断为永久失效。 - 不复用上一个任务的 XML、页面分类、标题、规格或坐标。 - 不修改 Admin API、数据库结构、`pdd_data` 和任务状态定义;如实施时发现必须修改,先更新工单并重新确认范围。 - 不绕过登录、验证码、风控和平台安全机制。 - 不打开真实下单默认开关,不自动付款。 - 不使用真实下单验证本工单。 ## 已确认的实现方案 1. 在现有打开商品页等待逻辑中引入有限状态分类,不使用单一固定文本作为页面结论。 2. 调用 `open_url()` 前记录当前页面类型或脱敏签名,用于发现“仍停留在上一个商品页”;不得将该签名作为新任务的业务数据复用。 3. 调用后允许浏览器、PDD 启动页和短暂首页作为过渡状态,持续观察到以下终态之一: - 目标商品详情页:成功; - 登录/验证码/风控:按现有人工处理错误结束; - 网络错误或持续加载:返回可重试加载失败; - 稳定 PDD 首页:进入一次受控重试; - 未知页面达到超时:返回未知或加载超时。 4. 首页稳定条件至少包含连续 2~3 次相同分类,并预留足够的深链跳转宽限时间,避免“先首页、后详情”的正常慢跳转被误判。 5. 只允许为“疑似商品不可用”重新打开链接一次。第二次仍稳定回到首页才生成 `PDD_GOODS_UNAVAILABLE`。 6. 商品失效属于当前任务不可重试的业务失败,但不能让持续自动获取停止;调度层应继续处理下一条任务。 7. 采购路径在任何规格选择和不可逆动作前调用相同的可靠商品页确认;页面未知、旧商品页或商品身份不匹配均不得继续。 8. 保存脱敏诊断时仅记录 task_id、页面类型、跳转阶段、尝试次数和必要的夹具引用,不记录 token、Cookie、密码、收货信息或完整个人数据。 预计修改文件(Codex 实施前按实际代码确认): - `client/src/pdd_collect_service.py` - `client/src/pdd_u2_purchase_adapter.py` - `client/src/collect_task_service.py` - `client/src/purchase_task_service.py` - `client/src/task_dispatcher.py` 或实际自动调度分类位置 - Client 页面识别相关测试与脱敏 XML fixture - 必要的 `docs/client/` 稳定错误码或流程文档 ## 验收标准 - [ ] 有效链接经过“浏览器 → PDD → 商品详情页”后正常继续,不被首页过渡误判。 - [ ] 已确认失效的链接第一次稳定回到 PDD 首页时只触发一次受控重试。 - [ ] 同一失效链接第二次仍稳定返回首页时,返回 `PDD_GOODS_UNAVAILABLE` 和明确中文提示。 - [ ] 商品失效后不选择规格、不创建订单、不进入任何不可逆动作。 - [ ] 商品失效只结束当前任务;持续自动任务模式继续处理下一条任务。 - [ ] 浏览器未跳转、网络错误、持续加载、登录、验证码、风控和未知页面不会被错误归类为商品失效。 - [ ] 打开失败后停留在上一个商品详情页时,不会误认为本次目标商品打开成功。 - [ ] 采购路径无法确认目标商品身份时返回明确错误并禁止继续。 - [ ] 首页识别由真实真机脱敏 XML fixture 覆盖,且至少包含首页、有效商品页、失效返回首页、网络异常、登录和验证码用例。 - [ ] 采集和采购页面分类结果一致,或共享同一经过测试的分类基础。 - [ ] 日志和测试夹具不包含凭据、Cookie、收货信息等敏感数据。 - [ ] 相关专项测试和 Client 全量测试通过。 - [ ] 真实下单开关仍默认关闭,未执行真实下单或付款。 ## 验证方式 从 `client/` 目录执行: ```powershell C:/Python310/python.exe -m unittest discover -s test -p "test_pdd_collect_service.py" C:/Python310/python.exe -m unittest discover -s test -p "test_pdd_u2_purchase_adapter.py" C:/Python310/python.exe -m unittest discover -s test -p "test_purchase_task_service.py" C:/Python310/python.exe -m unittest discover -s test -p "test_pdd_ui_event.py" C:/Python310/python.exe -m unittest discover -s test -p "test_*.py" ``` 真机验证: 1. 使用一条有效 PDD 商品链接,确认浏览器唤起 PDD 后进入详情页。 2. 使用一条已确认失效的链接,确认两次均返回首页后得到 `PDD_GOODS_UNAVAILABLE`。 3. 模拟断网或网络异常,确认结果是可重试加载失败而非商品失效。 4. 验证登录、验证码或风控页面保持独立分类。 5. 在上一个商品页停留时打开另一条失效链接,确认不会误用旧商品页面。 6. 全程使用采集或采购 dry_run,不执行真实下单。 ## 风险和回退 - 风险:首页 UI 会随 PDD 版本、灰度配置和设备分辨率变化;过早判定会把慢跳转误认为失效;过宽的商品页判断可能误用旧商品。 - 控制:使用组合结构特征、连续稳定读数、一次受控重试及真实 XML fixture;安全判断默认失败关闭,无法确认时禁止采购。 - 回退:页面分类和 `PDD_GOODS_UNAVAILABLE` 映射保持独立提交,可回退到原超时行为;不涉及数据库和 Admin 数据回滚。
Author
Owner

状态:待实施。本轮仅完成工单创建与父工单 #1 回填,未修改代码、未提交 Git。实施前先从真实失效链接跳转流程采集并脱敏 PDD 首页控件树,再按正文状态机和验收标准开发。

状态:**待实施**。本轮仅完成工单创建与父工单 #1 回填,未修改代码、未提交 Git。实施前先从真实失效链接跳转流程采集并脱敏 PDD 首页控件树,再按正文状态机和验收标准开发。
Author
Owner

状态更新为 进行中。开始按工单范围检查采集/采购共用页面分类、旧商品页防误判、一次受控重开和持续自动获取续跑逻辑。真实下单默认关闭;真机阶段只允许读取控件树或执行采集/dry_run,不创建订单、不付款。当前工作区已有 UI、脚本及 XML 未提交内容,将保留且不混入本工单。

状态更新为 **进行中**。开始按工单范围检查采集/采购共用页面分类、旧商品页防误判、一次受控重开和持续自动获取续跑逻辑。真实下单默认关闭;真机阶段只允许读取控件树或执行采集/dry_run,不创建订单、不付款。当前工作区已有 UI、脚本及 XML 未提交内容,将保留且不混入本工单。
Author
Owner

状态更新为 待验收(代码准备提交)。

已完成:

  • 新增采集/采购共用 PDD 页面分类器,区分外部应用、加载、商品页、首页、网络、登录、验证码、风控、支付/确认和未知页。
  • 使用真机读取后裁剪脱敏的 PDD 首页 XML 固件;兼容部分 OPPO/ColorOS 焦点包名误报。
  • 稳定首页第一次只重开同一 URL,第二次返回 PDD_GOODS_UNAVAILABLE;网络等异常不误判为链接失效。
  • 打开前后商品页签名相同则拒绝旧页面;采集/采购均在任何规格点击前停止。
  • 商品失效落为不可重试的当前任务失败并提交 Admin,连续自动获取继续下一条。
  • 未修改 Admin API、数据库结构、pdd_data 或状态枚举;真实下单默认关闭,未执行下单/付款。

验证:

  • Client 全量:329 tests,通过。
  • 离屏主窗口:输出 OK,通过。
  • Python 语法与 git diff --check:通过。
  • 真机只读取并脱敏首页控件树,未点击规格、下单或付款。
  • 未验证:缺少一条用户确认仍然失效的真实商品链接,因此尚未执行“同一失效链接两次返回首页”的真机端到端;该行为已由真机首页 fixture 和采集/采购状态机测试覆盖。
状态更新为 **待验收(代码准备提交)**。 已完成: - 新增采集/采购共用 PDD 页面分类器,区分外部应用、加载、商品页、首页、网络、登录、验证码、风控、支付/确认和未知页。 - 使用真机读取后裁剪脱敏的 PDD 首页 XML 固件;兼容部分 OPPO/ColorOS 焦点包名误报。 - 稳定首页第一次只重开同一 URL,第二次返回 `PDD_GOODS_UNAVAILABLE`;网络等异常不误判为链接失效。 - 打开前后商品页签名相同则拒绝旧页面;采集/采购均在任何规格点击前停止。 - 商品失效落为不可重试的当前任务失败并提交 Admin,连续自动获取继续下一条。 - 未修改 Admin API、数据库结构、pdd_data 或状态枚举;真实下单默认关闭,未执行下单/付款。 验证: - Client 全量:`329 tests`,通过。 - 离屏主窗口:输出 `OK`,通过。 - Python 语法与 `git diff --check`:通过。 - 真机只读取并脱敏首页控件树,未点击规格、下单或付款。 - 未验证:缺少一条用户确认仍然失效的真实商品链接,因此尚未执行“同一失效链接两次返回首页”的真机端到端;该行为已由真机首页 fixture 和采集/采购状态机测试覆盖。
Author
Owner

实现与归档已提交,工单进入 待用户验收,暂不关闭。

  • 实现提交:8c9dbfe(fix: 识别失效商品链接返回首页 (#111))
  • 归档提交:8188153(docs: 归档任务 #111)
  • 本地归档:docs/task/111-识别失效PDD商品链接返回首页.md
  • 全量回归:329 个测试通过
  • 离屏主窗口:通过(OK)
  • 安全说明:真实下单开关未打开;没有创建订单、下单或付款

待用户验收后再关闭 #111,并同步父工单 #1。真机失效链接端到端未执行的原因和替代覆盖已写入归档。

实现与归档已提交,工单进入 **待用户验收**,暂不关闭。 - 实现提交:`8c9dbfe`(`fix: 识别失效商品链接返回首页 (#111)`) - 归档提交:`8188153`(`docs: 归档任务 #111`) - 本地归档:`docs/task/111-识别失效PDD商品链接返回首页.md` - 全量回归:329 个测试通过 - 离屏主窗口:通过(`OK`) - 安全说明:真实下单开关未打开;没有创建订单、下单或付款 待用户验收后再关闭 #111,并同步父工单 #1。真机失效链接端到端未执行的原因和替代覆盖已写入归档。
Author
Owner

用户已于 2026-08-11 明确验收通过。

  • 本地归档状态已更新为“已完成,用户验收通过”
  • 验收记录提交:eca9289
  • 本工单按项目流程关闭
用户已于 2026-08-11 明确验收通过。 - 本地归档状态已更新为“已完成,用户验收通过” - 验收记录提交:`eca9289` - 本工单按项目流程关闭
ila closed this issue 2026-08-11 10:58:29 +08:00
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chengma/cmautobuy#111