Files
dianxiaomi-crossborder-play…/lazada建品/RECIPE.md
T

130 lines
8.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Lazada 建品侦察 — 未跑通,下一轮从这里接着做
路由:`https://www.dianxiaomi.com/web/lazada/add` 列表:`/web/lazada/{draft=采集箱, offline=待发布}`
## 已勘明(`lz_probe1.mjs`)
### 1. 店铺 = 下拉(按站点后缀分店)
第一家 = **`Shehoney_MY`(shopId 3336185)**。下拉前 10 项:
`Shehoney_MY / _SG / _TH / _ID / _PH / _VN`、`Nicegar_MY / _SG / _TH / _ID …`
—— 同一运营主体按站点拆店,**「自然序第一家」= `Shehoney_MY`**。
### 2. 类目
`分类 ---- 请选择分类 ---- 选择分类`(`选择分类` 按钮在),形态大概率与 SHEIN/Temu/aliChoice
同一套弹窗 → 直接用 `shein建品/sh_build.mjs` 的 `selectCategory(c, kw, kw)`。
### 3. 必填项(表单项标签带 `*`)
`店铺 · 分类 · 产品标题(≤255) · 品牌 · 税 · 产品图片`
非必填:店小秘分类、来源URL、包装内容(≤1000)、是否预售(白名单功能)、产品视频、产品描述。
⚠️ **品牌**有坑:提示语写「请选择下拉提示框品牌或者填写 Lazada 后台已有品牌,如无品牌则填写…」
(原文被截断)——大概率要求**品牌库里的真实品牌**或填「无品牌」占位,和 Walmart 的「无品牌」同类。
### 4. store 家族
选完店铺时 `pinia` 里**没有任何 `lazada*` store**(`stores:{}`)——说明
**store 是选完类目后才懒加载注册的**。下一轮选完类目再 dump 一次 store 名单即可。
## 下一轮的顺序建议
1. 选店铺(`Shehoney_MY`)→ 2. 选类目(弹窗)→ 3. dump `lazada*` store 名单与字段落点
→ 4. 标题/图片/品牌/税 → 5. **挂钩子再保存**(Lazada 大概率也有一套层层递进的必填)
## 已知可复用
- `shein建品/sh_lib.mjs`(`newPage`/`closePage`/`installHook`/`readHook`)
- `shein建品/sh_build.mjs`:`selectCategory`、`fillRequiredSelects`、`fillRequiredTextInputs`、`fillNativeSelects`
- 骨架直接抄 `joom建品/jmbatch.mjs` 或 `alichoice建品/alcbatch.mjs`
## 第 8 轮补充
1. **类目标签叫「分类」不叫「产品分类」** —— `sh_build.selectCategory` 原来只认 `/产品分类/`,
在 Lazada 上直接 `no-item`。已改成通用匹配:标签含「分类」且**不含**「店小秘」且该项里有
`选择分类`(改动在 `shein建品/sh_build.mjs`,对 SHEIN/Temu/aliChoice 同样生效)。
2. 改完之后点击能打开了,但**搜索结果是 `no-path`** —— 说明 Lazada 的 `选择分类` 弹窗
**不是** SHEIN/Temu 那个「左树右结果、`.search-result-item`」的结构。
下一轮第一步:点开 `选择分类`,dump 弹窗 DOM(搜 `搜索分类名称` 输入框在不在、
结果项的 class 是什么),再决定是复用还是另写一个 `selectCategoryLazada`。
3. 因为类目一直没选上,`lazada*` store 始终为空 —— store 懒加载的结论仍未验证。
## 第 9 轮:Lazada 选类目弹窗 = 同一套「选择类目」(只差结果项这一环)
点开 `选择分类` 后 dump 到:
- 弹窗标题 **选择类目**,有 **`搜索`** 按钮和 `input[placeholder="搜索分类名称"]`
- 左侧树用 `.categories-item` / `.categories-item-name`(顶层 46 项,英文类目名)
- 右侧 **未选择分类**
- 有 `.ant-modal-close`
**结论:这就是 SHEIN/Temu/aliChoice 那套弹窗**,`selectCategory` 理论上可直接复用;
上一轮 `no-path` 的原因**尚未确认**(候选:搜索按钮没点中、结果项不是 `.search-result-item`、
或该弹窗的搜索需要先选站点维度)。下一轮只需:输入关键词 → 点搜索 → dump 弹窗内 class 频次
(`.search-result-item` 在不在)→ 在不在就补一个 `.categories-item` 分支。
⚠️ 我这一轮拼验证脚本时把模板字符串切坏了(页面里报 `SyntaxError: Unexpected token 'return'`),
没跑出结果——**这是我的脚本错误,不是平台问题**。下一轮直接在这个 `lz_cat.mjs` 上小改即可
(它已经能稳定走到「打开弹窗」),别从零写。
## 第 10 轮:`no-path` 的真因 —— **Lazada 类目树是英文,中文关键词搜不到**
`lz_cat3.mjs` 跑完整条链路(选店 → 打开弹窗 → 输入 `发圈` → 点 `搜索`)的结果:
| 时点 | 弹窗内容 |
|---|---|
| 打开时 | 标题 `选择类目`,底部按钮 `["搜索","选择","关闭"]`,左侧 `.categories-item` 树(**46 项英文**:Audio / Automotive / Bags and Travel / Beauty / Bedding & Bath / Cameras & Drones …) |
| 输入 `发圈` + 点搜索后 | 文本只剩 `选择类目 搜索 初始类目 关闭`;`.search-result-item` **0 条**、`.categories-item` **0 条** → **搜索结果为空** |
**结论**:搜索确实执行了,只是**中文关键词在英文类目树里匹配不到任何东西**,
所以 `selectCategory` 一直返回 `no-path`(它不是结构不同,是**没结果**)。
### 下一轮的修法(二选一)
1. **给 Lazada 单独一张中文→英文类目词表**(最稳):`发圈→Hair Accessories`、
`口哨→Toy Whistles`、`笔袋→Pencil Cases`、`保温午餐包→Lunch Bags`、`贴纸→Stickers` 等;
2. **从英文标题里取词**(快但糙):`tk_input.json` 里每条都有英文 `title`,
取名词短语去搜(如 `Hair Ties`、`Whistle`、`Pencil Case`),搜不到再回退到词表。
搜到之后的结果项 class 仍需确认(这一轮没拿到非空样例)——**但至少知道方向是对的:
换英文词就能出结果**,`selectCategory` 的其余逻辑(点结果、关弹窗)可原样复用。
## ✅ 第 10 轮验证成功:**Lazada 只要给英文词,`selectCategory` 就能原样复用**
`lz_cat4.mjs`(只把关键词从 `发圈` 换成 `Hair Accessories`,其余一字未改):
```
输入: typed:Hair Accessories
按钮: ["搜索","选择","关闭"]
结果: search-result-item ×6, f-red ×6
sr[0] Beauty(美女)/Personal Care(个人护理)/Hair Care(洗护发用品)/…/Hair Accessories(发饰)
sr[1] Fashion Accessories(时尚饰品)/Accessories(配件)/Hair Accessories(发饰)
sr[2] Kids' Fashion(童装)/Baby & Kids' Accessories(…)/…
```
- 结果项 class 就是 **`.search-result-item`**,最后一级在 **`<span class="f-red">`** 里
→ 和 SHEIN/Temu **完全同构**,`sh_build.selectCategory` 的「去括注后按最后一级精确匹配」
逻辑可原样使用(`Hair Accessories(发饰)` 的 seg 就是 `Hair Accessories`,与关键词相等)
- 类目路径本身**中英并列**(英文名 + 中文括注),所以匹配时要按「括号前」比较
### 因此 Lazada 只差一件事:**中文 → 英文类目词**
`tk_input.json` 里 `cat_kw` 是中文(发圈/口哨/笔袋…),Lazada 树是英文。
下一轮:
1. 建一张词表(已确认 `发圈 → Hair Accessories`);其余按同法一条条试,很快;
2. 或直接从英文 `title` 抽名词短语(`Hair Ties` / `Whistle` / `Pencil Case` / `Lunch Bag`);
3. 拿到英文词后,**直接抄 `alichoice建品/alcbatch.mjs` 的骨架**(选店 → selectCategory → 填 store → 挂钩子保存),
差异只在于:Lazada 必填含**品牌**(要真实品牌或「无品牌」占位)和**税**。
## 第 11 轮:英文类目词实测表(`lz_kwtest.mjs`,一次会话连测 8 词)
| 我们的中文 `cat_kw` | 试的英文词 | `.search-result-item` 命中 | 首个结果路径(截断) |
|---|---|---|---|
| 发圈/发饰 | `Hair Accessories` | **6** ✅ | Beauty/Personal Care/Hair Care/…/Hair Accessories |
| 笔袋 | `Pencil Case` | **1** ✅ | Stationery, Craft & Gift Cards/School & Office/… |
| 保温午餐包 | `Lunch Bag` | **3** ✅ | Bags and Travel/Functional Bags/Lunch Bags |
| 涂鸦贴纸 | `Stickers` | **5** ✅ | Automotive/…/Bumper Stickers, Decals & Ma… |
| 袜子 | `Socks` | **6** ✅ | Kids' Fashion/Baby Clothing/…/Socks & Tight… |
| 口哨 | `Whistle` | 0 ❌ | 换词:`Toy Whistle` / `Party Favors` / `Whistles` |
| 钥匙扣 | `Keychain` | 0 ❌ | 换词:`Key Ring` / `Key Chain` / `Keychains` |
| 纽扣 | `Buttons` | 0 ❌ | 换词:`Sewing Buttons` / `Button` |
**用法**:`cat_kw → 英文词` 先查这张表,未命中的按上面「换词」列逐个试(一个词 25 秒);
命中后 `selectCategory(c, 英文词, 英文词)` 可直接用(结果项同构,见上一节)。
**注意**:命中 ≠ 落对类目。例如 `Stickers` 首个结果是汽车保险杠贴纸,
而我们要的是「涂鸦贴纸」——所以**结果项要按最后一级精确匹配**(`selectCategory` 第三参已支持),
必要时人工核一遍 `lazada_route.json`。