JavaRush /Java 博客 /Random-ZH /用 Java 创建 Telegram 机器人:从构思到部署
John Watson
第 27 级

用 Java 创建 Telegram 机器人:从构思到部署

已在 Random-ZH 群组中发布
到底什么是机器人?您可以在这里详细了解这一点。首先,您需要阅读用于在 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