# 妙手 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/.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/.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 条。