Schreiben eines Telegram-Bots in R (Teil 2): ​​Hinzufügen von Befehlsunterstützung und Nachrichtenfiltern zum Bot

В vorherige Veröffentlichung Wir haben herausgefunden, wie man einen Bot erstellt, und eine Instanz der Klasse initialisiert Bot und machte sich mit den Methoden zum Versenden von Nachrichten damit vertraut.

In diesem Artikel setze ich dieses Thema fort, daher empfehle ich, erst nach dem Lesen mit dem Lesen dieses Artikels zu beginnen der erste Teil.

Dieses Mal werden wir herausfinden, wie wir unseren Bot wiederbeleben und ihm Befehlsunterstützung hinzufügen können, und uns auch mit der Klasse vertraut machen Updater.

Im Laufe des Artikels werden wir mehrere einfache Bots schreiben, die anhand eines bestimmten Datums und Ländercodes bestimmen, ob ein Tag in einem bestimmten Land laut Produktionskalender ein Wochenende oder ein Werktag ist. Der Zweck des Artikels besteht jedoch nach wie vor darin, Sie mit der Paketschnittstelle vertraut zu machen telegram.bot um deine eigenen Probleme zu lösen.

Schreiben eines Telegram-Bots in R (Teil 2): ​​Hinzufügen von Befehlsunterstützung und Nachrichtenfiltern zum Bot

Alle Artikel aus der Serie „Einen Telegram-Bot in R schreiben“

  1. Wir erstellen einen Bot und verwenden ihn, um Nachrichten per Telegram zu versenden
  2. Fügen Sie dem Bot Befehlsunterstützung und Nachrichtenfilter hinzu

Inhalt

Wenn Sie sich für Datenanalyse interessieren, könnten Sie an meiner interessiert sein Telegram mit и Youtube Kanäle. Der größte Teil des Inhalts ist der R-Sprache gewidmet.

  1. Updater-Klasse
  2. Handler - Handler
  3. Fügen Sie dem Bot den ersten Befehl hinzu, den Befehlshandler
  4. Textnachrichtenprozessor und Filter
  5. Befehle mit Parametern hinzufügen
  6. Führen Sie den Bot im Hintergrund aus
  7. Abschluss

Updater-Klasse

Updater ist eine Klasse, die Ihnen die Entwicklung eines Telegram-Bots erleichtert und die Klasse unter der Haube nutzt Dispetcher. Klassenzuordnung Updater besteht darin, Updates vom Bot zu erhalten (im vorherigen Artikel haben wir die Methode für diesen Zweck verwendet). getUpdates()) und übertrage sie weiter nach Dispetcher.

Im Gegenzug Dispetcher enthält die von Ihnen erstellten Handler, d. h. Klassenobjekte Handler.

Handler - Handler

Mit Handlern, die Sie ergänzen Dispetcher Bot-Reaktionen auf verschiedene Ereignisse. Zum Zeitpunkt des Schreibens dieses Artikels in telegram.bot Die folgenden Handlertypen wurden hinzugefügt:

  • MessageHandler – Nachrichtenhandler
  • CommandHandler – Befehlshandler
  • CallbackQueryHandler – Datenhandler für Tastaturen, die von Inline gesendet werden
  • ErrorHandler – Fehlerhandler beim Anfordern von Updates vom Bot

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

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

Wir beginnen mit einfachen Befehlen, d.h. Bringen wir unserem Bot bei, auf Befehl Hallo zu sagen /hi.

Code 1: Dem Bot beibringen, Hallo zu sagen

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()

Führen Sie das obige Codebeispiel aus, nachdem Sie „IHR BOT-TOKEN“ durch das echte Token ersetzt haben, das Sie beim Erstellen des Bots über erhalten haben BotVater (Ich habe über die Erstellung eines Bots gesprochen erster Artikel).

Verfahren start_polling() Klasse Updater, das am Ende des Codes verwendet wird, startet eine Endlosschleife, in der Aktualisierungen vom Bot angefordert und verarbeitet werden.

Öffnen wir nun Telegram und schreiben den ersten Befehl an unseren Bot /hi.

Schreiben eines Telegram-Bots in R (Teil 2): ​​Hinzufügen von Befehlsunterstützung und Nachrichtenfiltern zum Bot

Jetzt versteht unser Bot den Befehl /hi, und weiß, wie man uns begrüßt.

Schematisch lässt sich der Prozess zum Aufbau eines solchen einfachen Bots wie folgt darstellen.

Schreiben eines Telegram-Bots in R (Teil 2): ​​Hinzufügen von Befehlsunterstützung und Nachrichtenfiltern zum Bot

  1. Erstellen Sie eine Instanz der Klasse Updater;
  2. Wir erstellen Methoden, d.h. Funktionen, die unser Bot ausführen wird. Im Codebeispiel ist dies eine Funktion say_hello(). Die Funktionen, die Sie als Bot-Methoden verwenden, müssen zwei erforderliche Argumente haben: bot и Aktualisierung, und eine optionale - args. Streit bot, das ist Ihr Bot. Mit seiner Hilfe können Sie auf Nachrichten antworten, Nachrichten senden oder alle anderen Methoden verwenden, die dem Bot zur Verfügung stehen. Streit Aktualisierung Das ist es, was der Bot vom Benutzer erhalten hat, genau das, was wir im ersten Artikel mit dieser Methode erhalten haben getUpdates(). Streit args ermöglicht die Verarbeitung zusätzlicher Daten, die der Benutzer zusammen mit dem Befehl sendet; wir werden etwas später auf dieses Thema zurückkommen;
  3. Wir erstellen Handler, d.h. Wir verknüpfen einige Benutzeraktionen mit den im vorherigen Schritt erstellten Methoden. Im Wesentlichen ist ein Handler ein Auslöser, ein Ereignis, das eine Bot-Funktion aufruft. In unserem Beispiel ist ein solcher Auslöser das Senden eines Befehls /hi, und wird vom Team umgesetzt hi_hendler <- CommandHandler('hi', say_hello). Erstes Funktionsargument CommandHandler() ermöglicht es Ihnen, in unserem Fall einen Befehl anzugeben hi, auf die der Bot antworten wird. Mit dem zweiten Argument können Sie die Bot-Methode angeben, wir rufen die Methode auf say_hello, das ausgeführt wird, wenn der Benutzer den im ersten Argument angegebenen Befehl aufgerufen hat;
  4. Als nächstes fügen wir den erstellten Handler zum Dispatcher unserer Klasseninstanz hinzu Updater. Sie können Handler auf verschiedene Weise hinzufügen; im obigen Beispiel habe ich die einfachste Methode verwendet, nämlich das Zeichen +Dh updater <- updater + hi_hendler. Dasselbe kann mit der Methode erfolgen add_handler(), die zur Klasse gehört Dispatcher, Sie können diese Methode wie folgt finden: updater$dispatcher$add_handler();
  5. Starten Sie den Bot mit dem Befehl start_polling().

Textnachrichtenprozessor und Filter

Wir haben herausgefunden, wie man Befehle an den Bot sendet, aber manchmal muss der Bot nicht nur auf Befehle, sondern auch auf einige normale Textnachrichten reagieren. Dazu müssen Sie Nachrichtenhandler verwenden MessageHandler.

Normal MessageHandler wird auf absolut alle eingehenden Nachrichten antworten. Daher werden Nachrichtenhandler häufig zusammen mit Filtern verwendet. Bringen wir dem Bot bei, nicht nur auf Befehl Hallo zu sagen /hi, aber auch immer dann, wenn eines der folgenden Wörter in der an den Bot gesendeten Nachricht vorkommt: hallo, hallo, salute, hai, bonjour.

Wir werden vorerst keine neuen Methoden schreiben, weil... Wir haben bereits eine Methode, mit der der Bot uns begrüßt. Wir müssen lediglich den erforderlichen Filter und Nachrichtenhandler erstellen.

Code 2: Fügen Sie einen Textnachrichten-Handler und -Filter hinzu

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()

Führen Sie das obige Codebeispiel aus, nachdem Sie „IHR BOT-TOKEN“ durch das echte Token ersetzt haben, das Sie beim Erstellen des Bots über erhalten haben BotVater (Ich habe über die Erstellung eines Bots gesprochen erster Artikel).

Versuchen wir nun, dem Bot mehrere Nachrichten mit den zuvor aufgeführten Begrüßungswörtern zu senden:
Schreiben eines Telegram-Bots in R (Teil 2): ​​Hinzufügen von Befehlsunterstützung und Nachrichtenfiltern zum Bot

Also haben wir dem Bot zunächst beigebracht, nicht nur „Hallo“ zu sagen, sondern auch auf eine Begrüßung zu antworten. Wir haben dies mit dem Argument gemacht Antwort_auf_Nachrichten_ID, die in der Methode verfügbar ist sendMessage(), in die Sie die ID der Nachricht übertragen müssen, auf die Sie antworten möchten. Sie können die Nachrichten-ID wie folgt erhalten: update$message$message_id.

Aber das Wichtigste, was wir gemacht haben, war, mithilfe der Funktion einen Filter zum Bot hinzuzufügen BaseFilter():

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

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

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

)

Wie Sie vielleicht bemerkt haben, müssen dem Objekt Filter hinzugefügt werden Nachrichtenfilter, das zunächst bereits einen kleinen Satz vorgefertigter Filter enthält. In unserem Beispiel zum Objekt Nachrichtenfilter Wir haben ein Element hinzugefügt hi, das ist ein neuer Filter.

In Funktion BaseFilter() Sie müssen die Filterfunktion übergeben. Im Wesentlichen ist ein Filter nur eine Funktion, die eine Nachrichteninstanz empfängt und zurückgibt TRUE oder FALSCH. In unserem Beispiel haben wir eine einfache Funktion geschrieben, die die Basisfunktion verwendet grepl() prüft den Nachrichtentext und ob er mit dem regulären Ausdruck übereinstimmt привет|здравствуй|салют|хай|бонжур kehrt zurück TRUE.

Als nächstes erstellen wir einen Nachrichtenhandler hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi). Erstes Funktionsargument MessageHandler() ist die Methode, die den Handler aufruft, und das zweite Argument ist der Filter, durch den er aufgerufen wird. In unserem Fall ist dies der Filter, den wir erstellt haben MessageFilters$hi.

Nun, am Ende fügen wir dem Dispatcher den erstellten Handler hinzu hi_txt_hnd.

updater <- updater + 
             hi_hendler +
             hi_txt_hnd

Wie ich oben geschrieben habe, im Paket telegram.bot und Objekt Nachrichtenfilter Es gibt bereits eine Reihe integrierter Filter, die Sie verwenden können:

  • all – Alle Nachrichten
  • Text – Textnachrichten
  • command – Befehle, d. h. Nachrichten, die mit beginnen /
  • Antwort – Nachrichten, die eine Antwort auf eine andere Nachricht sind
  • audio – Nachrichten, die eine Audiodatei enthalten
  • Dokument – ​​Nachrichten mit einem gesendeten Dokument
  • Foto – Nachrichten mit gesendeten Bildern
  • Aufkleber – Nachrichten mit einem gesendeten Aufkleber
  • Video – Nachrichten mit Video
  • Stimme – Sprachnachrichten
  • Kontakt – Nachrichten, die den Telegramminhalt des Benutzers enthalten
  • Standort – Nachrichten mit Geolokalisierung
  • Veranstaltungsort – Weitergeleitete Nachrichten
  • Spiel – Spiele

Wenn Sie mehrere Filter in einem Handler kombinieren möchten, verwenden Sie einfach das Zeichen | - als logisch OR, und unterschreiben & als logisch И. Wenn Sie beispielsweise möchten, dass der Bot beim Empfang eines Videos, Bilds oder Dokuments dieselbe Methode aufruft, verwenden Sie das folgende Beispiel, um einen Nachrichtenhandler zu erstellen:

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

Befehle mit Parametern hinzufügen

Wir wissen bereits, was Befehle sind, wie man sie erstellt und wie man den Bot dazu zwingt, den gewünschten Befehl auszuführen. In einigen Fällen müssen wir jedoch zusätzlich zum Befehlsnamen einige Daten übergeben, um ihn auszuführen.

Unten sehen Sie ein Beispiel für einen Bot, der Ihnen bei gegebenem Datum und Land den Tagestyp aus dem Produktionskalender zurückgibt.

Der folgende Bot verwendet die Produktionskalender-API isdayoff.ru.

Code 3: Bot, der nach Datum und Land meldet

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()

Führen Sie das obige Codebeispiel aus, nachdem Sie „IHR BOT-TOKEN“ durch das echte Token ersetzt haben, das Sie beim Erstellen des Bots über erhalten haben BotVater (Ich habe über die Erstellung eines Bots gesprochen erster Artikel).

Wir haben einen Bot erstellt, der nur eine Methode in seinem Arsenal hat check_date, diese Methode wird durch den gleichnamigen Befehl aufgerufen.

Zusätzlich zum Befehlsnamen müssen Sie bei dieser Methode jedoch zwei Parameter eingeben, den Ländercode und das Datum. Als nächstes prüft der Bot, ob ein bestimmter Tag im angegebenen Land ein Wochenende, ein verkürzter Tag oder ein Werktag gemäß dem offiziellen Produktionskalender ist.

Damit die von uns erstellte Methode zusammen mit dem Befehl zusätzliche Parameter akzeptiert, verwenden Sie das Argument pass_args = TRUE in Funktion CommandHandler()und beim Erstellen einer Methode zusätzlich zu den erforderlichen Argumenten bot, Aktualisierung Erstellen Sie ein optionales - args. Die so erstellte Methode akzeptiert die Parameter, die Sie nach dem Befehlsnamen an den Bot übergeben. Die Parameter müssen durch ein Leerzeichen getrennt werden; sie werden als Textvektor an die Methode gesendet.

Lassen Sie uns unseren Bot starten und testen.

Schreiben eines Telegram-Bots in R (Teil 2): ​​Hinzufügen von Befehlsunterstützung und Nachrichtenfiltern zum Bot

Führen Sie den Bot im Hintergrund aus

Der letzte Schritt, den wir abschließen müssen, besteht darin, den Bot im Hintergrund zu starten.

Befolgen Sie dazu den unten beschriebenen Algorithmus:

  1. Speichern Sie den Bot-Code in einer Datei mit der Erweiterung R. Beim Arbeiten in RStudio erfolgt dies über das Menü Reichen Sie das, Team Speichern als….
  2. Fügen Sie den Pfad zum bin-Ordner, der sich wiederum in dem Ordner befindet, in dem Sie die R-Sprache installiert haben, zur Pfadvariablen hinzu, Anweisungen hier.
  3. Erstellen Sie eine normale Textdatei, in die Sie eine Zeile schreiben: R CMD BATCH C:UsersAlseyDocumentsmy_bot.R. Anstelle von C:UsersAlseyDocumentsmy_bot.R Schreiben Sie den Pfad zu Ihrem Bot-Skript. Gleichzeitig ist es wichtig, dass sich unterwegs keine kyrillischen Zeichen oder Leerzeichen befinden, denn Dies kann beim Ausführen des Bots zu Problemen führen. Speichern Sie es und ersetzen Sie die Erweiterung durch txt auf bat.
  4. Öffnen Sie den Windows-Taskplaner. Es gibt viele Möglichkeiten, dies zu tun. Öffnen Sie beispielsweise einen beliebigen Ordner und geben Sie die Adresse ein %windir%system32taskschd.msc /s. Weitere Startmethoden sind verfügbar hier.
  5. Klicken Sie im oberen rechten Menü des Planers auf „Aufgabe erstellen…“.
  6. Geben Sie Ihrer Aufgabe auf der Registerkarte „Allgemein“ einen benutzerdefinierten Namen und stellen Sie den Schalter auf den Status „Für alle Benutzer ausführen“.
  7. Gehen Sie zur Registerkarte „Aktionen“ und klicken Sie auf „Erstellen“. Klicken Sie im Feld „Programm oder Skript“ auf „Durchsuchen“ und suchen Sie das im zweiten Schritt erstellte bat Datei und klicken Sie auf OK.
  8. Klicken Sie auf OK und geben Sie ggf. das Passwort für Ihr Betriebssystemkonto ein.
  9. Suchen Sie die erstellte Aufgabe im Planer, wählen Sie sie aus und klicken Sie auf die Schaltfläche „Ausführen“ in der unteren rechten Ecke.

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

Abschluss

In diesem Artikel haben wir herausgefunden, wie man einen vollwertigen Bot schreibt, der nicht nur Nachrichten senden, sondern auch auf eingehende Nachrichten und Befehle reagieren kann. Die gewonnenen Erkenntnisse reichen bereits aus, um die meisten Ihrer Probleme zu lösen.

Im nächsten Artikel erfahren Sie, wie Sie dem Bot eine Tastatur hinzufügen, um die Arbeit zu erleichtern.

Abonnieren Sie meine Telegram mit и Youtube Kanäle.

Source: habr.com

Kommentar hinzufügen