Настройка Webhook для Telegram-Бота на Aiogram3
Разберем Webhook на Aiogram 3
Webhook
Давайте для начала разберем что это и для чего. Webhook
- это способ отслеживания изменений на стороне Сервера-информатора через протокол HTTP. То есть сервер на котором произошли изменения отправляет на наш HTTP эти самые изменения, которые мы в последствии можем обрабатывать. Из этого вытекает главный плюс такого подхода в сравнении с Polling
, вместо того что бы с какой то переодичностью отправлять запросы на сервер заправшивая у него информацию о возможных изменениях, мы просто слушаем и получаем эти самые изменения от сервера-источника.

Такой подход позволяет:
- Оперативнее обрабатывать данные.
- Дает меньшую нагрузку на наш сервер.
Минусы данного подхода:
- Сложнее настраивать.
- Необходим url-домен.
- Установка SSL.
acme
Отладка
Ngrok
В первую очередь, для отладки работы рекомендую Ngrok, довольно простой и в тоже время удобный сервис. Позволяющий переадресовывать запросы из интернета к сайту поднятому локально на компьютере. А также просматривать в UI запросы, которые были на него получены. Как следует из руководства на сайте для установки и запуска на MacOs необходимо:
- Установить Ngrok
|
- Добавить ваш персональный токен
|
- Запуститься на любом свободном порту
|
Замените:
YOUR_TOKEN
- на ваш токен ngrok
PORT
- на свободный порт
В результате запуска последнего скрипта вы увидете следующее:

Session Status - online
- значит все работает и можете перейти и проверить web-страницы.
Aiogram и Aiohttp echo-Bot
Настройка
Здесь мы используем связку Aiogram и Aiohttp, которые отлично взамодействуют.
Опять же воспользуемся примерами использования Телеграм-Бота на Webhook с официального сайта Aiogram. И немного его изменим:
|
Переменные:
TOKEN
- токен от БотаWEB_SERVER_HOST
-0.0.0.0.
, то есть будем слушать все IP адресаWEBHOOK_PATH
- Путь по которому будут приходитьPOST
уведомление от Телеграм и соответственно который мы будем слушать.WEB_SERVER_PORT
- Телеграм позволяем производить общение только с80, 88, 443, 8443
портом. Если у вас 443, то можно не указывать.
Рассмотрим скрипт и дополним официальное описание:
on_startup
- Данный метод меняет настройку Телеграм Бота и переключает его на webhook. Где сообщает, на каком URL с каким портом и по какому пути мы будем ожидать от телеграмма сообщения.async def main()
- сделали методmain
асинхронным. Соответсвенно поменяли запуск этого метода наasyncio.run(main())
app = web.Application()
- создает приложение с пустой web-страницей для приема webhookweb._run_app
- тк мы сделалиmain
асинхронным, то здесь указалиawait
и поменялиrun_app
на_run_app
Переменные при использовании своего домена:
WEBHOOK_SSL_PRIV
- Если у вас имеется домен и вы получали SSL например через Let’s Encrypt. Путь до приватного ключа.WEBHOOK_SSL_CERT
- Если у вас имеется домен и вы получали SSL например через Let’s Encrypt. Путь до публичного ключа.context
- передаем подписанные сертификатыssl_context=context
- подписываем поднятую пустую web-страницу нашими сертификатами, для получения SSL/TLS
Запуск
Для запуска необходимо просто в любом IDE запустить скрипт выше, указав в нем свои переменные. После запска можно отправить в вашего Бота сообщение и увидеть, какой webhook мы получили от Телеграм-сервера, перейдя на локальную страницу поднятую в ngrok.

На мой взгляд это отличный способ для отладки и понимания какие данные к нам придут в webhook. Мы смогли запустить Эхо-Бота на Ngrok.
Для просмотра статуса и настройки вашего webhook у Бота в Телеграм существует следующая ссылка:
https://api.telegram.org/bot<TOKEN_BOT>/getWebhookInfo
- Необходимо заменить <TOKEN_BOT>
, на токен вашего Бота. По ссылке вы увидите информацию, о статусе включения webhook, по какому URL будет отправляться информация, из-за чего ошибка и тд.
Дополнительная информация
Обработка сторонних webhook
Предположим вы решили написать более серьезного Бота и вам необходимо обрабатывать сторонние webhook. Например для обработки оплаты или какие либо другие.
То тут ничего сложного, например сделаем простой метод, который будет показывать нам то, что пришло в сторонний webhook и отвечать статусом 200, что бы не было повторных отправлений этого webhook.
|
А теперь там, где мы создавали app
- web приложение, мы добавим следующую строчку:
|
Так наше приложение начало слушать https://your_domain.example/your_webhook_path
и если туда поступает информация, то срабатывает метод print_webhook
в котором вы можете настроить абсолютно любую логику обработки.
Если у вас несколько разных источников, то просто добавляете новый путь, который будете слушать:
|
Полезности
Передача дополнительных параметров в app
Если ваша логика обработки webhook предполагает например ответ пользователю или запись в БД.
То вы можете просто передать необходимые параметры в app
, а затем их извлечь.
|
Теперь мы просто их извлекаем из web приложения:
|
В данном примере мы извлекли из app
- Бота и сессию к БД. После чего с помощью метода write_webhook
(метод указан просто для примера, скрипт метода будет отличаться в зависимости от строения вашей БД и задачи) записали полученный webhook в БД. После чего отправили сообщение на tg_user_id
в котором также полностью передали всю полученную информацию.
Ссылки и команды
Оставлю ссылки которые использовались при подготовке данной статьи:
- https://t.me/S2Vel_bot - Пример моего бота на webhook с сервисом VPN.
- https://core.telegram.org/bots/webhooks#a-verified-supported-certificate - хорошее руководство по webhook от Телеграм
- https://docs.aiogram.dev/en/dev-3.x/dispatcher/webhook.html - руководство по webhook от Aiogram
https://api.telegram.org/bot<TOKEN_BOT>/getWebhookInfo
- как уже писал ранее, меняем<TOKEN_BOT>
на токен вашего Бота и получаем статус подключения Бота к Webhook.
Команды:
-
curl -F "url=" https://api.telegram.org/bot<TOKEN_BOT>/setWebhook
- сброс настроек webHook. Меняем<TOKEN_BOT>
на токен вашего Бота. Необходимо использовать если вы допустим использовали один домен на 2 разных ботах. -
curl -F "url=https://example_hook.example.com:PORT/webHook_Path" https://api.telegram.org/bot<TOKEN_BOT>/setWebhook
- По сути эту команду мы отправляем в методеon_startup
. Но хочу подсветить момент, если вы при разработке меняете Ботов, домены и тд. то бывают баги когда вроде бы все настроено, но почему то не работает. Мне помогла отправка данной команды после старта Бота, когда я получал ошибкуconnection_refused
. В последствии при рестартах бота данного бага не наблюдалось. Но если менял Бота, то баг повторялся.
Безопасность
Для обеспечения безопасности работы вашего приложения, крайне рекомендуется ограничить IP адреса от которых принимается webhook. Обычно сервисы которые отправляют информацию, указывают IP-адреса которые они используют.
- Для ограничения IP вы можете в скрипте проверять откуда вам поступил webhook
Пример:
|
- Ограничить через брендмауэр
ufw
доступ к порту на котором мы поднимали приложениеapp
, например8443
на уровне вашего VPS
|
Из этих двух вариантов, на мой взгляд предпочтительнее второй, тк вы открываете порт только для определенного набора IP. Плюс исключаете возможную подмену IP адреса из заголовка и если вдруг тот же Телеграм поменяет IP адреса, вам достаточно будет добавить новое правило в ufw
, а не заного перевыкатывать скрипт.