April 23

Как скрыть URL-адрес вебхука бота

Если у вас есть проект с поддержкой зеркал (с возможностью запуска экземпляра бота на собственном токене), утечка незащищенного webhook URL будет равна дыре в вашей безопасности. К счастью, Telegram даёт способ спрятать этот адрес — достаточно поднять локальный Telegram Bot API.

Почему публичный Bot API может слить URL вебхука

Обычно схема работы такова:

  1. Вы устанавливаете вебхук через метод setWebhook
  2. Telegram хранит этот адрес и отправляет на него запросы при каждом апдейте.
  3. Любой, кто имеет токен и немного знаний, может вызвать getWebhookInfo и узнать данный URL.

Локальный Telegram Bot API

Telegram открыто публикует исходники сервера Bot API. Фактически это тот же Bot API, только ваш личный. Он сидит между вашим сервером и телеграмом, транслируя каждый запрос напрямую на сервера Telegram через MTProto

Его легко поднять через докер: https://hub.docker.com/r/aiogram/telegram-bot-api

Что меняется, когда бот работает через локальное API

  • Вебхука в Telegram больше нет. При запросах к официальному Bot API («наружу») вы увидите, что getWebhookInfo возвращает пустой ответ.
  • Внешние операции с вебхуком невозможны. Через официальный Bot API вы не сможете ни убрать его, ни изменить.

Кроме того

При работе через локальный Bot API вы получаете еще несколько плюсов:

  1. Файлы без потолка. Скачать можно хоть 10 гигабайт за раз. Ограничений на размер загрузки нет. А отправлять можно до 2000 МБ одним запросом (публичный Bot API разрешает размер только до 50 МБ)
  2. Вебхуки без HTTPS, без белого IP и на любом порту. HTTP-URL, локальный IP-адрес, порт 7777? Пожалуйста. Публичный Bot API требует HTTPS-сертификат от доверенного CA и допускает только 443/80/88/8443. Локальный сервер снимает эти ограничения
  3. До 100 000 одновременных соединений к вебхуку. Полезно для шардированных ботов или когда у вас сотни зеркал за одним балансировщиком
  4. Моментальный путь к файлу. В ответе getFile сразу приходит абсолютный путь в файловой системе. Боту не нужно делать второй запрос, чтобы выкачать объект — просто открываете файл напрямую
  5. Меньше пинга и лимитов. Сервер находится в той же сети, что и ваш проект, поэтому задержки падают до единиц миллисекунд, а шанс попасть под глобальные рейт лимиты Telegram практически исчезает