← back to Majilite Onboard
scripts/cc_probe.js
30 lines
// Constant Contact v3 — verify creds, refresh token (save rotated), read senders/address/lists.
const fs=require('fs'),path=require('path');
const ENV=path.join(process.env.HOME,'Projects/secrets-manager/.env');
const env=fs.readFileSync(ENV,'utf8');
const g=k=>((env.match(new RegExp('^'+k+'=(.+)$','m'))||[])[1]||'').replace(/["']/g,'').trim();
const CID=g('CC_CLIENT_ID'), CSEC=g('CC_CLIENT_SECRET'), RTOK=g('CC_REFRESH_TOKEN');
(async()=>{
if(!CID||!CSEC||!RTOK){console.log('missing CC creds', {CID:!!CID,CSEC:!!CSEC,RTOK:!!RTOK});return;}
const basic=Buffer.from(CID+':'+CSEC).toString('base64');
const body=new URLSearchParams({grant_type:'refresh_token',refresh_token:RTOK});
const tr=await fetch('https://authz.constantcontact.com/oauth2/default/v1/token',{method:'POST',headers:{'Authorization':'Basic '+basic,'Content-Type':'application/x-www-form-urlencoded'},body});
const tj=await tr.json();
if(!tj.access_token){console.log('TOKEN FAIL', JSON.stringify(tj).slice(0,200));return;}
const AT=tj.access_token;
// persist rotated refresh token immediately
if(tj.refresh_token && tj.refresh_token!==RTOK){
let e=fs.readFileSync(ENV,'utf8'); e=e.replace(/^CC_REFRESH_TOKEN=.*$/m,'CC_REFRESH_TOKEN='+tj.refresh_token); fs.writeFileSync(ENV,e);
console.log('rotated CC_REFRESH_TOKEN saved (…'+tj.refresh_token.slice(-6)+')');
}
fs.writeFileSync('/tmp/majilite/cc_at.txt', AT);
const api=(p)=>fetch('https://api.cc.email/v3'+p,{headers:{'Authorization':'Bearer '+AT,'Accept':'application/json'}}).then(r=>r.json());
const sum=await api('/account/summary?extra_fields=physical_address');
console.log('ACCOUNT:', sum.organization_name||sum.email||'?', '| addr:', JSON.stringify(sum.physical_address||{}).slice(0,120));
const emails=await api('/account/emails');
const verified=(Array.isArray(emails)?emails:[]).filter(e=>e.confirm_status==='CONFIRMED');
console.log('VERIFIED SENDERS:', verified.map(e=>e.email_address).join(', ')||JSON.stringify(emails).slice(0,150));
const lists=await api('/contact_lists?include_count=true');
console.log('LISTS:', (lists.lists||[]).map(l=>l.name+' ('+(l.membership_count||0)+') ['+l.list_id+']').join(' | ').slice(0,400));
})();