Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F
8.8 KiB
generated: true (请先修改 Gitea Wiki,禁止直接编辑本文件) wiki_page: PDD-Detail-Rule-Migration-Analysis wiki_url: https://git.ilapage.cn/OPC/goauto/wiki/PDD-Detail-Rule-Migration-Analysis.- wiki_revision: 03ea269058b50fea2be7842b9c284018987c82d9 synchronized_at: 2026-09-21T08:15:17Z
PDD 商品详情采集规则迁移分析
结论
从 D:\chengma\cmautobuy\client 迁移这套能力是合理的,但不能把其中的文字、resource-id 或坐标直接拼成 GoAuto schemaVersion: 1 规则。源项目的可靠性来自一套有状态采集算法,而 GoAuto v1 目前只支持唯一节点上的单次 wait、click、input、back 和 extract。
推荐新增 schemaVersion: 2、可扩展的类型化动作注册表和高层采集动作:服务端规则管理页面证据、规格别名、阶段钩子、超时和遍历上限;Android Agent 提供经过测试的动作实现,并由策略层按 ruleType 授权。规则草案见 pdd-product-detail-v2.proposed.json。该文件目前是设计输入,v2 执行器完成前不能导入管理端。
源项目实际做法
正式采集链位于 client/src/pdd_collect_service.py,可复用的是以下行为:
- 校验 URL 域名和
goods_id一致性。 - 打开链接后持续分类页面,区分商品页、首页、登录、验证码、网络错误、风控和支付页。
- 读取商品摘要;有限纵向滚动补采店铺和评价。
- 用多项强证据确认规格面板,避免把推荐商品或全屏散落文字误判为规格。
- 颜色列表先归左,再按行蛇形遍历;每次点击后丢弃旧树并重新读取节点。
- 只有确认颜色已选中,且价格连续两次一致,才建立颜色与价格的关联。
- 颜色不可选或价格缺失时保留缺失信息,继续采集其它颜色和尺码。
- 尺码只读不点击;横向或纵向滑动到连续两次视口稳定,并校验“尺码(N)”中的数量。
- 按颜色价格展开颜色与尺码组合,并限制最大 SKU 数量。
源项目正式采集使用 device.open_url() 发起深链,不是先控制浏览器。tools/test_pdd_home_deeplink.py 只是用固定通用 URL 做只读诊断。因此浏览器“打开拼多多APP”和系统“打开”的步骤应继续采用 GoAuto 已通过一加真机验证的导航链,不能声称它来自源项目正式采集规则。
不能直接迁移的内容
| 源项目能力 | GoAuto v1 现状 | 直接迁移结果 |
|---|---|---|
| 同一容器提取多个规格值 | 每步必须唯一匹配 | 多个颜色或尺码会报 RULE_AMBIGUOUS |
| 横向、纵向滚动及边界判断 | 没有滚动动作 | 只能读取当前视口 |
| 点击后重新获取树 | 线性步骤不表达节点失效 | 容易点击旧节点或错绑价格 |
| 选中状态、可用状态和 bounds | UiNodeRef 只有文本 |
不能确认点击是否生效 |
| 价格连续两次稳定 | 只读取一次 | 可能记录颜色切换前的旧价格 |
| 颜色与价格成对累计 | extract 只产生独立字符串列表 |
两个数组可能错位 |
| 规格面板容器和相对位置 | selector 只支持节点自身属性 | 推荐列表可能被误判为规格 |
| 完整性计数、总时长和 SKU 上限 | 仅有单步超时 | 无法证明遍历完整,也缺少资源上限 |
因此,给 v1 增加一批 extractAll 步骤仍不能解决关联、滚动和状态确认问题。
推荐架构
任务规则快照(服务端)
├─ navigation:浏览器和系统确认层的精确允许动作
├─ pageEvidence:PDD 包名、Activity 和商品页证据
└─ collector:pddProductDetailV1 + 别名、超时、次数和 SKU 上限
│
▼
Android 类型化状态机
页面分类 → 规格入口 → 面板强校验 → 逐颜色确认并采价 → 只读尺码 → 组装结果
│
▼
结构化结果(不含原始控件树和截图)
为什么采用可扩展动作注册表,而不是任意脚本 DSL
Agent 不限制为“只能采集”,而是注册带版本的类型化能力,例如 swipe.v1、pddProductDetail.v1 和未来的 pddCreateOrder.v1。规则可以组合 Agent 已声明支持的动作,因此增加一次已支持的滑动不需要升级 APK;只有出现新动作类型或新页面算法时才升级 Agent。
把任意脚本、任意坐标和不受约束的循环开放给服务端仍不可取:它们无法静态校验,可能绕过任务类型边界,也很难证明不会误触付款。类型化动作注册表保留扩展性,同时让服务端校验参数,让 Android 策略层做最终授权。
服务端可配置内容
- 浏览器包名和精确的“打开拼多多APP”/系统“打开”步骤。
- PDD 商品详情精确包名、Activity 和根节点证据。
- 颜色、尺码标题的精确别名列表。
- 页面、选中、价格稳定超时。
- 最大商品页纵向滑动、规格横向/纵向滑动和最大 SKU 数量。
- 固定阶段的安全钩子;当前支持语义目标、方向、次数和动作后等待。
例如规格面板打开后向上滑动两次,只需更新规则,不需要修改 Agent:
{
"hooks": {
"afterSpecPanelOpen": [
{
"action": "swipe",
"target": "specPanel",
"direction": "up",
"count": 2,
"settleMs": 350
}
]
}
}
Android 固定内容
- 动作注册表与参数边界;规则只能引用 Agent 声明支持的能力,不能提交可执行代码。
- 规格入口默认使用
safeBottomSpecEntryV1策略,不接受规则提供任意坐标。 - 价格只能使用固定人民币解析器,金额输出为整数分。
- 每次颜色点击后必须重新获取内存控件树;不能复用旧节点。
- 若页面暴露
selected/checked或“已选”摘要,必须据此确认颜色已选中。 - 价格必须连续两次读取一致才算该颜色的价格。
- 尺码只读,不点击;禁止任何提交订单和支付动作。
- 每个循环都有次数和总时长上限。
collection规则不能调用创建订单动作;未来purchase规则可以调用专用的pddCreateOrderV1,但付款相关动作在最底层始终拒绝。
相对源项目的优化
- 不复制 XML 解析实现。 GoAuto 直接把
AccessibilityNodeInfo投影为仅存在内存的不可变树模型,避免序列化、落盘和再次解析 XML。 - 保留浏览器链。 源项目直接深链,GoAuto 则继续验证浏览器提示、系统确认和最终 PDD Activity,符合当前设备部署方式。
- 能力协商。 设备注册/心跳应上报
rule.schema.v2、action.swipe.v1和collector.pdd.product-detail.v1;服务端不能把 v2 任务发给旧 APK。只比较agentVersion不够可靠。 - 第三维不静默合并。 若出现颜色、尺码之外的维度,保存已确认的数据并提交
completed_partial,在missing标记不支持维度;不伪造完整 SKU。源项目当前直接失败,和 GoAuto“数据不齐仍提交”的规则不完全一致。 - 缺价不伪造 SKU。 颜色仍进入维度,缺少稳定价格时记录
price:<颜色>;不为该颜色生成带虚构价格的 SKU。 - 规则能力版本独立。
schemaVersion管契约形状,collectorId管 Android 算法能力,便于以后修复页面适配而不破坏已有任务快照。 - 采集与采购分权。 Agent 平台可以扩展到创建订单,但规则必须声明类型;采集规则无权创建订单,采购规则可以在独立高风险流程中创建订单,任何规则都无权付款。
建议实施顺序
- 定义 v2 规则契约、设备能力协商和服务端校验。
- 建立纯 Kotlin 内存节点树与可单测的 PDD 采集状态机。
- 接入无障碍服务的滚动、节点刷新、选中与价格稳定读取。
- 在管理端提供内置规则模板,避免管理员手写大段 JSON。
- 用一加真机验证浏览器到商品页、多个颜色价格、全部尺码和部分结果。
当前状态
T19~T22 已验收:v2 契约、能力协商、Android 商品详情采集器、服务端内置模板和管理端安全编辑表单已经接入。T23 已在一加真机跑通浏览器跳转、规格面板强识别、颜色文字安全点击、逐颜色稳定价格、全部可见尺码读取和颜色 × 尺码 SKU 展开。T24 进一步迁移并强化了源项目的逐行蛇形算法:用规格节点祖先锁定横纵容器、以文字和 bounds 判断视口、等待手势完成、尺码标题滚出后按容器结构续页。任务 23 使用商品 236231603269 得到 14 个颜色、8 个尺码、14 个颜色价格和 112 个完整可用 SKU,状态为 completed。T23、T24 实施验证完成,等待用户验收。