JavaRush /Java Blog /Random-TW /在專案中加入電報機器人 - 《Java 專案從 A 到 Z》
Roman Beekeeper
等級 35

在專案中加入電報機器人 - 《Java 專案從 A 到 Z》

在 Random-TW 群組發布
問候,我親愛的朋友們。是的,是的,完全是朋友。我已經對這一系列文章變得如此熟悉,以至於那些經常在評論中寫下感激之情和/或表明他們已閱讀並理解這些材料的人已經變得很親密。你我正從兩個方向朝著同一個目標前進。你想明白,但我想解釋。我們有相同的最終目標 - 一份您從頭到尾都可以理解的書面申請。您可能已經聽說過我將在本文中描述的大部分內容。我不認為我會告訴你任何新的和非凡的東西(但在專案的框架內有必要知道/重複這一點)。 「Java 專案從頭到尾」:為專案添加電報機器人 - 1今年春天,我為自己編寫了一個機器人,因此我們將依賴它的「模式」。

我們寫JRTB-2

我們將執行與任務JRTB-0文章相同的操作:
  1. 我們使用ctrl + t組合更新本地專案中的分支。「Java 專案從頭到尾」:為專案添加電報機器人 - 2
  2. 基於主分支,我們創建:「Java 專案從頭到尾」:為專案添加電報機器人 - 3
  3. 添加機器人。
  4. 我們建立一個新的提交,其中包含已完成操作的描述,並將其推送到 GitHub。
  5. 為主分支建立拉取請求並再次檢查。我們正在等待建置完成(github actions),將其合併到主分支中。
  6. 關閉相應的任務。

什麼是電報機器人

我們,開發人員,可以想像與這樣的電報機器人一起工作:我們使用他們的客戶端與他們一起工作。我們有一個現成的工作庫。在執行一系列操作後,電報機器人就會知道它與我們的程式相關聯。在程式中我們將學習如何接收信件、命令並以某種方式處理它們。電報機器人中存在著命令這樣的東西:它以斜線“/”開頭。之後,我們立即將這個詞寫在一起,這將被視為一個命令。例如有兩個指令大家都應該知道:
  • /start — 開始使用機器人;
  • /stop - 結束與機器人的工作。
剩下的我們自己來做。讓我立即預訂:我們將按照我學到的方式去做。當與機器人合作時,我確信可以做得更好。如果有人願意這樣做,我會很高興,並將盡一切可能支持這項努力。 順便說一句,如果有人向我解釋如何透過程式碼而不是透過電報中的機器人設定來編程命令描述,那將是很酷的第一件事。我沒學過這個。 我們的資源中有幾篇文章描述瞭如何製作基本的機器人:今天我們將做類似的事情。如果您還有其他疑問,我建議您瀏覽一下本文

使用 BotFather 創建機器人

要連接機器人,您首先需要創建它。Telegram 有一種方法 - 創建一個具有自己獨特名稱的機器人。它還會附帶一個令牌(一個類似密碼的大字串)。我已經為 JavaRush 創建了一個機器人 - @javarush_community_bot。這個機器人仍然是空的,什麼都做不了。最主要的是名稱末尾應該有_bot。為了展示如何做到這一點,我將創建一個機器人,我們將在其上測試我們的功能。就實際項目而言,這將是一個測試環境。我們的主要環境將是 prod 環境(prod - 生產,即專案將執行的真實環境)。當然,可以添加另一個環境——沙箱環境:一個通用的沙箱,對所有開發參與者來說更加可變和可訪問。但這只會使專案創建階段的情況變得更加複雜。現在,我們再創建兩個機器人用於測試和沙盒環境。第一步是在 Telegram 本身中創建(註冊)一個機器人。我們需要找到機器人:@BotFather並向其寫入命令: /newbot「Java 專案從頭到尾」:為專案添加電報機器人 - 4接下來,我們需要為此機器人命名。由於這是一個用於測試任務的機器人,因此它的名稱將是合適的: [TEST] JavarushBot「Java 專案從頭到尾」:為專案添加電報機器人 - 5現在是時候給出一個可以始終找到它的唯一名稱 - 它的用戶名: test_javarush_community「Java 專案從頭到尾」:為專案添加電報機器人 - 6正如我上面所說,您需要加入_bot使用者名稱的後綴,所以我們再寫一次: test_javarush_community_bot「Java 專案從 A 到 Z」:為專案添加電報機器人 - 7就這樣!機器人已創建。現在,使用用戶名和令牌,它可以連接到我們的項目。當然,為了測試伺服器的順利運行,我不會將這個機器人的代幣(本質上是存取機器人的密碼)顯示給公眾查看。

我們將機器人連接到項目

我們不會像往常一樣包含該庫,但會立即利用我們的骨架 - SpringBoot。他有一個像Starter這樣的東西。透過包含該庫,我們可以使用它讓 SpringBoot 知道我們想要正確配置專案。如果我們要走通常的路線(在很多地方都有描述),我們需要在某個地方創建一個配置,其中包含如下內容:
ApiContextInitializer.init();
TelegramBotsApi telegramBotsApi = new TelegramBotsApi();
try {
  telegramBotsApi.registerBot(Bot.getBot());
} catch (TelegramApiRequestException e) {
  e.printStackTrace();
}
這裡創建了一個對象,您可以用它與機器人建立連接。在我們的例子中,我們想要連接的啟動器將在「引擎蓋下」的某個地方為我們做所有事情(這也是 IT 中經常使用的短語 - under the hood 的翻譯)。這是此入門指南的連結。您可以立即從 README.md 檔案中看到它是什麼、為什麼以及如何使用它。要連接它,你只需要將這個依賴添加到記憶體中。這就是全部:) 這是所需的依賴:
<dependency>
        <groupId>org.telegram</groupId>
        <artifactId>telegrambots-spring-boot-starter</artifactId>
        <version>5.0.1</version>
    </dependency>
我們將它添加到我們的記憶中。我們按預期安裝版本並更新 Maven 專案。「Java 專案從頭到尾」:為專案添加電報機器人 - 8根據描述,我們只需要建立一個新類,繼承自TelegramLongPollingBot,並將該類別加入我們的SpringBoot的Application Context中。 應用程式上下文是儲存運行項目所建立的物件的地方。若要新增類別,需要使用以下註解之一:@Component、@Service、@Repository、@Controller。或者,如果透過配置類別(即使用 Configuration 註解標記的類別)中的方法創建,則為 @Bean 註解。 我知道這一切可能仍然令人難以理解。但當你開始弄清楚這一點時,你會發現這並沒有什麼複雜的。為了快速理解Spring Boot,我推薦一本很酷的書——Spring In Action 5th edition。如果有願望,我可以根據這本書寫一系列文章。我們回去吧。在包含 JavarushTelegramBotApplication 的套件中,我們建立bot包,其中將包含我們的電報機器人。它的名稱將是JavaRushTelegramBot
package com.github.javarushcommunity.jrtb.bot;

import org.telegram.telegrambots.bots.TelegramLongPollingBot;
import org.telegram.telegrambots.meta.api.objects.Update;

/**
* Telegrambot for Javarush Community from Javarush community.
*/
@Component
public class JavarushTelegramBot extends TelegramLongPollingBot {

   @Override
   public void onUpdateReceived(Update update) {

   }

   @Override
   public String getBotUsername() {
       return null;
   }

   @Override
   public String getBotToken() {
       return null;
   }
}
這個類別是抽象的,必須實作三個方法。讓我們更詳細地討論它們:
  • onUpdateReceived(Update update) - 這是來自使用者的訊息到達的入口點。所有新的邏輯都將來自這裡;
  • getBotUsername() - 在這裡您需要新增我們將要連接的機器人的使用者名稱;
  • getBotToken() - 因此,這是機器人令牌。
本質上,它就像網站的登入名稱和密碼。我們暫時不會明確地寫入該值。這稱為「硬編碼」(即綁定一些特定值 - 像往常一樣,從英文硬程式碼中綁定描圖紙)。你不應該這樣做。我們將採用另一種方​​式 - 我們將這些資料寫入application.properties類別並從這裡讀取它。為什麼這是必要的?然後,這樣當應用程式啟動時,我們就可以在外部設定這些值。很靈活,就對了。前往檔案 src/main/resources/application.properties。在那裡我們將為這些變數命名。具有 .properties 副檔名的檔案被讀取為由「=」分隔的鍵值結構,每一對都是單獨的行。所以我想出了這些變數:
  • 機器人.用戶名;
  • 機器人令牌
它看起來像這樣:「Java 專案從頭到尾」:為專案添加電報機器人 - 9SpringBoot 有一個很棒的註解 - @Value。如果使用正確,它將從 application.properties 檔案中提取值。我們用這個更新項目:
package com.github.javarushcommunity.jrtb.bot;

import org.springframework.beans.factory.annotation.Value;
import org.telegram.telegrambots.bots.TelegramLongPollingBot;
import org.telegram.telegrambots.meta.api.objects.Update;

/**
* Telegram bot for Javarush Community from Javarush community.
*/
@Component
public class JavarushTelegramBot extends TelegramLongPollingBot {

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

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

   @Override
   public void onUpdateReceived(Update update) {

   }

   @Override
   public String getBotUsername() {
       return username;
   }

   @Override
   public String getBotToken() {
       return token;
   }
}
可以看到我們將變數的值傳遞給了註解。當 SpringBoot 建立我們的 bot 物件時,將從屬性中取得值(同樣,來自英文的描圖紙 - 屬性)。我們快到了。您需要讓機器人回答一些問題。因此,我們來更新一下onUpdateReceived方法。我們需要檢索發送給機器人的訊息並將其傳回。這樣我們就知道機器人正在工作。為此,我們將粗略地快速寫出所需的內容:
@Override
public void onUpdateReceived(Update update) {
   if(update.hasMessage() && update.getMessage().hasText()) {
       String message = update.getMessage().getText().trim();
       String chatId = update.getMessage().getChatId().toString();

       SendMessage sm = new SendMessage();
       sm.setChatId(chatId);
       sm.setText(message);

       try {
           execute(sm);
       } catch (TelegramApiException e) {
           //todo add logging to the project.
           e.printStackTrace();
       }
   }
}
這裡的一切都非常簡單:我們檢查訊息是否確實存在,因此我們提取訊息本身 ( message ) 和發生通訊的聊天 ID ( chatId )。接下來,我們建立一個用於發送訊息的物件SendMessage,將訊息本身和聊天 ID 傳遞給它 - 即發送給機器人的內容和發送地點。我們已經受夠了。接下來,我們執行JavarushTelegramBotApplication類別中的 main 方法,並在 Telegram 中尋找我們的機器人:「Java 專案從頭到尾」:為專案添加電報機器人 - 10從日誌中我們看到機器人已經啟動。所以,是時候去 Telegram 寫信給機器人了:「Java 專案從頭到尾」:為專案添加電報機器人 - 11我們點擊開始,我們立即收到答案:「Java 專案從頭到尾」:為專案添加電報機器人 - 12讓我們再寫一些廢話來檢查:「Java 專案從頭到尾」:為專案添加電報機器人 - 13就是這樣,此時我們可以說我們的 JRTB-2 任務已經完成。您還不能真正在這裡編寫任何測試,因此我們將保留一切原樣。接下來,您需要建立一個新的提交:「Java 專案從頭到尾」:為專案添加電報機器人 - 14請注意提交的名稱:我再次提請您注意這一點。提交首先包含任務的名稱,然後是已完成操作的更詳細描述。點擊“提交並推送...” ,然後再次點擊“推送”進行確認:「Java 專案從頭到尾」:為專案添加電報機器人 - 15轉到我們的專案。和以前一樣,GitHub 已經看到了新分支,並提出為 main 建立拉取請求。我們不抗拒並創造它:「Java 專案從頭到尾」:為專案添加電報機器人 - 16像往常一樣,我們已經選擇了一個標籤、一個項目並將其分配給我。最後,按一下「建立拉取請求」。讓我們等一下建置完成 - 就這樣,拉取請求已準備好合併:「Java 專案從頭到尾」:為專案添加電報機器人 - 17

版本控制

我不知何故錯過了我們需要進行版本控制的這一點。為此,我們將在我們的分支中進行更多更改。我們回到IDEA,查看記憶體中的專案版本:「Java 專案從頭到尾」:為專案添加電報機器人 - 18版本為0.0.1-SNAPSHOT。這是值班版本。我們將首先用每個新解決的問題更新項目的版本。在我們達到 MVP 之前,該版本將帶有後綴 -SNAPSHOT。版本控制方案是什麼? XYZ-快照 其中:
  • X-主要版本更新,常包含與先前版本向後相容的問題;
  • Y——變化不大,完全相容於先前的版本;
  • Z 是我們發現並修復的缺陷的計數器。
基於此,我們將擁有第一個版本 - 0.1.0-SNAPSHOT - 也就是說,我們還沒有進行重大更新,只是所有內容都有一點點,而且我們還沒有達到 MVP,所以有一個後綴 -SNAPSHOT 。讓我們在記憶體中更改此內容:「Java 專案從頭到尾」:為專案添加電報機器人 - 19轉到 RELEASE_NOTES 文件,我們將在其中描述每個新版本對項目的更改:「Java 專案從頭到尾」:為專案添加電報機器人 - 20我們的第一個條目。現在,隨著後續的每個版本更新,我們將在這裡描述到底發生了什麼。我們提交這個案例,寫一個描述: JRTB-2:更新了專案版本並新增到 RELEASE_NOTES 一切都和以前一模一樣。我們正在等待建置通過,然後可以合併我們的變更。只是這裡會有點不同。我想確保主分支中的每個任務都是單獨的提交,因此簡單地推送合併拉取請求對我們來說不起作用。Git 有 git squash 選項,它將所有提交收集到一起並合併它們。我們選擇這個選項:「Java 專案從 A 到 Z」:為專案新增 Telegram 機器人 - 21點擊“擠壓並合併”,然後我們就可以編輯訊息了,最後會是:「Java 專案從頭到尾」:為專案添加電報機器人 - 22非常方便,最重要的是,需要什麼。順便說一句,我在bitbucket上還沒看到這樣的功能=/確認合併。剩下的唯一一件事就是在我們的面板中將任務更改為“完成”狀態,寫一條帶有拉取請求鏈接的評論並關閉它:「Java 專案從頭到尾」:為專案添加電報機器人 - 23我們的面板現在看起來像這樣:「Java 專案從頭到尾」:為專案添加電報機器人 - 24

結論

今天我們一步步創建了一個telegram bot,並在我們的SpringBoot專案中實現了它。機器人工作並給出答案。我們立即透過屬性存取機器人資料。更多內容:我們將做一件大事 - 執行JRTB-3 - 為我們的專案添加命令模式。哦,還有一件事... 我告訴過你我不會發布令牌,這樣它就不會被使用。但由於我是在接近午夜下班後寫這篇文章的,結果發現我在儲存庫中發布了一個有效的令牌,GitGuardian 在一封信中告訴我這一點:「Java 專案從頭到尾」:為專案添加電報機器人 - 25感謝他們!現在做什麼?將無法再從 git 中刪除它,因為即使我上傳沒有此令牌的新提交,它仍將保留在舊提交中。但我不想刪除並回滾提交。所以我去啟動了已經提到的 BotFather 的令牌。現在令牌在那裡,但不再有效。在發布文章之前,請訂閱我的 GitHub 帳戶以查看其所有程式碼。感謝大家的閱讀,很快再見。

此系列所有資料的清單位於本文開頭。

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION