JavaRush /Java Blog /Random-TW /用 Java 創建 Telegram 機器人:從構思到部署
John Watson
等級 27

用 Java 創建 Telegram 機器人:從構思到部署

在 Random-TW 群組發布
到底什麼是機器人?您可以在這裡詳細了解這一點。首先,您需要閱讀用於在 Telegram 上開發機器人的程式庫(以下簡稱 API)的官方文件。她躺在這裡用 Java 創建 Telegram 機器人:從構思到部署 - 1那裡的一切都很容易理解。看起來,寫起來就很高興!但事情沒那麼簡單。在搜尋引擎上花了很多時間,我找到了一些關於機器人開發的知識片段,例如如何製作鍵盤、如何處理CallbackQuery等等。我從未找到關於用 Java 開發機器人的完整且全面的指南。這促使我寫這篇文章。網路上有許多網站,您可以透過現成的部署創建自己的機器人。但重點是。在大多數情況下,創建的機器人可以提供背景資訊等。我們的機器人是一個成熟的 Web 應用程序,您可以綁定資料庫、向各種 API 發出請求、解析網站、執行複雜的計算等。問題僅受您的想像力限制。我希望在這些文字中我已經向你們解釋了我要寫的一些內容。在 Telegram 中註冊機器人非常簡單;上面連結的文檔詳細描述了此過程。對於我們的應用程序,您只需要知道機器人的名稱和註冊時將收到的令牌。本質上,機器人只是一個控制台 Web 應用程式。無前端,純命令處理。如果您想很好地掌握 Hibernate 或學習如何解析 JSON,那麼這個專案適合您。讓我們先在 pom.xml 中包含依賴項(我們假設您使用的是 Maven)。你可以這樣做:
<dependency>
            <groupId>org.telegram</groupId>
            <artifactId>telegrambots</artifactId>
            <version>3.5</version>
</dependency>
然後我們創建一個類Bot,從該類繼承它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 setting up a message and sending it.
     * @param chatId chat id
     * @param s The string 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());
        }
    }

    /**
     * The method returns the name of the bot specified during registration.
     * @return bot name
     */
    @Override
    public String getBotUsername() {
        returnBotName;
    }

    /**
     * The method returns the bot's token to communicate with the Telegram server
     * @return token for the bot
     */
    @Override
    public String getBotToken() {
        returnBotToken;
    }
}
嗯,該方法的內容main
public static void main(String[] args) {
        ApiContextInitializer.init();
        TelegramBotsApi telegramBotsApi = new TelegramBotsApi();
        try {
            telegramBotsApi.registerBot(Bot.getBot());
        } catch (TelegramApiRequestException e) {
            e.printStackTrace();
        }
}
透過將其輸入到方法中getBotUsername()getBotToken()我們啟動了機器人。目前,他只是將我們發送給他的任何訊息重定向給我們,這是一種「鏡子」。一切工作原理如下:當您啟動應用程式時,它開始每隔 n 秒向 Telegram 伺服器發送 GET 請求,地址如下:https://api.telegram.org/BotToken/getMe,其中 BotToken 是您的機器人的令牌,接收包含所有訊息的JSON 回應。每個這樣的訊息都由庫處理並OnUpdateReceived(Update update)作為物件到達該方法Update。這就是我們的工作內容。這就是 Telegram 機器人的優點,它們可以在任何電腦上工作,為了測試您只需要啟動應用程序,無需在每次更改後將其部署到託管。非常舒服。當然,機器人可以配置為使用 webhook 工作;可以在 Internet 上找到手冊;為簡單起見,我們將使用 LongPolling 工作。如何處理訊息以及發送回應內容僅受語言工具和庫的限制,其他一切都由您自行決定。你可以製作一個機器人來為你搜尋 YouTube 上的視頻,你可以製作一個機器人每天都會向你發送你發送給自己的內容,例如,在一年內,一種時間膠囊。或者您可以學習如何整合到 CRM 系統並為小型企業製作機器人,一切都由您的想像力限制。前進。«/»使用過機器人的人都知道,使用以符號開頭的命令與機器人互動非常方便/start。但還有一種更方便的方式——按鈕。有兩種類型的按鈕:出現在輸入欄位下方的按鈕,ReplyKeyboardMarkup以及直接出現在其連結到的訊息下方的按鈕InlineKeyboardMarkup。在文件中,您可以簡要地熟悉它們的描述。 回覆鍵盤標記。 本質上,這是一個按鈕數組的數組List<KeyboardRow<KeyboardButton>>。這是創建鍵盤的範例程式碼
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 strings
        List<KeyboardRow> keyboard = new ArrayList<>();

        // First line of the keyboard
        KeyboardRow keyboardFirstRow = new KeyboardRow();
        // Add buttons to the first line of the keyboard
        keyboardFirstRow.add(new KeyboardButton(“Привет”));

        // Second line of the keyboard
        KeyboardRow keyboardSecondRow = new KeyboardRow();
        // Add buttons to the second line of the keyboard
        keyboardSecondRow.add(new KeyboardButton(“Помощь”);

        // Add all keyboard strings to the list
        keyboard.add(keyboardFirstRow);
        keyboard.add(keyboardSecondRow);
        // and set this list to our keyboard
        replyKeyboardMarkup.setKeyboard(keyboard);
    }
在 方法 中sendMsg(),我們透過向其傳遞訊息來呼叫該方法,從而為該訊息設定鍵盤。當我們將此訊息發送給用戶時,他將看到我們設定的訊息文本,以及兩個相鄰的按鈕,分別顯示「Hello」和「Help」。透過點擊這些按鈕,一則訊息將發送到機器人,其文字就是按鈕上寫的內容。也就是說,如果客戶端點擊“幫助”,機器人將收到一條帶有文字“幫助”的訊息。對他來說,就好像客戶自己寫了「幫助」文字並發送給他。好吧,然後你處理這樣的消息。 InlineKeyboardMarkup 這也是一個陣列的數組,它和前面的Markup類似,但這裡的操作邏輯略有不同。這樣的鍵盤與特定訊息相關聯並且僅針對該訊息而存在。這是安裝內聯鍵盤的方法
private void setInline() {
        List<List<InlineKeyboardButton>> buttons = new ArrayList<>();
        List<InlineKeyboardButton> buttons1 = new ArrayList<>();
        buttons1.add(new InlineKeyboardButton().setText(“Кнопка“).setCallbackData(17));
        buttons.add(buttons1);

        InlineKeyboardMarkup markupKeyboard = new InlineKeyboardMarkup();
        markupKeyboard.setKeyboard(buttons);
    }
List在 中 創建List,在第一行新增一個內嵌按鈕。這樣的按鈕可以包含 URL、頻道連結或CallbackQuery,稍後我將對此進行介紹。在這裡,我們設定用戶將看到的按鈕文本,然後設定將發送到機器人的資料。在我們的範例中,用戶看到“Hello”,點擊時,機器人將收到數字 17,這是我們的CallbackQuery. 關於 的幾句話CallbackQuery。要從物件獲取此類數據,Update您需要執行update.getCallbackQuery(),該方法返回CallbackQuery,從中您已經可以獲得傳輸給機器人的數據。無需嘗試透過update.getMessage().getText()get方法取得此數據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());
        }
    }
如果有訊息,我們將訊息發送到新線程進行處理;如果有訊息CallbackQuery,我們將其發送到適當的線程進行處理。您CallbackQuery可以發送回覆。Telegram 中的每個物件都有自己的 id。要向特定物件發送回應,CallbackQuery我們只需要知道它的 id,我們將從對應的物件接收到該 id。若要傳送回應,請呼叫此方法:
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();
        }
    }
重要的:答案中的文字CallbackQuery不應超過 200 個字元!當發送這樣的回應時,客戶端將收到一個彈出窗口,其中將寫入訊息。這樣的視窗可能會在出現幾秒鐘後消失,或者可能會掛起直到使用者按下「確定」。要切換這些模式,我們呼叫answer.setShowAlert(true). 當true視窗掛起直到您按“確定”時,false它會在 5 秒後消失。原則上,這些都是 Telegram 機器人庫的基本功能。如果您願意,您可以從文件中了解發送多媒體、地理位置等內容。讓我們繼續在託管上部署我們的機器人。對於我的項目,我選擇了 Heroku,因為在我看來,它是一個相當方便的託管,有自己的 CLI。它是免費的,但按照這個速度,如果沒有請求,您的機器人將在 30 分鐘後進入休眠狀態。當一個請求發送給他時,他就會醒來。這種情況發生得非常快,您甚至不會注意到(當然,除非重新建立與資料庫的連線)。免費方案的限制是 5MB 資料庫、100MB 磁碟空間、每月 2TB 流量、1 個 dino。Dino 是您正在運行的應用程式。我馬上就會說,部署階段給我帶來了困難,因為我以前從未部署過我的應用程式。部署時,Heroku 需要一個名為 Procfile(不含副檔名)的檔案。我們在專案的根目錄中建立它,在那裡 寫入worker: sh target/bin/workerBot workerBotpom.xml - 我們在 使用Maven插件appassembler-maven-plugin產生的sh腳本中指定的名稱將被啟動。該腳本描述了運行已編譯的 jar。<mainClass></mainClass>之間表示要啟動的類別的名稱,<name></name>pom.xml之間表示腳本的名稱:
...
<build>
    <plugins>
        ...
       <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>appassembler-maven-plugin</artifactId>
            <version>1.1.1</version>
            <configuration>
                <assembleDirectory>target</assembleDirectory>
                <programs>
                    <program>
                        <mainClass>com.home.server.TelegramBot</mainClass>
                        <name>workerBot</name>
                    </program>
                </programs>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>assemble</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
在開始此過程之前,您應該在 Heroku 上註冊、安裝 Git 和 Heroku CLI。如果您的應用程式需要資料庫,那麼在註冊新應用程式時,請不要忘記新增您需要的資料庫。接下來,您需要找出資料庫的主機、使用者名稱、密碼和端口,然後在應用程式中指定它。接下來,在部署之前,使用 Maven 建置專案。
mvn clean install
首先,我們進入專案的目錄,使用命令初始化儲存庫git init 然後將專案新增到該儲存庫
git add .
當我們提交更改後
git commit -m “First commit in project”
接下來要登入heroku,在命令列中寫入
heroku login
輸入您在註冊時指定的資料。然後你需要在 Heroku 上找到你的儲存庫的 URL,這是在設定中完成的。 然後我們寫
git remote add heroku [url]
heroku 遠端儲存庫將會新增至您的儲存庫。接下來我們寫
git push heroku master
我們正在等待... 如果應用程式部署成功,我們執行命令
heroku ps:scale worker=1
就是這樣,您的應用程式正在運行。如果沒有發生這種情況,請仔細查看日誌;很可能您的應用程式中存在錯誤導致其崩潰。感謝您閱讀這麼長的文章,我希望有人覺得它有用,並在開發過程中遇到困難的地方節省大量時間。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION