CodeGym/Java Blog/Toto sisi/用 Java 創建 Telegram Bot:從概念到部署
John Squirrels
等級 41
San Francisco

用 Java 創建 Telegram Bot:從概念到部署

在 Toto sisi 群組發布
個成員
那麼什麼是機器人?您可以在此處閱讀更多相關信息。首先,您需要查看用於開發 Telegram 機器人(以下簡稱“API”)的庫的官方文檔。它可以在這裡找到。
用 Java 創建 Telegram Bot:從概念到部署 - 1
那裡的一切都非常方便和清晰。看來我們只需要寫代碼就可以了!但這不是那麼簡單。找了很久,發現了一些bot開發的知識花絮,比如鍵盤的製作,手柄的操作CallbackQuery,等等。但是,我沒有找到完整、詳盡的 Java 機器人開髮指南。這促使我寫了這篇文章。有很多網站,您可以在其中創建自己的易於部署的機器人。但事實是,創建的大多數機器人都提供參考信息等。我們的機器人是一個成熟的網絡應用程序。您可以綁定數據庫、執行各種 API 請求、解析網站、執行複雜計算等等。可能性僅受您的想像力限制。我希望以上內容有助於闡明我要寫的內容。在 Telegram 上註冊機器人非常容易。這個過程在上面鏈接的文檔中有詳細描述。對於我們的應用程序,您只需要知道機器人的名稱和您在註冊機器人時收到的令牌。基本上,機器人只是一個基於控制台的網絡應用程序。沒有前端,只是純命令處理。如果你想掌握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 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";
    }
}
現在main方法的內容:
public static void main(String[] args) {
        ApiContextInitializer.init();
        TelegramBotApi telegramBotApi = new TelegramBotApi();
        try {
            telegramBotApi.registerBot(Bot.getBot());
        } catch (TelegramApiRequestException e) {
            e.printStackTrace();
        }
}
填寫方法getBotUsername()getBotToken()方法後,啟動機器人。目前,它只是將我們發送給它的任何消息重定向給我們,有點像“鏡子”。它是這樣工作的:當您啟動應用程序時,它開始向 Telegram 服務器發送請求,每 n 秒一次,URL 為: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 rows
        List<KeyboardRow> 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 個按鈕,上面寫著“嗨”“幫助”,一個在另一個下面。單擊其中一個按鈕時,會向機器人發送一條包含按鈕文本的消息。因此,如果客戶端單擊“幫助”,機器人將收到一條帶有“幫助”的消息。對於機器人來說,似乎客戶端自己寫了“幫助”並將文本發送給機器人。然後你處理消息。

內聯鍵盤標記

這也是一個數組的數組。它與之前的標記類似,但這裡的邏輯略有不同。這種類型的鍵盤附加到特定的消息,並且只為它而存在。這是設置內聯鍵盤的方法:
private void setInline() {
        List<List<InlineKeyboardButton>> buttons = new ArrayList<>();
        List<InlineKeyboardButton> buttons1 = new ArrayList<>();
        buttons1.add(new InlineKeyboardButton().setText("Button").setCallbackData(17));
        buttons.add(buttons1);

        InlineKeyboardMarkup markupKeyboard = new InlineKeyboardMarkup();
        markupKeyboard.setKeyboard(buttons);
    }
List在 中 創建一個List,並將內聯按鈕添加到第一行。此按鈕可以包含一個 URL、一個頻道鏈接或一個CallbackQuery,稍後我將對此進行介紹。這是我們設置按鈕文本的地方,這是用戶將看到的內容,然後我們設置將發送給機器人的數據。在我們的示例中,用戶看到“Hi”,當按下按鈕時,數字 17 將發送給機器人。這是我們的CallbackQuery。關於 的幾句話CallbackQuery。要從對Update像中獲取此數據,您需要執行update.getCallbackQuery(). 此方法返回一個CallbackQuery,您可以從中訪問傳遞給機器人的數據。不要試圖通過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());
        }
    }
如果有消息,我們將它發送到一個新線程進行處理;如果有CallbackQuery,我們發送到適當的線程進行處理。您可以向 發送回复CallbackQuery。Telegram 中的每個對像都有自己的 ID。要向特定的 發送響應CallbackQuery,您只需要知道它的 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();
        }
    }
重要的:對 a 的回復中的文本CallbackQuery不得超過 200 個字符!發送此類響應後,客戶端將看到一個包含該消息的彈出窗口。此窗口可能會在出現幾秒鐘後消失,也可能會一直存在,直到用戶按下 OK。要切換模式,我們調用該answer.setShowAlert(true)方法。如果您傳遞true給該方法,則該窗口會一直存在,直到按下“確定”為止。如果你傳遞 false,那麼它會在 5 秒後消失。這些都是Telegram Bot 庫的基本功能。如果需要,您可以學習如何發送多媒體、地理定位等內容。 讓我們繼續將我們的機器人部署到託管平台。對於我的項目,我選擇了Heroku. 我認為這是一個相當方便的託管平台,帶有自己的 CLI。它是免費的,但在此計劃中,您的機器人將在 30 分鐘未收到任何請求後進入休眠狀態。它會在收到請求時醒來。這種情況發生得如此之快,您甚至不會注意到(當然,除非數據庫連接沒有重新啟動)。免費計劃受 5MB 數據庫、100MB 磁盤空間、每月 2TB 數據和 1 個 dyno 的限制。dyno 是您正在運行的應用程序。我會馬上說是部署給我帶來了困難,因為我以前從未部署過我的應用程序。在部署期間,Heroku 需要一個名為 Procfile 的文件(沒有擴展名)。我們在項目根目錄中創建它。在裡面,我們寫worker: sh target/bin/workerBot,其中workerBot是在 中指定的名稱pom.xml。灰_Maven 應用程序組裝器插件(appassembler-maven-plugin) 生成的腳本將啟動。該腳本描述瞭如何啟動已編譯的 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 上註冊,並安裝GitHeroku CLI。如果您的應用程序需要數據庫,那麼請不要忘記在創建新應用程序時添加所需的數據庫。此外,您需要確定數據庫的主機、用戶名、密碼和端口,然後在您的應用程序中指明它們。接下來,在部署之前,使用Maven構建您的項目。
mvn clean install
首先,我們轉到我們的項目目錄並使用命令初始化存儲庫git init。然後我們將我們的項目添加到這個存儲庫。
git add .
然後我們提交更改
git commit -m "First commit in the project"
接下來,您需要登錄到 heroku。在命令行中寫入以下內容
heroku login
輸入您在註冊期間創建的憑據。之後,確定您的存儲庫在 heroku 上的 URL。您可以在設置中執行此操作。然後我們寫
git remote add heroku [url]
為您的存儲庫添加了一個遠程 heroku 存儲庫。接下來我們寫
git push heroku master
然後我們等待...如果應用程序部署成功,執行以下命令
heroku ps:scale worker=1
就是這樣,您的應用程序已啟動並正在運行。如果不是,請仔細查看日誌。最有可能的是,您的應用程序中的錯誤導致它失敗。 感謝您閱讀這麼長的文章。我希望有人會發現它有用,並且它會在開發過程中給我帶來麻煩的領域為您節省大量時間。
留言
  • 受歡迎
你必須登入才能留言
此頁面尚無留言