CodeGym/Java 博客/随机的/用 Java 创建 Telegram Bot:从概念到部署
John Squirrels
第 41 级
San Francisco

用 Java 创建 Telegram Bot:从概念到部署

已在 随机的 群组中发布
个会员
那么什么是机器人?您可以在此处阅读更多相关信息。首先,您需要查看用于开发 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 系统集成并为小型企业制作机器人——您只受限于您的想象力。继续。使用过 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 上注册,并安装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
就是这样,您的应用程序已启动并正在运行。如果不是,请仔细查看日志。最有可能的是,您的应用程序中的错误导致它失败。 感谢您阅读这么长的文章。我希望有人会发现它有用,并且它会在开发过程中给我带来麻烦的领域为您节省大量时间。
评论
  • 受欢迎
你必须先登录才能发表评论
此页面还没有任何评论