Telegram-бот
Ez a tartalom még nem érhető el a jelenlegi nyelven.
Бот із двома командами: /horoscope leo повертає гороскоп знака на сьогодні, /moon поточну фазу Місяця. Він забирає повідомлення з Telegram сам (long polling), тож йому не потрібні вебхук, домен чи HTTPS: досить будь-якої машини з Node.js 22.
1. Бот і ключ
Section titled “1. Бот і ключ”- У Telegram напишіть @BotFather команду
/newbotі збережіть токен, який він видасть. - У дашборді створіть ключ Тільки сервер, як описано в розділі Ключ для автоматизації. Область ендпоінтів:
public/horoscope/*іpublic/moon-phase. Обидва ендпоінти кредитів не витрачають. - Задайте обидва значення як змінні середовища, а не в коді:
export TELEGRAM_BOT_TOKEN="123456:ABC..."export ASTROWAY_API_KEY="aw_live_..."2. Код
Section titled “2. Код”Збережіть як bot.mjs:
// Node 22 or newer, no dependencies.const TELEGRAM = `https://api.telegram.org/bot${process.env.TELEGRAM_BOT_TOKEN}`;const ASTROWAY = 'https://api.astroway.info/v1';const LANG = 'uk';const SIGNS = ['aries', 'taurus', 'gemini', 'cancer', 'leo', 'virgo', 'libra', 'scorpio', 'sagittarius', 'capricorn', 'aquarius', 'pisces'];
// A day's answer per path: 12 signs and one Moon are at most 13 calls a day.const cache = new Map();
async function astroway(path) { const key = `${new Date().toISOString().slice(0, 10)} ${path}`; if (cache.has(key)) return cache.get(key); const res = await fetch(`${ASTROWAY}${path}`, { headers: { 'X-Api-Key': process.env.ASTROWAY_API_KEY }, }); const json = await res.json(); if (!json.ok) throw new Error(`${json.error.code}: ${json.error.message}`); cache.set(key, json.data); return json.data;}
async function answer(text) { const [word, arg = ''] = text.trim().split(/\s+/); const command = word.split('@')[0]; // in a group the command arrives as /horoscope@YourBot if (command === '/horoscope') { const sign = arg.toLowerCase(); if (!SIGNS.includes(sign)) return `Send a sign: /horoscope leo\n${SIGNS.join(', ')}`; const data = await astroway(`/public/horoscope/daily?sign=${sign}&lang=${LANG}`); return `${data.date}, ${sign}\n\n${data.horoscope}`.slice(0, 4000); } if (command === '/moon') { const m = await astroway(`/public/moon-phase?lang=${LANG}`); return `${m.localized.phaseName}, ${m.illuminationPercent}%, Moon in ${m.localized.moonSign}\n` + `${m.localized.meaning}\nNext new moon: ${m.next.newMoon}`; } return 'Commands: /horoscope <sign>, /moon';}
async function telegram(method, body) { const res = await fetch(`${TELEGRAM}/${method}`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body), }); return res.json();}
let offset = 0;for (;;) { const updates = await telegram('getUpdates', { offset, timeout: 30 }); for (const update of updates.result ?? []) { offset = update.update_id + 1; const message = update.message; if (!message?.text) continue; let reply; try { reply = await answer(message.text); } catch (err) { reply = `AstroWay: ${err.message}`; } await telegram('sendMessage', { chat_id: message.chat.id, text: reply }); }}Запустіть node bot.mjs і напишіть ботові /moon. Відповідь має такий вигляд:
Спадний серп, 7.85%, Moon in ТерезиЗавершення циклу: відпочинок, очищення й підготовка до нового.Next new moon: 2026-11-09T07:02:07ZLANG перемикає мову тексту гороскопу й назв: uk, en та інші мови з переліку. Підписи на кшталт Moon in у коді англійською, змініть їх під себе.
Чому в коді кеш
Section titled “Чому в коді кеш”Гороскоп знака однаковий для всіх, хто питає того дня, і фаза Місяця теж. Кеш на добу означає не більше за 13 запитів до API на день, скільки б людей не писало ботові.
Це важливо на Free: ключ Free на /v1/public/* рахується в той самий ліміт, що й запит без ключа, 30 запитів на годину з IP-адреси вашого сервера. Без кешу бот, у якого кілька десятків користувачів, упреться в нього за годину. Ключ платного тарифу рахується за лімітом тарифу.
Що далі
Section titled “Що далі”- Натальна карта. Ендпоінти з розрахунком за моментом народження (
POST /v1/chartкоштує 20 кредитів) приймають ту саму пару дата-час-зона-координати, що описана в розділі Інтеграції без коду. Боту знадобиться діалог із кількох кроків або Mini App з формою. - Вебхук замість polling. Коли бот переїде на сервер з HTTPS,
setWebhookприбирає постійне з’єднання. Логікаanswer()не змінюється.