那么什么是机器人?您可以在此处阅读更多相关信息。首先,您需要查看用于开发 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 系统集成并为小型企业制作机器人——您只受限于您的想象力。继续。使用过 bot 的人都知道,使用以“ ”字符开头的命令与它们进行交互很方便/
,例如/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