店小秘多平台铺货配方(dianxiaomi crossborder playbook)
同一批 48 个 1688 商品铺到店小秘各平台的「待发布」。本仓库是可复用的配方 + 踩坑记录, 不是一次性脚本堆积——每个平台一个目录,含配方脚本、输入数据、逐条结果。
战果
| 平台 | 店铺 | 待发布 | 状态 |
|---|---|---|---|
| TikTok | AutoMavenShop_MY | 47 | 完成 |
| Shopee | Ljbgkj | 47 | 完成 |
| 速卖通 | 4024039 | 47 | 完成(含清理 4 份重复) |
| Walmart | Snowmountain | 46 | 完成 |
| Ozon | Yejet | 47 | 已建;改价 40/47 |
| SHEIN | 4 家分品类 | 40 | 完成(shbatch.mjs 自动批量;1 条因 ①箱包店发品额度用尽改挂 ②店) |
| Temu 全托管 | ①Alimingpro | 47 | 完成(tmbatch.mjs 批量 46 + 手工首条;预览图已解) |
| Joom | Dummer-Pets(84 家里的第一家) | 47 | 完成(jmbatch.mjs 批量 46 + 手工首条;与 aliChoice 共用 smtChoice* store) |
601964534137(遥控器保护套)18 张图全带水印、无干净图,所有平台统一跳过。
⭐ 最重要的一节:保存静默拦截诊断法
症状:点「保存」→ 不发 POST、无界面提示、无 .ant-form-item-has-error。
根因:校验确实失败了,但报错被 MYJ.message.error 吞掉;而且报错是层层递进的
(修完 A 才显示 B),所以肉眼和 DOM 扫描都抓不到。
解法——在点保存之前挂钩子:
window.__cap = [];
function wrap(o, n, l) {
const f = o[n];
o[n] = function () {
window.__cap.push(l + ': ' + [...arguments].map(a => typeof a === 'string' ? a : JSON.stringify(a)).join(' '));
return f.apply(o, arguments);
};
}
['error','warning','info','success'].forEach(k => wrap(MYJ.message, k, 'MYJ.' + k));
['error','warning','info','success'].forEach(k => wrap(antd.message, k, 'antd.' + k));
点保存 → 读 window.__cap。
为什么之前的「必填扫描」不够:扫 .ant-form-item-required 且为空,漏掉两类——
条件必填(Temu 的省份,只有「产地=中国」才出现)和类目相关的文件字段
(速卖通的商品说明书,有些类目强制、有些不强制)。
详见 静默拦截诊断/HOOK.md。
各平台要点速查
| 平台 | 目录 | 最独特的一点 |
|---|---|---|
| Ozon | ozon改价/ |
保存按钮是**「保存并移入待发布」**;价格是 CNY;改价必须同时抬高原价,否则报「售价需小于原价」 |
| TikTok | tiktok建品/ |
价格 MYR;图片 store 直接吃外链数组 |
| Shopee | shopee建品/ |
用单件模式绕开变种;价格 CNY;列表字段是 itemName 不是 title |
| Walmart | walmart建品/ |
保存体是 zip 的 multipart;Brand 必须点「无品牌」;图片必须 hover 开下拉走「网络图片」 |
| 速卖通 | 速卖通建品/ |
check_box 属性值必须是数组;idStr ≠ id |
| SHEIN | shein建品/ |
店铺锁品类;一个产品最多 3 个规格(加满就停);加规格会重建 SKU 行;类目动态必填属性(.attr-label.required)不填只报「产品信息中有错误」 |
| Temu | temu建品/ |
类目 1038 个从 store 直读;规格是 .theme-value-add(必须手动输值再点「添加」,与 SHEIN 不同构);主图必须满 5 张;预览图逐行点单元格 → 引用产品轮播图 → 全部 → 选择 |
| Joom | joom建品/ |
店铺是复选框组(85 个 = 全部+84 店,别碰「全部」);类目是可搜索下拉平铺列表;商品数据落在 smtChoiceAddBasicStore(与 aliChoice 同构,不在 joom* 里) |
通用技术事实
- Chrome CDP 端口 9223,profile
/tmp/dxm7 - 列表路由:
/draft= 采集箱,/offline= 待发布(找不到刚存的货,先确认进的是offline)- Temu 全托管
/web/temu/choiceTemuList/*;Temu 半托管 POP/web/popTemu/pageList/* - Temu 全托管保存接口
/api/pddkjProduct/add*.json(拼多多跨境 = Temu 全托管)
- Temu 全托管
- 站点是 Vue3 + Pinia:
document.querySelector('#app').__vue_app__.config.globalProperties.$pinia._s.get('<store>').$state - CDP helper:
cdp3.mjs(newTarget/attach/closeAllTabs/CDP/SAN),ESM,不能用 require- 平时跑在
/tmp/cdp3.mjs,是 /tmp 下的临时文件,重启机器会丢 → 仓库根目录有备份, 丢了cp cdp3.mjs /tmp/cdp3.mjs即可 - ⚠️ 同一个 URL 开了多个标签时,
attach(url)会抢到最后一个匹配的标签。 批量脚本请用shein建品/sh_lib.mjs的newPage(url):按 target 直连,不会抢错
- 平时跑在
- VNC:
http://192.168.9.122:6097/vnc.html或:6100(免密)
二十条会重复踩的坑
-
保存静默拦截 → 挂钩子,别猜
-
idStr ≠ id→ 大整数精度丢失,服务端操作一律用idStr -
!w-200不是合法 CSS 类选择器 → 用input[class*="!w-200"] -
antd select 吃 DOM click,但有些组件只吃真实鼠标事件
-
hover 触发的下拉点不开 → 先
mouseMoved再click -
加规格会重建 SKU 行 → 顺序「规格 → SKU → 尺码表」
-
store 赋值后 UI 异步同步 → 当次校验可能仍失败,再点一次保存
-
类目决定是否强制资质文件(速卖通某些类目要上传说明书)
-
SHEIN 店铺锁品类 → 不能用「首字母第一家店」
-
pkill -f <pat>会自杀 → 用[.]技巧(pgrep -f 'foo[.]sh') -
SKU 表里「一格一图」的弹窗是单格的 → 勾「全部」只作用当前行,N 行要走 N 遍 (Temu 预览图就是这样:点
.sku-image单元格 → 引用产品轮播图 → 全部 → 选择) -
选了类目别忘了确认弹窗关了 → 弹窗还开着时后面的点击全被挡,最后只会看到 「请上传预览图」这种牛头不对马嘴的报错(Temu 有 13 条就是这么挂的)
-
SHEIN 规格上限 3 个 → 主题列表里看着能全点,点第 4 个就报「规格最多选择3个」
-
类目动态必填属性(
.attr-label.required,如下拉、勾选组)不填不给具体提示, 只报「产品信息中有错误,请检查」→ 兜底:空的下拉选第一项、勾选组勾第一个 -
EAN 游标必须落盘 → 计数器只存内存,换进程重跑就会从起点重发,必撞号
-
没标
*的字段也可能是必填 → Joom 的「运费」和「详情图语言」都没星号, 不填只给MYJ.error: 运费不能为空/请选择详情图语言且至少添加一张详情图 -
虚拟滚动的下拉,前几项里可能没有你要的值 → 先
Input.insertText('英')过滤再点, 否则只能拿到列表第一项(Joom 详情图语言会落到「阿拉伯语」) -
找不到字段落点?打一个哨兵串 → 在页面手输
PROBE-TITLE-XYZ,再遍历所有 pinia store 的$state找这个串,立刻知道数据落在哪个 store(Joom 就是这么发现数据在smtChoice*的) -
搜不到 ≠ 结构不同:先怀疑输入,再怀疑结构 → Lazada 的类目树是英文的, 拿中文「发圈」去搜,搜索确实执行了但结果 0 条;换成
Hair Accessories立刻出 6 条、 结构还与 SHEIN 完全一致。我们为此多花了 2 轮去怀疑「弹窗结构不同」 -
平台的 store 不一定以平台名命名 → Lazada 选完类目后 pinia 里没有任何
lazada*store (我们一度误判为「懒加载」)。找不到落点时不要按平台名过滤,dump 全部 store 或打哨兵串 (Temu 第一轮就撞了一次,靠编辑页改号救回来)
EAN-13 台账(湖北易千亿彩 · 69803093 段)
- 结构:8 位前缀
69803093+ 4 位产品码 + 1 位校验 - 校验位:
(10 - sum(d*(1 if i%2==0 else 3) for i,d in enumerate(d12)) % 10) % 10(左起权重 1,3,1,3…;UPC-A 权重相反,别混用) - 台账唯一来源:S03 主机
/root/ean_*.txt(KVM-2 够不到) - 已用 3190,下一号 pc 3400 →
6980309334003 - 本批已分配:Walmart pc 3400~3446(见
walmart建品/ean_69803093_3400-3446.txt); Temu 全托管 pc 3447~3551(46 条,逐条见temu建品/ean_temu_used.txt; 游标temu建品/ean_cursor.json→ 下一号 pc 3552) - ⚠️ 必须在 S03 落盘,否则下次续号会撞号。Temu 这批目前只落在 KVM-2
(
temu建品/ean_temu_used.txt),还没回 S03 —— 下一轮开工第一件事就把它并进/root/ean_*.txt - 说明书 §1 的例子
pc 1000 → 6980309310004是错的,正确是6980309310007