import { attach, SAN } from '/tmp/cdp3.mjs'; const c = await attach('/web/ozonProduct/draft') || await attach('dianxiaomi.com'); if(!c){ console.log('✗ 无页面'); process.exit(1); } await c.send('Runtime.enable'); const r = await c.evalJS(`(async()=>{ const rr = await fetch('/api/userInfo.json?_t='+Date.now(), {headers:{'X-Requested-With':'XMLHttpRequest'}}); const tx = await rr.text(); if(!tx.startsWith('{')) return JSON.stringify({err:'notjson', head:tx.slice(0,120)}); const j = JSON.parse(tx); const d = j.data||{}; const out = { topKeys: Object.keys(d) }; // shopMap 结构 const sm = d.shopMap || d.shops || {}; out.shopMapType = Array.isArray(sm)?'array':typeof sm; if (Array.isArray(sm)) { out.shops = sm.map(s=>({id:s.id, idStr:s.idStr, name:s.name||s.shopName, platform:s.platform||s.platformName, site:s.site})); } else { out.shopMapKeys = Object.keys(sm).slice(0,40); out.shops = []; for (const [k,v] of Object.entries(sm)) { if (Array.isArray(v)) v.forEach(s=>out.shops.push({platform:k, id:s.id, idStr:s.idStr, name:s.name||s.shopName, site:s.site})); else if (v && typeof v === 'object') out.shops.push({platform:k, id:v.id, idStr:v.idStr, name:v.name||v.shopName}); } } // 平台列表 out.platformList = d.platformList || d.platforms || d.shopPlatformList || null; return JSON.stringify(out); })()`, true); try{ const d = JSON.parse(String(r)); if (d.err) { console.log(' ✗', d.err, d.head); process.exit(0); } console.log(' userInfo 顶层字段:', (d.topKeys||[]).join(', ').slice(0,300)); console.log(' shopMap 类型:', d.shopMapType); if (d.shopMapKeys) console.log(' shopMap 键(平台):', d.shopMapKeys.join(', ')); console.log(); console.log(' ── 全部店铺 ──'); (d.shops||[]).forEach(s=>console.log(' ', String(s.platform).padEnd(16), 'id='+String(s.id||s.idStr).padEnd(12), s.name||'')); if (d.platformList) console.log(); if (d.platformList) console.log(' platformList:', SAN(JSON.stringify(d.platformList)).slice(0,400)); }catch(e){ console.log('err', e.message, SAN(String(r)).slice(0,600)); } c.close();