Як швидко створити serverless Telegram-бота: покроковий гайд
Привіт, я Олексій Павленко, Engineering Manager в компанії iDeals. Хочу поділитися важливою за поточної ситуації інструкцією. Створення Telegram-ботів для розсилки або інформування стає дедалі більш популярним напрямом. Пропоную розглянути, як швидко створити свого бота і зробити його доступним для всіх. Стек — NodeJs + AWS + Telegraf.
По-перше, бот буде написанний за допомогою serverless-фреймворка. Для інтеграції з AWS нам необхідні ключі. Якщо ви не маєте юзера, заходимо на AWS IAM:
1. Додати юзера

2. Додати ім’я і вибираємо тільки «Access key» у «AWS access type»

3. Вибрати «Attach existing policies directly» з «AdministratorAccess»

Наступні кроки — тиснемо «далі».
І на виході ми отримуємо юзера, а також «Access key» і «Secret key». Вони допоможуть сконфігурувати локальну машину для інтеграції. Важливо: збережіть ці дані, адже повторно «Secret key» показаний не буде.

Добре, тепер ми закінчили підготовчу роботу щодо інтеграції з AWS. Переходимо до створення API ключа для Telegram. Такий ключ необхідно отримати у так званого Telegram бота — BotFather. Вбиваємо у пошуку BotFather, запускаємо і слідуємо інструкціям. Детальніше про можливості ботів і їхнє створення можна прочитати тут.

В кінці отримаємо token, який буде необхідний для інтеграції та деплою.

Перед тим як перейти до безпосереднього написання бота, встановимо залежності та інтеграції з AWS на стороні локальної машини.
Встановлюємо пакет serverless та записуємо ключі.
npm install -g serverless
serverless config credentials —provider provider —key key —secret secret
Створюємо проект з NodeJS та встановлюєм Telegraf — бот API фреймворк для NodeJS.
serverless create —template aws-nodejs
Це створить дуже простий шаблон для майбутніх функцій Node.js . Основне в цьому шаблоні — це файли: handler.js та serverless.yml. handler.js — наш код, а serverless.yml — файл конфігурації сервера, в якому можна оголосити тригер сервера та інші параметри.
npm i telegraf —save
Замінюємо контент файла serverless.yml
service: new-bot provider: name: aws runtime: nodejs12.x region: us-east-1 functions: start: handler: handler.start events: - http: path: webhook method: post cors: true
І код самого бота. Файл handler.js
const { Telegraf } = require('telegraf')
// Telegram API token який ми отримали
const token = "51xx2xxxAESFGXa_m1sfjjxxx2-bL7xxefwGPY"
// створення бота
const bot = new Telegraf(token);
// початок діалогу з ботом
bot.start((ctx) =>
ctx.reply("Российский военный корабль иди на х*й")
);
// запуск бота
module.exports = {
bot,
};
// вебхук це і є той самий вебхук, який буде відповідати за роботу нашого бота
module.exports.start = async (event) => {
try {
let body = event.body[0] === "{"
? JSON.parse(event.body)
: JSON.parse(Buffer.from(event.body, "base64"));
await bot.handleUpdate(body);
return { statusCode: 200, body: "" };
} catch (err) {
// error handler
}
};
// прив'язка вебхуку до робота
module.exports.setWebhook = async (event) => {
try {
//отримання url методу, коли він буде опублікований
const url = `https://${event.headers.Host}/${event.requestContext.stage}/webhook`;
// виклика методf API телеграм-бота
await bot.telegram.setWebhook(url);
return {
statusCode: 200,
headers: {"Access-Control-Allow-Origin": "*"},
body: JSON.stringify({ url }),
};
} catch (err) {
}
};
Наступний крок — це деплой бота.
serverless deploy
Якщо все пройде успішно, приходит наступний респонс, де важливим є POST URL, який знадобиться на останньому кроці.

Для того, щоб вебхук вступив в дію, виконайте наступну команду.
curl --request POST --url https://api.telegram.org/bot<Telegram API token>/setWebhook?url=https://<отриманний POST URL>/dev/webhook --header 'content-type: application/json'
Вийде щось схоже:
curl --request POST --url https://api.telegram.org/bot123345678:KDFSFGXa_m1sfjgfdf_tttt-bL7vsB5TCefwGPY/setWebhook?url=https://asdfg12345.execute-api.us-east-1.amazonaws.com/dev/webhook --header 'content-type: application/json'
Теперь базовий бот готовий. Наповнюйте функціональністю і користуйся з розумом 🇺🇦
Сподобалась стаття? Підписуйтесь на автора, щоб отримувати сповіщення про нові публікації на пошту.

10 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів