Бесплатная миграция IT-инфраструктуры в облако

Отличие Polling и Webhook в Telegram-ботах

Вадим Андоськин
Вадим Андоськин
Технический писатель
31 октября 2024 г.
106
8 минут чтения
Средний рейтинг статьи: 5

При разработке Telegram-ботов с помощью Node.js есть два основных способа получения сообщений от пользователей: Polling и Webhook. Оба метода служат для обработки входящих запросов, но имеют свои особенности, которые делают их подходящими для разных сценариев.

Что такое Polling?

Polling — это метод получения обновлений от сервера Telegram путем периодического опроса. Бот отправляет запрос на сервер через определенные интервалы времени для проверки наличия новых сообщений или событий.

Polling бывает двух видов: Long Polling и Short Polling.

Long 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

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?

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.

Для начала нужно создать новый проект.

Image2

Далее, создадим облачный сервер. В процессе создания, выберите вкладку «Маркетплейс» и выберите Node.js. При запуске сервера, на нем автоматически установится Node.js и создастся бесплатный домен.

Image6

Выбираете ближайший регион, где меньше всего пинг.

Image5

Конфигурацию выбирайте по своему усмотрению. Для проверки работы хватит минимальной конфигурации.

Image3

В «Сеть» обязательно должен быть установлен публичный IP, а дополнительные услуги настраивайте по своему усмотрению.

Image1

В «Авторизации» и Cloud-init ничего не меняйте. В информации о сервере введите его имя, описание, а также выберите проект, созданный ранее.

Image4

После указания всех настроек, нажмите кнопку «Заказать». Сервер запустится и появится бесплатный домен.

Так как API Telegram работает только с HTTPS, на бесплатный домен, который вам выдали, нужно установить SSL-сертификат. Для настройки веб-сервера и установки сертификата выполните эти команды последовательно:

  1. Обновляем скписки доступных пакетов:

sudo apt update
  1. Создаем и открываем файл конфигурации Nginx:

sudo nano /etc/nginx/sites-available/ваш_домен
  1. Внутрь этого файла помещаем следующее:

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;
    }
}

Вместо ваш_домен в этом файле и далее в консоли укажите свой домен.

  1. Создаём символическую ссылку к файлу:

sudo ln -s /etc/nginx/sites-available/ваш_домен /etc/nginx/sites-enabled/
  1. Перезапускаем Nginx:
sudo systemctl restart nginx
  1. Установите certbot. Его будем использовать для создания SSL-сертификатов:

sudo apt install certbot python3-certbot-nginx
  1. Используйте certbot для настройки SSL-сертификата:

sudo certbot --nginx -d ваш_домен

Примеры использования Polling и Webhook

Перед выбором метода получения сообщений важно учитывать особенности каждого подхода и его применимость в различных ситуациях.

Polling:

  • Локальная разработка: Когда вы разрабатываете и тестируете бота на локальной машине, использование Long Polling позволяет легко получать обновления без необходимости настройки сервера.
  • Небольшие проекты: Если вы создаете бота для небольшой группы пользователей или для личного использования, и у вас нет сложных требований к времени отклика, Polling будет вполне достаточным.
  • Проекты с небольшими нагрузками: Если ваш бот не ожидает большого количества сообщений, использование Short Polling может быть уместным, так как он обеспечивает простоту в реализации.

Webhook:

  • Производственные приложения: Для ботов, работающих в производственной среде, где важна мгновенная реакция на события, Webhook является предпочтительным выбором. Например, боты, которые обрабатывают платежи или отвечают на запросы пользователей в реальном времени, должны использовать Webhook для обеспечения высокой производительности.
  • Высоконагруженные системы: Если вы разрабатываете бота, который будет обслуживать большое количество пользователей, Webhook будет более эффективным, так как он уменьшает нагрузку на сервер за счет отсутствия постоянных запросов.
  • Системы с долгими операциями: Если ваш бот выполняет долгие операции (например, генерация отчетов или обработка данных), Webhook может быть использован для уведомления пользователей о завершении этих операций.

Сравнение Polling и Webhook

Чтобы лучше понять, как эти два подхода отличаются друг от друга, ниже приведена сравнительная таблица их характеристик.

Характеристика

Polling

Webhook

Способ получения данных

Периодический запрос к серверу Telegram

Автоматическая отправка обновлений на указанный URL

Настройка

Простая настройка, не требует дополнительных ресурсов

Требует настройки HTTPS-сервера и SSL-сертификата

Скорость реакции

Может быть небольшой задержкой из-за частоты опроса

Практически мгновенное получение сообщений

Использование ресурсов

Постоянно запрашивает обновления, загружая сервер

Экономнее по ресурсам, так как обновления приходят автоматически

Требования к инфраструктуре

Не требует публичного сервера

Требует публичного HTTPS-сервера

Надежность работы

Не зависит от доступности внешнего сервера

Может быть недоступен при проблемах с HTTPS-сервером

Проблемы с настройкой в локальной среде

Может быть использован локально для тестирования

Сложен в использовании без публичного доступа

Подготовили для вас выгодные тарифы на облачные серверы

Заключение

Выбор между Polling и Webhook зависит от конкретных требований вашего проекта. Polling является простым и быстрым способом для разработки, особенно на начальных этапах, в то время как Webhook обеспечивает более эффективную обработку сообщений в производственных условиях.

Хотите внести свой вклад?
Участвуйте в нашей контент-программе за
вознаграждение или запросите нужную вам инструкцию
img-server
31 октября 2024 г.
106
8 минут чтения
Средний рейтинг статьи: 5
Пока нет комментариев