源资料/中台/平台三层字段口径,四类硬证据: - 店小秘官方导入模板 61 列(/tmp/dxm-Template.xlsx 表头) - 平台接口 raw 字段全集(速卖通191/TikTok167/Shopee141/Walmart35/Ozon10+45/SHEIN48/Lazada61;妙手 TikTok84/Shopee74/Temu73/SHEIN61) - 真·1688 源字段(new20-raw/*.html 的 window.context 模块) - 8 个平台建品脚本落点(逐字段行号)+ 跨平台字段名对照表 含四项口径更正(unitWeight=kg vs weight=g、MOQ 可得、Ozon 无建品脚本、规则库未接线)与硬编码待改清单。
62 KiB
跨境电商产品数据字段总清单
生成:2026-09-22 · 作者:KVM-2 DSH agent · 用途:作为唯一字段口径表,供建品脚本、数据同步、字段补齐、跨平台映射共用。
证据优先级(本文件所有条目都按此分级,未标注的即"未验证"):
- ★★★ 官方/接口事实:店小秘官方导入模板、平台列表接口返回的真实字段、库内真实文档
- ★★ 代码事实:线上脚本读写过的 store 路径 / selector / 单位换算
- ★ 文档事实:需求文档、技能笔记、注释
- ❓ 待确认:仅为推测或来源冲突
主要来源:
listing-spec/建品质量需求.md(需求单一事实源)、~/ds·/skills/dianxiaomi-multiplatform-listing、/tmp/dxm-Template.xlsx(官方模板)、products.listings(库内 5.8 万条真实文档)、~/1688-xborder/*.csv(源资料)、~/<平台>建品/*.mjs(线上脚本)。
⚠ 0. 先处理:妙手同步已"静默失败",但监控报 OK
logs/miaoshou-20260922-031701.log(最新一轮 03:17):
Temu全托管 waitPublish ✗ pddkj/waitPublish: 您的授权已经过期,请重新登录
…(22 个平台全部同一错误)
== 完成 49.5s 错误 22
而 logs/last-status.txt 写的是 miaoshou=OK(库内 waitPublish 文档=2870/在线 55462,…)。
机制:脚本对每个平台 catch 异常后继续跑,sync_all.sh 只看退出码 → cookie 过期导致 0 新增,但库内旧数据非 0,于是报 OK。
后果:巡检判据「文档数=0」抓不到这一类故障;妙手的 2870 / 55462 是旧快照,不是当前值。
修法:妙手登录态来自 /tmp/dxm7 profile(msp_session.py,CDP 9223)→ 需重新登录;并建议给 sync_all.sh 增加"本轮新增=0 且错误数>0 → 判 FAIL"的判据(现在只看退出码)。
0. 三层数据模型(先看清字段在哪一层)
| 层 | 载体 | 字段量级 | 本文件章节 |
|---|---|---|---|
| L1 源资料(选品/采集) | ~/1688-xborder/*.csv、1688 详情页、内网货盘 |
12–18 列 + 1688 原始 HTML | §1 |
| L2 中台(店小秘 / 妙手) | Pinia store、官方导入模板、库内 raw |
店小秘官方模板 61 列;接口 raw 10–191 字段 | §2 §3 §4 |
| L3 平台(发布后回读) | 平台接口 /api/<模块>Product/pageList.json |
同上(店小秘把平台字段透传进 raw) | §4 §11 |
关键认知:店小秘的 raw 字段 ≈ 平台字段超集(速卖通 191 个),我们归一化了 17 个用于统计,其余全量躺在 raw 里。所以要补任何字段,先去 raw 里找,不要重新爬。
1. L1 源产品资料字段(选品与采集层)
1.1 三套 CSV 的真实表头 ★★★
| 用途 | 文件 | 列数 | 字段 |
|---|---|---|---|
| 选品候选(1536 行) | candidates-20260914.csv |
17 | sku, pid, title_zh, title_en, cost_cny, weight_kg, est_price_usd, est_margin_pct, score, offer_1688, offer_id, supplier, kb_status, pool_status, stock, image, category |
| 富化核验(60 行) | enriched-20260914.csv |
12 | offer_id, sku, cost_cny_in, title_1688, price_min_cny, price_range_raw, supplier_1688, moq, weight_raw, image_url, valid, note |
| 终选(含来源与克重) | final-candidates-20260914.csv |
14 | offer_id, sku, title, price_1688_cny, pool_cost_cny, weight_g, weight_source, supplier_1688, est_price_usd, est_margin_pct, category, offer_url, image, pool_status |
| 上架包(含俄语文案与定价链路) | t1-上架包.csv |
18 | 货号, 品名, offer_id, 供应商, 成本CNY, 克重g, 头程CNY, 公式价KZT, 首发价KZT, 全链路成本KZT, 保本价KZT, 每单利润KZT, 首发毛利pct, 公式价毛利pct, WB参照, 俄语标题, 俄语卖点, 俄语关键词 |
1.2 ★ 真·1688 原始字段(window.context,最硬证据)
更正:上一版把"源资料"等同于
~/1688-xborder/*.csv,那是下游产出,不是原始采集。 真·原始数据在~/1688-xborder/new20-raw/*.html(17 个 500–676KB 详情页,BDPM 抓取), 字段内联在window.context.result.data.<模块>.fields里。涉及模块:productPackInfo·priceModel·skuInfoMap·offerBaseInfo·od_product_description·od_size_chart·consign·shippingServices·frontSellerMemberModel·offerSign
基础信息
| 键名 | 语义 | 单位/格式 | 可得性 |
|---|---|---|---|
offerId |
1688 商品 ID | 数字串 | ✅ 17/17 |
<title> / subject |
商品标题 | 中文 | ✅ 17/17 |
featureAttributes["货号"].value |
货号/商家编码 | 文本 | ✅ 14/17(常与 skuInfoMap.specAttrs 同值) |
priceModel.currentPrices[].price |
阶梯价 | ¥ | ✅ 17/17 |
priceModel.currentPrices[].beginAmount |
起订量 MOQ | 整数 | ✅ 17/17(首档即 MOQ) |
priceModel.currentPricesWithOnePiece[] |
一件代发价 | ¥ | ✅ |
originalPricesWithoutPromotion[] / discountPrice |
原价/折后价 | ¥ | ✅ |
skuPriceScale |
价格区间串 | "2.80-3.50" |
✅(→ CSV price_range_raw) |
canBookCount |
可订库存 | 整数 | ✅(值常夸张,如 99985537) |
saledCount |
销量 | 整数 | ✅(可能虚高) |
postCategoryId / topCategoryId |
1688 类目 | 整数 | ✅ 但不可直接映射平台类目 |
图片(全外链 cbu01.alicdn.com)
| 键名 | 语义 | 说明 |
|---|---|---|
imageList[].fullPathImageURI |
主图原图 | 直接可用 |
imageList[].imageURI |
主图相对路径 | 需拼域名 |
imageList[].{searchImageURI,size220x220ImageURI,size310x310ImageURI,summImageURI} |
各尺寸缩略变体 | 还原规则见 fetch_1688_imgs.py:19-27 |
od_product_description.fields.detailUrl |
详情图容器 | ⚠ 是外链 JS bundle(itemcdn.tmall.com/1688offer/icoss<hash>),必须二次抓取 |
valueImageUrl(规格/变种图) |
变种图 | ❌ 17 个样本非空 = 0 → 变种图源头拿不到 |
cbu01.alicdn.com/cms/upload/* |
页面小图标 | ⚠ 必须滤掉(不是商品图) |
物流(重量/尺寸)—— 单位是雷区,见 §1.5
| 键名 | 语义 | 单位 | 可得性 |
|---|---|---|---|
productPackInfo.fields.unitWeight |
商品件重 | 千克 kg | ⚠ 11/17 有值,6/17 为 0(未填≠零重) |
productPackInfo.fields.pieceWeightScale.pieceWeightScaleInfo[].weight |
单件重量 | 克 g | ✅ 15/17 |
…pieceWeightScaleInfo[].length/width/height |
长/宽/高 | 厘米 cm | ⚠ 常为 0.0(9/17 全零) |
…pieceWeightScaleInfo[].volume |
体积 | cm³ | ✅ 有值时正确 |
…pieceWeightScaleInfo[].{sku1,sku2,skuId} |
变体值/SKU ID | 文本/整数 | ✅ |
…columnList[].label |
表头定义 | 长(cm)/宽(cm)/高(cm)/体积(cm³)/重量(g) |
✅ 单位口径的权威来源 |
freightInfo.unitWeight / shippingServices.fields.unitWeight |
运费重量 | kg | ✅ 与 productPackInfo 同值 |
供应链
| 键名 | 语义 | 可得性 |
|---|---|---|
companyName |
供应商公司全称 | ✅ 17/17 |
sellerLoginId |
供应商店铺名 | ✅(→ CSV supplier_1688) |
sellerUserId / sellerMemberId |
供应商 ID | ✅ |
winportUrl |
供应商旺铺 | ✅ |
featureAttributes["产地"].value |
产地 | ✅ 9/17,只到省市(义乌/金华/浙江/广州/莆田/河北) |
featureAttributes["是否进口"] |
是否进口 | ✅ 4/17(实测全"否") |
<span class="location"> |
发货地 | ⚠ 仅 HTML 文本,不在 JSON |
deliveryLimitText |
发货承诺 | ✅(如"承诺48小时发货") |
featureAttributes["主要下游平台"/"主要销售地区"] |
渠道/地区 | ✅ 6–7/17 |
属性与变种
- 统一容器
featureAttributes[] = {fid,name,value,values,vids,outputType,isSpecial,…} - 实测属性名(按出现文件数):
货号(14)品牌(13)是否跨境出口专供货源(12)材质(9)产地(9)有可授权的自有品牌(8)颜色(7)上市年份/季节(7)处理工艺(6)图案/流行元素/适用送礼场合(5)风格/包装/生产编号(3)尺码/型号/规格(1–2),另有 80+ 类目长尾属性 - 变种:
skuInfoMap/skuInfoMapOriginal✅ 17/17,值{specId,saleCount,canBookCount,specAttrs,priceAmount,skuId,isPromotionSku};isSkuOffer:true16/17
其他
| 项 | 状态 |
|---|---|
尺码表 od_size_chart |
✅ 模块存在,尺码图需从中提取 |
| 平台评分/评价数 | ❌ 1688 详情页不存在(评分只在需求侧 WB/Ozon 有) |
| EAN / UPC / 条码 | ❌ 全页 689 个 JSON 键无任何 barcode/upc/ean |
1.2b 建品输入包(下游包,不是源资料)
~/<平台>建品/*_input.json(46–48 项,顶层键 = offer_id),每项只有 11 个字段:
walmart建品/wm_input.json:title, bullets, keywords, imgs, weight, ean, pc, cat_index, cat, price_usd, weight_lbstiktok建品/tk_input.json:title, bullets, keywords, imgs, cost, weight, price_cny, price_myr, guess, cat_kw, cat_fb
⚠ weight 是硬编码三档 100/130/10,不是实测值(tk_input.json 的 guess 字段字面写着 'cost~,w~' 自认是猜的)。
⚠ 全量口径:最终开品清单.csv 的 weight_src 分布 = 占位100g 213 行 vs L2实核 20 行 → 只有 8.6% 的重量是真核过的。
1.3 源资料字段语义归并(建品脚本实际消费的)
| 归一字段 | 脚本里的名字 | 语义 | 单位 | 说明 |
|---|---|---|---|---|
| 货源 ID | offer_id / oid |
1688 商品 ID | — | 唯一键;来源 URL = https://detail.1688.com/offer/<oid>.html ★★ |
| 货号 | sku |
我方货号 | — | 平台 SKU 由它派生(如 WM-<oid>) |
| 标题 | IN.title / it.title / title_1688 / title_en |
商品标题 | — | 1688 原文(中文/英文两版) |
| 卖点 | IN.bullets / it.bullets |
要点列表 | — | 描述与 keyFeatures 的原料 |
| 关键词 | IN.keywords / it.keywords |
搜索词 | — | 逗号分隔;TikTok 取前 10 个 ★★ |
| 类目猜词 | IN.cat_kw / it.cat_kw |
类目匹配关键词 | — | ⚠ 类目靠猜是已知缺陷(需求 §3.1 #1) |
| 元卖 | IN.sp_kw / IN.sp_fb |
Shopee 关键词/回退 | — | Shopee 专用 |
| 成本 | IN.cost / it.cost / cost_cny / pool_cost_cny |
进货成本 | CNY | 定价模型输入 |
| 1688 价 | price_min_cny / price_1688_cny / price_range_raw |
供货价 | CNY | price_range_raw 是原始区间串 |
| 重量 | IN.weight / it.weight / weight_g / weight_kg / weight_raw |
商品重量 | 口径不一,见 §1.5 | 🔴 最大雷区:源头 kg/g 两个字段并存;下游 weight 多为硬编码占位 |
| 图片 | IN.imgs / it.imgs / image / image_url |
主图+详情图混装 | URL 数组 | ⚠ 混装,必须过 filterProductImages() ★★;详情图需二次抓取 |
| 供应商 | supplier_1688 / supplier |
供应商名 | — | 产地字段的来源(只到省市) |
| 起订量 | moq / priceModel.currentPrices[].beginAmount |
最小起订 | 件 | ⚠ 实际可得(旧文档称"取不到"是错的);但 L2 CSV 的 moq 列全空是脚本没提 |
| 库存 | stock / canBookCount |
1688 库存 | 件 | 值常夸张,仅方向性 |
| 定价结果 | est_price_usd, est_margin_pct, score + 公式价KZT/保本价KZT/… |
定价与经济性 | USD/KZT | 选品阶段算出 |
| 多语言文案 | 俄语标题/卖点/关键词 |
本地化文案 | — | 目前仅俄语(Ozon/WB 线) |
1.4 源资料的结构性缺口(L1 拿不到、必须人工或另找)
| 缺口 | 影响的平台 | 现实做法 | 证据 |
|---|---|---|---|
| 品牌 | 全平台 | 一律 无品牌;源头 品牌 属性 13/17 有值但不可信(常为 自主/其他/否,或供应商乱填的品牌名,发布前必须清) |
★★★ |
| EAN/UPC/ISBN | Temu/Walmart/速卖通 SKU | 全页 689 个 JSON 键无任何 barcode/upc/ean → 走自家 EAN-13 台账(69803093 段),用号必须落 S03 台账 |
★★★ |
| 原产国 / 产地 | Walmart(Country of Origin)、速卖通(产地必填) | 源头 产地 只到省市(义乌/浙江/金华/广州/莆田/河北),是否进口=否 → 默认 China |
★★★ |
| 包装尺寸 | Walmart(inch)、Temu、Shopee | ⚠ 9/17 样本长宽高全为 0.0;建品 CSV 里的 15/10/3 是人工默认值,与 1688 源无对应关系。真值须实测或问供应商 |
★★★ |
| 发运重量 | 全平台 | unitWeight 是单件属性值,未必含外包装(实测有 1g 的离谱值)→ 代码统一加 --weight-buffer 1.3 |
★★★ |
| 净重 vs 毛重 | Temu(净重必须<重量) | 源头只有件重,净重需估算或人工 | ★★ |
| 规格/变种图 | TikTok/速卖通/Walmart 变参图 | ❌ valueImageUrl 17 个样本非空 = 0 → 无自动来源,需从主图/详情图裁切 |
★★★ |
| 详情图 | Shopee/Temu/速卖通 | 不在主 HTML 里:od_product_description.fields.detailUrl 是外链 JS bundle,必须二次抓取 |
★★★ |
| MOQ | 铺货一般不用 | ✅ 其实拿得到(priceModel.currentPrices[0].beginAmount);旧文档"取不到"的说法源于早期只读属性表文本 |
★★★ |
| HS / ТН ВЭД 编码 | Ozon/Walmart | 源头无此字段 → 走自有 HS 字典(中国 10 位 12,030 / ЕАЭС 9 位 12,937 / 国际 6 位 5,613) | ★★ |
| 平台类目映射 | 全平台 | 1688 postCategoryId/topCategoryId 不可直接映射平台类目树 |
★★★ |
| 高关注化学品 / 加州65 | 速卖通、Walmart | 填 none(速卖通写死 id 23399591357) |
★★ |
| 产品说明书文件 | 速卖通(部分类目强制) | 无来源 → 需生成或跳过该类目 | ★ |
| 视频 | 速卖通、TikTok | 无来源 → 需图生视频或人工 | ★★ |
| 平台评分/评价数 | 选品参考 | ❌ 1688 详情页无评分字段(评分只在需求侧 WB feedbacks/rating、Ozon reviews/rating) |
★★★ |
| 供应商可用性 | 全平台 | 1688 链接有效率:inactive 品 25%、active 品 62% → 必须实核,失效标 invalid,不许编数据 |
★★ |
1.5 🔴 重量单位口径(本项目最贵的一类事故)
同一页有两条重量、两种单位,读错差 1000 倍:
| 字段 | 单位 | 说明 |
|---|---|---|
productPackInfo.fields.unitWeight |
千克 kg | 如 0.010 = 10g |
…pieceWeightScaleInfo[].weight |
克 g | 同模块 columnList.label 直接写 重量(g) |
…length/width/height |
厘米 cm | label 长(cm)/宽(cm)/高(cm) |
…volume |
cm³ | label 体积(cm³) |
L2 CSV weight_raw |
文本 | 形如 重量(g)=75(来自属性表文本,不是 JSON) |
17 样本交叉验证结果:8 个一致 / 1 个冲突 / 6 个 unitWeight=0(未填)/ 2 个无包装表。
🔴 冲突样本 800850312791:unitWeight=0.001(1g) vs 包装表 50g,差 50×。
三个必须记住的坑
unitWeight是 kg 不是 g。技能1688-cross-border-sourcing/SKILL.md:55只写"重量单位是克"(那句针对的是属性表文本),照着读unitWeight会把 10g 当 0.010g。unitWeight = 0表示"未填",不是"零重"(6/17)。ozon_unit.py:86直接weight_g/1000.0而不判 0 → 会算出零运费、虚高毛利。- 历史事故(该技能原文):① "数值>50 才除 1000" → 10g 当 10kg,毛利 -2381%;② 改成"数值<5 就当 kg" →
重量(g)=3又变 3000g。正确做法是单位优先,其次按列语义兜底(实现见ru_market.py:215-236)。
1.6 口径冲突清单(不同脚本/文档互相打架,接线前必须裁决)
| 冲突 | A 说法 | B 说法 | 裁决 |
|---|---|---|---|
| 重量启发式 | select_candidates.py:95:">50 视为 g"(面向 Mongo package_weight,本身是 kg) |
ru_market.py:215-236:单位优先,1688 详情无单位时默认按 g |
面向不同数据源;同一合并表里两列并存(weight_raw=g / weight_kg_pool=kg),套错列就出事故 |
| 抓取正路 | 1688-cross-border-sourcing(英):详情页唯一可靠是 Desktop CDP,Firecrawl/Jina/直连都不行 |
1688-crossborder-sourcing(中):BDPM curl 才是正路(实测 4/4 成功、124–133KB),比派浏览器 agent 可靠 |
实际 new20-raw/*.html 是 500–676KB 正常页,与 BDPM 路线吻合 |
| MOQ 可得性 | 两个技能均称"取不到/不可靠" | raw 页 beginAmount 出现 20 次 |
B 正确,规格源于早期实现缺失 |
| 库名 | 英技能写 premiumproducts.products |
中技能与 premiumproducts-db 写 productpool1.products(221,874) / premiumproducts.products |
未裁决 ⚠ |
| 失效引用 | 英技能引用 ~/.hermes/scripts/1688_scrape_cdp.py 与 references/* |
— | 本机不存在(该技能只剩单文件)⚠ |
2. 店小秘官方导入模板字段(61 列,权威口径)★★★
来源:/tmp/dxm-Template.xlsx(官方 Template,build_dxm_import.py 直接读取表头,不手抄)。
表头形如 *ParentSKU\n(必填),代码用 core() 归一化后匹配——坑:直接用短名匹配会全部取空,文件表面看不出必填列全空(脚本注释原话)。
| 分组 | 列号 | 字段(官方表头) | 必填 |
|---|---|---|---|
| 标识 | 1 | *ParentSKU |
✅ |
| 2 | *SKU |
✅ | |
| 7 | UPC |
||
| 8 | landingPageUrl |
||
| 文案 | 3 | *产品标题 |
✅ |
| 4 | *产品描述 |
✅ | |
| 5 | 产品标签 |
||
| 44 | 英文申报名称 |
||
| 45 | 申报的本地名称 |
||
| 品牌/属性 | 6 | 品牌 |
|
| 10 | 颜色 |
||
| 11 | 尺寸值 |
||
| 9 | msrp |
||
| 来源 | 12 | 来源url |
|
| 价格 | 13 | *价格(USD) |
美元店铺必填 |
| 14 | *价格(CNY) |
人民币店铺必填 | |
| 15 | *运费(USD) |
美元店铺必填 | |
| 16 | *运费(CNY) |
人民币店铺必填 | |
| 49 | 申报价值(USD) |
||
| 库存 | 17 | *库存量 |
✅ |
| 图片 | 18 | 主图(URL)地址 |
|
| 19 | 变种图(URL)地址 |
||
| 20–38 | 附图1…附图19(URL)地址 |
||
| 39 | 附图20-100(URL)地址 |
||
| 物流/海关 | 43 | 重量(g) |
|
| 46/47/48 | 包裹长度/宽度/高度(cm) |
||
| 42 | 海关HS编码 |
||
| 50 | 件数 |
||
| 51 | 发货地区代码 |
||
| 合规 | 52–55 | 是否含粉末/液体/电池/金属 |
|
| 56 | 加州65号提案警告类型 |
||
| 57–61 | 加州65号提案化学品名称1..5 |
||
| 其他 | 40 | 备注 |
|
| 41 | 产品状态 |
注:这份模板偏 Walmart/通用 口径(有 UPC、msrp、landingPageUrl、加州65)。它是"产品级"字段;平台级的必填项不在这张表里,必须走各平台添加页(见 §4)。
3. 跨平台通用产品主档(语义归一,建议内部统一命名)
这是"我们应该在内部统一维护的最小完备集"。必要性 列的 ⭐ 表示"几乎所有平台都要"。
3.1 标识与来源
| 字段 | 单位/格式 | 来源 | 必要 | 备注 |
|---|---|---|---|---|
oid |
字符串 | 1688 | ⭐ | 主键;来源 URL 由它拼 |
sku / parentSku |
字符串 | 我方 | ⭐ | 店小秘模板列 1、2 |
sourceUrl |
URL | 1688 | ⭐ | 速卖通 #9、Walmart #1 都要求 ★★ |
ean / upc / isbn |
13 位 | EAN 台账 | 平台相关 | Walmart 要 ISBN(不是 UPC);Temu 要 EAN ★★ |
hsCode |
字符串 | 人工/类目库 | 模板列 42 | |
platformProductId |
字符串 | 平台回读 | 发布后才有 |
3.2 文案
| 字段 | 上限 | 规则 | 备注 |
|---|---|---|---|
title |
Walmart 100、Temu 120 | 过 filterTitle();窄义词同义替换(策略 B)+ 长度兜底 |
★★ |
bullets |
— | 逐条过 filterTitle |
Walmart keyFeatures、TikTok 描述 |
keywords |
TikTok 取前 10 | — | |
description(HTML) |
— | 必须含 <img> 产品图(速卖通 #7/TikTok #3/Temu #3) |
★★ |
mobileDescription(HTML) |
— | 无线端单独字段(Temu describeInfoData.mobileDetail) |
★★ |
searchTerms |
— | TikTok 独立字段 | ★★ |
3.3 交易
| 字段 | 单位 | 规则 | 备注 |
|---|---|---|---|
price |
平台币种 | 见 §5 币种 | ★ |
原价/originalPrice |
同上 | Ozon 要求 售价 < 原价,改价必须同时抬原价 | ★★ |
declaredValue |
同上 | 与售价一致(速卖通 #6) | ★★ |
stock |
件 | — | ⭐ |
currency |
ISO | Ozon/TikTok/Shopee 各不同 | ★★ |
msrp |
USD | 模板列 9 | |
运费 |
USD/CNY | 模板列 15/16;速卖通走运费模板 | ★ |
promotionPrice |
— | Walmart 字段 |
3.4 物流与包装
| 字段 | 单位 | 规则 | 备注 |
|---|---|---|---|
weight |
见 §5 | 源克 → 平台单位,必须显式换算 | ★★ 曾把 130g 写成 130KG |
netWeight |
同上 | Temu 净重必须 < 重量 | ★★ |
packageLength/Width/Height |
cm 或 inch | 不得用重量推算;Walmart 转英寸 | ★★ |
shippingWeight |
lbs | Walmart 专用 | ★★ |
freightTemplate / promiseTemplate |
id | 速卖通 | ★★ |
warehouse / 发货地区代码 |
— | TikTok/Walmart | ★★ |
含粉末/液体/电池/金属 |
bool | 模板列 52–55 |
3.5 图片与视频
| 字段 | 格式 | 规则 |
|---|---|---|
mainImages[] |
外链数组 {url,imgUrl,name,width,height(,checked)} |
上传前过 filterProductImages()(剔详情图)★★ |
variantImages[] |
同上 | 每个变种只放自己的图,不能串图(TikTok #4/Walmart #7/速卖通 #8)★★ |
mainImage(单图串) |
| 分隔 |
Walmart/Temu 的落库形态 ★★ |
squareImage |
单图 | SHEIN 方图字段 ★★ |
materialImage / packageImages |
数组 | Temu 专用 ★★ |
sizeChartImage |
单图 | Temu 第 4 张 = cm/inch 双标尺寸图 ★★ |
whiteBgImage |
≥800×800 | 内网 FlairGS /api/white-bg,3.6s,可用 ★★ |
sceneImage |
3:4 | flux 可用但构图不合格;forge 不可用 ★★ |
video / videoUrl |
URL | 速卖通/TikTok 有槽位,当前未填 ★ |
3.6 变种
| 字段 | 说明 |
|---|---|
variantTheme |
变种主题(颜色/尺码);TikTok 还要求主题图 ★★ |
option1/2/3 + option1Value/... |
TikTok raw 字段命名(最多 3 个变种维)★★ |
skuDataList[] |
Temu 的 SKU 行:length,width,height,weight,netWeight + 货号/EAN/价格 ★★ |
variantList[] |
通用:sku, price, salePrice, quantity, imageList, weight, packageL/W/H ★★ |
saleProp / propertyInfo |
Lazada/Shopee 变种属性 ★★ |
3.7 合规
| 字段 | 取值 | 来源 |
|---|---|---|
brand |
无品牌 |
硬要求 ★★ |
isNoBrand |
true |
Walmart 独立开关(walmartAttrStore.isNoBrand),光写 brand 不生效 ★★ |
countryOfOrigin |
China |
Walmart Country of Origin-Substantial Transformation ★★ |
manufactureId / 产地 |
供应商产地或固定 id | 速卖通写死 9441741844(待改)★★ |
高关注化学品 |
none |
速卖通写死 id 23399591357(待改)★★ |
productManual |
文件 | 速卖通类目相关强制 ★ |
3.8 店铺与类目
| 字段 | 说明 |
|---|---|
shopId |
店铺;TikTok/Walmart/Ozon 用下拉 |
siteIds[] / sites |
TikTok 多站点(全选后 ["5880928","5880883","5880945"])★★ |
categoryId / fullCid |
类目;必须与店铺授权类目对应,不得猜 ★★ |
categoryName / nodePath |
展示名/路径 |
attributes / productAttributes |
类目属性(各平台结构不同) |
sizeChart / sizeTemplateId |
尺码表 |
4. 各平台字段对照(店小秘侧)
4.1 平台清单与规模 ★★★(库内真实数据,products.listings)
店小秘(source=dianxiaomi)
| 平台 | 接口模块 | raw 字段数 | 待发布 | 在线 | 发布失败 |
|---|---|---|---|---|---|
| 速卖通 | smtProduct |
191 | 293 | 1,682 | — |
| 速卖通全托管 | smtProduct(cus) |
126 | 34 | 185 | 2 |
| Ozon | ozonProduct |
10 + products[] 45 |
52 | 20,415(组 2,593) | — |
| TikTok | tiktokProduct |
167 | — | 4,257 | — |
| Shopee-全球 | shopeeProduct |
141 | 1 | 3,577 | — |
| Walmart | walmartProduct |
35 | 48 | 2,090(组 1,068) | 6 |
| SHEIN | sheinProduct |
48 | — | 710 | — |
| Lazada | lazadaProduct |
61 | — | — | — |
| (Joom / aliChoice) | — | — | 未接入同步 | — | — |
妙手(source=miaoshou)
| 平台 | key | raw 字段数 | 待发布 | 在线 |
|---|---|---|---|---|
| Temu 全托管 | pddkj |
73 | 45 | 55,462 |
| TikTok | tiktok |
84 | 2,744 | — |
| Shopee | shopee |
74 | 37 | — |
| SHEIN | shein |
61 | 44 | — |
| Ozon | ozon |
— | 采集箱 1,555(未发布) | — |
4.2 平台字段落点(写入路径)★★
落点 = Pinia store 路径 或 DOM selector。改 store ≠ 落库,见 §10。
Walmart(保存体是 zip 的 multipart,内含 walmartSave.txt)
| 字段 | 落点 |
|---|---|
| Product Name | walmartProductStore.formState.productName |
| 产品标识符类型 | walmartProductStore.formState.productIdType = ISBN(原 UPC,已改) |
| 产品标识符值 | walmartProductStore.formState.productId |
| 品牌 | walmartAttrStore.formState.brand = 无品牌;并 isNoBrand=true + 点 .ant-checkbox-wrapper |
| 价格/库存/运输重量 | walmartPriceShippingStore.formState.{price, inventory, shippingWeight}(重量 lbs) |
| 描述/keyFeatures | walmartDescStore.formState(HTML bullets) |
| 主图 | walmartImgStore.formState.mainImage(必须 hover→「网络图片」贴 URL)⚠ 当前不落库 |
| 来源URL / Country of Origin | 页面 DOM 字段(已确认存在,待接) |
| 变种 | basic.hasVariant=false(当前被关掉,需求 #7 要求开启) |
Temu
| 字段 | 落点 |
|---|---|
| productName | temuAddProductStore.$state.formState.productName |
| 主图/材质图/包装图 | 同 store .mainImage / .materialImage / .packageImages |
| 描述(PC/无线) | temuAddStore.$state.describeInfoData.{detail, mobileDetail} |
| 类目 | temuAddBasicStore.$state.formState.categoryId(store 直读类目 1038 个) |
| SKU 行 | temuAddSkuDataStore.$state.formState.skuDataList[](length/width/height/weight/netWeight) |
| 变种属性 | temuAddSkuAttrStore.$state.formState(用 .theme-value-add 手动输值+添加,改 store 无效) |
| 其他 | temuAddOtherStore.$state |
| ⚠ 条件必填 | 产地=中国 → 省份必填;报错层层递进 |
TikTok(价格 MYR)
| 字段 | 落点 |
|---|---|
| 店铺/站点 | tiktokGlobalAddBasicStore.formState.{shopId, siteIds, categoryId}(多国+复制用「全选」) |
| 标题/关键词/描述 | tiktokGlobalAddProductStore.formState.{productName, searchTerms, description}(描述含 <img>) |
| 品牌 | tiktokGlobalAddStore.attrsInfo = 无品牌 |
| 货到付款 | tiktokGlobalAddOtherStore.$state.logisticsFormState.isCodOpen = 1(不是 dxFormState) |
| 主图 | tiktokGlobalImgStore.formState.mainImage[] |
| 变种图 | skuDataList[i].image / tiktokGlobalSkuUsImageStore.skuUsImageMap(美国站专用,本店 isSupportSkuUsImage=false)⚠ 未完成 |
| 重量/尺寸 | 重量 setItem('重量');尺寸规格三个 input 按 placeholder 长/宽/高(回读 长=130 宽=78 高=26) |
| 来源URL | setItem('来源URL') = https://detail.1688.com/offer/<oid>.html |
速卖通(价格含税;check_box 属性值必须是数组)
| 字段 | 落点/说明 |
|---|---|
| 品牌 | 属性:无品牌 / NONE(无品牌) |
| 产地 | 属性 id 9441741844(硬编码,待改) |
| 高关注化学品 | 属性 id 23399591357(硬编码,应 none) |
| 图片 | imageList,外链对象 {id,url,name,width,height,imgId,checked} |
| 描述 | CKEDITOR(PC+无线),需插图 + 规范 HTML |
| 价格/货值 | 零售价/货值(原硬编码 1.99/0.50,须一致) |
| 重量/尺寸 | 原硬编码 0.02kg / 10×5×3(待用 1688 实抓) |
| 运费/服务模板 | freightTemplateId / promiseTemplateId |
| SKU | smtProductSkuList[](含 eanCode, skuPrice, skuStock, skuImage, packageWeight…) |
| 说明书 | productManual(类目相关强制,缺失会被 MYJ.message.error 吞掉) |
SHEIN
| 字段 | 落点 |
|---|---|
| 图片 | sheinImgStore.formState.squareImage(方图) + mainImgData.{multipleSpuImgs, singleSpuImg} ⚠ 全部写住仍不落库,见 §10 |
| 类目 | 需两个规格(点 .theme-select-box 加 尺寸(Size)) |
| 顺序 | 必须「规格 → SKU → 尺码表」(加规格会重建 SKU 行) |
Shopee
| 字段 | 说明 |
|---|---|
| 列表字段名 | itemName(不是 title) |
| 模式 | 单件模式 type='single' 绕开变种 |
| 图片 | mainImages(原脚本把主图+详情图全量塞入 → 已加过滤器) |
| 重量 | 字段单位 KG,输入是克 → 必须 g/1000 |
| 尺寸 | 原用重量推算(W = weight×1.3)→ 必须改 1688 实抓 |
Ozon
| 字段 | 说明 |
|---|---|
| 价格 | CNY;variantList[].price(原价) / salePrice(售价),售价必须<原价 |
| 保存 | 按钮是「保存并移入待发布」 |
| 在线口径 | 返回合并组:productNum/count 才是子商品数 |
⚠ Ozon 没有建品脚本:
~/ozon*只有ozon定价/(算价)与ozon改价/ozprice_set.mjs(只写「价格/原价」两个字段,入口/web/ozonProduct/edit?id=<pid>,原价 = 售价×1.2 向上取整 2 位,且唯一有 API 级回读:GET /api/ozonProduct/add.json?id=<pid>→variantList[].price/.salePrice)。 全盘 find 无ozon建品目录 → Ozon 字段清单无法从代码抽取,要补必须先写脚本。
4.3 跨平台字段名对照表 ★★(同一语义,8 个平台叫法完全不同)
| 语义 | SMT 速卖通 | Shopee | SHEIN | Temu | Joom | aliChoice | Walmart | TikTok |
|---|---|---|---|---|---|---|---|---|
| 标题 | DOM「产品标题」 | …ProductStore.title |
sheinAddProductStore.productName |
temuAddProductStore.productName |
smtChoiceAddBasicStore.name |
smtChoiceAddBasicStore.subject |
walmartProductStore.productName(+DOM) |
tiktokGlobalAddProductStore.productName |
| 描述 | CKEditor setData |
…descriptionInfo.{descriptionText,descriptionHtml} |
— | — | smtChoiceAddBasicStore.description |
smtChoiceAddStore.describeInfoData.detail+CKEditor |
walmartDescStore.description(+DOM) |
…AddProductStore.description |
| 卖点 | 并入描述 | 并入 descriptionText | — | — | 并入 description | 并入 detail | walmartDescStore.keyFeatures |
…AddProductStore.keyProductFeatures |
| 搜索词/标签 | 并入「Keywords:」 | 并入 descriptionText | — | — | smtChoiceAddBasicStore.tags |
— | — | …AddProductStore.searchTerms |
| 价格 | DOM「零售价格」 | DOM「价格」←price_cny |
sheinSkuDataStore.skuDataList[i].skcRetailPrice |
temuAddSkuDataStore…skuDataList[i].suggestedPrice |
joomAddPriceStore.price |
smtChoiceSkuDataStore…skuDataList[i].skuPrice |
walmartPriceShippingStore.price(+DOM) |
SKU 表列「本地展示价」←price_myr |
| 供货/成本 | — | — | …supplyPrice |
…supplierPrice |
仅 declaredValue | — | — | — |
| 货值/报关 | DOM「货值」 | — | — | — | joomAddPriceStore.declaredValue |
— | — | — |
| 库存 | DOM「库存数量」 | DOM「库存」 | …stockVariety |
(SKU 行无) | joomAddPriceStore.inventory |
— | walmartPriceShippingStore.inventory(+DOM) |
SKU 表列「库存」 |
| 重量 | DOM「重量(kg)」+「包装后重量」 | DOM「重量」←weight |
…skuDataList[i].weight |
…weight/.netWeight |
— | …packageWeight |
walmartPriceShippingStore.shippingWeight←weight_lbs(+DOM 运输重量) |
DOM「重量」←weight |
| 尺寸 | placeholder 长/宽/高 +「包装后尺寸」 | placeholder 长/宽/高←重量推导 | …length/width/height |
…length/width/height |
— | …packageLength/Width/Height |
(未写;dimsToInch 备而未用) |
placeholder 长/宽/高←重量推导 |
| 品牌 | smtAddAttrStore.dynamicFormData[品牌id]='history-…' |
— | 必填属性兜底 | — | 必填属性兜底 | 必填属性兜底 | walmartAttrStore.brand+DOM |
— |
| 产地 | dynamicFormData[产地id]='history-…' |
— | 必填属性选「中国/China」 | temuAddProductStore.productOrigin='CN'+region2Id |
— | 必填属性兜底 | — | — |
| 类目 | smtAddBasicStore.categoryId(弹窗) |
input[placeholder="搜索分类名称"] |
同左→sheinAddBasicStore.categoryId |
同左→temuAddBasicStore.categoryId |
.ant-select-selector 可搜索 |
弹窗 | .ant-select-selector 可滚动下拉全等 |
弹窗 |
| SKU/货号 | — | — | …skcSupplierCode(SHEIN-001) |
…extCode(TM-<pid>-<n>) |
smtChoiceAddBasicStore.parentSku(JM-<pid>) |
…skuCode(AC-<pid>-<n>) |
walmartProductStore.sku(WM-<oid>) |
SKU 表列「SKU」(AM-<oid>) |
| EAN/UPC | — | — | — | …skuDataList[i].code(自算 EAN-13) |
— | — | productId←ean,productIdType |
— |
| 主图 | smtAddProductStore.imageList |
shopeeGlobalImageInfoStore.$state.imageInfo.mainImages |
sheinImgStore.mainImgData.multipleSpuImgs |
temuAddProductStore.mainImage |
joomAddImageStore.imageList |
smtChoiceAddProductStore.mainImage |
walmartImgStore.mainImage |
tiktokGlobalImgStore.$state.formState.mainImage |
| 素材/详情图 | 并入 imageList | 并入 mainImages | — | .materialImage+packageFormState.packageImages |
.detailImageList[0].images |
— | (walmartPackStore 未用) |
— |
| 变种/规格 | — | type='single'(绕开变种) |
.theme-select-item+.sku-option(上限 3 规格) |
.theme-value-add+temuAddSkuAttrStore.skuAttrs |
— | 原生 select「SKU分类」 | hasVariant=false |
「变种属性」input[class*="!w-200"]+「添加」 |
| 来源URL | — | DOM「来源URL」 | — | — | — | — | (已确认存在,待接) | DOM「来源URL」 |
| 物流属性 | smtAddProductStore.specialProductTypeList(直赋) |
— | — | — | — | 报错→.icon_edit2→勾「普货」(UI) |
— | — |
| 运费/包装 | 运费模板/服务模板/是否原箱/含关税 | — | — | packageShape=1、packageType=0 |
shipping='0'、msrp='' |
— | — | — |
落点分两类(决定改字段该走 store 还是走 UI) ★★
- ① 强一致,可
$state直赋:SHEIN/aliChoice/Temu 的 SKU 行、SMT 的dynamicFormData/specialProductTypeList、全部平台的图片数组。 - ② 必须走 DOM / 真实鼠标:Temu 变种值(
tmbatch.mjs:57注释明写"直改 store 无效")、Temu SKU 预览图(DOM click 打不开下拉)、SMT 描述(必须走 CKEditor 实例)、aliChoice 物流属性(必须走"先保存逼出报错→编辑弹窗")、所有平台的分类弹窗。 - 反例(可直改已建草稿):
tm_fixean.mjs:21-25证明编辑页skuDataList[i].code仍可直赋。
4.4 硬编码清单(全部"待改",按平台)★★
| 平台 | 硬编码项 |
|---|---|
| 速卖通 | 店铺 4024039;零售价 1.99 / 货值 0.50 / 库存 100;重量 0.02kg ×2;尺寸 10/5/3(两处);物流属性 ['1983471271:2025103'];品牌/产地/化学品 id 201512802/9441741844/23399591357;是否原箱=否;含关税=不含;运费模板默认 MY beauty 30g+1美金 |
| Shopee | 店铺 Ljbgkj;type='single';库存 999;类目关键词恒回退 Accessories |
| SHEIN | 库存 999;SKU 重量/长/宽/高 100/200/150/30;尺码表 10,18,3,2,18,5;前缀 SHEIN-;价默认 12.90;供货价默认 8.50;规格上限 3;产地=中国 |
| Temu | 店铺 ①Alimingpro;省份 43000000000002;productOrigin='CN';packageShape=1/packageType=0;变种 ['Black','One Size'];SKU 尺寸 20/15/3;重量/净重 100/90;EAN 前缀 69803093 + 起始 3448;价默认 19.90;成本默认 10 |
| Joom | 库存 999;shipping='0';msrp='';前缀 JM-;价默认 19.90;报关默认 10;详情图语言=英语;跳过 pid 676236596821,601964534137 |
| aliChoice | packageWeight=100;尺寸 20/15/3;前缀 AC-;价默认 19.90;valueFor 全部兜底;['单品单件','件/个'];普货;跳过 pid |
| Walmart | 店铺 Snowmountain;hasVariant=false;productIdType='UPC'(但 IN.ean 是 13 位 EAN);前缀 WM-;品牌默认 Generic(应为无品牌);库存 999 |
| TikTok | 店铺语义 AutoMavenShop_MY;变种默认 'Default';库存 999;描述 style 串;前缀 AM-;来源URL 模板 |
| Ozon(改价) | 原价 = 售价 × 1.2,向上取整 2 位 |
4.5 建品脚本的输入源矩阵(谁读哪个文件)★★
| 输入文件 | 消费者 | 键 |
|---|---|---|
tiktok建品/tk_input.json(48 条) |
TikTok / Shopee / SHEIN / Temu / Joom / aliChoice(6 个平台共用) | 实测恰好 11 键:title, bullets, keywords, imgs, cost, weight, price_cny, price_myr, guess, cat_kw, cat_fb |
| ↑ 缺键后果 | Shopee 要 sp_kw/sp_fb → 0/48 命中 → 类目恒 Accessories;无 ean → Temu 自造 EAN-13 |
— |
walmart建品/wm_input.json(46 条)+ wm_cats.json(152 类目) |
Walmart | title, bullets, keywords, imgs, weight(克,未用), ean, pc(未用), cat_index, cat, price_usd, weight_lbs |
/tmp/en_all.json + /tmp/wm_clean.json + /tmp/all48.json |
速卖通 | title/bullets/keywords;图片 URL 数组;仅用 keys |
shein_route.json / temu_route.json / alc_route.json / joom_route.json |
各自平台 | 类目/店铺路由 |
ean_cursor.json + ean_temu_used.txt |
Temu | EAN 游标,必须落盘防撞号 |
⚠ 两个 EAN 体系互不相通:Temu 用 69803093+4 位流水自造;Walmart 用 wm_input.json[oid].ean。
⚠ IN.weight(克)在 SMT/SHEIN/Temu/aliChoice 4 个平台完全没被读取;IN.guess 全平台 0 命中。
5. 单位 / 币种 / 长度口径(最高频事故区)
5.1 单位 ★★
| 量 | 源口径 | 目标平台口径 | 换算 |
|---|---|---|---|
| 重量 | 1688:unitWeight=kg / pieceWeightScaleInfo[].weight=g(两个字段并存);unitWeight=0 是"未填"不是零重;下游 IN.weight 多为硬编码占位 —— 详见 §1.5 |
TikTok/Shopee KG;Walmart lb;Temu 重量+净重(g/kg) | kg = g/1000;lb = kg×2.2046226;gToPound 已有 |
| 尺寸 | 1688 pieceWeightScaleInfo[].length/width/height = cm(⚠ 9/17 样本为 0) |
Walmart inch;Temu 尺寸图 cm/inch 双标 | inch = cm/2.54 |
| 净重 | 需 ≤ 毛重 | Temu:净重必须小于重量(否则保存被拒) | 需估算或人工 |
已发生过的真实事故:Shopee 把 130(g) 直接写成 130 KG;尺寸用重量推算得出 169×101×34 cm(★★ 需求 §3.5)。
5.2 币种 ★★
| 平台 | 币种 | 换算线索 |
|---|---|---|
| Ozon | CNY | 价格带 0–1500₽ ≈ 0–113¥(≈13.27₽/¥) |
| TikTok | MYR | MYR ≈ CNY × 0.60 |
| Shopee | CNY | — |
| Walmart | USD | — |
| USD 通用 | — | USD = CNY ÷ 6.68525(店小秘 siteAndUsCurrencyRate) |
| KZT(哈萨克线) | KZT | KZT_PER_CNY = 66.84 |
5.3 长度上限
| 平台 | 上限 | 证据强度 |
|---|---|---|
| Walmart | 100 | ★★ 需求 §3.9 实测(改写 9 条、超限 0、触发长度兜底 1 条) |
| Temu | 120 | ★★ 需求 §3.9 |
| 其他平台 | 脚本里有 slice(0, 60/90/110/120/150/160/170) |
❓ 多为日志截断,不等于平台上限,接规则前须逐平台确认 |
6. 词表与过滤规则 ★★(lib/listing-rules.mjs,已单测)
| 常量 | 内容 | 用途 |
|---|---|---|
BRAND_DEFAULT |
无品牌 |
全平台默认品牌 |
NARROW_WORDS |
boy/boys/girl/girls/children/child/kids/kid/school/teen/teenager/toy/toys/student/baby/babies/infant/toddler(25 词) | 窄义(儿童/学生)词 |
RISK_WORDS |
中文侵权(侵权/仿/高仿/同款大牌/假货/A货/精仿/原单/山寨/盗版)+ 英文仿冒(replica/fake/knockoff/counterfeit/inspired by/same as/dupe/oem/authorized)+ 硬违禁(weapon/knife/gun/ammo/drug/cbd/medicine/cure/treatment/medical grade/fda approved/antibacterial/sterilize/virus/covid)+ 促销词(best price/hot sale/free shipping/buy now/discount/promotion) | 侵权/违禁 |
PLATFORM_RULES |
walmart {narrow:true,risk:true};temu {narrow:false,risk:true};smt/alichoice/tiktok/shopee/shein/joom/ozon {narrow:false,risk:true} |
各平台过滤集 |
SYNONYMS(策略 B 同义替换) |
for kids/children/girls/boys → for Ages 3+;kids… → Ages 3+;toys → Party Favors;toy → Party Favor;students → Learners;school(s) → Everyday;teens/teenagers → Ages 12+;babies/baby/infant(s)/toddler(s) → Ages 0+ |
保搜索语义 |
| 约束 | 替换目标自身不得命中词表(synonymSelfCheck());连续年龄段折叠成一个;超长自动退回硬删再截断 |
防"换皮继续违规" |
filterTitle(title, platform, {mode, maxLen}) |
replace(默认)/strip |
标题 |
filterDescription(html, platform) |
只过滤文本节点,标签不动 | 描述 |
cmToInch / kgToPound / gToPound / dimsToInch / declaredValue |
换算与货值一致 | §5 |
filterProductImages(urls, min=4) |
按 DETAIL_IMG_RE = /\/img\/ibank\/\d{4}\/\d{1,3}\/\d{1,3}\//(拍摄日期目录 = 详情卡)剔除;不足 4 张补回并标 warn |
图片卫生 |
实测效果(48 条真实标题):Walmart 改写 9 条、最长 100;Temu 改写 9 条、最长 106;TikTok 0 条(不过滤窄义词)。
⚠ 接线状态(grep 实证):没有任何线上建品脚本 import 这个规则库(工作副本 platform-wmt/、platform-temu/、platform-tkt/ 三份是补丁版,尚未同步进线上 ~/<平台>建品/)。后果:
filterProductImages()的keep没接回IN.imgs消费点 → 各平台仍上传未过滤的原始图数组(含详情卡/儿童 stock 图);cmToInch/kgToPound/declaredValue/dimsToInch全部备而未用 → 于是出现「速卖通货值 0.50 vs 售价 1.99」(declaredValue本可拦住)、「Walmart 的weight_lbs只能在输入文件里预先算好」。
7. 图片与视频规范
| 项 | 规范 | 证据 |
|---|---|---|
| 写法 | 全部外链(alicdn 等),对象形如 {url, imgUrl, name, width, height(, checked)},多数平台存数组 |
★★ |
| 例外 | Walmart 必须走「网络图片」UI,落成 | 分隔字符串;Temu mainImage 是 | 分隔外链串且能落库 |
★★ |
| 禁含 | 中文、促销字样、水印、联系方式(平台会删/拒) | ★★ |
| 主图 vs 详情图 | 1688 IN.imgs 混装;上传前过 filterProductImages();实测 48 商品 279 图里 12 张是详情卡 |
★★ |
| 儿童/模特图 | 含儿童的 stock 图在 Walmart/Temu 属高风险,一并剔除;模特图经 rembg 后模特仍在,不能当白底图 | ★★ |
| 白底图 | FlairGS POST /api/white-bg,800×800 / 3.6s,rembg 路线,不依赖 Forge ✅ 可用 |
★★ |
| 场景图 | flux POST /api/generate-scene(768×1024 / 66–76s)技术可用但构图不合格;forge 引擎 HTTP 500/503 ❌ |
★★ |
| 去水印/去中文 | 依赖 Forge,当前 503 ❌ | ★★ |
| 尺寸图 | Temu 第 4 张必须是 cm/inch 双标尺寸图 | ★★ |
| SHEIN 特有 | squareImage(方图)+ mainImgData.{multipleSpuImgs, singleSpuImg},且页面有「新版/旧版图片」模式开关 |
★★ |
| 视频 | 速卖通(video/videoUrl/installVideo)、TikTok(videoUrl/videoId/videoPostUrl)均有槽位,当前未填 |
★★ |
8. 变种/变参体系(当前最弱的一环)
| 平台 | 现状 | 目标 |
|---|---|---|
| 速卖通 | 无变参(smtProductSkuList 未填) |
建变参(颜色/尺码)+ 变参图 |
| TikTok | 只填了变种属性值;变种主题图未完成(字段候选已列出) | 每个变种主题挂图 |
| Walmart | hasVariant=false(变参被关掉) |
开启变参 + 逐变参隔离图片 |
| Temu | SKU 行已建(含尺寸/重量/净重),变种属性靠 UI .theme-value-add |
已完成主体 |
| 通用字段 | variantTheme, option1/2/3(+Value), variantList[], skuDataList[], variantImageIdMap, variationListStr |
— |
硬规则:变参图只能有当前变参的图,不能串图(TikTok #4 / Walmart #7 / 速卖通 #8)。
9. 合规与平台特有硬性要求(逐条可验收)
| # | 平台 | 要求 | 状态 |
|---|---|---|---|
| 1 | 速卖通 | 类目必须与店铺(4024039)授权类目对应,不得猜 | ❌ 待做(白名单) |
| 2 | 速卖通 | 标题用平台热词/长尾词(接 LLM) | ❌ 待做 |
| 3 | 速卖通 | 星号必填逐项填(产地/高关注化学品,类目有差异) | ⚠ 写死 id |
| 4 | 速卖通 | 主图无中文/促销字;一键生成白底(1:1)/场景(3:4)图 | ⚠ 白底可用、场景不合格 |
| 5 | 速卖通 | 产品视频 | ❌ 未填 |
| 6 | 速卖通 | 零售价与货值一致 | ⚠ 硬编码 1.99/0.50 |
| 7 | 速卖通 | PC/无线端描述带图 + 规范 HTML | ❌ 纯文字 |
| 8 | 速卖通 | 变参与变参图 | ❌ |
| 9 | 速卖通 | 来源 URL | ❌ |
| 10 | TikTok | 多国勾选 + 复制到其他店铺「全选」 | ✅ siteIds 已验证 |
| 11 | TikTok | 品牌=无品牌 | ✅ |
| 12 | TikTok | 描述含产品图 | ✅ |
| 13 | TikTok | 变种主题图 | ❌ |
| 14 | TikTok | 长/宽必填 | ✅ 回读 130/78/26 |
| 15 | TikTok | 货到付款 | ✅ isCodOpen=1 |
| 16 | TikTok | 类目白名单 | ❌ |
| 17 | Walmart | 来源 1688 URL | ❌ |
| 18 | Walmart | 标题/描述过滤窄义词 | ✅ 已接 |
| 19 | Walmart | 标识符 = ISBN | ✅ 保存级验证 |
| 20 | Walmart | 品牌 = 无品牌 | ⚠ 批量里 store/checked 不一致,待编辑页确认 |
| 21 | Walmart | Country of Origin = China | ❌ |
| 22 | Walmart | 尺寸→英寸、重量→英镑 | ⚠ 重量已 lbs,尺寸未处理 |
| 23 | Walmart | 变参图隔离 | ❌(变参本身被关) |
| 24 | Temu | 标题过滤违禁/侵权 | ✅(本批无命中) |
| 25 | Temu | 图片无中文;第 4 张 cm/inch 尺寸图 | ❌ |
| 26 | Temu | 产品描述 | ✅ 已写 describeInfoData |
| 27 | Shopee | 剔除详情图(工厂照/证书/流程图/退货/FAQ) | ✅ filterProductImages() |
| 28 | Shopee | 重量克→千克 | ⚠ 已识别,待接线 |
| 29 | SHEIN | 图片落库 | ❌ 写 store 不进保存载荷 |
10. 校验与回读(验收口径,不接受的写法)
教训(建品质量需求.md §3.11 原话):回读校验必须断言"字段非空且与期望相等",只查"没有禁词"会自欺。
第一版回读读的是 hit.name,而 Walmart 列表里标题字段叫 productName → "没找到字段 → 空串 → 判定无禁词"成了假阳性。
| 平台 | 回读接口 | 关键字段 | 判据 |
|---|---|---|---|
| Walmart | POST /api/walmartProduct/pageList.json |
productName / platformTitle / mainImage / productIdType |
标题精确相等 + 图片非空 |
| Temu | POST /api/pddkjProduct/pageList.json(模块名是 pddkjProduct) |
productName |
精确相等 ✅ |
| SHEIN | POST /api/sheinProduct/pageList.json + shopId=-1&dxmState=offline&productSearchType=1(没有 dxmOfflineState) |
mainImage |
非空(用错参数 totalSize=0 会误判"没建成") |
| 通用 | POST /api/<模块>Product/pageList.json |
data.page.list |
— |
通用铁律
- 写 store ≠ 落库:SHEIN 三个图位全写住仍
mainImage:"";WalmartmainImage同类问题(一次保存全过程 22+ 条/api/请求没有任何图片上传接口,最终 POST 载荷仅 12 字节)→ 必须抓保存 POST 载荷判断"没进载荷"还是"要走上传递交"。 idStr ≠ id:大整数在 JS 里丢精度,服务端操作(删除/详情)一律用idStr。- "点保存没反应"先挂钩子:校验报错被
MYJ.message.error吞掉,且层层递进(修完 A 才显示 B)。 - 改 store 后校验仍失败:UI 异步同步,再点一次保存可能就过。
- 类目不能猜:必须与店铺授权类目对应,无匹配跳过不硬选。
- 跑之前先查重:否则重试会产生重复(本会话踩过同一商品建 3 份)。
11. 我们自己的落库结构(products.listings)★★★
{
source: "dianxiaomi" | "miaoshou", // 同一集合双来源
platform: "ozonProduct", // 接口模块名
platformName: "Ozon", // 展示名
state: "waitPublish" | "publishFail" | "online",
stateName: "待发布",
docKey: "184807701684308597", // idStr → productId → mergeId → 兜底哈希
title, shopId, platformProductId,
price, currency, categoryId, categoryName,
mainImage, errMsg,
createTime, updateTime,
childCount: 3, // 合并组/变种子项数
syncedAt, firstSeenAt, runId, gone, goneAt,
raw: { ...原始 item... } // ★ 平台字段全量在这
}
索引:uniq_listing(source, platform, state, docKey)、by_state、by_synced、by_title(text);同步账本 products.sync_runs。
口径铁律:Ozon / Walmart 的「在线」返回的是合并组,不是子商品 —— 统计要用 ΣchildCount(Ozon 在线:组 2,593 → 子商品 20,415;Walmart:组 1,068 → 2,090)。分页行数不等长且会重复返回,脚本按 docKey 去重。
12. 妙手(miaoshou)侧
平台 key → 名称(sync_msp_listings.py:ITEM_KEYS 22 个是接口实测认的键;PLATFORM_NAMES 39 个另含授权页专用键 —— *Choice/*Gs/*Scs/*Fc/*Local 这类item 接口不认、会返回 HTML):
pddkjTemu全托管 · pddkjChoiceTemu半托管 · pddkjLocalTemu本土 · shopee · shopeeScsShopee全托管 · shopeeSwarmShopee轻出海 · tiktok · tiktokGsTikTok全托管 · lazada · lazadaChoice · ozon · yandex · wildberries · aliexpress · aliexpressChoice速卖通半托管 · aliexpressFc速卖通全托管 · aliexpressLocal速卖通本土POP · aliexpressOverseas速卖通海外托管 · amazon · coupang · alibaba · wish · shopify · daraz · joom · allegro · qoo10 · shoplazza · jumia · walmart · shopline · shein · sheinChoiceSHEIN半托管 · emag · noon · miravia · joybuy · mercadoMercado Libre
妙手的状态机:只有 waitPublish(采集箱未发布)/ online(发布成功)两态。
12.1 接口信封(实测确认)★★★
| 接口 | 关键参数 | 响应键 |
|---|---|---|
POST /api/auth/shop/getShopList |
pageNo,pageSize,platform,includeShopeeGlobal=0,excludeShopeeCnscShop=0(缺后两个报「页码数据有误」) |
shopList[](取 shopId/id) |
POST /api/platform/<key>/item/item/searchItemList(在线) |
titleType=multi + 必须带 shopIds[i](否则「没有符合条件的记录」) |
{result,itemList,total} |
POST /api/platform/<key>/move/collect_box/searchCollectBoxDetail(待发布) |
claimPublishShopStatus=published&titleType=multi&remarkType=multi&status=notPublished |
{result,detailList,total} |
POST …/collect_box/getTabCountStatMap |
— | {count,notPublishedCount,publishedCount,timingPublishCount,aiOptimize*} |
| 错误 | — | {result, reason}(reason 即错误文案) |
边界:yandex 回 HTTP 200 + 空体 = 无此功能,脚本按 _empty 处理,不报整轮错误。
12.2 入库字段映射(source='miaoshou')★★
| 字段 | 取值候选(按序) | 备注 |
|---|---|---|
docKey |
collectBoxDetailId→itemId→id→sourceItemId,兜底 'h'+hash(item) |
幂等唯一键 |
title |
title→itemName→name→productTitle→itemNum |
|
shopId |
shopId / authShopId |
|
platformProductId |
platformItemId |
|
price |
salePrice(非空优先) → price → minSkuPrice |
⚠ 与店小秘顺序相反(店小秘 price→salePrice) |
currency |
currency / sourceCurrency |
|
categoryId |
cid / categoryId |
|
categoryName |
硬编码 None |
妙手侧未取 |
mainImage |
picUrl / listThumbnail / thumbnail |
|
errMsg |
reason |
|
createTime/updateTime |
gmtCreate/ts;gmtModified |
|
childCount |
硬编码 None |
妙手无合并组映射 |
raw |
原始 item 全量 | 保底 |
⚠ 上表 API 侧键名来自脚本
first_of候选列表("脚本认为可能存在");能确证有值的只有信封的total/itemList/detailList。
12.3 妙手平台与计数(msp-platforms.json / msp-collectbox.json)★★★
| 平台键 | 店铺 | 采集箱 count | 待发布 | 已发布 | 在线 |
|---|---|---|---|---|---|
| pddkj(Temu全托管) | 14 | 46 | 45 | 1 | 55,462 |
| tiktok | 0 | 4,341 | 2,744 | 1,597 | — |
| shopee | 0 | 170 | 37 | 133 | — |
| shein | 0 | 44 | 44 | 0 | — |
| ozon | 0 | 1,555 | 0 | 1,555 | —(无店铺,在线同步不了) |
| 其余 16 键 | 0 | 0 | 0 | 0 | — |
- 有「待发布」数据:
pddkj 45 + shopee 37 + tiktok 2744 + shein 44 = **2870** - 有「在线」数据:仅 pddkj = 55,462
- ⚠ 口径冲突:pddkj 采集箱「已发布」只有 1,而在线 55,462;ozon 采集箱「已发布」1,555 却无店铺 → 采集箱「已发布」≠ 产品管理「在线」,勿混用。
- ⚠
msp-platforms/collectbox/shops.json三个 JSON 是孤儿快照(sync_msp_listings.py不读它们,生成脚本未找到)。msp-shops.json是空{}。
12.4 妙手刊登/导入参数(有来源)★★
| 参数 | 内容 | 来源 |
|---|---|---|
导入「链接采集」8 列 .xls |
产品主编号(1688 id,必须)、链接地址(必填)、产品标题、货币类型(必须,空报「不允许此货币类型」)、SKU售价(必须 ≥0.01)、SKU库存(必须 ≥0)、价格(RMB)、促销价(RMB) |
~/miaoshou/RECIPE.md(实测解析 47/0/47) |
| 页面下载的官方模板 | 仅 4 列(链接地址/产品标题/价格(RMB)/促销价(RMB)),缺 产品主编号 → 照它填必失败 |
同上 |
| ⚠ 文档矛盾 | archived/miaoshou-batch-import(2026-04) 断言「严格 5 列,绝不能加 产品主编号」;RECIPE.md(2026-09-21) 实测「必须加」 → 以 09-21 的 8 列为准(服务端模板已演进) |
— |
| 采集箱编辑弹窗 Tab | 基本信息 / 产品属性 / 销售属性 / 产品图片 / 产品视频 / 认证说明 / 物流信息 / 货源链接(容器 .collect-box-editor) |
archived/miaoshou-collect-box(369 行) |
| 标题 / 产品主编号 / 简易描述 / 详细描述 | 标题 input[type=text];主编号 input[1](placeholder「不填将自动生成」);简易描述 textarea[0] → 用于 Shopee/Wish/Joom/Mercado Libre/Ozon/Walmart;详细描述 iframe[0](富文本) → 用于 Lazada/速卖通/TikTok/Coupang/eBay/Allegro |
同上 |
| 促销价(RMB) | 表头注明「仅可用于采集到 Lazada」 | RECIPE.md |
| 采集箱筛选/动作 | 筛选:关联货源/产品标题/货源ID/货源价格;动作:任务记录/认领到/平台认领配置/批量编辑/分组/删除/创建产品/导入产品/列表设置 |
同上 |
| 导入任务列表 | 文件名称/导入时间/解析状态/成功条数/失败条数/操作(文件保留 90 天) |
同上 |
| Ozon 刊登必填 | 分类、标题(俄语)、描述、价格(¥×12Client ID + API Key |
1688-to-ozon-listing-workflow |
| Vue 状态同步 | 写值后必须 dispatch input/change/blur,否则点保存静默丢弃 |
archived/miaoshou-collect-box |
| 链接采集 URL 格式 | URL / URL$$title / URL||title |
miaoshou-erp/SKILL.md |
12.5 妙手 vs 店小秘 关键差异 ★★
| 维度 | 妙手 | 店小秘 |
|---|---|---|
| 平台键 | 裸键 pddkj,按平台分路径 /api/platform/<key>/… |
module 名 ozonProduct/smtProduct,统一 POST /api/<module>/pageList.json |
| 状态机 | 2 态 | 3 态(多 publishFail) |
| 在线前置 | 必须 shopIds[i] |
无需 |
| 发布失败 | 无对应状态,仅 errMsg ← reason |
独立状态 + errMsg/auditFailureReason |
| ID | collectBoxDetailId→itemId→…,无 idStr 概念 |
idStr→productId→mergeId,idStr 优先 |
| 价格键序 | salePrice→price→minSkuPrice |
price→salePrice(相反) |
| 子商品 | childCount=None |
products/productList 或 productNum/count(合并组) |
| 分页 | PAGE_SIZE=500(111 页 × 500 = 55,462 ✓) |
PAGE_SIZE=200(传 500 只回 100) |
| 图片 | 无外链/上传字段证据;靠「链接采集」由妙手服务端抓源页 | 建品表单全用外链;Walmart 例外走「网络图片」UI |
| 发布 | 未打通(子账号无发布权限) | 「保存并移入待发布」已跑通 |
| Joom | 纳入 | 默认排除 joomProduct |
12.6 妙手侧"无证据"清单(不编造)❓
- 妙手各平台刊登 API 字段(重量/尺寸/EAN/品牌/变种/类目差异)——零证据,无文档也无代码。
- 是否有
publishFail/ 定时发布状态(只有timingPublishCount计数键)。 msp-shops.json为空;店铺只在运行时getShopList现取。- 妙手侧
title/price/categoryId/mainImage候选键哪些真命中(无 raw 样本落盘)。 - 妙手图片是外链还是上传——未验证。
- 「采集并自动发布」是否真能发布——自述"待实测",权限口径有冲突。
妙手文档字段(raw,以平台为单位):公共骨架高度一致,含
collectBoxDetailId, collectBoxGroupId/Name, commonCollectBoxDetailId, platform, platformItemId, source/sourceItemId/sourceItemUrl/sourceSite/sourceShopName, sourceList[], title, thumbnail/listThumbnail, price, stock, minWeight/maxWeight, minSkuPrice/maxSkuPrice, sitePriceMap, siteAndCatMap, siteAndCidMap, shopIds, pubShopList, timingShopList, importTemplateType, copyType, dataPath, infringementDetectResult, taskProcessStatusList, status, gmtCreate/gmtModified
平台差异:TikTok 多 packageL/W/H, weight, siteWeightMap, isSupportReplicateProduct, *IncludeVat 等;Shopee 多 promotion, hasSavePrice/hasSaveSite/hasTranslate, maxOriginPrice;Temu 多 collectBoxDetailShopList[]{brandId, breadcrumb, cid, currency, sizeTemplateId…}。
与店小秘的差异:妙手用 collectBox(采集箱)作为待发布容器,字段名以 collectBox* 前缀;店小秘用 dxmState/dxmOfflineState 状态位。两者都保留 sourceItemUrl(1688 来源)。
13. 字段可得性矩阵(能不能自动拿到)
| 字段 | L1 源 | 自动可得 | 需人工/生成 | 备注 |
|---|---|---|---|---|
| 标题/卖点/关键词 | ✅ | ✅ | 需过滤 + 可 AI 优化 | |
| 价格/成本 | ✅ | ✅ | 定价公式已有 | |
| 重量 | ⚠ 口径不一 | ⚠ | ✅ 校核 | 单位事故高发 |
| 包装尺寸 | ⚠ 常缺 | ⚠ | ✅ | 禁止用重量推算 |
| 主图 | ✅ | ✅ | 必须过滤详情图/中文 | |
| 白底图 | — | ✅ | FlairGS 可用 | |
| 场景图 | — | ❌ | ✅ | flux 构图不合格 |
| 视频 | ❌ | ❌ | ✅ | 需生成或人工 |
| 变种定义 | ⚠ | ⚠ | ✅ | 1688 规格 → 变种映射 |
| 变种图 | ⚠ | ⚠ | ✅ | 串图风险 |
| 品牌 | ❌ | — | 固定 无品牌 |
|
| EAN/UPC/ISBN | ❌ | ✅ | 自建台账(S03 落账) | |
| 原产国/产地 | ⚠ 供应商 | ⚠ | ✅ | 默认 China |
| HS 编码 | ❌ | ⚠ | ✅ | 类目映射 |
| 高关注化学品 | ❌ | — | 固定 none |
|
| 说明书文件 | ❌ | ❌ | ✅ | 速卖通部分类目强制 |
| 类目 | ⚠ 猜 | ❌ | ✅ | 必须店铺授权白名单 |
| 尺码表 | ⚠ | ⚠ | ✅ | SHEIN/Shopee 需要 |
14. 待确认 / 缺口(按优先级)
P0(正在流血)
- 妙手 cookie 已过期,22 平台全
授权已经过期,而监控报 OK(见 §0)→ 需重登 + 修判据。 - SHEIN / Walmart 的
mainImage不落库(写 store 不进保存载荷)→ 需抓保存 POST 载荷定位。 - 规则库未接线:
filterProductImages / cmToInch / kgToPound / declaredValue / dimsToInch一个都没被线上脚本 import(见 §6)。
P1(字段口径)
4. 重量源口径未统一:unitWeight(kg) vs pieceWeightScaleInfo.weight(g),且 unitWeight=0 要当缺失(见 §1.5)。
5. IN.weight(克) 在 4 个平台完全没被读取,尺寸在 Shopee/TikTok 仍是重量推导、其余平台硬编码(见 §4.4/§4.5)。
6. 两个 EAN 体系互不相通(Temu 自造 vs Walmart 输入包),且都需回 S03 落账。
7. 各平台标题长度上限:只有 Walmart(100)/Temu(120) 实测;其余脚本里的 slice 不能当上限。
P2(能力缺口) 8. Ozon 无建品脚本(只有改价)→ 要 Ozon 字段清单必须先写脚本。 9. Temu 第 4 张尺寸图生成方式;场景图路线(等 Forge 还是 txt2img+PIL 合成)。 10. 变参体系:1688 规格 → 平台变种主题的对齐规则(含变种图隔离)。 11. 妙手各平台刊登字段:零证据,需要一篇自己的实测(妙手侧没有对应文档)。
P3(决策)
12. 存量 47×8 条是否补字段(走编辑页)还是作废重建。
13. 1688 抓取路线裁决:BDPM curl(实测可行)vs Desktop CDP(旧技能主张)。
14. 产品库库名冲突:premiumproducts.products vs productpool1.products。
15. 失效引用清理:1688-cross-border-sourcing 技能引用的 ~/.hermes/scripts/1688_scrape_cdp.py 与 references/* 在本机不存在。