JavaRush /Blog Java /Random-FR /Créer un bot Telegram en Java : de l'idée au déploiement
John Watson
Niveau 27

Créer un bot Telegram en Java : de l'idée au déploiement

Publié dans le groupe Random-FR
Au fait, que sont les robots ? Vous pouvez en savoir plus à ce sujet ici . Tout d'abord, vous devez lire la documentation officielle de la bibliothèque de développement de robots sur Telegram (ci-après dénommée API). Elle repose ici . Créer un bot Telegram en Java : de l'idée au déploiement - 1Tout y est très accessible et compréhensible. Il semblerait qu'il faut écrire et se réjouir ! Mais ce n'est pas si simple. Après avoir passé beaucoup de temps sur les moteurs de recherche, j'ai trouvé des extraits de connaissances sur le développement de robots, par exemple, comment créer un clavier, traiter CallbackQuery, etc. Je n'ai jamais trouvé de guide complet et complet pour développer des robots en Java. Cela m’a incité à écrire cet article. Il existe de nombreux sites sur Internet sur lesquels vous pouvez créer votre propre bot avec un déploiement prêt à l'emploi. Mais le fait est. que pour la plupart, des robots sont créés pour fournir des informations de base, etc. Notre bot est une application web à part entière à laquelle vous pouvez lier une base de données, effectuer des requêtes vers diverses API, analyser des sites, effectuer des calculs complexes, etc. L'affaire n'est limitée que par votre imagination. J'espère que dans ces lignes je vous ai un peu expliqué ce que je vais écrire. L'enregistrement d'un bot dans Telegram est très simple ; ce processus est décrit en détail dans la documentation sur le lien ci-dessus. Pour notre application, il vous suffit de connaître le nom du bot et le token que vous recevrez lors de votre inscription. Essentiellement, un bot n’est qu’une application Web console. Pas de frontend, pur traitement de commandes. Si vous souhaitez bien maîtriser Hibernate ou apprendre à analyser JSON, alors ce projet est fait pour vous. Commençons par inclure la dépendance dans pom.xml (nous supposons que vous utilisez Maven). Vous pouvez procéder ainsi :
<dependency>
            <groupId>org.telegram</groupId>
            <artifactId>telegrambots</artifactId>
            <version>3.5</version>
</dependency>
Ensuite, nous créons une classe Bot, héritons de la classe TelegramLongPollingBot, en remplaçant ses méthodes :
public class Bot extends TelegramLongPollingBot {

    /**
     * Method for receiving messages.
     * @param update Contains a message from the user.
     */
    @Override
    public void onUpdateReceived(Update update) {
	String message = update.getMessage().getText();
	sendMsg(update.getMessage().getChatId().toString(), message);
    }

    /**
     * Method for setting up a message and sending it.
     * @param chatId chat id
     * @param s The string to send as a message.
     */
    public synchronized void sendMsg(String chatId, String s) {
        SendMessage sendMessage = new SendMessage();
        sendMessage.enableMarkdown(true);
        sendMessage.setChatId(chatId);
        sendMessage.setText(s);
        try {
            sendMessage(sendMessage);
        } catch (TelegramApiException e) {
            log.log(Level.SEVERE, "Exception: ", e.toString());
        }
    }

    /**
     * The method returns the name of the bot specified during registration.
     * @return bot name
     */
    @Override
    public String getBotUsername() {
        returnBotName;
    }

    /**
     * The method returns the bot's token to communicate with the Telegram server
     * @return token for the bot
     */
    @Override
    public String getBotToken() {
        returnBotToken;
    }
}
Eh bien, le contenu de la méthode main:
public static void main(String[] args) {
        ApiContextInitializer.init();
        TelegramBotsApi telegramBotsApi = new TelegramBotsApi();
        try {
            telegramBotsApi.registerBot(Bot.getBot());
        } catch (TelegramApiRequestException e) {
            e.printStackTrace();
        }
}
En le saisissant dans les méthodes getBotUsername(), getBotToken()on lance le bot. Pour l’instant, il nous redirige uniquement les messages que nous lui envoyons, une sorte de « miroir ». Tout fonctionne comme suit : lorsque vous lancez l'application, elle commence à envoyer une requête GET au serveur Telegram une fois toutes les n secondes à l'URL suivante : https://api.telegram.org/BotToken/getMe, où se trouve BotToken. le token de votre bot, recevant une réponse JSON contenant tous les messages. Chacun de ces messages est traité par la bibliothèque et arrive à la méthode OnUpdateReceived(Update update)en tant qu'objet Update. C'est avec cela que nous travaillons. C'est la beauté des robots Telegram, ils peuvent fonctionner sur n'importe quel ordinateur, pour tester il vous suffit de lancer l'application, vous n'avez pas besoin de la déployer sur l'hébergement après chaque modification. C'est très confortable. Bien entendu, le bot peut être configuré pour fonctionner à l'aide d'un webhook ; le manuel est disponible sur Internet ; pour plus de simplicité, nous travaillerons avec LongPolling. Comment traiter les messages et quoi envoyer en réponse n'est limité que par les outils linguistiques et la bibliothèque, tout le reste est à votre discrétion. Vous pouvez créer un robot qui recherchera des vidéos sur YouTube pour vous, vous pouvez créer un robot qui vous enverra chaque jour ce que vous vous envoyez, par exemple, dans un an, une sorte de capsule temporelle. Ou vous pouvez apprendre à vous intégrer aux systèmes CRM et à créer des robots pour les petites entreprises, tout est limité par votre imagination. Poursuivre. Ceux qui ont utilisé des bots savent qu'il est pratique d'interagir avec eux à l'aide de commandes commençant par le signe «/», par exemple /start. Mais il existe un moyen plus pratique : les boutons. Il existe deux types de boutons : ceux qui apparaissent sous le champ de saisie ReplyKeyboardMarkupet les boutons qui apparaissent directement sous le message auquel ils sont liés InlineKeyboardMarkup. Dans la documentation, vous pouvez vous familiariser brièvement avec leur description. RépondreKeyboardMarkup. Il s'agit essentiellement d'un tableau de tableaux de boutons List<KeyboardRow<KeyboardButton>>. Voici un exemple de code qui crée le clavier
public synchronized void setButtons(SendMessage sendMessage) {
        // Create a keyboard
        ReplyKeyboardMarkup replyKeyboardMarkup = new ReplyKeyboardMarkup();
        sendMessage.setReplyMarkup(replyKeyboardMarkup);
        replyKeyboardMarkup.setSelective(true);
        replyKeyboardMarkup.setResizeKeyboard(true);
        replyKeyboardMarkup.setOneTimeKeyboard(false);

        // Create a list of keyboard strings
        List<KeyboardRow> keyboard = new ArrayList<>();

        // First line of the keyboard
        KeyboardRow keyboardFirstRow = new KeyboardRow();
        // Add buttons to the first line of the keyboard
        keyboardFirstRow.add(new KeyboardButton(“Привет”));

        // Second line of the keyboard
        KeyboardRow keyboardSecondRow = new KeyboardRow();
        // Add buttons to the second line of the keyboard
        keyboardSecondRow.add(new KeyboardButton(“Помощь”);

        // Add all keyboard strings to the list
        keyboard.add(keyboardFirstRow);
        keyboard.add(keyboardSecondRow);
        // and set this list to our keyboard
        replyKeyboardMarkup.setKeyboard(keyboard);
    }
Dans une méthode sendMsg(), nous appelons cette méthode en lui passant un message, définissant ainsi le clavier pour ce message. Lorsque nous enverrons ce message à l'utilisateur, il verra le texte du message que nous avons défini, ainsi que 2 boutons indiquant Bonjour et Aide, l'un à côté de l'autre. En cliquant sur ces boutons, un message sera envoyé au bot dont le texte est celui écrit sur le bouton. Autrement dit, si le client clique sur « Aide », le bot recevra un message avec le texte « Aide ». Pour lui, c’est comme si le client lui-même écrivait le texte « Aide » et le lui envoyait. Eh bien, alors vous traitez de tels messages. InlineKeyboardMarkup Il s'agit également d'un tableau de tableaux, il est similaire au balisage précédent, mais la logique de fonctionnement ici est légèrement différente. Un tel clavier est lié à un message spécifique et n'existe que pour lui. Voici la méthode pour installer le clavier en ligne
private void setInline() {
        List<List<InlineKeyboardButton>> buttons = new ArrayList<>();
        List<InlineKeyboardButton> buttons1 = new ArrayList<>();
        buttons1.add(new InlineKeyboardButton().setText(“Кнопка“).setCallbackData(17));
        buttons.add(buttons1);

        InlineKeyboardMarkup markupKeyboard = new InlineKeyboardMarkup();
        markupKeyboard.setKeyboard(buttons);
    }
Créez Listdans List, ajoutez un bouton Inline à la première ligne. Un tel bouton peut contenir une URL, un lien vers une chaîne ou CallbackQuery, dont j'écrirai un peu plus tard. Ici, nous définissons le texte de notre bouton que l'utilisateur verra, puis définissons les données qui seront envoyées au bot. Dans notre exemple, l'utilisateur voit « Bonjour », et lorsqu'il clique dessus, le bot recevra le numéro 17, c'est notre CallbackQuery. Quelques mots sur CallbackQuery. Pour obtenir de telles données à partir d'un objet, Updatevous devez exécuter update.getCallbackQuery(), cette méthode renvoie CallbackQuery, à partir de laquelle vous pouvez déjà obtenir les données transférées au bot. Il n'est pas nécessaire d'essayer d'obtenir ces données via la méthode update.getMessage().getText()get NullPointerException.
@Override
    public void onUpdateReceived(Update update) {
        if(update.hasMessage()) {
            ThreadClass thread = new ThreadClass(update.getMessage());
        } else  if(update.hasCallbackQuery()) {
            AnswerCallbackThread answerThread = new AnswerCallbackThread(update.getCallbackQuery());
        }
    }
S'il y a un message, nous l'envoyons pour traitement à un nouveau thread ; s'il y a un message CallbackQuery, nous l'envoyons pour traitement au thread approprié. Vous CallbackQuerypouvez envoyer une réponse. Chaque objet dans Telegram a son propre identifiant. Pour envoyer une réponse à un objet spécifique, CallbackQueryil suffit de connaître son identifiant, que nous recevrons de l'objet correspondant. Pour envoyer une réponse, appelez cette méthode :
public synchronized void answerCallbackQuery(String callbackId, String message) {
        AnswerCallbackQuery answer = new AnswerCallbackQuery();
        answer.setCallbackQueryId(callbackId);
        answer.setText(message);
        answer.setShowAlert(true);
        try {
            answerCallbackQuery(answer);
        } catch (TelegramApiException e) {
            e.printStackTrace();
        }
    }
IMPORTANT:Le texte de la réponse CallbackQueryne doit pas dépasser 200 caractères ! Lors de l'envoi d'une telle réponse, le client recevra une fenêtre contextuelle dans laquelle le message sera écrit. Une telle fenêtre peut disparaître quelques secondes après son apparition, ou elle peut se bloquer jusqu'à ce que l'utilisateur appuie sur OK. Pour changer ces modes, nous appelons le answer.setShowAlert(true). Lorsque truela fenêtre se bloque jusqu'à ce que vous appuyiez sur OK, falseelle disparaît au bout de 5 secondes. En principe, ce sont toutes les fonctionnalités de base de la bibliothèque de robots Telegram. Si vous le souhaitez, vous pouvez apprendre des choses comme l'envoi de multimédia, la géolocalisation, etc. à partir de la documentation. Passons au déploiement de notre bot sur l'hébergement. Pour mon projet, j'ai choisi Heroku, car à mon avis c'est un hébergement assez pratique qui possède sa propre CLI. C'est gratuit, mais à ce rythme votre bot entrera en hibernation au bout de 30 minutes s'il n'y a aucune demande. Lorsqu'une demande lui est envoyée, il se réveille. Cela se produit assez rapidement, vous ne le remarquerez même pas (à moins bien sûr que la connexion à la base de données soit rétablie). La limite du forfait gratuit est de 5 Mo de base de données, 100 Mo d'espace disque, 2 To de trafic par mois, 1 dinosaure. Dino est votre application en cours d'exécution. Je dirai tout de suite que c'est l'étape de déploiement qui m'a posé des difficultés, puisque je n'avais jamais déployé mes applications auparavant. Lors du déploiement, Heroku nécessite un fichier nommé Procfile (sans extension). Nous le créons à la racine du projet, y écrivons worker: sh target/bin/workerBot workerBot - le nom que nous spécifions dans pom.xml Le script sh généré à l'aide du plugin Maven appassembler-maven-plugin sera lancé. Le script décrit l'exécution du fichier jar compilé. Le nom de la classe à lancer est indiqué entre <mainClass></mainClass>, le nom du script entre <name></name> pom.xml :
...
<build>
    <plugins>
        ...
       <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>appassembler-maven-plugin</artifactId>
            <version>1.1.1</version>
            <configuration>
                <assembleDirectory>target</assembleDirectory>
                <programs>
                    <program>
                        <mainClass>com.home.server.TelegramBot</mainClass>
                        <name>workerBot</name>
                    </program>
                </programs>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>assemble</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
Avant de commencer ce processus, vous devez vous inscrire sur Heroku, installer Git et la CLI Heroku. Si votre application nécessite une base de données, alors lors de l'enregistrement d'une nouvelle application, n'oubliez pas d'ajouter la base de données dont vous avez besoin. Ensuite, vous devez connaître l'hôte, le nom d'utilisateur, le mot de passe et le port de votre base de données, puis les spécifier dans votre application. Ensuite, avant le déploiement, créez votre projet à l'aide de Maven.
mvn clean install
Pour commencer, on va dans le répertoire de notre projet, initialisons le dépôt avec la commandegit init Puis on ajoute notre projet à ce dépôt
git add .
Après avoir validé les modifications
git commit -m “First commit in project”
Ensuite, vous devez vous connecter à Heroku, écrire dans la ligne de commande
heroku login
Entrez vos données spécifiées lors de l'inscription. Ensuite, vous devez connaître l'URL de votre référentiel sur Heroku, cela se fait dans les paramètres. Puis nous écrivons
git remote add heroku [url]
Le référentiel distant Heroku sera ajouté à votre référentiel. Ensuite, nous écrivons
git push heroku master
Nous attendons... Si le déploiement de l'application réussit, nous exécutons la commande
heroku ps:scale worker=1
Et voilà, votre application est lancée. Si cela ne se produit pas, examinez attentivement les journaux : il y a probablement une erreur dans votre application qui a provoqué son crash. Merci d'avoir lu un article aussi long, j'espère que quelqu'un le trouvera utile et gagnera beaucoup de temps là où j'ai trébuché pendant le développement.
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION