Метод, который периодически вызывает сам telegram в telegram bot api
Возникла необходимость периодически вызывать метод в telegram bot без таймеров. Как я понимаю, для этого необходимо найти такой метод, вызов которого периодически инициирует сам телеграм. Например, есть метод
@Override
public void onUpdateReceived(Update update) {
...
}
но он вызывается лишь в случае, когда пользователь совершает какие-то действия с ботом(отправляет сообщение боту, жмет кнопку и т.д.). Мне же нужен такой метод, который вызывает сам телеграм. Может что-то вроде checkUpdate(не знаю, есть ли такой). Кто подскажет, где смотреть или сам метод
Ответы (1 шт):
Интеграция с телеграмм подразумевает под собой два подхода:
- Ваше приложение периодически обращается к API телеграм по определённому endpoint.
- Телеграмм обращается к вашему приложению, когда на их стороне происходит какое-то событие.
Первый подход - активное получение обновлений вашим приложением методом getUpdates используя Long Polling запросы (открыли соединение с временем жизни 90 секунд, отправили запрос, ждём, если сервер ответил раньше 90 секунд, то соединение закрывается, если не ответил, закрываем соединение и тут же отправляем новый запрос getUpdates). Второй подход - пассивное ожидание входящих событий webhook.
Второй вариант более сложен:
- вам потребуется сделать rest-сервис, который принимает и обрабатывает входящие сообщения;
- организовать сервер, на котором находится приложение;
- статический IP адрес или DNS имя от бесплатного сервиса типа
ngrokилиdyndns; - желательно наличие SSL сертификата, например от бесплатного сервиса
LetsEncrypt; - настройка веб-сервера;
- настройка маршрутизации до вебсервера и до приложения;
- Зарегистрировать ваш rest-сервис в телеграме вызовом метода setWebhook
Так же второй вариант с вебхуками более опасен, т.к. даже при наличии защищённого HTTPS соединения и ограничения соединений по белому диапазону IP-адресов серверов телеграма вы не можете быть до конца уверены, что к вашему приёмнику событий обращается только telegram, а не какие-нибудь хакеры. В документации API телеграма предлагается в URL вашего приёмника зашивать auth-token:
If you'd like to make sure that the Webhook request comes from Telegram, we recommend using a secret path in the URL, e.g.
https://www.example.com/<token>. Since nobody else knows your bot‘s token, you can be pretty sure it’s us.
В совокупностью с остальными методами предосторожности это может помочь, но всё равно остаётся возможность взлома вашего приложения, если знать URL и арендовать VPS в том же пуле IP-адресов, что и телеграм.
Кто подскажет, где смотреть или сам метод
Документация API telegram находится по адресу: https://core.telegram.org
В целом использование первого подхода getUpdates с таймерами - это самое простое и эффективное решение вашей задачи. Если вам не нравится архитектура этого приложения или вы переживаете про его производительность, то почитайте как внутри устроены обработчики событий. Возможно, что после этого первый вариант с таймерами вам покажется более приемлемым.