'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 evalV(expr,cb){send('Runtime.evaluate',{expression:expr,returnByValue:true},(r)=>cb(r&&r.result&&r.result.value));} function evalJ(expr,cb){evalV('(function(){try{return JSON.stringify('+expr+');}catch(e){return JSON.stringify({err:e.message});}})()',v=>{try{cb(JSON.parse(v||'null'));}catch(e){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 8s...'); setTimeout(extractBase,8000); } } }); // Step 1: extract all promo base data without legal text function extractBase(){ evalJ(`(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:'', imgSrc:img?img.src.split('/').pop():'' }); }); return {count:items.length,items:out}; })`,data=>{ if(!data||!data.items){console.log('No data:',data);ws.close();return;} console.log('Got',data.count,'promo items'); data.items.forEach((p,i)=>promos.push(Object.assign({legal:'',btnIdx:i},p))); // Step 2: click each Ver Legales and get legal text clickNext(0); }); } function clickNext(idx){ if(idx>=promos.length){saveAndDone();return;} const CLOSE_EXPR=`(function(){ // Close any open modal first var closeBtn=document.querySelector('[class*="vtex-modal"][class*="close"],[class*="modal__close"],[aria-label="Close"],[aria-label="Cerrar"]'); if(closeBtn)closeBtn.click(); document.dispatchEvent(new KeyboardEvent('keydown',{key:'Escape',bubbles:true,cancelable:true})); })()`; evalV(CLOSE_EXPR,()=>{ setTimeout(()=>{ // Click button idx evalV(`(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'){clickNext(idx+1);return;} // Wait for modal render setTimeout(()=>{ evalV(`(function(){ // The legal text appears in bank-modal__text inside the item's bank-modal div // OR in a vtex-modal overlay var texts=[ document.querySelector('[class*="bank-modal__text"]'), document.querySelector('[class*="vtex-modal__modal"] p'), document.querySelector('[class*="vtex-modal__modal"] div > p'), ]; for(var i=0;i20)return t; } } // Fallback: any fixed element with legal-sounding text var all=document.querySelectorAll('*'); for(var j=0;j50&&t2.length<5000&&!/cookie|chat|bot/i.test(t2)){ return t2.slice(0,600); } } } return ''; })()`,legal=>{ promos[idx].legal=legal||''; process.stdout.write('['+idx+'] '+promos[idx].descuento+' legal: '+(legal?legal.slice(0,60)+'...':'empty')+'\n'); clickNext(idx+1); }); },1800); }); },400); }); } function saveAndDone(){ console.log('\n=== ALL PROMOS ==='); 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-relay-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');saveAndDone();},120000);