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