Lesson 1. Writing your first "echo" bot
Hello! If you want to know, how to code Telegram Bots on Java, you are on the right way!
Prepare to launch
Bot API is based on HTTP-requests, but in this book I will use Rubenlagus' library for Java.
Install the library
You can install TelegramBots library with different methods:
- Using Maven:
- Using Jitpack
- Or just download .jar file with dependencies from here
In this tutorial I will use next machines:
- Ubuntu 16.04 Server with 1GB of RAM
- My home Windows 10 laptop with IntelliJ Idea pre-installed
Lets go to code!
Well, enough for words. Let's get down to buisness. In this lesson we will write simple bot that echoes everything we sent to him. Now, open IntelliJ Idea and create a new project. You can call it whatever you want. Then, dont forget to install TelegramBots library with preffered method. I think, that it is most easy to just download .jar from here
Now, when you are in the project, create files MyAmazingBot.java and Main.java within the src directory. Open MyAmazingBot.java and lets write our actual bot:
Remember! The class must extends TelegramLongPollingBot and implement necessary methods
As you can understand, getBotUsername() and getBotToken() must return bot's username and bot's token, obtained from @BotFather. So now, our MyAmazingBot.java file will look like this:
Now, let's move on to the logic of our bot. As I said before, we want him to reply every text we send to him. onUpdateReceived(Update update) method is for us. When an update recieved, it will call this method.
Good! But how do I run the bot? Well, its a good question. Lets save that file and open Main.java . This file will instantiate TelegramBotsApi and register our new bot. It will look like this:
Now, lets initialize Api Context
Instantiate Telegram Bots API:
And register our bot:
Here is all our files:
Well done! Now we can pack our project into runnable .jar file and run it on our computer/server!
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>
Далее порядок такой:
- Регистрируемся на 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.
Что можно доделать
Heroku периодически перезапускает приложение, и тогда введённые пользователем настройки удаляются. Можно добавить к проекту БД (например, Heroku Redis, как в другом моём боте), чтобы этого избежать.
Я делать этого не буду, так как обычно печатаю сразу много заданий, и каждое следующее обращение к боту в любом случае начинается с введения новых настроек. Но если кто возьмётся, буду рад проконсультировать.
Программируйте во имя добра
После того как Пашка Дуров с помощью Роскомнадзор провел грамотную маркетинговую кампанию Telegram, многие по достоинству оценили API, которое позволяет интегрироваться с этим мессенджером посредством ботов.
Да, как бы мы не относились к личности Павла и его эпатажным выходкам — механизм ботов в Telegram выглядит изящным, красивым и продуманным решением.
Поэтому грех будет не написать своего бота, а то у всех есть, а у нас. Как-то неудобно даже.
Если вы не боитесь своими действиями пополнить армию Скайнет и приблизить закат человечества от железной руки роботов — тогда за мной. Программируй ботов во имя добра!

Боты — это хорошо. Это очень хорошо. Telegram-бот — это некая программа, которая выглядит как пользователь и умеет взаимодействовать с пользователями и другими ботами в Telegram.
Вот по этой ссылке находится официальная документация API Telegram-ботов. Если вы находитесь в стране запрещенных ботов, то скорее всего, эта ссылка будет у вас недоступна. Но вы же знаете, что делать?=) В крайнем случае — есть документация и на русском языке.
Согласно документации, Telegram Bot API представляет собой основанный на HTTP интерфейс для разработчиков, заинтересованных в создании ботов. Конечно, использовать чистые HTTP-запросы не так удобно, но, к счастью, добрые люди уже написали хорошую библиотеку на Java, ее мы и возьмем.