采集颜色配图:Agent 截图后按节点边界裁剪并上传 Admin #133

Closed
opened 2026-08-28 16:50:27 +08:00 by ila · 9 comments
Owner

所属与来源

  • 关联工单:#124 颜色维度采集缺陷(前置)、#115 识别文案迁入规则、#116 门禁与校验分级。
  • 来源:用户于 2026-08-28 提出:需要把 PDD 商品页上每个颜色对应的图片保存下来并上传 Admin。经讨论确认:服务端解析原图不可行(实测商品页为 JS 壳、数据走接口且有反爬),因此采用 Agent 端截图后按节点边界裁剪 的方案;跳大图页的高清方案暂不采用,图片为可选数据,失败不影响采集。用户于同日确认修改 AGENTS.md 中「不保存设备截图」这条永久规则。
  • 类型:规则修订 + Android Agent + Server + Admin / 商品颜色配图采集。
  • 设计证据:Agent 端不新增页面与交互(截图在既有颜色遍历中完成,无用户操作);Admin 端在商品详情展示已有数据的图片,属现有页面的小范围扩展。v1 标注稿(用户于 2026-08-28 确认):https://git.ilapage.cn/attachments/2f1c20e2-5234-47a7-b7ea-bbef424a9bfc;覆盖有图、无图占位、点击预览与替代文本。
  • 工具回退说明:本工单通过 Gitea API 创建;当前会话未提供 Gitea MCP 工具,按 AGENTS.md「Gitea 交互与工单最小读取」记录回退原因。

当前事实

服务端解析原图不可行(已实测)

2026-08-28 以移动端 UA 请求 https://mobile.yangkeduo.com/goods.html?goods_id=971612375909:返回 200、约 64KB,正文中不含任何 thumb_url 等图片地址,商品数据由 JS 异步加载,且页面含 anti / VERIFY 等反爬标识。此前短链解析可行是因为那只是 307 跳转,不涉及取数据。因此「颜色 ↔ 图片」的对应关系只能在设备端、面板已渲染时取得。

控件树证据(用户提供的规格面板 dump)

每个颜色是一个卡片,结构如下(紫色为例):

ViewGroup   desc="  紫色1700"  clickable=true  selected=true   [36,1188][352,1591]
 ├ View      选中态背景
 ├ ImageView desc="  紫色1700" clickable=true  [36,1188][352,1504]   ← 颜色图,316×316
 ├ ImageView desc="打开大图"    clickable=true  [36,1188][147,1299]   ← 大图入口(本工单不使用)
 ├ TextView  "74%人选择"
 └ TextView  "  紫色1700"(tv_content)

浅粉卡片同构,图片节点为 [382,1188][698,1504],且在 selected="false" 时同样可用。

由此确认:

  • 每个颜色卡片内均有独立的图片节点,尺寸约 316×316,无需先选中该颜色即可取得;
  • 两个颜色卡片的「打开大图」content-desc 相同,全局查找必然多命中;本工单虽不使用该入口,但同一约束适用于图片节点定位——必须在颜色卡片子树内查找。

个人数据风险(必须处理)

同一棵树中,规格面板上方存在收货人手机尾号与详细地址文本节点([132,456][993,505] 等)。整屏截图会把这些一并保存,因此只允许保存裁剪后的图片区域,这是本工单的硬约束,也是规则修订必须写清的边界。

目标

  1. 采集颜色规格时,为每个颜色保存一张与之对应的商品图片。
  2. 图片为可选数据:任一环节失败都不影响采集结果与既有判定。
  3. 全流程不保存整屏截图、控件树与任何个人数据。
  4. Admin 中可查看每个颜色对应的图片。

非目标

  • 不使用「打开大图」跳转方案:需额外的页面跳转、稳定等待与面板恢复校验,新增失败模式,且大图页同样需要裁剪。若后续证明 316×316 分辨率不足,另行建单。
  • 不修改颜色/尺码的遍历算法与判定逻辑(#124 范围)。
  • 不修改采集结果字段的既有语义与完整性判定(图片缺失不得计入 missing,也不得影响 completed / completed_partial 判定)。
  • 不保存整屏截图、原始控件树、XML。
  • 不采集尺码维度的图片(本期只做颜色)。
  • 不涉及采购、下单、支付与地址。

实施方案

一、规则修订(前置,用户已确认)

AGENTS.md 第 1 节现表述:

不保存原始控件树和设备截图;只保存结构化任务日志、错误码、任务规则快照和采集结果。

修订为:

不保存原始控件树和整屏设备截图;允许保存按规格值节点边界裁剪的商品图片区域,且裁剪结果不得包含账号、地址、订单、支付及其他个人数据。除此之外只保存结构化任务日志、错误码、任务规则快照和采集结果。

同步更新 Wiki Business-Rules-and-Glossary 的安全边界描述,并在本工单记录用户于 2026-08-28 的确认。

二、Agent 端

  1. 使用 AccessibilityService.takeScreenshot()(API 30+)取整屏 Bitmap;设备低于该版本时跳过图片采集,不报错。
  2. 在颜色卡片子树内定位图片节点:以颜色值对应的卡片 ViewGroup 为父,取其后代中与该颜色同 content-desc 的 ImageView。禁止全局查找——同名节点必然多命中。
  3. 按该节点 bounds 裁剪:Bitmap.createBitmap(shot, left, top, width, height);整屏 Bitmap 用后立即回收,不得落盘。
  4. 裁剪结果压为 JPEG(建议质量 85),单张与单任务总量设上限,超限则跳过并记录。
  5. 采集时机:在既有颜色遍历中顺带完成,不新增点击、不新增页面跳转、不新增用户操作。
  6. 任一环节失败(截图权限不足、节点定位失败、裁剪越界、压缩异常)均跳过该颜色的图片,继续采集,并记入诊断。

三、上传

  1. 服务端新增图片接收接口;Agent 在采集结果提交成功后单独上传,不与采集结果同一请求——避免图片过大导致结果提交失败。
  2. 上传失败不重试到影响任务时长,也不改变任务状态;失败记入诊断。
  3. 服务端校验:内容类型、单张大小、单任务张数上限;拒绝非图片内容。

四、服务端与 Admin

  1. 图片与「PDD 商品 + 颜色值」建立对应关系落库;同一颜色重复上传以最新一张为准。
  2. 存储沿用服务端既有 uploadfile 静态文件能力,不引入新的对象存储依赖。
  3. Admin 商品详情按颜色展示对应图片;无图时显示占位,不报错。

五、诊断

  1. 复用 #124 的 COLOR_DISCOVERY 或新增独立阶段,记录:尝试张数、成功张数、失败原因分类(不支持、定位失败、裁剪失败、压缩失败、上传失败)。诊断不记录图片内容、颜色文案与坐标原文。

安全边界

  • 只保存裁剪后的图片区域,绝不保存整屏截图;整屏 Bitmap 仅存在于内存,用后立即回收。
  • 裁剪范围严格限定为颜色卡片内的图片节点 bounds,不得扩大到面板其他区域——面板上方存在收货地址与手机尾号。
  • 不保存控件树、XML、链接原文与 goods_id 之外的识别信息。
  • 图片为可选数据,任何失败不得改变采集成败判定。
  • 不涉及创建订单、支付与地址。

验收标准

  • AGENTS.md 与 Wiki 的规则表述已按第一节修订,并记录用户确认。
  • 每个采集到的颜色对应一张图片,图片内容为该颜色的商品图。
  • 图片节点在颜色卡片子树内定位,未出现全局多命中导致的失败。
  • 保存与上传的内容仅为裁剪区域;以实际产物核验不含地址、手机尾号等任何面板其他区域内容。
  • 整屏截图不落盘、不上传、不入库。
  • 截图不支持、定位失败、上传失败三种情况下,采集结果与本工单实施前完全一致,且不计入 missing。
  • 图片上传与采集结果提交为独立请求,图片失败不影响结果提交。
  • 服务端拒绝超限与非图片内容。
  • Admin 商品详情可按颜色查看图片,无图时正常显示占位。
  • 诊断可区分五类失败原因,且不含图片内容与颜色文案。

验证方式

  • cd android && .\gradlew.bat :app:testDebugUnitTest :app:assembleDebug
  • go test ./app/goauto/...
  • 裁剪逻辑的纯函数测试:给定整屏尺寸与节点 bounds,断言裁剪区域正确、越界时安全跳过。
  • 真机 PKG110:对含多颜色的商品完成一次采集,核验每个颜色的图片内容正确、且不含面板其他区域;记录设备、Agent 版本、任务号与图片张数。
  • 人工核验产物:至少抽查一张上传后的图片,确认不含任何个人数据。
  • 真机、多设备、低于 API 30 的设备与异常路径未覆盖部分如实回写。

依赖、并行与风险

  • 前置依赖 #124:颜色遍历与节点定位需先稳定,否则无法保证「图片与颜色一一对应」。
  • 不建议与 #124 同时验收(同一段遍历代码)。
  • 风险:takeScreenshot() 在部分 ROM 上可能受限或返回失败。缓解:失败即跳过,不影响采集;诊断可区分。
  • 风险:分辨率 316×316 可能不满足上架用途。缓解:本工单先交付,实际评估后再决定是否另建大图页方案工单。
  • 风险:图片体积累积占用服务端存储。缓解:设单张与单任务上限,同颜色只保留最新一张。
  • 回退:还原本工单提交即可;已上传图片可保留或清理,不影响采集与采购数据。

文档影响

  • AGENTS.md:按第一节修订永久规则(仓库规则文件,直接修改提交)。
  • Wiki Business-Rules-and-Glossary(docs/03-business-rules-and-glossary.md):安全边界中关于截图的表述。
  • Wiki Architecture-and-Code-Map(docs/02-architecture-and-code-map.md):图片采集、上传与存储路径。
  • Wiki Android-Agent-API-Contract(docs/08-agent-api-contract.md):新增图片上传接口。
  • 按 Wiki-first 门禁:先改线上页面并回读 revision,再执行一轮 sync 与一轮 sync --check,把页面与 revision 写回本工单。

状态

实现已推送 / 待 PKG110 真机验证(前置 #124 已验收;规则修订与 #133 v1 已获用户确认;追加数据库迁移已按授权实现;提交 6f611a0)。

## 所属与来源 - 关联工单:#124 颜色维度采集缺陷(前置)、#115 识别文案迁入规则、#116 门禁与校验分级。 - 来源:用户于 2026-08-28 提出:需要把 PDD 商品页上每个颜色对应的图片保存下来并上传 Admin。经讨论确认:服务端解析原图不可行(实测商品页为 JS 壳、数据走接口且有反爬),因此采用 **Agent 端截图后按节点边界裁剪** 的方案;跳大图页的高清方案暂不采用,图片为可选数据,失败不影响采集。用户于同日确认修改 `AGENTS.md` 中「不保存设备截图」这条永久规则。 - 类型:规则修订 + Android Agent + Server + Admin / 商品颜色配图采集。 - 设计证据:Agent 端不新增页面与交互(截图在既有颜色遍历中完成,无用户操作);Admin 端在商品详情展示已有数据的图片,属现有页面的小范围扩展。v1 标注稿(用户于 2026-08-28 确认):https://git.ilapage.cn/attachments/2f1c20e2-5234-47a7-b7ea-bbef424a9bfc;覆盖有图、无图占位、点击预览与替代文本。 - 工具回退说明:本工单通过 Gitea API 创建;当前会话未提供 Gitea MCP 工具,按 `AGENTS.md`「Gitea 交互与工单最小读取」记录回退原因。 ## 当前事实 ### 服务端解析原图不可行(已实测) 2026-08-28 以移动端 UA 请求 `https://mobile.yangkeduo.com/goods.html?goods_id=971612375909`:返回 200、约 64KB,正文中**不含任何 `thumb_url` 等图片地址**,商品数据由 JS 异步加载,且页面含 `anti` / `VERIFY` 等反爬标识。此前短链解析可行是因为那只是 307 跳转,不涉及取数据。因此「颜色 ↔ 图片」的对应关系只能在设备端、面板已渲染时取得。 ### 控件树证据(用户提供的规格面板 dump) 每个颜色是一个卡片,结构如下(紫色为例): ``` ViewGroup desc=" 紫色1700" clickable=true selected=true [36,1188][352,1591] ├ View 选中态背景 ├ ImageView desc=" 紫色1700" clickable=true [36,1188][352,1504] ← 颜色图,316×316 ├ ImageView desc="打开大图" clickable=true [36,1188][147,1299] ← 大图入口(本工单不使用) ├ TextView "74%人选择" └ TextView " 紫色1700"(tv_content) ``` 浅粉卡片同构,图片节点为 `[382,1188][698,1504]`,且在 `selected="false"` 时同样可用。 由此确认: - 每个颜色卡片内均有独立的图片节点,尺寸约 316×316,**无需先选中该颜色**即可取得; - 两个颜色卡片的「打开大图」`content-desc` 相同,全局查找必然多命中;本工单虽不使用该入口,但同一约束适用于图片节点定位——**必须在颜色卡片子树内查找**。 ### 个人数据风险(必须处理) 同一棵树中,规格面板上方存在收货人手机尾号与详细地址文本节点(`[132,456][993,505]` 等)。整屏截图会把这些一并保存,因此**只允许保存裁剪后的图片区域**,这是本工单的硬约束,也是规则修订必须写清的边界。 ## 目标 1. 采集颜色规格时,为每个颜色保存一张与之对应的商品图片。 2. 图片为**可选数据**:任一环节失败都不影响采集结果与既有判定。 3. 全流程不保存整屏截图、控件树与任何个人数据。 4. Admin 中可查看每个颜色对应的图片。 ## 非目标 - **不使用「打开大图」跳转方案**:需额外的页面跳转、稳定等待与面板恢复校验,新增失败模式,且大图页同样需要裁剪。若后续证明 316×316 分辨率不足,另行建单。 - 不修改颜色/尺码的遍历算法与判定逻辑(#124 范围)。 - 不修改采集结果字段的既有语义与完整性判定(图片缺失不得计入 `missing`,也不得影响 `completed` / `completed_partial` 判定)。 - 不保存整屏截图、原始控件树、XML。 - 不采集尺码维度的图片(本期只做颜色)。 - 不涉及采购、下单、支付与地址。 ## 实施方案 ### 一、规则修订(前置,用户已确认) `AGENTS.md` 第 1 节现表述: > 不保存原始控件树和设备截图;只保存结构化任务日志、错误码、任务规则快照和采集结果。 修订为: > 不保存原始控件树和整屏设备截图;允许保存按规格值节点边界裁剪的商品图片区域,且裁剪结果不得包含账号、地址、订单、支付及其他个人数据。除此之外只保存结构化任务日志、错误码、任务规则快照和采集结果。 同步更新 Wiki `Business-Rules-and-Glossary` 的安全边界描述,并在本工单记录用户于 2026-08-28 的确认。 ### 二、Agent 端 1. 使用 `AccessibilityService.takeScreenshot()`(API 30+)取整屏 Bitmap;设备低于该版本时跳过图片采集,不报错。 2. **在颜色卡片子树内定位图片节点**:以颜色值对应的卡片 ViewGroup 为父,取其后代中与该颜色同 `content-desc` 的 `ImageView`。禁止全局查找——同名节点必然多命中。 3. 按该节点 `bounds` 裁剪:`Bitmap.createBitmap(shot, left, top, width, height)`;整屏 Bitmap 用后立即回收,**不得落盘**。 4. 裁剪结果压为 JPEG(建议质量 85),单张与单任务总量设上限,超限则跳过并记录。 5. 采集时机:在既有颜色遍历中顺带完成,**不新增点击、不新增页面跳转、不新增用户操作**。 6. 任一环节失败(截图权限不足、节点定位失败、裁剪越界、压缩异常)均跳过该颜色的图片,继续采集,并记入诊断。 ### 三、上传 7. 服务端新增图片接收接口;Agent 在采集结果提交成功后单独上传,**不与采集结果同一请求**——避免图片过大导致结果提交失败。 8. 上传失败不重试到影响任务时长,也不改变任务状态;失败记入诊断。 9. 服务端校验:内容类型、单张大小、单任务张数上限;拒绝非图片内容。 ### 四、服务端与 Admin 10. 图片与「PDD 商品 + 颜色值」建立对应关系落库;同一颜色重复上传以最新一张为准。 11. 存储沿用服务端既有 `uploadfile` 静态文件能力,不引入新的对象存储依赖。 12. Admin 商品详情按颜色展示对应图片;无图时显示占位,不报错。 ### 五、诊断 13. 复用 #124 的 `COLOR_DISCOVERY` 或新增独立阶段,记录:尝试张数、成功张数、失败原因分类(不支持、定位失败、裁剪失败、压缩失败、上传失败)。诊断不记录图片内容、颜色文案与坐标原文。 ## 安全边界 - **只保存裁剪后的图片区域**,绝不保存整屏截图;整屏 Bitmap 仅存在于内存,用后立即回收。 - 裁剪范围严格限定为颜色卡片内的图片节点 bounds,不得扩大到面板其他区域——面板上方存在收货地址与手机尾号。 - 不保存控件树、XML、链接原文与 goods_id 之外的识别信息。 - 图片为可选数据,任何失败不得改变采集成败判定。 - 不涉及创建订单、支付与地址。 ## 验收标准 - [ ] `AGENTS.md` 与 Wiki 的规则表述已按第一节修订,并记录用户确认。 - [ ] 每个采集到的颜色对应一张图片,图片内容为该颜色的商品图。 - [ ] 图片节点在颜色卡片子树内定位,未出现全局多命中导致的失败。 - [ ] 保存与上传的内容**仅为裁剪区域**;以实际产物核验不含地址、手机尾号等任何面板其他区域内容。 - [ ] 整屏截图不落盘、不上传、不入库。 - [ ] 截图不支持、定位失败、上传失败三种情况下,采集结果与本工单实施前完全一致,且不计入 `missing`。 - [ ] 图片上传与采集结果提交为独立请求,图片失败不影响结果提交。 - [ ] 服务端拒绝超限与非图片内容。 - [ ] Admin 商品详情可按颜色查看图片,无图时正常显示占位。 - [ ] 诊断可区分五类失败原因,且不含图片内容与颜色文案。 ## 验证方式 - `cd android && .\gradlew.bat :app:testDebugUnitTest :app:assembleDebug` - `go test ./app/goauto/...` - 裁剪逻辑的纯函数测试:给定整屏尺寸与节点 bounds,断言裁剪区域正确、越界时安全跳过。 - 真机 PKG110:对含多颜色的商品完成一次采集,核验每个颜色的图片内容正确、且不含面板其他区域;记录设备、Agent 版本、任务号与图片张数。 - **人工核验产物**:至少抽查一张上传后的图片,确认不含任何个人数据。 - 真机、多设备、低于 API 30 的设备与异常路径未覆盖部分如实回写。 ## 依赖、并行与风险 - **前置依赖 #124**:颜色遍历与节点定位需先稳定,否则无法保证「图片与颜色一一对应」。 - 不建议与 #124 同时验收(同一段遍历代码)。 - 风险:`takeScreenshot()` 在部分 ROM 上可能受限或返回失败。缓解:失败即跳过,不影响采集;诊断可区分。 - 风险:分辨率 316×316 可能不满足上架用途。缓解:本工单先交付,实际评估后再决定是否另建大图页方案工单。 - 风险:图片体积累积占用服务端存储。缓解:设单张与单任务上限,同颜色只保留最新一张。 - 回退:还原本工单提交即可;已上传图片可保留或清理,不影响采集与采购数据。 ## 文档影响 - `AGENTS.md`:按第一节修订永久规则(仓库规则文件,直接修改提交)。 - Wiki `Business-Rules-and-Glossary`(`docs/03-business-rules-and-glossary.md`):安全边界中关于截图的表述。 - Wiki `Architecture-and-Code-Map`(`docs/02-architecture-and-code-map.md`):图片采集、上传与存储路径。 - Wiki `Android-Agent-API-Contract`(`docs/08-agent-api-contract.md`):新增图片上传接口。 - 按 Wiki-first 门禁:先改线上页面并回读 revision,再执行一轮 `sync` 与一轮 `sync --check`,把页面与 revision 写回本工单。 ## 状态 实现已推送 / 待 PKG110 真机验证(前置 #124 已验收;规则修订与 #133 v1 已获用户确认;追加数据库迁移已按授权实现;提交 `6f611a0`)。
Author
Owner

开始执行:设计与高风险门禁

已核对 #133 正文、#124 前置验收、当前 PDD 商品详情抽屉、服务端上传能力及 Android 颜色发现入口。

v1 标注稿:https://git.ilapage.cn/attachments/2f1c20e2-5234-47a7-b7ea-bbef424a9bfc

覆盖范围:

  • 颜色规格表新增固定 64×64 缩略图列;
  • 有图时可点击预览裁剪原图,并提供颜色名称替代文本;
  • 无图时显示“暂无图片”占位;
  • 图片缺失不改变价格、可选状态、规格完整性或采集任务状态;
  • 不修改编辑、备货采购和其他规格维度。

设计取舍遵循现有 Element Plus 抽屉/表格规范,固定尺寸避免加载跳动,预览不新增独立页面。

当前代码需要新增“PDD 商品 + 颜色值 → 图片路径”的持久记录和唯一约束,因此 #133 确实包含追加数据库迁移。按仓库高风险门禁,尚未收到“授权 #133 按工单方案实施数据库迁移”的明确授权,生产实现暂停在此门禁。

工具说明:Gitea MCP 支持工单更新但不支持上传工单附件,因此仅附件上传回退到 Gitea API;凭据来自本机忽略文件且未输出。当前会话未提供 codebase-memory 图工具,代码发现按规则回退到 rg。

## 开始执行:设计与高风险门禁 已核对 #133 正文、#124 前置验收、当前 PDD 商品详情抽屉、服务端上传能力及 Android 颜色发现入口。 v1 标注稿:https://git.ilapage.cn/attachments/2f1c20e2-5234-47a7-b7ea-bbef424a9bfc 覆盖范围: - 颜色规格表新增固定 64×64 缩略图列; - 有图时可点击预览裁剪原图,并提供颜色名称替代文本; - 无图时显示“暂无图片”占位; - 图片缺失不改变价格、可选状态、规格完整性或采集任务状态; - 不修改编辑、备货采购和其他规格维度。 设计取舍遵循现有 Element Plus 抽屉/表格规范,固定尺寸避免加载跳动,预览不新增独立页面。 当前代码需要新增“PDD 商品 + 颜色值 → 图片路径”的持久记录和唯一约束,因此 #133 确实包含追加数据库迁移。按仓库高风险门禁,尚未收到“授权 #133 按工单方案实施数据库迁移”的明确授权,生产实现暂停在此门禁。 工具说明:Gitea MCP 支持工单更新但不支持上传工单附件,因此仅附件上传回退到 Gitea API;凭据来自本机忽略文件且未输出。当前会话未提供 codebase-memory 图工具,代码发现按规则回退到 `rg`。
Author
Owner

门禁解除,进入实施

用户于 2026-08-28 明确确认 #133 v1,并授权 #133 按工单方案实施追加数据库迁移。现按已确认范围进入实施:Android 仅内存整屏截图并按颜色卡片内图片节点边界裁剪、结果提交后独立上传;服务端校验并维护“PDD 商品 + 颜色值”最新图片;Admin 复用已确认的 64×64 缩略图/占位/预览设计。图片失败保持可选,不改变采集结果、missing 或任务状态。

## 门禁解除,进入实施 用户于 2026-08-28 明确确认 **#133 v1**,并授权 **#133 按工单方案实施追加数据库迁移**。现按已确认范围进入实施:Android 仅内存整屏截图并按颜色卡片内图片节点边界裁剪、结果提交后独立上传;服务端校验并维护“PDD 商品 + 颜色值”最新图片;Admin 复用已确认的 64×64 缩略图/占位/预览设计。图片失败保持可选,不改变采集结果、`missing` 或任务状态。
Author
Owner

实现已推送,待 PKG110 真机验证

提交:6f611a0 feat(goauto): collect cropped color images (#133),已推送 main。

已实现

  • Android Agent 0.9.18(versionCode 31)在既有颜色发现中,只在颜色卡片子树内锁定同 content-desc 的 ImageView;API 30+ 使用 takeScreenshot,整屏位图仅驻留内存,按节点边界裁剪后压缩 JPEG 85 并立即回收。
  • 单张 512 KiB、单任务 64 张/8 MiB 上限;结构化结果先提交,图片随后逐张独立上传。首个上传失败即停止后续图片上传且不重试,不改变任务状态、missing、规格、价格或 SKU。
  • 新增 POST /api/agent/v1/tasks/{taskId}/color-images。服务端校验 Device Token、任务归属、终态、精确颜色、JPEG 实际内容、宽高与数量;非图片和超限分别拒绝。
  • 新增迁移 1787885500000 和 pdd_product_color_image,以“PDD 商品 + 颜色”唯一保存最新图片,并关联来源 task/device;替换成功后只清理受控目录中的旧文件。
  • Admin PDD 商品详情按确认的 v1 展示固定 64×64 缩略图、无图占位、替代文本和点击预览。
  • COLOR_IMAGE 诊断可区分不支持、定位、裁剪、压缩、上传失败,不保存颜色文案、坐标或图片内容。
  • 永久规则已更新:仍禁止原始控件树、XML 和整屏截图,只允许保存不含个人数据的节点边界裁剪商品图。

自动化验证

  • .\scripts\verify.ps1 -Component all:通过(Server 全量测试/构建、Web lint/生产构建、Android Debug/Release 单测及 Debug APK 构建);Web 为既有 30 warnings、0 errors。
  • 末次受影响复验:go test ./app/goauto/task ./app/goauto/product ./app/goauto/migrations ./cmd/migrate/migration/version-local 通过。
  • .\gradlew.bat :app:testDebugUnitTest :app:assembleDebug 通过。
  • 新测试覆盖:颜色图片仅在卡片子树定位、裁剪边界/越界、JPEG/超限/未知颜色拒绝、同商品同颜色替换、Admin 详情返回。
  • python dev_scripts/harness.py check --strict 与 git diff --check 通过。

Wiki-first

已先更新线上并回读:

  • Business-Rules-and-Glossary@79bb0b8452c95ca34d3193f0178199614c997edd
  • Architecture-and-Code-Map@07e1ba0c8ee38e7758cf142a272af95fdd046523
  • Android-Agent-API-Contract@95b3e58fc27b2332dde630ffa0d1dab7fc905f80

随后执行唯一一轮 harness.py sync 与唯一一轮 sync --check,一致性通过。

尚未验证 / 未执行

  • 当前 adb devices -l 无设备,故未安装 0.9.18 到 PKG110,也未完成同商品真机采集、每颜色对应关系、裁剪不含地址/手机号及 Admin 实际图片抽查;这些结论不作通过声明。
  • 未对部署/正式数据库执行迁移,也未发布或重启服务;本次授权用于按工单方案实现并测试追加迁移。真机联调前需在目标环境应用迁移并运行新服务。
  • 低于 API 30、多设备及 ROM 截图拒绝路径未做实机覆盖;自动化已确认这些路径不进入 missing 或任务失败。

工单保持打开,不进入待验收。设备重新连接后从“安装 0.9.18 → 应用迁移/启动新服务 → 同商品采集 → Admin 抽查至少一张裁剪图”继续。

## 实现已推送,待 PKG110 真机验证 提交:`6f611a0 feat(goauto): collect cropped color images (#133)`,已推送 `main`。 ### 已实现 - Android Agent 0.9.18(versionCode 31)在既有颜色发现中,只在颜色卡片子树内锁定同 `content-desc` 的 `ImageView`;API 30+ 使用 `takeScreenshot`,整屏位图仅驻留内存,按节点边界裁剪后压缩 JPEG 85 并立即回收。 - 单张 512 KiB、单任务 64 张/8 MiB 上限;结构化结果先提交,图片随后逐张独立上传。首个上传失败即停止后续图片上传且不重试,不改变任务状态、`missing`、规格、价格或 SKU。 - 新增 `POST /api/agent/v1/tasks/{taskId}/color-images`。服务端校验 Device Token、任务归属、终态、精确颜色、JPEG 实际内容、宽高与数量;非图片和超限分别拒绝。 - 新增迁移 `1787885500000` 和 `pdd_product_color_image`,以“PDD 商品 + 颜色”唯一保存最新图片,并关联来源 task/device;替换成功后只清理受控目录中的旧文件。 - Admin PDD 商品详情按确认的 v1 展示固定 64×64 缩略图、无图占位、替代文本和点击预览。 - `COLOR_IMAGE` 诊断可区分不支持、定位、裁剪、压缩、上传失败,不保存颜色文案、坐标或图片内容。 - 永久规则已更新:仍禁止原始控件树、XML 和整屏截图,只允许保存不含个人数据的节点边界裁剪商品图。 ### 自动化验证 - `.\scripts\verify.ps1 -Component all`:通过(Server 全量测试/构建、Web lint/生产构建、Android Debug/Release 单测及 Debug APK 构建);Web 为既有 30 warnings、0 errors。 - 末次受影响复验:`go test ./app/goauto/task ./app/goauto/product ./app/goauto/migrations ./cmd/migrate/migration/version-local` 通过。 - `.\gradlew.bat :app:testDebugUnitTest :app:assembleDebug` 通过。 - 新测试覆盖:颜色图片仅在卡片子树定位、裁剪边界/越界、JPEG/超限/未知颜色拒绝、同商品同颜色替换、Admin 详情返回。 - `python dev_scripts/harness.py check --strict` 与 `git diff --check` 通过。 ### Wiki-first 已先更新线上并回读: - `Business-Rules-and-Glossary@79bb0b8452c95ca34d3193f0178199614c997edd` - `Architecture-and-Code-Map@07e1ba0c8ee38e7758cf142a272af95fdd046523` - `Android-Agent-API-Contract@95b3e58fc27b2332dde630ffa0d1dab7fc905f80` 随后执行唯一一轮 `harness.py sync` 与唯一一轮 `sync --check`,一致性通过。 ### 尚未验证 / 未执行 - 当前 `adb devices -l` 无设备,故未安装 0.9.18 到 PKG110,也未完成同商品真机采集、每颜色对应关系、裁剪不含地址/手机号及 Admin 实际图片抽查;这些结论不作通过声明。 - 未对部署/正式数据库执行迁移,也未发布或重启服务;本次授权用于按工单方案实现并测试追加迁移。真机联调前需在目标环境应用迁移并运行新服务。 - 低于 API 30、多设备及 ROM 截图拒绝路径未做实机覆盖;自动化已确认这些路径不进入 `missing` 或任务失败。 工单保持打开,不进入待验收。设备重新连接后从“安装 0.9.18 → 应用迁移/启动新服务 → 同商品采集 → Admin 抽查至少一张裁剪图”继续。
Author
Owner

部署状态更新(由 #140/#141 Admin 重启触发)

2026-08-29 经用户授权执行本机数据库迁移并重启 Admin 时,迁移器同时执行并记录了 #133 的 1787885500000_pdd_color_image。服务端颜色图片表结构已在本机数据库落地,Server/Web 均已正常启动。

本次只改变 #133 的“本机迁移尚未执行”事实,不代表 #133 已验收:Agent 0.9.18 尚未安装到 PKG110,仍未完成同商品真机采集、颜色图片对应关系及裁剪不含地址/手机号的人工抽查。

## 部署状态更新(由 #140/#141 Admin 重启触发) 2026-08-29 经用户授权执行本机数据库迁移并重启 Admin 时,迁移器同时执行并记录了 #133 的 `1787885500000_pdd_color_image`。服务端颜色图片表结构已在本机数据库落地,Server/Web 均已正常启动。 本次只改变 #133 的“本机迁移尚未执行”事实,不代表 #133 已验收:Agent 0.9.18 尚未安装到 PKG110,仍未完成同商品真机采集、颜色图片对应关系及裁剪不含地址/手机号的人工抽查。
Author
Owner

PKG110 安装状态更新

  • 2026-08-29 已从当前 main@f84ea5d 执行 :app:assembleDebug,构建成功。
  • 已通过 adb install -r 覆盖安装到已连接设备 PKG110(序列号仅在本机验证,不写入工单)。
  • 安装后系统包信息:cn.ilapage.goauto.agent,versionName=0.9.18,versionCode=31。
  • MainActivity 启动命令成功;应用数据未清除。
  • 本条只解除“最新版 APK 尚未安装”的前置;尚未执行多颜色商品采集、颜色图片对应及裁剪隐私边界抽查,#133 仍保持待真机验证。
## PKG110 安装状态更新 - 2026-08-29 已从当前 `main@f84ea5d` 执行 `:app:assembleDebug`,构建成功。 - 已通过 `adb install -r` 覆盖安装到已连接设备 PKG110(序列号仅在本机验证,不写入工单)。 - 安装后系统包信息:`cn.ilapage.goauto.agent`,`versionName=0.9.18`,`versionCode=31`。 - `MainActivity` 启动命令成功;应用数据未清除。 - 本条只解除“最新版 APK 尚未安装”的前置;尚未执行多颜色商品采集、颜色图片对应及裁剪隐私边界抽查,#133 仍保持待真机验证。
Author
Owner

真机缺陷分析与修复方案(任务 #98)

现场事实

用户在 PKG110 安装 Agent 0.9.18(versionCode 31)后执行了任务 #98。只读核验结果:

  • #98 运行时间:2026-08-29 10:13:01~10:13:26;
  • Agent 诊断版本:0.9.18;
  • 任务状态:completed;
  • 结构化结果:4 个颜色、7 个尺码;
  • pdd_product_color_image 中 #98 图片记录:0;
  • 没有 COLOR_IMAGE_CAPTURED,也没有 COLOR_IMAGE_UPLOAD_FAILED;
  • 共记录 4 次 COLOR_IMAGE_LOCATE_FAILED,对应四个已发现颜色。

因此问题发生在颜色图片节点定位阶段;截图、压缩和上传均未执行,Admin 没有可展示的 colorImages。这不是 Admin 缩略图渲染失败。

商品身份偏差

#98 通过当前页面分享链接识别并提交的商品是:

  • goods_id:807914415439
  • PDD 商品记录:8477

用户人工查看的是 808062345927,它对应旧任务 #97、商品记录 8476。两个商品不能混用审核;即使 #98 上传成功,图片也应显示在 807914415439 的详情中。

修复后的真机验收必须同时记录“PDD 当前页 → 分享链接识别 goods_id → 服务端任务 goods_id → Admin 打开的 goods_id”四者一致,避免把商品身份偏差误判为图片展示问题。

代码根因

PddScreenParser.parse() 在生成规范化可见节点时执行:

node.copy(
    text = resolved,
    contentDescription = null,
    ...
)

随后把该规范化节点传给 colorImageBounds(option, visibleNodes)。而 colorImageBounds 的第一步必须从 option.contentDescription 取得期望值:

val expected = option.contentDescription
    ?.replace(Regex("\\s+"), "")
    ?.takeIf(String::isNotEmpty)
    ?: return null

因此通过完整 parse() 路径进入时,颜色选项的 contentDescription 已经被清空,colorImageBounds 必然返回 null,导致所有颜色系统性记录 COLOR_IMAGE_LOCATE_FAILED。

现有单测只直接调用 colorImageBounds() 并传入未清空的人工节点,绕过了完整 parse() 调用链,所以未发现该缺陷。

修复方案

  1. 保持现有安全边界:仍只允许在颜色卡片子树内查找同 content-desc 的 ImageView,禁止全局匹配、OCR/VLM、截图落盘或扩大裁剪区域。
  2. 规范化节点继续服务于规格文字解析,但图片定位必须使用对应的原始 SnapshotNode 属性;可按节点 path 回查 visibleNodes,或在规范化时单独保留原始 contentDescription,不得依赖已清空的副本。
  3. 不放宽匹配条件:图片仍须同时满足:
    • 位于当前颜色卡片子树;
    • class 以 ImageView 结尾;
    • 规范化后的 contentDescription 与颜色卡片原始值完全一致;
    • bounds 完整位于卡片 bounds 内。
  4. 增加完整解析回归测试:构造“可点击颜色卡片 + 同子树匹配图片 + 子树外同名图片 + 打开大图图片”,调用 PddScreenParser.parse(),断言:
    • 对应 VisibleSpecValue.imageBounds 为卡片内目标图片;
    • 不选择子树外同名图片;
    • 不选择“打开大图”图片;
    • 规范化文字逻辑保持不变。
  5. 保留现有直接函数测试,并增加“原始卡片无 contentDescription 时安全返回空”的测试。
  6. 修复后执行 Android 单元测试、Debug APK 构建和受影响组件验证;版本号递增,覆盖安装到 PKG110。
  7. 真机重新采集一个身份已核对、包含多颜色的商品,验收:
    • 每个可定位颜色产生 COLOR_IMAGE_CAPTURED;
    • 无 COLOR_IMAGE_UPLOAD_FAILED;
    • 数据库按任务产生图片记录;
    • Admin 对应 goods_id 详情显示各颜色缩略图;
    • 人工预览确认裁剪内容与颜色对应,且不含地址、手机号或面板其他区域。

范围与门禁结论

  • 本缺陷直接属于仍开放、待真机验收的 #133,不另建工单。
  • 不改变已确认的 #133 v1 页面、交互、接口、数据库结构或验收目标,因此不修改工单正文、不更新原型。
  • 修复实施与验证证据继续回写本工单;工单保持待验收。
## 真机缺陷分析与修复方案(任务 #98) ### 现场事实 用户在 PKG110 安装 Agent `0.9.18`(versionCode 31)后执行了任务 #98。只读核验结果: - #98 运行时间:2026-08-29 10:13:01~10:13:26; - Agent 诊断版本:`0.9.18`; - 任务状态:`completed`; - 结构化结果:4 个颜色、7 个尺码; - `pdd_product_color_image` 中 #98 图片记录:0; - 没有 `COLOR_IMAGE_CAPTURED`,也没有 `COLOR_IMAGE_UPLOAD_FAILED`; - 共记录 4 次 `COLOR_IMAGE_LOCATE_FAILED`,对应四个已发现颜色。 因此问题发生在颜色图片节点定位阶段;截图、压缩和上传均未执行,Admin 没有可展示的 `colorImages`。这不是 Admin 缩略图渲染失败。 ### 商品身份偏差 #98 通过当前页面分享链接识别并提交的商品是: - goods_id:`807914415439` - PDD 商品记录:`8477` 用户人工查看的是 `808062345927`,它对应旧任务 #97、商品记录 `8476`。两个商品不能混用审核;即使 #98 上传成功,图片也应显示在 `807914415439` 的详情中。 修复后的真机验收必须同时记录“PDD 当前页 → 分享链接识别 goods_id → 服务端任务 goods_id → Admin 打开的 goods_id”四者一致,避免把商品身份偏差误判为图片展示问题。 ### 代码根因 `PddScreenParser.parse()` 在生成规范化可见节点时执行: ```kotlin node.copy( text = resolved, contentDescription = null, ... ) ``` 随后把该规范化节点传给 `colorImageBounds(option, visibleNodes)`。而 `colorImageBounds` 的第一步必须从 `option.contentDescription` 取得期望值: ```kotlin val expected = option.contentDescription ?.replace(Regex("\\s+"), "") ?.takeIf(String::isNotEmpty) ?: return null ``` 因此通过完整 `parse()` 路径进入时,颜色选项的 `contentDescription` 已经被清空,`colorImageBounds` 必然返回 `null`,导致所有颜色系统性记录 `COLOR_IMAGE_LOCATE_FAILED`。 现有单测只直接调用 `colorImageBounds()` 并传入未清空的人工节点,绕过了完整 `parse()` 调用链,所以未发现该缺陷。 ### 修复方案 1. 保持现有安全边界:仍只允许在颜色卡片子树内查找同 `content-desc` 的 `ImageView`,禁止全局匹配、OCR/VLM、截图落盘或扩大裁剪区域。 2. 规范化节点继续服务于规格文字解析,但图片定位必须使用对应的原始 `SnapshotNode` 属性;可按节点 `path` 回查 `visibleNodes`,或在规范化时单独保留原始 `contentDescription`,不得依赖已清空的副本。 3. 不放宽匹配条件:图片仍须同时满足: - 位于当前颜色卡片子树; - class 以 `ImageView` 结尾; - 规范化后的 `contentDescription` 与颜色卡片原始值完全一致; - bounds 完整位于卡片 bounds 内。 4. 增加完整解析回归测试:构造“可点击颜色卡片 + 同子树匹配图片 + 子树外同名图片 + 打开大图图片”,调用 `PddScreenParser.parse()`,断言: - 对应 `VisibleSpecValue.imageBounds` 为卡片内目标图片; - 不选择子树外同名图片; - 不选择“打开大图”图片; - 规范化文字逻辑保持不变。 5. 保留现有直接函数测试,并增加“原始卡片无 `contentDescription` 时安全返回空”的测试。 6. 修复后执行 Android 单元测试、Debug APK 构建和受影响组件验证;版本号递增,覆盖安装到 PKG110。 7. 真机重新采集一个身份已核对、包含多颜色的商品,验收: - 每个可定位颜色产生 `COLOR_IMAGE_CAPTURED`; - 无 `COLOR_IMAGE_UPLOAD_FAILED`; - 数据库按任务产生图片记录; - Admin 对应 goods_id 详情显示各颜色缩略图; - 人工预览确认裁剪内容与颜色对应,且不含地址、手机号或面板其他区域。 ### 范围与门禁结论 - 本缺陷直接属于仍开放、待真机验收的 #133,不另建工单。 - 不改变已确认的 #133 v1 页面、交互、接口、数据库结构或验收目标,因此不修改工单正文、不更新原型。 - 修复实施与验证证据继续回写本工单;工单保持待验收。
Author
Owner

真机定位缺陷修复已推送,待最后一次人工触发采集验收

提交:9b044ed fix(android): locate color images from raw cards (#133),已推送 main。

修复

  • PddScreenParser 继续保留规范化 caption/TextView 作为规格点击目标,不改变 #124 的颜色点击安全排序。
  • 图片定位不再依赖已清空 contentDescription 的规范化副本:按规格节点 path 回查原始 SnapshotNode,沿父链寻找原始颜色卡片;只在卡片原始 contentDescription 与颜色标签完全一致时,在该卡片子树内匹配同 contentDescription 的 ImageView。
  • 图片定位只对 color 维度执行;尺码不产生图片边界。
  • 仍不进行全局同名匹配,不选择“打开大图”,不扩大裁剪区域,不使用 OCR/VLM,不保存整屏截图。
  • Agent 版本递增为 0.9.19 / versionCode=32。

回归测试

新增完整 PddScreenParser.parse() 回归,而非只直接测试 colorImageBounds():

  • 最终点击目标仍是卡片内 caption;
  • imageBounds 来自同卡片内目标图片;
  • 子树外同名图片不会被选择;
  • “打开大图”图片不会被选择;
  • 尺码图片边界为空;
  • 原始颜色卡片无 contentDescription 时安全返回空,不猜测。

自动化与安装验证

  • pwsh.exe -NoProfile -File scripts/verify.ps1 -Component android:通过。
    • Debug/Release 单元测试通过;
    • Debug APK 构建通过;
    • 仅有既有 Kotlin redundant initializer warnings。
  • adb install -r android/app/build/outputs/apk/debug/app-debug.apk:成功覆盖安装到 PKG110。
  • 包信息核验:cn.ilapage.goauto.agent,versionName=0.9.19,versionCode=32;MainActivity 启动成功,应用数据未清除。

尚未完成的真机验收

自动化尝试恢复 PDD 最近商品页并从 Agent 触发当前页面采集,但 Agent 的“近期见过 PDD 详情”安全门禁与页面栈状态未稳定满足,未创建新任务;数据库最新任务仍为 #98,不能把本次尝试宣称为图片采集通过。

请在 PKG110 上人工完成一次:

  1. 在 PDD 打开并停留于已知多颜色商品详情页(建议 goods_id 808062345927);
  2. 切回 Agent → 采集 Tab → 采集 → 开始采集;
  3. 完成后告知任务号。

随后继续只读核验:任务 goods_id、图片表记录、图片数量/尺寸、无 COLOR_IMAGE_UPLOAD_FAILED,并在 Admin 对应 goods_id 详情人工预览裁剪内容与隐私边界。工单保持打开,尚不进入待验收。

## 真机定位缺陷修复已推送,待最后一次人工触发采集验收 提交:`9b044ed fix(android): locate color images from raw cards (#133)`,已推送 `main`。 ### 修复 - `PddScreenParser` 继续保留规范化 caption/TextView 作为规格点击目标,不改变 #124 的颜色点击安全排序。 - 图片定位不再依赖已清空 `contentDescription` 的规范化副本:按规格节点 `path` 回查原始 `SnapshotNode`,沿父链寻找原始颜色卡片;只在卡片原始 `contentDescription` 与颜色标签完全一致时,在该卡片子树内匹配同 `contentDescription` 的 `ImageView`。 - 图片定位只对 `color` 维度执行;尺码不产生图片边界。 - 仍不进行全局同名匹配,不选择“打开大图”,不扩大裁剪区域,不使用 OCR/VLM,不保存整屏截图。 - Agent 版本递增为 `0.9.19` / `versionCode=32`。 ### 回归测试 新增完整 `PddScreenParser.parse()` 回归,而非只直接测试 `colorImageBounds()`: - 最终点击目标仍是卡片内 caption; - `imageBounds` 来自同卡片内目标图片; - 子树外同名图片不会被选择; - “打开大图”图片不会被选择; - 尺码图片边界为空; - 原始颜色卡片无 `contentDescription` 时安全返回空,不猜测。 ### 自动化与安装验证 - `pwsh.exe -NoProfile -File scripts/verify.ps1 -Component android`:通过。 - Debug/Release 单元测试通过; - Debug APK 构建通过; - 仅有既有 Kotlin redundant initializer warnings。 - `adb install -r android/app/build/outputs/apk/debug/app-debug.apk`:成功覆盖安装到 PKG110。 - 包信息核验:`cn.ilapage.goauto.agent`,`versionName=0.9.19`,`versionCode=32`;`MainActivity` 启动成功,应用数据未清除。 ### 尚未完成的真机验收 自动化尝试恢复 PDD 最近商品页并从 Agent 触发当前页面采集,但 Agent 的“近期见过 PDD 详情”安全门禁与页面栈状态未稳定满足,未创建新任务;数据库最新任务仍为 #98,不能把本次尝试宣称为图片采集通过。 请在 PKG110 上人工完成一次: 1. 在 PDD 打开并停留于已知多颜色商品详情页(建议 goods_id `808062345927`); 2. 切回 Agent → 采集 Tab → `采集` → `开始采集`; 3. 完成后告知任务号。 随后继续只读核验:任务 goods_id、图片表记录、图片数量/尺寸、无 `COLOR_IMAGE_UPLOAD_FAILED`,并在 Admin 对应 goods_id 详情人工预览裁剪内容与隐私边界。工单保持打开,尚不进入待验收。
Author
Owner

任务 #99 阻塞修复:分享面板重渲染导致复制链接瞬时点击失败

现场事实

  • #99:failed;Agent 0.9.19;错误码 PDD_COPY_LINK_UNAVAILABLE;错误“复制商品链接失败”。
  • 任务在 1.56 秒内结束,goods_id/PDD 商品尚未识别,未进入颜色图片采集。
  • 本地诊断可确认 PAGE_STABILITY/STABLE、SHARE_CLICK/CLICK_SUCCESS、SHARE_PANEL/PANEL_FOUND,说明商品页、分享按钮和分享面板均已成功;失败发生在面板已出现后对“复制链接”的 fresh 重定位/点击。

根因与修复

分享面板出现后,原实现只做一次:

从快照选择“复制链接” → fresh 重定位 → 点击

PDD 分享面板在首次渲染后会瞬时重排/重建节点,快照中的复制链接节点可在 fresh 点击前失效;原代码把一次 NOT_FOUND/ACTION_CLICK_FALSE 直接转换成失败。分享按钮已有同类有限重试,但复制链接没有。

提交:b453634 fix(android): retry copy-link click after share rerender (#133),已推送 main。

  • “复制链接”改为最多 1 秒、每 100ms 重新抓取面板并重新执行唯一目标匹配;
  • 每次都重新校验详情/分享面板问题,多个目标仍立即失败;
  • 仅重试 NOT_FOUND/点击失败,不放宽文本、class、位置和可点击祖先规则;
  • 成功点击后才读取本次新鲜剪贴板;
  • 不新增循环打开分享面板,不读取旧剪贴板,不猜测链接。

回归与安装

  • 新增回归:分享点击成功后,第一次复制链接 fresh 点击因节点重渲染 NOT_FOUND,第二次重抓面板并点击成功;断言点击序列为 分享 → 复制链接 → 复制链接 且身份识别成功。
  • pwsh.exe -NoProfile -File scripts/verify.ps1 -Component android:通过;Debug/Release 单测与 Debug APK 构建成功。
  • Agent 版本递增为 0.9.20 / versionCode=33。
  • 已 adb install -r 覆盖安装到 PKG110,MainActivity 启动成功,应用数据未清除。

请重新在已知多颜色商品详情页触发一次当前页面采集;新任务成功后继续核验 #133 颜色图片记录和裁剪隐私边界。

## 任务 #99 阻塞修复:分享面板重渲染导致复制链接瞬时点击失败 ### 现场事实 - #99:`failed`;Agent `0.9.19`;错误码 `PDD_COPY_LINK_UNAVAILABLE`;错误“复制商品链接失败”。 - 任务在 1.56 秒内结束,goods_id/PDD 商品尚未识别,未进入颜色图片采集。 - 本地诊断可确认 `PAGE_STABILITY/STABLE`、`SHARE_CLICK/CLICK_SUCCESS`、`SHARE_PANEL/PANEL_FOUND`,说明商品页、分享按钮和分享面板均已成功;失败发生在面板已出现后对“复制链接”的 fresh 重定位/点击。 ### 根因与修复 分享面板出现后,原实现只做一次: ```text 从快照选择“复制链接” → fresh 重定位 → 点击 ``` PDD 分享面板在首次渲染后会瞬时重排/重建节点,快照中的复制链接节点可在 fresh 点击前失效;原代码把一次 `NOT_FOUND`/`ACTION_CLICK_FALSE` 直接转换成失败。分享按钮已有同类有限重试,但复制链接没有。 提交:`b453634 fix(android): retry copy-link click after share rerender (#133)`,已推送 `main`。 - “复制链接”改为最多 1 秒、每 100ms 重新抓取面板并重新执行唯一目标匹配; - 每次都重新校验详情/分享面板问题,多个目标仍立即失败; - 仅重试 `NOT_FOUND`/点击失败,不放宽文本、class、位置和可点击祖先规则; - 成功点击后才读取本次新鲜剪贴板; - 不新增循环打开分享面板,不读取旧剪贴板,不猜测链接。 ### 回归与安装 - 新增回归:分享点击成功后,第一次复制链接 fresh 点击因节点重渲染 `NOT_FOUND`,第二次重抓面板并点击成功;断言点击序列为 `分享 → 复制链接 → 复制链接` 且身份识别成功。 - `pwsh.exe -NoProfile -File scripts/verify.ps1 -Component android`:通过;Debug/Release 单测与 Debug APK 构建成功。 - Agent 版本递增为 `0.9.20` / `versionCode=33`。 - 已 `adb install -r` 覆盖安装到 PKG110,`MainActivity` 启动成功,应用数据未清除。 请重新在已知多颜色商品详情页触发一次当前页面采集;新任务成功后继续核验 #133 颜色图片记录和裁剪隐私边界。
Author
Owner

用户于 2026-08-29 明确确认本工单通过验收。验收结论已记录,现关闭工单。没有新的长期事实变化,本次不重复同步 Wiki。

用户于 2026-08-29 明确确认本工单通过验收。验收结论已记录,现关闭工单。没有新的长期事实变化,本次不重复同步 Wiki。
ila closed this issue 2026-08-29 20:43:46 +08:00
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OPC/goauto#133