JavaRush /Java 博客 /Random-ZH /使用 Spring Boot 创建电报机器人
Whiskels
第 41 级
Москва

使用 Spring Boot 创建电报机器人

已在 Random-ZH 群组中发布
大家好!在学习的某个阶段,您希望从解决问题转向创建真正的项目,这些项目将构成您的投资组合的基础。当我开始实习时(我强烈推荐给大家),我收到了一份以自由职业者身份编写电报机器人的邀请。由于我的知识有限,我编写了一个相当简单的机器人(迁移到 Spring 之前的最后一次提交),其中包含三个线程:
  • 消息接收线程;
  • 消息发送线程;
  • 事件调度线程(它检查调度消息并更新 JSON 中的缓存数据)。
在编写这个功能时,我非常依赖这篇文章。一切都运行得很好,但是我对 Spring 的研究越深入,我就越想重构一切,以降低程序的一致性并提高代码的质量。SonarLint(一个自动检查代码质量的插件)一直试图让我相信,无休止的 while 循环并不是很好。在某个时刻,我下定决心并重写了所有内容,现在我想与您分享我在重构过程中获得的知识。让我们从基础知识开始,更具体地说 - 使用TelegramBots-Spring-Boot-Starter 那么,让我们开始吧! 让我们创建一个机器人,它会在回复任何消息时打招呼。首先,我们需要创建一个新的 Maven 项目。让我们向 pom.xml 添加必要的依赖项。将 Java 和 TelegramBots-Spring-Boot-Starter 版本添加到属性中。我们注册依赖项 - 在这里我们将拥有上面已经提到的 TelegramBots-Spring-Boot-Starter和 Telegram API使用 Spring Boot 创建电报机器人 - 1TelegramBots-Spring-Boot-Starter 库包括 Spring Boot 和 Telegram API。使用它允许我们以相当简单的方式在代码中声明机器人,Spring 本身将创建 Bean 并激活机器人。如果您对此时发生的事情感兴趣,请查看库源代码(在开发环境中或在Github上)。我们还添加了编译参数:使用 Spring Boot 创建电报机器人 - 2 填写 pom 后不要忘记更新所有依赖项! 让我们创建两个类 - App 和 Bot,以及资源文件夹中的 application.yaml 文件。我的项目的结构如下所示:使用 Spring Boot 创建电报机器人 - 3在这个阶段,让我们将机器人的凭据添加到 application.yaml 中:
bot:
  name: JavaRushTelegramBot
  token: 22313424:AAF4gck4D8gDhq68E7k0UH8vlyQADhxQhYo
分层表示法使我们能够避免重复(bot.name、bot.token)并提高可读性。如果您还没有创建机器人,您可以按照官方说明创建一个。如果您不想在 application.yaml 中显示机器人的凭据(这是正确的),请在部署时使用环境变量:
bot:
  name: ${BOT_NAME}
  token: ${BOT_TOKEN}
填写 Bot 类:
package com.whiskels.telegram.bot;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.telegram.telegrambots.bots.TelegramLongPollingBot;
import org.telegram.telegrambots.meta.api.methods.send.SendMessage;
import org.telegram.telegrambots.meta.api.objects.Update;
import org.telegram.telegrambots.meta.exceptions.TelegramApiException;

// Аннотация @Component необходима, чтобы наш класс распознавался Spring, How полноправный Bean
@Component
// Наследуемся от TelegramLongPollingBot - абстрактного класса Telegram API
public class Bot extends TelegramLongPollingBot {
    // Аннотация @Value позволяет задавать meaning полю путем считывания из application.yaml
    @Value("${bot.name}")
    private String botUsername;

    @Value("${bot.token}")
    private String botToken;

    /* Перегружаем метод интерфейса LongPollingBot
    Теперь при получении messages наш бот будет отвечать сообщением Hi!
     */
    @Override
    public void onUpdateReceived(Update update) {
        try {
            execute(new SendMessage().setChatId(update.getMessage().getChatId())
            .setText("Hi!"));
        } catch (TelegramApiException e) {
            e.printStackTrace();
        }
    }

    // Геттеры, которые необходимы для наследования от TelegramLongPollingBot
    public String getBotUsername() {
        return botUsername;
    }

    public String getBotToken() {
        return botToken;
    }
}
填写App类:
package com.whiskels.telegram;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.telegram.telegrambots.ApiContextInitializer;

// Аннотация, которая объединяет в себя @Configuration, @EnableAutoConfiguration, @ComponentScan
@SpringBootApplication
public class App {
    public static void main(String[] args) {
        // Здесь code написан по заветам
        // https://github.com/rubenlagus/TelegramBots/tree/master/telegrambots-spring-boot-starter
        ApiContextInitializer.init();

        SpringApplication.run(App.class, args);
    }
}
如果我们做的一切正确,那么我们就可以运行 main 并向我们的机器人打招呼。使用 Spring Boot 创建电报机器人 - 4准备好!我们已经成功编写并启动了一个电报机器人,它可以向每条传入的消息打招呼。如果本文对您有用,那么最好的感谢是您查看我的存储库并留下一个星星。在那里您还可以找到我的电报机器人版本,它有许多有趣的功能:
  • 将用户存储在 Postgres 数据库中;
  • 根据用户角色授权访问命令;
  • 使用自定义注释@BotCommand和@RequiredRoles来创建消息处理程序并检查用户权限;
  • 支持创建通知计划。
如果您对任何此功能感兴趣,请在评论中写下,我将尝试回答或撰写有关如何重新创建它的详细文章。PS 这是我关于 JavaRush 的第一篇文章,我想深入了解 Spring JPA 和 @Scheduled 注释的领域,但首先我认为值得编写这篇关于如何使用 Spring Boot 构建机器人的指南。已经写了几篇关于机器人的文章,但是搜索没有找到这样的指南,所以我决定填补这个空白:)我还想提一下 Miroha - 感谢 UpdateHandlers 的想法,我偷了它我自己 :) 第 2 部分 第 3 部分
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION