实现 uiautomator2 设备连接与 PDD 商品采集基础服务 #28

Closed
opened 2026-08-07 15:29:37 +08:00 by ila · 3 comments
Owner

基本信息

  • 类型:需求
  • 父级大工单:#1
  • 所属 MVP / 版本:#2 / MVP
  • 阶段:阶段 4:采集自动化基础
  • 当前状态:待验收

要解决什么

client/src 当前只有 demo1 下直接连接 uiautomator2 的实验脚本,以及 util 下等待商品页、解析控件树、定位规格面板等零散函数。正式 Client 尚无统一的设备连接边界和 collect(task) -> CollectResult 商品采集服务,应用层不能安全、稳定地调用现有实验代码。

做什么 / 不做什么

  • 做:
    • 根据已保存的 Android 设备序列号建立并校验 uiautomator2 连接;
    • 建立正式 PDD 采集适配层,打开商品链接、等待详情页并采集商品编号、标题、店铺、已拼数量、评价数量、通用规格维度、SKU 组合价格和可用状态;
    • 数量同时保留原始文字、规范化数值和近似标记;
    • 规格使用通用 dimensions 和 SKU 组合,不写死只有颜色、尺码两个字段;
    • 复用或迁移现有 util 工具,但正式流程不得导入 demo1;
    • 对连接失败、页面超时、登录失效、验证码、控件树不完整和结构变化返回可区分的结构化错误;
    • 补充不依赖真机的 XML 固件/模拟设备单元测试,并列出真机验证步骤。
  • 不做:
    • 不接 PDD 任务页按钮和 Qt 工作线程;
    • 不实现 Admin 领取、结果提交或 Outbox;
    • 不实现采购、下单、付款、验证码处理或风控绕过;
    • 不修改数据库结构和 Admin HTTP 接口。

怎么做

  • 新增 client/src/pdd_device_service.py,只负责连接已选设备、检查连接状态和约束 uiautomator2 Device 的生命周期;Device 只能由一个调用线程持有,不跨线程共享。
  • 新增 client/src/pdd_collect_service.py,提供清晰的正式采集入口,并把页面操作、XML 解析和结果组装分成容易测试的小函数。
  • 现有 client/src/util/loaded_pdd.py 等工具只在职责合适时复用;需要调整时保持接口简单,不引入复杂继承。
  • 在 client/test/ 增加对应测试,使用脱敏 XML 固件或最小模拟对象覆盖解析、等待、异常和结果结构。
  • 本工单先完成采集适配层;Qt QObject + moveToThread 接线由后续独立工单完成。

预计修改文件:

  • client/src/pdd_device_service.py
  • client/src/pdd_collect_service.py
  • client/src/util/loaded_pdd.py(仅在需要���)
  • client/test/test_pdd_device_service.py
  • client/test/test_pdd_collect_service.py
  • client/test/fixtures/ 下必要的脱敏 XML 固件

验收标准

  • 正式代码能够使用已保存的设备序列号连接 uiautomator2,且没有硬编码 IP、商品链接或本机路径。
  • 正式代码不导入 client/src/demo1,实验脚本不会进入正式调用链。
  • 采集入口返回商品基本信息、原始与规范化数量、通用规格维度以及 SKU—价格对应关系。
  • 登录失效、验证码、页面超时、设备离线和控件树不完整能够返回不同的结构化错误。
  • uiautomator2 Device 的接口明确为单线程独占,不在 Qt 主线程执行自动化操作。
  • 单元测试无需连接真机即可覆盖主要解析和错误分支。
  • 真机验证能够打开一个测试商品并输出脱敏后的结构化采集结果,不执行采购或下单操作。

怎么验证

从仓库根目录执行:

C:/Python310/python.exe -m pytest client/test/test_pdd_device_service.py client/test/test_pdd_collect_service.py -q
C:/Python310/python.exe -m compileall client/src

真机验证�����使用设置页已保存且已授权的 Android 设备,运行采集测试入口打开一个测试商品,核对标题、店铺、数量、规格组合和价格;确认流程不会进入采购或下单步骤。真机 XML、截图和日志必须脱敏,不得提交账号、Cookie、Token 或支付信息。

风险和回退

  • PDD 页面可能因版本、A/B 页面或控件树懒加载而变化;解析应以脱敏固件回归测试和结构化错误兜底,不能静默返回空成功。
  • 控件树可能无法暴露所有图片或规格信息;遇到无法稳定采集的字段,先记录到本工单并重新确认范围,不在实现中臆造数据。
  • 本任务不修改数据库和 Admin 接口;出现回归时可独立回退本工单提交,不影响现有设备管理与任务列表。
## 基本信息 - 类型:需求 - 父级大工单:#1 - 所属 MVP / 版本:#2 / MVP - 阶段:阶段 4:采集自动化基础 - 当前状态:待验收 ## 要解决什么 `client/src` 当前只有 `demo1` 下直接连接 uiautomator2 的实验脚本,以及 `util` 下等待商品页、解析控件树、定位规格面板等零散函数。正式 Client 尚无统一的设备连接边界和 `collect(task) -> CollectResult` 商品采集服务,应用层不能安全、稳定地调用现有实验代码。 ## 做什么 / 不做什么 - 做: - 根据已保存的 Android 设备序列号建立并校验 uiautomator2 连接; - 建立正式 PDD 采集适配层,打开商品链接、等待详情页并采集商品编号、标题、店铺、已拼数量、评价数量、通用规格维度、SKU 组合价格和可用状态; - 数量同时保留原始文字、规范化数值和近似标记; - 规格使用通用 `dimensions` 和 SKU 组合,不写死只有颜色、尺码两个字段; - 复用或迁移现有 `util` 工具,但正式流程不得导入 `demo1`; - 对连接失败、页面超时、登录失效、验证码、控件树不完整和结构变化返回可区分的结构化错误; - 补充不依赖真机的 XML 固件/模拟设备单元测试,并列出真机验证步骤。 - 不做: - 不接 PDD 任务页按钮和 Qt 工作线程; - 不实现 Admin 领取、结果提交或 Outbox; - 不实现采购、下单、付款、验证码处理或风控绕过; - 不修改数据库结构和 Admin HTTP 接口。 ## 怎么做 - 新增 `client/src/pdd_device_service.py`,只负责连接已选设备、检查连接状态和约束 uiautomator2 Device 的生命周期;Device 只能由一个调用线程持有,不跨线程共享。 - 新增 `client/src/pdd_collect_service.py`,提供清晰的正式采集入口,并把页面操作、XML 解析和结果组装分成容易测试的小函数。 - 现有 `client/src/util/loaded_pdd.py` 等工具只在职责合适时复用;需要调整时保持接口简单,不引入复杂继承。 - 在 `client/test/` 增加对应测试,使用脱敏 XML 固件或最小模拟对象覆盖解析、等待、异常和结果结构。 - 本工单先完成采集适配层;Qt `QObject + moveToThread` 接线由后续独立工单完成。 预计修改文件: - `client/src/pdd_device_service.py` - `client/src/pdd_collect_service.py` - `client/src/util/loaded_pdd.py`(仅在需要���) - `client/test/test_pdd_device_service.py` - `client/test/test_pdd_collect_service.py` - `client/test/fixtures/` 下必要的脱敏 XML 固件 ## 验收标准 - [x] 正式代码能够使用已保存的设备序列号连接 uiautomator2,且没有硬编码 IP、商品链接或本机路径。 - [x] 正式代码不导入 `client/src/demo1`,实验脚本不会进入正式调用链。 - [x] 采集入口返回商品基本信息、原始与规范化数量、通用规格维度以及 SKU—价格对应关系。 - [x] 登录失效、验证码、页面超时、设备离线和控件树不完整能够返回不同的结构化错误。 - [x] uiautomator2 Device 的接口明确为单线程独占,不在 Qt 主线程执行自动化操作。 - [x] 单元测试无需连接真机即可覆盖主要解析和错误分支。 - [ ] 真机验证能够打开一个测试商品并输出脱敏后的结构化采集结果,不执行采购或下单操作。 ## 怎么验证 从仓库根目录执行: ```powershell C:/Python310/python.exe -m pytest client/test/test_pdd_device_service.py client/test/test_pdd_collect_service.py -q C:/Python310/python.exe -m compileall client/src ``` 真机验证�����使用设置页已保存且已授权的 Android 设备,运行采集测试入口打开一个测试商品,核对标题、店铺、数量、规格组合和价格;确认流程不会进入采购或下单步骤。真机 XML、截图和日志必须脱敏,不得提交账号、Cookie、Token 或支付信息。 ## 风险和回退 - PDD 页面可能因版本、A/B 页面或控件树懒加载而变化;解析应以脱敏固件回归测试和结构化错误兜底,不能静默返回空成功。 - 控件树可能无法暴露所有图片或规格信息;遇到无法稳定采集的字段,先记录到本工单并重新确认范围,不在实现中臆造数据。 - 本任务不修改数据库和 Admin 接口;出现回归时可独立回退本工单提交,不影响现有设备管理与任务列表。
Author
Owner

实施记录(2026-08-07)

代码已完成并进入待验收:

  • 新增单线程独占的 uiautomator2 设备会话,区分地址无效、设备占用、离线、连接失败和跨线程访问;
  • 新增 collect(task) -> CollectResult,输出 pdd_data v1;
  • 商品页会滚动收集标题、店铺、销量和评价,任一必需数据缺失时返回结构化错误;
  • 规格面板从当前位置横向、纵向双向扫描,合并通用维度并逐组合重新选择、读取价格和可用状态;
  • 未导入 demo1,未接 Qt、数据库、Admin、采购或下单;
  • 新增两份无账号信息的最小 XML 固件和 14 项专项测试。

验证结果:Client 全量 116 passed;compileall 和 git diff --check 通过。现有用户 XML 仅用于本地只读兼容性检查,未加入提交。真机商品采集尚未执行,最后一项验收保持未勾选。

实现提交:4aff22c feat: 实现 PDD 商品采集基础服务 (#28)

## 实施记录(2026-08-07) 代码已完成并进入待验收: - 新增单线程独占的 uiautomator2 设备会话,区分地址无效、设备占用、离线、连接失败和跨线程访问; - 新增 `collect(task) -> CollectResult`,输出 `pdd_data` v1; - 商品页会滚动收集标题、店铺、销量和评价,任一必需数据缺失时返回结构化错误; - 规格面板从当前位置横向、纵向双向扫描,合并通用维度并逐组合重新选择、读取价格和可用状态; - 未导入 `demo1`,未接 Qt、数据库、Admin、采购或下单; - 新增两份无账号信息的最小 XML 固件和 14 项专项测试。 验证结果:Client 全量 `116 passed`;`compileall` 和 `git diff --check` 通过。现有用户 XML 仅用于本地只读兼容性检查,未加入提交。真机商品采集尚未执行,最后一项验收保持未勾选。 实现提交:`4aff22c` `feat: 实现 PDD 商品采集基础服务 (#28)`
Author
Owner

待验收补充

提交前增加了商品链接安全校验:只接受 PDD 域名,商品编号必须为数字;任务自带 goods_id 时必须与 URL 一致,避免打开错误商品。

最终验证:Client 全量 118 passed,其中 #28 新增 16 项;compileall 与任务文件 git diff --check 通过。

提交:

  • 4aff22c 基础采集服务
  • f1c2700 商品链接与编号一致性校验
  • 0044442、77ec0d9、107366f 本地任务归档及补充

归档:docs/task/28-实现-uiautomator2-设备连接与-pdd-商品采集基础服务.md

真机完整采集仍未执行,工单保持打开和待验收;不会在本工单中接任务按钮或执行采购、下单。

## 待验收补充 提交前增加了商品链接安全校验:只接受 PDD 域名,商品编号必须为数字;任务自带 `goods_id` 时必须与 URL 一致,避免打开错误商品。 最终验证:Client 全量 `118 passed`,其中 #28 新增 16 项;`compileall` 与任务文件 `git diff --check` 通过。 提交: - `4aff22c` 基础采集服务 - `f1c2700` 商品链接与编号一致性校验 - `0044442`、`77ec0d9`、`107366f` 本地任务归档及补充 归档:`docs/task/28-实现-uiautomator2-设备连接与-pdd-商品采集基础服务.md` 真机完整采集仍未执行,工单保持打开和待验收;不会在本工单中接任务按钮或执行采购、下单。
Author
Owner

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

  • 本地归档状态已更新为“已完成,用户验收通过”
  • 验收记录提交:eca9289
  • 本工单按项目流程关闭
用户已于 2026-08-11 明确验收通过。 - 本地归档状态已更新为“已完成,用户验收通过” - 验收记录提交:`eca9289` - 本工单按项目流程关闭
ila closed this issue 2026-08-11 10:58:00 +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#28