那麼什麼是機器人?您可以在此處閱讀更多相關信息。首先,您需要查看用於開發 Telegram 機器人(以下簡稱“API”)的庫的官方文檔。它可以在這裡找到。
那裡的一切都非常方便和清晰。看來我們只需要寫代碼就可以了!但這不是那麼簡單。找了很久,發現了一些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 上註冊,並安裝Git和Heroku 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
就是這樣,您的應用程序已啟動並正在運行。如果不是,請仔細查看日誌。最有可能的是,您的應用程序中的錯誤導致它失敗。
GO TO FULL VERSION