Телеграм бот на java для самых маленьких

Если вы ни разу не писали Telegram-ботов на Java и только начинаете разбираться эта статья для вас. В ней подробно и с пояснениями описано создание реального бота, автоматизирующего одну конкретную функцию. Можно использовать статью как мануал для создания скелета своего бота, а потом подключить его к своей бизнес-логике.

Предыстория

Когда моя дочь начала изучать арифметику, я между делом накидал алгоритм генерации простых примеров на сложение и вычитание вида 5 + 7 =, чтобы не придумывать и не гуглить для неё задания.

И тут на глаза попалась новость, что Telegram выпустил новую версию Bot API 5.0. Ботов я раньше не писал, и потому решил попробовать поднять бота как интерфейс для своей поделки. Все примеры, которые мне удалось найти, показались либо совсем простыми (нужные мне функции не были представлены), либо очень сложными для новичка. Также мне не хватало объяснений, почему выбран тот или иной путь.

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

Телеграм бот на Java. Создаем проект, интегрируемся с телегой. Урок 1.


Что в статье есть, чего нет

В статье есть про:

  • создание бекенда не-инлайн бота на Java 11 с использованием Telegram Bot Api 5.0;
  • обработка команд вида /dosomething;
  • обработка текстовых сообщений, не являющихся командами (т.е. не начинающихся с «/»);
  • отправку пользователю текстовых сообщений и файлов;
  • деплой и запуск бота на heroku.
  • использование функций ботов, не перечисленных выше (например, создание клавиатур я их сначала добавил, но в итоге они мне просто не пригодились);
  • создание списка заданий;
  • работу с Word-документом;
  • обеспечивающие функции логирование, тесты и т.п.;
  • общение с BotFather (создание бота, получение его токена и формирование списка команд подробно и понятно описано во многих источниках, вот первый попавшийся мануал).

Бизнес-функции бота

Очень кратко, чтобы проще было воспринимать код. Бот позволяет:

  • выдавать пользователю справочную текстовую информацию в ответ на команды /start , /help и /settings ;
  • обрабатывать и запоминать пользовательские настройки, направленные текстовым сообщением заданного формата. Настроек три минимальное + максимальное число, используемые в заданиях, и количество страниц выгружаемого файла;
  • оповещать пользователя о несоблюдении им формата сообщения;
  • формировать Word-файл с заданиями на сложение, вычитание или вперемешку в ответ на команды /plus , /minus и /plusminus с использованием дефолтных или установленных пользователем настроек.

Общий порядок действий

  • разобраться с зависимостями;
  • создать класс бота и реализовать обработку текстовых сообщений пользователя, не являющихся командами;
  • создать классы команд;
  • прописать запуск приложения;
  • задеплоить на heroku.

Зависимости

Для управления зависимостями использовался Apache Maven. Нужные зависимости собственно Telegram Bots и Lombok, использовавшийся для упрощения кода (заменяет стандартные java-методы аннотациями).

Java Tech Talk: Telegram bot on java for 1 hour

Вот что вышло в

pom.xml

*** *** 1.0-SNAPSHOT *** *** jar 11 $ $ UTF-8 1.18.16 4.1.2 5.0.1 org.telegram telegrambots $ org.telegram telegrambotsextensions $ org.projectlombok lombok $ compile $ org.apache.maven.plugins maven-compiler-plugin 3.8.1 $ org.projectlombok lombok $ org.apache.maven.plugins maven-dependency-plugin 3.1.2 copy-dependencies package copy-dependencies org.apache.maven.plugins maven-surefire-plugin 3.0.0-M5

Класс бота и обработка текстовых сообщений

Мой класс Bot унаследован от TelegramLongPollingCommandBot, который, в свою очередь, наследуется от более распространённого в примерах TelegramLongPollingBot.

CommandBot хорош тем, что в нём уже реализованы приём и обработка команд то есть сообщений, начинающихся с «/». Можно создавать отдельные классы команд (подробнее о них ниже), инициализировать их в конструкторе бота и уже в них писать логику их обработки.

В классе Bot таким образом остаётся только логика обработки текстовых сообщений, не являющихся командами. В моём случае это пользовательские настройки или мусорные сообщения, не соответствующие формату. Для лаконичности логику их обработки тоже стоит вынести в отдельный вспомогательный класс, вызывая его метод из переопределенного метода processNonCommandUpdate(Update update) класса Bot.

В качестве параметров для инициализации бота используются его имя и токен, полученные от BotFather. В ходе разработки удобно создать тестового бота и прописать его параметры прямо в коде, чтобы проще было запускать бекенд локально и отлаживать прямо в Telegram, однако перед релизом стоит пересоздать бота и вынести эти настройки из кода например, в переменные окружения (об этом ниже).

Еще по теме:  Id Telegram зачем нужен

Получился вот такой

Bot.java

Класс обработки текстовых сообщений
NonCommand.java

Классы команд

Все классы команд наследуются от BotCommand.

Команды в моём боте делятся на 2 группы:

  • Сервисные возвращают справочную информацию;
  • Основные формируют файл с заданиями.

Начнём с более простых Сервисных команд. В абстрактный суперкласс вынесен метод отправки пользователю ответа, а в классах команд формируется текст ответа.

Абстрактный суперкласс Сервисных команд

ServiceCommand.java

/** * Отправка ответа пользователю */ void sendAnswer(AbsSender absSender, Long chatId, String commandName, String userName, String text) < SendMessage message = new SendMessage(); //включаем поддержку режима разметки, чтобы управлять отображением текста и добавлять эмодзи message.enableMarkdown(true); message.setChatId(chatId.toString()); message.setText(text); try < absSender.execute(message); >catch (TelegramApiException e) < //логируем сбой Telegram Bot API, используя commandName и userName >>>

Класс Сервисной команды на примере
StartCommand.java

В суперклассе Основных команд, помимо аналогичного метода отправки ответов, содержится формирование Word-документа.

OperationCommand.java

Класс Основной команды на примере
PlusMinusCommand.java

Приложение

В методе main инициализируется TelegramBotsApi, в котором и регистрируется Bot.

TelegramBotsApi в качестве параметра принимает Class. Если нет никаких заморочек с прокси, можно использовать DefaultBotSession.class.

Чтобы получать имя и токен бота как переменные окружения, необходимо использовать System.getenv().

Получаем вот такой

MentalCalculationApplication.java

getenv = System.getenv(); public static void main(String[] args) < try < TelegramBotsApi botsApi = new TelegramBotsApi(DefaultBotSession.class); botsApi.registerBot(new Bot(getenv.get(«BOT_NAME»), getenv.get(«BOT_TOKEN»))); >catch (TelegramApiException e) < e.printStackTrace(); >>>

Деплой на heroku

Для начала нужно создать в корне проекта файл Procfile и написать в него одну строку:
worker: java -Xmx300m -Xss512k -XX:CICompilerCount=2 -Dfile.encoding=UTF-8 -cp ./target/classes:./target/dependency/*
, где worker это тип процесса.

Если в проекте используется версия Java, отличная от 8, также необходимо создать в корне проекта файл system.properties и прописать в нём одну строку:
java.runtime.version=

Далее порядок такой:

  1. Регистрируемся на heroku и идём в консоль;
  2. mvn clean install ;
  3. heroku login после выполнения потребуется нажать любую клавишу и залогиниться в открывшемся окне браузера;
  4. heroku create создаём приложение на heroku;
  5. git push heroku master пушим в репозиторий heroku;
  6. heroku config:set BOT_NAME= добавляем имя бота в переменные окружения;
  7. heroku config:set BOT_TOKEN= добавляем токен бота в переменные окружения;
  8. heroku config:get BOT_NAME (аналогично BOT_TOKEN) убеждаемся, что переменные окружения установлены верно;
  9. heroku ps:scale worker=1 устанавливаем количество контейнеров (dynos) для типа процесса worker (ранее мы выбрали этот тип в Procfile), при этом происходит рестарт приложения;
  10. В интерфейсе управления приложением в личном кабинете на heroku переходим к логам (прячутся под кнопкой More в правом верхнем углу) и убеждаемся, что приложение запущено;
  11. Тестируем бота через Telegram.

Вместо заключения

Как выяснилось, не только лишь все видели чудесный советский мультик про козлёнка, который учился считать до 10.

Источник: personeltest.ru

Telegram-бот на Java для самых маленьких — от старта до бесплатного размещения на heroku

Telegram-бот на Java для самых маленьких — от старта до бесплатного размещения на heroku

Если вы ни разу не писали Telegram-ботов на Java и только начинаете разбираться — эта статья для вас. В ней подробно и с пояснениями описано создание реального бота, автоматизирующего одну конкретную функцию. Можно использовать статью как мануал для создания скелета своего бота, а потом подключить его к своей бизнес-логике.

Предыстория

Когда моя дочь начала изучать арифметику, я между делом накидал алгоритм генерации простых примеров на сложение и вычитание вида «5 + 7 =», чтобы не придумывать и не гуглить для неё задания.

И тут на глаза попалась новость, что Telegram выпустил новую версию Bot API 5.0. Ботов я раньше не писал, и потому решил попробовать поднять бота как интерфейс для своей поделки. Все примеры, которые мне удалось найти, показались либо совсем простыми (нужные мне функции не были представлены), либо очень сложными для новичка. Также мне не хватало объяснений, почему выбран тот или иной путь.

В общем, написано было сразу для умных, а не для меня. Потому я решил описать свой опыт создания простого бота — надеюсь, кому-нибудь это поможет быстрее въехать в тему.
Читать дальше →

from Java – Объектно-ориентированный язык программирования https://ift.tt/3nVnO7s

Leave a Reply Cancel reply

You must be logged in to post a comment.

RSS: Подкаст обо всем – Radio-T

  • Радио-Т 861 June 3, 2023

Темы Reddit API стал очень дорогим — 00:04:02. LLM не подходит для программистов — 00:25:41. fq — как jq но для бинарных данных — 00:38:21. Опять про DI — 00:43:39. Angry Miao HATSU Wireless Split Ergonomic Keyboard — 01:05:13. Темы наших слушателей аудио • лог чата

Еще по теме:  Как изменить цвет текста в Телеграмме на телефоне

Темы Mimestream вышел — 00:05:44. Microsoft Build 2023 — 00:29:13. Хабру 17 лет — 00:54:55. Podman Desktop 1.0 — 01:01:09. GPT достало — 01:18:17.

VPN не надо использовать — 01:28:21. Темы слушателей — 01:46:35. аудио • лог чата

Темы Карго-культ AI — 00:03:43. Apple запрещает ChatGPT — 00:34:52. 20 лет Gentoo — 00:43:48. Позорное падение GitHub — 01:06:20. Clubhouse уволил большую половину — 01:16:52.

Что-то пошло не так с обещаниями — 01:23:37. Темы слушателей — 01:40:12. аудио • лог чата

Темы Google I/O 2023 — очень много AI — 00:01:31. YouTube начинает охоту на блокеры — 00:51:39. Google запускает свой Copilot — 00:55:47. GitHub выкатил новый поиск по коду — 01:01:23. GitHub начал блокировку утекших секретов — 01:05:12.

Anthropic и его 100K контекст — 01:13:57. Темы слушателей — 01:20:50. аудио • лог чата

RSS: Подкаст 5-минутка о PHP

  • Самописные инфраструктурные компоненты February 11, 2023

Тема этого выпуска: самописные инфраструктурные компоненты – зачем они нужны и чем не угодили Open Source аналоги, помимо фатального недостатка? Отвечает Валентин Удальцов – автор телеграм канала Пых https://t.me/phpyh

В этом выпуске Юлия Беймлина, продуктовый методист курса «Английский для разработчиков» от Яндекс Практикума, рассказывает, как эффективно заниматься изучением английского языка, и в чём особенности преподавания для конкретных профессий, например, для разработчиков. В чём отличие преподавания английского языка для различных профессий (программисты, юристы, ученые…)? «Можно говорить грамотно, но неуместно» Английский для разработчика — отличается ли […]

Небольшая заметка с полей. Недавно втянулся в использование SQL синтаксиса LEFT JOIN LATERAL – ключевое слово LATERAL. Буквально по-другому стал смотреть на решение некоторых задач! Проверил по документации, погугил, в популярных PHP ORM – нигде нет поддержки LATERAL, ни в Doctrine, ни в Laravel Query Builder, ни в Yii Query Builder, ни в Cycle ORM […]

RSS: Updates [php.net]

  • PHP 8.1.19 released! May 11, 2023
  • PHP 8.2.6 released! May 11, 2023
  • PHP 8.0.28 released! February 14, 2023

RSS: Подкаст от CSSSR – Новости 512

  • Firefox 113, Next.js 13.4, Vue 3.3, взаимодействие микрофронтендовов, Google Codey May 19, 2023

Форма обратной связи Текстовая версия 0:00:00 Начало выпуска 0:00:27 Интересные публикации Регулярные выражения Взаимодействиее микрофронтендов Сложные типы TS Deopt Explorer Redux-saga Ускорение CI/CD-пайплайна с помощью Yarn Автотесты Cypress в Docker-контейнерах Почему могут падать тесты Jest? Scroll-driven Animations Демо-сайт Scroll-driven Animations Генерация PDF без печати браузера Концепции ванильного JS «Герои 3» в браузере 0:06:16 Новости релизов […]

Форма обратной связи Текстовая версия 0:00:00 Начало эпизода 0:00:29 Интересные публикации Ускорение SPA Модернизация Vox News AbortController Доклад Рича Харриса о вебе Детектив с Unbound XSS атакует, часть 2 XSS атакует, часть 1 Исправление текстов с ChatGPT-4 Транзакции с Ether.js Основы с Ether.js Материалы по веб-разработке 0:04:04 Новости релизов Chrome 113 Chrome DevTools 113 WebGPU […]

Форма обратной связи Текстовая версия 0:00:00 Начало выпуска 0:00:33 Интересные публикации node:test React Server Components Angular Signals ECMAScript 2023 Эксплуатация уязвимостей Chrome, часть 3 [EN] Эксплуатация уязвимостей Chrome, часть 3 [RU] Эволюция менеджмента зависимостей Современный гайд по офрмлению JS-библиотек Фичи JS и TS Вёрстка современных рассылок Can I Email Google Sheets как БД для телеграм […]

RSS: Подкаст uWebDesign – “Суровый Веб”

  • Массовые увольнения в IT, что выбрать для микрофронтендов — подкаст «Суровый веб» March 8, 2023

Работай с нами в Usetech: https://career.usetech.ru Подкаст 254: массовые увольнения в IT, что выбрать для микрофронтендов, Брендан Айк о создании JavaScript за 10 дней, Nuxt 3 и фронтендерская история (икс). ПАГНААААЛЕЕ. 11 В этот раз прешоу слушайте на ютюбе: Прешоу #254. А лучший способ нас поддержать — задонатить на бусти: https://boosty.to/uwebdesign. Темы подкаста Массовые увольнения в […]

Работай с нами в Usetech: https://career.usetech.ru Подкаст 253: прогноз IT экосистемы, бракованные комплектующие для российских производителей электроники, новое оборудование для 7нм техпроцесса, а также осенние новинки от Apple и обзор рабочих мест на удаленке. ПАГНААААЛЕЕ. 11 Прешоу слушайте на бусти, теперь это топ1 способ нас поддержать: Прешоу #253. Темы подкаста «Железные» новинки на октябрьской конференции Apple. […]

Подкаст 252: рассмотрели новинки макбуков на M2, а также старинки на процессорах Baikal и невозможность закупить Intel по B2B. Также обсудили несколько теорий заговора: про хакерские атаки и про цифровизацию жизненно важных сфер, таких как еда! ПАГНААААЛЕЕ. 11 Прешоу слушайте на бусти, теперь это топ1 способ нас поддержать: Прешоу #252. Темы подкаста MacBook Air на M2. […]

Еще по теме:  Звук звонка Телеграмм не выводится в наушники

Источник: webdev.am

Telegram-бот счётчик сообщений на Java и Spring Boot

https://t.me/java_newss

В этой статье я покажу, как написать Telegram-бот на Java с использованием Spring Boot, PostgreSQL и JPA. Также создадим исполняемый jar-файл. Сам же бот будет подсчитывать сообщения от пользователей и записывать эти данные в БД.

Создаём 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 будет выглядеть очень лаконично:

Что здесь происходит?

С остальным, думаю, всё понятно.

Класс Телеграм бота на Java

Давайте теперь выйдем из пакета config и создадим в основном пакете проекта класс бота. Поскольку это бот-счётчик, назовём его CounterTelegramBot.

На старте получаем следующий класс:

Для начала сделаем так, чтобы на команду /start Telegram-бот что-то нам отвечал и выводил в логи сообщение об успехе. Другие сообщения будут выводить в логи «Unexpected message» :

И последним штрихом является инициализация бота. Добавим в пакет config класс Initializer :

Запустите и проверьте работу бота.

Добавление кнопок

Чтобы 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:nn» + «/start — start the botn» + «/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 :

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 . В нём следует создать:

1. Интерфейс UserRepository :

public interface UserRepository extends CrudRepository

Рейтинг
( Пока оценок нет )
Загрузка ...