Telegram-бот на Java за 3 дня. Знакомимся с профессией Java-разработчика
Заявка не отправлена! Похоже произошла ошибка. Попробуйте отправить снова или перезагрузите страницу.
Вы узнаете, какие навыки нужны разработчику для трудоустройства, а также сравните особенности и возможности Java и Python. Напишете свой первый код на Java: создадите Telegram-бот с тестом по этому языку от работодателя и сможете адаптировать его под другие задачи. А спикер — директор по подбору IT-специалистов — расскажет, с чего начинать карьеру в разработке.
Java — универсальный язык программирования. На нём создают приложения для крупных банков, интернет-магазинов и стриминговых платформ. Например, язык используют Spotify, Twitter и Яндекс. Java уже десятилетия занимает первые места
в рейтингах лучших языков. Поэтому Java-разработчики могут работать удалённо и участвовать
в международных проектах.



Java-разработчики востребованы на рынке. Более 5 500 вакансий открыто
для специалистов разных уровней.
- до 100 000 ₽ без опыта
- от 120 000 ₽ 1–3 года опыта
- от 250 000 ₽ 3–6 лет опыта
По данным сайта
Кому подойдёт интенсив
Новичкам в программировании
Тем, кто хочет работать удалённо
Тем, кто хочет оценить сферу IT
Начинающим разработчикам
Подарки и призы
Гайд по профессии Java-разработчика

Каждый, кто зарегистрируется
на интенсив, получит гайд с разбором задач программиста, а также навыков
и перспектив для новичков.
Сертификат на скидку 10 000 рублей

Участники, которые будут онлайн
на интенсиве, получат сертификаты
на скидку 10 000 рублей на покупку любого курса.
«Разум под контролем» Роджера Сайпа и Робба Збиерски
Вы научитесь
Определять навыки для трудоустройства
Разбираться в теории ООП
Писать код на Java
Поймёте, как устроен язык. Научитесь создавать код с нуля и вносить в него правки.
Различать Java и Python
Работать с циклами, массивами и коллекциями
Создавать Telegram-боты
Программа
Знакомимся с Java и продумываем логику Telegram-бота
- Java и Python? Сравниваем возможности языков и смотрим код
- Java — самый востребованный язык на backend
- Зарплаты Java-разработчиков
- Что нужно Java-разработчику для трудоустройства
- Топ-5 правил синтаксиса Java
- Практика: пробуем писать код на Java
- Практика: реализуем логику Telegram-бота: учим программу задавать вопросы и читать простые ответы
- Выбираем одну из полезных тем для новичков в IT на третий день
Пишем универсального бота для тестов на Java
- Практика: регистрируем Telegram-бот
- Способы подключения к Telegram API
- Практика: доделываем логику Telegram-бота, учим программу читать сложные ответы и выдавать результаты
- Практика: запускаем приложение
Telegram-бот на Java: подводим итоги
- Обсуждаем выбранную в первый день тему
- Спикер отвечает на вопросы
- Разбираем практические работы
- Подводим итоги
Преподаватель

Даниил Пилипенко
- 19+ лет разрабатывает и руководит командами разработки
на Java, PHP и во frontend - 520+ выступлений на семинарах и конференциях
- Автор 10+ курсов Skillbox по программированию
- Сертифицированный карьерный коуч
- Руководил отделом разработки ПО в издательстве
«Вокруг света»
Отзывы участников интенсива
Тамара Сластникова
Участница интенсива

Не ожидала, что интенсив будет настолько объёмным, понятным
и интересным. Спикер невероятно внимателен к каждому участнику. Даниил много и понятно рассказывал, объяснял и делал построчный разбор кода. Новичкам важно найти такого терпеливого учителя! Для меня теперь Java — лидер среди всех языков программирования.
Игорь Кондратенков
Участник интенсива

Интенсив был очень интересный. Понравилось, что спикер рассказывал быстро и доступно. Подробно разобрал все ошибки в практических работах. Видно,
что Даниил — профессионал в своём деле. Возможно, интенсив повлияет на мою будущую карьеру: теперь подумываю освоить Java.
Особенности создания телеграм-бота на Java
В статье пойдет разговор о том, что такое боты, для чего они используются, как работают и чем отличаются от обычных аккаунтов. Также рассмотрим порядок создания телеграм-бота на «Джава».
Ботами (bot) и чат ботами (chat bots) называют специальные аккаунты в Телеграмм, используемые для автоматической обработки и отправки сообщений. На практике пользователи взаимодействуют с ботами посредством сообщений, которые они отправляют как через обычные, так и через групповые чаты. Бот работает по определенной логике — она контролируется с помощью HTTPS-запросов к специальному API для ботов от Телеграм.

Возможности ботов
Приведем несколько классических примеров применения ботов в Телеграмм:
- Утилиты и инструменты. Телеграм-бот может переводить тексты, отображать актуальную погоду, предупреждать о каких-либо предстоящих событиях, использоваться для проведения опросов.
- Интеграция с сервисами. Бота можно использовать для отправки комментариев либо уведомлений, управления «умным домом».
- Игры (как одно-, так и многопользовательские). Бот без проблем поиграет с вами в шахматы/шашки, проведет викторину и т. п.
- Социальные сервисы. При необходимости специальный бот найдет вам собеседника, взяв за основу для поиска ваши интересы и увлечения.
- Все остальное. Это «все остальное» ограничивается лишь вашей фантазией. На деле вы можете запрограммировать бота практически для чего угодно. Однако стоит понимать, что он все равно останется ботом, а значит, не сможет помыть посуду вместо вас.
Если резюмировать вышеперечисленное одним предложением, то бот в Телеграм умеет оставлять комментарии к записям и постам, переводить тексты, искать информацию и аудио/видеоданные, спрашивать и отвечать на вопросы, подключаться к сети, обходить блокировки роутеров и сервисов, создавать чаты для общения, транслировать презентации и т. д. — всего не перечислишь.
Как функционируют боты?
Боты — особые аккаунты, по сути, представляющие собой интерфейс к вашему сервису, работающему на удаленном сервере. Плюс в том, что для создания бота вам совершенно не обязательно изучать низкоуровневые технологии, так как все взаимодействие основано на обычном HTTPS-интерфейсе с упрощенными методами API — его называют Bot API .
В реальности вы можете создать бота в Телеграмм с помощью… бота. Для этого потребуется написать пользователю @BotFather , а потом следовать его инструкциям. После создания вы получите специальный ключ авторизации (токен). Выполнить необходимые настройки можно будет в разделе документации Bot API .

Особенности создания бота с помощью Java
Если вы не ищете легких путей, хотите прокачаться в Java и привыкли все творить своими руками, вы можете написать бота, используя язык программирования Java («Джава», «Ява»). Ниже рассмотрим один из возможных алгоритмов действий.
Пишем бот на Java
На деле написать бота для Телеграмм, используя Java, не так уже сложно. Рассмотрим пример создания бота посредством Webhook.

Общая последовательность действий будет следующей:
- Открываем «Эклипс», создаем новый Java-проект.
- Находим и загружаем базу, необходимую для создания Telegram-ботов.
- Импортируем загруженную библиотеку в проект.
- Создаем класс test.SimpleBot со следующим содержимым:
— открытие веб-браузера, переход по ссылке: https://telegram.me/botfather;
— нажатие кнопки «Send message»;
— выбор BotFather в Телеграме;
— ввод имени бота на Webhook.
Также надо будет придумать имя пользователя для вновь созданного бота. Тут главное, чтобы это имя было уникальным. После ввода имени надо будет нажать кнопку подтверждения, в результате чего появится сообщение об успешной конфигурации. Обратите внимание, что после «Use this token to access the HTTP API:» выведется ваш токен, который надо будет ввести в требуемом месте.
- Переходим в «Эклипс», запускаем бота.
- В адресной строке веб-браузера набираем https://telegram.me/имя_вашего_бота (это необходимо для тестирования работоспособности).
- Нажимаем «Send message».
- Возвращаемся в Телеграм, выбираем созданного бота.
- Кликаем «Старт».
Все, Telegram-bot Webhook, написанный на «Джава», готов. На данном этапе на любое обращение робот должен отвечать что-то в стиле «Я не знаю, что ответить на это», однако эту фразу можно поменять путем дополнения базы.
Каковы плюсы Telegram-бота на Java
Можно перечислить ряд преимуществ такой реализации:
- Простота.
- Минимум выполняемых операций.
- Минимум требуемых знаний и умений.
В сети вы можете найти целый спектр уже готовых решений в виде программного кода, поэтому написать бота на Java будет не сложно. Вот, к примеру, полезное обучающее видео , где подробно рассказывается о том, как создать погодного бота на «Джава». Преимущество именно этого решения — легкость, доступность, простота создания. Дерзайте!
- https://stelegram.ru/faq/pravila-sozdaniya-telegramm-bota-na-java;
- https://tlgrm.ru/docs/bots.
Пишем простой Telegram bot на java, который показывает официальный курс по отношению к иностранным валютам
Всем привет! Да-да тема не очень актуальна и на просторах habr-a есть очень много статей про то, как написать простейшего telegram bota, но я все-таки рискну написать еще одну. Может кому-то она будет интересна и полезна.
Для написания бота нужен аккаунт в telegram.
И так начнем: наш бот будет «ходить» на официальную страницу национального банка и выдавать текущий официальный курс к запрашиваемой валюте.
Создадим проект, я это сделаю с помощью https://start.spring.io/

Генерируем и открываем в среде разработки.
Сейчас нужно зайти в telegram и найти там @BotFather.

Пишем команду /newbot и вводим имя для нашего нового бота. Имя должно быть уникальным и заканчиваться на bot. По данному имени нас будут искать в telegram.

После этого BotFather сгенерирует нам уникальный токен с помощью которого мы получим доступ к нему. Данный токен лучше держать в секрете и никому не показывать, потому что узнав его можно получить доступ к этому боту. Конечно после написания данной статьи я его поменяю.
Далее идем в наш проект и добавляем зависимости для telegram, lombok и json. Библиотеку json будем использовать для парсинга jsona, который будем получать через официальный API банка.
org.telegram telegrambots 6.5.0 org.projectlombok lombok 1.18.26 provided org.json json 20220924
В application.properties прописываем наши данные для доступу к боту.
bot.name=OfficialRateOfBYNBot bot.token=5888893679:AAGQWAbS0zCMtnQrTeWrVYz9KHj2nUlyVIw
Создадим папку config, и там создадим класс BotConfig. Он нужен для использования имени и токена нашего бота для подключения к нему.
@Configuration @Data @PropertySource("application.properties") public class BotConfig < @Value("$") String botName; @Value("$") String token; >
Сейчас поговорим про API через которую мы будем получать данные о курсах валют. Я нашел такой https://www.nbrb.by/apihelp/exrates на официальном сайте национального банка.

Отправив get запрос на данный API через postman мы получим вот такой json.

Чтобы легче обрабатывать json создадим класс CurrencyModel в папке model
@Data public class CurrencyModel
Далее создадим класс CurrencyService в папке service.
public class CurrencyService < public static String getCurrencyRate(String message, CurrencyModel model) throws IOException, ParseException < URL url = new URL("https://www.nbrb.by/api/exrates/rates/" + message + "?parammode=2"); Scanner scanner = new Scanner((InputStream) url.getContent()); String result = ""; while (scanner.hasNext())< result +=scanner.nextLine(); >JSONObject object = new JSONObject(result); model.setCur_ID(object.getInt("Cur_ID")); model.setDate(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").parse(object.getString("Date"))); model.setCur_Abbreviation(object.getString("Cur_Abbreviation")); model.setCur_Scale(object.getInt("Cur_Scale")); model.setCur_Name(object.getString("Cur_Name")); model.setCur_OfficialRate(object.getDouble("Cur_OfficialRate")); return "Official rate of BYN to " + model.getCur_Abbreviation() + "\n" + "on the date: " + getFormatDate(model) + "\n" + "is: " + model.getCur_OfficialRate() + " BYN per " + model.getCur_Scale() + " " + model.getCur_Abbreviation(); > private static String getFormatDate(CurrencyModel model) < return new SimpleDateFormat("dd MMM yyyy").format(model.getDate()); >>
В данном классе мы напишем статический метод getCurrencyRate, делаем его статическим чтобы обращаться к нему без создания объекта данного класса. В данном методе мы «идем» на сайт НБ и там по запрашиваемой валюте находим её курс и сохраняем полученную информацию в нашу модель CurrencyModel. На выходе выдаем данные, из этой модели уже в таком виде, в котором их будут видеть наши пользователи.
Далее создаем класс TelegramBot и наследуемся от TelegramLongPollingBot.
@Component @AllArgsConstructor public class TelegramBot extends TelegramLongPollingBot < private final BotConfig botConfig; @Override public String getBotUsername() < return botConfig.getBotName(); >@Override public String getBotToken() < return botConfig.getToken(); >@Override public void onUpdateReceived(Update update) < CurrencyModel currencyModel = new CurrencyModel(); String currency = ""; if(update.hasMessage() && update.getMessage().hasText())< String messageText = update.getMessage().getText(); long chatId = update.getMessage().getChatId(); switch (messageText)< case "/start": startCommandReceived(chatId, update.getMessage().getChat().getFirstName()); break; default: try < currency = CurrencyService.getCurrencyRate(messageText, currencyModel); >catch (IOException e) < sendMessage(chatId, "We have not found such a currency." + "\n" + "Enter the currency whose official exchange rate" + "\n" + "you want to know in relation to BYN." + "\n" + "For example: USD"); >catch (ParseException e) < throw new RuntimeException("Unable to parse date"); >sendMessage(chatId, currency); > > > private void startCommandReceived(Long chatId, String name) < String answer = "Hi, " + name + ", nice to meet you!" + "\n" + "Enter the currency whose official exchange rate" + "\n" + "you want to know in relation to BYN." + "\n" + "For example: USD"; sendMessage(chatId, answer); >private void sendMessage(Long chatId, String textToSend) < SendMessage sendMessage = new SendMessage(); sendMessage.setChatId(String.valueOf(chatId)); sendMessage.setText(textToSend); try < execute(sendMessage); >catch (TelegramApiException e) < >> >
В данном классе внедряем класс BotConfig с нашими настройками для подключения к боту. Переопределяем три метода класса TelegramLongPollingBot:
getBotUsername() — возвращаем имя нашего бота.
getBotToken() — возвращаем токен нашего бота.
onUpdateReceived(Update update) — данный метод вызывается каждый раз при отправке сообщения пользователем. Он вызывается с параметром update, с помощью которого мы можем получить текст сообщения, id чата для отправки ответного сообщения и другую информацию.
Также я написал дополнительно два метода:
startCommandReceived(Long chatId, String name) — данный метод отправляет приветствие после набора команды /start в telegram.
sendMessage(Long chatId, String textToSend) — данный метод через id чата отправляет пользователю сообщение в telegram.
И последний класс, который мы создадим BotInitializer в папке config.
@Component public class BotInitializer < private final TelegramBot telegramBot; @Autowired public BotInitializer(TelegramBot telegramBot) < this.telegramBot = telegramBot; >@EventListener() public void init()throws TelegramApiException < TelegramBotsApi telegramBotsApi = new TelegramBotsApi(DefaultBotSession.class); try< telegramBotsApi.registerBot(telegramBot); >catch (TelegramApiException e) < >> >
В данном классе создаем сессию и регистрируем нашего telegram бота.
Наш бот готов! Будем тестировать!
Находим нашего бота в telegram.


Переходим в telegram и нажимаем start или набираем /start и получаем

Можем тестировать дальше. Наш функционал работает.

Спасибо Всем кто читал данную статью. Пока.
Telegram-бот счётчик сообщений на Java и Spring Boot
Пишем простой Телеграм-бот на Java, который будет подсчитывать сообщения от пользователей чата и записывать их в БД через PostgreSQL.
В этой статье я покажу, как написать 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 дополнительные зависимости для работы с Телеграм ботом и базами данных:
- Telegram Bots
- Hibernate Core Relocation
- PostgreSQL JDBC Driver
- Lombok
В каталоге resources создадим файл config.properties , где будут храниться данные для подключения к боту и в будущем к БД.
Примечание Данный файл не следует включать в коммиты.
Теперь создадим бота. Для этого перейдём в Telegram в BotFather и создадим нового бота командой /newbot . Выбираем для него название, которое будет отображаться для всех, и его username. После этого BotFather выдаст токен для взаимодействия с бэкендом Телеграмма.
Теперь запишем в файл config.properties следующее:
bot.name = юзернейм_вашего_бота bot.token = токен_вашего_бота bot.chatId = id_нужного_чата
Добавим в основной каталог проекта пакет config , а внутри него создадим новый класс BotConfig .
Вы наверняка заметили, что мы добавили в pom.xml Lombok. Это популярная библиотека для сокращения кода и расширения функциональности Java. С ней и Spring наш класс BotConfig будет выглядеть очень лаконично:
@Configuration @Data @PropertySource("config.properties") public class BotConfig < @Value("$") String botName; @Value("$") String token; @Value("$") String chatId; >
Что здесь происходит?
- @Configuration указывает, что класс содержит методы определения @Bean (наши @Value ).
- @Data на этапе компиляции генерирует для всех полей геттеры, сеттеры, toString и предопределяет equals и hashCode.
С остальным, думаю, всё понятно.
Класс Телеграм бота на Java
Давайте теперь выйдем из пакета config и создадим в основном пакете проекта класс бота. Поскольку это бот-счётчик, назовём его CounterTelegramBot.
Сразу унаследуемся от TelegramLongPollingBot — класса, который позволяет взаимодействовать с Telegram. И имплементируем методы getBotUsername , getBotToken и onUpdateReceived . Создадим конструктор и добавим две аннотации перед классом: @Component (авто-создание экземпляра) и @Slf4j (для работы с логером).
На старте получаем следующий класс:
@Slf4j @Component public class CounterTelegramBot extends TelegramLongPollingBot < final BotConfig config; public CounterTelegramBot(BotConfig config) < this.config = config; >@Override public String getBotUsername() < return config.getBotName(); >@Override public String getBotToken() < return config.getToken(); >@Override public void onUpdateReceived(@NotNull Update update) <> >
Для начала сделаем так, чтобы на команду /start Telegram-бот что-то нам отвечал и выводил в логи сообщение об успехе. Другие сообщения будут выводить в логи «Unexpected message» :
@Override public void onUpdateReceived(@NotNull Update update) < if(update.hasMessage() && update.getMessage().hasText())< String messageText = update.getMessage().getText(); long chatId = update.getMessage().getChatId(); String memberName = update.getMessage().getFrom().getFirstName(); switch (messageText)< case "/start": startBot(chatId, memberName); break; default: log.info("Unexpected message"); >> > private void startBot(long chatId, String userName) < SendMessage message = new SendMessage(); message.setChatId(chatId); message.setText("Hello, " + userName + "! I'm a Telegram bot."); try < execute(message); log.info("Reply sent"); >catch (TelegramApiException e) < log.error(e.getMessage()); >>
И последним штрихом является инициализация бота. Добавим в пакет config класс Initializer :
@Slf4j @Component public class Initializer < @Autowired CounterTelegramBot bot; @EventListener() public void init() < try < TelegramBotsApi telegramBotsApi = new TelegramBotsApi(DefaultBotSession.class); telegramBotsApi.registerBot((LongPollingBot) bot); >catch (TelegramApiException e) < log.error(e.getMessage()); >>
- @Autowired обеспечивает контроль над тем, где и как осуществить автосвязывание (чтобы Spring автоматически подключил бота).
- @EventListener — слушатель, который вешаем на изменение класса.
Запустите и проверьте работу бота.
Примечание Если возникает ошибка Failed to configure a DataSource , измените аннотацию в исполняемом классе на @SpringBootApplication(exclude = ) . Ошибка исчезнет, как только мы добавим информацию для доступа к БД в config.properties .
Добавление кнопок
Чтобы Telegram bot на Java и Spring Boot выглядел по-настоящему серьёзным, давайте добавим ему команду /help и пару кнопок.
Создадим в основной директории проекта пакет components . В него добавим:
1. Интерфейс BotCommands :
public interface BotCommands < ListLIST_OF_COMMANDS = List.of( new BotCommand("/start", "start bot"), new BotCommand("/help", "bot info") ); String HELP_TEXT = "This bot will help to count the number of messages in the chat. " + "The following commands are available to you:\n\n" + "/start - start the bot\n" + "/help - help menu"; >
2. Класс Buttons :
public class Buttons < private static final InlineKeyboardButton START_BUTTON = new InlineKeyboardButton("Start"); private static final InlineKeyboardButton HELP_BUTTON = new InlineKeyboardButton("Help"); public static InlineKeyboardMarkup inlineMarkup() < START_BUTTON.setCallbackData("/start"); HELP_BUTTON.setCallbackData("/help"); ListrowInline = List.of(START_BUTTON, HELP_BUTTON); List rowsInLine = List.of(rowInline); InlineKeyboardMarkup markupInline = new InlineKeyboardMarkup(); markupInline.setKeyboard(rowsInLine); return markupInline; > >
В классе мы создаём две кнопки, которые будут расположены в одной линии. Одна из них отвечает за команду старта, а вторая — за вызов меню помощи.
Теперь немного улучшим класс CounterTelegramBot :
@Slf4j @Component public class CounterTelegramBot extends TelegramLongPollingBot implements BotCommands < final BotConfig config; public CounterTelegramBot(BotConfig config) < this.config = config; try < this.execute(new SetMyCommands(LIST_OF_COMMANDS, new BotCommandScopeDefault(), null)); >catch (TelegramApiException e) < log.error(e.getMessage()); >> @Override public String getBotUsername() < return config.getBotName(); >@Override public String getBotToken() < return config.getToken(); >@Override public void onUpdateReceived(@NotNull Update update) < long chatId = 0; long userId = 0; //это нам понадобится позже String userName = null; String receivedMessage; //если получено сообщение текстом if(update.hasMessage()) < chatId = update.getMessage().getChatId(); userId = update.getMessage().getFrom().getId(); userName = update.getMessage().getFrom().getFirstName(); if (update.getMessage().hasText()) < receivedMessage = update.getMessage().getText(); botAnswerUtils(receivedMessage, chatId, userName); >//если нажата одна из кнопок бота > else if (update.hasCallbackQuery()) < chatId = update.getCallbackQuery().getMessage().getChatId(); userId = update.getCallbackQuery().getFrom().getId(); userName = update.getCallbackQuery().getFrom().getFirstName(); receivedMessage = update.getCallbackQuery().getData(); botAnswerUtils(receivedMessage, chatId, userName); >> private void botAnswerUtils(String receivedMessage, long chatId, String userName) < switch (receivedMessage)< case "/start": startBot(chatId, userName); break; case "/help": sendHelpText(chatId, HELP_TEXT); break; default: break; >> private void startBot(long chatId, String userName) < SendMessage message = new SendMessage(); message.setChatId(chatId); message.setText("Hi, " + userName + "! I'm a Telegram bot.'"); message.setReplyMarkup(Buttons.inlineMarkup()); try < execute(message); log.info("Reply sent"); >catch (TelegramApiException e) < log.error(e.getMessage()); >> private void sendHelpText(long chatId, String textToSend) < SendMessage message = new SendMessage(); message.setChatId(chatId); message.setText(textToSend); try < execute(message); log.info("Reply sent"); >catch (TelegramApiException e) < log.error(e.getMessage()); >> >
switch вынесли в отдельный метод, добавили обработку команд, в том числе и нажатие кнопок.
Подключение Telegram-бота на Java к базе данных
Перед началом работы установите PostgerSQL, если СУБД ещё не установлена. В случае, если вы работаете с другими СУБД, просто измените настройки доступа в файле config.properties. Для тех же, кто работает с PostgerSQL, config.properties будет выглядеть примерно так:
bot.name = юзернейм_вашего_бота bot.token = токен_вашего_бота bot.chatId = id_нужного_чата #db related settings spring.jpa.database = PostgreSQL spring.jpa.show-sql = false # для автоматического создания/обновления таблицы в бд spring.jpa.hibernate.ddl-auto = update spring.datasource.driverClassName = org.postgresql.Driver # ниже прописываете порт и название бд spring.datasource.url = jdbc:postgresql://localhost:5432/tg # ваши кредлы для доступа к бд spring.datasource.username = postgres spring.datasource.password = root
В директорию проекта добавляем пакет database . В нём следует создать:
@Data @Entity(name = "tg_data") //привязываемся к существующей таблице с готовыми колонками public class User < @Id private long id; //BigInt private String name; //Text private int msg_numb; //Integer >
2. Интерфейс UserRepository :
public interface UserRepository extends CrudRepository
Данный интерфейс нам нужен для удобной работы с CrudRepository — интерфейсом данных Spring для общих операций CRUD. Сюда же вшиваем запрос на апдейт нашей таблицы: добавление +1 сообщения пользователю в случае, если он написал в чат.
В классе CounterTelegramBot объявим новый интерфейс с аннотацией @Autowired , которая говорит Spring, что в это поле нужно инжектнуть бин:
@Autowired private UserRepository userRepository;
Там же создаём метод добавления пользователя в базу данных, если он написал впервые, и просто обновление столбца сообщений, если пользователь уже существует:
private void updateDB(long userId, String userName) < if(userRepository.findById(userId).isEmpty())< User user = new User(); user.setId(userId); user.setName(userName); //сразу добавляем в столбец каунтера 1 сообщение user.setMsg_numb(1); userRepository.save(user); log.info("Added to DB: " + user); >else < userRepository.updateMsgNumberByUserId(userId); >>
Финально обновим метод onUpdateReceived в классе CounterTelegramBot :
@Override public void onUpdateReceived(@NotNull Update update) < long chatId = 0; long userId = 0; String userName = null; String receivedMessage; if(update.hasMessage()) < chatId = update.getMessage().getChatId(); userId = update.getMessage().getFrom().getId(); userName = update.getMessage().getFrom().getFirstName(); if (update.getMessage().hasText()) < receivedMessage = update.getMessage().getText(); botAnswerUtils(receivedMessage, chatId, userName); >> else if (update.hasCallbackQuery()) < chatId = update.getCallbackQuery().getMessage().getChatId(); userId = update.getCallbackQuery().getFrom().getId(); userName = update.getCallbackQuery().getFrom().getFirstName(); receivedMessage = update.getCallbackQuery().getData(); botAnswerUtils(receivedMessage, chatId, userName); >if(chatId == Long.valueOf(config.getChatId())) < updateDB(userId, userName); >>
Примечание Вы можете не делать ограничение по 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 и небольшого пет-проекта, который можно представить в своём резюме, такая программа вполне подойдёт.
Остались вопросы? Задавайте их в комментариях к этой статье.


