Получать обновления: вебхук или getUpdates
Что это
Любое событие, от сообщения до оплаты, приходит к боту как обновление (update). Получают их одним из двух способов, не обоими сразу: либо твой код сам забирает обновления методом `getUpdates` (long polling), либо Telegram шлёт каждое POST-запросом на твой HTTPS-адрес (вебхук). Недоставленные обновления ждут не дольше 24 часов.
Как сделать
- Опрос: вызывай `getUpdates` в цикле с положительным `timeout` и передавай… Опрос: вызывай `getUpdates` в цикле с положительным `timeout` и передавай `offset` = последний `update_id` + 1, чтобы подтвердить обработанное.
- Вебхук: вызови `setWebhook` с HTTPS-адресом в `url` и секретом в… Вебхук: вызови `setWebhook` с HTTPS-адресом в `url` и секретом в `secret_token`. Запросы, где в заголовке `X-Telegram-Bot-Api-Secret-Token` другое значение, отбрасывай.
- В `allowed_updates` оставь только нужные типы, а `max_connections` (1–100, по умолчанию 40) подбери под сервер.
- На запросы вебхука отвечай кодом 2XX, иначе Telegram повторит запрос и после разумного числа попыток сдастся.
- Проверяй доставку через `getWebhookInfo`: `pending_update_count`, `last_error_message`.
- Вернуться к опросу — `deleteWebhook`; с `drop_pending_updates` очередь заодно очистится.
Осторожно
- Пока стоит вебхук, `getUpdates` не работает.
- Вебхуку нужны порт 443, 80, 88 или 8443, TLS 1.2 и выше, IPv4 и сертификат, где CN совпадает с доменом; самоподписанный загружай в `certificate`. Запросы идут из 149.154.160.0/20 и 91.108.4.0/22.
- Даже пустой `allowed_updates` не включает `chat_member`, `message_reaction` и `message_reaction_count`: их перечисляй явно.
- Если неделю не было обновлений, следующий `update_id` будет случайным.
- Популярным ботам (около 300 запросов в минуту) @BotFather шлёт предупреждения, если ответов стало мало, — по умолчанию не чаще раза в час.
- Свой локальный сервер Bot API разрешает любой порт, обычный HTTP и до 100 000 соединений вебхука.
С Gem
Gem не размещает код твоего бота и не принимает его вебхуки, а своего бота к Gem пока не подключить. Проекты работают на @gembot, которого держит Gem: оплата предложений в звёздах, заявки на вступление, посты в каналы и ответы в группах.
Источники
- https://core.telegram.org/bots/api#getting-updates
- https://core.telegram.org/bots/webhooks
- https://core.telegram.org/bots/features#status-alerts