При разработке Telegram-ботов с помощью Node.js есть два основных способа получения сообщений от пользователей: Polling и Webhook. Оба метода служат для обработки входящих запросов, но имеют свои особенности, которые делают их подходящими для разных сценариев.
Polling — это метод получения обновлений от сервера Telegram путем периодического опроса. Бот отправляет запрос на сервер через определенные интервалы времени для проверки наличия новых сообщений или событий.
Polling бывает двух видов: Long Polling и Short Polling.
Long Polling — это подход, при котором бот отправляет запрос к серверу и ждет ответа. Если новых сообщений нет, сервер будет удерживать запрос открытым до тех пор, пока не появится новое сообщение или не истечет таймаут. После получения ответа, бот сразу отправляет новый запрос.
В данном примере бот настроен на опрос сервера Telegram с интервалом в 3 секунды. Таймаут составляет 10 секунд, что позволяет поддерживать открытое соединение в течение этого времени, прежде чем отправить новый запрос.
const TelegramBot = require('node-telegram-bot-api');
const token = 'TOKEN';
// Создаем экземпляр бота с включенным Long Polling
const bot = new TelegramBot(token, {
polling: {
interval: 3000, // Интервал между запросами (3 секунды)
autoStart: true, // Автоматический старт polling
params: {
timeout: 10 // Тайм-аут запроса (10 секунд)
}
}
});
bot.on('message', (msg) => {
const chatId = msg.chat.id;
const text = msg.text;
// Ответ на полученное сообщение
bot.sendMessage(chatId, `Вы написали: ${text}`);
});
bot.onText(/\/start/, (msg) => {
const chatId = msg.chat.id;
bot.sendMessage(chatId, 'Привет! Я бот, использующий Long Polling.');
});
Short Polling — это подход, при котором бот отправляет запросы на сервер с короткими интервалами, независимо от наличия новых сообщений. Это менее эффективно, так как создается больше сетевых запросов и требует больше ресурсов.
Здесь бот постоянно запрашивает обновления от сервера, не удерживая соединение открытым на длительное время. Это может привести к большим затратам на сетевые ресурсы, особенно при высоком трафике.
const TelegramBot = require('node-telegram-bot-api');
const token = 'TOKEN';
// Создаем экземпляр бота с включенным Short Polling
const bot = new TelegramBot(token, { polling: true });
bot.on('message', (msg) => {
const chatId = msg.chat.id;
const text = msg.text;
bot.sendMessage(chatId, `Вы написали: ${text}`);
});
bot.onText(/\/start/, (msg) => {
const chatId = msg.chat.id;
bot.sendMessage(chatId, 'Привет! Я бот, использующий Short Polling.');
});
Webhook — это метод, позволяющий боту получать обновления автоматически. Вместо периодического опроса сервера, бот указывает серверу Telegram URL, на который будут отправляться POST-запросы при появлении новых обновлений. Это позволяет более эффективно использовать ресурсы и минимизировать задержки.
В этом примере бот принимает запросы от Telegram через Webhook, что позволяет избежать частого опроса сервера. Это снижает нагрузку на сервер и обеспечивает мгновенную обработку новых сообщений.
const TelegramBot = require('node-telegram-bot-api');
const express = require('express');
const token = 'TOKEN';
// URL вашего сервера
const url = 'https://your-server.com';
const port = 3000;
// Создаем экземпляр бота без автоматического polling
const bot = new TelegramBot(token, { webHook: true });
// Устанавливаем Webhook на URL вашего сервера
bot.setWebHook(`${url}/bot${token}`);
// Настраиваем Express сервер
const app = express();
app.use(bodyParser.json());
// Обработчик запросов от Telegram
app.post(`/bot${token}`, (req, res) => {
bot.processUpdate(req.body);
res.sendStatus(200);
});
bot.on('message', (msg) => {
const chatId = msg.chat.id;
bot.sendMessage(chatId, `Вы написали: ${msg.text}`);
});
// Запускаем сервер
app.listen(port, () => {
console.log(`Сервер запущен на порту ${port}`);
});
Для работы кода и запуска бота необходимо установить библиотеки с помощью команд:
npm install node-telegram-bot-api # Для работы с API Telegram
npm install express # Для обработки HTTP-запросов
cloud
Чтобы работать с Webhook, нужно настроить сервер. Мы будем использовать Timeweb Cloud.
Для начала нужно создать новый проект.
Далее, создадим облачный сервер. В процессе создания, выберите вкладку «Маркетплейс» и выберите Node.js. При запуске сервера, на нем автоматически установится Node.js и создастся бесплатный домен.
Выбираете ближайший регион, где меньше всего пинг.
Конфигурацию выбирайте по своему усмотрению. Для проверки работы хватит минимальной конфигурации.
В «Сеть» обязательно должен быть установлен публичный IP, а дополнительные услуги настраивайте по своему усмотрению.
В «Авторизации» и Cloud-init ничего не меняйте. В информации о сервере введите его имя, описание, а также выберите проект, созданный ранее.
После указания всех настроек, нажмите кнопку «Заказать». Сервер запустится и появится бесплатный домен.
Так как API Telegram работает только с HTTPS, на бесплатный домен, который вам выдали, нужно установить SSL-сертификат. Для настройки веб-сервера и установки сертификата выполните эти команды последовательно:
Обновляем скписки доступных пакетов:
sudo apt update
Создаем и открываем файл конфигурации Nginx:
sudo nano /etc/nginx/sites-available/ваш_домен
Внутрь этого файла помещаем следующее:
server {
listen 80;
server_name ваш_домен;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
Вместо ваш_домен
в этом файле и далее в консоли укажите свой домен.
Создаём символическую ссылку к файлу:
sudo ln -s /etc/nginx/sites-available/ваш_домен /etc/nginx/sites-enabled/
sudo systemctl restart nginx
Установите certbot
. Его будем использовать для создания SSL-сертификатов:
sudo apt install certbot python3-certbot-nginx
Используйте certbot
для настройки SSL-сертификата:
sudo certbot --nginx -d ваш_домен
Перед выбором метода получения сообщений важно учитывать особенности каждого подхода и его применимость в различных ситуациях.
Polling:
Webhook:
Чтобы лучше понять, как эти два подхода отличаются друг от друга, ниже приведена сравнительная таблица их характеристик.
Характеристика |
Polling |
Webhook |
Способ получения данных |
Периодический запрос к серверу Telegram |
Автоматическая отправка обновлений на указанный URL |
Настройка |
Простая настройка, не требует дополнительных ресурсов |
Требует настройки HTTPS-сервера и SSL-сертификата |
Скорость реакции |
Может быть небольшой задержкой из-за частоты опроса |
Практически мгновенное получение сообщений |
Использование ресурсов |
Постоянно запрашивает обновления, загружая сервер |
Экономнее по ресурсам, так как обновления приходят автоматически |
Требования к инфраструктуре |
Не требует публичного сервера |
Требует публичного HTTPS-сервера |
Надежность работы |
Не зависит от доступности внешнего сервера |
Может быть недоступен при проблемах с HTTPS-сервером |
Проблемы с настройкой в локальной среде |
Может быть использован локально для тестирования |
Сложен в использовании без публичного доступа |
Подготовили для вас выгодные тарифы на облачные серверы
Выбор между Polling и Webhook зависит от конкретных требований вашего проекта. Polling является простым и быстрым способом для разработки, особенно на начальных этапах, в то время как Webhook обеспечивает более эффективную обработку сообщений в производственных условиях.