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

235 lines
15 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.
# 妙手 ERP(erp.91miaoshou.com)配方 — 已登录、采集箱可达
## ✅ 登录(子账号 xiaochaoren2026,2026-09-21 成功)
**舰队技能档 `agent-a2-import/skills/ecommerce/miaoshou-erp/SKILL.md` 的选择器已全部失效**,
实测的真实登录表单(登录弹窗内):
| 字段 | 选择器 |
|---|---|
| 账号 | `input.login-form__input[placeholder="手机号/子账号/邮箱"]` |
| 密码 | `input.login-form__input[type=password]` |
| 验证码 | `input.captcha-field__input`(`maxlength=4`) |
| 登录按钮 | `button.login-form__submit-btn`(文案「立即登录」) |
| 验证码图 | `img.captcha-field__img` ← **src 是 base64 JPEG**,可以直接取出来识别 |
### 登录步骤(可复用)
1. 填账号/密码(原生 setter + `input`/`change` 事件)
2. **取验证码**:`document.querySelector('.captcha-field__img').src` → 剥掉 `data:image/jpeg;base64,`
→ 存成 `.jpg`(⚠️ 字节是 JPEG,存成 `.png` 读图工具会拒绝)
3. 点一下 `img.captcha-field__img` 可刷新验证码
4. 填入 4 位码 → 点 `.login-form__submit-btn` → 成功会跳到 `/welcome`(标题「妙手-欢迎使用」)
⚠️ **验证码是强制的**(技能档写的「非强制、可跳过」已失效);失败会计数,**再错 9 次锁 1 小时**
⚠️ 本机 `modlens` **没有配置视觉提供方**(报错:No vision provider),验证码是我自己看图读的
## 采集箱(已进入)
- 入口:顶栏 `.function-item` 里点 **产品采集**
- 路由:**`https://erp.91miaoshou.com/common_collect_box/index?fetchType=linkCopy`**(标题「妙手-产品采集」)
- 页面上的操作按钮:`采集优化` / `采集设置` / `更多` / **`采集并自动认领`** / **`采集并自动发布`** / `我知道了`
- 采集方式(左侧/顶部):**`链接采集`**、**`导入采集`**、`关键词采集`、`整店采集`、`插件采集`、`店铺互采`
- 其它模块:`公用采集箱`、`AI工作台`、`侵权检测`、`货盘中心`(1688跨境热卖/1688搜同款/跨境产业带)、`数据选品`、`快速上货`(Temu全托管)
## 权限现状(技能档口径,待实测确认)
技能档写明该**子账号**:「采集箱/导入采集 可用,**产品发布不可用**」。
页面上 `采集并自动发布` 按钮存在,但能否真正发布要实测(用户已确认:先用子账号把采集箱/导入采集跑到能用)。
## 下一步(下一步就能动手)
1. 走 **`导入采集`**:确认它接受什么输入(链接批量/CSV/Excel/1688 链接?),
把 48 条商品的 alicdn 图 + 1688 链接喂进去
2. 走 **`链接采集`**:单条/批量粘贴 1688 链接
3. 采集入箱后,验证「公用采集箱」里能否批量 `认领`/`发布`(受子账号权限限制)
## 导入采集(`?fetchType=importCopy`)— 四种模式
| 模式 | 说明 |
|---|---|
| **导入链接采集** | **要文件**(面板里有「下载导入模板」+「确认/取消」),提示语:**「链接地址列必填,其他列选填。若填写其他列,以填写为准,若留空以来源为准。」** |
| **Excel表格导入** | Excel 表格导入 |
| 本地素材包导入 | 本地素材包 |
| 聚水潭素材包导入 | 聚水潭素材包 |
页面下方是已导入文件列表:`文件名称 / 导入时间 / 解析状态 / 成功条数 / 失败条数 / 操作`
(**文件仅保留 90 天**,当前「暂无数据」)。
### ✅ 下一步可直接动手的一条路:用 1688 链接喂「导入链接采集」
`tk_input.json` 的 key 就是 **1688 商品 id**(如 `676236596821`),
所以每条商品的链接可以直接拼:**`https://detail.1688.com/offer/<id>.html`**(48 条 → 48 行)。
步骤:
1. 在面板里点 **「下载导入模板」** 拿到确切列名与格式(列名/是否要表头/单列或多列)
2. 用 48 个 1688 链接生成导入文件(`链接地址` 列必填)
3. 上传 → `确认` → 到「已导入的文件列表」看**解析状态 / 成功条数 / 失败条数**
4. 解析成功后在 **公用采集箱** 里核对待采集商品,再验证子账号能否 `认领`/`发布`
⚠️ 未验证:模板的确切列名(要先下载模板)、上传控件的选择器、以及**子账号能否发布**。
## ✅ 导入链接采集 = 按模板列做 CSV 上传(已跑通到「等待解析」)
### 模板列(`python3 -m pip install --break-system-packages xlrd` 读出来的)
下载的 `导入产品链接模板.xls` 是真·OLE2 文件,本机没有 xlrd/libreoffice,
装了 `xlrd`(`pip install --break-system-packages xlrd`)后读出:
| 列 | 说明 |
|---|---|
| `链接地址(必填)` | 商品链接 |
| `产品标题` | 标题 |
| `价格(RMB)` | 价格 |
| `促销价(RMB)` | 促销价(表头提示:仅可用于采集到 Lazada) |
### 格式踩坑(三次失败才走对)
| 提交内容 | 结果 |
|---|---|
| `.txt` 一行一个链接 | ❌ `…文件内容不是json格式`(**`.txt` 必须放 JSON**) |
| `.json` URL 数组 | ❌ `…文件标题缺失` |
| `.json` 带 `title/url/链接地址`(每项) | ❌ 同上 |
| `.json` 根节点带 `title/标题` + `links/data/list` | ❌ 同上 |
| **`.csv`(表头用模板那 4 列,UTF-8 BOM)** | ✅ **接受!入列显示「等待解析」** |
### 上传机制(可复用)
```js
await c.send('DOM.enable');
const { root } = await c.send('DOM.getDocument', { depth: -1 });
const { nodeId } = await c.send('DOM.querySelector', { nodeId: root.nodeId, selector: 'input.jx-upload__input' });
await c.send('DOM.setFileInputFiles', { files: ['/path/ms_import.csv'], nodeId });
// 然后点面板里的「确认」
```
上传控件:`input.jx-upload__input`(隐藏,`accept=.xls,.txt,.zip,.json,.xlsx,.csv`)。
**注意**:上传/确认后面板会关闭,下一次上传前要重新点「导入采集 → 导入链接采集」。
### 当前状态
已导入文件列表里有一条:`ms_import | 2026-09-21 07:40:12 | **等待解析** | …`(47 条链接 + 标题 + 价格)。
解析是**异步排队**的,30–60 秒内还没变;下一步就是**等它变成成功/失败并看「成功条数/失败条数」**,
再点「查看导入产品」或去 **公用采集箱** 核对采集到的商品。
### 生成脚本
`/home/admin9webs/miaoshou/dl/ms_import.csv`(47 行,已排除无水印图的 `601964534137`),
由 `tk_input.json` 生成:链接 = `https://detail.1688.com/offer/<pid>.html`。
## 导入格式的完整试错记录(第 2 轮,全部失败,附下一步)
| # | 上传内容 | 结果 |
|---|---|---|
| 1 | `.txt` 一行一链接 | ❌ `…文件内容不是json格式` |
| 2 | `.json` URL 数组 | ❌ `…文件标题缺失` |
| 3 | `.json` 每项带 `title/url/链接地址` | ❌ 同上 |
| 4 | `.json` 根节点 `title/标题` + `links/data/list` | ❌ 同上 |
| 5 | `.csv`(模板 4 列,UTF-8 **带 BOM**) | 接受入列 → 解析失败:`未识别到:【产品主编号】表头` |
| 6 | `.csv`(补 `产品主编号` 列,带 BOM) | ❌ 同一句 |
| 7 | `.csv`(补 `产品主编号` 列,**无 BOM** UTF-8) | ❌ 同一句(**BOM 不是原因**) |
| 8 | **官方模板 `.xls` 原样上传** | 前端直接拒:`未匹配到数据,请检查模板是否正确`(空模板无数据行),**未产生导入任务** |
### 结论
- 解析器要的是**带数据的 `.xls`(或 `.xlsx`)**,且表头里必须有 **`产品主编号`**;
- **CSV 看起来不管用**(即使表头齐全、去掉 BOM,仍只报缺 `【产品主编号】`);
- 下载到的模板只有 4 列(`链接地址(必填)/产品标题/价格(RMB)/促销价(RMB)`),
**缺 `产品主编号`** → 服务端模板与解析器版本不一致(错误提示也写着「请下载最新模版」)。
### 下一步(就一件事)
用能写 Excel 的库生成 `.xls`/`.xlsx`(本机:`pip install --break-system-packages xlwt` 或 `openpyxl`),
表头 = `产品主编号, 链接地址(必填), 产品标题, 价格(RMB)`,47 行数据,再上传。
若仍报缺表头,则说明**必须改用服务端最新模板**(可能要在页面上换一个平台/入口重新下载一次模板)。
### 当前队列状态
已导入文件列表里有 3 条失败任务(`ms_import` / `ms_import2` / `ms_nobom`),可在页面上「删除文件」清掉。
## ✅✅ 导入链接采集终于通了:`ms2.xls` 解析成功 47/0/47(2026-09-21 08:55)
### 能用的 .xls 表头(**照抄这 8 列**)
| 列 | 示例值 | 说明 |
|---|---|---|
| `产品主编号` | `548459586741` | 1688 商品 id,**必须**有 |
| `链接地址(必填)` | `https://detail.1688.com/offer/548459586741.html` | 采集源链接 |
| `产品标题` | 英文标题 | 可留空(留空以来源为准) |
| `货币类型` | `CNY` | **必须**;空值报「不允许此货币类型」 |
| `SKU售价` | `34.0` | **必须 ≥ 0.01**;空值报「必须大于等于0.01」 |
| `SKU库存` | `999` | **必须 ≥ 0** |
| `价格(RMB)` | `34.0` | 模板原有列 |
| `促销价(RMB)` | 空 | 模板原有列(表头提示:仅可用于采集到 Lazada) |
### 关键结论(下一轮别再走弯路)
1. **必须是 `.xls`/`.xlsx` 二进制表格**——CSV 一律只报「未识别到【产品主编号】表头」,`txt` 走 JSON 也走不通;
2. **页面下载的模板是旧的**:它只有 4 列、**缺 `产品主编号`**,照它填一定失败
(错误提示会写「请下载最新模版」,但最新模板实际要的就是上面这 8 列);
3. 生成脚本:`pip install --break-system-packages xlwt` → `xlwt.Workbook(encoding='utf-8')` → 写表头+47 行 →
存 `.xls` → 用 `DOM.setFileInputFiles` 注入 `input.jx-upload__input` → 点「确认」;
4. 失败时**点「查看失败原因」**能看到逐行逐列的精确原因(这次就是靠它拿到 `货币类型/SKU售价/SKU库存` 三个列名)。
### 产物
`/home/admin9webs/miaoshou/dl/ms2.xls`(47 行,可复用为模板);上传脚本 `ms_upload.mjs`;
状态查询 `ms_status.mjs`;失败原因 `ms_reason.mjs`。
### 下一步
「查看导入产品」/ **公用采集箱** 里核对这 47 条采集结果,再验证子账号能否 `认领`/`发布`。
## 公用采集箱与采集任务(第 3 轮观察)
### 公用采集箱:`https://erp.91miaoshou.com/common_collect_box/items`
页面可用按钮(**均为未禁用状态**):`任务记录` / `搜索` / `重置` / `更多筛选` /
**`认领到`** / `平台认领配置` / `批量编辑` / `分组` / `删除` / `更多` / `创建产品` / `导入产品` / `列表设置` / `全选`。
→ **`认领到` 按钮存在且未禁用**,说明子账号**可能**有认领权限(技能档说「不能发布」,但认领≠发布,
需要实测点一次才知道)。列表当前为空(尚未采集出结果)。
### 任务记录
点「任务记录」弹层里表头是 `项目 / 提交时间 / 状态 / 翻译配置 / 任务进度 / 操作`,
**当前无数据行** —— 说明这 47 条的采集任务还没出结果(导入只登记了链接,
真正的抓取是异步队列,可能要看队列积压或需要显式触发)。
### 下一步(顺序固定)
1. 隔一段时间刷新 `/common_collect_box/items` 与「任务记录」,等 47 条采集进箱;
2. 进箱后选一条 → 点 **`认领到`** → 选平台/店铺(`平台认领配置` 里可预设)→ 观察是否被权限拦截;
3. 若能认领,再看该平台店铺里能否 **发布**(子账号权限的分水岭)。
### 复用脚本
`ms_box.mjs`(进采集箱 dump 按钮/列表)、`ms_task.mjs`(读任务记录)、
`ms_items.mjs`(点「查看导入产品」)、`ms_status.mjs`(导入列表状态)、`ms_reason.mjs`(查看失败原因)。
## 再查一次(仍为空)+ 三个待验证假设
复核结果:
- 导入任务 `ms2`:**解析成功 47/0/47**(文件层面没问题)
- 公用采集箱 `/common_collect_box/items`:**仍为空**(`暂无数据`,行数 0)
- 「任务记录」:表头在、**无数据行**
- 在导入列表点 **「查看导入产品」**(DOM 点击 + **真实鼠标点击**都试过):
**无弹窗、无新标签、URL 不变** —— 这个入口不是「开始采集」的意思
采集箱的筛选字段是:`关联货源 / 产品标题 / 货源ID / 货源价格`。
### 下一步优先验证(按可能性排序)
1. **关联货源筛选**:采集箱默认可能过滤了货源;把 `关联货源` 选成 **1688**(或「全部」)再看
—— 我们这批就是 1688 链接,很可能被默认筛选藏住了;
2. **导入文件行的「更多」菜单**:导入列表每行有 `更多` → 看里面是否有「开始采集 / 采集设置 / 认领」之类动作;
3. **采集设置**:页面顶部有 `采集设置`,可能要求先配置采集参数/翻译/图片来源,否则任务不启动。
⚠️ 结论:**导入≠已采集**。`解析成功` 只代表表格被接受,真正抓取需要触发(或等到队列跑)。
判定标准只有一个:**公用采集箱里出现 47 条**。
## 第 4 轮:假设 1 被证伪;触发点在采集箱的「导入产品」
1. **`关联货源` 筛选不是原因**:控件是 `div.jx-select.pro-select`,
当前值就是 **「全部关联货源」** —— 没有任何筛选把数据藏住。
所以**这 47 条确实还没被采集进箱**,不是被筛掉了。
2. **导入列表的成功行没有触发动作**:`ms2` 行只有 `查看导入产品 / 删除文件` 两个操作
(失败行多一个 `查看失败原因`),**没有 `更多` 菜单**。
而 `查看导入产品` 实测点不动(DOM 与真实鼠标都试过,无弹窗/无新标签/URL 不变)。
3. **因此触发点最可能在「公用采集箱」页里的 `导入产品` 按钮**:
该页按钮清单是 `任务记录 / 搜索 / 重置 / 更多筛选 / 认领到 / 平台认领配置 / 批量编辑 /
分组 / 删除 / 更多 / 创建产品 / **导入产品** / 列表设置 / 全选` ——
「导入产品」很可能就是把已解析的导入文件拉进采集箱(并启动采集)的入口。
### 下一步(明确到一次点击)
进 `/common_collect_box/items` → 点 **`导入产品`** → 看它是否列出 `ms2`(或那 47 条)→
选择并确认 → 回到列表看是否出现 47 条 → 然后才是 `认领到` → 发布权限验证。
## 注意:妙手会话易失 + 登录表单在弹窗里(第 5 轮踩到)
- 关掉妙手标签后,新开标签访问受保护页会被重定向到
`https://erp.91miaoshou.com/?redirect=%2Fcommon_collect_box%2Fitems` —— **等于登出**,需重新登录。
- 登录表单**在一个弹窗里**:先点首页的「登录」把弹窗打开,
再填 `.login-form__input`(账号/密码)与 `.captcha-field__input`,最后点 `.login-form__submit-btn`。
**顺序错了会拿到 `Cannot read properties of null`**(选择器全空)——本轮我就是这么失败一次。
- 验证码每次都要重新读(旧码会失效):取 `.captcha-field__img` 的 base64 → 存 `.jpg` → 读图。
- **建议**:需要连续操作妙手时,别关那个标签页;中途关闭会白付一次登录(含验证码)。
### 「导入产品」按钮:本轮没测到
点它之前会话就掉了(登录也未成功),所以**触发点仍未验证**。
恢复顺序:重新登录 → `/common_collect_box/items` → 点 `导入产品` → 看是否列出 `ms2` → 确认后回列表数 47 条。