Как написать бот для telegram java
Перейти к содержимому

Как написать бот для telegram java

  • автор:

 

Создание Telegram-бота на Java: от концепции до развертывания

Создайте своего собственного Telegram-бота с помощью Java. Для начала вам необходимо ознакомиться с официальной документацией библиотеки, используемой для разработки ботов Telegram (далее “API”). Помечено как начинающие, java, программирование, обучение.

  • Автор записи

Так что же такое боты? Вы можете прочитать больше об этом здесь .

Для начала вам необходимо ознакомиться с официальной документацией библиотеки, используемой для разработки ботов Telegram (далее “API”). Его можно найти здесь .

Там все очень доступно и понятно. Кажется, мы можем просто писать код и радоваться! Но все не так просто. Потратив много времени на поиски, я нашел лакомые кусочки знаний о разработке ботов, например, как создать клавиатуру, обрабатывать Запрос обратного вызова и так далее. Но я не нашел полного, исчерпывающего руководства по разработке Java-ботов. Это побудило меня написать эту статью.

Существует множество веб-сайтов, где вы можете создать своего собственного легко развертываемого бота. Но дело в том, что большинство созданных ботов предоставляют справочную информацию и тому подобное. Наш бот – это полноценное веб-приложение. Вы можете привязывать базу данных, выполнять различные запросы API, анализировать веб-сайты, выполнять сложные вычисления и многое другое. Возможности ограничены только вашим воображением. Я надеюсь, что вышесказанное помогло прояснить то, о чем я собираюсь написать.

Зарегистрировать бота в Telegram очень просто. Этот процесс подробно описан в документации, приведенной выше. Для нашего приложения вам нужно только знать имя мальчика и токен, который вы получаете при регистрации бота.

По сути, бот – это просто консольное веб-приложение. Здесь нет интерфейса, только чистая обработка команд. Если вы хотите освоить Hibernate или научиться анализировать JSON , тогда это проект для вас. Давайте начнем с добавления зависимости к pom.xml (Я предполагаю, что вы используете Maven). Вы можете сделать это вот так:

Затем создайте класс бота, который наследует класс TelegramLongPollingBot , и переопределите его методы:

А теперь содержание основного метода:

После заполнения получить имя пользователя бота () () и getBotToken () методы, запустите бота. На данный момент он просто перенаправляет нам любые сообщения, которые мы ему отправляем, что-то вроде “зеркала”. Это работает следующим образом: когда вы запускаете приложение, оно начинает отправлять запросы на сервер Telegram раз в n секунд по следующему URL: https://api.telegram.org/BotToken/getMe , где BotToken — это токен вашего бота. В ответ он получает JSON, содержащий все сообщения. Каждое из этих сообщений обрабатывается библиотекой и передается методу On Update Received(Обновление обновления) как объект Update

Конечно, вы можете настроить бота для работы с помощью webhooks. Вы можете найти инструкции для этого в Интернете. Для простоты мы будем использовать Длительный опрос.

То, как обрабатываются сообщения и что вы отправляете в ответ, ограничено только возможностями языка и библиотеки. Все остальное зависит от вас. Вы можете создать бота, который будет искать для вас видео на YouTube. Вы можете создать бота, который будет отправлять вам то, что вы отправляете себе каждый день, например, капсулу времени годичной давности. Или вы можете научиться интегрироваться с CRM—системами и создавать ботов для малого бизнеса – вы ограничены только своим воображением.

Двигаться дальше. Те, кто пользовался ботами, знают, что с ними удобно взаимодействовать с помощью команд, начинающихся с символа ” / “, например, /start . Но есть более удобный способ: кнопки. Существует два вида кнопок: те, которые отображаются под полем ввода ( Replykeyboardmarkup ), и кнопки, которые находятся непосредственно под сообщением, на которое они связаны ( InlineKeyboardMarkup ). Вы можете получить общее представление о них из их описаний в документации.

Replykeyboardмаркетинг

На самом деле это массив массивов кнопок: Список<Строка клавиатуры > . Вот пример кода, который создает клавиатуру:

Мы вызываем этот метод в методе sendMsg() после передачи ему сообщения. Вот как мы настраиваем клавиатуру для этого сообщения. Когда мы отправим это сообщение пользователю, он увидит текст нашего сообщения и 2 кнопки с надписью ” Привет ” и ” Помощь “, один под другим.

При нажатии на одну из этих кнопок боту отправляется сообщение, содержащее текст кнопки. Итак, если клиент нажмет ” Help “, бот получит сообщение с надписью “Help”. Боту будет казаться, что клиент сам написал ” Help ” и отправил текст боту. А затем вы обрабатываете сообщения.

Встроенная разметка Клавиатуры

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

Создайте List внутри List и добавьте встроенную кнопку в первую строку. Эта кнопка может содержать URL-адрес, ссылку на канал или Запрос обратного вызова , о котором я напишу немного позже. Здесь мы задаем текст нашей кнопки, который будет видеть пользователь, а затем мы задаем данные, которые будут отправлены боту. В нашем примере пользователь видит “Привет”, и при нажатии кнопки боту будет отправлено число 17. Это наш запрос обратного вызова .

Несколько слов относительно Запрос обратного вызова . Чтобы получить эти данные из объекта Update , вам необходимо выполнить update.get Запрос обратного вызова() . Этот метод возвращает Запрос обратного вызова , с помощью которого вы можете получить доступ к данным, переданным боту. Не пытайтесь получить эти данные с помощью метода update.GetMessage().gettext() — вы получите исключение |/NullPointerException .

Если есть сообщение, мы отправляем его в новый поток для обработки; если есть Запрос обратного вызова , мы отправляем в соответствующий поток для обработки. Вы можете отправить ответ на Запрос обратного вызова . Каждый объект в Telegram имеет свой собственный идентификатор. Чтобы отправить ответ на определенный запрос обратного вызова , вам просто нужно знать его идентификатор, который мы получаем от соответствующего объекта. Чтобы отправить ответ, мы вызываем этот метод:

важный : : :

После отправки такого ответа клиент увидит всплывающее окно, содержащее сообщение. Это окно может исчезнуть через несколько секунд после его появления, или оно может сохраняться до тех пор, пока пользователь не нажмет OK. Для переключения режимов мы вызываем метод answer.set showAlert(true) . Если вы передадите методу true , окно сохранится до тех пор, пока не будет нажато OK. Если вы передадите значение false, то оно исчезнет через 5 секунд.

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

Давайте перейдем к развертыванию нашего бота на хостинговой платформе.

Для своего проекта я выбрал Heroku. Я думаю, что это довольно удобная платформа хостинга со своим собственным интерфейсом. Это бесплатно, но на этом плане ваш бот перейдет в спящий режим через 30 минут после получения запросов. Он проснется, когда будет получен запрос. Это происходит так быстро, что вы даже не заметите (если, конечно, соединение с базой данных не перезапустится). Бесплатный план ограничен 5 МБ базы данных, 100 МБ дискового пространства, 2 ТБ данных в месяц и 1 динамо-машиной. Динамо-машина – это ваше запущенное приложение.

Сразу скажу, что именно развертывание вызвало у меня трудности, так как я никогда раньше не развертывал свои приложения.

Во время развертывания Heroku требуется файл с именем Profile (без расширения). Мы создаем его в корне проекта. Внутри мы пишем worker: sh target/bin/worker Bot , где workerBot – это имя , указанное в pom.xml . Запустится скрипт sh, сгенерированный плагином Maven Application Assembler (appassembler-maven-plugin). Сценарий описывает, как запустить скомпилированный jar-файл. Имя класса для запуска указывается между и класс> класс> , в то время как имя скрипта задается между <имя> и > в pom.xml :

Прежде чем начать этот процесс, вы должны зарегистрироваться на Heroku и установить как Git, так и Heroku CLI. Если вашему приложению нужна база данных, то не забудьте добавить необходимую базу данных при создании нового приложения. Далее вам необходимо определить хост, имя пользователя, пароль и порт для вашей базы данных, а затем указать их в вашем приложении. Затем, перед развертыванием, создайте свой проект с помощью Maven.

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

Затем мы фиксируем изменения

Далее вам нужно войти в heroku. Напишите следующее в командной строке

Введите учетные данные, которые вы создали при регистрации. После этого определите URL-адрес вашего репозитория на heroku. Вы делаете это в настройках. Затем мы пишем

Для вашего репозитория добавлен удаленный репозиторий heroku. Далее мы пишем

Тогда мы будем ждать… если приложение успешно развернуто, выполните следующую команду

И все, ваше приложение запущено и запущено. Если это не так, внимательно просмотрите журналы. Скорее всего, ошибка в вашем приложении привела к его сбою.

Спасибо, что прочитали такую длинную статью. Я надеюсь, что кто-нибудь найдет это полезным и что это сэкономит вам много времени в тех областях, которые доставляли мне проблемы во время разработки.

Создание Telegram-бота на Java: от идеи до деплоя

Создание Telegram-бота на Java: от идеи до деплоя - 1

Что же такое вообще боты? Подробно почитать об этом можно здесь. Для начала вам необходимо ознакомиться с официальной документацией к библиотеке для разработки ботов на Telegram(далее API). Лежит она здесь. Там все очень доступно и понятно. Казалось бы, пиши да радуйся! Но не все так просто. Проведя много времени в поисковиках я находил отрывки знаний по разработке ботов, например, как сделать клавиатуру, обработать CallbackQuery и тому подобное. Полного и исчерпывающего руководства для разработки ботов на Java я так и не нашел. Это и натолкнуло меня на написание этой статьи. В Интернете много сайтов, где можно создать своего бота с уже готовым деплоем. Но дело в том. что в своем большинстве создаются боты, которые могут предоставить справочную информацию и прочее. Наш бот — полноценное веб-приложение, к которому можно привязать базу данных, выполнять запросы на различные API, парсить сайты, выполнять сложные вычисления и прочее. Дело ограничено только вашей фантазией. Я надеюсь что в этих строках я немного разъяснил вам о чем собираюсь писать. Бота в Telegram зарегистрировать очень просто, этот процесс подробно описан в документации по ссылке выше. Для нашего приложение необходимо знать только имя бота и токен, который вы получите при регистрации. По сути бот — просто консольное веб-приложение. Никакого фронтенда, чистая обработка команд. Если вы желаете хорошо освоить Hibernate или научиться парсить JSON, то такой проект для вас. Начнем с того чтобы подключить зависимость в pom.xml (подразумеваем что вы используете Maven). Сделать это можно так: Затем создаем класс Bot , унаследуем его от класса TelegramLongPollingBot , переопределив его методы: Ну и содержимое метода main : Вписав в методы getBotUsername() и getBotToken() мы запускаем бота. Пока он только перенаправляет нам любые сообщения, которые мы отправим ему, этакое «зеркало». Работает это все следующим образом: когда вы запускаете приложение, оно начинает раз в n количество секунд отправлять на сервер Telegram GET запрос по следующему URL: https://api.telegram.org/BotToken/getMe, где BotToken – токен вашего бота, получая в ответ JSON, в котором находятся все сообщения. Каждое такое сообщение обрабатывается библиотекой и приходит в метод OnUpdateReceived(Update update) объектом Update . С ним то мы и работаем. В этом вся прелесть Telegram-ботов, они могут работать на любом компьютере, для тестирования нужно просто запустить приложение, не нужно деплоить его на хостинг после каждого изменения. Это очень удобно. Само собой бота можно настроить на работу по вебхуку, руководство можно найти на просторах Интернета, мы будем для простоты работать по LongPolling. То как обрабатывать сообщения и что отправлять в ответ ограничено только лишь средствами языка и библиотекой, все остальное на ваше усмотрение. Вы можете сделать бота, который будет искать для вас видео на YouTube, можете сделать бота, который каждый день будет присылать вам то, что вы отправите себе, к примеру, за год, эдакую капсулу времени. А можете научиться интегрироваться к CRM-системам и делать ботов для малого бизнеса, все ограничено вашей фантазией. Идем дальше. Те, кто пользовался ботами знают, что с ними удобно взаимодействовать командами, начинающимися со знака «/» , например /start . Но есть способ удобнее — кнопки. Есть два вида кнопок: те, что появляются под полем ввода, ReplyKeyboardMarkup и кнопки, которые находятся непосредственно под сообщением, к которому привязаны, InlineKeyboardMarkup . В документации вы можете поверхностно ознакомиться с их описанием. ReplyKeyboardMarkup. По сути это — массив массивов кнопок, List<KeyboardRow<KeyboardButton>> . Вот пример кода, который создает клавиатуру В методе sendMsg() мы вызываем этот метод, передавая ему сообщение, таким образом устанавливая для такого сообщения клавиатуру. Когда мы отправим это сообщение пользователю, то он увидит текст сообщения, который мы установили, а также 2 кнопки, на которых будет написано Привет и Помощь, друг под дружкой. По нажатию на эти кнопки боту будет отправлено сообщение, текст которого представляет собой то, что написано на кнопке. То есть если клиент нажмет «Помощь», то боту придет сообщение с текстом “Помощь“. Для него это как будто бы клиент сам написал текст “Помощь“ и отправил бы ему. Ну а затем вы обрабатываете такие сообщения.

 

Creating a Telegram Bot in Java: from conception to deployment

So what are bots? You can read more about this here.

To start, you need to review the official documentation for the library used to develop Telegram bots (hereafter the “API”). It can be found here.

Everything there is very accessible and clear. It seems we can just write code and rejoice! But it’s not so simple. After spending a lot of time searching, I’ve found tidbits of knowledge on bot development, for example, how to make a keyboard, handle a CallbackQuery , and so forth. But, I didn't find a complete, exhaustive guide for Java bot development. That prompted me to write this article.

There are a lot of websites where you can create your own easily deployable bot. But the fact is, most of the bots created provide reference information and the like. Our bot is a full-fledged web application. You can bind a database, execute various API requests, parse websites, perform complex calculations, and more. The possibilities are limited only by your imagination. I hope that the above has helped clarify what I'm going to write about.

It's very easy to register a bot on Telegram. This process is described in detail in the documentation linked to above. For our application, you only need to know the bot's name and the token you receive when registering the bot.

Basically, a bot is just a console-based web application. There is no front end, just pure command processing. If you want to master Hibernate or learn how to parse JSON, then this is the project for you. Let's start by adding a dependency to pom.xml (I'll assume you're using Maven). You can do that like this:

Then create a Bot class that inherits the TelegramLongPollingBot class, and override its methods:

And now the contents of the main method:

After filling in the getBotUsername() and getBotToken() methods, start the bot. For now, it just redirects to us any messages we send to it, kind of like a "mirror". It works like this: when you start the application, it starts sending requests to the Telegram server, once every n seconds, at the following URL: https://api.telegram.org/BotToken/getMe, where BotToken is your bot's token. In response, it receives JSON containing all the messages. Each of these messages is processed by the library and is passed to the OnUpdateReceived(Update update) method as an Update object. And that's what we work with. Herein lies the beauty of Telegram bots: they can run on any computer, testing it just requires starting the application, and you don't need to deploy it to the host after each change. This is very convenient.

Of course, you can configure a bot to work using webhooks. You can find directions for that on the Internet. For simplicity, we'll use LongPolling.

How messages are processed and what you send in response are only limited by the capabilities of the language and library. Everything else is up to you. You can make a bot that will search YouTube videos for you. You can make a bot that will send you what you send yourself everyday, like a time capsule from a year ago. Or you can learn to integrate with CRM systems and make bots for small businesses—you're only limited by your imagination.

Moving on. Those who have used bots know that it's convenient to interact with them using commands that start with the " / " character, for example, /start . But there is a more convenient way: buttons. There are two kinds of buttons: those that appear under an input field ( ReplyKeyboardMarkup ) and buttons that are directly below the message they're linked to ( InlineKeyboardMarkup ). You can get a basic understanding of them from their descriptions in the documentation.

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

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

Предыстория

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

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

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

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

  • создание бекенда не-инлайн бота на 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-методы аннотациями).

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

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

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

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

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

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

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

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

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

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

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

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

Приложение

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

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

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

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

Деплой на heroku

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

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

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

  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.

Что можно доделать

Heroku периодически перезапускает приложение, и тогда введённые пользователем настройки удаляются. Можно добавить к проекту БД (например, Heroku Redis, как в другом моём боте), чтобы этого избежать.

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

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *