Wir schreiben einen Telegram-Bot in der Programmiersprache R (Teil 1): Wir erstellen den Bot und senden mit ihm Nachrichten an Telegram

Die Telegram-Gruppe wächst täglich exponentiell, was durch die Benutzerfreundlichkeit des Messengers, die Verfügbarkeit von Kanälen, Chats und natürlich die Möglichkeit, Bots zu erstellen, begünstigt wird.

Bots können für ganz verschiedene Zwecke eingesetzt werden, von der Automatisierung der Kommunikation mit Ihren Kunden bis zur Verwaltung Ihrer eigenen Aufgaben.

Im Grunde können Sie über einen Bot alle Arten von Operationen in Telegram durchführen: Daten senden oder anfordern, Aufgaben auf einem Server starten, Informationen in einer Datenbank sammeln, E-Mails senden und vieles mehr.

Ich plane, eine Reihe von Artikeln zu schreiben, darüber, wie man mit der Sprache R arbeitet telegram bot API, und Bots nach eigenen Bedürfnissen zu erstellen.

Wir schreiben einen Telegram-Bot in der Programmiersprache R (Teil 1): Wir erstellen den Bot und senden mit ihm Nachrichten an Telegram

In diesem ersten Artikel werden wir herausfinden, wie man einen Telegram-Bot erstellt und ihm hilft, Benachrichtigungen in Telegram zu senden.

Wir werden einen Bot entwickeln, der den Status der letzten Ausführung aller Aufgaben im Windows-Taskplaner überprüft und Ihnen Benachrichtigungen sendet, wenn einige mit einem Fehler abgeschlossen wurden.

Das Ziel dieser Artikelreihe ist jedoch nicht, Ihnen beizubringen, einen Bot für eine bestimmte, enge Aufgabe zu schreiben, sondern Sie allgemein mit der Syntax des Pakets vertraut zu machen telegram.bot, und mit Beispielcode, mit dessen Hilfe Sie Bots zur Lösung Ihrer eigenen Aufgaben schreiben können.

Inhalt

Wenn Sie sich für Datenanalyse interessieren, könnten Ihnen meine Telegram und youtube Kanäle interessieren. Der Großteil des Inhalts widmet sich der Programmiersprache R.

  1. Erstellung eines Telegram-Bots
  2. Installation des Pakets zur Arbeit mit dem Telegram-Bot in R
  3. Nachrichten von R in Telegram senden
  4. Planung des Zeitplans zur Überprüfung von Aufgaben
  5. Fazit

Erstellung eines Telegram-Bots

Zunächst müssen wir einen Bot erstellen. Dies geschieht mit Hilfe eines speziellen Bots BotFather, gehen Sie zu dem Link und schreiben Sie dem Bot /start.

Danach erhalten Sie eine Nachricht mit einer Liste von Befehlen:

Nachricht von BotFather

Ich kann Ihnen helfen, Telegram-Bots zu erstellen und zu verwalten. Wenn Sie neu in der Bot-API sind, sehen Sie sich bitte das Handbuch an (https://core.telegram.org/bots).

Sie können mich mit diesen Befehlen steuern:

/newbot - einen neuen Bot erstellen
/mybots - Ihre Bots bearbeiten [Beta]

Bots bearbeiten
/setname - den Namen eines Bots ändern
/setdescription - die Botbeschreibung ändern
/setabouttext - die Informationen über den Bot ändern
/setuserpic - das Profilbild des Bots ändern
/setcommands - die Liste der Befehle ändern
/deletebot - einen Bot löschen

Bot-Einstellungen
/token - Authentifizierungstoken generieren
/revoke - Zugriffstoken des Bots widerrufen
/setinline - Inline-Modus umschalten (https://core.telegram.org/bots/inline)
/setinlinegeo - Inline-Standortanfragen umschalten (https://core.telegram.org/bots/inline#location-based-results)
/setinlinefeedback - die Einstellungen für das Inline-Feedback (https://core.telegram.org/bots/inline#collecting-feedback) ändern
/setjoingroups - kann Ihr Bot zu Gruppen hinzugefügt werden?
/setprivacy - den Datenschutzmodus (https://core.telegram.org/bots#privacy-mode) in Gruppen umschalten

Spiele
/mygames - Ihre Spiele bearbeiten (https://core.telegram.org/bots/games) [Beta]
/newgame - ein neues Spiel erstellen (https://core.telegram.org/bots/games)
/listgames - eine Liste Ihrer Spiele abrufen
/editgame - ein Spiel bearbeiten
/deletegame - ein bestehendes Spiel löschen

Um einen neuen Bot zu erstellen, senden Sie den Befehl /newbot.

BotFather wird Sie auffordern, den Namen und den Benutzernamen des Bots einzugeben.

BotFather, [25.07.20 09:39]
Alles klar, ein neuer Bot. Wie werden wir ihn nennen? Bitte wählen Sie einen Namen für Ihren Bot.

Alexey Seleznev, [25.07.20 09:40]
Mein Testbot

BotFather, [25.07.20 09:40]
Gut. Jetzt wählen wir einen Benutzernamen für Ihren Bot. Er muss mit `bot` enden. Zum Beispiel so: TetrisBot oder tetris_bot.

Alexey Seleznev, [25.07.20 09:40]
@my_test_bot

Der Name kann beliebig gewählt werden, der Benutzername muss mit enden bot.

Wenn Sie alles richtig gemacht haben, erhalten Sie folgende Nachricht:

Fertig! Herzlichen Glückwunsch zu Ihrem neuen Bot. Sie finden ihn unter t.me/my_test_bot. Sie können jetzt eine Beschreibung, einen Abschnitt über den Bot und ein Profilbild für Ihren Bot hinzufügen, siehe /help für eine Liste der Befehle. Übrigens, wenn Sie mit der Erstellung Ihres coolen Bots fertig sind, wenden Sie sich an unseren Bot-Support, wenn Sie einen besseren Benutzernamen dafür möchten. Stellen Sie nur sicher, dass der Bot voll funktionsfähig ist, bevor Sie dies tun.

Verwenden Sie dieses Token, um auf die HTTP-API zuzugreifen:
123456789:abcdefghijklmnopqrstuvwxyz

Für eine Beschreibung der Bot-API sehen Sie sich diese Seite an: https://core.telegram.org/bots/api

Als nächstes benötigen Sie den erhaltenen API-Token, in meinem Beispiel ist das 123456789:abcdefghijklmnopqrstuvwxyz.

In diesem Schritt sind die Vorbereitungen zur Erstellung des Bots abgeschlossen.

Installation des Pakets zur Arbeit mit dem Telegram-Bot in R

Ich nehme an, dass Sie bereits die Sprache R installiert haben und die Entwicklungsumgebung RStudio. Wenn nicht, können Sie sich dieses Video-Tutorial über die Installation ansehen.

Für die Arbeit mit der Telegram Bot API werden wir das R-Paket verwenden telegram.bot.

Die Installation von Paketen in R erfolgt über die Funktion install.packages(), daher verwenden Sie den Befehl zur Installation des benötigten Pakets install.packages("telegram.bot").

Detaillierte Informationen zur Installation verschiedener Pakete finden Sie in diesem Video.

Nach der Installation des Pakets, muss es eingebunden werden:

library(telegram.bot)

Nachrichten von R in Telegram senden

Ihren erstellten Bot können Sie in Telegram unter dem bei der Erstellung vergebenen Benutzernamen finden, in meinem Fall ist das @my_test_bot.

Senden Sie dem Bot eine beliebige Nachricht, zum Beispiel "Hallo Bot". Derzeit benötigen wir dies, um die ID Ihres Chats mit dem Bot zu erhalten.

Jetzt schreiben wir in R den folgenden Code.

library(telegram.bot)

# Erstellen Sie eine Instanz des Bots
bot <- Bot(token = "123456789:abcdefghijklmnopqrstuvwxyz")

# Fragen Sie Informationen über den Bot an
print(bot$getMe())

# Holen Sie sich Updates des Bots, d.h. die Liste der ihm gesendeten Nachrichten
updates <- bot$getUpdates()

# Fragen Sie die Chat-ID an
# Hinweis: Bevor Sie Updates anfordern, müssen Sie dem Bot eine Nachricht senden
chat_id <- updates[[1L]]$from_chat_id()

Ursprünglich erstellen wir eine Instanz unseres Bots mit der Funktion Bot(), wobei als Argument der zuvor erhaltene Token angegeben werden muss.

Es gilt als nicht die beste Praxis, den Token im Code zu speichern, deshalb können Sie ihn in einer Umgebungsvariable speichern und von dort lesen. Standardmäßig unterstützt das Paket telegram.bot Umgebungsvariablen mit den folgenden Bezeichnungen: R_TELEGRAM_BOT_IHR_BOT_NAME. Anstelle von IHREN_BOT_NAME setzen Sie den Namen ein, den Sie bei der Erstellung festgelegt haben, in meinem Fall wäre die Variable R_TELEGRAM_BOT_My Test Bot.

Eine Umgebungsvariable kann auf verschiedene Arten erstellt werden, ich werde die universellste und plattformübergreifendste Methode erläutern. Erstellen Sie in Ihrem Heimatverzeichnis (dies können Sie mit dem Befehl path.expand("~")) eine Textdatei mit dem Namen .Renviron. Das kann auch mit dem Befehl file.edit(path.expand(file.path("~", ".Renviron"))).

gemacht werden, und fügen Sie die folgende Zeile hinzu.

R_TELEGRAM_BOT_IHR_BOT_NAME=123456789:abcdefghijklmnopqrstuvwxyz

Danach können Sie den in der Umgebungsvariable gespeicherten Token mit der Funktion bot_token(), d.h. so verwenden:

bot <- Bot(token = bot_token("My Test Bot"))

Methode besteht darin, Updates vom Bot zu erhalten (in dem vorherigen Artikel haben wir hierfür die Methodeermöglicht uns den Zugriff auf die Updates des Bots, d.h. die Nachrichten, die ihm gesendet wurden. Die Methode from_chat_id(), ermöglicht den Zugriff auf die Chat-ID, aus der die Nachricht gesendet wurde. Diese ID benötigen wir, um Nachrichten vom Bot zu senden.

Neben der Chat-ID aus dem Objekt, das durch die Methode besteht darin, Updates vom Bot zu erhalten (in dem vorherigen Artikel haben wir hierfür die Methode erhalten Sie auch einige andere nützliche Informationen. Zum Beispiel Informationen über den Benutzer, der die Nachricht gesendet hat.

updates[[1L]]$message$from

$id
[1] 000000000

$is_bot
[1] FALSE

$first_name
[1] "Alexey"

$last_name
[1] "Seleznev"

$username
[1] "AlexeySeleznev"

$language_code
[1] "ru"

Somit haben wir in diesem Stadium bereits alles, was wir benötigen, um eine Nachricht vom Bot in Telegram zu senden. Lassen Sie uns die Methode verwenden. sendMessage(), in den der Identifikator des Chats, der Nachrichtentext und der Typ der Nachrichtenformatierung übergeben werden müssen. Der Typ der Formatierung kann Markdown oder HTML sein und wird durch ein Argument festgelegt. parse_mode.

# Отправка сообщения
bot$sendMessage(chat_id,
                text = "Привет, *жирный текст* _курсив_",
                parse_mode = "Markdown"
)

Grundlagen der Markdown-Formatierung:

  • Fett wird durch das Zeichen * hervorgehoben:
    • Beispiel: *fetter Text*
    • Ergebnis: fetter Text
  • Kursiv wird durch Unterstriche definiert:
    • Beispiel: _kursiv_
    • Ergebnis: kursiv
  • Monospace-Schrift, die normalerweise für Programmcode verwendet wird, wird durch einfache Anführungszeichen definiert — `:
    • Beispiel: `Monospace-Schrift`
    • Ergebnis: Monospace-Schrift

Grundlagen der HTML-Formatierung:
In HTML umschließen Sie den Teil des Textes, den Sie hervorheben möchten, in Tags, Beispiel Text.

  • — öffnendes Tag
  • — schließendes Tag

HTML-Formatierungstags

  • <b> — fett
    • Beispiel: <b>fetter Schrift</b>
    • Ergebnis fetter Schrift
  • — kursiv
    • Beispiel: kursiv
    • Ergebnis: kursiv
  • — Monospace-Schrift
    • Beispiel: Monospace-Schrift
    • Ergebnis: Monospace-Schrift

Neben Text können Sie auch andere Inhalte unter Verwendung spezieller Methoden senden:

# Отправить изображение
bot$sendPhoto(chat_id,
  photo = "https://telegram.org/img/t_logo.png"
)

# Отправка голосового сообщения
bot$sendAudio(chat_id,
  audio = "http://www.largesound.com/ashborytour/sound/brobob.mp3"
)

# Отправить документ
bot$sendDocument(chat_id,
  document = "https://github.com/ebeneditos/telegram.bot/raw/gh-pages/docs/telegram.bot.pdf"
)

# Отправить стикер
bot$sendSticker(chat_id,
  sticker = "https://www.gstatic.com/webp/gallery/1.webp"
)

# Отправить видео
bot$sendVideo(chat_id,
  video = "http://techslides.com/demos/sample-videos/small.mp4"
)

# Отправить gif анимацию
bot$sendAnimation(chat_id,
  animation = "https://media.giphy.com/media/sIIhZliB2McAo/giphy.gif"
)

# Отправить локацию
bot$sendLocation(chat_id,
  latitude = 51.521727,
  longitude = -0.117255
)

# Имитация действия в чате
bot$sendChatAction(chat_id,
  action = "typing"
)

D.h. zum Beispiel können Sie mit der Methode sendPhoto() ein als Bild gespeichertes Diagramm senden, das Sie mit dem Paket erstellt haben. ggplot2.

Überprüfung des Windows-Taskplaners und das Senden einer Benachrichtigung über Aufgaben, deren Ausführung fehlerhaft war.

Um mit dem Windows-Taskplaner zu arbeiten, müssen Sie das Paket installieren taskscheduleR, und zur Erleichterung der Arbeit mit den Daten installieren wir das Paket dplyr.

# Установка пакетов
install.packages(c('taskscheduleR', 'dplyr'))
# Подключение пакетов
library(taskscheduleR)
library(dplyr)

Dann fragen wir mit der Funktion taskscheduler_ls() Informationen über die Aufgaben aus unserem Planer ab. Mit der Funktion filter() aus dem Paket dplyr entfernen wir aus der Aufgabenliste die, die erfolgreich durchgeführt wurden und den Status des letzten Ergebnisses 0 haben, sowie die, die noch nie gestartet wurden und den Status 267011, deaktivierte Aufgaben und laufende Aufgaben.

# запрашиваем список задач
task <- task <- taskscheduler_ls() %>%
        filter(! `Last Result`  %in% c("0", "267011") & 
               `Scheduled Task State` == "Enabled" & 
               Status != "Running") %>%
        select(TaskName) %>%
        unique() %>%
        unlist() %>%
        paste0(., collapse = "n")

Im Objekt task haben wir jetzt eine Liste von Aufgaben, deren Ausführung fehlerhaft war, diese Liste müssen wir an Telegram senden.

Wenn man sich jeden Befehl näher anschaut, dann:

  • filter() — filtert die Aufgabenliste nach den oben beschriebenen Bedingungen
  • select() — behält in der Tabelle nur ein Feld mit dem Namen der Aufgaben
  • unique() — entfernt Duplikate von Namen
  • unlist() — wandelt die ausgewählte Spalte der Tabelle in einen Vektor um
  • paste0() — verbindet die Namen der Aufgaben zu einer einzigen Zeile und setzt als Trennzeichen das Zeilenumbruchzeichen, d.h. n.

Alles, was uns bleibt, ist, dieses Ergebnis an Telegram zu senden.

bot$sendMessage(chat_id,
                text = task,
                parse_mode = "Markdown"
)

So sieht der Code des Bots derzeit aus:

Der Code des Bots zur Aufgabenprüfungen

# Подключение пакета
library(telegram.bot)
library(taskscheduleR)
library(dplyr)

# инициализируем бота
bot <- Bot(token = "123456789:abcdefghijklmnopqrstuvwxyz")

# идентификатор чата
chat_id <- 123456789

# запрашиваем список задач
task <- taskscheduler_ls() %>%
        filter(! `Last Result`  %in% c("0", "267011")  &
               `Scheduled Task State` == "Enabled" & 
               Status != "Running") %>%
        select(TaskName) %>%
        unique() %>%
        unlist() %>%
        paste0(., collapse = "n")

# если есть проблемные задачи отправляем сообщение
if ( task != "" ) {

  bot$sendMessage(chat_id,
                  text = task,
                  parse_mode = "Markdown"
  )

}

Beim Verwenden des oben genannten Beispiels setzen Sie bitte Ihren Bot-Token und Ihre Chat-ID in den Code ein.

Sie können Bedingungen zur Filterung von Aufgaben hinzufügen, indem Sie beispielsweise nur die Aufgaben überprüfen, die von Ihnen erstellt wurden, und systemeigene Aufgaben ausschließen.

Sie können auch verschiedene Einstellungen in eine separate Konfigurationsdatei auslagern und darin die Chat-ID und den Token speichern. Sie können die Konfigurationsdatei beispielsweise mit dem Paket configr.

Beispiel für eine ini-Konfiguration

[telegram_bot]
;Einstellungen für den Telegram-Bot und den Chat, in den Benachrichtigungen gesendet werden
chat_id=12345678
bot_token=123456789:abcdefghijklmnopqrstuvwxyz"

Beispiel zum Lesen von Variablen aus der Konfiguration in R

library(configr)

# Konfiguration lesen
config <- read.config('C:/pfad_zur_konfiguration/config.cfg', rcmd.parse = TRUE)

bot_token <- config$telegram_bot$bot_token
chat_id     <- config$telegram_bot$chat_id

Wir konfigurieren den Zeitplan für die Prüfung von Aufgaben

Der Prozess zum Einrichten eines geplanten Skriptstarts ist in diesem Artikelausführlich beschrieben. Hier werde ich nur die Schritte auflisten, die dafür notwendig sind. Wenn Ihnen einer der Schritte unklar ist, wenden Sie sich bitte an den Artikel, auf den ich verlinkt habe.

Angenommen, wir haben den Code unseres Bots in eine Datei gespeichert, check_bot.R. Um diesen Datei regelmäßig zu planen, führen Sie bitte die folgenden Schritte aus:

  1. Fügen Sie den Pfad zum Verzeichnis, in dem R installiert ist, in die Umgebungsvariable Path ein. Unter Windows wäre der Pfad ungefähr: C:Program FilesRR-4.0.2bin.
  2. Erstellen Sie eine ausführbare bat-Datei, die nur eine Zeile enthält: R CMD BATCH C:rscriptscheck_botcheck_bot.R. Ersetzen Sie C:rscriptscheck_botcheck_bot.R zum vollständigen Pfad Ihrer R-Datei.
  3. Richten Sie dann mit dem Windows Aufgabenplaner den Zeitplan für den Start ein, zum Beispiel alle halben Stunden.

Fazit

In diesem Artikel haben wir uns damit befasst, wie man einen Bot erstellt und damit verschiedene Benachrichtigungen in Telegram sendet.

Ich habe die Aufgabe der Kontrolle des Windows-Aufgabenplaners beschrieben, aber Sie können das Material dieses Artikels nutzen, um beliebige Benachrichtigungen zu senden, von Wettervorhersagen bis zu Aktienkursen an der Börse, da R Ihnen den Zugang zu einer Vielzahl von Datenquellen ermöglicht.

Im nächsten Artikel werden wir besprechen, wie man dem Bot Befehle und eine Tastatur hinzufügt, damit er nicht nur Benachrichtigungen senden, sondern auch komplexere Aktionen ausführen kann.

Quelle: habr.com

60GB SSD 8Gb DDR4