Telegram-бот на вебхуках — Java+Spring, Redis, клавиатуры и деплой на Heroku — снова для самых маленьких
Это вторая статья в моей серии «для самых маленьких» — предыдущая была посвящена «классическому» Telegram-боту, наследуемому от TelegramLongPollingBot .
Для кого написано
Если вы ни разу не писали Telegram-ботов на Java с использованием вебхуков и только начинаете разбираться — эта статья для вас. В ней подробно и с пояснениями описано создание реального бота, автоматизирующего одну конкретную функцию. Можно использовать статью как мануал для создания скелета своего бота, а потом подключить его к своей бизнес-логике.
Я пытаюсь писать как для себя, а не сразу для умных — надеюсь, кому-нибудь это поможет быстрее въехать в тему.
Предыстория
Учить словарные слова — занятие довольно скучное, а если делать это в лоб, ещё и малоэффективное, поэтому я решил разработать для дочери задания такого вида:

Ребёнок сначала выбирает правильный вариант, а затем закрепляет его написанием. По ощущениям, запоминание идёт неплохо. Дело оставалось за малым — написать бота и составить словари неправильных написаний.
Что в статье есть, чего нет
В статье есть про:
- создание бекенда Telegram-бота на вебхуках на Java 11 с использованием Spring;
- использование базы данных Redis;
- отправку пользователю текстовых сообщений и файлов;
- подключение постоянных и временных клавиатур;
- локальный запуск бота для дебага;
- деплой и запуск бота на Heroku, включая подключение к проекту Heroku Redis.
- использование функций ботов, не перечисленных выше;
- работу с Apache POI — создание Word и Excel файлов;
- общение с BotFather (создание бота, получение его токена и формирование списка команд подробно и понятно описано во многих источниках, вот первый попавшийся мануал;
- создание и загрузку в БД словарей по умолчанию.
Бизнес-функции бота
- создавать Word-файлы с заданиями из имеющихся словарей (стандартных или пользовательского);
- скачивать имеющиеся словари в Excel-файлы (для корректировки и последующей загрузки в качестве пользовательского словаря);
- загружать пользовательский словарь;
- выводить справку.

Порядок разработки
- разобраться с зависимостями;
- сконфигурировать БД;
- создать бота;
- реализовать обработку сообщений, включая работу с клавиатурами;
- раскурить приём и отправку файлов;
- завести локально;
- задеплоить на heroku.
Зависимости
Для управления зависимостями используем Apache Maven. Нужные зависимости — собственно Telegram Spring Boot, Redis и Lombok, использовавшийся для упрощения кода (заменяет стандартные java-методы аннотациями).
Вот что вышло в
Конфигурируем Redis
К классу Word напрямую я не обращаюсь, поэтому для него репозиторий не нужен.
Создаём бота
Начнём с добавления в application.yaml (или application.properties , если так привычнее) трёх настроек:
- telegram.webhookPath — адрес вебхука, который должен быть зарегистрирован в Telegram (об этом ниже, в разделе «Запускаем локально»);
- telegram.botUsername и telegram.botToken — имя и токен бота, полученные от BotFather.
MessageHandler и CallbackQueryHandler — обработчики (соответственно) сообщений и нажатий на кнопки инлайн-клавиатур (подробнее ниже, в разделе «Обрабатываем сигналы»).
Методы класса направляют получаемый от пользователей сигнал в необходимый класс-обработчик в зависимости от его типа (сообщение или нажатие на кнопку инлайн-клавиатуры).
Для создания бина бота нам нужна ещё одна конфигурация —
Бот готов, осталось научить его общаться с пользователем.
Обрабатываем сигналы
Как уже говорилось, наш бот получает от пользователя сигналы двух типов — сообщения и нажатия на кнопки инлайн-клавиатур. Эти сигналы обрабатываются в классах MessageHandler и CallbackQueryHandler , а маршрутизация между ними осуществляется в классе бота WriteReadBot (его код чуть выше, в разделе «Создаём бота»).
Классы-обработчики служат связующим звеном между ботом и бизнес-логикой решаемой задачи — в зависимости от конкретного полученного значения происходит обращение к нужного методу внешнего сервиса. Код этих классов можно посмотреть в этом пакете на Github, а в статье рассмотрим только две ключевых детали — создание клавиатур и работу с файлами.
Постоянная клавиатура
Чтобы сразу было понятно, вот это она:

Постоянная клавиатура — это основное меню бота. Она создаётся в отдельном классе путём создания отдельных кнопок, затем их рядов и, в завершении, присвоения клавиатуре нужных признаков —
Для удобства названия кнопок можно вынести в отдельный ButtonNameEnum (на GitHub), но это необязательно — можно прописать их текстом прямо в классе.
Инициализируется клавиатура в рамках обработки команды /start (то есть при первом обращении пользователя к боту) в классе-обработчике сообщений MessageHandler . Необходимо
Кроме того, в классе MessageHandler надо не забыть обработать текстовые сообщения, отличные от названий кнопок — наш бот в этом случае призывает пользователя воспользоваться клавиатурой.
Инлайн-клавиатуры

В нашем боте инлайн-клавиатуры используются для выбора пользователем словаря и отображаются в ответ на команды основного меню «Создать файл с заданиями» и «Скачать словарь». Состав кнопок отличается всего на одну позицию — при обработке команды «Скачать словарь» добавляется кнопка «Шаблон». Кроме того, если пользователь загрузил в базу данных свой словарь, при обработке обеих команд в клавиатуру добавляется кнопка «Ваш словарь».
Также, как и постоянная клавиатура, инлайн-версия формируется в отдельном классе
В отличие от кнопок постоянных клавиатур, инлайн-кнопкам можно добавлять не только название (которое видит пользователь), но и ответное значение, которое будет отправлено при нажатие на неё.
Инициализация инлайн-клавиатуры происходит
Отправка и получение файлов
Наш бот умеет как отправлять пользователю готовые файлы заданий и словарей, так и получать от него пользовательский словарь для загрузки в базу данных.
Отправка и загрузка файлов происходит в отдельном классе, в котором реализовано REST-взаимодействие с сервисами Telegram —
Методы этого класса используются в классах-обработчиках MessageHandler и CallbackQueryHandler .
Для отправки файла пользователю необходимо перевести его в объект класса ByteArrayResource и отправить POST-запрос на адрес вида:
https://api.telegram.org/bot<токен бота>/sendDocument?chat_id=<id чата>
При загрузке пользовательского файла в составе объекта Document приходит идентификатор файла. Чтобы скачать файл, необходимо отправить GET-запрос на адрес вида:
https://api.telegram.org/bot<токен бота>/getFile?file_id=<id файла>
Следует обратить внимание, что скачивается объект File из пакета org.telegram.telegrambots.meta.api.objects , и для последующего использования мы переводим его в привычный java.io.File .
Подключаем Heroku Redis для локального запуска
Идём на Heroku и выполняем алгоритм:
- Зарегистрироваться (если нет аккаунта)
- Создать проект — нажать «New»/«Create new app» в правой части экрана
- Перейти на вкладку «Resources»
- В разделе «Add-ons» ввести в поисковую строку «Heroku Redis», выбрать её в результатах поиска
- Подтвердить подключение БД к проекту
- В правом верхнем углу нажать на иконку в виде квадрата из синих точек, выбрать пункт Data, в открывшемся списке баз нажать на только что созданную. Первые несколько минут после подключения может тормозить и показывать ошибку
- Перейти на вкладку «Settings»
- Нажать на кнопку «View credentials» в правой части экрана
- Вуаля, перед Вами настройки подключения к БД
Заполняем application.yaml :
spring.redis.database: 0
spring.redis.host: <хост БД Redis, копируем с Heroku>
spring.redis.port: <порт БД Redis, копируем с Heroku>
spring.redis.password: <пароль БД Redis, копируем с Heroku>
spring.redis.ssl: true
Запускаем локально
Нам осталось сделать вебхук и зарегистрировать его в Telegram.
Для получения внешнего адреса при локальном запуске используем утилиту ngrok по вот этой инструкции. Не забываем добавить в application.yaml настройки telegram.webhook-path (выдаст ngrok) и server.port (передаётся ngrok в качестве параметра)
Регистрируем вебхук в Telegram, формируя в строке браузера запрос вида:
https://api.telegram.org/bot<токен бота>/setWebhook?url=<URL, полученный от ngrok>
… и запускаем приложение в своей IDE!
Деплоим на Heroku
Если используется версия Java, отличная от 8, необходимо в корне проекта создать файл system.properties , содержащий одну строку:
java.runtime.version=11
Ещё один специфический для Heroku файл Procfile в данном случае можно не добавлять, он будет сгенерирован автоматически на основе pom.xml .
Сначала нужно обязательно удалить/закомментировать в application.yaml настройки подключения к БД — она подцепится автоматически, поскольку подключена к проекту на Heroku. Если оставить эти настройки, ничего не заведётся, они нужны только для внешнего подключения к этой БД.
- в консоли heroku create <имя приложения> (либо heroku git:remote -a <название проекта> , если приложение на Heroku уже было создано ранее)
- в интерфейсе Heroku создать в проекте БД Heroku Redis (если ранее это не было сделано — алгоритм выше, в разделе «Запускаем локально»)
- в консоли mvn clean install
- в консоли git push heroku master
- в консоли heroku ps:scale web=1 — установить количество используемых контейнеров (dynos) для типа процесса web
- открыть приложение — нажать на кнопку «Open app» в интерфейсе Heroku, убедиться, что оно запустилось (должна отображаться надпись «Whitelabel Error Page» — значит, успех)
- зарегистрировать вебхук в Telegram (алгоритм выше, в разделе «Запускаем локально»), используя URL из адресной строки предыдущего пункта
При необходимости в интерфейсе Heroku на вкладке «Deploy» можно переключить деплой на GitHub-репозиторий (по запросу или автоматически).
Что можно доделать
Как известно, Heroku гасит веб-приложения, которые не используются какое-то время, поэтому на первое сообщение бот может отвечать порядка 8-10 секунд — он ждёт, когда приложение развернётся с нуля. Это позволяет на бесплатном тарифе хостить много редко используемых веб-приложений — в тарифе учитывается только время аптайма.
Чтобы заставить приложение работать постоянно, можно добавить в проект пинг по расписанию условного Google, но нужно понимать, что в этом случае бот будет съедать львиную долю бесплатного тарифа. Я жадный, я так делать не буду.
Создание Telegram-бота на Java: от идеи до деплоя
Для начала вам необходимо ознакомиться с официальной документацией к библиотеке для разработки ботов на 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 кнопки, на которых будет написано Привет и Помощь, друг под дружкой.
По нажатию на эти кнопки боту будет отправлено сообщение, текст которого представляет собой то, что написано на кнопке. То есть если клиент нажмет «Помощь», то боту придет сообщение с текстом “Помощь“. Для него это как будто бы клиент сам написал текст “Помощь“ и отправил бы ему. Ну а затем вы обрабатываете такие сообщения.
InlineKeyboardMarkup
Это тоже массив массивов, он похож на предыдущий Markup, но логика работы здесь немного другая. Такая клавиатура привязывается к определенному сообщению и существует только для него. Вот метод для установки Inline-клавиатуры
Создаем List в List , добавляем в первую строку Inline-кнопку. Такая кнопка может содержать URL, ссылку на канал или же CallbackQuery , о которой я напишу чуть позже. Здесь мы устанавливаем текст для нашей кнопки, который будет видеть пользователь, а затем устанавливаем данные, которые будут отправлены боту. В нашем примере пользователь видит «Привет», а боту при нажатии отправится число 17, это и есть наш CallbackQuery .
Пару слов о CallbackQuery . Для получения таких данных из объекта Update нужно выполнить update.getCallbackQuery() , этот метод возвращает CallbackQuery , из которого уже можно получить данные, переданные боту. Не нужно пытаться получить эти данные через метод update.getMessage().getText() , получите NullPointerException .
Если есть сообщение, отправляем на обработку в новый поток сообщение, если есть CallbackQuery , отправляем его на обработку в соответствующий поток.
На CallbackQuery можно отправлять ответ. У каждого объекта в Telegram есть свой id. Для отправки ответа на определенный CallbackQuery нужно знать лишь его id, который мы получим из соответствующего объекта. Для отправки ответа вызовем такой метод:
ВАЖНО: Текст в ответе на CallbackQuery должен быть не длиннее 200 символов!
При отправке такого ответа клиент получит всплывающее окно, в котором будет написано сообщение. Такое окно может исчезнуть через несколько секунд само после появления, а может висеть до тех пор, пока пользователь не нажмет ок. Для переключения этих режимов мы вызываем метод answer.setShowAlert(true) . При true окошко висит до нажатия ок, при false исчезает через 5 секунд.
В принципе это все базовые фишки библиотеки Telegram bot. Такие вещи как отправка мультимедиа, геолокации и тд вы при желании сможете освоить из документации.
Давайте перейдем к деплою нашего бота на хостинге.
Для своего проекта я выбрал Heroku, тк по моему мнению это достаточно удобный хостинг, который имеет свой CLI. Он бесплатен, но на таком тарифе ваш бот при отсутствии запросов будет уходить в спячку через 30 минут. Когда же к нему будет отправлен запрос, он просыпается. Это происходит довольно быстро, вы даже не заметите(если конечно коннект к БД не поднимается заново). Ограничение на бесплатный тариф — 5MБ база данных, 100МБ дисковое пространство, 2ТБ траффика в месяц, 1 дино. Дино — это ваше запущенное приложение.
Скажу сразу, именно стадия деплоя вызвала у меня трудности, так как я до этого никогда не разворачивал свои приложения.
Heroku при деплое требует наличия файла с именем Procfile(без расширения). Создаем его в корне проекта, пишем туда worker: sh target/bin/workerBot
workerBot – имя, которое мы указываем в pom.xml
Будет запускаться sh скрипт, генерируемый с помощью Maven плагина appassembler-maven-plugin. В скрипте описан запуск скомпилированного jar. Имя запускаемого класса указывается между <mainClass></mainClass>, имя скрипта между <name></name> pom.xml:
Перед началом этого процесса вам следует зарегистрироваться на Heroku, установить Git и Heroku CLI. Если вашему приложению необходима БД, то при оформлении нового приложения не забудьте добавить нужную вам БД. Далее вам необходимо узнать host, username, password и port вашей БД, а после указать в своем приложении. Далее перед деплоем выполните сборку вашего проекта с помощью Maven.
Для начала мы переходим в каталог нашего проекта, инициализируем репозиторий командой git init
Затем добавляем в этот репозиторий свой проект
После коммитим изменения
Далее вам нужно залогиниться на heroku, пишем в командной строке
Вводим свои данные, указаные при регистрации. После вам нужно узнать URL вашего репозитория на heroku, делается это в настройках. Затем пишем
Для вашего репозитория добавится удаленный репозиторий heroku. Далее пишем
Ждем… При успешном деплое приложения выполняем команду
И все, ваше приложение запущено. Если же этого не произошло, просмотрите внимательно логи, скорее всего возникает ошибка в вашем приложении, из-за которой оно упало.
Спасибо за прочтение такой длинной статьи, надеюсь кому-нибудь это окажется полезным и сэкономит массу времени в тех местах, где я спотыкался при разработке.
Создание 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. Далее мы пишем
Тогда мы будем ждать… если приложение успешно развернуто, выполните следующую команду
И все, ваше приложение запущено и запущено. Если это не так, внимательно просмотрите журналы. Скорее всего, ошибка в вашем приложении привела к его сбою.
Спасибо, что прочитали такую длинную статью. Я надеюсь, что кто-нибудь найдет это полезным и что это сэкономит вам много времени в тех областях, которые доставляли мне проблемы во время разработки.
Java как добавить кнопки в телеграмм бот
- Open with Desktop
- View raw
- Copy raw contents Copy raw contents
Copy raw contents
Copy raw contents
Lesson 6. Inline keyboards and editing message’s text
I published poll in our Telegram chat about next lesson. So, as you are reading this, Bots API 2.0 won.

On April 9, 2016, Telegram released Bot API 2.0 which allows you to edit message’s text and send new Inline Keyboards. So, let’s implement it to your bot and see how its beautiful. Now as always open IntelliJ Idea , within src folder create files Main.java and BotApi20.java . First look:
I recommend you always look in the Bot API description so you know every method and type. Okey, lets make bot answer to the /start command:
And now lets add Inline Keyboard to this message:
It looks like this now:

We want to edit message text right? Let’s do it when user press our button. Add a Callback Query handler to your bot:
So if update has Callback query, it call this else if operator. Moving forward:
Now when user press our button it will change it’s text:

You can also find all source code to all of my lessons at GitHub.
Thank you for reading this! Now you can send Inline Keyboards and edit message’s text and extra: handle callback queries. I hope you liked this lesson. Next time I will show how to create users database using MongoDB. Bye!