Skip to main content

dxm-sku-pricing

店小秘速卖通编辑页——SKU定价栏模块:零售价/货值/库存/重量/尺寸/是否原箱/物流属性/商品编码,含定价公式

Ir a la instalación

Datos de origen

Repositorio
southernspark-nfxh/aliexpress-auto-listing-skill
Última actividad en el origen
7 de agosto de 2026 a las 13:38
Idioma detectado de SKILL.md
chino
Estrellas
18
Forks
3

Opciones de instalación

De forma predeterminada está seleccionado el prompt que primero revisa el origen. Puedes cambiar a un comando directo o descargar una copia local.

Revisa los archivos de origen

Lee SKILL.md y los archivos complementarios que muestra SkillsMP antes de decidir si quieres instalarlo.

Mostrando SKILL.md

SKILL.md
Instrucciones de origen · Vista previa de solo lectura
name
dxm-sku-pricing
description
店小秘速卖通编辑页——SKU定价栏模块:零售价/货值/库存/重量/尺寸/是否原箱/物流属性/商品编码,含定价公式
domain
ecommerce
triggers
["用户说\"SKU\"、\"定价栏\"、\"零售价\"、\"货值\"、\"物流属性\"、\"商品编码\"、\"原箱\"、\"填充SKU\"","店小秘编辑页产品信息 tab 需要填SKU表"]
# 店小秘SKU定价栏模块 ## 环境 CDP browser_cdp 直连。 ## 切换位置 SKU表在「产品信息」tab 的下方,颜色SKU配置区域之后。 ## 字段规则速查 | 字段 | 规则 | |:--|:--| | **零售价(CNY)** | = 货值,由定价公式计算。≠1688成本价! | | **货值(CNY)** | = 零售价,两列填同一个数 | | **库存** | 1688库存>2000封顶2000,≤2000如实写 | | **重量(kg)** | 从1688提取 | | **包装尺寸(cm)** | 长/宽/高,1688有则填,无跳过 | | **是否原箱** | 原生`<select>`,设为「是」(value=1) | | **物流属性** | 无电→普货;有电→内电(选具体电池类型) | | **商品编码** | 一键生成,1688有货号则填为前缀 | ## 💲 定价公式 ``` 零售价 = 货值 = (1688成本价 + 国内运费¥5) × 1.02 ÷ [0.70 × (1 - 21% - 净利率)] ``` ### 费率说明 - 1.02 = 退货率 2% - 0.70 = (1 - 平台费率 30%) - 21% = 其他费率 (10% + 3% + 8%) - 净利率:起量/引流款=20%, 利润款=30%, 新品=20% ### 快速计算(净利率20%) ``` 零售价 = (成本 + 5) × 1.02 ÷ 0.413 = (成本 + 5) × 2.469 ``` ## Step 8a:逐行填写 SKU 值(✅ 2026-07-19 验证) ### 🔑 Playwright `page.locator().fill()` — 唯一可靠方式 店小秘 SKU 表的 antd input 不能用 triple-click+keyboard.type 或 nativeValueSetter 填值。**唯一可靠方式:Playwright `page.locator('input[placeholder="字段名"]').fill('值')`**。 ```python # 零售价 (SKU 1 = nth(0), SKU 2 = nth(2)! 跳过 nth(1) 隐藏行) await page.locator('input[placeholder="零售价"]').nth(0).fill('15.56') # SKU 1 (Green) await page.locator('input[placeholder="零售价"]').nth(2).fill('15.56') # SKU 2 (Pink) # 货值(同零售价) await page.locator('input[placeholder="货值"]').nth(0).fill('15.56') await page.locator('input[placeholder="货值"]').nth(2).fill('15.56') # 库存 await page.locator('input[placeholder="库存"]').nth(0).fill('2000') await page.locator('input[placeholder="库存"]').nth(2).fill('2000') # 重量 await page.locator('input[placeholder="重量"]').nth(0).fill('0.2') await page.locator('input[placeholder="重量"]').nth(2).fill('0.2') ``` ### ⚠️ 注意 - 每个 placeholder 可能有 3 个匹配——**`nth(0)` 是第 1 个 SKU,`nth(2)` 是第 2 个 SKU!`nth(1)` 是隐藏/批量行,不要填它!** - 填值前先 `nth(i).click()` 聚焦,再 `.fill(value)` - 不需要 `dispatchEvent` — Playwright fill 会自动触发 Vue 3 响应 - **填完后立即验证**:用逐行读表方式确认两个 SKU 的值一致(避免只改了第 1 行没改第 2 行) ### ❌ 已证伪的方法 - triple-click + keyboard.type — 值不持久化 - nativeValueSetter + dispatchEvent — Vue 3 不认 - 表头「批量填充」按钮 → 不适用逐行不同值的场景(两个颜色 SKU 价格相同可尝试) ## Step 8b:是否原箱 ### 使用原生 `<select>`,不是 ant-select! ```python # Playwright select_option(推荐) selects = page.locator('table select') for i in range(selects.count()): opts = await selects.nth(i).locator('option').all_inner_texts() if '是' in opts: await selects.nth(i).select_option(value='1') # 1 = 是 # JS fallback(备选) await page.evaluate('''() => { const selects = document.querySelectorAll('table select'); for (const sel of selects) { if (sel.options.length >= 3 && sel.options[2].text === '是') { sel.selectedIndex = 2; sel.dispatchEvent(new Event('change', {bubbles: true})); } } }''') ``` ⚠️ 第一个 select(i=0)通常是颜色筛选器,跳过它。只改 是否原箱 的 select。 ⚠️ Playwright `select_option` 是原生 select 的最可靠方式。 ## Step 8c:物流属性(✅ 2026-07-19 验证) ### 判断规则 | 产品类型 | 物流属性 | |:--|:--| | 无电(硅胶碗、普通日用品) | **普货** | | USB充电(风扇、净化器) | 内电→非纽扣锂离子电池 | | 纽扣电池(LED灯) | 内电→纽扣式锂电池 | | 干电池(遥控器) | 内电→干电池 | | 充电宝/电池盒 | 内电→非纽扣锂离子电池 | ### CDP 操作(Playwright) ``` 1. 找物流属性列 header 中的「批量」span th_textContent_contains('物流属性') → querySelector('span') → 文字为'批量' 坐标约 (1778, 709)(scroll 后可能变化,每次实时查询) 2. page.mouse.click(x, y) 打开弹窗 弹窗结构: 物流属性 禁运: 禁运 普货: 普货 ← 选这个 纯电: 纯电 强磁: 强磁 特货: 液体/粉末/膏体/特货其他 特敏: 危险品/特敏其他 内电: 干电池/铅酸蓄电池/.../非纽扣锂离子电池 外电: 外电 弱磁: 弱磁 [取消] [确定] 3. 选对应 checkbox page.mouse.click(普货_label_x, 普货_label_y) // 约 (790, 232) 4. 点「确定」 page.mouse.click(确定_btn_x, 确定_btn_y) // 约 (1466, 842) ``` ### ⚠️ 注意 - 弹窗按钮坐标每次弹窗位置固定,但建议实时 `getBoundingClientRect()` 获取 - mouse.click 在此弹窗中有效(不是所有 ant-modal-wrap 都拦截点击) ## Step 8d:商品编码(✅ 2026-07-19 验证) ### 必须先设物流属性!否则报错。 ``` 1. 点 header 中的「一键生成」span(约 1899, 710) page.mouse.click(1899, 710) 2. 弹窗「商品编码 设置」出现 按钮:[关闭] [设置] 3. 点「设置」自动生成(约 1213, 164) page.mouse.click(1213, 164) 4. 弹窗关闭 → 每个 SKU 行商品编码自动填入(值如 'Green' / 'Pink') ``` ### ⚠️ 注意 - 不需要填前缀或手动输入——点「设置」即自动生成 - 生成结果是 SKU 自定义名称(如 Green/Pink),非 1688 货号 - 如有 1688 货号(如 BK),可在弹窗中自行修改前缀 ## Step 0:获取 1688 成本价(前置条件) ### 来源URL查找优先级 1. **编辑页 DOM**:搜索所有含 `1688.com` 的 a 链接 / innerText 2. **店小秘信息 tab**:切到「店小秘信息」→ 找来源URL 3. **🔴 浏览器直接搜索(推荐兜底)**:在已登录1688的Chrome中新标签页搜索产品标题 → 从搜索结果找到对应产品 → 点进详情页 → 提取价格和参数 4. **会话历史**:用 `session_search` 搜产品标题 + "1688" + "价格" ### 🔑 浏览器搜索1688详细步骤 ``` 1. 在已有 Chrome CDP 连接中:ctx.new_page() 2. goto('https://s.1688.com/selloffer/offer_search.htm?keywords=产品关键词&n=y') 3. page.evaluate('document.body.innerText') 提取搜索结果 4. 匹配标题最接近的产品,从 innerText 中提取价格(正则:/¥\s*([\d.]+)/) 5. 或直接 page.mouse.click 点进详情页 → goto('https://detail.1688.com/offer/{offer_id}.html') 6. 从详情页 innerText 提取: - 价格:¥(\d+\.\d+) - 库存:规格行后紧跟的 \d+ 数字 - 重量:(\d+)g - 材质/品牌/产地:表格文本中提取 ``` ### 🔴 用户期望 **用户明确要求:自己从浏览器中找,不要问用户。** "你自己分辨,你不要问我,好吗?我们都已经上架了,你刚才在编辑那个页面,那个页面上也有网页链接,有采集的产品的链接,你自己去学习,自己去研究。" → 优先用浏览器搜索1688找到产品并提取价格,实在找不到(如1688需验证码/登录失效)时再问。 ### 常见失败原因 - 店小秘采集箱产品不保留原始1688 URL - 1688 搜索触发验证码 → 等用户手动通过后再操作 - 1688 未登录 → 搜索页会跳转到登录页,请用户登录后再试 ## ⚠️ 已知坑点 1. 「零售价 = 货值,不等于1688成本价」— 经常搞反 2. 是否原箱用原生 `<select>`,第一个 select 是颜色筛选器要跳过 3. 商品编码必须先设物流属性 4. 库存封顶2000 5. 国内运费固定¥5,不是0 6. 用户说「是否原籍」= 是否原箱(语音识别) 7. **1688成本价优先自己找** — 不要在第一步就问用户,先尝试浏览器搜索 8. **🔑 使用 `page.locator('input[placeholder="..."]').fill()`** — 这是填 antd 表 input 的唯一可靠方式。triple-click+keyboard 和 nativeValueSetter 均无效。 9. **SKU 表每个 placeholder 有 3 个匹配——nth(0)=第1个SKU, nth(2)=第2个SKU, nth(1)=隐藏行(不要填!)** 10. **物流属性弹窗中 mouse.click 有效** — 不触发 ant-modal-wrap 拦截问题 11. **填完必须逐行验证** — 否则可能出现只改了第 1 行、第 2 行还是旧值的情况,用户会看到两个 SKU 价格不一致。 --- *作者: 南方星火 SouthernSpark | 小红书 @南方星火 SouthernSpark | AI自动化专家工作流*
Ver en GitHub