Skip to main content

dxm-qa-check

店小秘速卖通上品——QA复核模块:逐字段校验1688数据准确性、星号必填项、定价公式、关键字段完整度

インストールへ移動

ソース情報

リポジトリ
southernspark-nfxh/aliexpress-auto-listing-skill
ソースの最終更新活動
2026年8月7日 13:38
検出された SKILL.md の言語
中国語
スター
18
フォーク
3

インストール方法

デフォルトでは、最初にソースを確認する Prompt が選択されています。直接コマンドに切り替えるか、ローカルコピーをダウンロードすることもできます。

ソースファイルを確認

インストールを決める前に、SKILL.md と SkillsMP に表示されている付属ファイルをお読みください。

SKILL.md を表示中

SKILL.md
ソースの指示 · 読み取り専用プレビュー
name
dxm-qa-check
description
店小秘速卖通上品——QA复核模块:逐字段校验1688数据准确性、星号必填项、定价公式、关键字段完整度
domain
ecommerce
triggers
["用户说\"检查\"、\"复核\"、\"QA\"、\"审核\"、\"验证\"","上品流程最后一步"]
# 店小秘上品QA检查模块 ## 触发时机 所有模块(1-9)填完后、保存前,自动执行。 ## 检查维度 ### 1. 1688 数据准确性 ⭐最关键 | 检查项 | 1688来源 | 页面值 | 规则 | |:--|:--|:--|:--| | 成本价 | 1688详情页 | N/A(不填到页面) | 用于验算零售价 | | 重量(g) | 1688参数表 | 包装后重量(kg) | g÷1000=kg | | 库存 | 1688规格行 | SKU库存 | >2000封顶2000 | | 材质 | 1688参数表 | 属性→材质 | 选最接近 | | 品牌 | 1688参数表 | 属性→品牌 | NONE或实际 | | 产地 | 1688参数表 | 属性→产地 | 中国大陆+省份 | ### 2. 定价公式验算 ``` 零售价 = (1688成本价 + 5) × 1.02 ÷ 0.413 = (成本 + 5) × 2.469 验证:零售价 ≤ 页面值 ± 0.01 货值 = 零售价(两列同值) ``` ### 3. 星号字段全覆盖 ⭐提交失败主因 逐模块检查所有 `ant-form-item-required` 字段: | 模块 | 必填项 | 检查方式 | |:--|:--|:--| | 基本信息 | 标题、分类 | 标题无中文、分类已选 | | 属性信息 | 产地/品牌/液晶/出餐量/材质/智能/化学品/电池 | 全部非空 | | 产品信息 | 图片/计件单位/容量/SKU定价(全部) | 6张主图、SKU全填 | | 描述信息 | PC端描述 | 有内容、图已翻译 | | 包装信息 | 包装后重量 | 非空 | | 模板信息 | 运费/服务/海关 | 非"请选择" | | 其他信息 | 报价含关税 | 非空 | ### 4. 关键字段一致性 | 检查 | 说明 | |:--|:--| | Green/Pink行一致 | 零售价/货值/库存/重量/原箱/物流 两行完全相同 | | 是否原箱=是 | select value='1' | | 物流属性=普货 | 无电池产品 | | 商品编码 | Green/Pink 已生成 | | 图片翻译 | 主图6张+SKU图+PC描述图 全部提交 | ## 执行方法 ### 🥇 首选:execute_code + websocket CDP 全页扫描(2026-07-19新增) `browser_snapshot` 输出在 ~1500 行截断,无法覆盖编辑页下半部分。**替代方案:** 用 `execute_code` + websocket 直连 CDP relay 进行全页 QA 扫描。 详见 `aliexpress-store-ops` → `references/cdp-websocket-qa-scan.md` ```python import asyncio, json import websockets async def qa(): ws = await websockets.connect("ws://127.0.0.1:19223/devtools/page/{targetId}", max_size=None) msg = {"id": 1, "method": "Runtime.evaluate", "params": {"expression": """ (() => { const body = document.body.innerText; return JSON.stringify({ chineseError: body.includes('中文字符'), pleaseSelectCount: (body.match(/请选择/g) || []).length, bodyLength: body.length }); })() """, "returnByValue": True}} await ws.send(json.dumps(msg)) resp = await asyncio.wait_for(ws.recv(), timeout=10) return json.loads(resp) ``` **targetId 获取:** `curl -s http://127.0.0.1:19223/json` → 找 `dianxiaomi.com/web/smt/edit` 的 target ### 备选:批量星号检查(DOM查询,可能误判) ### 批量星号检查 ```python star_report = await page.evaluate('''() => { const items = document.querySelectorAll('.ant-form-item'); const missing = []; items.forEach(item => { const star = item.querySelector('.ant-form-item-required, [class*="required"]'); if (!star) return; const label = item.querySelector('label'); const inp = item.querySelector('input'); const sel = item.querySelector('.ant-select-selector'); const val = inp ? inp.value : (sel ? sel.textContent.trim() : '?'); const isEmpty = !val || val.includes('请选择') || val.includes('请选中'); if (isEmpty) { missing.push((label?.textContent || '?').trim()); } }); return missing; }''') # missing 为空 → 全部星号已填 ✅ ``` ### 定价公式验算 ```python cost = 1688成本价 expected = round((cost + 5) * 1.02 / 0.413, 2) actual = float(page输入框中的零售价) assert abs(expected - actual) < 0.02, f"定价异常: 预期{expected} 实际{actual}" ``` ### SKU两行一致性 ```python green = {零售价, 货值, 库存, 重量, 原箱, 物流} pink = {同上} assert green == pink, "SKU两行不一致!" ``` ## 报告格式 ``` 📋 QA检查报告 ━━━━━━━━━━━━━━━━ ✅ 1688数据准确性: 通过 ✅ 定价公式: 15.56 = (1.30+5)×2.469 ✓ ✅ 星号字段: 全部已填 (0个缺失) ✅ SKU一致性: Green=Pink ✓ ✅ 图片翻译: 全部提交 ✅ 模板: 运费/服务已选 ━━━━━━━━━━━━━━━━ 结论: 可以保存 ``` ## ⚠️ 常见问题 1. 最小出餐量容易漏填 —— 1688无数据也要选一个值 2. Pink行SKU未更新 —— 用nth(2)不是nth(1) 3. 图片改尺寸后未翻译 —— 检查每个section的翻译提交状态 4. 包装尺寸无1688数据 —— 跳过,不算缺失 5. 非星号字段(电源/电压/动力等)所有自动化方法无法选中 —— 已确认的 Vue 3 免疫字段,跳过不纠缠,汇报给用户手动操作 ## 🚨 QA误判陷阱(2026-07-19新增)—— 已填字段被误报为"缺失" **问题:** 用 DOM 元素检查法(`.ant-select-selection-item`、`.ant-form-item` input)会漏读已填值,产生大量误报。 **根因:** - `ant-select-auto-complete` 型字段值存储在 `input.value` 中,不在 `.ant-select-selection-item` 的 `.textContent` 中 - 部分 ant-select 选中值通过嵌套 `<div>` 渲染,`.textContent` 可能返回空/空白 - Vue 3 响应式更新后 DOM 结构可能与预期不同 **正确验证方法(按优先级):** 1. **页面 body 全文搜索(最可靠):** `document.body.innerText.includes('Plastic')` 等 —— 只要值在页面上任何地方渲染,就能匹配 2. **按字段类型分别读取:** - 普通 ant-select:`'.ant-select-selection-item'` 的 `.textContent.trim()` - auto-complete 型(材质/最大出餐量等):`.ant-select-auto-complete input` 的 `.value` - 原生 input:`input.value` 3. **不要只依赖一种读取方式** —— 如果 DOM 读不到但 body 文本有值,以 body 文本为准 **误报处理规则:** - 如果 body 文本能找到值 → 字段已填 ✅,不要重新操作 - 只有在 body 文本中也找不到值时才标记为真正缺失 ❌ - 向用户汇报时先筛掉误报,只报告真正缺失的字段 --- *作者: 南方星火 SouthernSpark | 小红书 @南方星火 SouthernSpark | AI自动化专家工作流*
GitHubで見る