const https = require('https'); function httpGet(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 (X11; Linux x86_64) AppleWebKit/537.36 Chrome/120.0 Safari/537.36','Accept':'application/json,*/*'} }, r=>{ let d=''; r.on('data',c=>d+=c); r.on('end',()=>res({status:r.statusCode,data:d})); }).on('error',rej).end(); }); } function buildVtexGraphqlUrl(host, operationName, hash, sender, provider, account) { // Now is ISO without ms const now = new Date().toISOString().replace(/\.\d+Z$/,'').replace('T',' '); const innerVars = { where: `active=true AND ((active_from < ${now}) AND (active_to > ${now}))`, account }; const ext = { persistedQuery: {version:1, sha256Hash:hash, sender, provider}, variables: Buffer.from(JSON.stringify(innerVars)).toString('base64') }; const params = new URLSearchParams({ workspace:'master', maxAge:'short', appsEtag:'remove', domain:'store', locale:'es-AR', operationName, variables:'{}', extensions: JSON.stringify(ext) }); return `https://${host}/_v/public/graphql/v1?${params}`; } async function testCarrefour() { console.log('\n=== CARREFOUR GetPromotions ==='); const url = buildVtexGraphqlUrl( 'www.carrefour.com.ar', 'GetPromotions', 'cdedb2142b133164ce61b85e94287592451ebee4a2fbede815e09336d40d29ae', 'valtech.carrefourar-bank-promotions@0.x', 'vtex.store-graphql@2.x', 'carrefourar' ); console.log('URL:', url.slice(0,120)+'...'); const r = await httpGet(url); 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?.GetPromotions || d?.data?.promotions; console.log('data keys:', Object.keys(d?.data||{})); if (Array.isArray(promos)) { console.log('Promos count:', promos.length); console.log('First:', JSON.stringify(promos[0]).slice(0,500)); } else { console.log('Full response:', JSON.stringify(d).slice(0,600)); } } catch(e) { console.log('Parse err:', e.message, '| raw:', r.data.slice(0,300)); } } else { console.log('Error:', r.data.slice(0,300)); } } async function testChangomas() { console.log('\n=== CHANGOMAS GetPromos ==='); const url = buildVtexGraphqlUrl( 'www.masonline.com.ar', 'GetPromos', '1a071ebc5dc407a3f65e687b0f4c0a3b8d12a0c45d8d11370075c3b2a505251c', 'valtech.gdn-banks-promotions@0.x', 'vtex.store-graphql@2.x', 'masonlineprod' ); console.log('URL:', url.slice(0,120)+'...'); const r = await httpGet(url); console.log('Status:', r.status, 'Size:', r.data.length); if (r.status === 200) { try { const d = JSON.parse(r.data); console.log('data keys:', Object.keys(d?.data||{})); const promos = d?.data?.getPromos || d?.data?.GetPromos || d?.data?.promos; if (Array.isArray(promos)) { console.log('Promos count:', promos.length); console.log('First:', JSON.stringify(promos[0]).slice(0,500)); } else { console.log('Full:', JSON.stringify(d).slice(0,600)); } } catch(e) { console.log('Parse err:', e.message, '| raw:', r.data.slice(0,300)); } } else { console.log('Error:', r.data.slice(0,300)); } } // Also test Disco/DIA - try to find account name via their page runtime async function testDiscoAccountName() { console.log('\n=== DISCO account name discovery ==='); const r = await httpGet('https://www.disco.com.ar/api/dataentities/JN/documents/bankDiscount?_fields=value,id&an=cencosud&_size=5'); console.log('an=cencosud:', r.status, r.data.slice(0,100)); const r2 = await httpGet('https://www.disco.com.ar/api/dataentities/JN/documents/bankDiscount?_fields=value,id&an=jumboargentina&_size=5'); console.log('an=jumboargentina:', r2.status, r2.data.slice(0,150)); } (async()=>{ await testCarrefour(); await testChangomas(); await testDiscoAccountName(); })().catch(e=>console.error(e));