問候,我親愛的朋友們。是的,是的,完全是朋友。我已經對這一系列文章變得如此熟悉,以至於那些經常在評論中寫下感激之情和/或表明他們已閱讀並理解這些材料的人已經變得很親密。你我正從兩個方向朝著同一個目標前進。你想明白,但我想解釋。我們有相同的最終目標 - 一份您從頭到尾都可以理解的書面申請。您可能已經聽說過我將在本文中描述的大部分內容。我不認為我會告訴你任何新的和非凡的東西(但在專案的框架內有必要知道/重複這一點)。 今年春天,我為自己編寫了一個機器人,因此我們將依賴它的「模式」。
我們寫JRTB-2
我們將執行與任務JRTB-0文章相同的操作:- 我們使用ctrl + t組合更新本地專案中的主分支。
- 基於主分支,我們創建:
- 添加機器人。
- 我們建立一個新的提交,其中包含已完成操作的描述,並將其推送到 GitHub。
- 為主分支建立拉取請求並再次檢查。我們正在等待建置完成(github actions),將其合併到主分支中。
- 關閉相應的任務。
什麼是電報機器人
我們,開發人員,可以想像與這樣的電報機器人一起工作:我們使用他們的客戶端與他們一起工作。我們有一個現成的工作庫。在執行一系列操作後,電報機器人就會知道它與我們的程式相關聯。在程式中我們將學習如何接收信件、命令並以某種方式處理它們。電報機器人中存在著命令這樣的東西:它以斜線“/”開頭。之後,我們立即將這個詞寫在一起,這將被視為一個命令。例如有兩個指令大家都應該知道:- /start — 開始使用機器人;
- /stop - 結束與機器人的工作。
使用 BotFather 創建機器人
要連接機器人,您首先需要創建它。Telegram 有一種方法 - 創建一個具有自己獨特名稱的機器人。它還會附帶一個令牌(一個類似密碼的大字串)。我已經為 JavaRush 創建了一個機器人 - @javarush_community_bot。這個機器人仍然是空的,什麼都做不了。最主要的是名稱末尾應該有_bot。為了展示如何做到這一點,我將創建一個機器人,我們將在其上測試我們的功能。就實際項目而言,這將是一個測試環境。我們的主要環境將是 prod 環境(prod - 生產,即專案將執行的真實環境)。當然,可以添加另一個環境——沙箱環境:一個通用的沙箱,對所有開發參與者來說更加可變和可訪問。但這只會使專案創建階段的情況變得更加複雜。現在,我們再創建兩個機器人用於測試和沙盒環境。第一步是在 Telegram 本身中創建(註冊)一個機器人。我們需要找到機器人:@BotFather並向其寫入命令: /newbot接下來,我們需要為此機器人命名。由於這是一個用於測試任務的機器人,因此它的名稱將是合適的: [TEST] JavarushBot現在是時候給出一個可以始終找到它的唯一名稱 - 它的用戶名: test_javarush_community正如我上面所說,您需要加入_bot使用者名稱的後綴,所以我們再寫一次: test_javarush_community_bot就這樣!機器人已創建。現在,使用用戶名和令牌,它可以連接到我們的項目。當然,為了測試伺服器的順利運行,我不會將這個機器人的代幣(本質上是存取機器人的密碼)顯示給公眾查看。我們將機器人連接到項目
我們不會像往常一樣包含該庫,但會立即利用我們的骨架 - 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 專案。根據描述,我們只需要建立一個新類,繼承自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() - 因此,這是機器人令牌。
- 機器人.用戶名;
- 機器人令牌。
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 中尋找我們的機器人:從日誌中我們看到機器人已經啟動。所以,是時候去 Telegram 寫信給機器人了:我們點擊開始,我們立即收到答案:讓我們再寫一些廢話來檢查:就是這樣,此時我們可以說我們的 JRTB-2 任務已經完成。您還不能真正在這裡編寫任何測試,因此我們將保留一切原樣。接下來,您需要建立一個新的提交:請注意提交的名稱:我再次提請您注意這一點。提交首先包含任務的名稱,然後是已完成操作的更詳細描述。點擊“提交並推送...” ,然後再次點擊“推送”進行確認:轉到我們的專案。和以前一樣,GitHub 已經看到了新分支,並提出為 main 建立拉取請求。我們不抗拒並創造它:像往常一樣,我們已經選擇了一個標籤、一個項目並將其分配給我。最後,按一下「建立拉取請求」。讓我們等一下建置完成 - 就這樣,拉取請求已準備好合併:
版本控制
我不知何故錯過了我們需要進行版本控制的這一點。為此,我們將在我們的分支中進行更多更改。我們回到IDEA,查看記憶體中的專案版本:版本為0.0.1-SNAPSHOT。這是值班版本。我們將首先用每個新解決的問題更新項目的版本。在我們達到 MVP 之前,該版本將帶有後綴 -SNAPSHOT。版本控制方案是什麼? XYZ-快照 其中:- X-主要版本更新,常包含與先前版本向後相容的問題;
- Y——變化不大,完全相容於先前的版本;
- Z 是我們發現並修復的缺陷的計數器。
GO TO FULL VERSION