Рубрики
Без рубрики

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

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

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

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

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

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

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

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


            org.telegram
            telegrambots
            3.5

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

public class Bot extends TelegramLongPollingBot {

    /**
     * Method for receiving messages.
     * @param update Contains a message from the user.
     */
    @Override
    public void onUpdateReceived(Update update) {
    String message = update.getMessage().getText();
    sendMsg(update.getMessage().getChatId().toString(), message);
    }

    /**
     * Method for creating a message and sending it.
     * @param chatId chat id
     * @param s The String that you want to send as a message.
     */
    public synchronized void sendMsg(String chatId, String s) {
        SendMessage sendMessage = new SendMessage();
        sendMessage.enableMarkdown(true);
        sendMessage.setChatId(chatId);
        sendMessage.setText(s);
        try {
            sendMessage(sendMessage);
        } catch (TelegramApiException e) {
            log.log(Level.SEVERE, "Exception: ", e.toString());
        }
    }

    /**
     * This method returns the bot's name, which was specified during registration.
     * @return bot name
     */
    @Override
    public String getBotUsername() {
        return "BotName";
    }

    /**
     * This method returns the bot's token for communicating with the Telegram server
     * @return the bot's token
     */
    @Override
    public String getBotToken() {
        return "BotToken";
    }
}

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

public static void main(String[] args) {
        ApiContextInitializer.init();
        TelegramBotApi telegramBotApi = new TelegramBotApi();
        try {
            telegramBotApi.registerBot(Bot.getBot());
        } catch (TelegramApiRequestException e) {
            e.printStackTrace();
        }
}

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

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

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

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

Replykeyboardмаркетинг

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

public synchronized void setButtons(SendMessage sendMessage) {

        // Create a keyboard
        ReplyKeyboardMarkup replyKeyboardMarkup = new ReplyKeyboardMarkup();
        sendMessage.setReplyMarkup(replyKeyboardMarkup);
        replyKeyboardMarkup.setSelective(true);
        replyKeyboardMarkup.setResizeKeyboard(true);
        replyKeyboardMarkup.setOneTimeKeyboard(false);

        // Create a list of keyboard rows
        List keyboard = new ArrayList<>();
        // First keyboard row
        KeyboardRow keyboardFirstRow = new KeyboardRow();

        // Add buttons to the first keyboard row
        keyboardFirstRow.add(new KeyboardButton("Hi"));

        // Second keyboard row
        KeyboardRow keyboardSecondRow = new KeyboardRow();
        // Add the buttons to the second keyboard row
        keyboardSecondRow.add(new KeyboardButton("Help");

        // Add all of the keyboard rows to the list
        keyboard.add(keyboardFirstRow);
        keyboard.add(keyboardSecondRow);
        // and assign this list to our keyboard
        replyKeyboardMarkup.setKeyboard(keyboard);
    }

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

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

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

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

private void setInline() {
        List> buttons = new ArrayList<>();
        List buttons1 = new ArrayList<>();
        buttons1.add(new InlineKeyboardButton().setText("Button").setCallbackData(17));
        buttons.add(buttons1);

        InlineKeyboardMarkup markupKeyboard = new InlineKeyboardMarkup();
        markupKeyboard.setKeyboard(buttons);
    }

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

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

@Override
    public void onUpdateReceived(Update update) {
        if(update.hasMessage()) {
            ThreadClass thread = new ThreadClass(update.getMessage());
        } else  if(update.hasCallbackQuery()) {
            AnswerCallbackThread answerThread = new AnswerCallbackThread(update.getCallbackQuery());
        }
    }

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

public synchronized void answerCallbackQuery(String callbackId, String message) {
        AnswerCallbackQuery answer = new AnswerCallbackQuery();
        answer.setCallbackQueryId(callbackId);
        answer.setText(message);
        answer.setShowAlert(true);
        try {
            answerCallbackQuery(answer);
        } catch (TelegramApiException e) {
            e.printStackTrace();
        }
    }

важный : : :

После отправки такого ответа клиент увидит всплывающее окно, содержащее сообщение. Это окно может исчезнуть через несколько секунд после его появления, или оно может сохраняться до тех пор, пока пользователь не нажмет 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 :

...

    
        ...
       
            org.codehaus.mojo
            appassembler-maven-plugin
            1.1.1
            
                target
                
                    
                        com.home.server.TelegramBot
                        workerBot
                    
                
            
            
                
                    package
                    
                        assemble
                    
                
            
        
    

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

mvn clean install

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

git add .

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

git commit -m "First commit in the project"

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

heroku login

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

git remote add heroku [url]

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

git push heroku master

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

heroku ps:scale worker=1

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

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

Ранее было опубликовано в блоге CodeGym/| .

Оригинал: “https://dev.to/codegym_cc/creating-a-telegram-bot-in-java-from-conception-to-deployment-3a8c”