Лимиты метода getChatMemberCount в Telegram Bot API
Когда я взялся за проект мониторинга подписчиков Telegram-каналов, метод getChatMemberCount показался мне идеальным инструментом. Он простой, быстрый и делает ровно то, что нужно — возвращает количество участников чата. Но вскоре я столкнулся с загадкой: мой скрипт начал получать ошибки с огромными тайм-аутами, а официальная документация молчала о точных лимитах. В этой статье я расскажу, как я шаг за шагом докопался до суточных ограничений этого метода.
С чего все началось
Я написал скрипт на Python, который каждые 3 часа проверял по 50 каналов. Задержка между запросами — 15 секунд, чтобы не перегружать API. Получалось 400 запросов в сутки: 50 каналов умножить на 8 запусков. Скрипт запускался через crontab, а специальный файл блокировки не давал ему стартовать повторно, пока предыдущий процесс не завершится.
Все шло гладко, пока в логах не появилась строка:
Rate limit exceeded. Waiting for 49622 seconds.
Почти 14 часов ожидания! Я понял, что наткнулся на какой-то серьезный лимит, и решил разобраться.
Первые догадки
В документации Telegram Bot API я нашел только общий лимит — 30 запросов в секунду. Мои 0,07 запроса в секунду явно не дотягивали до этой планки. Тогда я начал строить предположения:
- Может, я превысил суточный лимит?
- Или есть ограничение на запросы к одному каналу?
- А вдруг с моего сервера идет другая нагрузка?
- Или задержки в скрипте работают неправильно?
Надо было проверить каждую гипотезу.
Что я исключил
Сначала я убедился, что каналы в базе уникальны — дубликатов быть не могло благодаря индексу. Логи не показали тайм-аутов, значит, повторные попытки из-за сбоев сети не увеличивали нагрузку. Я проверил сервер командой netstat — других ботов или активности на порту 443 не было. Моя задержка в 15 секунд тоже работала как часы, ведь я использовал asyncio с семафором, чтобы запросы шли строго по очереди.
Оставалось одно: суточный лимит.
Эксперименты
Я решил протестировать разные объемы запросов, оставив задержку 15 секунд и 8 запусков в сутки:
- 50 каналов (400 запросов): Ошибка с тайм-аутом в 13,8 часов. Явно слишком много.
- 25 каналов (200 запросов): Никаких проблем, все стабильно.
- 30 каналов (240 запросов): Ошибка с задержкой в 2 часа.
Картина начала проясняться: где-то между 200 и 240 запросами пролегала граница.
Разговор с поддержкой
Чтобы подтвердить свои выводы, я написал в @BotSupport.
Описал ситуацию: 400 запросов, 15-секундная задержка, ошибка с retry_after в 49622 секунды. Ответ пришел короткий, но полезный:
Rate limits are bot-specific. getChatMemberCount has relatively strict limits (unspecified) so getting such a long retry after timeout is not unusual.
Они подтвердили, что лимиты относятся к боту, а getChatMemberCount — метод с жесткими рамками. Точных цифр не дали, но мои тесты уже говорили сами за себя.
Что я узнал
- Лимит одного бота для getChatMemberCount — около 200 запросов в сутки.
- Если запросов 200 — все работает.
- 240 — и Telegram "штрафует" меня на 2 часа.
- 400 — и я получаю почти 14-часовую паузу.
Интересно, что время блокировки растет с превышением: небольшое нарушение — короткий тайм-аут, большое — долгий. Скорость запросов тут ни при чем, дело в общем объеме за день, хотя это не точно! Я проверял вариант с опросом 200 каналов в рамках одной "сессии" работы скрипта.
Как преодолеть лимит (размышления)
Сейчас мой скрипт стабильно работает и опрашивает 25 каналов за один запуск скрипта — это 200 запросов в сутки, и ошибок нет. В данный момент эти показатели меня вполне устраивают. Но что делать, если нужно больше? Один из вариантов — использовать несколько ботов. Разделив нагрузку, например, по 200 запросов в сутки на каждого, можно легко выйти за пределы 200 запросов и получать данные о количестве подписчиков в нужном объеме. Поддержка подтвердила, что лимиты метода getChatMemberCount бота специфичны, так что это вполне рабочая идея.
Итог
Я потратил не мало времени на тесты, но в итоге понял, что getChatMemberCount ограничен примерно 200 запросами в сутки на бота. Превышение вызывает ошибку 429 с нарастающим retry_after. Если вам нужно опросить больше каналов или групп, подумайте о втором боте — это может стать вашим спасением. Надеюсь, мой опыт сэкономит вам пару дней или недель, если вы тоже столкнетесь с тайнами Telegram Bot API!