2026-08-04 09:07:44 +08:00
|
|
|
|
---
|
|
|
|
|
|
id: T-102
|
|
|
|
|
|
title: 验证按链接打开商品详情页
|
|
|
|
|
|
phase: 1
|
|
|
|
|
|
deps: [T-101]
|
2026-08-04 09:10:00 +08:00
|
|
|
|
status: DOING
|
2026-08-04 09:07:44 +08:00
|
|
|
|
created: 2026-08-04
|
|
|
|
|
|
vikunja_task_id: 22
|
|
|
|
|
|
context_ref: 393f26d
|
|
|
|
|
|
work_branch: task/t-102-open-product
|
|
|
|
|
|
needs_device: true
|
|
|
|
|
|
needs_human_review: true
|
|
|
|
|
|
write_paths:
|
|
|
|
|
|
- docs/tasks/T-102.md
|
|
|
|
|
|
- client/src/cmbuyer_client/pdd/**
|
|
|
|
|
|
- client/src/cmbuyer_client/device/**
|
|
|
|
|
|
- client/tests/pdd/**
|
|
|
|
|
|
- client/tests/device/**
|
|
|
|
|
|
- client/scripts/capture_product_open.py
|
|
|
|
|
|
- docs/03-tech-stack.md
|
|
|
|
|
|
- docs/04-architecture.md
|
|
|
|
|
|
- docs/current-state.md
|
|
|
|
|
|
---
|
|
|
|
|
|
|
2026-08-04 09:34:53 +08:00
|
|
|
|
<!-- BEGIN VIKUNJA EXPORT id=22 synced=2026-08-04T01:34:52Z sha256=24a709502750b026a73f592362fdfa4f2fdd3b03ba7ae0b46c3fd70c8add257a -->
|
2026-08-04 09:07:44 +08:00
|
|
|
|
## 问题 / 背景
|
|
|
|
|
|
|
|
|
|
|
|
T-101 已证明同一台 PKG110(Android 16、拼多多 8.17.0)可通过 USB/WiFi 显式 serial 完成只读截图与完整 XML 取证。MVP 下一风险是任务自带的合法拼多多链接能否由 Android intent 打开到对应商品详情页。此前项目和旧文档不能证明当前 App 的行为;若先写详情页判据,会把未经本项目真机验证的假设带入 T-103。
|
|
|
|
|
|
|
|
|
|
|
|
## 关联需求与交互
|
|
|
|
|
|
|
|
|
|
|
|
- 功能:F-006 的第一步 `open_product(url)`;仅覆盖链接打开,不覆盖规格面板、规格选择或价格。
|
|
|
|
|
|
- 用户故事 / 交互:采购工具执行链接任务前的只读真机 spike;无生产 GUI。
|
|
|
|
|
|
- 架构 / API:`docs/04-architecture.md` 第三节 A 路径;`docs/api.md` 的 canonical `product_url` / `goods_id` 示例;T-103 前置。
|
|
|
|
|
|
|
|
|
|
|
|
## 方案
|
|
|
|
|
|
|
|
|
|
|
|
1. 只接受 HTTPS canonical 链接 `https://mobile.yangkeduo.com/goods.html?goods_id=<纯数字>`;拒绝 userinfo、非默认端口、fragment、重复/缺失/非数字 goods_id、其他 host/path 和额外业务参数。解析后由代码按 goods_id 重建 canonical URL,绝不把任意输入拼入 shell。
|
|
|
|
|
|
2. 复用 T-101 的显式 serial、同机多通道 fail-closed、no-reconnect、类型化超时和原子证据发布边界;运行拼多多版本必须精确等于本项目已取证的 8.17.0,否则在打开链接前停止。
|
|
|
|
|
|
3. 通过参数数组执行只含 Android `VIEW` intent 语义的 `adb shell am start -W`,显式限定包 `com.xunmeng.pinduoduo`;不使用 shell 字符串、不点击/滑动/输入任何控件。Android 命令失败、超时、未解析 intent、未停留在拼多多包、截图/XML 失败分别给出脱敏错误。
|
|
|
|
|
|
4. 启动后只读取 current app/package、截图和 `dumpWindowHierarchy(compressed=False)`,manifest 记录 goods_id、canonical URL、设备/App 元数据、命令结果摘要、路径与 SHA-256,不记录页面全文或原始 serial。原始截图/XML 仅存 `%LOCALAPPDATA%`,不提交 Git。
|
|
|
|
|
|
5. 离线 mock 测试覆盖 URL 正反例、参数数组与超时、版本失配在 intent 前停止、包不匹配、无 UI 点击 API、证据原子性和异常脱敏。代码完成后由人使用一个明确 goods_id 在仅单通道在线的真机执行,人工确认截图确为对应商品详情页并检查 XML/截图无敏感信息;再把设备、Android、拼多多版本、goods_id、路径、SHA-256 与结论写入执行记录。
|
|
|
|
|
|
|
|
|
|
|
|
## 验收要点
|
|
|
|
|
|
|
|
|
|
|
|
- 合法 canonical 链接可在拼多多 8.17.0 上打开;人工确认到达与 goods_id 对应的商品详情页。
|
|
|
|
|
|
- 非法链接、设备状态、App 版本失配、intent 失败/超时、落在非拼多多包、证据失败均有可区分且不泄露页面内容的错误。
|
|
|
|
|
|
- 取证记录包含 PKG110、Android 16、连接方式、拼多多 8.17.0、goods_id、canonical URL、截图/XML 本地路径与 SHA-256。
|
|
|
|
|
|
- client 全部单测、compileall、wheel metadata、上下文校验及完整 `init.ps1` 通过。
|
|
|
|
|
|
- `needs_device=true`:agent 只能完成离线实现并保持 DOING;只有人完成真机链接打开、页面对应性与隐私检查后才能 DONE。
|
|
|
|
|
|
|
|
|
|
|
|
## 执行记录
|
|
|
|
|
|
|
2026-08-04 09:10:00 +08:00
|
|
|
|
### 2026-08-04T01:09:47Z · ila
|
|
|
|
|
|
|
|
|
|
|
|
2026-08-04:已认领 T-102,工作分支 `task/t-102-open-product`,从任务定义提交 `4281b06` 开始实现。离线阶段只实现严格 canonical URL 校验、Android VIEW intent、版本/设备 fail-closed 与原子证据采集;不写商品详情页节点判据,不操作任何 App 控件。`needs_device=true`,离线实现完成后仍保持 DOING,等待人工提供明确商品链接并完成真机页面对应性和隐私验收。
|
2026-08-04 09:27:23 +08:00
|
|
|
|
|
|
|
|
|
|
### 2026-08-04T01:27:08Z · ila
|
|
|
|
|
|
|
|
|
|
|
|
2026-08-04:T-102 离线实现已由子 agent 完成并经主 agent 独立审查、两轮退回修正后通过,代码提交 `7040bb6`。实现包含:唯一 canonical 商品 URL 校验与重建、ADB 内层纯数字 goods_id 二次围栏、固定 package 的 Android VIEW intent、拼多多 8.17.0 intent 前版本围栏、前台 package 核验,以及截图/XML 原子取证与脱敏 manifest;无点击、滑动、输入、规格、价格、下单或支付能力,也未写商品详情页节点/Activity 判据。主审验证:43 项 client 离线测试、compileall、完整 init.ps1(含 admin test/vet/build)、wheel metadata、agent-context 与 diff-check 均通过;当前 wheel SHA-256 为 c675cd527849149ec25f213a0d67da31d0bb497cd8c5ed255d71154c103659ed(审计临时产物已清理)。未连接或操作真机,T-102 继续保持 DOING,等待人工使用明确 canonical 商品链接执行取证,并确认页面对应性与隐私。
|
2026-08-04 09:32:54 +08:00
|
|
|
|
|
|
|
|
|
|
### 2026-08-04T01:32:31Z · ila
|
|
|
|
|
|
|
|
|
|
|
|
2026-08-04 人工真机首轮:使用 WiFi serial `192.168.0.173:5555` 与 canonical 商品链接 `https://mobile.yangkeduo.com/goods.html?goods_id=958756616606` 执行 T-102 脚本。脚本通过 URL/intent 前置围栏,但在 intent 后返回“商品链接打开后前台应用不是拼多多”,按 fail-closed 规则停止,未发布完整取证。人在 Chrome 中可打开该 URL,只能证明网页链接有效,不能证明拼多多 App 已接管。T-102 保持 DOING;下一步由人只读取当前前台 package,区分瞬时切换/检查过早与实际落到 Chrome、系统解析器或其他包,在得到事实前不移除 package 围栏、不增加页面判据或 UI 兜底。
|
2026-08-04 09:34:53 +08:00
|
|
|
|
|
|
|
|
|
|
### 2026-08-04T01:34:39Z · ila
|
|
|
|
|
|
|
|
|
|
|
|
2026-08-04 人工追加诊断:T-102 首轮返回前台包不符后,人在未切换 App 的情况下立即执行只读 `dumpsys window`,得到 `mCurrentFocus` 与 `mFocusedApp` 均为 `com.xunmeng.pinduoduo/com.xunmeng.pinduoduo.activity.NewPageActivity`。该事实证明失败返回后前台已稳定到拼多多,支持“一次性 app_current 检查过早/存在异步切换窗口”的诊断;Activity 名只记录为诊断证据,不作为商品详情页判据。修复保持 package 围栏:改为有限时长、只读 package 的轮询,超时仍 fail closed,期间不点击、滑动、输入或读取页面节点。
|
2026-08-04 09:07:44 +08:00
|
|
|
|
<!-- END VIKUNJA EXPORT -->
|
|
|
|
|
|
|
|
|
|
|
|
## 边界
|
|
|
|
|
|
|
|
|
|
|
|
- 本任务只验证由显式 canonical 链接启动拼多多并采集本地证据;不编写或声称商品详情页节点判据,
|
|
|
|
|
|
页面是否为对应商品必须由人查看本项目新产物确认。
|
|
|
|
|
|
- 只允许 Android `VIEW` intent;不点击、滑动、长按、输入任何 App 控件,不打开规格面板,不选择
|
|
|
|
|
|
颜色或尺码,不读取价格,不进入购买或订单页面。
|
|
|
|
|
|
- 不引用或实现 `go_to_order_confirm()`、`submit_order()`、提交订单、付款、支付、授权或采购服务接口;
|
|
|
|
|
|
不把前序项目的 URL、activity、节点文本或页面结论当作事实。
|
|
|
|
|
|
- 输入 URL 必须先严格解析并按纯数字 `goods_id` 重建,再以参数数组传给 ADB;禁止 shell 拼接、
|
|
|
|
|
|
任意 scheme/host/path、短链跳转、额外参数或自动猜测链接。
|
|
|
|
|
|
- 运行拼多多版本与本项目已取证版本不一致时必须在 intent 前停止;证据失败、当前包不符或结果无法
|
|
|
|
|
|
由人确认时均不得声称成功,不增加自动点击或其他兜底路径。
|
|
|
|
|
|
- 截图和完整 XML 只保存在明确的本地 T-102 目录,人工检查后只把路径、SHA-256 与非敏感元数据
|
|
|
|
|
|
写入执行记录;不得提交原始证据,不记录地址、手机号、支付信息或无关页面正文。
|
|
|
|
|
|
- 不修改 `admin/`、业务 API、数据模型、生产 GUI 或 T-103 规格面板逻辑。
|
|
|
|
|
|
- `needs_device: true`:agent 完成离线实现后保持 `DOING`;只有人使用明确 goods_id 完成真机打开、
|
|
|
|
|
|
确认对应商品详情页并完成隐私检查后才能标 `DONE`。
|