Telegram-бот счётчик сообщений на Java и Spring Boot
Пишем простой Телеграм-бот на Java, который будет подсчитывать сообщения от пользователей чата и записывать их в БД через PostgreSQL.
26К открытий35К показов
В этой статье я покажу, как написать Telegram-бот на Java с использованием Spring Boot, PostgreSQL и JPA. Также создадим исполняемый jar-файл. Сам же бот будет подсчитывать сообщения от пользователей и записывать эти данные в БД.
- Создаём Spring проект на Java
- Реализация базового функционала
- Добавление кнопок
- Подключение Telegram-бота на Java к базе данных
- Создание исполняемого jar-файла в Intellij IDEA
- Выводы
Создаём Spring проект на Java
Для этого воспользуемся сервисом быстрого создания Spring Initializr: он предоставляет интерфейс для генерации заготовки проекта с добавлением стандартных зависимостей. При необходимости в дальнейшем их можно настроить под свои нужды.
Мои настройки Spring Initializr выглядят так:
Обратите внимание на кнопку Add Dependencies: с её помощью можно добавить важные зависимости уже на старте.
После того, как вы всё указали, нажмите Generate, разархивируйте стартовый проект и откройте его с помощью удобной IDE. У меня это IntelliJ IDEA.
Реализация базового функционала
Для начала напишем на Java самый примитивный Telegram bot, который будет отвечать на наши сообщения.
Создание Telegram-бота и конфигурация
Начнём с того, что это Maven-проект. Сразу добавим в pom.xml дополнительные зависимости для работы с Телеграм ботом и базами данных:
В каталоге resources создадим файл config.properties, где будут храниться данные для подключения к боту и в будущем к БД.
Примечание Данный файл не следует включать в коммиты.
Теперь создадим бота. Для этого перейдём в Telegram в BotFather и создадим нового бота командой /newbot. Выбираем для него название, которое будет отображаться для всех, и его username. После этого BotFather выдаст токен для взаимодействия с бэкендом Телеграмма.
Теперь запишем в файл config.properties следующее:
Добавим в основной каталог проекта пакет config, а внутри него создадим новый класс BotConfig.
Вы наверняка заметили, что мы добавили в pom.xml Lombok. Это популярная библиотека для сокращения кода и расширения функциональности Java. С ней и Spring наш класс BotConfig будет выглядеть очень лаконично:
Что здесь происходит?
@Configurationуказывает, что класс содержит методы определения@Bean(наши@Value).@Dataна этапе компиляции генерирует для всех полей геттеры, сеттеры,toStringи предопределяет equals и hashCode.
С остальным, думаю, всё понятно.
Класс Телеграм бота на Java
Давайте теперь выйдем из пакета config и создадим в основном пакете проекта класс бота. Поскольку это бот-счётчик, назовём его CounterTelegramBot.
Сразу унаследуемся от TelegramLongPollingBot — класса, который позволяет взаимодействовать с Telegram. И имплементируем методы getBotUsername, getBotToken и onUpdateReceived. Создадим конструктор и добавим две аннотации перед классом: @Component (авто-создание экземпляра) и @Slf4j (для работы с логером).
На старте получаем следующий класс:
Для начала сделаем так, чтобы на команду /start Telegram-бот что-то нам отвечал и выводил в логи сообщение об успехе. Другие сообщения будут выводить в логи "Unexpected message":
И последним штрихом является инициализация бота. Добавим в пакет config класс Initializer:
@Autowiredобеспечивает контроль над тем, где и как осуществить автосвязывание (чтобы Spring автоматически подключил бота).@EventListener— слушатель, который вешаем на изменение класса.
Запустите и проверьте работу бота.
Примечание Если возникает ошибка Failed to configure a DataSource, измените аннотацию в исполняемом классе на @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}). Ошибка исчезнет, как только мы добавим информацию для доступа к БД в config.properties.
Добавление кнопок
Чтобы Telegram bot на Java и Spring Boot выглядел по-настоящему серьёзным, давайте добавим ему команду /help и пару кнопок.
Создадим в основной директории проекта пакет components. В него добавим:
1. Интерфейс BotCommands:
2. Класс Buttons:
В классе мы создаём две кнопки, которые будут расположены в одной линии. Одна из них отвечает за команду старта, а вторая — за вызов меню помощи.
Теперь немного улучшим класс CounterTelegramBot:
switch вынесли в отдельный метод, добавили обработку команд, в том числе и нажатие кнопок.
Подключение Telegram-бота на Java к базе данных
Перед началом работы установите PostgerSQL, если СУБД ещё не установлена. В случае, если вы работаете с другими СУБД, просто измените настройки доступа в файле config.properties. Для тех же, кто работает с PostgerSQL, config.properties будет выглядеть примерно так:
В директорию проекта добавляем пакет database. В нём следует создать:
1. Класс User:
2. Интерфейс UserRepository:
Данный интерфейс нам нужен для удобной работы с CrudRepository — интерфейсом данных Spring для общих операций CRUD. Сюда же вшиваем запрос на апдейт нашей таблицы: добавление +1 сообщения пользователю в случае, если он написал в чат.
В классе CounterTelegramBot объявим новый интерфейс с аннотацией @Autowired, которая говорит Spring, что в это поле нужно инжектнуть бин:
Там же создаём метод добавления пользователя в базу данных, если он написал впервые, и просто обновление столбца сообщений, если пользователь уже существует:
Финально обновим метод onUpdateReceived в классе CounterTelegramBot:
Примечание Вы можете не делать ограничение по chatId, но тогда следует дополнительно прописать логику для создания отдельной таблицы под каждый чат. В моём случае бот писался под конкретный чат.
Важно Не забудьте предоставить боту права администратора чата.
Создание исполняемого jar-файла в Intellij IDEA
У Telegram API есть одно неприятное ограничение, в соответствии с которым наш бот на Java позволяет достучаться только до сообщений, отправленных за последние 24 часа. Всё, что было отправлено раньше, не учтётся.
Поэтому после вы можете либо создать exe-файл с установкой времени выполнения, либо воспользоваться удалённым сервером. Например, в статье о Telegram-боте на Python мы рассказали, как настроить Docker и задеплоить бота на AWS.
Здесь же я просто покажу, как создать исполняемый jar-файл для ручного запуска. Костыльно, но для периодического подсчёта из конкретного чата подходит, а далее можно масштабировать по своему усмотрению.
Инструкция по созданию jar-файла:
- File – Project Structure – Project Settings – Artifacts – Кликаем по кнопке + – Jar – From modules with dependencies.
- Выбираем главный класс проекта и жмем ОK.
- После этого собираем Jar файл: Build – Build Artifact.
- Это создаст .jar, который при двойном клике запустит JVM, если она установлена в ОС.
На первом же скрине вы можете посмотреть структуру проекта.
Выводы
Создание Telegram-бота на Java возможно благодаря специальному классу TelegramLongPollingBot, а Spring Boot и Lombok сильно упрощают этот процесс.
Но стоит отметить, что тот же бот, написанный на Python или PHP, обойдётся вам в меньшее количество строк кода, да и туториалов по таким Телеграм-ботам значительно больше. А вот в качестве практики Java и небольшого пет-проекта, который можно представить в своём резюме, такая программа вполне подойдёт.
Остались вопросы? Задавайте их в комментариях к этой статье.
26К открытий35К показов




