JavaRush /Java Blog /Random-TW /使用 Spring Boot 創建電報機器人
Whiskels
等級 41
Москва

使用 Spring Boot 創建電報機器人

在 Random-TW 群組發布
大家好!在學習的某個階段,您希望從解決問題轉向創建真正的項目,這些項目將構成您的投資組合的基礎。當我開始實習時(我強烈推薦給大家),我收到了一份以自由工作者身分編寫電報機器人的邀請。由於我的知識有限,我編寫了一個相當簡單的機器人(遷移到 Spring 之前的最後一次提交),其中包含三個線程:
  • 訊息接收線程;
  • 訊息發送線程;
  • 事件調度線程(它檢查調度訊息並更新 JSON 中的快取資料)。
在寫這個功能時,我非常依賴這篇文章。一切都運作得很好,但是我對 Spring 的研究越深入,我就越想重構一切,以降低程式的一致性並提高程式碼的品質。SonarLint(一個自動檢查程式碼品質的外掛程式)一直試圖讓我相信,無休止的 while 循環並不是很好。在某個時刻,我下定決心並重寫了所有內容,現在我想與您分享我在重構過程中所獲得的知識。讓我們從基礎知識開始,更具體地說 - 使用TelegramBots-Spring-Boot-Starter 那麼,讓我們開始吧! 讓我們創建一個機器人,它會在回覆任何訊息時打招呼。首先,我們需要建立一個新的 Maven 專案。讓我們為 pom.xml 加入必要的依賴項。將 Java 和 TelegramBots-Spring-Boot-Starter 版本新增至屬性。我們註冊依賴項 - 在這裡我們將擁有上面已經提到的 TelegramBots-Spring-Boot-Starter和 Telegram API使用 Spring Boot 創建電報機器人 - 1TelegramBots-Spring-Boot-Starter 函式庫包括 Spring Boot 和 Telegram API。使用它允許我們以相當簡單的方式在程式碼中聲明機器人,Spring 本身將創建 Bean 並啟動機器人。如果您對此時發生的事情感興趣,請查看庫原始程式碼(在開發環境中或在Github上)。我們還添加了編譯參數:使用 Spring Boot 創建電報機器人 - 2 填寫 pom 後不要忘記更新所有依賴項! 讓我們建立兩個類別 - App 和 Bot,以及資源資料夾中的 application.yaml 檔案。我的專案的結構如下所示:使用 Spring Boot 創建電報機器人 - 3在這個階段,讓我們將機器人的憑證加入 application.yaml 中:
bot:
  name: JavaRushTelegramBot
  token: 22313424:AAF4gck4D8gDhq68E7k0UH8vlyQADhxQhYo
分層表示法使我們能夠避免重複(bot.name、bot.token)並提高可讀性。如果您還沒有創建機器人,您可以按照官方說明創建一個。如果您不想在 application.yaml 中顯示機器人的憑證(這是正確的),請在部署時使用環境變數:
bot:
  name: ${BOT_NAME}
  token: ${BOT_TOKEN}
填寫 Bot 類:
package com.whiskels.telegram.bot;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.telegram.telegrambots.bots.TelegramLongPollingBot;
import org.telegram.telegrambots.meta.api.methods.send.SendMessage;
import org.telegram.telegrambots.meta.api.objects.Update;
import org.telegram.telegrambots.meta.exceptions.TelegramApiException;

// Аннотация @Component необходима, чтобы наш класс распознавался Spring, How полноправный Bean
@Component
// Наследуемся от TelegramLongPollingBot - абстрактного класса Telegram API
public class Bot extends TelegramLongPollingBot {
    // Аннотация @Value позволяет задавать meaning полю путем считывания из application.yaml
    @Value("${bot.name}")
    private String botUsername;

    @Value("${bot.token}")
    private String botToken;

    /* Перегружаем метод интерфейса LongPollingBot
    Теперь при получении messages наш бот будет отвечать сообщением Hi!
     */
    @Override
    public void onUpdateReceived(Update update) {
        try {
            execute(new SendMessage().setChatId(update.getMessage().getChatId())
            .setText("Hi!"));
        } catch (TelegramApiException e) {
            e.printStackTrace();
        }
    }

    // Геттеры, которые необходимы для наследования от TelegramLongPollingBot
    public String getBotUsername() {
        return botUsername;
    }

    public String getBotToken() {
        return botToken;
    }
}
填寫App類別:
package com.whiskels.telegram;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.telegram.telegrambots.ApiContextInitializer;

// Аннотация, которая объединяет в себя @Configuration, @EnableAutoConfiguration, @ComponentScan
@SpringBootApplication
public class App {
    public static void main(String[] args) {
        // Здесь code написан по заветам
        // https://github.com/rubenlagus/TelegramBots/tree/master/telegrambots-spring-boot-starter
        ApiContextInitializer.init();

        SpringApplication.run(App.class, args);
    }
}
如果我們做的一切正確,那麼我們就可以運行 main 並向我們的機器人打招呼。使用 Spring Boot 創建電報機器人 - 4準備好!我們已經成功編寫並啟動了一個電報機器人,它可以向每條傳入的消息打招呼。如果本文對您有用,那麼最好的感謝是您查看我的存儲庫並留下一個星星。在那裡您還可以找到我的電報機器人版本,它有許多有趣的功能:
  • 將使用者儲存在 Postgres 資料庫中;
  • 根據使用者角色授權存取命令;
  • 使用自訂註解@BotCommand和@RequiredRoles來建立訊息處理程序並檢查使用者權限;
  • 支援建立通知計劃。
如果您對任何此功能感興趣,請在評論中寫下,我將嘗試回答或撰寫有關如何重新創建它的詳細文章。PS 這是我關於 JavaRush 的第一篇文章,我想深入了解 Spring JPA 和 @Scheduled 註解的領域,但首先我認為值得撰寫這篇關於如何使用 Spring Boot 建立機器人的指南。已經寫了幾篇關於機器人的文章,但是搜索沒有找到這樣的指南,所以我決定填補這個空白:)我還想提一下 Miroha - 感謝 UpdateHandlers 的想法,我偷了它我自己 :)第 2 部分 第3 部分
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION