CodeGym /Blog Java /Random-FR /Créer un Telegram Bot en Java : de la conception au déplo...
Auteur
Edward Izraitel
Software Engineer at Champions Oncology

Créer un Telegram Bot en Java : de la conception au déploiement

Publié dans le groupe Random-FR
Que sont donc les bots ? Vous pouvez en savoir plus à ce sujet ici . Pour commencer, vous devez consulter la documentation officielle de la bibliothèque utilisée pour développer les bots Telegram (ci-après l'"API"). Il peut être trouvé ici .
Créer un Telegram Bot en Java : de la conception au déploiement - 1
Tout y est très accessible et clair. Il semble que nous puissions simplement écrire du code et nous réjouir ! Mais ce n'est pas si simple. Après avoir passé beaucoup de temps à chercher, j'ai trouvé des bribes de connaissances sur le développement de robots, par exemple, comment fabriquer un clavier, gérer unCallbackQuery, et ainsi de suite. Mais, je n'ai pas trouvé de guide complet et exhaustif pour le développement de robots Java. Cela m'a poussé à écrire cet article. Il existe de nombreux sites Web sur lesquels vous pouvez créer votre propre bot facilement déployable. Mais le fait est que la plupart des robots créés fournissent des informations de référence, etc. Notre bot est une application web à part entière. Vous pouvez lier une base de données, exécuter diverses requêtes API, analyser des sites Web, effectuer des calculs complexes, etc. Les possibilités ne sont limitées que par votre imagination. J'espère que ce qui précède a aidé à clarifier ce que je vais écrire. Il est très facile d'enregistrer un bot sur Telegram. Ce processus est décrit en détail dans la documentation liée ci-dessus. Pour notre application, il vous suffit de connaître le nom du bot et le jeton que vous recevez lors de l'enregistrement du bot. Essentiellement, un bot n'est qu'une application Web basée sur une console. Il n'y a pas de frontal, juste un traitement de commande pur. Si vous voulez maîtriserMettez en veille prolongée ou apprenez à analyser JSON , alors ce projet est fait pour vous. Commençons par ajouter une dépendance à pom.xml(je suppose que vous utilisez Maven). Vous pouvez le faire comme ceci :

<dependency>
            <groupId>org.telegram</groupId>
            <artifactId>telegrambots</artifactId>
            <version>3.5</version>
</dependency>
Créez ensuite une Botclasse qui hérite de la TelegramLongPollingBotclasse et remplacez 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 creating a message and sending it.
     * @param chatId chat id
     * @param s The String that you want 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());
        }
    }

    /**
     * This method returns the bot's name, which was specified during registration.
     * @return bot name
     */
    @Override
    public String getBotUsername() {
        return "BotName";
    }

    /**
     * This method returns the bot's token for communicating with the Telegram server
     * @return the bot's token
     */
    @Override
    public String getBotToken() {
        return "BotToken";
    }
}
Et maintenant le contenu de la mainméthode :

public static void main(String[] args) {
        ApiContextInitializer.init();
        TelegramBotApi telegramBotApi = new TelegramBotApi();
        try {
            telegramBotApi.registerBot(Bot.getBot());
        } catch (TelegramApiRequestException e) {
            e.printStackTrace();
        }
}
Après avoir rempli les méthodes getBotUsername()et getBotToken(), démarrez le bot. Pour l'instant, il se contente de nous rediriger tous les messages que nous lui envoyons, un peu comme un " miroir ". Cela fonctionne comme ceci : lorsque vous démarrez l'application, elle commence à envoyer des requêtes au serveur Telegram, une fois toutes les n secondes, à l'URL suivante : https://api.telegram.org/BotToken/getMe , où BotToken est le jeton de votre bot . En réponse, il reçoit JSON contenant tous les messages. Chacun de ces messages est traité par la bibliothèque et transmis à la OnUpdateReceived(Update update)méthode en tant queUpdateobjet. Et c'est avec cela que nous travaillons. C'est là que réside la beauté des bots Telegram : ils peuvent s'exécuter sur n'importe quel ordinateur, le tester nécessite simplement de démarrer l'application et vous n'avez pas besoin de la déployer sur l'hôte après chaque modification. C'est très pratique. Bien sûr, vous pouvez configurer un bot pour qu'il fonctionne à l'aide de webhooks. Vous pouvez trouver des instructions pour cela sur Internet. Pour plus de simplicité, nous utiliserons LongPolling. La façon dont les messages sont traités et ce que vous envoyez en réponse ne sont limités que par les capacités du langage et de la bibliothèque. Tout le reste dépend de toi. Vous pouvez créer un bot qui recherchera des vidéos YouTube pour vous. Vous pouvez créer un bot qui vous enverra ce que vous vous envoyez tous les jours, comme une capsule temporelle d'il y a un an. Ou vous pouvez apprendre à vous intégrer aux systèmes CRM et à créer des bots pour les petites entreprises - vous n'êtes limité que par votre imagination. Passons à autre chose. Ceux qui ont utilisé des bots savent qu'il est pratique d'interagir avec eux à l'aide de commandes commençant par le /caractère " ", par exemple, /start. Mais il existe un moyen plus pratique : les boutons. Il existe deux types de boutons : ceux qui apparaissent sous un champ de saisie ( ReplyKeyboardMarkup) et les boutons qui se trouvent directement sous le message auquel ils sont liés (InlineKeyboardMarkup). Vous pouvez en avoir une compréhension de base à partir de leurs descriptions dans la documentation.

ReplyKeyboardMarkup

En réalité, il s'agit d'un tableau de tableaux de boutons : List<KeyboardRow <KeyboardButton>>. Voici un exemple de code qui crée un 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 rows
        List<KeyboardRow> keyboard = new ArrayList<>();

        // First keyboard row
        KeyboardRow keyboardFirstRow = new KeyboardRow();
        // Add buttons to the first keyboard row
        keyboardFirstRow.add(new KeyboardButton("Hi"));

        // Second keyboard row
        KeyboardRow keyboardSecondRow = new KeyboardRow();
        // Add the buttons to the second keyboard row
        keyboardSecondRow.add(new KeyboardButton("Help");

        // Add all of the keyboard rows to the list
        keyboard.add(keyboardFirstRow);
        keyboard.add(keyboardSecondRow);
        // and assign this list to our keyboard
        replyKeyboardMarkup.setKeyboard(keyboard);
    }
Nous appelons cette méthode dans la sendMsg()méthode, après lui avoir transmis un message. C'est ainsi que nous configurons un clavier pour ce message. Lorsque nous envoyons ce message à l'utilisateur, il verra le texte de notre message et 2 boutons qui disent "Salut" et "Aide" , l'un sous l'autre. Lorsque l'un de ces boutons est cliqué, le bot reçoit un message contenant le texte du bouton. Ainsi, si le client clique sur "Aide" , le bot recevra un message avec "Aide". Pour le bot, il semblera que le client lui-même ait écrit "Help" et envoyé le texte au bot. Et puis vous traitez les messages.

InlineKeyboardMarkupInlineKeyboardMarkupInlineKeyboardMarkup

C'est aussi un tableau de tableaux. Il est similaire au balisage précédent, mais la logique fonctionne un peu différemment ici. Ce type de clavier est attaché à un message spécifique et n'existe que pour lui. Voici une méthode pour configurer un clavier en ligne :

private void setInline() {
        List<List<InlineKeyboardButton>> buttons = new ArrayList<>();
        List<InlineKeyboardButton> buttons1 = new ArrayList<>();
        buttons1.add(new InlineKeyboardButton().setText("Button").setCallbackData(17));
        buttons.add(buttons1);

        InlineKeyboardMarkup markupKeyboard = new InlineKeyboardMarkup();
        markupKeyboard.setKeyboard(buttons);
    }
Créez un Listdans le Listet ajoutez le bouton en ligne à la première ligne. Ce bouton peut contenir une URL, un lien vers une chaîne ou un CallbackQuery, sur lequel je reviendrai un peu plus tard. C'est là que nous définissons le texte de notre bouton, qui est ce que l'utilisateur verra, puis nous définissons les données qui seront envoyées au bot. Dans notre exemple, l'utilisateur voit "Salut", et lorsque le bouton est appuyé, le numéro 17 sera envoyé au bot. C'est notre CallbackQuery. Quelques mots concernant CallbackQuery. Pour obtenir ces données à partir de l' Updateobjet, vous devez exécuter update.getCallbackQuery(). Cette méthode renvoie un CallbackQuery, à partir duquel vous pouvez accéder aux données transmises au bot. N'essayez pas d'obtenir ces données via la update.getMessage().getText()méthode - vous obtiendrez un fichier 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 à un nouveau fil pour traitement ; s'il y a un CallbackQuery, nous l'envoyons au thread approprié pour traitement. Vous pouvez envoyer une réponse à un CallbackQuery. Chaque objet dans Telegram a son propre identifiant. Pour envoyer une réponse à un spécifique CallbackQuery, il vous suffit de connaître son identifiant, que nous obtenons de l'objet correspondant. Pour envoyer une réponse, nous appelons 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 d'une réponse à un CallbackQueryne doit pas dépasser 200 caractères ! Après avoir envoyé une telle réponse, le client verra une fenêtre contextuelle contenant le message. Cette fenêtre peut disparaître quelques secondes après son apparition ou persister jusqu'à ce que l'utilisateur appuie sur OK. Pour changer de mode, nous appelons la answer.setShowAlert(true)méthode. Si vous passez trueà la méthode, la fenêtre persiste jusqu'à ce que vous appuyiez sur OK. Si vous passez faux, alors il disparaît au bout de 5 secondes. Ce sont toutes les fonctionnalités de base de la bibliothèque Telegram Bot . Si vous le souhaitez, vous pouvez apprendre des choses comme comment envoyer du multimédia, la géolocalisation, etc. Passons au déploiement de notre bot sur une plateforme d'hébergement. Pour mon projet, j'ai choisi Heroku. Je pense que c'est une plate-forme d'hébergement plutôt pratique avec sa propre CLI. C'est gratuit, mais sur ce plan, votre bot hibernera après 30 minutes sans recevoir de demandes. Il se réveillera lorsqu'une demande sera reçue. Cela se produit si rapidement que vous ne le remarquerez même pas (à moins, bien sûr, que la connexion à la base de données ne redémarre pas). Le plan gratuit est limité par une base de données de 5 Mo, 100 Mo d'espace disque, 2 To de données par mois et 1 dyno. Un dyno est votre application en cours d'exécution. Je dirai tout de suite que c'est le déploiement qui m'a causé 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. À l'intérieur, nous écrivons worker: sh target/bin/workerBot, où workerBot est le nom spécifié dans pom.xml. Un shscript, généré par le plug-in Maven Application Assembler (appassembler-maven-plugin), sera lancé. Le script décrit comment lancer un fichier jar compilé. Le nom de la classe à lancer est spécifié entre <mainClass>et </mainClass>, tandis que le nom du script est donné entre <name>et </name>dans 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 et installer à la fois Git et la CLI Heroku . Si votre application a besoin d'une base de données, n'oubliez pas d'ajouter la base de données requise lorsque vous créez une nouvelle application. De plus, vous devez déterminer l'hôte, le nom d'utilisateur, le mot de passe et le port de votre base de données, puis les indiquer dans votre application. Ensuite, avant de déployer, créez votre projet à l'aide de Maven .

mvn clean install
Tout d'abord, nous allons dans notre répertoire de projet et initialisons le référentiel avec la commande git init. Ensuite, nous ajoutons notre projet à ce référentiel.

git add .
Ensuite, nous validons les modifications

git commit -m "First commit in the project"
Ensuite, vous devez vous connecter à heroku. Écrivez ce qui suit sur la ligne de commande

heroku login
Entrez les informations d'identification que vous avez créées lors de l'inscription. Après cela, déterminez l'URL de votre référentiel sur heroku. Vous faites cela dans les paramètres. Puis nous écrivons

git remote add heroku [url]
Un référentiel heroku distant est ajouté pour votre référentiel. Ensuite, nous écrivons

git push heroku master
Ensuite, nous attendons… si l'application se déploie avec succès, exécutez la commande suivante

heroku ps:scale worker=1
Et voilà, votre application est opérationnelle. Si ce n'est pas le cas, regardez attentivement les journaux. Très probablement, une erreur dans votre application a provoqué son échec. Merci d'avoir lu un si long article. J'espère que quelqu'un le trouvera utile et qu'il vous fera gagner beaucoup de temps dans les domaines qui m'ont donné du fil à retordre lors du développement.
Commentaires (2)
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION
Anonymous #11476509 niveau 0, France
22 février 2024
Ma 2eme question quand vous appelez la methode " telegramBotApi.registerBot(Bot.getBot());" pourtant dans la class "Bot" il n'y a pas "getBot()" alors s'agit t-il "getBotUsername()" ou "getBotToken()"? Crois moi je suis nouveau dans le truc juste je veux comprendre.
Anonymous #11476509 niveau 0, France
22 février 2024
Bonjour, je m'appel Ndytar je suis nouveau dans la creation de Bot et je vous remercie pour le partage. Je voudrais savoir la classe "TelegramBotApi" dont vous avez creer l'instance :TelegramBotApi telegramBotApi = new TelegramBotApi(); dans la class main, Avez-vous créée ou bien je vois pas au niveau "org.telegram.telegrambots.api.objects.". Merci