Метод, который периодически вызывает сам telegram в telegram bot api

Возникла необходимость периодически вызывать метод в telegram bot без таймеров. Как я понимаю, для этого необходимо найти такой метод, вызов которого периодически инициирует сам телеграм. Например, есть метод

@Override
public void onUpdateReceived(Update update) {
     ...
}

но он вызывается лишь в случае, когда пользователь совершает какие-то действия с ботом(отправляет сообщение боту, жмет кнопку и т.д.). Мне же нужен такой метод, который вызывает сам телеграм. Может что-то вроде checkUpdate(не знаю, есть ли такой). Кто подскажет, где смотреть или сам метод


Ответы (1 шт):

Автор решения: hwak

Интеграция с телеграмм подразумевает под собой два подхода:

  1. Ваше приложение периодически обращается к API телеграм по определённому endpoint.
  2. Телеграмм обращается к вашему приложению, когда на их стороне происходит какое-то событие.

Первый подход - активное получение обновлений вашим приложением методом getUpdates используя Long Polling запросы (открыли соединение с временем жизни 90 секунд, отправили запрос, ждём, если сервер ответил раньше 90 секунд, то соединение закрывается, если не ответил, закрываем соединение и тут же отправляем новый запрос getUpdates). Второй подход - пассивное ожидание входящих событий webhook.

Второй вариант более сложен:

  1. вам потребуется сделать rest-сервис, который принимает и обрабатывает входящие сообщения;
  2. организовать сервер, на котором находится приложение;
  3. статический IP адрес или DNS имя от бесплатного сервиса типа ngrok или dyndns;
  4. желательно наличие SSL сертификата, например от бесплатного сервиса LetsEncrypt;
  5. настройка веб-сервера;
  6. настройка маршрутизации до вебсервера и до приложения;
  7. Зарегистрировать ваш 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 с таймерами - это самое простое и эффективное решение вашей задачи. Если вам не нравится архитектура этого приложения или вы переживаете про его производительность, то почитайте как внутри устроены обработчики событий. Возможно, что после этого первый вариант с таймерами вам покажется более приемлемым.

→ Ссылка