JavaRush /Blog Java /Random-FR /Création d'un bot de télégramme à l'aide de Spring Boot
Whiskels
Niveau 41
Москва

Création d'un bot de télégramme à l'aide de Spring Boot

Publié dans le groupe Random-FR
Salut tout le monde! À un moment donné de vos études, vous souhaitez passer de la résolution de problèmes à la création de projets réels qui constitueront la base de votre portfolio. Lorsque j'ai commencé mon stage (que je recommande vivement à tout le monde), j'ai reçu une offre pour écrire un robot télégramme en tant qu'indépendant. En raison de mes peu de connaissances, j'ai écrit un bot assez simple ( le dernier commit avant de migrer vers Spring ) qui contenait trois threads :
  • fil de réception de messages ;
  • fil d'envoi de messages ;
  • fil de planification d'événements (il vérifiait les messages planifiés et mettait à jour les données mises en cache à partir de JSON).
Lors de l'écriture de cette fonctionnalité, je me suis fortement appuyé sur cet article . Tout fonctionnait plutôt bien, mais plus je plongeais dans Spring, plus j'avais envie de tout refactoriser afin de réduire la cohérence du programme et d'améliorer la qualité du code. SonarLint (un plugin pour vérifier automatiquement la qualité du code) n'arrêtait pas d'essayer de me convaincre que ce n'est pas très bon d'avoir des boucles while interminables. À un moment donné, j'ai pris ma décision et j'ai tout réécrit, et maintenant je souhaite partager avec vous les connaissances que j'ai acquises au cours du processus de refactoring. Commençons par les bases, et plus précisément - avec TelegramBots-Spring-Boot-Starter Alors c'est parti ! Créons un bot qui dira bonjour en réponse à n'importe quel message. Tout d’abord, nous devons créer un nouveau projet Maven. Ajoutons les dépendances nécessaires à pom.xml. Ajoutez les versions Java et TelegramBots-Spring-Boot-Starter aux propriétés. Et nous enregistrons les dépendances - nous aurons ici les API TelegramBots-Spring-Boot-Starter et Telegram déjà mentionnées ci-dessus : Créer un bot de télégramme à l'aide de Spring Boot - 1La bibliothèque TelegramBots-Spring-Boot-Starter comprend Spring Boot et l'API Telegram. Son utilisation nous permet de déclarer un bot dans notre code de manière assez simple, et Spring lui-même créera le Bean et activera le bot. Si vous êtes intéressé par ce qui se passe sous le capot en ce moment, regardez les sources de la bibliothèque (dans l'environnement de développement ou sur Github ). Nous ajoutons également des paramètres de compilation : Créer un bot de télégramme à l'aide de Spring Boot - 2 N'oubliez pas de mettre à jour toutes les dépendances après avoir rempli le pom ! Créons deux classes - App et Bot, ainsi qu'un fichier application.yaml dans le dossier ressources. La structure de mon projet ressemble à ceci : Créer un bot de télégramme à l'aide de Spring Boot - 3A ce stade, ajoutons les identifiants de notre bot à application.yaml :
bot:
  name: JavaRushTelegramBot
  token: 22313424:AAF4gck4D8gDhq68E7k0UH8vlyQADhxQhYo
La notation hiérarchique permet d'éviter les répétitions (bot.name, bot.token) et d'améliorer la lisibilité. Si vous n'avez pas encore créé de bot, vous pouvez en créer un en suivant les instructions officielles . Si vous ne souhaitez pas afficher les informations d'identification du bot dans application.yaml (ce qui est correct), utilisez des variables d'environnement lors du déploiement :
bot:
  name: ${BOT_NAME}
  token: ${BOT_TOKEN}
Remplir la classe 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;
    }
}
Remplissez la classe 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);
    }
}
Si nous avons tout fait correctement, nous pouvons alors exécuter main et dire bonjour à notre bot. Créer un bot de télégramme à l'aide de Spring Boot - 4Prêt! Nous avons écrit et lancé avec succès un robot de télégramme qui dit bonjour à chaque message entrant. Si cet article vous a été utile, le meilleur merci serait de regarder mon référentiel et de laisser une étoile. Vous y trouverez également ma version du bot télégramme, qui possède de nombreuses fonctionnalités intéressantes :
  • stocker les utilisateurs dans une base de données Postgres ;
  • autorisation d'accès aux commandes en fonction des rôles des utilisateurs ;
  • utilisation des annotations personnalisées @BotCommand et @RequiredRoles pour créer des gestionnaires de messages et vérifier les droits des utilisateurs ;
  • prise en charge de la création d’un calendrier de notification.
Si l'une de ces fonctionnalités vous intéresse, écrivez dans les commentaires et j'essaierai soit de répondre, soit d'écrire un article détaillé sur la façon de la recréer. PS Ceci est mon premier article sur JavaRush, et j'aimerais plonger dans la nature des annotations Spring JPA et @Scheduled, mais j'ai d'abord pensé qu'il vaudrait la peine d'écrire ce guide sur la façon de créer généralement un bot à l'aide de Spring Boot. Plusieurs articles ont déjà été écrits sur les robots, mais la recherche n'a pas abouti à un tel guide, j'ai donc décidé de combler ce créneau :) Je voudrais également mentionner Miroha - merci pour l'idée d'UpdateHandlers, je l'ai volé pour moi-même :) PARTIE 2 PARTIE 3
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION