import { wait, listPages, installHook, readHook } from '/home/admin9webs/shein建品/sh_lib.mjs'; import { CDP, SAN as S } from '/tmp/cdp3.mjs'; import { readFileSync, writeFileSync, appendFileSync } from 'fs'; const DIR='/home/admin9webs/temu建品'; const P = `document.querySelector('#app').__vue_app__.config.globalProperties.$pinia`; const chk = pc => { const s='69803093'+String(pc).padStart(4,'0'); const d=[...s].map(Number); return s + String((10 - d.reduce((a,x,i)=>a+x*(i%2===0?1:3),0)%10)%10); }; const cur = JSON.parse(readFileSync(`${DIR}/ean_cursor.json`,'utf8')).next; const NEWEAN = chk(cur); const tabs = (await listPages()).filter(t=>t.url.includes('/web/temu/edit')); console.log('编辑页标签数:', tabs.length, '→ 用最后一个;换号 pc', cur, '=', NEWEAN); const t = tabs[tabs.length-1]; const e = await CDP.connect(t.webSocketDebuggerUrl); await e.send('Page.enable'); await e.send('Runtime.enable'); await wait(9000); await installHook(e); console.log('标题:', String(await e.evalJS(`(document.querySelector('input[name="productName"], .ant-input')||{}).value||''`)).slice(0,60)); const set = await e.evalJS(`(()=>{const p=${P}; const rows=p._s.get('temuAddSkuDataStore').$state.formState.skuDataList||[]; if(!rows.length) return 'no-rows'; const old=rows.map(r=>r.code).join(','); rows[0].code=${JSON.stringify(NEWEAN)}; return 'old='+old+' new='+rows[0].code;})()`); console.log('改 EAN:', String(set)); await wait(2500); await e.evalJS(`window.scrollTo(0,0)`); await wait(600); await e.evalJS(`(()=>{const x=[...document.querySelectorAll('button')].filter(z=>z.offsetParent!==null).find(z=>/^\s*保存\s*$/.test((z.innerText||'').trim())); if(x) for(const ev of ['mousedown','mouseup','click']) x.dispatchEvent(new MouseEvent(ev,{bubbles:true,cancelable:true,view:window})); return 1;})()`); await wait(13000); const info = await e.evalJS(`JSON.stringify([...document.querySelectorAll('.ant-modal')].filter(z=>z.offsetParent!==null).map(z=>(z.innerText||'').replace(/\s+/g,' ').trim().slice(0,130)))`); console.log('保存:', S(String(info)).slice(0,240)); console.log('hook:', String(await readHook(e)).slice(-120)); if(/已保存|保存成功|待发布/.test(String(info))){ writeFileSync(`${DIR}/ean_cursor.json`, JSON.stringify({next:cur+1, at:new Date().toISOString()},null,1)); appendFileSync(`${DIR}/ean_temu_used.txt`, `764423265986-FIX\t["${NEWEAN}"]\t${new Date().toISOString()}\n`); console.log('✓ 换号完成,cursor →', cur+1); } // 关掉多余的编辑页(含本次用的) for (const x of (await listPages()).filter(p=>p.url.includes('/web/temu/edit'))) await fetch(`http://127.0.0.1:9223/json/close/${x.id}`).catch(()=>{}); console.log('已清理编辑页标签'); process.exit(0);