JavaRush /Blog Java /Random-PL /Tworzenie bota telegramowego przy użyciu Spring Boot
Whiskels
Poziom 41
Москва

Tworzenie bota telegramowego przy użyciu Spring Boot

Opublikowano w grupie Random-PL
Cześć wszystkim! Na pewnym etapie studiów chcesz przejść od rozwiązywania problemów do tworzenia realnych projektów, które będą podstawą Twojego portfolio. Kiedy rozpoczynałem staż (który gorąco wszystkim polecam), otrzymałem propozycję napisania bota telegramowego jako freelancer. Ze względu na moją niewielką wiedzę napisałem dość prostego bota ( ostatnie zatwierdzenie przed migracją do Springa ), który zawierał trzy wątki:
  • wątek odbierania wiadomości;
  • wątek wysyłania wiadomości;
  • wątek planowania zdarzeń (sprawdzał zaplanowane wiadomości i aktualizował dane w pamięci podręcznej z JSON).
Pisząc tę ​​funkcjonalność, w dużej mierze polegałem na tym artykule . Wszystko działało całkiem nieźle, jednak im głębiej zagłębiałem się w Springa, tym bardziej chciałem wszystko zrefaktoryzować, aby zmniejszyć spójność programu i poprawić jakość kodu. SonarLint (wtyczka do automatycznego sprawdzania jakości kodu) próbowała mnie przekonać, że niekończące się pętle while nie są zbyt dobre. W pewnym momencie zdecydowałem się i wszystko przepisałem, a teraz chcę podzielić się z Wami wiedzą, którą zdobyłem podczas procesu refaktoryzacji. Zacznijmy od podstaw, a dokładniej - od TelegramBots-Spring-Boot-Starter A więc do dzieła! Stwórzmy bota, który przywita się w odpowiedzi na każdą wiadomość. Najpierw musimy stworzyć nowy projekt Maven. Dodajmy niezbędne zależności do pom.xml. Dodaj do właściwości wersje Java i TelegramBots-Spring-Boot-Starter. I rejestrujemy zależności - tutaj będziemy mieli wspomniany już wyżej TelegramBots-Spring-Boot-Starter i Telegram API : Tworzenie bota telegramowego przy użyciu Spring Boot - 1Biblioteka TelegramBots-Spring-Boot-Starter zawiera Spring Boot i Telegram API. Dzięki niemu możemy w dość prosty sposób zadeklarować w naszym kodzie bota, a Spring sam utworzy Beana i aktywuje bota. Jeśli ciekawi Cię, co w tej chwili dzieje się pod maską, zajrzyj do źródeł bibliotecznych (w środowisku programistycznym lub na Githubie ). Dodajemy także parametry kompilacji: Tworzenie bota telegramowego przy użyciu Spring Boot - 2 Nie zapomnij zaktualizować wszystkich zależności po wypełnieniu pom! Stwórzmy dwie klasy - App i Bot, a także plik application.yaml w folderze Resources. Struktura mojego projektu wygląda następująco: Tworzenie bota telegramowego przy użyciu Spring Boot - 3Na tym etapie dodajmy referencje naszego bota do pliku application.yaml:
bot:
  name: JavaRushTelegramBot
  token: 22313424:AAF4gck4D8gDhq68E7k0UH8vlyQADhxQhYo
Notacja hierarchiczna pozwala uniknąć powtórzeń (bot.name, bot.token) i poprawić czytelność. Jeśli jeszcze nie utworzyłeś bota, możesz go utworzyć, postępując zgodnie z oficjalnymi instrukcjami . Jeśli nie chcesz wyświetlać poświadczeń bota w pliku application.yaml (co jest poprawne), podczas wdrażania użyj zmiennych środowiskowych:
bot:
  name: ${BOT_NAME}
  token: ${BOT_TOKEN}
Wypełnianie klasy 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, Jak полноправный Bean
@Component
// Наследуемся от TelegramLongPollingBot - абстрактного класса Telegram API
public class Bot extends TelegramLongPollingBot {
    // Аннотация @Value позволяет задавать oznaczający полю путем считывания из application.yaml
    @Value("${bot.name}")
    private String botUsername;

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

    /* Перегружаем метод интерфейса LongPollingBot
    Теперь при получении wiadomości наш бот будет отвечать сообщением 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;
    }
}
Wypełnij klasę aplikacji:
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) {
        // Здесь kod написан по заветам
        // https://github.com/rubenlagus/TelegramBots/tree/master/telegrambots-spring-boot-starter
        ApiContextInitializer.init();

        SpringApplication.run(App.class, args);
    }
}
Jeżeli wszystko zrobiliśmy poprawnie to możemy uruchomić main i przywitać się z naszym botem. Tworzenie bota telegramowego przy użyciu Spring Boot - 4Gotowy! Udało nam się napisać i uruchomić bota telegramowego, który wita każdą przychodzącą wiadomość. Jeśli ten artykuł był dla Ciebie przydatny, najlepszym podziękowaniem byłoby zajrzenie do mojego repozytorium i pozostawienie gwiazdki. Znajdziesz tam również moją wersję bota telegramu, który ma wiele ciekawych funkcji:
  • przechowywanie użytkowników w bazie danych Postgres;
  • autoryzacja dostępu do poleceń w oparciu o role użytkowników;
  • wykorzystanie niestandardowych adnotacji @BotCommand i @RequiredRoles do tworzenia procedur obsługi wiadomości i sprawdzania uprawnień użytkowników;
  • wsparcie przy tworzeniu harmonogramu powiadomień.
Jeśli któraś z tych funkcjonalności Cię interesuje, napisz w komentarzach, a ja postaram się odpowiedzieć lub napisać szczegółowy artykuł o tym, jak ją odtworzyć. PS To mój pierwszy artykuł na temat JavaRush i chciałbym zagłębić się w dzicz Spring JPA i adnotacje @Scheduled, ale najpierw pomyślałem, że warto napisać ten przewodnik na temat ogólnego budowania bota przy użyciu Spring Boot. Na temat botów napisano już kilka artykułów, ale wyszukiwarka nie znalazła takiego poradnika, więc postanowiłam wypełnić tę niszę :) Wspomnę też o Miroha - dzięki za pomysł na UpdateHandlers, ukradłam go dla ja :) CZĘŚĆ 2 CZĘŚĆ 3
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION