JavaRush /Java-Blog /Random-DE /Erstellen eines Telegram-Bots mit Spring Boot
Whiskels
Level 41
Москва

Erstellen eines Telegram-Bots mit Spring Boot

Veröffentlicht in der Gruppe Random-DE
Hallo zusammen! Irgendwann im Laufe Ihres Studiums möchten Sie von der Lösung von Problemen zur Erstellung realer Projekte übergehen, die die Grundlage Ihres Portfolios bilden. Zu Beginn meines Praktikums (das ich jedem wärmstens empfehlen kann) erhielt ich das Angebot, als Freelancer einen Telegram-Bot zu schreiben. Aufgrund meiner geringen Kenntnisse habe ich einen recht einfachen Bot geschrieben ( das letzte Commit vor der Migration zu Spring ), der drei Threads enthielt:
  • Thread zum Empfangen von Nachrichten;
  • Thread zum Senden von Nachrichten;
  • Ereignisplanungsthread (überprüft auf geplante Nachrichten und aktualisierte zwischengespeicherte Daten von JSON).
Beim Schreiben dieser Funktionalität habe ich mich stark auf diesen Artikel verlassen . Alles hat ganz gut funktioniert, aber je tiefer ich in Spring eintauchte, desto mehr wollte ich alles umgestalten, um die Kohärenz des Programms zu verringern und die Qualität des Codes zu verbessern. SonarLint (ein Plugin zur automatischen Überprüfung der Codequalität) versuchte mich immer wieder davon zu überzeugen, dass es nicht sehr gut sei, endlose While-Schleifen zu haben. Irgendwann habe ich mich entschieden und alles neu geschrieben, und nun möchte ich die Erkenntnisse, die ich während des Refactoring-Prozesses gewonnen habe, mit Ihnen teilen. Beginnen wir mit den Grundlagen und genauer gesagt mit TelegramBots-Spring-Boot-Starter. Also, los geht's! Erstellen wir einen Bot, der auf jede Nachricht „Hallo“ sagt. Zuerst müssen wir ein neues Maven-Projekt erstellen. Fügen wir pom.xml die erforderlichen Abhängigkeiten hinzu. Fügen Sie den Eigenschaften Java- und TelegramBots-Spring-Boot-Starter-Versionen hinzu. Und wir registrieren Abhängigkeiten – hier haben wir die bereits oben erwähnte TelegramBots-Spring-Boot-Starter- und Telegram-API : Erstellen eines Telegram-Bots mit Spring Boot – 1Die TelegramBots-Spring-Boot-Starter-Bibliothek enthält Spring Boot und die Telegram-API. Dadurch können wir auf relativ einfache Weise einen Bot in unserem Code deklarieren, und Spring selbst erstellt das Bean und aktiviert den Bot. Wenn Sie sich dafür interessieren, was in diesem Moment unter der Haube passiert, dann schauen Sie sich die Bibliotheksquellen an (in der Entwicklungsumgebung oder auf Github ). Wir fügen auch Kompilierungsparameter hinzu: Erstellen eines Telegram-Bots mit Spring Boot – 2 Vergessen Sie nicht, alle Abhängigkeiten zu aktualisieren, nachdem Sie den POM ausgefüllt haben! Erstellen wir zwei Klassen – App und Bot – sowie eine application.yaml-Datei im Ressourcenordner. Die Struktur meines Projekts sieht folgendermaßen aus: Erstellen eines Telegram-Bots mit Spring Boot – 3In dieser Phase fügen wir die Anmeldeinformationen unseres Bots zu application.yaml hinzu:
bot:
  name: JavaRushTelegramBot
  token: 22313424:AAF4gck4D8gDhq68E7k0UH8vlyQADhxQhYo
Durch die hierarchische Notation können wir Wiederholungen vermeiden (bot.name, bot.token) und die Lesbarkeit verbessern. Wenn Sie noch keinen Bot erstellt haben, können Sie einen erstellen, indem Sie den offiziellen Anweisungen folgen . Wenn Sie die Anmeldeinformationen des Bots nicht in application.yaml anzeigen möchten (was korrekt ist), verwenden Sie bei der Bereitstellung Umgebungsvariablen:
bot:
  name: ${BOT_NAME}
  token: ${BOT_TOKEN}
Ausfüllen der Bot-Klasse:
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, Wie полноправный Bean
@Component
// Наследуемся от TelegramLongPollingBot - абстрактного класса Telegram API
public class Bot extends TelegramLongPollingBot {
    // Аннотация @Value позволяет задавать Bedeutung полю путем считывания из application.yaml
    @Value("${bot.name}")
    private String botUsername;

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

    /* Перегружаем метод интерфейса LongPollingBot
    Теперь при получении Mitteilungen наш бот будет отвечать сообщением 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;
    }
}
Füllen Sie die App-Klasse aus:
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);
    }
}
Wenn wir alles richtig gemacht haben, können wir main ausführen und unserem Bot Hallo sagen. Erstellen eines Telegram-Bots mit Spring Boot – 4Bereit! Wir haben erfolgreich einen Telegram-Bot geschrieben und gestartet, der jede eingehende Nachricht begrüßt. Wenn dieser Artikel für Sie nützlich war, wäre es am besten, wenn Sie sich mein Repository ansehen und einen Stern hinterlassen. Dort finden Sie auch meine Version des Telegram-Bots, die über viele interessante Features verfügt:
  • Speichern von Benutzern in einer Postgres-Datenbank;
  • Autorisierung des Zugriffs auf Befehle basierend auf Benutzerrollen;
  • Verwendung der benutzerdefinierten Annotationen @BotCommand und @RequiredRoles, um Nachrichtenhandler zu erstellen und Benutzerrechte zu überprüfen;
  • Unterstützung für die Erstellung eines Benachrichtigungsplans.
Wenn Sie an einer dieser Funktionen interessiert sind, schreiben Sie in die Kommentare und ich werde versuchen, entweder zu antworten oder einen ausführlichen Artikel darüber zu schreiben, wie Sie sie neu erstellen können. PS: Dies ist mein erster Artikel über JavaRush, und ich würde gerne in die Wildnis von Spring JPA- und @Scheduled-Annotationen eintauchen, aber zuerst dachte ich, dass es sich lohnen würde, diesen Leitfaden darüber zu schreiben, wie man im Allgemeinen einen Bot mit Spring Boot erstellt. Es wurden bereits mehrere Artikel über Bots geschrieben, aber die Suche ergab keinen solchen Leitfaden, also habe ich beschlossen, diese Nische zu füllen :) Ich möchte auch Miroha erwähnen – danke für die Idee von UpdateHandlers, für die ich sie geklaut habe ich selbst :) TEIL 2 TEIL 3
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION