← Назад
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 };