Допустим, вы хотите аутентифицировать пользователей через телеграм и после этого отправлять им уведомления. В 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)
rexer
20.01.2025 00:19Важно заметить, что из России пользоваться ngrok становится все сложнее, а сам их сайт без vpn не открывается сейчас, оплатить подписку уже нельзя, а бесплатные функции всё время урезают. По этому , если это не учебный проект, то сразу желательно посмотреть какие есть альтернативы.
anton99zel
20.01.2025 00:19Не совсем ясно. Первое. Это не пуш, а обычное сообщение в чат. А потому зачем требуется получать id через авторизацию, когда узнать id есть и другие простые способы.
По сути, вы просто выполнили обычный запрос из java. Не понял ценность статьи и почему ей место на habr.
j-b
20.01.2025 00:19Может имелось в виду простое оповещение встроенное в Spring приложение без создания бота...
На пример оповещение при перезагрузке или сбое в приложения...
Правда для этого слишком много телодвижений и необходимость тащить за собой приличную библиотеку.
Lucky_spirit
А зачем вообще нужен в этой связке widget для входа через Telegram, если пользователь может просто у того же самого бота вызвать команду
/start
и бот так же будет знатьid
пользователя и сможет ему отправлять сообщения через тот же самый метод API?