Допустим, вы хотите аутентифицировать пользователей через телеграм и после этого отправлять им уведомления. В Spring Boot приложении это сделать довольно просто ✨

Аутентификация

Подробно про аутентификацию писал в этой статье. Здесь кратко пробегусь по основным моментам.

Получаем собственный домен

Для аутентификации нам понадобится домен. Его можно получить через ngrok.

После получения домена, создайте файл с конфигурацией ngrok:

version: 2
authtoken: YOUR_NGROK_TOKEN
tunnels:
  httpbin:
    proto: http
    addr: 8080
      hostname: needed-filly-suitable.ngrok-free.app

И docker-compose с контейнером ngrok:

services:
  ngrok:
    image: ngrok/ngrok:latest
    command:
      - "start"
      - "--all"
      - "--config"
      - "/etc/ngrok.yml"
    volumes:
      - ./ngrok.yml:/etc/ngrok.yml
    network_mode: host

После запуска контейнера, перейдите на http://localhost:4040 и проверьте, что домен доступен

Создаем телеграм бота

Далее, переходим в BotFather, создаем бота и привязываем к нему полученный домен

Виджет для авторизации

Переходим на страницу документации для создания виджета, указываем имя бота и ставим галочку для возможности отправлять сообщения через него.

Копируем сгенерированный код и переходим в наше приложение.

Эндпоинт для аутентификации

В папку src/main/resources/static добавляем файл с нашим скриптом.

Далее создаем контроллер, который будет отдавать этот скрипт:

@RestController
@RequestMapping("/tg")
public class TelegramController {

    @Value("classpath:static/telegram-auth-widget.html")
    private Resource authWidget;

    @GetMapping(value = "/auth/widget", produces = MediaType.TEXT_HTML_VALUE)
    public ResponseEntity<Resource> getAuthWidget() {
        return ResponseEntity.ok()
                .header(HttpHeaders.CONTENT_DISPOSITION, "inline")
                .body(authWidget);
    }
}

Переходим в браузер, аутентифицируемся и сохраняем полученное id

Отправка уведомлений

Для отправки уведомлений нам понадобится зависимость telegrambots-client.
В статьях по созданию тг ботов и в документации вы найдете и другие зависимости, но для односторонней отправки сообщений нам будет достаточно этой.

Создаем клиент, в который передадим токен бота и создаем метод для отправки сообщений:

private final TelegramClient tgClient = new OkHttpTelegramClient("YOUR_TELEGRAM_TOKEN");

@PostMapping(value = "/{userId}/notifications", consumes = MediaType.TEXT_PLAIN_VALUE)
public void sendMessageToTelegram(@PathVariable Long userId,  @RequestBody String text) throws TelegramApiException {
  SendMessage message = SendMessage.builder()
            .chatId(userId)
            .text(text)
            .build();
  
    tgClient.execute(message);
}

Протестируем наше приложение:

Получаем уведомление:

?‍? Джуниор

Комментарии (4)


  1. Lucky_spirit
    20.01.2025 00:19

    А зачем вообще нужен в этой связке widget для входа через Telegram, если пользователь может просто у того же самого бота вызвать команду /start и бот так же будет знать id пользователя и сможет ему отправлять сообщения через тот же самый метод API?


  1. rexer
    20.01.2025 00:19

    Важно заметить, что из России пользоваться ngrok становится все сложнее, а сам их сайт без vpn не открывается сейчас, оплатить подписку уже нельзя, а бесплатные функции всё время урезают. По этому , если это не учебный проект, то сразу желательно посмотреть какие есть альтернативы.


  1. anton99zel
    20.01.2025 00:19

    Не совсем ясно. Первое. Это не пуш, а обычное сообщение в чат. А потому зачем требуется получать id через авторизацию, когда узнать id есть и другие простые способы.

    По сути, вы просто выполнили обычный запрос из java. Не понял ценность статьи и почему ей место на habr.


  1. j-b
    20.01.2025 00:19

    Может имелось в виду простое оповещение встроенное в Spring приложение без создания бота...

    На пример оповещение при перезагрузке или сбое в приложения...

    Правда для этого слишком много телодвижений и необходимость тащить за собой приличную библиотеку.