Long Polling
Long Polling — режим, в котором приложение само вызывает GET /updates и
ждёт новые события MAX. Dispatcher.start_polling() ведёт marker, передаёт
updates в handlers и повторяет запрос.
MAX ограничивает Long Polling по скорости и сроку хранения событий. Активная Webhook-подписка отключает Long Polling. Поэтому этот режим предназначен для разработки и тестирования; production-интеграции должны использовать Webhook.
Запуск
import asyncio
import os
from aiomax2 import Bot, Dispatcher, Router
from aiomax2.types import Message
router = Router()
@router.message()
async def echo(message: Message) -> None:
if message.text:
await message.answer(message.text)
async def main() -> None:
bot = Bot(os.environ["MAX_BOT_TOKEN"])
dp = Dispatcher()
dp.include_router(router)
await dp.start_polling(
bot,
polling_timeout=30,
allowed_updates=["message_created"],
)
if __name__ == "__main__":
asyncio.run(main())
Параметры
polling_timeout передаётся в GET /updates как максимальное время ожидания
ответа. Transport добавляет запас к HTTP timeout, чтобы соединение не
завершилось раньше long-poll запроса.
allowed_updates ограничивает список типов событий. Если параметр не указан,
Dispatcher автоматически собирает типы, для которых зарегистрированы handlers.
handle_as_tasks=True обрабатывает updates конкурентно. При False следующий
update начнёт обрабатываться только после завершения текущего.
Исключения background handlers извлекаются и логируются, поэтому asyncio не
оставляет предупреждение Task exception was never retrieved.
bot_admin_permissions_changed пока доставляется MAX только через Webhook.
Наличие observer в resolve_used_update_types() не делает событие доступным в
Long Polling; для его проверки используйте Webhook.
Marker из ответа становится marker следующего запроса, включая пустую страницу updates. Отмена polling не перехватывается retry loop. При активной Webhook- подписке Long Polling недоступен на стороне MAX; сначала удалите подписку.
Остановка
Ctrl+C отменяет основной task. Из handler или другого task можно вызвать:
По умолчанию start_polling() ждёт активные handler tasks и закрывает Bot.
Если жизненным циклом transport управляет приложение, передайте
close_bot_session=False и вызовите await bot.close() самостоятельно.