JavaRush /Blog Java /Random-VI /Tạo bot telegram bằng Spring Boot
Whiskels
Mức độ
Москва

Tạo bot telegram bằng Spring Boot

Xuất bản trong nhóm
Chào mọi người! Tại một thời điểm nào đó trong quá trình học tập, bạn muốn chuyển từ giải quyết vấn đề sang tạo ra các dự án thực tế sẽ tạo thành nền tảng cho danh mục đầu tư của bạn. Khi tôi bắt đầu thực tập (điều mà tôi rất khuyến khích mọi người), tôi đã nhận được lời đề nghị viết bot điện tín với tư cách là một freelancer. Do kiến ​​thức ít ỏi của mình, tôi đã viết một bot khá đơn giản ( lần commit cuối cùng trước khi chuyển sang Spring ), chứa ba luồng:
  • chủ đề nhận tin nhắn;
  • chủ đề gửi tin nhắn;
  • luồng lập lịch sự kiện (nó kiểm tra các tin nhắn đã lên lịch và cập nhật dữ liệu được lưu trong bộ nhớ đệm từ JSON).
Khi viết chức năng này, tôi đã dựa rất nhiều vào bài viết này . Mọi thứ hoạt động khá tốt, nhưng càng tìm hiểu sâu về Spring, tôi càng muốn refactor mọi thứ để giảm tính mạch lạc của chương trình và cải thiện chất lượng của code. SonarLint (một plugin để tự động kiểm tra chất lượng mã) tiếp tục cố gắng thuyết phục tôi rằng việc có các vòng lặp while vô tận là không tốt lắm. Tại một thời điểm nào đó, tôi đã quyết định và viết lại mọi thứ, và bây giờ tôi muốn chia sẻ những kiến ​​thức tôi thu được trong quá trình tái cấu trúc với các bạn. Hãy bắt đầu với những điều cơ bản và cụ thể hơn - với TelegramBots-Spring-Boot-Starter Vì vậy, hãy bắt đầu! Hãy tạo một bot có thể chào lại bất kỳ tin nhắn nào. Đầu tiên chúng ta cần tạo một dự án Maven mới. Hãy thêm các phần phụ thuộc cần thiết vào pom.xml. Thêm phiên bản Java và TelegramBots-Spring-Boot-Starter vào thuộc tính. Và chúng tôi đăng ký các phần phụ thuộc - ở đây chúng tôi sẽ có API TelegramBots-Spring-Boot-Starter và Telegram đã được đề cập ở trên : Tạo bot telegram bằng Spring Boot - 1Thư viện TelegramBots-Spring-Boot-Starter bao gồm Spring Boot và API Telegram. Việc sử dụng nó cho phép chúng ta khai báo một bot trong code của mình một cách khá đơn giản và chính Spring sẽ tạo Bean và kích hoạt bot. Nếu bạn quan tâm đến những gì đang diễn ra tại thời điểm này, hãy xem các nguồn thư viện (trong môi trường phát triển hoặc trên Github ). Chúng tôi cũng thêm các tham số biên dịch: Tạo bot telegram bằng Spring Boot - 2 Đừng quên cập nhật tất cả các phần phụ thuộc sau khi điền vào pom! Hãy tạo hai lớp - Ứng dụng và Bot, cũng như tệp application.yaml trong thư mục tài nguyên. Cấu trúc dự án của tôi trông như thế này: Tạo bot telegram bằng Spring Boot - 3Ở giai đoạn này, hãy thêm thông tin đăng nhập của bot vào application.yaml:
bot:
  name: JavaRushTelegramBot
  token: 22313424:AAF4gck4D8gDhq68E7k0UH8vlyQADhxQhYo
Ký hiệu phân cấp cho phép chúng tôi tránh sự lặp lại (bot.name, bot.token) và cải thiện khả năng đọc. Nếu chưa tạo bot, bạn có thể tạo bot bằng cách làm theo hướng dẫn chính thức . Nếu bạn không muốn hiển thị thông tin xác thực của bot trong application.yaml (điều này đúng), hãy sử dụng các biến môi trường khi triển khai:
bot:
  name: ${BOT_NAME}
  token: ${BOT_TOKEN}
Điền vào lớp 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;
    }
}
Điền vào lớp Ứng dụng:
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);
    }
}
Nếu chúng tôi làm mọi thứ chính xác, thì chúng tôi có thể chạy main và gửi lời chào đến bot của mình. Tạo bot telegram bằng Spring Boot - 4Sẵn sàng! Chúng tôi đã viết và khởi chạy thành công bot điện tín gửi lời chào đến mọi tin nhắn đến. Nếu bài viết này hữu ích với bạn thì lời cảm ơn tốt nhất là bạn hãy xem kho lưu trữ của tôi và để lại một ngôi sao. Ở đó, bạn cũng sẽ tìm thấy phiên bản bot telegram của tôi, phiên bản này có nhiều tính năng thú vị:
  • lưu trữ người dùng trong cơ sở dữ liệu Postgres;
  • ủy quyền truy cập vào các lệnh dựa trên vai trò của người dùng;
  • sử dụng các chú thích tùy chỉnh @BotCommand và @RequiredRoles để tạo trình xử lý tin nhắn và kiểm tra quyền của người dùng;
  • hỗ trợ tạo lịch thông báo.
Nếu bạn quan tâm đến bất kỳ chức năng nào trong số này, hãy viết bình luận và tôi sẽ cố gắng trả lời hoặc viết một bài viết chi tiết về cách tạo lại nó. Tái bút Đây là bài viết đầu tiên của tôi về JavaRush và tôi muốn đi sâu vào các chú thích Spring JPA và @Scheduled, nhưng trước tiên tôi nghĩ sẽ đáng để viết hướng dẫn này về cách xây dựng bot nói chung bằng Spring Boot. Một số bài viết đã được viết trên bot, nhưng việc tìm kiếm không đưa ra hướng dẫn như vậy, vì vậy tôi quyết định điền vào chỗ trống này :) Tôi cũng muốn đề cập đến Miroha - cảm ơn vì ý tưởng của UpdateHandlers, tôi đã đánh cắp nó cho bản thân tôi :) PHẦN 2 PHẦN 3
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION