'use strict'; const WS_URL = 'ws://127.0.0.1:18792/cdp'; const TOKEN = '0537d84a67f2e43b525964bb43d93f6dfae1ec1b50946455'; const TARGET_URL = 'https://diaonline.supermercadosdia.com.ar/medios-de-pago-y-promociones'; const WS = require('/usr/lib/node_modules/openclaw/node_modules/ws').WebSocket || require('/usr/lib/node_modules/openclaw/node_modules/ws'); const fs = require('fs'); const ws = new WS(WS_URL, { headers: { 'x-openclaw-relay-token': TOKEN } }); let _id=1, sessionId=null, started=false; const cbs=new Map(); const promos=[]; function send(method,params,cb){const id=_id++;const m={id,method,params:params||{}};if(sessionId)m.sessionId=sessionId;if(cb)cbs.set(id,cb);ws.send(JSON.stringify(m));} function evalS(expr,cb){send('Runtime.evaluate',{expression:expr,returnByValue:true},(r)=>cb(r&&r.result&&r.result.value));} function evalJ(expr,cb){ const wrapped = '(function(){try{var __r=('+expr+');return JSON.stringify(__r);}catch(e){return JSON.stringify({__err:e.message});}})()'; evalS(wrapped, v=>{ if(!v){cb(null);return;} try{const p=JSON.parse(v);if(p&&p.__err){console.error('evalJ err:',p.__err);cb(null);}else cb(p);}catch(e){console.error('parse err:',String(v).slice(0,200));cb(null);} }); } ws.on('open',()=>{ send('Target.getTargets',{},(res)=>{ const t=(res.targetInfos||[]).filter(t=>t.type==='page')[0]; send('Target.attachToTarget',{targetId:t.targetId,flatten:true},(r2)=>{ sessionId=r2.sessionId; send('Page.enable'); send('Page.navigate',{url:TARGET_URL}); }); }); }); ws.on('message',raw=>{ const msg=JSON.parse(raw); if(msg.id&&cbs.has(msg.id)){const cb=cbs.get(msg.id);cbs.delete(msg.id);cb(msg.result||{});return;} if(!msg.method)return; if(msg.method==='Page.frameNavigated'){ const url=msg.params&&msg.params.frame&&msg.params.frame.url; if(url&&url.includes('medios-de-pago')&&!started){ started=true; console.log('Navigated. Waiting 10s...'); setTimeout(extractBase,10000); } } }); function extractBase(){ const expr = [ '(function(){', ' var items=document.querySelectorAll(\'[class*="list-by-days__item"]\');', ' var out=[];', ' [].forEach.call(items,function(item){', ' var flags=[].map.call(item.querySelectorAll(\'[class*="flag"]\'),function(el){return el.textContent.trim();});', ' var first=item.querySelector(\'[class*="first-text"]\');', ' var second=item.querySelector(\'[class*="second-text"]\');', ' var third=item.querySelector(\'[class*="third-text"]\');', ' var img=item.querySelector("img");', ' out.push({', ' canal:flags.join("|"),', ' descuento:first?first.textContent.trim():"",', ' detalle:second?second.textContent.trim():"",', ' vigencia:third?third.textContent.trim():"",', ' imgAlt:img?img.alt:""', ' });', ' });', ' return {count:items.length,items:out};', '})()' ].join('\n'); evalJ(expr, data=>{ if(!data||!data.items){console.log('No base data:',data);ws.close();return;} console.log('Got',data.count,'promo items'); data.items.forEach((p,i)=>promos.push(Object.assign({legal:'',idx:i},p))); clickNext(0); }); } function clickNext(idx){ if(idx>=promos.length){saveAndDone();return;} // First close any open modal evalS('(function(){var c=document.querySelector(\'[aria-label="Close"],[aria-label="Cerrar"],[class*="modal__close"],[class*="closeButton"]\');if(c)c.click();document.dispatchEvent(new KeyboardEvent("keydown",{key:"Escape",bubbles:true}));})()', ()=>{ setTimeout(()=>{ // Click button idx evalS('(function(){var btns=document.querySelectorAll(\'[class*="bank-modal__button"]\');if(!btns['+idx+'])return "missing";btns['+idx+'].scrollIntoView({block:"center",behavior:"instant"});btns['+idx+'].click();return "ok";})()', res=>{ if(res==='missing'){console.log('['+idx+'] missing, skipping');clickNext(idx+1);return;} setTimeout(()=>{ // Try multiple selectors for legal text const legalExpr = [ '(function(){', ' var selectors=[', ' \'[class*="bank-modal__text"]\',', ' \'[class*="vtex-modal__modal"] p\',', ' \'[class*="vtex-modal"] [class*="content"] p\',', ' \'[role="dialog"] p\'', ' ];', ' for(var i=0;i20)return t;}', ' }', ' // fallback: fixed visible element', ' var all=document.querySelectorAll("*");', ' for(var j=0;j50&&t2.length<5000&&!/cookie|chat|bot|menu/i.test(t2))return t2.slice(0,800);', ' }', ' }', ' return "";', '})()' ].join('\n'); evalS(legalExpr, legal=>{ promos[idx].legal=legal||''; process.stdout.write('['+idx+'] '+promos[idx].descuento+' → '+(legal?legal.slice(0,80)+'...':'(empty)')+'\n'); clickNext(idx+1); }); },2000); }); },400); }); } function saveAndDone(){ console.log('\n=== RESULTS ==='); promos.forEach((p,i)=>{ console.log('['+i+'] '+p.canal+' | '+p.descuento+' | '+p.detalle.slice(0,50)+' | '+p.vigencia.slice(0,40)); if(p.imgAlt)console.log(' bank: '+p.imgAlt); if(p.legal)console.log(' LEGAL: '+p.legal.slice(0,200)); console.log(); }); const out={generatedAt:new Date().toISOString(),source:'chrome-cdp-dom',promos}; fs.writeFileSync('/tmp/dia_promos_full.json',JSON.stringify(out,null,2)); console.log('Saved /tmp/dia_promos_full.json'); ws.close(); } ws.on('error',e=>console.error('WS err:',e.message)); ws.on('close',()=>process.exit(0)); setTimeout(()=>{console.log('TIMEOUT — saving what we have');saveAndDone();},180000);