Telegram Bot API предлагает два способа получать обновления: polling через getUpdates и webhook через setWebhook. Polling — ваш бот сам регулярно спрашивает Telegram «есть что-то новое?». Webhook — Telegram сам стучится на ваш сервер, когда приходит…
400 000+ органических переходов за 3 месяца. Со-основатель GoBanana (231K пользователей, 12+ млн ₽ без рекламы) и NeuroScribe (65K пользователей). SEO/GEO-стратегии для AI-поисковиков, 1 700+ единиц контента, 17+ реализованных стратегий.
Об авторе →Claude Code: новый CLI-агент от Anthropic
Anthropic выпустила Claude Code — терминальный AI-агент для разработчиков. Инструмент работает прямо в командной строке и умеет писать, редактировать и запускать код.
Zcode AI: Полный гид по визуальному интерфейсу для Claude Code и AI-агентов
Узнайте, как использовать Zcode для управления Claude Code, Gemini и Codex в едином GUI. Настройка провайдеров, MCP-серверов и визуальный вайбкодинг.
YouTube-канал с монетизацией из любой точки мира: Пошаговый гайд 2026
Инструкция по созданию YouTube-канала: обход блокировок SMS, настройка расширенных функций через виртуальные номера и правила безопасности для монетизации.
Windsurf Code Maps: Как глубоко понимать архитектуру проекта перед написанием кода
Полный гайд по Windsurf Code Maps, модели Sway 1.5 и Sway Grep. Узнайте, как визуализировать архитектуру кода и ускорить разработку в 13 раз.
Vk Fast Cash Strategy
Аудитория ВКонтакте — это те же люди, что и в Instagram, но 'социальный контракт' площадки другой. Если Instagram — это 'дорогой ресторан' с демонстрацией успеха, то VK — это 'душевная шашлычная'. Здесь не работает глянцевый 'успешный успех
Обновлено: июнь 2026
Telegram Bot API предлагает два способа получать обновления: polling через getUpdates и webhook через setWebhook. Polling — ваш бот сам регулярно спрашивает Telegram «есть что-то новое?». Webhook — Telegram сам стучится на ваш сервер, когда приходит событие. Для тестового бота хватит первого. Для продакшена, который держит тысячи пользователей, нужен второй.
В этой статье разберём, как работает каждый метод, чем они отличаются на практике, как настроить setWebhookна Railway и какие порты поддерживает Telegram API. В конце — готовый код на Python.
TL;DR. getUpdates (polling) прост в настройке и работает без сервера, но нагружает Telegram API бесполезными запросами. Webhook мгновенно доставляет обновления и не тратит ресурсы впустую, но требует публичного HTTPS-адреса. Для MVP и локальной разработки — polling. Для продакшена — webhook.getUpdates — это HTTP-метод Telegram Bot API, который возвращает массив новых обновлений. Бот вызывает его в цикле: получил обновления, обработал, запросил снова.

Базовый запрос выглядит так: https://api.telegram.org/bot<TOKEN>/getUpdates. Telegram отдаёт JSON с массивом result, где лежат сообщения, команды, нажатия кнопок — всё, что произошло с момента последнего запроса. Если ничего нет, массив просто пуст.
Простой polling звонит на сервер каждую секунду. Это дорого: тысяча пустых запросов ради нескольких реальных событий. Поэтому придумали Long Polling — соединение удерживается открытым до 30–60 секунд, пока не придут обновления или не истечет timeout. Количество запросов падает в разы.
Timeout — сколько секунд ваш клиент ждёт ответа от Telegram перед тем, как разорвать соединение. Если за это время сервер не ответил — бот шлёт новый запрос. Рекомендуется 5–10 секунд: при сетевом сбое бот восстановится быстро.
Long Polling Timeout — сколько секунд Telegram удерживает соединение на своей стороне в ожидании обновлений. Если за это время написал хоть один пользователь — ответ придёт мгновенно, не дожидаясь окончания таймаута. Рекомендуемое значение: 30–60 секунд. Это Telegram-side параметр, и он снижает число запросов к серверу.
Разница между ними простая: timeout — ваш ограничитель, Long Polling Timeout — ограничитель на стороне Telegram.

В aiogram 3 и pyTelegramBotAPI простой getUpdates официально устарел начиная с версии 4.11. Вместо него рекомендуют infinity_polling — тот же polling, обёрнутый в бесконечный цикл с обработкой ошибок. Если Telegram вернул ошибку, бот засыпает на секунду и снова начинает опрос, вместо того чтобы упасть.
Раньше разработчики писали этот цикл вручную. Сейчас библиотека делает это за вас.
Webhook — это обратная схема: вы указываете Telegram URL вашего сервера, и он сам отправляет POST-запрос с обновлением каждый раз, когда что-то происходит.
Никаких циклических запросов. Пришло сообщение от пользователя — Telegram ударил по вашему эндпоинту, передал JSON, получил 200 OK в ответ. Если сервер вернул ошибку, Telegram поставит задачу в очередь и повторит попытку через некоторое время.

Для установки webhook используется метод setWebhook:
https://api.telegram.org/bot<TOKEN>/setWebhook?url=https://yourdomain.com/webhookПроверить статус — через getWebhookInfo:
https://api.telegram.org/bot<TOKEN>/getWebhookInfoУдалить webhook и вернуться к polling — через deleteWebhook.
Это частый камень преткновения. Telegram принимает входящие соединения только на определённые порты: 443, 80, 88 и 8443. Другие порты не работают — Telegram просто не сможет достучаться до вашего сервера.
На Railway по умолчанию приложение получает переменную PORT и слушает её. Чтобы webhook заработал, нужно убедиться, что Railway проксирует трафик именно через один из поддерживаемых портов. Обычно это 443 — Railway добавляет HTTPS автоматически через свой домен.
Telegram принимает webhook только по HTTPS. Без валидного SSL-сертификата setWebhook вернёт ошибку. Railway предоставляет домен вида yourapp.railway.app с автоматическим SSL — это решает проблему сразу.
На локальной машине SSL нет, поэтому для теста используют туннели: ngrok или tuna. Они дают временный публичный HTTPS-адрес. У tuna этот адрес живёт 30 минут — после перезапуска нужно заново вызывать setWebhook с новым URL.
Polling хорош для разработки, webhook — для продакшена. Выбор зависит не от предпочтений, а от требований к задержке и масштабу.

| Параметр | getUpdates (Polling) | Webhook |
|---|---|---|
| Настройка | Минимальная, работает из коробки | Нужен публичный HTTPS-сервер |
| Задержка | 0.5–2 сек (зависит от polling interval) | Почти мгновенно |
| Нагрузка на сервер | Постоянная (пустые запросы) | Только при реальных событиях |
| Локальная работа | Да, без дополнительных инструментов | Нужен ngrok/tuna |
| Масштаб | До ~1 000 пользователей комфортно | Неограниченно |
| HTTPS | Не нужен | Обязателен |
| Порты | Любые | Только 443, 80, 88, 8443 |
| Для продакшена | Не рекомендуется | Да |
Ключевой момент, который часто упускают: нельзя запускать polling и webhook одновременно. Если на боте установлен активный webhook, getUpdates не будет возвращать новые обновления — Telegram уже отправляет их на указанный URL. Типичная ошибка: разработчик забыл удалить старый webhook, запускает polling, бот молчит.
Перед запуском polling всегда проверяйте getWebhookInfo и удаляйте webhook, если он установлен:
await bot.delete_webhook(drop_pending_updates=True)Railway автоматически предоставляет HTTPS-домен и переменную окружения PORT. Этого достаточно для полноценного webhook без дополнительных настроек SSL.

Создайте файл bot.py с обработчиком webhook. Aiogram 3 поднимает локальный aiohttp-сервер и сам регистрирует POST-роут по нужному пути:
import asyncio
import logging
from os import getenv
from aiogram import Bot, Dispatcher
from aiogram.types import Message
from aiogram.filters import CommandStart
from aiogram.webhook.aiohttp_server import SimpleRequestHandler, setup_application
from aiohttp import web
TOKEN = getenv("BOT_TOKEN")
WEBHOOK_HOST = getenv("WEBHOOK_HOST") # https://yourapp.railway.app
WEBHOOK_PATH = f"/webhook/{TOKEN}"
WEBHOOK_URL = f"{WEBHOOK_HOST}{WEBHOOK_PATH}"
PORT = int(getenv("PORT", 8000))
bot = Bot(token=TOKEN)
dp = Dispatcher()
@dp.message(CommandStart())
async def start(message: Message):
await message.answer("Привет! Бот работает в режиме webhook.")
async def on_startup(bot: Bot):
await bot.set_webhook(
url=WEBHOOK_URL,
secret_token="your_secret_token" # защита эндпоинта
)
logging.info(f"Webhook установлен: {WEBHOOK_URL}")
async def on_shutdown(bot: Bot):
await bot.delete_webhook()
def main():
logging.basicConfig(level=logging.INFO)
app = web.Application()
webhook_requests_handler = SimpleRequestHandler(
dispatcher=dp,
bot=bot,
secret_token="your_secret_token"
)
webhook_requests_handler.register(app, path=WEBHOOK_PATH)
setup_application(app, dp, bot=bot)
dp.startup.register(on_startup)
dp.shutdown.register(on_shutdown)
web.run_app(app, host="0.0.0.0", port=PORT)
if __name__ == "__main__":
main()В настройках Railway добавьте переменные:
BOT_TOKEN — токен от BotFatherWEBHOOK_HOST — публичный URL вашего Railway-приложения (например, https://mybot.railway.app)Переменную PORT Railway выставляет сама. Её не нужно задавать вручную.
Для Railway достаточно Procfile:
web: python bot.pyИли в railway.toml:
[deploy]
startCommand = "python bot.py"После деплоя проверьте, что webhook установлен корректно:
https://api.telegram.org/bot<TOKEN>/getWebhookInfoВ ответе должно быть:
url — ваш HTTPS-эндпоинтhas_custom_certificate: falsepending_update_count: 0 — если очередь чистаяЕсли last_error_message не пуст — там будет причина проблемы. Чаще всего: неверный порт, недоступный URL или ошибка SSL.
Для локальной разработки polling проще — не нужен ни HTTPS, ни публичный сервер. Запустил, поехал.
import asyncio
import logging
from os import getenv
from aiogram import Bot, Dispatcher
from aiogram.types import Message
from aiogram.filters import CommandStart
TOKEN = getenv("BOT_TOKEN")
bot = Bot(token=TOKEN)
dp = Dispatcher()
@dp.message(CommandStart())
async def start(message: Message):
await message.answer("Привет! Бот работает в режиме polling.")
async def main():
logging.basicConfig(level=logging.INFO)
# Удаляем webhook, если он был установлен ранее
await bot.delete_webhook(drop_pending_updates=True)
# Запускаем long polling
await dp.start_polling(bot, polling_timeout=30)
if __name__ == "__main__":
asyncio.run(main())Параметр polling_timeout=30 — это Long Polling Timeout. Telegram будет удерживать соединение до 30 секунд в ожидании обновлений. Это снижает количество запросов.
Обратите внимание на drop_pending_updates=True в delete_webhook. Это полезно при перезапуске: старые обновления, накопившиеся в очереди, не будут обрабатываться заново.
Большинство проблем с потерей апдейтов — из-за конфликта polling и webhook или неверно настроенного URL.

Бот запущен в polling, но апдейты не приходят. Скорее всего, на боте установлен webhook. Проверьте через getWebhookInfo и удалите через deleteWebhook или delete_webhook() в aiogram.
Webhook установлен, но Telegram не стучится. Проверьте порт — только 443, 80, 88, 8443. Проверьте, что URL доступен извне. Проверьте SSL — самоподписанный сертификат не подойдёт без дополнительных параметров.
После ошибки 500 апдейты перестали приходить. Telegram ставит задачу в очередь при ошибке и повторяет через нарастающие интервалы — сначала быстро, потом всё медленнее. Исправьте ошибку, перезапустите сервер и подождите. Апдейты придут.
Туннель перезапустился, webhook сломался. При использовании ngrok или tuna публичный адрес меняется при каждом перезапуске. Нужно вызвать setWebhook с новым URL и обновить переменную WEBHOOK_HOST в .env.
Запросы приходят, но бот не отвечает. Часто причина — aiogram не проверил secret_token. Убедитесь, что токен в SimpleRequestHandler совпадает с тем, что передан в set_webhook.
Максим: «Мы в VibeCoderz на всех продакшен-ботах используем webhook. Polling — только для локальных тестов. На GoBanana webhook стоит через Railway, всё работает без лишних движений. Сделал — получил цифру: 200 000 пользователей, и никаких потерянных апдейтов.»

| Ситуация | Метод | Почему |
|---|---|---|
| Локальная разработка | Polling | Не нужен HTTPS и публичный адрес |
| Тестовый бот | Polling | Быстрый старт, минимум настройки |
| Продакшен до 1 000 пользователей | Polling или Webhook | Оба работают, webhook лучше |
| Продакшен с высокой нагрузкой | Webhook | Мгновенная доставка, меньше запросов |
| Railway, Heroku, VPS | Webhook | HTTPS из коробки, порты открыты |
| Нет возможности открыть порт | Polling | Webhook недоступен без публичного адреса |
| Бот в группах и каналах | Webhook | Polling справляется хуже при высоком трафике |
Что такое getUpdates в Telegram Bot API? getUpdates — метод Telegram Bot API, который возвращает массив новых обновлений (сообщения, команды, нажатия кнопок). Бот вызывает его циклически, чтобы получать события. Это и есть polling — режим, когда бот сам спрашивает сервер о новых событиях.
Как проверить, установлен ли webhook на боте? Сделайте GET-запрос: https://api.telegram.org/bot<TOKEN>/getWebhookInfo. В поле url будет адрес установленного webhook или пустая строка, если webhook не установлен.
Можно ли использовать polling и webhook одновременно? Нет. Если установлен webhook, getUpdates не возвращает новые обновления — Telegram уже отправляет их на ваш URL. Перед запуском polling нужно удалить webhook через deleteWebhook.
Какие порты поддерживает Telegram для webhook? Только четыре: 443, 80, 88 и 8443. На Railway по умолчанию трафик проксируется через 443 — это работает из коробки.
Нужен ли SSL для webhook? Да. Telegram принимает webhook только по HTTPS. Railway предоставляет SSL-сертификат автоматически для своих доменов. На локальной машине используйте ngrok или tuna для временного HTTPS-адреса.
Как удалить webhook и вернуться к polling? Вызовите https://api.telegram.org/bot<TOKEN>/deleteWebhook. В aiogram это делается через await bot.delete_webhook(drop_pending_updates=True). Параметр drop_pending_updates сбросит накопившуюся очередь.
Что делать, если Telegram не стучится на webhook после деплоя? Проверьте четыре вещи: URL доступен извне, порт входит в список 443/80/88/8443, SSL-сертификат валидный, setWebhook был вызван после деплоя. Загляните в getWebhookInfo — там будет last_error_message с причиной.
Сколько вешит очередь при ошибках webhook? Telegram держит до 100 необработанных обновлений. Если ваш сервер возвращает ошибки, Telegram повторяет попытки с нарастающими интервалами. После исправления ошибки очередь разберётся, но это может занять несколько минут.
getUpdates — метод Telegram Bot API для получения новых обновлений. Основа polling-режима. URL: api.telegram.org/bot<TOKEN>/getUpdates.
setWebhook — метод для регистрации HTTPS-эндпоинта, на который Telegram будет отправлять обновления. URL: api.telegram.org/bot<TOKEN>/setWebhook.
getWebhookInfo — метод для проверки текущего статуса webhook: URL, ошибки, счётчик необработанных обновлений.
deleteWebhook — метод для удаления webhook и возврата к polling.
Long Polling — техника, при которой HTTP-соединение удерживается открытым до появления новых данных или истечения таймаута. Снижает количество запросов по сравнению с обычным polling.
Polling Timeout — время (в секундах), которое ваш клиент ждёт ответа от Telegram. Таймаут на стороне приложения.
Long Polling Timeout — время (в секундах), в течение которого Telegram держит соединение открытым при отсутствии обновлений. Таймаут на стороне Telegram.
Infinity Polling — polling, обёрнутый в бесконечный цикл с обработкой ошибок. В aiogram 3 это dp.start_polling().
ngrok / tuna — инструменты для создания временного публичного HTTPS-туннеля к локальному серверу. Нужны для теста webhook на локальной машине.
Railway — платформа для деплоя приложений. Автоматически предоставляет HTTPS-домен и переменную PORT. Хорошо подходит для webhook-ботов.
BotFather — официальный бот Telegram для создания новых ботов и получения токена (BOT_TOKEN).
Pending Updates — обновления, которые Telegram принял, но ваш бот ещё не обработал. Накапливаются при ошибках или простое сервера.
Если планируете деплоить бота на Railway или другом хостинге — посмотрите каталог AI-инструментов VibeCoderz, там есть инструменты для разработки и деплоя. Хотите разобраться с настройкой быстрее — запишитесь на консультацию к Максиму.
Обновлено: июнь 2026. Актуально для aiogram 3.x, Python 3.11+, Telegram Bot API 7.x, Railway.