到底什么是机器人?您可以在这里详细了解这一点。首先,您需要阅读用于在 Telegram 上开发机器人的库(以下简称 API)的官方文档。她躺在这里。 那里的一切都很容易理解。看起来,写起来就很高兴!但事情没那么简单。在搜索引擎上花了很多时间,我找到了一些关于机器人开发的知识片段,例如如何制作键盘、如何处理CallbackQuery等等。我从未找到过关于用 Java 开发机器人的完整且全面的指南。这促使我写这篇文章。互联网上有许多网站,您可以通过现成的部署创建自己的机器人。但重点是。在大多数情况下,创建的机器人可以提供背景信息等。我们的机器人是一个成熟的 Web 应用程序,您可以绑定数据库、向各种 API 发出请求、解析站点、执行复杂的计算等。问题仅受您的想象力限制。我希望在这些文字中我已经向你们解释了我要写的一些内容。在 Telegram 中注册机器人非常简单;上面链接的文档详细描述了此过程。对于我们的应用程序,您只需要知道机器人的名称和注册时将收到的令牌。本质上,机器人只是一个控制台 Web 应用程序。无前端,纯命令处理。如果您想很好地掌握 Hibernate 或学习如何解析 JSON,那么这个项目适合您。让我们首先在 pom.xml 中包含依赖项(我们假设您使用的是 Maven)。你可以这样做:
InlineKeyboardMarkup 这也是一个数组的数组,它和前面的Markup类似,但是这里的操作逻辑略有不同。这样的键盘与特定消息相关联并且仅针对该消息而存在。这是安装内联键盘的方法
<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() {
return ”BotName”;
}
/**
* The method returns the bot's token to communicate with the Telegram server
* @return token for the bot
*/
@Override
public String getBotToken() {
return ”BotToken”;
}
}
嗯,该方法的内容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”。通过单击这些按钮,一条消息将发送到机器人,消息的文本就是按钮上写的内容。也就是说,如果客户端单击“帮助”,机器人将收到一条带有文本“帮助”的消息。对他来说,就好像客户自己写了“帮助”文字并发送给他。好吧,然后你处理这样的消息。
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
就是这样,您的应用程序正在运行。如果没有发生这种情况,请仔细查看日志;很可能您的应用程序中存在错误导致其崩溃。感谢您阅读这么长的文章,我希望有人觉得它有用,并在我在开发过程中遇到困难的地方节省大量时间。
GO TO FULL VERSION