Пишем бота для Telegram и хостим его на heroku
от Senderman
Всем привет. Наверняка, если вы умеете программировать, и пользуетесь телеграмом, вам приходила в голову мысль написать своего бота, к тому же мессенджер предоставляет свой API для ботов, с хорошей документацией, а туториалов по всему интернету накидано немало. Но даже если вы и написали бота, то возникает следующая проблема: хостинг. Для "легких" проектов отлично подходит heroku, но у новичков нередко случаются проблемы с заливкой своих проектов туда. Об этом и пойдет речь в этой статье.
Для нашего бота я решил взять tgbots-module от @aNNiMON. Т.к. бесплатный аккаунт heroku позволяет создать лишь 5 приложений, то использовать одно приложение для запуска нескольких ботов - отличная идея. Но в данной статье мы рассмотрим лишь одно приложение. Создадим в Intellij IDEA новый gradle-проект. Создадим, согласно гайду на гитхабе (ссылка выше) классы ExampleBot и ExampleBotHandler. Заполним build.gradle:
И напишем простого эхобота. Комментировать не буду, код слишком простой и понятный, да и гайд есть.
Обратите внимание на методы getBotUsername() и getBotToken. В них мы берем токен и ник бота из переменных окружения. Heroku позволяет хранить в закрытом доступе необходимые вам переменные. Но об этом позже.
Далее необходимо создать 2 файла: Procfile (без расширения) и system.properties. Первый нужен, чтобы дать heroku понять, что запускать, а второй - чем запускать. В моем случае это будет выглядеть так:
Procfile:
system.properties:
И т.к. мы используем tgbots-module, создаем файл config.yaml с таким содержанием:
Проект к деплою на heroku готов, теперь - заливаем его на гитхаб (Я тоже залил, чтобы при возникновении сложностей вы смогли посмотреть, как надо было сделать), регистрируем в телеграме бота, а в хероку - регистрируемся и регистрируем новое приложение. Идем на вкладку Settings, жмем "reveal config vars" и заполняем переменные окружения:
token - токен бота из телеграма
username - ник бота без @
GRADLE_TASK - в значение вписываем shadowJar. Это необходимо, чтобы heroku знало, как нужно собирать проект.
Переходим на вкладку deploy и жмем connect to github. В поле repo name вводим имя нашего репо с ботом и жмем Search, далее выбираем нужное и жмем Connect. Обновляем страницу. В самом низу страницы появится кнопка Deploy Branch. Так же, вы можете включить автодеплой при каждом коммите (бесплатно). Ждем пока задеплоится, и переходим на вкладку Resources и обновляем страницу. Напротив команды запуска жмем карандашик, переключаем ползунок и жмем Confirm, а затем быстренько жмем More - view logs. И если все хорошо, идем в телеграм и пишем боту!
Следующая статья →Для нашего бота я решил взять tgbots-module от @aNNiMON. Т.к. бесплатный аккаунт heroku позволяет создать лишь 5 приложений, то использовать одно приложение для запуска нескольких ботов - отличная идея. Но в данной статье мы рассмотрим лишь одно приложение. Создадим в Intellij IDEA новый gradle-проект. Создадим, согласно гайду на гитхабе (ссылка выше) классы ExampleBot и ExampleBotHandler. Заполним build.gradle:
- plugins {
- id 'com.github.johnrengelman.shadow' version '2.0.4'
- id 'java'
- id 'application'
- }
- group 'com.senderman'
- version '1.0'
- mainClassName = 'com.annimon.tgbotsmodule.Runner'
- sourceCompatibility = 10
- repositories {
- mavenCentral()
- }
- dependencies {
- implementation 'com.annimon:tgbots-module:0.1'
- }
- shadowJar {
- mergeServiceFiles()
- exclude 'META-INF/*.DSA'
- exclude 'META-INF/*.RSA'
- }
И напишем простого эхобота. Комментировать не буду, код слишком простой и понятный, да и гайд есть.
- package com.senderman.examplebot;
- import com.annimon.tgbotsmodule.BotHandler;
- import com.annimon.tgbotsmodule.BotModule;
- import com.annimon.tgbotsmodule.Runner;
- import com.annimon.tgbotsmodule.beans.Config;
- import java.util.List;
- public class ExampleBot implements BotModule {
- public static void main(String[] args) {
- final var profile = (args.length >= 1 && !args[0].isEmpty()) ? args[0] : "";
- Runner.run(profile, List.of(new ExampleBot()));
- }
- @Override
- public BotHandler botHandler(Config config) {
- return new ExampleBotHandler();
- }
- }
- package com.senderman.examplebot;
- import com.annimon.tgbotsmodule.BotHandler;
- import org.telegram.telegrambots.meta.api.methods.BotApiMethod;
- 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.exceptions.TelegramApiException;
- import org.telegram.telegrambots.meta.logging.BotLogger;
- public class ExampleBotHandler extends BotHandler {
- @Override
- public String getBotUsername() {
- return System.getenv("username");
- }
- @Override
- public String getBotToken() {
- return System.getenv("token");
- }
- @Override
- public BotApiMethod onUpdate(Update update) {
- if (!update.hasMessage()) {
- return null;
- }
- Message message = update.getMessage();
- if (!message.hasText()) {
- return null;
- }
- String text = message.getText();
- long chatId = message.getChatId();
- SendMessage sm = new SendMessage(chatId, text);
- try {
- execute(sm);
- } catch (TelegramApiException e) {
- BotLogger.error("SEND", e.toString());
- }
- return null;
- }
- }
Обратите внимание на методы getBotUsername() и getBotToken. В них мы берем токен и ник бота из переменных окружения. Heroku позволяет хранить в закрытом доступе необходимые вам переменные. Но об этом позже.
Далее необходимо создать 2 файла: Procfile (без расширения) и system.properties. Первый нужен, чтобы дать heroku понять, что запускать, а второй - чем запускать. В моем случае это будет выглядеть так:
Procfile:
- bot: java -jar build/libs/example_telegram_bot-1.0-all.jar
- java.runtime.version=10.0.2
- log-level: ERROR
- modules:
- - com.senderman.examplebot.ExampleBot
Проект к деплою на heroku готов, теперь - заливаем его на гитхаб (Я тоже залил, чтобы при возникновении сложностей вы смогли посмотреть, как надо было сделать), регистрируем в телеграме бота, а в хероку - регистрируемся и регистрируем новое приложение. Идем на вкладку Settings, жмем "reveal config vars" и заполняем переменные окружения:
token - токен бота из телеграма
username - ник бота без @
GRADLE_TASK - в значение вписываем shadowJar. Это необходимо, чтобы heroku знало, как нужно собирать проект.
Переходим на вкладку deploy и жмем connect to github. В поле repo name вводим имя нашего репо с ботом и жмем Search, далее выбираем нужное и жмем Connect. Обновляем страницу. В самом низу страницы появится кнопка Deploy Branch. Так же, вы можете включить автодеплой при каждом коммите (бесплатно). Ждем пока задеплоится, и переходим на вкладку Resources и обновляем страницу. Напротив команды запуска жмем карандашик, переключаем ползунок и жмем Confirm, а затем быстренько жмем More - view logs. И если все хорошо, идем в телеграм и пишем боту!
Пишем Telegram бота на вебхуках