April 23
Как скрыть URL-адрес вебхука бота
Если у вас есть проект с поддержкой зеркал (с возможностью запуска экземпляра бота на собственном токене), утечка незащищенного webhook URL будет равна дыре в вашей безопасности. К счастью, Telegram даёт способ спрятать этот адрес — достаточно поднять локальный Telegram Bot API.
Почему публичный Bot API может слить URL вебхука
- Вы устанавливаете вебхук через метод
setWebhook - Telegram хранит этот адрес и отправляет на него запросы при каждом апдейте.
- Любой, кто имеет токен и немного знаний, может вызвать
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 вы получаете еще несколько плюсов:
- Файлы без потолка. Скачать можно хоть 10 гигабайт за раз. Ограничений на размер загрузки нет. А отправлять можно до 2000 МБ одним запросом (публичный Bot API разрешает размер только до 50 МБ)
- Вебхуки без HTTPS, без белого IP и на любом порту. HTTP-URL, локальный IP-адрес, порт 7777? Пожалуйста. Публичный Bot API требует HTTPS-сертификат от доверенного CA и допускает только 443/80/88/8443. Локальный сервер снимает эти ограничения
- До 100 000 одновременных соединений к вебхуку. Полезно для шардированных ботов или когда у вас сотни зеркал за одним балансировщиком
- Моментальный путь к файлу. В ответе
getFileсразу приходит абсолютный путь в файловой системе. Боту не нужно делать второй запрос, чтобы выкачать объект — просто открываете файл напрямую - Меньше пинга и лимитов. Сервер находится в той же сети, что и ваш проект, поэтому задержки падают до единиц миллисекунд, а шанс попасть под глобальные рейт лимиты Telegram практически исчезает