← back to Marketing Command Center

scripts/cc-agent-discover.js

44 lines

// One-off discovery: enumerate the Connie cc-agent's API surface so we can
// (1) find the China Seas campaign + its HTML and (2) learn the create-draft route.
// Reuses the SAME config resolution as modules/constant-contact/index.js
// (env-first, then gitignored .cc-agent.json). Read-only probes only.
const fs = require('fs'); const path = require('path');
const https = require('https'); const http = require('http'); const { URL } = require('url');

function cfg() {
  let c = { base: process.env.CC_AGENT_BASE, user: process.env.CC_AGENT_USER, pass: process.env.CC_AGENT_PASS };
  if (!c.base || !c.user || !c.pass) {
    try { const f = JSON.parse(fs.readFileSync(path.join(__dirname, '..', '.cc-agent.json'), 'utf8'));
      c.base = c.base || f.base; c.user = c.user || f.user; c.pass = c.pass || f.pass; } catch {}
  }
  c.base = c.base || 'https://100.107.67.67:9820'; c.user = c.user || 'admin'; c.pass = c.pass || 'DWSecure2024!';
  return c;
}
function fetchJSON(pathname, { method = 'GET', body, timeoutMs = 9000 } = {}) {
  return new Promise((resolve) => {
    const c = cfg();
    let u; try { u = new URL(pathname, c.base.endsWith('/') ? c.base : c.base + '/'); }
    catch (e) { return resolve({ status: 0, err: 'bad url ' + e.message }); }
    const isHttps = u.protocol === 'https:'; const lib = isHttps ? https : http;
    const auth = 'Basic ' + Buffer.from(`${c.user}:${c.pass}`).toString('base64');
    const opts = { method, hostname: u.hostname, port: u.port || (isHttps ? 443 : 80),
      path: u.pathname + u.search, headers: { Authorization: auth, Accept: 'application/json, text/html' },
      timeout: timeoutMs, ...(isHttps ? { rejectUnauthorized: false } : {}) };
    if (body) opts.headers['Content-Type'] = 'application/json';
    const req = lib.request(opts, (r) => { let t = ''; r.on('data', d => t += d); r.on('end', () => {
      resolve({ status: r.statusCode, ct: r.headers['content-type'] || '', len: t.length, body: t.slice(0, 1200) }); }); });
    req.on('error', e => resolve({ status: 0, err: e.message }));
    req.on('timeout', () => { req.destroy(); resolve({ status: 0, err: 'timeout' }); });
    if (body) req.write(JSON.stringify(body)); req.end();
  });
}
(async () => {
  const probes = ['', 'health', 'api', 'api/health', 'api/routes', 'routes', 'openapi.json',
    'api/campaigns', 'api/campaigns?limit=100', 'api/drafts', 'api/lists', 'api/contacts'];
  for (const p of probes) {
    const r = await fetchJSON(p);
    console.log(`\n### /${p}  ->  ${r.status} ${r.ct ? '('+r.ct+')' : ''} ${r.err ? 'ERR:'+r.err : 'len='+r.len}`);
    if (r.body) console.log(r.body.replace(/("(?:pass|token|secret|access_token|refresh_token|authorization)"\s*:\s*")[^"]+/gi, '$1<redacted>'));
  }
})();