// Test all discovered bank promo APIs directly (no browser) const https = require('https'); function fetch(url, opts={}) { return new Promise((resolve, reject) => { const u = new URL(url); const req = https.request({ hostname: u.hostname, path: u.pathname + u.search, method: opts.method || 'GET', headers: { 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 Chrome/120.0 Safari/537.36', 'Accept': 'application/json, */*', ...(opts.headers || {}), } }, res => { let data = ''; res.on('data', c => data += c); res.on('end', () => resolve({status: res.statusCode, data, headers: res.headers})); }); req.on('error', reject); req.end(); }); } async function testJumboMasterData() { console.log('\n=== JUMBO VTEX Master Data ==='); const r = await fetch('https://www.jumbo.com.ar/api/dataentities/JN/documents/bankDiscount?_fields=value,id,banks,days,discount,checkout,websites,dateStart,dateEnd,legals,installmentsText,info&an=jumboargentina&_size=200'); console.log('Status:', r.status, 'Size:', r.data.length); if (r.status === 200) { const d = JSON.parse(r.data); console.log('Records:', d.length, '| First:', JSON.stringify(d[0]).slice(0, 300)); // Find active ones with websites containing jumbo const active = d.filter(x => x.checkout || (x.websites && x.websites.includes('jumbo'))); console.log('Active checkout or jumbo-website:', active.length); active.slice(0,3).forEach(x => console.log(' -', JSON.stringify(x).slice(0,200))); } } async function testDiscoMasterData() { console.log('\n=== DISCO VTEX Master Data ==='); const r = await fetch('https://www.disco.com.ar/api/dataentities/JN/documents/bankDiscount?_fields=value,id,banks,days,discount,checkout,websites,dateStart,dateEnd,legals,installmentsText,info&an=disco&_size=200'); console.log('Status:', r.status, 'Size:', r.data.length); if (r.status === 200) { try { const d = JSON.parse(r.data); console.log('Records:', d.length, '| First:', JSON.stringify(d[0]).slice(0, 300)); } catch(e) { console.log('Parse error:', r.data.slice(0,200)); } } } async function testDiaMasterData() { // DIA might use the same JN schema - try different account names console.log('\n=== DIA VTEX Master Data ==='); for (const an of ['supermercadosdia', 'diaonline', 'dia']) { const r = await fetch(`https://diaonline.supermercadosdia.com.ar/api/dataentities/JN/documents/bankDiscount?_fields=value,id,banks,days,discount&an=${an}&_size=10`); console.log(`an=${an} -> Status:`, r.status, 'Size:', r.data.length); if (r.status === 200 && r.data.length > 5) { try { const d = JSON.parse(r.data); console.log('Records:', d.length, '| First:', JSON.stringify(d[0]).slice(0,300)); } catch {} } } } async function testChangomasGraphQL() { console.log('\n=== CHANGOMAS GraphQL GetPromos ==='); const now = new Date().toISOString(); // Try with no variables first (just the hash), then with variables 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}`; console.log('URL:', url.slice(0,120)+'...'); const r = await fetch(url); console.log('Status:', r.status, 'Size:', r.data.length); console.log('Preview:', r.data.slice(0, 500)); } async function testCarrefourGraphQL() { console.log('\n=== CARREFOUR GraphQL GetPromotions ==='); const hash = 'cdedb2142b133164ce61b85e94287592451ebee4a2fbede815e09336d40d29ae'; const now = new Date().toISOString().replace('T', ' ').replace(/\.\d+Z$/, ''); const whereClause = `active=true AND ((active_from < "${now}") AND (active_to > "${now}"))`; const vars = Buffer.from(JSON.stringify({where: whereClause, account:'carrefourar'})).toString('base64'); const ext = Buffer.from(JSON.stringify({persistedQuery:{version:1,sha256Hash:hash}})).toString('base64'); const url = `https://www.carrefour.com.ar/_v/public/graphql/v1?workspace=master&maxAge=short&appsEtag=remove&domain=store&locale=es-AR&operationName=GetPromotions&variables=${vars}&extensions=${ext}`; console.log('URL:', url.slice(0,150)+'...'); const r = await fetch(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?.promotions || d; console.log('Preview:', JSON.stringify(promos).slice(0, 500)); } catch { console.log('Raw:', r.data.slice(0,400)); } } else { console.log('Error:', r.data.slice(0,300)); } } (async () => { await testJumboMasterData(); await testDiscoMasterData(); await testDiaMasterData(); await testChangomasGraphQL(); await testCarrefourGraphQL(); })().catch(e => console.error(e));