const https = require('https'); function fetch(url) { return new Promise((res,rej)=>{ const u=new URL(url); https.request({hostname:u.hostname,path:u.pathname+u.search,headers:{'User-Agent':'Mozilla/5.0','Accept':'*/*'}},r=>{ let d=''; r.on('data',c=>d+=c); r.on('end',()=>res({status:r.statusCode,data:d})); }).on('error',rej).end(); }); } (async()=>{ // Test Jumbo let r = await fetch('https://www.jumbo.com.ar/api/dataentities/JN/documents/bankDiscount?_fields=value,id&an=jumboargentina&_size=200'); const outer = JSON.parse(r.data); const items = JSON.parse(outer.value); const nowUnix = Math.floor(Date.now()/1000); console.log('JUMBO: Total:', items.length, '| now unix:', nowUnix); const active = items.filter(x => parseInt(x.dateEnd||0) > nowUnix); console.log('Active (dateEnd > now):', active.length); const dayMap = {1:'Lun',2:'Mar',3:'Mie',4:'Jue',5:'Vie',6:'Sab',7:'Dom'}; const byDay = {}; active.forEach(x => { (x.days||[]).forEach(d => { const k = dayMap[d]||d; if (!byDay[k]) byDay[k] = 0; byDay[k]++; }); }); console.log('Active by day:', JSON.stringify(byDay)); active.slice(0,5).forEach(x => { const dateEnd = new Date(parseInt(x.dateEnd)*1000).toISOString().slice(0,10); const banks = (x.banks||[]).map(b=>b.name).join(','); console.log(' -', x.discount+'%', banks, 'days:', x.days, 'until:', dateEnd); if (x.info) console.log(' info:', String(x.info).slice(0,120)); }); // Test Disco with different account names console.log('\nDISCO tests:'); for (const an of ['disco','discofrescos','discoar']) { r = await fetch(`https://www.disco.com.ar/api/dataentities/JN/documents/bankDiscount?_fields=value,id&an=${an}&_size=5`); console.log(` an=${an} -> status:${r.status} size:${r.data.length} preview:${r.data.slice(0,100)}`); } // Test DIA console.log('\nDIA tests:'); for (const an of ['supermercadosdia','diaonline','diasupermercados']) { r = await fetch(`https://diaonline.supermercadosdia.com.ar/api/dataentities/JN/documents/bankDiscount?_fields=value,id&an=${an}&_size=5`); console.log(` an=${an} -> status:${r.status} size:${r.data.length} preview:${r.data.slice(0,100)}`); } // Test Changomas GraphQL console.log('\nCHANGOMAS GraphQL GetPromos:'); const hash = '1a071ebc5dc407a3f65e687b0f4c0a3b8d12a0c45d8d11370075c3b2a505251c'; const vars = Buffer.from(JSON.stringify({})).toString('base64'); const ext = Buffer.from(JSON.stringify({persistedQuery:{version:1,sha256Hash:hash}})).toString('base64'); const url = `https://www.masonline.com.ar/_v/public/graphql/v1?workspace=master&maxAge=short&appsEtag=remove&domain=store&locale=es-AR&operationName=GetPromos&variables=${vars}&extensions=${ext}`; r = await fetch(url); console.log(' status:', r.status, 'size:', r.data.length); console.log(' preview:', r.data.slice(0, 500)); // Test Carrefour GraphQL console.log('\nCARREFOUR GraphQL GetPromotions:'); const chash = 'cdedb2142b133164ce61b85e94287592451ebee4a2fbede815e09336d40d29ae'; const now2 = new Date().toISOString().replace('T',' ').replace(/\.\d+Z$/,''); const cvars = Buffer.from(JSON.stringify({where:`active=true AND ((active_from < "${now2}") AND (active_to > "${now2}"))`,account:'carrefourar'})).toString('base64'); const cext = Buffer.from(JSON.stringify({persistedQuery:{version:1,sha256Hash:chash}})).toString('base64'); const curl = `https://www.carrefour.com.ar/_v/public/graphql/v1?workspace=master&maxAge=short&appsEtag=remove&domain=store&locale=es-AR&operationName=GetPromotions&variables=${cvars}&extensions=${cext}`; r = await fetch(curl); console.log(' status:', r.status, 'size:', r.data.length); if (r.status === 200) { try { const d = JSON.parse(r.data); const promos = d?.data?.getPromotions || d?.data?.promotions; console.log(' promos type:', Array.isArray(promos)?'array len='+promos.length:typeof promos); if (Array.isArray(promos)) console.log(' first:', JSON.stringify(promos[0]).slice(0,400)); else console.log(' raw:', r.data.slice(0,500)); } catch { console.log(' raw:', r.data.slice(0,400)); } } else { console.log(' error:', r.data.slice(0,300)); } })().catch(e=>console.error(e));