Особенности создания телеграм-бота на 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-бот на 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-методы аннотациями).
Вот что вышло в
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, однако перед релизом стоит пересоздать бота и вынести эти настройки из кода — например, в переменные окружения (об этом ниже).
Получился вот такой
Bot.java
import lombok.Getter; import org.telegram.telegrambots.extensions.bots.commandbot.TelegramLongPollingCommandBot; import org.telegram.telegrambots.meta.api.methods.send.SendMessage; import org.telegram.telegrambots.meta.api.objects.Message; import org.telegram.telegrambots.meta.api.objects.Update; import org.telegram.telegrambots.meta.api.objects.User; import org.telegram.telegrambots.meta.exceptions.TelegramApiException; import ru.taksebe.telegram.mentalCalculation.telegram.commands.operations.MinusCommand; import ru.taksebe.telegram.mentalCalculation.telegram.commands.operations.PlusCommand; import ru.taksebe.telegram.mentalCalculation.telegram.commands.operations.PlusMinusCommand; import ru.taksebe.telegram.mentalCalculation.telegram.commands.service.HelpCommand; import ru.taksebe.telegram.mentalCalculation.telegram.commands.service.SettingsCommand; import ru.taksebe.telegram.mentalCalculation.telegram.commands.service.StartCommand; import ru.taksebe.telegram.mentalCalculation.telegram.nonCommand.NonCommand; import ru.taksebe.telegram.mentalCalculation.telegram.nonCommand.Settings; import java.util.HashMap; import java.util.Map; public final class Bot extends TelegramLongPollingCommandBot < private final String BOT_NAME; private final String BOT_TOKEN; //Класс для обработки сообщений, не являющихся командой private final NonCommand nonCommand; /** * Настройки файла для разных пользователей. Ключ - уникальный id чата */ @Getter private static MapuserSettings; public Bot(String botName, String botToken) < super(); this.BOT_NAME = botName; this.BOT_TOKEN = botToken; //создаём вспомогательный класс для работы с сообщениями, не являющимися командами this.nonCommand = new NonCommand(); //регистрируем команды register(new StartCommand("start", "Старт")); register(new PlusCommand("plus", "Сложение")); register(new MinusCommand("minus", "Вычитание")); register(new PlusMinusCommand("plusminus", "Сложение и вычитание")); register(new HelpCommand("help","Помощь")); register(new SettingsCommand("settings", "Мои настройки")); userSettings = new HashMap<>(); > @Override public String getBotToken() < return BOT_TOKEN; >@Override public String getBotUsername() < return BOT_NAME; >/** * Ответ на запрос, не являющийся командой */ @Override public void processNonCommandUpdate(Update update) < Message msg = update.getMessage(); Long chatId = msg.getChatId(); String userName = getUserName(msg); String answer = nonCommand.nonCommandExecute(chatId, userName, msg.getText()); setAnswer(chatId, userName, answer); >/** * Формирование имени пользователя * @param msg сообщение */ private String getUserName(Message msg) < User user = msg.getFrom(); String userName = user.getUserName(); return (userName != null) ? userName : String.format("%s %s", user.getLastName(), user.getFirstName()); >/** * Отправка ответа * @param chatId id чата * @param userName имя пользователя * @param text текст ответа */ private void setAnswer(Long chatId, String userName, String text) < SendMessage answer = new SendMessage(); answer.setText(text); answer.setChatId(chatId.toString()); try < execute(answer); >catch (TelegramApiException e) < //логируем сбой Telegram Bot API, используя userName >> >
Класс обработки текстовых сообщений
NonCommand.java
import ru.taksebe.telegram.mentalCalculation.exceptions.IllegalSettingsException; import ru.taksebe.telegram.mentalCalculation.telegram.Bot; /** * Обработка сообщения, не являющегося командой (т.е. обычного текста не начинающегося с "/") */ public class NonCommand < public String nonCommandExecute(Long chatId, String userName, String text) < Settings settings; String answer; try < //создаём настройки из сообщения пользователя settings = createSettings(text); //добавляем настройки в мапу, чтобы потом их использовать для этого пользователя при генерации файла saveUserSettings(chatId, settings); answer = "Настройки обновлены. Вы всегда можете их посмотреть с помощью /settings"; //логируем событие, используя userName >catch (IllegalSettingsException e) < answer = e.getMessage() + "\n\n Настройки не были изменены. Вы всегда можете их посмотреть с помощью /settings"; //логируем событие, используя userName >catch (Exception e) < answer = "Простите, я не понимаю Вас. Возможно, Вам поможет /help"; //логируем событие, используя userName >return answer; > /** * Создание настроек из полученного пользователем сообщения * @param text текст сообщения * @throws IllegalArgumentException пробрасывается, если сообщение пользователя не соответствует формату */ private Settings createSettings(String text) throws IllegalArgumentException < //отсекаем файлы, стикеры, гифки и прочий мусор if (text == null) < throw new IllegalArgumentException("Сообщение не является текстом"); >//создаём из сообщения пользователя 3 числа-настройки (min, max, listCount) либо пробрасываем исключение о несоответствии сообщения требуемому формату return new Settings(min, max, listCount); > /** * Добавление настроек пользователя в мапу, чтобы потом их использовать для этого пользователя при генерации файла * Если настройки совпадают с дефолтными, они не сохраняются, чтобы впустую не раздувать мапу * @param chatId id чата * @param settings настройки */ private void saveUserSettings(Long chatId, Settings settings) < if (!settings.equals(Settings.getDefaultSettings())) < Bot.getUserSettings().put(chatId, settings); >> >
Классы команд
Все классы команд наследуются от BotCommand.
Команды в моём боте делятся на 2 группы:
- Сервисные — возвращают справочную информацию;
- Основные — формируют файл с заданиями.
Начнём с более простых Сервисных команд. В абстрактный суперкласс вынесен метод отправки пользователю ответа, а в классах команд формируется текст ответа.
Абстрактный суперкласс Сервисных команд
ServiceCommand.java
import org.telegram.telegrambots.extensions.bots.commandbot.commands.BotCommand; import org.telegram.telegrambots.meta.api.methods.send.SendMessage; import org.telegram.telegrambots.meta.bots.AbsSender; import org.telegram.telegrambots.meta.exceptions.TelegramApiException; /** * Суперкласс для сервисных команд */ abstract class ServiceCommand extends BotCommand < ServiceCommand(String identifier, String description) < super(identifier, description); >/** * Отправка ответа пользователю */ 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
import org.telegram.telegrambots.meta.api.objects.Chat; import org.telegram.telegrambots.meta.api.objects.User; import org.telegram.telegrambots.meta.bots.AbsSender; /** * Команда "Старт" */ public class StartCommand extends ServiceCommand < public StartCommand(String identifier, String description) < super(identifier, description); >@Override public void execute(AbsSender absSender, User user, Chat chat, String[] strings) < //формируем имя пользователя - поскольку userName может быть не заполнено, для этого случая используем имя и фамилию пользователя String userName = (user.getUserName() != null) ? user.getUserName() : String.format("%s %s", user.getLastName(), user.getFirstName()); //обращаемся к методу суперкласса для отправки пользователю ответа sendAnswer(absSender, chat.getId(), this.getCommandIdentifier(), userName, "Давайте начнём! Если Вам нужна помощь, нажмите /help"); >>
В суперклассе Основных команд, помимо аналогичного метода отправки ответов, содержится формирование Word-документа.
OperationCommand.java
import org.telegram.telegrambots.extensions.bots.commandbot.commands.BotCommand; import org.telegram.telegrambots.meta.api.methods.send.SendDocument; import org.telegram.telegrambots.meta.api.methods.send.SendMessage; import org.telegram.telegrambots.meta.api.objects.InputFile; import org.telegram.telegrambots.meta.bots.AbsSender; import org.telegram.telegrambots.meta.exceptions.TelegramApiException; import ru.taksebe.telegram.mentalCalculation.calculation.Calculator; import ru.taksebe.telegram.mentalCalculation.calculation.PlusMinusService; import ru.taksebe.telegram.mentalCalculation.enums.OperationEnum; import ru.taksebe.telegram.mentalCalculation.fileProcessor.WordFileProcessorImpl; import ru.taksebe.telegram.mentalCalculation.telegram.Settings; import java.io.FileInputStream; import java.io.IOException; import java.util.List; /** * Суперкласс для команд создания заданий с различными операциями */ abstract class OperationCommand extends BotCommand < private PlusMinusService service; OperationCommand(String identifier, String description) < super(identifier, description); this.service = new PlusMinusService(new WordFileProcessorImpl(), new Calculator()); >/** * Отправка ответа пользователю */ void sendAnswer(AbsSender absSender, Long chatId, List operations, String description, String commandName, String userName) < try < absSender.execute(createDocument(chatId, operations, description)); >catch (IOException | IllegalArgumentException e) < sendError(absSender, chatId, commandName, userName); e.printStackTrace(); >catch (TelegramApiException e) < //логируем сбой Telegram Bot API, используя commandName и userName >> /** * Создание документа для отправки пользователю * @param chatId id чата * @param operations список типов операций (сложение и/или вычитание) * @param fileName имя, которое нужно присвоить файлу */ private SendDocument createDocument(Long chatId, List operations, String fileName) throws IOException < FileInputStream stream = service.getPlusMinusFile(operations, Bot.getUserSettings(chatId)); SendDocument document = new SendDocument(); document.setChatId(chatId.toString()); document.setDocument(new InputFile(stream, String.format("%s.docx", fileName))); return document; >/** * Отправка пользователю сообщения об ошибке */ private void sendError(AbsSender absSender, Long chatId, String commandName, String userName) < try < absSender.execute(new SendMessage(chatId.toString(), "Похоже, я сломался. Попробуйте позже")); >catch (TelegramApiException e) < //логируем сбой Telegram Bot API, используя commandName и userName >> >
Класс Основной команды на примере
PlusMinusCommand.java
import org.telegram.telegrambots.meta.api.objects.Chat; import org.telegram.telegrambots.meta.api.objects.User; import org.telegram.telegrambots.meta.bots.AbsSender; import ru.taksebe.telegram.mentalCalculation.enums.OperationEnum; /** * Команда получение файла с заданиями на сложение и вычитание */ public class PlusMinusCommand extends OperationCommand < public PlusMinusCommand(String identifier, String description) < super(identifier, description); >@Override public void execute(AbsSender absSender, User user, Chat chat, String[] strings) < //формируем имя пользователя - поскольку userName может быть не заполнено, для этого случая используем имя и фамилию пользователя String userName = (user.getUserName() != null) ? user.getUserName() : String.format("%s %s", user.getLastName(), user.getFirstName()); //обращаемся к методу суперкласса для формирования файла на сложение и вычитание (за это отвечает метод getPlusMinus() перечисления OperationEnum) и отправки его пользователю sendAnswer(absSender, chat.getId(), OperationEnum.getPlusMinus(), this.getDescription(), this.getCommandIdentifier(), userName); >>
Приложение
В методе main инициализируется TelegramBotsApi, в котором и регистрируется Bot.
TelegramBotsApi в качестве параметра принимает Class. Если нет никаких заморочек с прокси, можно использовать DefaultBotSession.class.
Чтобы получать имя и токен бота как переменные окружения, необходимо использовать System.getenv().
Получаем вот такой
MentalCalculationApplication.java
import org.telegram.telegrambots.meta.TelegramBotsApi; import org.telegram.telegrambots.meta.exceptions.TelegramApiException; import org.telegram.telegrambots.updatesreceivers.DefaultBotSession; import ru.taksebe.telegram.mentalCalculation.telegram.Bot; import java.util.Map; public class MentalCalculationApplication < private static final Mapgetenv = 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=
Далее порядок такой:
- Регистрируемся на heroku и идём в консоль;
- mvn clean install ;
- heroku login — после выполнения потребуется нажать любую клавишу и залогиниться в открывшемся окне браузера;
- heroku create — создаём приложение на heroku;
- git push heroku master — пушим в репозиторий heroku;
- heroku config:set BOT_NAME= — добавляем имя бота в переменные окружения;
- heroku config:set BOT_TOKEN= — добавляем токен бота в переменные окружения;
- heroku config:get BOT_NAME (аналогично BOT_TOKEN) — убеждаемся, что переменные окружения установлены верно;
- heroku ps:scale worker=1 — устанавливаем количество контейнеров (dynos) для типа процесса worker (ранее мы выбрали этот тип в Procfile), при этом происходит рестарт приложения;
- В интерфейсе управления приложением в личном кабинете на heroku переходим к логам (прячутся под кнопкой «More» в правом верхнем углу) и убеждаемся, что приложение запущено;
- Тестируем бота через Telegram.
Вместо заключения
Как выяснилось, не только лишь все видели чудесный советский мультик про козлёнка, который учился считать до 10.
Многоуровневое меню телеграмм бот на java
Хочу сделать чтобы при нажатии на кнопку в меню, появлялись новые кнопки(подменю). Не могу это релизовать. То, что пробовал — не помогло. Ниже прикреплю код.
public void setButtons(SendMessage sendMessage) < // Создаем клавиуатуру ReplyKeyboardMarkup replyKeyboardMarkup = new ReplyKeyboardMarkup(); sendMessage.setReplyMarkup(replyKeyboardMarkup); replyKeyboardMarkup.setSelective(true); replyKeyboardMarkup.setResizeKeyboard(true); replyKeyboardMarkup.setOneTimeKeyboard(false); // Создаем список строк клавиатуры Listkeyboard = new ArrayList<>(); // Первая строчка клавиатуры KeyboardRow keyboardFirstRow = new KeyboardRow(); // Добавляем кнопки в первую строчку клавиатуры keyboardFirstRow.add("Кнопка 1"); keyboardFirstRow.add("Кнопка 2"); // Добавляем все строчки клавиатуры в список keyboard.add(keyboardFirstRow); // и устанваливаем этот список нашей клавиатуре replyKeyboardMarkup.setKeyboard(keyboard); if(sendMessage.equals("Кнопка 1"))
Отслеживать
задан 9 фев 2022 в 10:14
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Для этого необходимо создать новую клавиатуру setButtonsNew() и в условие вставить эту клавиатуру if(sendMessage.equals(«Кнопка 1»)) < setButtonsNew()<>>
Отслеживать
ответ дан 25 апр 2022 в 15:39
- java
- telegram-bot
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.11.21.1314
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Простой бот Telegram на Java с нуля

1970-01-01 в 0:00, admin , рубрики: Песочница
Важно для прочтения!
Если ты не против, то изучи ООП и Jav’y прежде, чем учить другие библиотеки. Ибо ты не будешь браться за физику, не выучив математику. Тут то же самое.
Сегодня мы будем писать простейшего бота Telegram, который будет отвечать на команды. Такая статья была, но писали бота на Питоне.
Почему я выбрал именно Jav’y
Java в плане ботов, серверов, плагинов да и вообще программ будет удобнее для меня.
1. Виртуальная машина хоть и долгая, но если обрабатывать события в несколько потоков, то будет работать быстро.(Вообще для многих серверов/мультиплеерных игр в одном потоке не всегда получится обрабатывать события, в Jav’e сделать это гораздо проще)
2. Наличие хорошей документации и Javadoc’ов, которые можно сделать для всех библиотек(не только для системных)
0. А что такое «бот»?
Бот — это профиль в соцсети/мессенджере(в данном случае Telegram) который отвечает на команды.( В любом случае все действия буду происходить после выполнения команды)
Тип чата с ботом — это переписка 1 на 1.
1.С чего же начинать?
Здесь качать библиотеку Telegram(обязательно with-dependiciens)
IDE можно выбрать любую, я бы порекомендовал eclipse.
Импотрируем библиотеку Телеграма и приступаем.
2.Наследование бота
Для того чтобы отвечать на команды, класс должен наследовать TelegramLongPillingBot

package ru.thematdev.bot; import org.telegram.telegrambots.api.objects.Update; import org.telegram.telegrambots.bots.TelegramLongPollingBot; public class Example extends TelegramLongPollingBot < public static void main(String[] args) < ApiContextInitializer.init(); // Инициализируем апи TelegramBotsApi botapi = new TelegramBotsApi(); try < botapi.registerBot(new Bot()); >catch (TelegramApiException e) < e.printStackTrace(); >> @Override public String getBotUsername() < return "USER"; //возвращаем юзера >@Override public void onUpdateReceived(Update e) < // Тут будет то, что выполняется при получении сообщения >@Override public String getBotToken() < return "YOUR_BOT_TOKEN"; //Токен бота >>
Получить токен и username можно вбив в поиск @BotFather и написать ему /newbot
3.Как же нам добавить в него что-нибудь?
В телеграме нет «приветствующего сообщения», но когда мы нажимаем кнопку «Start» чтобы начать общение с ботом, то автоматом прописывается команда «/start», поэтому для начала добавим именно её. В telegramapi нету метода отправить сообщение по типу send(строка), но мы его создадим, после всех войдов пишем:
@SuppressWarnings("deprecation") // Означает то, что в новых версиях метод уберут или заменят private void sendMsg(Message msg, String text) < SendMessage s = new SendMessage(); s.setChatId(msg.getChatId()); // Боту может писать не один человек, и поэтому чтобы отправить сообщение, грубо говоря нужно узнать куда его отправлять s.setText(text); try < //Чтобы не крашнулась программа при вылете Exception sendMessage(s); >catch (TelegramApiException e) < e.printStackTrace(); >>
А в UpdateReceived дописываем это:
Message msg = e.getMessage(); // Это нам понадобится String txt = msg.getText(); if (txt.equals("/start"))
4.Ура, всё получилось, как запустить?
Можно в Runnable JAR File так как у нас есть метод main, но лучше запускать прямо из IDE:

Когда мы запустили бота, зарегистрировали и получили токен у BotFather, то мы можем написать ему /start и увидеть что всё работает. Но бот будет работать только когда он запущен.(Много ему не нужно, за 50-100 рублей/месяц на хостинге можно держать). Также с помощью Telegram API можно отправлять картинки, создавать inline-ботов с кнопками и многое другое, но о этом уже в продолжении…
Спасибо всем за просмотр!
Автор: весёлый усач
