Création d'un bot Telegram en R (partie 2) : Ajout de la prise en charge des commandes et des filtres de messages

Dans publication précédente Nous avons compris comment créer un bot et avons initialisé une instance de la classe. Bot. Et nous avons découvert les méthodes pour envoyer des messages avec celui-ci.

Dans cet article, je poursuis ce thème, donc je recommande de commencer la lecture de cet article seulement après avoir lu. de la première partie.

Cette fois-ci, nous allons voir comment donner vie à notre bot et lui ajouter un support pour les commandes, et nous allons également nous familiariser avec la classe. Updater.

Au cours de l'article, nous écrirons quelques bots simples, le dernier déterminera si un jour donné dans un pays donné est un jour férié ou un jour ouvrable selon le calendrier du travail. Mais, comme auparavant, l'objectif de l'article est de vous familiariser avec l'interface du package. telegram.bot pour résoudre vos propres tâches.

Création d'un bot Telegram en R (partie 2) : Ajout de la prise en charge des commandes et des filtres de messages

Tous les articles de la série "Écrire un bot Telegram en R"

  1. Créer un bot et envoyer des messages via Telegram
  2. Ajouter le support des commandes et des filtres de messages au bot

Contenu

Si vous vous intéressez à l'analyse de données, mes telegram et youtube canaux pourraient vous intéresser. La majeure partie du contenu y est consacrée au langage R.

  1. La classe Updater
  2. Handlers - gestionnaires
  3. Ajoutons la première commande au bot, le gestionnaire de commandes.
  4. Gestionnaire de messages textuels et filtres
  5. Ajout de commandes avec des paramètres
  6. Lançons le bot en arrière-plan.
  7. Conclusion

La classe Updater

Updater C'est une classe qui vous facilite le développement de bots Telegram, et utilise en arrière-plan la classe. Dispetcher. L'objectif de la classe Updater est d'obtenir des mises à jour du bot (dans l'article précédent, nous avons utilisé à cette fin la méthode. getUpdates()), et de les transmettre à. Dispetcher.

À son tour, Dispetcher contient les gestionnaires que vous avez créés, c'est-à-dire des objets de la classe. Handler.

Handlers - gestionnaires

Avec ces gestionnaires, vous ajoutez au bot. Dispetcher des réactions à divers événements. Au moment de la rédaction de l'article, il y a les types de gestionnaires suivants : telegram.bot MessageHandler - Gestionnaire de messages

  • CommandHandler - Gestionnaire de commandes
  • CallbackQueryHandler - Gestionnaire de données envoyées depuis des claviers en ligne
  • ErrorHandler - Gestionnaire d'erreurs lors de la requête de mises à jour du bot
  • Si vous n'avez jamais utilisé de bots auparavant et que vous ne savez pas ce qu'est une commande, les commandes doivent être envoyées au bot avec un slash direct.

Ajoutons la première commande au bot, le gestionnaire de commandes.

comme préfixe. / Nous commencerons par des commandes simples, c'est-à-dire que nous allons apprendre à notre bot à saluer par la commande.

Code 1 : Nous apprenons au bot à saluer. /hi.

Code 1 : Apprenons au bot à saluer

library(telegram.bot)

# Créons une instance de la classe Updater
updater <- Updater('VOTRE TOKEN DE BOT')

# Écrivons une méthode pour saluer
say_hello <- function(bot, update) {

  # Nom d'utilisateur avec lequel saluer
  user_name <- update$message$from$first_name

  # Envoi d'un message de bienvenue
  bot$sendMessage(update$message$chat_id, 
                  text = paste0("Mon respect, ", user_name, " !"), 
                  parse_mode = "Markdown")

}

# Créons un gestionnaire
hi_hendler <- CommandHandler('hi', say_hello)

# Ajoutons le gestionnaire au dispatcher
updater <- updater + hi_hendler

# Démarrons le bot
updater$start_polling()

Exécutez l'exemple de code ci-dessus, en remplaçant 'VOTRE TOKEN DE BOT' par le véritable token que vous avez obtenu lors de la création du bot via BotFather (j'ai parlé de la création de bot dans dans le premier article).

Méthode start_polling() classe Updater, qui est utilisé à la fin du code, lance une boucle infinie de requêtes et de traitement des mises à jour du bot.

Ouvrons maintenant Telegram et envoyons à notre bot notre première commande /hi.

Création d'un bot Telegram en R (partie 2) : Ajout de la prise en charge des commandes et des filtres de messages

Maintenant, notre bot comprend la commande /hi, et peut nous saluer.

Schematiquement, le processus de construction d'un tel bot simple peut être représenté comme suit.

Création d'un bot Telegram en R (partie 2) : Ajout de la prise en charge des commandes et des filtres de messages

  1. Créons une instance de la classe Updater;
  2. Créons des méthodes, c'est-à-dire des fonctions que notre bot exécutera. Dans l'exemple de code, il s'agit de la fonction say_hello(). Les fonctions que vous utiliserez en tant que méthodes du bot doivent avoir deux arguments obligatoires — bot et update, et un optionnel — args. L'argument bot, c'est votre bot, grâce à lui vous pouvez répondre aux messages, envoyer des messages, ou utiliser toutes les autres méthodes accessibles au bot. L'argument update est ce que le bot a reçu de l'utilisateur, en réalité, ce que dans le premier article nous avons reçu par la méthode getUpdates(). L'argument args permet de traiter des données supplémentaires envoyées par l'utilisateur avec la commande, nous y reviendrons un peu plus tard;
  3. Créons des gestionnaires, c'est-à-dire, lions certaines actions de l'utilisateur avec les méthodes créées à l'étape précédente. En fait, un gestionnaire est un déclencheur, un événement qui appelle une fonction du bot. Dans notre exemple, ce déclencheur est l'envoi de la commande /hi, et se réalise par la commande hi_hendler <- CommandHandler('hi', say_hello). Le premier argument de la fonction CommandHandler() vous permet de définir la commande, dans notre cas hi, sur laquelle le bot réagira. Le deuxième argument vous permet de spécifier la méthode du bot, nous allons appeler la méthode say_hello, qui sera exécuté si l'utilisateur appelle la commande spécifiée dans le premier argument;
  4. Nous ajoutons ensuite le gestionnaire créé au dispatcher de notre instance de classe Updater. Les gestionnaires peuvent être ajoutés de plusieurs manières, dans l'exemple ci-dessus, j'ai utilisé la plus simple, avec le signe +, c'est-à-dire updater <- updater + hi_handler. Il en va de même avec la méthode add_handler(), qui appartient à la classe Dispatcher, on peut trouver cette méthode comme suit: updater$dispatcher$add_handler();
  5. Nous démarrons le bot avec la commande start_polling().

Gestionnaire de messages textuels et filtres

Nous avons compris comment envoyer des commandes au bot, mais parfois nous avons besoin que le bot réagisse non seulement aux commandes, mais aussi à des messages texte ordinaires. Pour cela, il est nécessaire d'utiliser des gestionnaires de messages — MessageHandler.

Standard MessageHandler réagira à tous les messages entrants. Par conséquent, les gestionnaires de messages sont souvent utilisés avec des filtres. Apprenons au bot à saluer non seulement sur commande /hi, mais également chaque fois qu'un des mots suivants est inclus dans le message envoyé au bot : bonjour, salut, coucou, hi, bonjour.

Pour l'instant, nous n'allons pas écrire de nouvelles méthodes, car nous avons déjà une méthode avec laquelle le bot nous salue. Il ne nous reste plus qu'à créer le filtre nécessaire et le gestionnaire de messages.

Code 2 : Ajout d'un gestionnaire de messages texte et filtre

library(telegram.bot)

# Nous créons une instance de la classe Updater
updater <- Updater('VOTRE TOKEN DE BOT')

# Écrivons une méthode de salutation
## commande de salutation
say_hello <- function(bot, update) {

  # Nom de l'utilisateur à saluer
  user_name <- update$message$from$first_name

  # Envoyer le message de salutation
  bot$sendMessage(update$message$chat_id, 
                  text = paste0("Je vous salue, ", user_name, "!"),
                  parse_mode = "Markdown",
                  reply_to_message_id = update$message$message_id)

}

# Nous créons des filtres
MessageFilters$hi <- BaseFilter(function(message) {

  # Vérifiez si les mots : bonjour, salut, coucou, hi, bonjour apparaissent dans le texte du message
  grepl(x           = message$text, 
        pattern     = 'bonjour|salut|coucou|hi|bonjour',
        ignore.case = TRUE)
  }
)

# Nous créons un gestionnaire 
hi_handler <- CommandHandler('hi', say_hello) # gestionnaire pour la commande hi
hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi)

# ajoutons les gestionnaires au dispatcher
updater <- updater + 
             hi_handler +
             hi_txt_hnd

# nous démarrons le bot
updater$start_polling()

Exécutez l'exemple de code ci-dessus, en remplaçant 'VOTRE TOKEN DE BOT' par le véritable token que vous avez obtenu lors de la création du bot via BotFather (j'ai parlé de la création de bot dans dans le premier article).

Essayons maintenant d'envoyer quelques messages au bot, contenant les mots de salutation mentionnés précédemment :
Création d'un bot Telegram en R (partie 2) : Ajout de la prise en charge des commandes et des filtres de messages

Pour commencer, nous avons appris au bot non seulement à saluer, mais aussi à répondre à la salutation. Nous l'avons fait grâce à l'argument reply_to_message_id, qui est disponible dans la méthode sendMessage(), à laquelle il est nécessaire de transmettre l'ID du message auquel nous voulons répondre. Nous pouvons obtenir l'ID du message de cette manière : update$message$message_id.

Mais le principal que nous avons fait — c'est ajouter un filtre au bot grâce à la fonction BaseFilter():

# создаём фильтры
MessageFilters$hi <- BaseFilter( 

  # анонимная фильтрующая функция
  function(message) {

    # проверяем, встречается ли в тексте сообщения слова приветствия
    grepl(x           = message$text, 
          pattern     = 'привет|здравствуй|салют|хай|бонжур',
          ignore.case = TRUE)
  }

)

Comme vous l'avez peut-être remarqué, les filtres doivent être ajoutés à l'objet MessageFilters, qui contient déjà un petit ensemble de filtres prêts à l'emploi. Dans notre exemple, dans l'objet MessageFilters nous avons ajouté l'élément hi, qui est un nouveau filtre.

Dans la fonction BaseFilter() vous devez transmettre la fonction de filtrage. En essence, un filtre est simplement une fonction qui reçoit une instance de message et retourne VRAI ou FAUX. Dans notre exemple, nous avons écrit une simple fonction qui, grâce à la fonction de base grepl() vérifie le texte du message, et si celui-ci correspond à l'expression régulière bonjour|salut|salutation|hi|bonjour retourne VRAI.

Ensuite, nous créons un gestionnaire de messages hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi). Le premier argument de la fonction MessageHandler() — est la méthode qui appellera le gestionnaire, et le second argument — est le filtre selon lequel il sera appelé. Dans notre cas, c'est le filtre que nous avons créé MessageFilters$hi.

Et donc, au final, nous ajoutons au dispatcher le gestionnaire que nous venons de créer hi_txt_hnd.

updater <- updater + 
             hi_hendler +
             hi_txt_hnd

Comme je l'ai déjà mentionné, dans le package telegram.bot et l'objet MessageFilters il y a déjà un ensemble de filtres intégrés que vous pouvez utiliser :

  • all — Tous les messages
  • text — Messages textuels
  • command — Commandes, c'est-à-dire des messages qui commencent par /
  • reply — Messages qui sont des réponses à un autre message
  • audio — Messages contenant un fichier audio
  • document — Messages avec un document envoyé
  • photo — Messages avec des images envoyées
  • sticker — Messages avec un autocollant envoyé
  • video — Messages avec vidéo
  • voice — Messages vocaux
  • contact — Messages contenant le contact d'un utilisateur de Telegram
  • location — Messages avec géolocalisation
  • venue — Messages transférés
  • game — Jeux

Si vous voulez combiner certains filtres dans un seul gestionnaire, utilisez simplement le signe | — comme logique OU, et le signe & en tant que logique Et. Par exemple, si vous souhaitez que le bot appelle la même méthode lorsqu'il reçoit une vidéo, une image ou un document, utilisez l'exemple suivant pour créer un gestionnaire de messages :

handler <- MessageHandler(callback, 
  MessageFilters$video | MessageFilters$photo | MessageFilters$document
)

Ajout de commandes avec des paramètres

Nous savons déjà ce que sont les commandes, comment les créer et comment faire exécuter la commande souhaitée par le bot. Mais dans certains cas, en plus du nom de la commande, nous devons transmettre certaines données pour son exécution.

Voici un exemple de bot qui retourne le type de jour du calendrier de production selon la date et le pays donnés.

Le bot ci-dessous utilise l'API du calendrier de production isdayoff.ru.

Code 3 : Un bot qui informe selon la date et le pays

library(telegram.bot)

# Créons une instance de la classe Updater
updater <- Updater('1165649194:AAFkDqIzQ6Wq5GV0YU7PmEZcv1gmWIFIB_8')

# Écrivons une méthode pour l'accueil
## commande d'accueil
check_date <- function(bot, update, args) {

  # données entrantes
  day <- args[1]  # date
  country <- args[2]  # pays

  # vérification des paramètres saisis
  if ( !grepl('\d{4}-\d{2}-\d{2}', day) ) {

    # Envoyer un clavier personnalisé
    bot$sendMessage(update$message$chat_id, 
                    text = paste0(day, " - date incorrecte, veuillez entrer une date au format AAAA-MM-JJ"),
                    parse_mode = "Markdown")

  } else {
    day <- as.Date(day)
    # convertir au format POSIXtl
    y <- format(day, "%Y")
    m <- format(day, "%m")
    d <- format(day, "%d")

  }

  # pays à vérifier
  ## vérifier si le pays est spécifié
  ## si non spécifié, définir sur ru
  if ( ! country %in% c('ru', 'ua', 'by', 'kz', 'us') ) {

    # Envoyer un clavier personnalisé
    bot$sendMessage(update$message$chat_id, 
                    text = paste0(country, " - code pays incorrect, valeurs possibles : ru, by, kz, ua, us. Données demandées pour la Russie."),
                    parse_mode = "Markdown")

    country <- 'ru'

  }

  # requête de données API
  # composition de la requête HTTP
  url <- paste0("https://isdayoff.ru/api/getdata?",
                "year=",  y, "&",
                "month=", m, "&",
                "day=",   d, "&",
                "cc=",    country, "&",
                "pre=1&",
                "covid=1")

  # obtenir la réponse
  res <- readLines(url)

  # interprétation de la réponse
  out <- switch(res, 
                "0"   = "Jour ouvrable",
                "1"   = "Jour non ouvrable",
                "2"   = "Jour ouvré réduit",
                "4"   = "covid-19",
                "100" = "Erreur dans la date",
                "101" = "Données non trouvées",
                "199" = "Erreur du service")

  # envoyer un message
  bot$sendMessage(update$message$chat_id, 
                  text = paste0(day, " - ", out),
                  parse_mode = "Markdown")

}

# créer un gestionnaire
date_handler <- CommandHandler('check_date', check_date, pass_args = TRUE)

# ajouter le gestionnaire au dispatcher
updater <- updater + date_handler

# démarrer le bot
updater$start_polling()

Exécutez l'exemple de code ci-dessus, en remplaçant 'VOTRE TOKEN DE BOT' par le véritable token que vous avez obtenu lors de la création du bot via BotFather (j'ai parlé de la création de bot dans dans le premier article).

Nous avons créé un bot qui ne possède qu'une seule méthode check_date, cette méthode est appelée par la commande du même nom.

Cependant, en plus du nom de la commande, cette méthode attend que vous saisissiez deux paramètres, le code pays et la date. Ensuite, le bot vérifie si le jour spécifié dans le pays donné est un jour férié, un jour réduit ou un jour ouvrable selon le calendrier de production officiel.

Pour que la méthode que nous créons accepte des paramètres supplémentaires avec la commande, utilisez l'argument pass_args = TRUE dans la fonction CommandHandler(), et lors de la création de la méthode, en plus des arguments obligatoires bot, update créez un argument optionnel — argsLa méthode ainsi créée prendra en compte les paramètres que vous transmettez au bot après le nom de la commande. Les paramètres doivent être séparés par un espace, et ils seront reçus sous forme de vecteur de texte.

Lançons et testons notre bot.

Création d'un bot Telegram en R (partie 2) : Ajout de la prise en charge des commandes et des filtres de messages

Lançons le bot en arrière-plan.

La dernière étape que nous devons accomplir est de lancer le bot en arrière-plan.

Pour cela, suivez l'algorithme décrit ci-dessous :

  1. Enregistrez le code du bot dans un fichier avec l'extension R. Dans RStudio, cela se fait via le menu Fichier, en utilisant la commande Enregistrer sous….
  2. Ajoutez le chemin vers le dossier bin, qui se trouve dans le dossier où vous avez installé le langage R, à la variable Path, les instructions ici.
  3. Créez un fichier texte simple, dans lequel vous écrirez une ligne : R CMD BATCH C:UsersAlseyDocumentsmy_bot.R. Au lieu de C:UsersAlseyDocumentsmy_bot.R indiquez le chemin de votre script de bot. Il est important que le chemin ne contienne pas de caractères cyrilliques ni d'espaces, car cela pourrait poser des problèmes lors du lancement du bot. Enregistrez-le et changez son extension de txt sur bat.
  4. Ouvrez le planificateur de tâches Windows, il existe plusieurs façons de le faire, par exemple, ouvrez n'importe quel dossier et entrez dans l'adresse %windir%system32taskschd.msc /s. D'autres façons de lancer peuvent être trouvées ici.
  5. Dans le coin supérieur droit du planificateur, cliquez sur "Créer une tâche…".
  6. Dans l'onglet "Général", donnez un nom à votre tâche et passez le commutateur à l'état "Exécuter pour tous les utilisateurs".
  7. Allez dans l'onglet "Actions", cliquez sur "Créer". Dans le champ "Programme ou script", cliquez sur "Parcourir", trouvez le fichier créé à l'étape deux bat , puis cliquez sur OK.
  8. Cliquez sur OK, et si nécessaire, saisissez le mot de passe de votre compte système.
  9. Trouvez la tâche créée dans le planificateur, sélectionnez-la et dans le coin inférieur droit, cliquez sur le bouton "Exécuter".

Notre bot est lancé en arrière-plan et fonctionnera tant que vous n'arrêtez pas la tâche ou que vous n'éteignez pas votre PC ou serveur sur lequel il a été lancé.

Conclusion

Dans cet article, nous avons compris comment écrire un bot complet qui peut non seulement envoyer des messages, mais aussi réagir aux messages et commandes entrants. Les connaissances acquises sont déjà suffisantes pour résoudre la plupart de vos tâches.

Dans le prochain article, nous parlerons de la façon d'ajouter un clavier au bot, pour un travail plus confortable.

Abonnez-vous à mon telegram et youtube canal.

Source : habr.com

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster