In 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. .
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.

Allen Artikeln der Serie "Wir schreiben einen Telegram-Bot in der Programmiersprache R"
Inhalt
Falls Sie sich für Datenanalyse interessieren, könnten meine und Kanäle für Sie von Interesse sein. Der Großteil der Inhalte widmet sich der R-Sprache.
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 ).
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.

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.

- Erstellen Sie eine Instanz der Klasse
Updater; - 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; - 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 Befehlhi_hendler <- CommandHandler('hi', say_hello). Das erste Argument der FunktionCommandHandler()ermöglicht es Ihnen, den Befehl festzulegen, in unserem Fallhi, auf den der Bot reagieren wird. Das zweite Argument ermöglicht es, die Methode des Bots anzugeben, wir werden die Methodesay_hello, aufrufen, die ausgeführt wird, wenn der Benutzer den im ersten Argument angegebenen Befehl aufruft; - 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 Methodeadd_handler(), die zur Klasse gehört, gemacht werden.Dispatcher, diese Methode findet man so:updater$dispatcher$add_handler(); - 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 ).
Nun versuchen wir, dem Bot einige Nachrichten zu senden, in denen die zuvor genannten Begrüßungswörter enthalten sind:

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_hndWie 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 .
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 ).
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.

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:
- 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….
- 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 .
- 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. - Ö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 . - Klicken Sie im oberen rechten Menü des Planers auf "Aufgabe erstellen…".
- 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".
- 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.
- Klicken Sie auf OK und geben Sie bei Bedarf das Passwort Ihres Benutzerkontos für das Betriebssystem ein.
- 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 und Kanäle.
Quelle: habr.com
