Instructions TelegramBot pour créer des fonctionnalités de base pour le bot. (Partie 1)

Il n'y a pas si longtemps, je vous ai suggéré d'utiliser mon robot de télégramme.

Telegram Bot - Assistant de planification d'événements

Ayant reçu de nombreuses questions dans PM, j'ai réalisé que la question de la création de bots pour Telegram est assez populaire.

Ils m'ont demandé le code source du bot, m'ont demandé de partager des exemples spécifiques de la mise en œuvre de diverses fonctionnalités du bot, m'ont demandé de suggérer une sorte de fonctionnalité pour travailler avec le bot et les messages.

J'ai décidé d'écrire une série d'articles dans lesquels je veux montrer les choses de base dont vous aurez besoin pour écrire votre bot.
Java, Maven, TelegramAPI, Lombok et Log4j vous attendent.
Peu importe - s'il vous plaît, sous le chat ...

Et immédiatement, j'irai avec les atouts

Ce qui était demandé dans l'article précédent.

Vous pouvez trouver les codes sources du projet ici .

Dans la branche " master ", il y aura la version finale du bot, que nous écrirons avec vous, en cours d'apparition de nouveaux articles.

La source complète de cet article se trouve dans la branche " Part1-Base ".

Dans cette partie, nous allons créer avec vous un modèle de base qui pourra:

  1. enregistrer un bot sur des serveurs Telegram
  2. recevoir des messages écrits sur le bot
  3. répondre à la commande / start

Créer un projet Maven standard


( Je vais manquer les manuels sur l'utilisation de l'environnement de développement et les choses de base de la programmation Java. Toutes ces choses sont assez faciles à google. Et si cela ne fonctionne pas, écrivez des questions ).

Voyons quelles dépendances nous aurons besoin dans ce projet.

Tout d'abord, c'est Lombok . Qu'est-ce que c'est et pourquoi - vous pouvez lire, par exemple, ici .

Et assurez-vous d'ajouter un enregistreur. J'utilise log4j et un peu plus loin, je vais vous montrer à quel point il peut être utile lors du débogage de cette application et une compréhension plus approfondie du fonctionnement de TelegramAPI.

<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.10</version> <scope>provided</scope> </dependency> <!-- https://mvnrepository.com/artifact/log4j/log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> 

Et, parce que nous écrivons un bot pour Telegram, puis la bibliothèque elle-même de Telegram:

 <dependency> <groupId>org.telegram</groupId> <artifactId>telegrambots</artifactId> <version>3.5</version> </dependency> 

La structure du fichier pom se trouve ici.
La structure du fichier pom.xml peut être vue ici .

Ensuite, nous ajoutons la classe de base Bot.java , qui implémentera toutes nos interactions avec les services Telegram. Nous travaillerons avec LongPolling, comme Cette méthode ne nécessite pas de certificats de chiffrement et peut être lancée à partir de n'importe quelle machine disposant de Java.

Pour ce faire, nous héritons de la classe TelegramLongPollingBot et implémentons les méthodes de base:

public void onUpdateReceived (mise à jour de mise à jour)
public String getBotUsername ()
public String getBotToken ()

Et de nous-mêmes, nous devrons ajouter une procédure qui connectera notre bot à TelegramAPI:

public void botConnect ()

 import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import org.apache.log4j.Logger; import org.telegram.telegrambots.TelegramBotsApi; import org.telegram.telegrambots.api.objects.Update; import org.telegram.telegrambots.bots.TelegramLongPollingBot; import org.telegram.telegrambots.exceptions.TelegramApiRequestException; @AllArgsConstructor @NoArgsConstructor public class Bot extends TelegramLongPollingBot { private static final Logger log = Logger.getLogger(Bot.class); final int RECONNECT_PAUSE =10000; @Setter @Getter String userName; @Setter @Getter String token; @Override public void onUpdateReceived(Update update) { // TODO: 11/18/2019     log.debug("new Update recieve"); } @Override public String getBotUsername() { return userName; } @Override public String getBotToken() { return token; } public void botConnect() { TelegramBotsApi telegramBotsApi = new TelegramBotsApi(); try { telegramBotsApi.registerBot(this); log.info("TelegramAPI started. Look for messages"); } catch (TelegramApiRequestException e) { log.error("Cant Connect. Pause " + RECONNECT_PAUSE / 1000 + "sec and try again. Error: " + e.getMessage()); try { Thread.sleep(RECONNECT_PAUSE); } catch (InterruptedException e1) { e1.printStackTrace(); return; } botConnect(); } } } 

En principe, tout. Ce code peut se connecter aux serveurs Telegram et dès réception des messages qui lui sont adressés il enregistrera les informations dans le fichier journal qu'il a reçu Update.

Créons une classe qui exécutera notre application.

Cela sera fait par la classe App.java. Lien vers le fichier: ici

 package com.example.telegrambot; import com.example.telegrambot.bot.Bot; import org.apache.log4j.Logger; import org.telegram.telegrambots.ApiContextInitializer; public class App { private static final Logger log = Logger.getLogger(App.class); public static void main(String[] args) { ApiContextInitializer.init(); Bot test_habr_bot = new Bot("test_habr_bot", "1012522162:AAHLvPVqKF48LdqnsvS3l5YrJfvFey6dBa0"); test_habr_bot.botConnect(); } } 

Comme vous pouvez le voir, pour que le bot fonctionne, nous n'avons besoin que du «nom du bot» et du «token», que nous transmettrons au constructeur de notre classe Bot.

Vous pouvez obtenir le nom et le jeton du bot du père de tous les bots :) en lui écrivant dans un télégramme.
Son surnom: @BotFather
La communication avec lui est très simple et concise.

Sur commande
/ newbot

Par conséquent, vous devriez obtenir cette boîte de dialogue:



Ils écrivent également ici que c'est plus précis, ne montrez ces informations à personne, sinon quelqu'un d'autre pourra contrôler votre bot :)

Vous direz que je ne suis pas très précis ... Peut-être, mais le père des bots nous permet de changer les jetons et de révoquer ceux qui sont en accès public. Par conséquent, lorsque vous essayez de vous connecter avec mes données, vous recevrez le message suivant:

 2019-12-04 13:44:25,252[DEBUG][main ][ com.example.telegrambot.bot.Bot] - Bot token: 1012522162:AAF5D49N4NreEJfCk0aOsC-UnmIu_GLkoyc 2019-12-04 13:44:26,613[ERROR][main ][ com.example.telegrambot.bot.Bot] - Cant Connect. Pause 10sec and try again. Error: Error removing old webhook 

Donc, avec mes données, vous ne pouvez pas vous connecter. Enregistrez le vôtre. Spécifiez de nouvelles données dans la classe App.java

Maintenant, en exécutant la méthode principale dans la classe App, nous laissons notre bot se connecter et attendre de nouveaux messages. Il nous écrira sur ses actions et tentatives dans la console.

Log4j


Rappelez-vous, ci-dessus, j'ai parlé de l'utilité de la bibliothèque log4j. Et ici pour les curieux, un klondike de données utiles s'ouvre.

Le fichier log4j.properties contient déjà des paramètres de base pour la journalisation et des niveaux de journalisation spécifiques pour les classes tierces et pour celles qui fonctionnent dans notre bot.

 log4j.rootLogger= error, file log4j.logger.com.example.telegrambot.App = debug, stdout log4j.logger.com.example.telegrambot.bot.Bot = debug, stdout 

Le niveau de base de la journalisation est indiqué comme Erreur.

Pour les classes Bot et App, la sortie du journal au niveau du débogage est indiquée.

Quels sont ces niveaux et en quoi ils diffèrent - vous pouvez facilement les trouver dans Google.

Si vous souhaitez voir comment et dans quel ordre la bibliothèque Telegram exécute toutes vos actions, passez le mode de journalisation général à un niveau inférieur: info ou débogage.

Et lorsque vous démarrez l'application, vous verrez dans la console combien de choses intéressantes se produisent pendant le processus de connexion, de travail. Combien de fois vos fonctions sont-elles interrogées avec le nom et le jeton du bot.

Les niveaux de journalisation changent avec cette ligne:
Pour obtenir les journaux en fonction du niveau d'informations, mettez-le comme ceci:

 log4j.rootLogger= info, file 

Pour le niveau de débogage, comme ceci:

 log4j.rootLogger= debug, file 

Et en conclusion


Maintenant, nous avons un bot: il se connecte, nous montre de beaux journaux et signale que des messages lui parviennent.

Mais ci-dessus, je vous ai promis que le bot répondrait à la commande de démarrage. Modifions un peu la procédure de traitement des messages reçus.

 @Override public void onUpdateReceived(Update update) { log.debug("Receive new Update. updateID: " + update.getUpdateId()); Long chatId = update.getMessage().getChatId(); String inputText = update.getMessage().getText(); if (inputText.startsWith("/start")) { SendMessage message = new SendMessage(); message.setChatId(chatId); message.setText("Hello. This is start message"); try { execute(message); } catch (TelegramApiException e) { e.printStackTrace(); } } } 

Comme vous pouvez le voir dans le code, le bot fait ce qui suit:

  • Il reçoit une mise à jour et capture son numéro d'identification dans le journal.
  • Récupère l'ID de discussion et le texte du message à partir du message transmis
  • Vérifie si ce texte est une commande "/ start"
  • Et en cas de comparaison réussie, il crée un message en réponse et l'envoie au chat, avec l'ID reçu plus tôt

J'espère que vous le trouverez utile et intéressant.

À l'avenir, je vais vous montrer comment il est mis en œuvre dans mes bots:

  • recours à diverses équipes
  • lier ces commandes aux gestionnaires
  • multithreading: recevoir et envoyer des messages indépendamment
  • formatage des messages
  • travailler avec des boutons et des rappels
  • modification d'anciens messages

Sur cette base, en accès public, 2 de mes robots fonctionnent désormais pour moi.

Une chose que vous savez, c'est un assistant de planification d'événements .

Et le deuxième - Cheeky movie fan . Il aime les films et en sait beaucoup sur eux. Et plus encore, il aime partager ses connaissances avec vous. Il dirige sa chaîne dans un télégramme , dans lequel il décide quels films il aime et vous les propose. Il sait créer des sélections individuelles par genre et créer un abonnement à des recommandations personnalisées. Il sait comment trouver de tels chefs-d'œuvre dont vous n'avez jamais entendu parler et ne savait même pas comment trouver de tels films.

Par exemple, pensez-vous qu'il existe des films avec une combinaison aussi «sauvage» de genres tels que: documentaire, horreur, comédie.

Mais le bot sur commande

      2010- 

Il dira que de 2010 à nos jours, de tels films ont été tournés jusqu'à 6 pièces :)

Comment travailler avec des commandes similaires, comment analyser des chaînes et des séquences de commandes, nous discuterons avec vous dans les publications suivantes.

Merci de votre attention. La programmation est amusante :)

Source: https://habr.com/ru/post/fr476306/


All Articles