Écrire un bot de télégramme dans R (partie 2) : Ajout de la prise en charge des commandes et des filtres de messages au bot

В publication précédente nous avons compris comment créer un bot, initialisé une instance de la classe Bot et s'est familiarisé avec les méthodes d'envoi de messages en l'utilisant.

Dans cet article, je continue ce sujet, je recommande donc de commencer à lire cet article seulement après avoir lu la première partie.

Cette fois, nous verrons comment relancer notre bot et lui ajouter le support des commandes, et également nous familiariser avec la classe Updater.

Au cours de l'article, nous écrirons plusieurs robots simples, ces derniers vont, en fonction d'une date et d'un code pays donnés, déterminer si un jour dans un pays donné est un week-end ou un jour ouvrable selon le calendrier de production. Mais, comme précédemment, le but de l'article est de vous familiariser avec l'interface du package telegram.bot pour résoudre vos propres problèmes.

Écrire un bot de télégramme dans R (partie 2) : Ajout de la prise en charge des commandes et des filtres de messages au bot

Tous les articles de la série « Écrire un bot télégramme en R »

  1. Nous créons un bot et l'utilisons pour envoyer des messages par télégramme
  2. Ajouter la prise en charge des commandes et des filtres de messages au bot

Teneur

Si vous êtes intéressé par l'analyse des données, vous pourriez être intéressé par mon télégramme и Youtube canaux. La plupart du contenu est dédié au langage R.

  1. Classe de mise à jour
  2. Gestionnaires - gestionnaires
  3. Ajoutez la première commande au bot, gestionnaire de commandes
  4. Processeur et filtres de messages texte
  5. Ajout de commandes avec des paramètres
  6. Exécutez le bot en arrière-plan
  7. Conclusion

Classe de mise à jour

Updater est une classe qui vous permet de développer plus facilement un robot télégramme et utilise la classe sous le capot Dispetcher. Devoir de classe Updater est de recevoir les mises à jour du bot (dans l'article précédent nous avons utilisé la méthode à cet effet getUpdates()), et transférez-les ensuite vers Dispetcher.

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

Gestionnaires - gestionnaires

Avec les gestionnaires que vous ajoutez à Dispetcher réactions des robots à divers événements. Au moment de la rédaction de cet article dans telegram.bot Les types de gestionnaires suivants ont été ajoutés :

  • MessageHandler — Gestionnaire de messages
  • CommandHandler — Gestionnaire de commandes
  • CallbackQueryHandler — Gestionnaire de données pour les claviers envoyés depuis Inline
  • ErrorHandler — Gestionnaire d'erreurs lors de la demande de mises à jour du bot

Ajoutez la première commande au bot, gestionnaire de commandes

Si vous n'avez jamais utilisé de robots auparavant et que vous ne savez pas ce qu'est une commande, les commandes au robot doivent être envoyées à l'aide d'une barre oblique. / comme préfixe.

Nous commencerons par des commandes simples, c'est-à-dire apprenons à notre bot à dire bonjour sur commande /hi.

Code 1 : Apprendre au bot à dire bonjour

library(telegram.bot)

# создаём экземпляр класса Updater
updater <- Updater('ТОКЕН ВАШЕГО БОТА')

# Пишем метод для приветсвия
say_hello <- function(bot, update) {

  # Имя пользователя с которым надо поздароваться
  user_name <- update$message$from$first_name

  # Отправка приветственного сообщения
  bot$sendMessage(update$message$chat_id, 
                  text = paste0("Моё почтение, ", user_name, "!"), 
                  parse_mode = "Markdown")

}

# создаём обработчик 
hi_hendler <- CommandHandler('hi', say_hello)

# добаляем обработчик в диспетчер
updater <- updater + hi_hendler

# запускаем бота
updater$start_polling()

Exécutez l'exemple de code ci-dessus, après avoir remplacé « VOTRE JETON DE BOT » par le vrai jeton que vous avez reçu lors de la création du bot via BotFather (J'ai parlé de créer un bot dans premier article).

méthode start_polling() Classe Updater, qui est utilisé à la fin du code, démarre une boucle sans fin de demande et de traitement des mises à jour du bot.

Ouvrons maintenant Telegram et écrivons la première commande sur notre bot /hi.

Écrire un bot de télégramme dans R (partie 2) : Ajout de la prise en charge des commandes et des filtres de messages au bot

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

Schématiquement, le processus de création d’un robot aussi simple peut être décrit comme suit.

Écrire un bot de télégramme dans R (partie 2) : Ajout de la prise en charge des commandes et des filtres de messages au bot

  1. Créer une instance de la classe Updater;
  2. Nous créons des méthodes, c'est-à-dire fonctions que notre bot exécutera. Dans l'exemple de code, il s'agit d'une fonction say_hello(). Les fonctions que vous utiliserez comme méthodes de bot doivent avoir deux arguments obligatoires : bot и Mise à jour, et un facultatif - args. Argument bot, c'est votre bot, avec son aide, vous pouvez répondre aux messages, envoyer des messages ou utiliser toute autre méthode disponible pour le bot. Argument Mise à jour c'est ce que le bot a reçu de l'utilisateur, en fait, ce que nous avons reçu dans le premier article en utilisant la méthode getUpdates(). Argument args permet de traiter des données supplémentaires envoyées par l'utilisateur avec la commande, nous reviendrons sur ce sujet un peu plus tard ;
  3. Nous créons des gestionnaires, c'est-à-dire Nous associons certaines actions utilisateur aux méthodes créées à l'étape précédente. Essentiellement, un gestionnaire est un déclencheur, un événement qui appelle une fonction de robot. Dans notre exemple, un tel déclencheur envoie une commande /hi, et est mis en œuvre par l'équipe hi_hendler <- CommandHandler('hi', say_hello). Premier argument de fonction CommandHandler() permet de spécifier une commande, dans notre cas hi, auquel le bot répondra. Le deuxième argument permet de préciser la méthode du bot, nous appellerons la méthode say_hello, qui sera exécuté si l'utilisateur appelle la commande spécifiée dans le premier argument ;
  4. Ensuite, nous ajoutons le gestionnaire créé au répartiteur de notre instance de classe Updater. Vous pouvez ajouter des gestionnaires de plusieurs manières ; dans l'exemple ci-dessus, j'ai utilisé la plus simple, en utilisant le signe +C.-à- updater <- updater + hi_hendler. La même chose peut être faite en utilisant la méthode add_handler(), qui appartient à la classe Dispatcher, vous pouvez trouver cette méthode comme ceci : updater$dispatcher$add_handler();
  5. Lancez le bot en utilisant la commande start_polling().

Processeur et filtres de messages texte

Nous avons compris comment envoyer des commandes au bot, mais parfois nous avons besoin que le bot réponde non seulement aux commandes, mais également à certains messages texte réguliers. Pour ce faire, vous devez utiliser des gestionnaires de messages - Gestionnaire de messages.

Normal Gestionnaire de messages répondra à absolument tous les messages entrants. Par conséquent, les gestionnaires de messages sont souvent utilisés avec des filtres. Apprenons au bot à dire bonjour non seulement sur commande /hi, mais aussi chaque fois que l'un des mots suivants apparaît dans le message envoyé au bot : hello, hello, salute, hai, bonjour.

Pour l'instant, nous n'écrirons pas de nouvelles méthodes, car... Nous avons déjà une méthode par laquelle le bot nous salue. Tout ce que nous devons faire est de créer le filtre et le gestionnaire de messages requis.

Code 2 : ajouter un gestionnaire de messages texte et un filtre

library(telegram.bot)

# создаём экземпляр класса Updater
updater <- Updater('ТОКЕН ВАШЕГО БОТА')

# Пишем метод для приветсвия
## команда приветвия
say_hello <- function(bot, update) {

  # Имя пользователя с которым надо поздароваться
  user_name <- update$message$from$first_name

  # Отправляем приветсвенное сообщение
  bot$sendMessage(update$message$chat_id, 
                  text = paste0("Моё почтение, ", user_name, "!"),
                  parse_mode = "Markdown",
                  reply_to_message_id = update$message$message_id)

}

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

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

# создаём обработчик 
hi_hendler <- CommandHandler('hi', say_hello) # обработчик команды hi
hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi)

# добаляем обработчики в диспетчер
updater <- updater + 
             hi_hendler +
             hi_txt_hnd

# запускаем бота
updater$start_polling()

Exécutez l'exemple de code ci-dessus, après avoir remplacé « VOTRE JETON DE BOT » par le vrai jeton que vous avez reçu lors de la création du bot via BotFather (J'ai parlé de créer un bot dans premier article).

Essayons maintenant d'envoyer au bot plusieurs messages contenant les mots de salutation répertoriés précédemment :
Écrire un bot de télégramme dans R (partie 2) : Ajout de la prise en charge des commandes et des filtres de messages au bot

Donc, tout d’abord, nous avons appris au robot non seulement à dire bonjour, mais aussi à répondre à un message d’accueil. Nous l'avons fait en utilisant l'argument réponse_to_message_id, qui est disponible dans la méthode sendMessage(), dans lequel vous devez transférer l'identifiant du message auquel vous souhaitez répondre. Vous pouvez obtenir l'identifiant du message comme ceci : update$message$message_id.

Mais la principale chose que nous avons faite a été d'ajouter un filtre au bot en utilisant la fonction BaseFilter():

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

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

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

)

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

En fonction BaseFilter() vous devez passer la fonction de filtre. Essentiellement, un filtre est simplement une fonction qui reçoit une instance de message et renvoie VRAI ou FAUX. Dans notre exemple, nous avons écrit une fonction simple qui, en utilisant la fonction de base grepl() vérifie le texte du message et s'il correspond à l'expression régulière привет|здравствуй|салют|хай|бонжур retourne VRAI.

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

Eh bien, à la fin, nous ajoutons au répartiteur le gestionnaire créé hi_txt_hnd.

updater <- updater + 
             hi_hendler +
             hi_txt_hnd

Comme je l'ai écrit ci-dessus, dans le paquet telegram.bot et objet Filtres de messages Il existe déjà un ensemble de filtres intégrés que vous pouvez utiliser :

  • tout — Tous les messages
  • texte — Messages texte
  • command — Commandes, c'est-à-dire messages commençant par /
  • réponse — Messages qui sont une réponse à un autre message
  • audio — Messages contenant un fichier audio
  • document — Messages avec un document envoyé
  • photo - Messages avec images envoyées
  • autocollant — Messages avec un autocollant envoyé
  • vidéo — Messages avec vidéo
  • voix - Messages vocaux
  • contact — Messages contenant le contenu du télégramme de l'utilisateur
  • localisation — Messages avec géolocalisation
  • lieu — Messages transférés
  • jeu — Jeux

Si vous souhaitez combiner certains filtres dans un seul gestionnaire, utilisez simplement le signe | - comme une logique OU, et signez & aussi logique И. 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 forcer le bot à exécuter la commande souhaitée. Mais dans certains cas, en plus du nom de la commande, nous devons transmettre certaines données pour l'exécuter.

Vous trouverez ci-dessous un exemple de bot qui, étant donné une date et un pays donnés, vous renvoie le type de jour du calendrier de production.

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

Code 3 : Bot qui rapporte par date et par pays

library(telegram.bot)

# создаём экземпляр класса Updater
updater <- Updater('1165649194:AAFkDqIzQ6Wq5GV0YU7PmEZcv1gmWIFIB_8')

# Пишем метод для приветсвия
## команда приветвия
check_date <- function(bot, update, args) {

  # входящие данные
  day     <- args[1]  # дата
  country <- args[2]  # страна

  # проверка введённых параметров
  if ( !grepl('\d{4}-\d{2}-\d{2}', day) ) {

    # Send Custom Keyboard
    bot$sendMessage(update$message$chat_id, 
                    text = paste0(day, " - некорреткная дата, введите дату в формате ГГГГ-ММ-ДД"),
                    parse_mode = "Markdown")

  } else {
    day <- as.Date(day)
    # переводим в формат POSIXtl
    y <- format(day, "%Y")
    m <- format(day, "%m")
    d <- format(day, "%d")

  }

  # страна для проверки
  ## проверяем задана ли страна
  ## если не задана устанавливаем ru
  if ( ! country %in% c('ru', 'ua', 'by', 'kz', 'us') ) {

    # Send Custom Keyboard
    bot$sendMessage(update$message$chat_id, 
                    text = paste0(country, " - некорретктный код страны, возможнные значения: ru, by, kz, ua, us. Запрошены данные по России."),
                    parse_mode = "Markdown")

    country <- 'ru'

  }

  # запрос данных из API
  # компоновка HTTP запроса
  url <- paste0("https://isdayoff.ru/api/getdata?",
                "year=",  y, "&",
                "month=", m, "&",
                "day=",   d, "&",
                "cc=",    country, "&",
                "pre=1&",
                "covid=1")

  # получаем ответ
  res <- readLines(url)

  # интрепретация ответа
  out <- switch(res, 
                "0"   = "Рабочий день",
                "1"   = "Нерабочий день",
                "2"   = "Сокращённый рабочий день",
                "4"   = "covid-19",
                "100" = "Ошибка в дате",
                "101" = "Данные не найдены",
                "199" = "Ошибка сервиса")

  # отправляем сообщение
  bot$sendMessage(update$message$chat_id, 
                  text = paste0(day, " - ", out),
                  parse_mode = "Markdown")

}

# создаём обработчик 
date_hendler <- CommandHandler('check_date', check_date, pass_args = TRUE)

# добаляем обработчик в диспетчер
updater <- updater + date_hendler

# запускаем бота
updater$start_polling()

Exécutez l'exemple de code ci-dessus, après avoir remplacé « VOTRE JETON DE BOT » par le vrai jeton que vous avez reçu lors de la création du bot via BotFather (J'ai parlé de créer un bot dans premier article).

Nous avons créé un bot qui n'a qu'une seule méthode dans son arsenal check_date, cette méthode est appelée par la commande du même nom.

Mais, en plus du nom de la commande, cette méthode nécessite de saisir deux paramètres, le code du pays et la date. Ensuite, le robot vérifie si un jour donné dans le pays spécifié est un week-end, un jour raccourci ou un jour ouvrable selon le calendrier officiel de production.

Pour que la méthode que nous créons accepte des paramètres supplémentaires avec la commande, utilisez l'argument pass_args = TRUE en fonction CommandHandler(), et lors de la création d'une méthode, en plus des arguments requis bot, Mise à jour créez-en un facultatif - args. La méthode créée de cette manière acceptera 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, ils seront envoyés à la méthode sous forme de vecteur texte.

Lançons et testons notre bot.

Écrire un bot de télégramme dans R (partie 2) : Ajout de la prise en charge des commandes et des filtres de messages au bot

Exécutez le bot en arrière-plan

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

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

  1. Enregistrez le code du bot dans un fichier avec l'extension R. Lorsque vous travaillez dans RStudio, cela se fait via le menu Déposez votre dernière attestation , équipe Enregistrer sous….
  2. Ajoutez le chemin du dossier bin, qui se trouve à son tour dans le dossier dans lequel vous avez installé le langage R, à la variable Path, instructions ici.
  3. Créez un fichier texte normal dans lequel écrivez 1 ligne : R CMD BATCH C:UsersAlseyDocumentsmy_bot.R. Au lieu de C:UtilisateursAlseyDocumentsmy_bot.R écrivez le chemin d'accès à votre script de bot. Dans le même temps, il est important qu'il n'y ait pas de caractères cyrilliques ni d'espaces le long du chemin, car cela peut poser des problèmes lors de l'exécution du bot. Enregistrez-le et remplacez son extension par txt sur chauves-souris.
  4. Ouvrez le Planificateur de tâches Windows, il existe de nombreuses façons de le faire, par exemple, ouvrez n'importe quel dossier et entrez l'adresse %windir%system32taskschd.msc /s. D'autres méthodes de lancement peuvent être trouvées ici.
  5. Dans le menu en haut à droite du planificateur, cliquez sur "Créer une tâche...".
  6. Dans l'onglet "Général", donnez un nom personnalisé à votre tâche et basculez le commutateur sur 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", recherchez celui créé à la deuxième étape chauves-souris fichier et cliquez sur OK.
  8. Cliquez sur OK et, si nécessaire, saisissez le mot de passe de votre compte de système d'exploitation.
  9. Recherchez la tâche créée dans le planificateur, sélectionnez-la et cliquez sur le bouton « Exécuter » dans le coin inférieur droit.

Notre bot fonctionne en arrière-plan et fonctionnera jusqu'à ce que vous arrêtiez la tâche ou éteigniez votre PC ou serveur sur lequel il a été lancé.

Conclusion

Dans cet article, nous avons compris comment écrire un robot à part entière capable non seulement d'envoyer des messages, mais également de répondre aux messages et commandes entrants. Les connaissances acquises sont déjà suffisantes pour résoudre la plupart de vos problèmes.

Le prochain article expliquera comment ajouter un clavier au bot pour un travail plus pratique.

Abonnez-vous à mon télégramme и Youtube canaux.

Source: habr.com

Ajouter un commentaire