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);