Wir erstellen einen Telegram-Bot in R (Teil 2): Unterstützung von Befehlen und Nachrichtenfiltern hinzufügen

In vorherigen Beitrag Wir haben gelernt, wie man einen Bot erstellt und eine Instanz der Klasse initialisiert. Bot Außerdem haben wir uns mit den Methoden zur Nachrichtenübermittlung vertraut gemacht.

In diesem Artikel setze ich dieses Thema fort, daher empfehle ich, diesen Artikel erst nach dem Lesen des vorherigen zu beginnen. dem ersten Teil.

Dieses Mal werden wir herausfinden, wie wir unseren Bot zum Leben erwecken und ihm Befehlsunterstützung hinzufügen. Dabei lernen wir die Klasse Updater.

kennen. Im Laufe des Artikels werden wir mehrere einfache Bots schreiben, wobei der letzte anhand eines bestimmten Datums und des Landescodes bestimmen wird, ob ein Tag in diesem Land ein Feiertag oder ein Arbeitstag laut Arbeitskalender ist. Doch wie zuvor ist das Ziel des Artikels, Ihnen die Schnittstelle des Pakets vorzustellen. telegram.bot um Ihre eigenen Aufgaben zu lösen.

Wir erstellen einen Telegram-Bot in R (Teil 2): Unterstützung von Befehlen und Nachrichtenfiltern hinzufügen

Allen Artikeln der Serie "Wir schreiben einen Telegram-Bot in der Programmiersprache R"

  1. Wir erstellen einen Bot und senden mit ihm Nachrichten in Telegram
  2. Wir fügen dem Bot Unterstützung für Befehle und Nachrichtenfilter hinzu

Inhalt

Falls Sie sich für Datenanalyse interessieren, könnten meine telegram und youtube Kanäle für Sie von Interesse sein. Der Großteil der Inhalte widmet sich der R-Sprache.

  1. Die Klasse Updater
  2. Handlers – die Handler
  3. Fügen Sie dem Bot den ersten Befehl hinzu, den Befehlshandler.
  4. Handler für Textnachrichten und Filter.
  5. Hinzufügen von Befehlen mit Parametern.
  6. Starten Sie den Bot im Hintergrund.
  7. Fazit

Die Klasse Updater

Updater Dies ist eine Klasse, die Ihnen die Entwicklung eines Telegram-Bots erleichtert und unter der Haube die Klasse Dispatcherverwendet. Der Zweck der Klasse Updater besteht darin, Updates vom Bot zu erhalten (im vorherigen Artikel haben wir dazu die Methode verwendet. getUpdates()), und sie dann weitergeben an Dispatcher.

Im Gegenzug Dispatcher enthält die von Ihnen erstellten Handler, d.h. Objekte der Klasse Handler.

Handlers – die Handler

Mit Hilfe von Handlern fügen Sie Dispatcher Reaktionen des Bots auf verschiedene Ereignisse hinzu. Zum Zeitpunkt des Schreibens dieses Artikels wurden telegram.bot die folgenden Handler-Typen hinzugefügt:

  • MessageHandler — Nachrichtenhandler
  • CommandHandler — Kommandohandler
  • CallbackQueryHandler — Handler für Daten, die von Inline-Tastaturen gesendet werden
  • ErrorHandler — Fehlerhandler für Aktualisierungsanfragen vom Bot

Fügen Sie dem Bot den ersten Befehl hinzu, den Befehlshandler.

Wenn Sie noch nie zuvor Bots verwendet haben und nicht wissen, was ein Befehl ist, müssen Befehle an den Bot mit einem direkten Schrägstrich / als Präfix gesendet werden.

Wir beginnen mit einfachen Befehlen, d.h. wir bringen unserem Bot bei, sich auf den Befehl /hi.

zu begrüßen. Code 1: Bringen wir dem Bot das Grüßen bei.

library(telegram.bot)

# Erstellen Sie eine Instanz der Klasse Updater
updater <- Updater('IHRE BOT-TOKEN')

# Schreiben Sie eine Methode zur Begrüßung
say_hello <- function(bot, update) {

  # Benutzername, mit dem man sich begrüßen muss
  user_name <- update$message$from$first_name

  # Versand der Begrüßungsnachricht
  bot$sendMessage(update$message$chat_id, 
                  text = paste0("Ich grüße Sie, ", user_name, "!"), 
                  parse_mode = "Markdown")

}

# Erstellen Sie einen Handler
hi_handler <- CommandHandler('hi', say_hello)

# Fügen Sie den Handler zum Dispatcher hinzu
updater <- updater + hi_handler

# Starten Sie den Bot
updater$start_polling()

Starten Sie das oben angeführte Codebeispiel, indem Sie 'IHR BOT-TOKEN' durch das tatsächliche Token ersetzen, das Sie bei der Erstellung des Bots über BotFather erhalten haben (ich habe in im ersten Artikel).

Methode start_polling() der Klasse Updater, der am Ende des Codes verwendet wird, startet eine unendliche Schleife zur Abfrage und Verarbeitung von Updates vom Bot.

Jetzt öffnen wir Telegram und senden unserer Bot die erste Kommando /hi.

Wir erstellen einen Telegram-Bot in R (Teil 2): Unterstützung von Befehlen und Nachrichtenfiltern hinzufügen

Jetzt versteht unser Bot das Kommando /hi, und kann uns begrüßen.

Schematisch kann der Prozess des Aufbaus eines so einfachen Bots wie folgt dargestellt werden.

Wir erstellen einen Telegram-Bot in R (Teil 2): Unterstützung von Befehlen und Nachrichtenfiltern hinzufügen

  1. Erstellen Sie eine Instanz der Klasse Updater;
  2. Erstellen Sie Methoden, d.h. Funktionen, die unser Bot ausführen wird. Im Beispielcode ist das die Funktion say_hello(). Funktionen, die Sie als Methoden des Bots verwenden, müssen zwei zwingende Argumente haben — bot und Aktualisieren, und eines ist optional — .) Wir können dieses Rezept mit dem vorherigen kombinieren, um den Test im Debugger zu starten:. Das Argument bot, das ist Ihr Bot, mit dessen Hilfe Sie auf Nachrichten antworten, Nachrichten senden oder andere verfügbare Methoden des Bots nutzen können. Argument Aktualisieren das ist das, was der Bot vom Benutzer erhalten hat, im Grunde das, was wir im ersten Artikel mit einer Methode erhalten haben, getUpdates(). Das Argument .) Wir können dieses Rezept mit dem vorherigen kombinieren, um den Test im Debugger zu starten: ermöglicht es Ihnen, zusätzliche Daten zu verarbeiten, die der Benutzer zusammen mit dem Befehl gesendet hat, zu diesem Thema kommen wir etwas später zurück;
  3. Wir erstellen Handler, d.h. wir verknüpfen bestimmte Benutzeraktionen mit den in den vorherigen Schritten erstellten Methoden. Im Grunde genommen ist ein Handler ein Trigger, ein Ereignis, das eine bestimmte Funktion des Bots auslöst. In unserem Beispiel ist dieser Trigger das Senden des Befehls /hi, und wird mit dem Befehl hi_hendler <- CommandHandler('hi', say_hello). Das erste Argument der Funktion CommandHandler() ermöglicht es Ihnen, den Befehl festzulegen, in unserem Fall hi, auf den der Bot reagieren wird. Das zweite Argument ermöglicht es, die Methode des Bots anzugeben, wir werden die Methode say_hello, aufrufen, die ausgeführt wird, wenn der Benutzer den im ersten Argument angegebenen Befehl aufruft;
  4. Dann fügen wir den erstellten Handler dem Dispatcher unseres Klasseninstanz hinzu. Updater. Es gibt mehrere Möglichkeiten, Handler hinzuzufügen. Im obigen Beispiel habe ich die einfachste Methode verwendet, mit einem Zeichen +, d.h. updater <- updater + hi_hendler. Dasselbe kann mit der Methode add_handler(), die zur Klasse gehört, gemacht werden. Dispatcher, diese Methode findet man so: updater$dispatcher$add_handler();
  5. Wir starten den Bot mit dem Befehl start_polling().

Handler für Textnachrichten und Filter.

Wir haben bereits geklärt, wie wir dem Bot Befehle senden. Manchmal muss der Bot jedoch nicht nur auf Befehle reagieren, sondern auch auf einfache, textuelle Nachrichten. Dazu müssen wir Nachrichten-Handler verwenden — MessageHandler.

Standard MessageHandler wird auf alle eingehenden Nachrichten reagieren. Daher werden Nachrichten-Handler häufig zusammen mit Filtern verwendet. Lassen Sie uns den Bot nicht nur auf den Befehl begrüßen, /hi, sondern auch immer, wenn in einer Nachricht an den Bot eines der folgenden Worte vorkommt: hallo, guten Tag, salut, hi, bonjour.

Bis jetzt werden wir keine neuen Methoden schreiben, da wir bereits eine Methode haben, mit der der Bot uns begrüßt. Wir müssen nur den benötigten Filter und den Nachrichten-Handler erstellen.

Code 2: Nachrichtentext-Handler und Filter hinzufügen

library(telegram.bot)

# Erstellen Sie eine Instanz der Updater-Klasse
updater <- Updater('IHRE BOT-TOKEN')

# Schreiben einer Methode zur Begrüßung
## Begrüßungsbefehl
say_hello <- function(bot, update) {

  # Der Benutzername, mit dem wir interagieren wollen
  user_name <- update$message$from$first_name

  # Senden der Begrüßungsnachricht
  bot$sendMessage(update$message$chat_id, 
                  text = paste0("Ich begrüße Sie, ", user_name, "!"),
                  parse_mode = "Markdown",
                  reply_to_message_id = update$message$message_id)

}

# Erstellen von Filtern
MessageFilters$hi <- BaseFilter(function(message) {

  # Überprüfen, ob in der Nachricht die Worte: hallo, guten Tag, salut, hi, bonjour erscheinen
  grepl(x           = message$text, 
        pattern     = 'hallo|guten Tag|salut|hi|bonjour',
        ignore.case = TRUE)
  }
)

# Erstellen des Handlers 
hi_handler <- CommandHandler('hi', say_hello) # Handler für den Befehl hi
hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi)

# Hinzufügen der Handler zum Dispatcher
updater <- updater + 
             hi_handler +
             hi_txt_hnd

# Starten des Bots
updater$start_polling()

Starten Sie das oben angeführte Codebeispiel, indem Sie 'IHR BOT-TOKEN' durch das tatsächliche Token ersetzen, das Sie bei der Erstellung des Bots über BotFather erhalten haben (ich habe in im ersten Artikel).

Nun versuchen wir, dem Bot einige Nachrichten zu senden, in denen die zuvor genannten Begrüßungswörter enthalten sind:
Wir erstellen einen Telegram-Bot in R (Teil 2): Unterstützung von Befehlen und Nachrichtenfiltern hinzufügen

Also, zunächst haben wir den Bot nicht nur zum Grüßen gebracht, sondern ihm auch beigebracht, auf Begrüßungen zu antworten. Dies haben wir durch das Argument erreicht, reply_to_message_id, der im Methode verfügbar ist sendMessage(), in den die ID der Nachricht übergeben werden muss, auf die geantwortet werden soll. Die ID der Nachricht kann so erhalten werden: update$message$message_id.

Aber das Wichtigste, was wir gemacht haben, ist — wir haben dem Bot einen Filter mit der Funktion hinzugefügt BaseFilter():

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

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

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

)

Wie Sie vielleicht bemerkt haben, müssen Filter dem Objekt hinzugefügt werden Im Objekt, das bereits eine kleine Menge an fertigen Filtern enthält. In unserem Beispiel haben wir im Objekt Im Objekt ein Element hinzugefügt hi, das ist der neue Filter.

In die Funktion BaseFilter() Sie müssen die Filterfunktion übergeben. Im Grunde genommen ist der Filter einfach eine Funktion, die eine Instanz der Nachricht erhält und TRUE oder FALSEzurückgibt. In unserem Beispiel haben wir eine einfache Funktion geschrieben, die mit der Basisfunktion grepl() den Text der Nachricht überprüft, und wenn er dem regulären Ausdruck entspricht gibt er TRUE.

hallo|guten Tag|salut|hi|bonjour Dann erstellen wir einen Nachrichten-Handler. Das erste Argument der Funktion hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi) MessageHandler() — die Methode, die den Handler aufrufen wird, und das zweite Argument — der Filter, nach dem er aufgerufen wird. In unserem Fall ist das der Filter, den wir erstellt haben.

MessageFilters$hi Und schließlich fügen wir den gerade erstellten Handler dem Dispatcher hinzu.

hi_txt_hnd

Wie bereits oben erwähnt, im Paket telegram.bot und Objekt Im Objekt gibt es bereits eine Reihe eingebauter Filter, die Sie verwenden können:

  • all — Alle Nachrichten
  • text — Textnachrichten
  • command — Befehle, d.h. Nachrichten, die mit beginnen /
  • reply — Nachrichten, die eine Antwort auf eine andere Nachricht sind
  • audio — Nachrichten, die eine Audiodatei enthalten
  • document — Nachrichten mit einem gesendeten Dokument
  • photo — Nachrichten mit gesendeten Bildern
  • sticker — Nachrichten mit einem gesendeten Sticker
  • video — Nachrichten mit Video
  • voice — Sprachnachrichten
  • contact — Nachrichten, die den Kontakt eines Telegram-Nutzers enthalten
  • location — Nachrichten mit Geolokalisierung
  • venue — Weitergeleitete Nachrichten
  • game — Spiele

Wenn Sie einige Filter in einem Handler kombinieren möchten, verwenden Sie einfach das Zeichen | — als logisches ODER, und das Zeichen & als logisches Und. Zum Beispiel, wenn Sie möchten, dass der Bot dieselbe Methode aufruft, wenn er ein Video, ein Bild oder ein Dokument erhält, verwenden Sie folgendes Beispiel zur Erstellung eines Nachrichtenhandlers:

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

Hinzufügen von Befehlen mit Parametern.

Wir wissen bereits, was Befehle sind, wie man sie erstellt und wie man einen Bot dazu bringt, den gewünschten Befehl auszuführen. In einigen Fällen müssen wir jedoch neben dem Namen des Befehls auch Daten zur Ausführung übermitteln.

Im Folgenden ein Beispiel für einen Bot, der Ihnen basierend auf einem bestimmten Datum und Land den Typ des Tages im Produktionkalender zurückgibt.

Der folgende Bot nutzt die API des Produktionkalenders isdayoff.ru.

Code 3: Bot, der nach Datum und Land Auskunft gibt

library(telegram.bot)

# Erstellen einer Instanz der Klasse Updater
updater <- Updater('1165649194:AAFkDqIzQ6Wq5GV0YU7PmEZcv1gmWIFIB_8')

# Methode für die Begrüßung schreiben
## Begrüßungsbefehl
check_date <- function(bot, update, args) {

  # Eingabedaten
  day     <- args[1]  # Datum
  country <- args[2]  # Land

  # Überprüfung der eingegebenen Parameter
  if ( !grepl('\d{4}-\d{2}-\d{2}', day) ) {

    # Benutzerdefinierte Tastatur senden
    bot$sendMessage(update$message$chat_id, 
                    text = paste0(day, " - ungültiges Datum, bitte Datum im Format JJJJ-MM-TT eingeben"),
                    parse_mode = "Markdown")

  } else {
    day <- as.Date(day)
    # in das Format POSIXtl umwandeln
    y <- format(day, "%Y")
    m <- format(day, "%m")
    d <- format(day, "%d")

  }

  # Land zur Überprüfung
  ## Überprüfen, ob das Land angegeben ist
  ## Wenn nicht, auf ru setzen
  if ( ! country %in% c('ru', 'ua', 'by', 'kz', 'us') ) {

    # Benutzerdefinierte Tastatur senden
    bot$sendMessage(update$message$chat_id, 
                    text = paste0(country, " - ungültiger Ländercode, mögliche Werte: ru, by, kz, ua, us. Daten für Russland angefordert."),
                    parse_mode = "Markdown")

    country <- 'ru'

  }

  # Datenanfrage aus der API
  # Zusammenstellung der HTTP-Anfrage
  url <- paste0("https://isdayoff.ru/api/getdata?",
                "year=",  y, "&",
                "month=", m, "&",
                "day=",   d, "&",
                "cc=",    country, "&",
                "pre=1&",
                "covid=1")

  # Antwort abrufen
  res <- readLines(url)

  # Interpretation der Antwort
  out <- switch(res, 
                "0"   = "Arbeitstag",
                "1"   = "Nicht-Arbeitstag",
                "2"   = "Abgekürzter Arbeitstag",
                "4"   = "covid-19",
                "100" = "Fehler beim Datum",
                "101" = "Daten nicht gefunden",
                "199" = "Dienstfehler")

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

}

# Handler erstellen
date_handler <- CommandHandler('check_date', check_date, pass_args = TRUE)

# Handler zum Dispatcher hinzufügen
updater <- updater + date_handler

# Bot starten
updater$start_polling()

Starten Sie das oben angeführte Codebeispiel, indem Sie 'IHR BOT-TOKEN' durch das tatsächliche Token ersetzen, das Sie bei der Erstellung des Bots über BotFather erhalten haben (ich habe in im ersten Artikel).

Wir haben einen Bot entwickelt, der nur eine Methode im Repertoire hat. check_date, diese Methode wird mit einem Befehl des gleichen Namens aufgerufen.

Neben dem Befehl erwartet diese Methode von Ihnen die Eingabe von zwei Parametern: dem Ländercode und dem Datum. Der Bot überprüft dann, ob der angegebene Tag in dem angegebenen Land ein Feiertag, ein verkürzter oder ein Arbeitstag gemäß dem offiziellen Produktionskalender ist.

Damit die von uns erstellte Methode zusätzliche Parameter zusammen mit dem Befehl akzeptiert, verwenden Sie das Argument pass_args = TRUE in der Funktion CommandHandler(), und beim Erstellen der Methode, neben den erforderlichen Argumenten, bot, Aktualisieren erstellen Sie ein optionales — .) Wir können dieses Rezept mit dem vorherigen kombinieren, um den Test im Debugger zu starten:. Auf diese Weise wird die erstellte Methode die Parameter akzeptieren, die Sie dem Bot nach dem Befehl übergeben. Die Parameter müssen durch ein Leerzeichen voneinander getrennt werden; sie gelangen als Textvektor in die Methode.

Lassen Sie uns unseren Bot starten und testen.

Wir erstellen einen Telegram-Bot in R (Teil 2): Unterstützung von Befehlen und Nachrichtenfiltern hinzufügen

Starten Sie den Bot im Hintergrund.

Der letzte Schritt, den wir noch ausführen müssen, ist den Bot im Hintergrund auszuführen.

Folgen Sie dazu dem unten beschriebenen Algorithmus:

  1. Speichern Sie den Bot-Code in einer Datei mit der Endung R. In RStudio geschieht dies über das Menü Datei, mit dem Befehl Speichern unter….
  2. Fügen Sie den Pfad zum bin-Ordner hinzu, der sich in dem Verzeichnis befindet, in das Sie die R-Sprache installiert haben, in die Umgebungsvariable Path, Anleitung hier.
  3. Erstellen Sie eine normale Textdatei, in die Sie folgende Zeile schreiben: R CMD BATCH C:\Users\Alsey\Documents\my_bot.R. Anstelle von C:\Users\Alsey\Documents\my_bot.R geben Sie den Pfad zu Ihrem Bot-Skript an. Dabei ist es wichtig, dass der Pfad keine kyrillischen Zeichen und Leerzeichen enthält, da dies Probleme beim Starten des Bots verursachen kann. Speichern Sie die Datei und ändern Sie ihre Erweiterung in txt findet man bat.
  4. Öffnen Sie die Windows-Aufgabenplanung, es gibt viele Möglichkeiten, dies zu tun, zum Beispiel können Sie einen beliebigen Ordner öffnen und in die Adressleiste eingeben %windir%\system32\taskschd.msc /s. Weitere Möglichkeiten zum Starten finden Sie hier.
  5. Klicken Sie im oberen rechten Menü des Planers auf "Aufgabe erstellen…".
  6. Geben Sie auf der Registerkarte "Allgemein" einen beliebigen Namen für Ihre Aufgabe ein und stellen Sie den Schalter auf "Für alle Benutzer ausführen".
  7. Wechseln Sie zur Registerkarte "Aktionen", klicken Sie auf "Neu". Im Feld "Programm oder Skript" klicken Sie auf "Durchsuchen", finden Sie die im zweiten Schritt erstellte bat Datei und klicken Sie auf OK.
  8. Klicken Sie auf OK und geben Sie bei Bedarf das Passwort Ihres Benutzerkontos für das Betriebssystem ein.
  9. Wir finden die erstellte Aufgabe im Planner, markieren sie und klicken unten rechts auf die Schaltfläche "Ausführen".

Unser Bot läuft im Hintergrund und wird arbeiten, bis Sie die Aufgabe stoppen oder Ihren PC oder Server, auf dem er gestartet wurde, ausschalten.

Fazit

In diesem Artikel haben wir erörtert, wie man einen voll funktionsfähigen Bot schreibt, der nicht nur Nachrichten senden, sondern auch auf eingehende Nachrichten und Kommandos reagiert. Das Wissen, das Sie gewonnen haben, reicht bereits aus, um die meisten Ihrer Aufgaben zu lösen.

Im nächsten Artikel wird es darum gehen, wie man dem Bot eine Tastatur hinzufügt, um die Bedienung zu erleichtern.

Abonnieren Sie meinen telegram und youtube Kanäle.

Quelle: habr.com

Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen 🔥 Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen | ProHoster