← Back
ā˜†
import 'dotenv/config';

const API_KEY = process.env.ADSTERRA_API_KEY;
const BASE = process.env.ADSTERRA_BASE_URL || 'https://api3.adsterratools.com';

if (!API_KEY) {
  console.error('āŒ ADSTERRA_API_KEY not set in .env');
  process.exit(1);
}

const headers = { 'X-API-Key': API_KEY };

const api = async (path, params = {}) => {
  const url = new URL(`${BASE}${path}`);
  Object.entries(params).forEach(([k, v]) => url.searchParams.set(k, v));

  const res = await fetch(url, { headers });
  if (!res.ok) {
    throw new Error(`API ${res.status}: ${await res.text()}`);
  }
  return res.json();
};

// ─── Publisher Endpoints ───────────────────────────────

const getStats = async (startDate, finishDate, groupBy = 'date') => {
  const today = new Date().toISOString().slice(0, 10);
  return api('/publisher/stats.json', {
    start_date: startDate || today,
    finish_date: finishDate || today,
    group_by: groupBy,
  });
};

const getDomains = async () => api('/publisher/domains.json');

const getPlacements = async () => api('/publisher/placements.json');

const getStatsByDomain = async (domainId, startDate, finishDate) => {
  const today = new Date().toISOString().slice(0, 10);
  return api('/publisher/stats.json', {
    domain: domainId,
    start_date: startDate || today,
    finish_date: finishDate || today,
    group_by: 'placement',
  });
};

const getStatsByCountry = async (startDate, finishDate) => {
  const today = new Date().toISOString().slice(0, 10);
  return api('/publisher/stats.json', {
    start_date: startDate || today,
    finish_date: finishDate || today,
    group_by: 'country',
  });
};

// ─── CLI ───────────────────────────────────────────────

const [cmd, ...args] = process.argv.slice(2);

const formatTable = (items) => {
  if (!items || items.length === 0) {
    console.log('  (ŠæŃƒŃŃ‚Š¾ — нет Ганных)');
    return;
  }
  console.table(items);
};

const now = new Date();
const defaultStart = new Date(now - 30 * 86400000).toISOString().slice(0, 10);
const defaultEnd = now.toISOString().slice(0, 10);

const commands = {
  async stats() {
    const [start, end, group] = args;
    console.log(`\nšŸ“Š Дтатистика (${start || defaultStart} → ${end || defaultEnd}, group: ${group || 'date'})\n`);
    const data = await getStats(start || defaultStart, end || defaultEnd, group || 'date');
    console.log(`  DB updated: ${data.dbLastUpdateTime}`);
    console.log(`  Items: ${data.itemCount}\n`);
    formatTable(data.items);
  },

  async domains() {
    console.log('\n🌐 Домены\n');
    const data = await getDomains();
    console.log(`  Всего: ${data.itemCount}`);
    formatTable(data.items);
  },

  async placements() {
    console.log('\nšŸ“ ŠŸŠ»ŠµŠ¹ŃŠ¼ŠµŠ½Ń‚Ń‹\n');
    const data = await getPlacements();
    console.log(`  Всего: ${data.itemCount}`);
    formatTable(data.items);
  },

  async country() {
    const [start, end] = args;
    console.log(`\nšŸŒ Дтата по странам (${start || defaultStart} → ${end || defaultEnd})\n`);
    const data = await getStatsByCountry(start || defaultStart, end || defaultEnd);
    formatTable(data.items);
  },

  async help() {
    console.log(`
šŸ”§ Adsterra CLI — Publisher API

ŠšŠ¾Š¼Š°Š½Š“Ń‹:
  node adsterra.js stats [start] [end] [group]  — Дтатистика (group: date|domain|placement|country)
  node adsterra.js domains                       — Дписок Гоменов
  node adsterra.js placements                    — Дписок плейсментов
  node adsterra.js country [start] [end]         — Дтата по странам
  node adsterra.js help                          — Эта справка

ŠŸŃ€ŠøŠ¼ŠµŃ€Ń‹:
  node adsterra.js stats 2026-03-01 2026-03-25 domain
  node adsterra.js country 2026-03-01 2026-03-25
`);
  },
};

const run = commands[cmd] || commands.help;
run().catch((err) => {
  console.error(`āŒ Error: ${err.message}`);
  process.exit(1);
});

export { api, getStats, getDomains, getPlacements, getStatsByDomain, getStatsByCountry };

šŸ“œ Git History

71dd65fchore: initial commit — version control setup5 weeks ago
Show last diff
Loading...