From 86845d5a6ea01d3b74fbc2203190867864235084 Mon Sep 17 00:00:00 2001 From: admin9webs Date: Mon, 21 Sep 2026 09:01:01 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A6=99=E6=89=8B=EF=BC=9A=E5=85=AC=E7=94=A8?= =?UTF-8?q?=E9=87=87=E9=9B=86=E7=AE=B1=E5=8F=AF=E8=BE=BE=EF=BC=88=E8=AE=A4?= =?UTF-8?q?=E9=A2=86=E5=88=B0=E6=8C=89=E9=92=AE=E6=9C=AA=E7=A6=81=E7=94=A8?= =?UTF-8?q?=EF=BC=89=EF=BC=8C=E4=BB=BB=E5=8A=A1=E8=AE=B0=E5=BD=95=E6=9A=82?= =?UTF-8?q?=E7=A9=BA=E5=BE=85=E9=87=87=E9=9B=86=E5=87=BA=E7=BB=93=E6=9E=9C?= =?UTF-8?q?=EF=BC=9B=E8=AE=B0=E5=BD=95=E8=AE=A4=E9=A2=86=E2=86=92=E5=8F=91?= =?UTF-8?q?=E5=B8=83=E7=9A=84=E9=AA=8C=E8=AF=81=E9=A1=BA=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 妙手建品/RECIPE.md | 23 +++++++++++++++++++++++ 妙手建品/ms_box.mjs | 20 ++++++++++++++++++++ 妙手建品/ms_task.mjs | 14 ++++++++++++++ 3 files changed, 57 insertions(+) create mode 100644 妙手建品/ms_box.mjs create mode 100644 妙手建品/ms_task.mjs diff --git a/妙手建品/RECIPE.md b/妙手建品/RECIPE.md index d67dcca..a483fbf 100644 --- a/妙手建品/RECIPE.md +++ b/妙手建品/RECIPE.md @@ -159,3 +159,26 @@ await c.send('DOM.setFileInputFiles', { files: ['/path/ms_import.csv'], nodeId } ### 下一步 「查看导入产品」/ **公用采集箱** 里核对这 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`(查看失败原因)。 diff --git a/妙手建品/ms_box.mjs b/妙手建品/ms_box.mjs new file mode 100644 index 0000000..797a1b4 --- /dev/null +++ b/妙手建品/ms_box.mjs @@ -0,0 +1,20 @@ +import { listPages, wait } from '/home/admin9webs/shein建品/sh_lib.mjs'; +import { CDP, SAN as S } from '/tmp/cdp3.mjs'; +const t = (await listPages()).find(x=>/91miaoshou/i.test(x.url)); +const c = await CDP.connect(t.webSocketDebuggerUrl); +await c.send('Page.enable'); await c.send('Runtime.enable'); await wait(1200); +// 点左侧「公用采集箱」 +console.log('点公用采集箱:', String(await c.evalJS(`(()=>{ + const h=[...document.querySelectorAll('*')].filter(e=>e.offsetParent!==null&&(e.innerText||'').trim()==='公用采集箱'&&e.children.length===0); + if(!h.length) return 'nf'; + for(const ev of ['mousedown','mouseup','click']) h[0].dispatchEvent(new MouseEvent(ev,{bubbles:true,cancelable:true,view:window})); return 'clicked';})()`))); +await wait(9000); +const o = await c.evalJS(`(()=>{ + const body=(document.body.innerText||'').replace(/\\s+/g,' '); + const m=body.match(/共\\s*\\d+\\s*[条个]/); + const rows=[...document.querySelectorAll('tr')].filter(e=>e.offsetParent!==null).map(e=>(e.innerText||'').replace(/\\s+/g,' ').trim()).filter(Boolean).slice(0,4); + const btns=[...document.querySelectorAll('button')].filter(e=>e.offsetParent!==null).map(e=>({t:(e.innerText||'').trim().slice(0,10), dis:e.disabled})).filter(x=>x.t).slice(0,14); + return JSON.stringify({href:location.href, total:m?m[0]:'', rows, btns});})()`); +console.log('采集箱:', S(String(o)).slice(0,1200)); +try{ await c.shot('/tmp/ms_box.jpg'); console.log('shot ok'); }catch(e){} +process.exit(0); diff --git a/妙手建品/ms_task.mjs b/妙手建品/ms_task.mjs new file mode 100644 index 0000000..28d353c --- /dev/null +++ b/妙手建品/ms_task.mjs @@ -0,0 +1,14 @@ +import { listPages, wait } from '/home/admin9webs/shein建品/sh_lib.mjs'; +import { CDP, SAN as S } from '/tmp/cdp3.mjs'; +const t = (await listPages()).find(x=>/91miaoshou/i.test(x.url)); +const c = await CDP.connect(t.webSocketDebuggerUrl); +await c.send('Runtime.enable'); await wait(1200); +console.log('点任务记录:', String(await c.evalJS(`(()=>{const b=[...document.querySelectorAll('button')].find(e=>/任务记录/.test(e.innerText||'')); + if(!b) return 'nf'; for(const ev of ['mousedown','mouseup','click']) b.dispatchEvent(new MouseEvent(ev,{bubbles:true,cancelable:true,view:window})); return 'clicked';})()`))); +await wait(6000); +const o = await c.evalJS(`(()=>{ + const dlgs=[...document.querySelectorAll('.jx-dialog,.jx-drawer,[class*=dialog]')].filter(e=>e.offsetParent!==null); + const rows=[...document.querySelectorAll('tr')].filter(e=>e.offsetParent!==null).map(e=>(e.innerText||'').replace(/\\s+/g,' ').trim()).filter(Boolean).slice(0,5); + return JSON.stringify({dlg:dlgs.length?dlgs[dlgs.length-1].innerText.replace(/\\s+/g,' ').trim().slice(0,400):'', rows});})()`); +console.log('任务记录:', S(String(o)).slice(0,900)); +process.exit(0);