ΠΡΠΈΡΠΈΠ°Π»ΡΠ½ΡΠΉ SDK Π΄Π»Ρ AnyAds.online, ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π½ΡΠΉ Π΄Π»Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² Π½Π° Node.js. ΠΠ°ΠΊΠ΅Ρ Π½Π°ΠΏΠΈΡΠ°Π½ Π½Π° TypeScript, ΡΡΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ ΡΡΡΠΎΠ³ΡΡ ΡΠΈΠΏΠΈΠ·Π°ΡΠΈΡ ΠΈ Π°Π²ΡΠΎΠ΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π² Π²Π°ΡΠ΅ΠΌ ΡΠ΅Π΄Π°ΠΊΡΠΎΡΠ΅ ΠΊΠΎΠ΄Π°.
Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ ΠΏΠ°ΠΊΠ΅Ρ ΠΈΠ· ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ npm Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π²Π°ΡΠ΅Π³ΠΎ Π»ΡΠ±ΠΈΠΌΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠ½ΠΎΠ³ΠΎ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠ°.
# npm
npm install @anyads/sdk
# pnpm
pnpm add @anyads/sdk
# yarn
yarn add @anyads/sdk
ΠΡΠΎ ΡΠ°ΠΌΡΠΉ ΠΏΡΠΎΡΡΠΎΠΉ ΠΈ Π±ΡΡΡΡΡΠΉ ΡΠΏΠΎΡΠΎΠ± Π½Π°ΡΠ°ΡΡ ΡΠ°Π±ΠΎΡΡ, Π΅ΡΠ»ΠΈ Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ Telegraf.js.
import { Telegraf, Markup } from 'telegraf';
import * as anyads from '@anyads/sdk';
import * as dotenv from 'dotenv';
// ΠΠ°Π³ΡΡΠΆΠ°Π΅ΠΌ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ ΠΈΠ· .env ΡΠ°ΠΉΠ»Π°
dotenv.config();
// --- 1. ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ---
const ANYADS_API_KEY = process.env.ANYADS_API_KEY;
const TELEGRAM_BOT_TOKEN = process.env.TELEGRAM_BOT_TOKEN;
if (!ANYADS_API_KEY || !TELEGRAM_BOT_TOKEN) {
throw new Error("ΠΠ΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ ANYADS_API_KEY ΠΈ TELEGRAM_BOT_TOKEN");
}
// --- 2. ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ---
const bot = new Telegraf(TELEGRAM_BOT_TOKEN);
const sdk = anyads.init({ apiKey: ANYADS_API_KEY });
// --- 3. Π Π΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² AnyAds ---
anyads.integrations.telegraf.registerAnyAdsHandlers(bot);
// --- 4. ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΡΠ΅ΠΊΠ»Π°ΠΌΠ½ΡΡ
Π·Π°Π΄Π°Ρ ---
sdk.onBroadcastReceived(async (taskData) => {
console.log(`ΠΠΎΠ»ΡΡΠ΅Π½Π° Π½ΠΎΠ²Π°Ρ Π·Π°Π΄Π°ΡΠ° Π½Π° ΡΠ°ΡΡΡΠ»ΠΊΡ: ${taskData.task_id}`);
const content = taskData.creative.content;
const text = content.text;
// ΠΠ΅ΡΠ΅ΠΌ ΠΏΠ΅ΡΠ²ΡΠΉ URL ΠΈΠ· ΠΌΠ°ΡΡΠΈΠ²Π° ΡΠ°ΠΉΠ»ΠΎΠ², Π΅ΡΠ»ΠΈ ΠΎΠ½ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ
const imageUrl = (content.files && content.files.length > 0) ? content.files[0] : undefined;
if (!text && !imageUrl) {
console.error('ΠΡΠΈΠ±ΠΊΠ°: Π² ΠΊΡΠ΅Π°ΡΠΈΠ²Π΅ ΠΎΡΡΡΡΡΡΠ²ΡΠ΅Ρ ΡΠ΅ΠΊΡΡ ΠΈ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅.');
return;
}
// --- Π‘ΠΎΠ±ΠΈΡΠ°Π΅ΠΌ ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΡ ΠΈΠ· Π΄Π°Π½Π½ΡΡ
, ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΡ
ΠΎΡ SDK ---
const inlineKeyboard = Markup.inlineKeyboard(
content.buttons || [] // Telegraf ΠΎΡΠ»ΠΈΡΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Ρ ΠΌΠ°ΡΡΠΈΠ²ΠΎΠΌ ΠΌΠ°ΡΡΠΈΠ²ΠΎΠ²
);
// !!! ΠΠΠΠΠ: ΠΠ΄Π΅ΡΡ Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ Π²Π°ΡΠ° Π»ΠΎΠ³ΠΈΠΊΠ° ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠΏΠΈΡΠΊΠ° ID ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ
// const userIds = await getAllUsersFromDatabase();
const userIds: number[] = []; // ΠΠ°Π³Π»ΡΡΠΊΠ°, Π·Π°ΠΌΠ΅Π½ΠΈΡΠ΅ Π½Π° ΡΠ΅Π°Π»ΡΠ½ΡΠΉ ΠΊΠΎΠ΄
for (const userId of userIds) {
try {
// --- ΠΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌ ΠΏΠΎΠ»Π½ΠΎΡΠ΅Π½Π½ΠΎΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Ρ ΠΊΠ°ΡΡΠΈΠ½ΠΊΠΎΠΉ ΠΈ/ΠΈΠ»ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠ°ΠΌΠΈ ---
if (imageUrl) {
await bot.telegram.sendPhoto(userId, imageUrl, {
caption: text,
reply_markup: inlineKeyboard.reply_markup,
});
} else if (text) { // ΠΡΠ»ΠΈ ΠΊΠ°ΡΡΠΈΠ½ΠΊΠΈ Π½Π΅Ρ, ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌ ΠΏΡΠΎΡΡΠΎ ΡΠ΅ΠΊΡΡ
await bot.telegram.sendMessage(userId, text, {
reply_markup: inlineKeyboard.reply_markup,
disable_web_page_preview: true
});
}
// ΠΠ°ΡΠ·Π°, ΡΡΠΎΠ±Ρ Π½Π΅ ΠΏΠΎΠΏΠ°ΡΡΡ ΠΏΠΎΠ΄ Π»ΠΈΠΌΠΈΡΡ Telegram
await new Promise(resolve => setTimeout(resolve, 50));
} catch (error) {
console.warn(`ΠΠ΅ ΡΠ΄Π°Π»ΠΎΡΡ ΠΎΡΠΏΡΠ°Π²ΠΈΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ${userId}:`, error);
}
}
});
// --- 5. ΠΠ°ΠΏΡΡΠΊ ---
async function startApp() {
await sdk.start();
bot.launch();
console.log('ΠΠΎΡ Π·Π°ΠΏΡΡΠ΅Π½...');
// ΠΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅ΠΌ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΠ΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π±ΠΎΡΡ
process.once('SIGINT', () => { bot.stop('SIGINT'); sdk.stop(); });
process.once('SIGTERM', () => { bot.stop('SIGTERM'); sdk.stop(); });
}
startApp();
ΠΡΠ»ΠΈ Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ Π΄ΡΡΠ³ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, node-telegram-bot-api) ΠΈΠ»ΠΈ ΡΠ°Π±ΠΎΡΠ°Π΅ΡΠ΅ Ρ "ΡΠΈΡΡΡΠΌ" API Telegram, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π»Π΅Π³ΠΊΠΎ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ΄ΡΠΎ SDK.
node-telegram-bot-api)import TelegramBot from 'node-telegram-bot-api';
import * as anyads from '@anyads/sdk';
import * as dotenv from 'dotenv';
dotenv.config();
// --- ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ---
const ANYADS_API_KEY = process.env.ANYADS_API_KEY!;
const TELEGRAM_BOT_TOKEN = process.env.TELEGRAM_BOT_TOKEN!;
// --- ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ---
const bot = new TelegramBot(TELEGRAM_BOT_TOKEN, { polling: true });
const sdk = anyads.init({ apiKey: ANYADS_API_KEY });
// --- ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π²Π΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ (Π²ΡΡΡΠ½ΡΡ) ---
bot.onText(/^\/verify_anyads_/, async (msg) => {
const code = msg.text!;
const success = await sdk.processVerificationCode(code);
if (success) {
await bot.sendMessage(msg.chat.id, 'β
ΠΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ SDK AnyAds ΡΡΠΏΠ΅ΡΠ½ΠΎ ΠΏΡΠΎΠΉΠ΄Π΅Π½Π°!');
} else {
await bot.sendMessage(msg.chat.id, 'β ΠΡΠΎΠΈΠ·ΠΎΡΠ»Π° ΠΎΡΠΈΠ±ΠΊΠ° Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π²Π΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ.');
}
});
// --- ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΡΠ΅ΠΊΠ»Π°ΠΌΠ½ΡΡ
Π·Π°Π΄Π°Ρ ---
sdk.onBroadcastReceived(async (taskData) => {
console.log(`ΠΠΎΠ»ΡΡΠ΅Π½Π° Π½ΠΎΠ²Π°Ρ Π·Π°Π΄Π°ΡΠ° Π½Π° ΡΠ°ΡΡΡΠ»ΠΊΡ: ${taskData.task_id}`);
// ... Π²Π°ΡΠ° Π»ΠΎΠ³ΠΈΠΊΠ° ΡΠ°ΡΡΡΠ»ΠΊΠΈ ΡΠ΅ΡΠ΅Π· `bot.sendMessage(...)`
});
// --- ΠΠ°ΠΏΡΡΠΊ ---
async function startApp() {
await sdk.start();
console.log('ΠΠΎΡ ΠΈ AnyAds SDK Π·Π°ΠΏΡΡΠ΅Π½Ρ.');
}
startApp();
init(options)ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅Ρ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΠΉ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ SDK.
options.apiKey (string, ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠΉ): ΠΠ°Ρ API ΠΊΠ»ΡΡ.options.intervalSeconds (number, ΠΎΠΏΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎ): ΠΠ½ΡΠ΅ΡΠ²Π°Π» ΠΎΠΏΡΠΎΡΠ° Π² ΡΠ΅ΠΊΡΠ½Π΄Π°Ρ
. ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ: 300.options.sdkVersion (string, ΠΎΠΏΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎ): ΠΠ΅ΡΡΠΈΡ SDK. ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ: js-0.1.0.sdk.start()ΠΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅Ρ ΡΠ΅ΡΡΠΈΡ ΠΈ Π·Π°ΠΏΡΡΠΊΠ°Π΅Ρ ΡΠΎΠ½ΠΎΠ²ΡΠΉ ΠΎΠΏΡΠΎΡ ΡΠ΅ΡΠ²Π΅ΡΠ°.
sdk.stop()ΠΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΡΠΎΠ½ΠΎΠ²ΡΠΉ ΠΎΠΏΡΠΎΡ.
sdk.onBroadcastReceived(handler)Π Π΅Π³ΠΈΡΡΡΠΈΡΡΠ΅Ρ Π²Π°ΡΡ Π°ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ (handler), ΠΊΠΎΡΠΎΡΠ°Ρ Π±ΡΠ΄Π΅Ρ Π²ΡΠ·Π²Π°Π½Π° ΠΏΡΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠΈ ΡΠ΅ΠΊΠ»Π°ΠΌΠ½ΠΎΠΉ Π·Π°Π΄Π°ΡΠΈ.
handler ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΠΎΠ΄ΠΈΠ½ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ: taskData (ΠΎΠ±ΡΠ΅ΠΊΡ AdTask).sdk.processVerificationCode(code)ΠΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΠΈ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ Π½Π° ΡΠ΅ΡΠ²Π΅Ρ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π²Π΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ.
code (string): ΠΠΎΠ»Π½ΡΠΉ ΡΠ΅ΠΊΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, '/verify_anyads_...'.Promise<boolean>: true Π² ΡΠ»ΡΡΠ°Π΅ ΡΡΠΏΠ΅Ρ
Π°.AdTaskinterface AdTask {
task_id: string;
campaign_id: string;
creative: {
creative_id: string;
type: string;
content: {
text?: string;
files?: string[];
buttons?: { text: string; url: string; }[][];
parse_mode?: 'HTML' | 'MarkdownV2';
};
};
}