Im wir haben gelernt, wie man einen Bot erstellt und eine Instanz der Klasse initialisiert Bot und haben uns mit den Methoden zum Versenden von Nachrichten vertraut gemacht.
In diesem Artikel setze ich dieses Thema fort, daher empfehle ich, diesen Artikel erst nach dem Lesen .
Diesmal beschäftigen wir uns damit, wie wir unseren Bot zum Leben erwecken und ihm Unterstützung für Befehle hinzufügen, sowie die Klasse Updater.
Im Verlauf des Artikels werden wir einige einfache Bots erstellen. Der letzte wird anhand eines bestimmten Datums und des Ländercodes ermitteln, ob der Tag in diesem Land ein Feiertag oder ein Arbeitstag gemäß dem Produktionskalender ist. Aber wie schon zuvor, ist das Ziel des Artikels, Sie mit der Schnittstelle des Pakets vertraut zu machen, telegram.bot um Ihre eigenen Aufgaben zu lösen.

Alle Artikel der Serie "Wir schreiben einen Telegram-Bot in der Programmiersprache R"
Inhalt
Wenn Sie sich für Datenanalyse interessieren, könnten Ihnen meine und Kanäle interessieren. Der Großteil des Inhalts widmet sich der Programmiersprache R.
Die Updater-Klasse
Updater – ist eine Klasse, die Ihnen die Entwicklung des Telegram-Bots erleichtert und unter der Haube die Klasse Dispatcherverwendet. Updater Der Zweck der Klasse besteht darin, Updates vom Bot zu erhalten (in dem vorherigen Artikel haben wir hierfür die MethodegetUpdates() Dispatcher.
eigenen Handlern, das heißt, Objekten der Klasse Dispatcher Handler Sie fügen mit Hilfe der Handler.
Handler – die Handler
Reaktionen des Bots auf verschiedene Ereignisse hinzu. Zum Zeitpunkt des Schreibens des Artikels wurden Dispatcher die folgenden Typen von Handlern hinzugefügt: telegram.bot MessageHandler – der Nachrichten-Handler
- CommandHandler – der Befehls-Handler
- CallbackQueryHandler – der Handler für Daten, die von Inline-Tastaturen gesendet werden
- ErrorHandler – der Fehler-Handler für Anfragen nach Updates vom Bot
- Wenn Sie noch nie zuvor Bots verwendet haben und nicht wissen, was ein Befehl ist, dann müssen Befehle an den Bot mit einem Schrägstrich
Wir fügen dem Bot den ersten Befehl hinzu, den Befehls-Handler
als Präfix gesendet werden. / Wir beginnen mit einfachen Befehlen, d.h. wir bringen unserem Bot bei, wie er sich auf Befehl begrüßen soll
Code 1: Wir bringen dem Bot bei, sich zu begrüßen /hi.
Code 1: Wir bringen dem Bot bei, sich zu begrüßen
library(telegram.bot)
# Erstellen einer Instanz der Updater-Klasse
updater <- Updater('IHR BOT TOKEN')
# Schreiben einer Methode zur Begrüßung
say_hello <- function(bot, update) {
# Benutzername, mit dem man sich begrüßen muss
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")
}
# Erstellen eines Handlers
hi_hendler <- CommandHandler('hi', say_hello)
# Hinzufügen des Handlers zum Dispatcher
updater <- updater + hi_hendler
# Starten des Bots
updater$start_polling()Führen Sie das oben stehende Beispiel aus, nachdem Sie 'IHR BOT TOKEN' durch das tatsächliche Token ersetzt haben, das Sie bei der Erstellung des Bots über BotFather (ich habe in ).
Methode start_polling() Klasse Updater, die am Ende des Codes verwendet wird, startet eine endlose Schleife für das Abfragen und Verarbeiten von Updates vom Bot.
Jetzt öffnen wir Telegram und geben unserem Bot das erste Kommando /hi.

Jetzt versteht unser Bot den Befehl /hi, und kann uns begrüßen.
Schematically kann der Prozess des Erstellens eines solchen einfachen Bots folgendermaßen dargestellt werden.

- Wir erstellen eine Instanz der Klasse
Updater; - Wir erstellen Methoden, d.h. Funktionen, die unser Bot ausführen wird. Im Beispielcode ist das die Funktion
say_hello(). Die Funktionen, die Sie als Methoden des Bots verwenden werden, müssen zwei obligatorische Argumente haben - bot und update, und ein optionales - args. Das Argument bot, das ist Ihr Bot, mit dessen Hilfe Sie auf Nachrichten antworten, Nachrichten senden oder andere verfügbare Methoden des Bots verwenden können. Das Argument update ist das, was der Bot von dem Benutzer erhalten hat, im Wesentlichen das, was wir im ersten Artikel mit der Methodebesteht darin, Updates vom Bot zu erhalten (in dem vorherigen Artikel haben wir hierfür die Methode. Das Argument args ermöglicht es Ihnen, zusätzliche Daten zu verarbeiten, die der Benutzer zusammen mit dem Befehl gesendet hat, zu diesem Thema werden wir später noch zurückkehren; - Wir erstellen Handler, d.h. wir verknüpfen bestimmte Benutzeraktionen mit den zuvor erstellten Methoden. Im Wesentlichen 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()erlaubt es Ihnen, den Befehl anzugeben, 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, der ausgeführt wird, wenn der Benutzer den im ersten Argument angegebenen Befehl aufgerufen hat; - Wir fügen den erstellten Handler unserem Dispatcher für die Klasseninstanz hinzu
Updater. Handler können auf verschiedene Arten hinzugefügt werden, im obigen Beispiel habe ich die einfachste Methode mit dem Zeichen verwendet+, d.h.updater <- updater + hi_hendler. Das Gleiche kann mit der Methodeadd_handler(), die zur Klasse gehört, gemacht werden.Dispatcher, diesen Methodenaufruf finden wir so:updater$dispatcher$add_handler(); - Wir starten den Bot mit dem Befehl
start_polling().
Handler für Textnachrichten und Filter
Wie wir dem Bot Befehle senden, haben wir verstanden, aber manchmal benötigen wir, dass der Bot nicht nur auf Befehle, sondern auch auf bestimmte allgemeine Textnachrichten reagiert. Dazu müssen Nachrichtenhandler verwendet werden - MessageHandler.
Normal MessageHandler wird auf alle eingehenden Nachrichten reagieren. Daher werden Nachrichtenhandler oft zusammen mit Filtern verwendet. Lassen Sie uns den Bot beibringen, nicht nur auf den Befehl zu grüßen /hi, sondern immer, wenn in der an den Bot gesendeten Nachricht eines der folgenden Wörter vorkommt: hallo, guten Tag, salut, hi, bonjour.
Bis wir keine neuen Methoden schreiben, da wir bereits eine Methode haben, mit der der Bot uns grüßt. Wir müssen nur den erforderlichen Filter und den Nachrichtenhandler erstellen.
Code 2: Fügen Sie den Textnachrichtenhandler und den Filter hinzu
library(telegram.bot)
# Erstellen Sie eine Instanz der Updater-Klasse
updater <- Updater('TOKEN IHRES BOTS')
# Schreiben wir eine Methode zur Begrüßung
## Begrüßungsbefehl
say_hello <- function(bot, update) {
# Benutzername, mit dem man sich begrüßen muss
user_name <- update$message$from$first_name
# Senden Sie die 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 wir Filter
MessageFilters$hi <- BaseFilter(function(message) {
# Prüfen, ob der Text der Nachricht die Wörter: hallo, guten Tag, salut, hi, bonjour enthält
grepl(x = message$text,
pattern = 'hallo|guten Tag|salut|hi|bonjour',
ignore.case = TRUE)
}
)
# Erstellen wir einen Handler
yi_hendler <- CommandHandler('hi', say_hello) # Handler für den Befehl hi
hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi)
# Fügen Sie die Handler dem Dispatcher hinzu
updater <- updater +
hi_hendler +
hi_txt_hnd
# Starten wir den Bot
updater$start_polling()Führen Sie das oben stehende Beispiel aus, nachdem Sie 'IHR BOT TOKEN' durch das tatsächliche Token ersetzt haben, das Sie bei der Erstellung des Bots über BotFather (ich habe in ).
Jetzt versuchen wir, dem Bot mehrere Nachrichten zu senden, in denen die zuvor genannten Begrüßungsworte vorkommen:

Also, zuerst haben wir dem Bot beigebracht, nicht nur zu grüßen, sondern auch auf die Begrüßung zu antworten. Das haben wir mit dem Argument reply_to_message_id, das in der Methode sendMessage(), verfügbar ist, wobei 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, dem Bot einen Filter hinzuzufügen, mithilfe der Funktion BaseFilter():
# создаём фильтры
MessageFilters$hi <- BaseFilter(
# анонимная фильтрующая функция
function(message) {
# проверяем, встречается ли в тексте сообщения слова приветствия
grepl(x = message$text,
pattern = 'привет|здравствуй|салют|хай|бонжур',
ignore.case = TRUE)
}
)Wie Sie gesehen haben, müssen Filter dem Objekt hinzugefügt werden MessageFilters, in dem bereits eine kleine Sammlung von fertigen Filtern enthalten ist. In unserem Beispiel haben wir im Objekt MessageFilters ein Element hihinzugefügt, das ist der neue Filter.
In die Funktion BaseFilter() müssen Sie die Filterfunktion übergeben. Im Grunde genommen ist ein Filter einfach eine Funktion, die eine Instanz der Nachricht erhält und WAHR oder FALSCHzurückgibt. In unserem Beispiel haben wir eine einfache Funktion geschrieben, die mit Hilfe der Basisfunktion grepl() den Text der Nachricht überprüft, und wenn er dem regulären Ausdruck entspricht gibt zurück WAHR.
hallo|guten Tag|salut|hi|bonjour Erstellen wir dann einen Nachrichten-Handler. Das erste Argument der Funktion hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi) MessageHandler() ist die Methode, die den Handler aufruft, und das zweite Argument ist der Filter, nach dem er aufgerufen wird. In unserem Fall ist das der von uns erstellte Filter.
MessageFilters$hi Und schließlich fügen wir den gerade erstellten Handler dem Dispatcher hinzu.
hi_txt_hndupdater <- updater + hi_handler + hi_txt_hnd telegram.bot Wie ich oben erwähnt habe, gibt es im Paket MessageFilters und Objekt bereits eine Sammlung von integrierten Filtern, 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 gesendeten Dokumenten
- photo — Nachrichten mit gesendeten Bildern
- sticker — Nachrichten mit gesendeten Stickern
- video — Nachrichten mit Videos
- voice — Sprachnachrichten
- contact — Nachrichten, die den Kontakt eines Telegramnutzers 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 logische 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 das folgende 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 den Bot dazu bringt, den gewünschten Befehl auszuführen. In einigen Fällen müssen wir jedoch neben dem Namen des Befehls auch einige Daten übergeben, um ihn auszuführen.
Im Folgenden finden Sie ein Beispiel für einen Bot, der Ihnen basierend auf einem bestimmten Datum und Land den Typ des Tags aus dem Produktionskalender zurückgibt.
Der folgende Bot verwendet die API des Produktionskalenders .
Code 3: Bot, der je nach Datum und Land informiert
library(telegram.bot)
# Wir erstellen eine Instanz der Klasse Updater
updater <- Updater('1165649194:AAFkDqIzQ6Wq5GV0YU7PmEZcv1gmWIFIB_8')
# Wir schreiben eine Methode zur Begrüßung
## 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)
# konvertieren in POSIXtl-Format
y <- format(day, "%Y")
m <- format(day, "%m")
d <- format(day, "%d")
}
# Land zur Überprüfung
## Überprüfen, ob das Land angegeben ist
## falls nicht, setzen wir auf ru
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'
}
# Anfrage von Daten 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")
# Wir erhalten die Antwort
res <- readLines(url)
# Interpretation der Antwort
out <- switch(res,
"0" = "Arbeitstag",
"1" = "Nicht arbeitender Tag",
"2" = "Gekürzter Arbeitstag",
"4" = "covid-19",
"100" = "Fehler im Datum",
"101" = "Daten nicht gefunden",
"199" = "Fehler im Dienst")
# Nachricht senden
bot$sendMessage(update$message$chat_id,
text = paste0(day, " - ", out),
parse_mode = "Markdown")
}
# Wir erstellen einen Handler
date_hendler <- CommandHandler('check_date', check_date, pass_args = TRUE)
# Wir fügen den Handler zum Dispatcher hinzu
updater <- updater + date_hendler
# Wir starten den Bot
updater$start_polling()Führen Sie das oben stehende Beispiel aus, nachdem Sie 'IHR BOT TOKEN' durch das tatsächliche Token ersetzt haben, das Sie bei der Erstellung des Bots über BotFather (ich habe in ).
Wir haben einen Bot erstellt, der nur eine Methode im Repertoire hat. check_date, diese Methode wird durch den gleichnamigen Befehl aufgerufen.
Aber neben dem Namen des Befehls erwartet diese Methode von Ihnen die Eingabe von zwei Parametern, dem Ländercode und dem Datum. Anschließend überprüft der Bot, ob der angegebene Tag im angegebenen Land ein Feiertag, ein verkürzter Arbeitstag oder ein Arbeitstag gemäß dem offiziellen Arbeitskalender 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 bei der Erstellung der Methode, zusätzlich zu den erforderlichen Argumenten bot, update erstellen Sie ein optionales — argsDie auf diese Weise erstellte Methode nimmt Parameter entgegen, die Sie dem Bot nach dem Namen des Befehls übergeben. Die Parameter müssen durch ein Leerzeichen getrennt werden, sie werden in Form eines Textvektors in die Methode übergeben.
Lassen Sie uns unseren Bot starten und ihn testen.

Wir starten den Bot im Hintergrund
Der letzte Schritt, den wir ausführen müssen, ist, den Bot im Hintergrund zu starten.
Befolgen Sie dazu das unten beschriebene Verfahren:
- Speichern Sie den Bot-Code in einer Datei mit der Erweiterung R. Im RStudio erfolgt dies über das Menü Datei, mit dem Befehl Speichern unter….
- Fügen Sie den Pfad zum Ordner bin hinzu, der sich in dem Ordner befindet, in dem Sie die R-Sprache installiert haben, in der Variable Path, Anleitung .
- Erstellen Sie eine einfache Textdatei, in der Sie eine Zeile schreiben:
R CMD BATCH C:UsersAlseyDocumentsmy_bot.R. Anstelle von C:UsersAlseyDocumentsmy_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 diese Datei, und ändern Sie ihre Erweiterung von txt auf bat. - Öffnen Sie den Aufgabenplaner von Windows, es gibt viele Möglichkeiten, dies zu tun, zum Beispiel öffnen Sie einen beliebigen Ordner und geben Sie in die Adresszeile ein
%windir%system32taskschd.msc \/s. Andere Möglichkeiten zum Starten finden Sie . - Klicken Sie im oberen rechten Menü des Aufgabenplaners auf "Aufgabe erstellen…".
- Auf der Registerkarte "Allgemein" geben Sie einen beliebigen Namen für Ihre Aufgabe ein und setzen den Schalter auf "Für alle Benutzer ausführen".
- Gehen Sie zur Registerkarte "Aktionen", klicken Sie auf "Neu". Im Feld "Programm oder Skript" klicken Sie auf "Durchsuchen", suchen Sie die im zweiten Schritt erstellte bat Datei und klicken Sie auf OK.
- Klicken Sie auf OK, und geben Sie bei Bedarf das Passwort für Ihr Betriebssystemkonto ein.
- Suchen Sie im Aufgabenplaner die erstellte Aufgabe, wählen Sie sie aus und klicken Sie in der rechten unteren Ecke auf die Schaltfläche "Jetzt ausführen".
Unser Bot wurde im Hintergrund gestartet und wird so lange funktionieren, bis Sie die Aufgabe stoppen oder Ihren PC oder Server, auf dem er gestartet wurde, ausschalten.
Fazit
In diesem Artikel haben wir gelernt, wie man einen vollständigen Bot schreibt, der nicht nur Nachrichten senden kann, sondern auch auf eingehende Nachrichten und Befehle reagiert. Das erworbene Wissen 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 Arbeit angenehmer zu gestalten.
Abonnieren Sie meinen und Kanäle.
Quelle: habr.com
