Wir schreiben einen Telegram-Bot in der R-Sprache (Teil 1): Erstellen Sie einen Bot und senden Sie damit Nachrichten an Telegram

Das Telegram-Publikum wächst täglich exponentiell. Dies wird durch die Bequemlichkeit des Messengers, die Verfügbarkeit von Kanälen, Chats und natürlich die Möglichkeit, Bots zu erstellen, erleichtert.

Bots können für eine Vielzahl von Zwecken eingesetzt werden, von der Automatisierung der Kommunikation mit Ihren Kunden bis hin zur Verwaltung Ihrer eigenen Aufgaben.

Tatsächlich können Sie über den Bot Telegramm verwenden, um jede Operation auszuführen: Daten senden oder anfordern, Aufgaben auf dem Server ausführen, Informationen in einer Datenbank sammeln, E-Mails senden und so weiter.

Ich habe vor, eine Reihe von Artikeln darüber zu schreiben, wie man mit R in R arbeitet. Telegramm-Bot-API, und schreiben Sie Bots für Ihre Bedürfnisse.

Wir schreiben einen Telegram-Bot in der R-Sprache (Teil 1): Erstellen Sie einen Bot und senden Sie damit Nachrichten an Telegram

In diesem ersten Artikel werden wir herausfinden, wie man einen Telegram-Bot erstellt und damit Benachrichtigungen an Telegram sendet.

Als Ergebnis verfügen wir über einen Bot, der den Status der letzten Ausführung aller Aufgaben im Windows-Taskplaner prüft und Ihnen Benachrichtigungen sendet, wenn eine Aufgabe fehlschlägt.

Der Zweck dieser Artikelserie besteht jedoch nicht darin, Ihnen beizubringen, wie Sie einen Bot für eine bestimmte, eng begrenzte Aufgabe schreiben, sondern darin, Sie in die Syntax des Pakets im Allgemeinen einzuführen. telegram.botund Codebeispiele, mit denen Sie Bots schreiben können, um Ihre eigenen Probleme zu lösen.

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. Erstellung eines Telegram-Bots
  2. Installieren eines Pakets für die Arbeit mit einem Telegram-Bot auf R
  3. Senden von Nachrichten von R an Telegram
  4. Konfigurieren des Startzeitplans für den Task-Scan
  5. Abschluss

Erstellung eines Telegram-Bots

Zuerst müssen wir einen Bot erstellen. Dies geschieht mithilfe eines speziellen Bots BotVater, gehe zu Link und schreibe dem Bot /start.

Anschließend erhalten Sie eine Nachricht mit einer Liste von Befehlen:

Nachricht von BotFather

I can help you create and manage Telegram bots. If you're new to the Bot API, please see the manual (https://core.telegram.org/bots).

You can control me by sending these commands:

/newbot - create a new bot
/mybots - edit your bots [beta]

Edit Bots
/setname - change a bot's name
/setdescription - change bot description
/setabouttext - change bot about info
/setuserpic - change bot profile photo
/setcommands - change the list of commands
/deletebot - delete a bot

Bot Settings
/token - generate authorization token
/revoke - revoke bot access token
/setinline - toggle inline mode (https://core.telegram.org/bots/inline)
/setinlinegeo - toggle inline location requests (https://core.telegram.org/bots/inline#location-based-results)
/setinlinefeedback - change inline feedback (https://core.telegram.org/bots/inline#collecting-feedback) settings
/setjoingroups - can your bot be added to groups?
/setprivacy - toggle privacy mode (https://core.telegram.org/bots#privacy-mode) in groups

Games
/mygames - edit your games (https://core.telegram.org/bots/games) [beta]
/newgame - create a new game (https://core.telegram.org/bots/games)
/listgames - get a list of your games
/editgame - edit a game
/deletegame - delete an existing game

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

BotFather fordert Sie auf, den Namen und das Login des Bots einzugeben.

BotFather, [25.07.20 09:39]
Alright, a new bot. How are we going to call it? Please choose a name for your bot.

Alexey Seleznev, [25.07.20 09:40]
My Test Bot

BotFather, [25.07.20 09:40]
Good. Now let's choose a username for your bot. It must end in `bot`. Like this, for example: TetrisBot or tetris_bot.

Alexey Seleznev, [25.07.20 09:40]
@my_test_bot

Sie können einen beliebigen Namen eingeben und die Anmeldung muss mit enden bot.

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

Done! Congratulations on your new bot. You will find it at t.me/my_test_bot. You can now add a description, about section and profile picture for your bot, see /help for a list of commands. By the way, when you've finished creating your cool bot, ping our Bot Support if you want a better username for it. Just make sure the bot is fully operational before you do this.

Use this token to access the HTTP API:
123456789:abcdefghijklmnopqrstuvwxyz

For a description of the Bot API, see this page: https://core.telegram.org/bots/api

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

Mit diesem Schritt sind die vorbereitenden Arbeiten zur Erstellung des Bots abgeschlossen.

Installieren eines Pakets für die Arbeit mit einem Telegram-Bot auf R

Ich gehe davon aus, dass Sie die R-Sprache und die RStudio-Entwicklungsumgebung bereits installiert haben. Wenn dies nicht der Fall ist, können Sie sich dies ansehen Videoanleitung wie man sie installiert.

Um mit der Telegram Bot API zu arbeiten, verwenden wir das R-Paket telegram.bot.

Die Installation von Paketen in R erfolgt durch die Funktion install.packages(), also verwenden Sie den Befehl, um das benötigte Paket zu installieren install.packages("telegram.bot").

Weitere Informationen zum Installieren verschiedener Pakete finden Sie unter Dieses Video.

Nach der Installation des Pakets müssen Sie es verbinden:

library(telegram.bot)

Senden von Nachrichten von R an Telegram

Der von Ihnen erstellte Bot kann in Telegram mit dem bei der Erstellung angegebenen Login gefunden werden, in meinem Fall ist dies der Fall @my_test_bot.

Senden Sie eine beliebige Nachricht an den Bot, z. B. „Hallo Bot“. Im Moment 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)

# создаём экземпляр бота
bot <- Bot(token = "123456789:abcdefghijklmnopqrstuvwxyz")

# Запрашиваем информацию о боте
print(bot$getMe())

# Получаем обновления бота, т.е. список отправленных ему сообщений
updates <- bot$getUpdates()

# Запрашиваем идентификатор чата
# Примечание: перед запросом обновлений вы должны отправить боту сообщение
chat_id <- updates[[1L]]$from_chat_id()

Zunächst erstellen wir eine Instanz unseres Bots mit der Funktion Bot()Als Argument müssen Sie ihm das zuvor empfangene Token übergeben.

Das Speichern des Tokens im Code gilt als schlechte Praxis, Sie können es also in einer Umgebungsvariablen speichern und daraus lesen. Standardmäßig im Paket enthalten telegram.bot Unterstützung für Umgebungsvariablen mit dem folgenden Namen implementiert: R_TELEGRAM_BOT_ИМЯ_ВАШЕГО_БОТА. Anstelle von ИМЯ_ВАШЕГО_БОТА Ersetzen Sie den Namen, den Sie beim Erstellen festgelegt haben. In meinem Fall handelt es sich um eine Variable R_TELEGRAM_BOT_My Test Bot.

Sie können eine Umgebungsvariable auf verschiedene Arten erstellen. Ich werde über die universellste und plattformübergreifendste sprechen. Erstellen Sie es in Ihrem Home-Verzeichnis (Sie finden es mit dem Befehl path.expand("~")) Textdatei mit dem Namen .Renviron. Sie können dies auch mit dem Befehl tun file.edit(path.expand(file.path("~", ".Renviron"))).

Und fügen Sie die folgende Zeile hinzu.

R_TELEGRAM_BOT_ИМЯ_ВАШЕГО_БОТА=123456789:abcdefghijklmnopqrstuvwxyz

Anschließend können Sie das in der Umgebungsvariablen gespeicherte Token mit der Funktion verwenden bot_token(), d.h. so:

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

Verfahren getUpdates()ermöglicht es uns, Bot-Updates zu erhalten, d. h. an ihn gesendete Nachrichten. Methode from_chat_id()Mit dieser Funktion können Sie die ID des Chats abrufen, von dem aus die Nachricht gesendet wurde. Wir benötigen diese Kennung, um Nachrichten vom Bot zu senden.

Zusätzlich zur Chat-ID aus dem von der Methode empfangenen Objekt getUpdates() Sie erhalten auch einige andere nützliche Informationen. Beispielsweise 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"

Zu diesem Zeitpunkt haben wir also bereits alles, was wir brauchen, um eine Nachricht vom Bot an Telegram zu senden. Lassen Sie uns die Methode verwenden sendMessage(), an die Sie die Chat-ID, den Nachrichtentext und den Markup-Typ des Nachrichtentexts übergeben müssen. Der Markup-Typ kann Markdown oder HTML sein und wird durch das Argument festgelegt parse_mode.

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

Grundlagen der Markdown-Formatierung:

  • Fettschrift ist mit * gekennzeichnet:
    • Beispiel: *жирный шритф*
    • Ergebnis: fettes Skript
  • Kursivschrift wird durch Unterstriche dargestellt:
    • Beispiel: _курсив_
    • Ergebnis: Kursivschrift
  • Die Festraumschriftart, die normalerweise zum Hervorheben von Programmcode verwendet wird, wird mit Apostrophen angegeben – „:
    • Beispiel: „Monospace-Schriftart“.
    • Ergebnis: моноширинный шрифт

Grundlagen der HTML-Markup-Formatierung:
In HTML packen Sie beispielsweise den Teil des Textes, den Sie hervorheben möchten, in Tags ein <тег>текст</тег>.

  • <tag> – öffnendes Tag
  • - Schluss-Tag

HTML-Markup-Tags

  • <b> - fettgedruckte Schriftart
    • Beispiel: <b>жирный шрифт</b>
    • führen fettgedruckte Schriftart
  • <i> - Kursivschrift
    • Beispiel: <i>курсив</i>
    • Ergebnis: Kursivschrift
  • — моноширинный шрифт
    • Beispiel: моноширинный шрифт
    • Ergebnis: моноширинный шрифт

Neben Text können Sie mit speziellen Methoden auch andere Inhalte versenden:

# Отправить изображение
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"
)

Diese. zum Beispiel mit der Methode sendPhoto() Sie können einen als Bild gespeicherten Plot senden, den Sie mit dem Paket erstellt haben ggplot2.

Überprüfen Sie den Windows-Aufgabenplaner und senden Sie Benachrichtigungen über abgestürzte Aufgaben

Um mit dem Windows-Taskplaner arbeiten zu können, müssen Sie das Paket installieren taskscheduleR, und installieren Sie das Paket, um die Arbeit mit Daten zu vereinfachen dplyr.

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

Als nächstes verwenden Sie die Funktion taskscheduler_ls() Wir fordern Informationen zu Aufgaben von unserem Planer an. Verwendung der Funktion filter() aus dem Paket dplyr Wir entfernen aus der Liste der Aufgaben diejenigen, die erfolgreich abgeschlossen wurden und einen letzten Ergebnisstatus von 0 haben, und diejenigen, die noch nie ausgeführt wurden und den Status 267011 haben, deaktivierte Aufgaben und Aufgaben, die derzeit ausgeführt werden.

# запрашиваем список задач
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 Wir haben jetzt eine Liste der Aufgaben, deren Arbeit mit einem Fehler endete. Diese Liste müssen wir an Telegram senden.

Wenn wir jeden Befehl genauer betrachten, dann:

  • filter() – Filtert die Aufgabenliste gemäß den oben beschriebenen Bedingungen
  • select() - Es bleibt nur ein Feld mit dem Namen der Aufgaben in der Tabelle
  • unique() - Entfernt doppelte Namen
  • unlist() - übersetzt die ausgewählte Tabellenspalte in einen Vektor
  • paste0() - verbindet die Namen von Aufgaben in einer Zeile und fügt ein Zeilenumbruchzeichen als Trennzeichen ein, d. h. n.

Es bleibt uns nur noch, dieses Ergebnis per Telegramm zu senden.

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

Im Moment sieht der Bot-Code also so aus:

Bot-Code, der die Aufgabe prüft

# Подключение пакета
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"
  )

}

Wenn Sie das obige Beispiel verwenden, ersetzen Sie Ihr Bot-Token und Ihre Chat-ID im Code.

Sie können Aufgabenfilterbedingungen hinzufügen, um beispielsweise nur die von Ihnen erstellten Aufgaben zu überprüfen, mit Ausnahme der Systemaufgaben.

Sie können verschiedene Einstellungen auch in einer separaten Konfigurationsdatei hinterlegen und darin die Chat-ID und das Token speichern. Sie können die Konfiguration beispielsweise mithilfe des Pakets auslesen configr.

Beispiel einer INI-Konfiguration

[telegram_bot]
;настройки телеграм бота и чата, в который будут приходить уведомления
chat_id=12345678
bot_token=123456789:abcdefghijklmnopqrstuvwxyz"

Beispiel für das Lesen von Variablen aus der Konfiguration in R

library(configr)

# чтение конфина
config <- read.config('C:/путь_к_конфигу/config.cfg', rcmd.parse = TRUE)

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

Einrichten eines Zeitplans für den Start des Task-Scans

Der Prozess der Konfiguration des geplanten Skriptstarts wird hier ausführlicher beschrieben Artikel. Hier beschreibe ich nur die Schritte, die hierfür befolgt werden müssen. Wenn Ihnen einer der Schritte nicht klar ist, lesen Sie den Artikel, zu dem ich einen Link bereitgestellt habe.

Nehmen wir an, wir speichern unseren Bot-Code in einer Datei check_bot.R. Um die regelmäßige Ausführung dieser Datei zu planen, führen Sie die folgenden Schritte aus:

  1. Schreiben Sie den Pfad zu dem Ordner, in dem R installiert ist, in die Systemvariable Path. Unter Windows sieht der Pfad etwa so aus: C:Program FilesRR-4.0.2bin.
  2. Erstellen Sie eine ausführbare Bat-Datei mit nur einer Zeile R CMD BATCH C:rscriptscheck_botcheck_bot.R. Ersetzen C:rscriptscheck_botcheck_bot.R zum vollständigen Pfad zu Ihrer R-Datei.
  3. Verwenden Sie als Nächstes den Windows-Taskplaner, um einen Startzeitplan festzulegen, beispielsweise jede halbe Stunde.

Abschluss

In diesem Artikel haben wir herausgefunden, wie man einen Bot erstellt und damit verschiedene Benachrichtigungen an Telegram sendet.

Ich habe die Aufgabe der Überwachung des Windows-Taskplaners beschrieben, aber Sie können das Material in diesem Artikel verwenden, um jede Benachrichtigung zu senden, von der Wettervorhersage bis hin zu Börsenkursen an der Börse, weil. Mit R können Sie eine Verbindung zu einer Vielzahl von Datenquellen herstellen.

Im nächsten Artikel erfahren Sie, wie Sie dem Bot Befehle und eine Tastatur hinzufügen, damit er nicht nur Benachrichtigungen senden, sondern auch komplexere Aktionen ausführen kann.

Source: habr.com

Kommentar hinzufügen