Pisanie bota telegramowego w języku R (część 1): Tworzenie bota i wysyłanie za jego pomocą wiadomości na telegram

Liczba użytkowników Telegrama rośnie z dnia na dzień, co jest zasługą wygody komunikatora, dostępności kanałów, czatów i oczywiście możliwości tworzenia botów.

Boty mogą być używane w zupełnie różnych celach, od automatyzacji komunikacji z klientami po zarządzanie własnymi zadaniami.

W zasadzie za pomocą bota można wykonywać wszelkie operacje w Telegramie: wysyłać lub pobierać dane, uruchamiać zadania na serwerze, gromadzić informacje w bazie danych, wysyłać e-maile i tak dalej.

Planuję napisać serię artykułów o tym, jak w języku R pracować z telegram bot API, aby tworzyć boty zgodne z własnymi potrzebami.

Pisanie bota telegramowego w języku R (część 1): Tworzenie bota i wysyłanie za jego pomocą wiadomości na telegram

W tym, pierwszym artykule zajmiemy się tym, jak stworzyć bota Telegram i wysyłać za jego pomocą powiadomienia w Telegramie.

W rezultacie uzyskamy bota, który będzie sprawdzać status ostatniego wykonania wszystkich zadań w harmonogramie zadań Windows i wysyłać powiadomienia, jeśli któreś z nich zakończą się błędem.

Jednak celem tej serii artykułów nie jest nauczenie was pisania bota do konkretnego, wąskiego zadania, ale ogólne zapoznanie z składnią pakietu telegram.bot, oraz przykładami kodu, za pomocą których będziecie mogli pisać boty rozwiązujące własne zadania.

Spis treści

Jeśli interesujesz się analizą danych, to mogą Cię zainteresować moje telegram i youtube kanały. Większość zawartości poświęcona jest językowi R.

  1. Tworzenie bota Telegram
  2. Instalacja pakietu do pracy z botem Telegram w R
  3. Wysyłanie wiadomości z R do Telegramu
  4. Ustawienie harmonogramu uruchamiania sprawdzania zadań
  5. Podsumowanie

Tworzenie bota Telegram

Na początek musimy stworzyć bota. Robimy to za pomocą specjalnego bota BotFather, przechodzimy do linkiem i piszemy do bota /start.

Po czym otrzymasz wiadomość z listą komend:

Wiadomość od BotFather

Mogę pomóc Ci stworzyć i zarządzać botami Telegram. Jeśli jesteś nowy w API botów, zapoznaj się z podręcznikiem (https://core.telegram.org/bots).

Możesz kontrolować mnie, wysyłając te polecenia:

/newbot - stwórz nowego bota
/mybots - edytuj swoje boty [beta]

Edytuj Boty
/setname - zmień nazwę bota
/setdescription - zmień opis bota
/setabouttext - zmień informacje o bocie
/setuserpic - zmień zdjęcie profilowe bota
/setcommands - zmień listę poleceń
/deletebot - usuń bota

Ustawienia Bota
/token - wygeneruj token autoryzacji
/revoke - cofnij token dostępu bota
/setinline - przełącz tryb inline (https://core.telegram.org/bots/inline)
/setinlinegeo - przełącz żądania lokalizacji inline (https://core.telegram.org/bots/inline#location-based-results)
/setinlinefeedback - zmień ustawienia opinii inline (https://core.telegram.org/bots/inline#collecting-feedback)
/setjoingroups - czy Twój bot może być dodany do grup?
/setprivacy - przełącz tryb prywatności (https://core.telegram.org/bots#privacy-mode) w grupach

Gry
/mygames - edytuj swoje gry (https://core.telegram.org/bots/games) [beta]
/newgame - stwórz nową grę (https://core.telegram.org/bots/games)
/listgames - uzyskaj listę swoich gier
/editgame - edytuj grę
/deletegame - usuń istniejącą grę

Aby stworzyć nowego bota, wyślij polecenie /newbot.

BotFather poprosi Cię o wprowadzenie nazwy i loginu bota.

BotFather, [25.07.20 09:39]
Dobrze, nowy bot. Jak go nazwiemy? Wybierz nazwę dla swojego bota.

Alexey Seleznev, [25.07.20 09:40]
Mój Testowy Bot

BotFather, [25.07.20 09:40]
Dobrze. Teraz wybierz nazwę użytkownika dla swojego bota. Musi kończyć się na `bot`. Na przykład: TetrisBot lub tetris_bot.

Alexey Seleznev, [25.07.20 09:40]
@my_test_bot

Możesz wprowadzić dowolną nazwę, ale login musi kończyć się na bot.

Jeśli wszystko zrobiłeś poprawnie, otrzymasz następującą wiadomość:

Gotowe! Gratulacje za nowego bota. Znajdziesz go pod adresem t.me/my_test_bot. Teraz możesz dodać opis, sekcję 'o', a także zdjęcie profilowe swojego bota, zobacz /help, aby uzyskać listę poleceń. Swoją drogą, gdy skończysz tworzyć swojego fajnego bota, skontaktuj się z naszą obsługą botów, jeśli chcesz lepszej nazwy użytkownika. Upewnij się, że bot działa poprawnie, zanim to zrobisz.

Użyj tego tokena, aby uzyskać dostęp do API HTTP:
123456789:abcdefghijklmnopqrstuvwxyz

Aby zapoznać się z opisem API Bot, zobacz tę stronę: https://core.telegram.org/bots/api

Następnie będziesz potrzebować otrzymanego tokena API, w moim przykładzie jest to 123456789:abcdefghijklmnopqrstuvwxyz.

Na tym etapie prace przygotowawcze do stworzenia bota są zakończone.

Instalacja pakietu do pracy z botem Telegram w R

Zakładam, że masz już zainstalowany język R oraz środowisko programistyczne RStudio. Jeśli nie, możesz obejrzeć ten film instruktażowy o tym, jak je zainstalować.

Do pracy z API botów Telegram użyjemy pakietu R telegram.bot.

Instalacja pakietów w R odbywa się za pomocą funkcji install.packages(), więc aby zainstalować potrzebny nam pakiet, użyj polecenia install.packages("telegram.bot").

Aby bardziej szczegółowo poznać instalację różnych pakietów, można to zobaczyć w tym filmie.

Po zainstalowaniu pakietu musisz go załadować:

library(telegram.bot)

Wysyłanie wiadomości z R do Telegramu

Twojego stworzonego bota można znaleźć w Telegramie pod nadanym przy tworzeniu loginem, w moim przypadku jest to @my_test_bot.

Wyślij do bota dowolną wiadomość, na przykład „Cześć, bot”. Na ten moment potrzebujemy tego, aby uzyskać identyfikator czatu z botem.

Teraz w R wpisujemy następujący kod.

library(telegram.bot)

# tworzymy instancję bota
bot <- Bot(token = "123456789:abcdefghijklmnopqrstuvwxyz")

# Pobieramy informacje o bocie
print(bot$getMe())

# Otrzymujemy aktualizacje bota, czyli listę wiadomości, które mu wysłano
updates <- bot$getUpdates()

# Pobieramy identyfikator czatu
# Uwaga: przed zapytaniem o aktualizacje musisz wysłać wiadomość do bota
chat_id <- updates[[1L]]$from_chat_id()

Początkowo tworzymy instancję naszego bota za pomocą funkcji Bot(), jako argument należy przekazać wcześniej otrzymany token.

Przechowywanie tokenu w kodzie nie jest najlepszą praktyką, dlatego możesz go przechowywać w zmiennej środowiskowej i odczytywać z niej. Domyślnie w pakiecie telegram.bot wspierane są zmienne środowiskowe o następującej nazwie: R_TELEGRAM_BOT_NAZWA_TWOJEGO_BOTA. Zamiast NAZWA_TWOJEGO_BOTA podstaw nazwę, którą ustawiłeś podczas tworzenia, w moim przypadku będzie to zmienna R_TELEGRAM_BOT_My Test Bot.

Tworzenie zmiennej środowiskowej można wykonać na kilka sposobów, opowiem o najbardziej uniwersalnym i międzyplatformowym. Utwórz w swoim katalogu domowym (możesz sprawdzić jego lokalizację za pomocą polecenia path.expand("~")) plik tekstowy o nazwie .Renviron. Można to zrobić również za pomocą polecenia file.edit(path.expand(file.path("~", ".Renviron"))).

I dodaj do niego następującą linię.

R_TELEGRAM_BOT_NAZWA_TWOJEGO_BOTA=123456789:abcdefghijklmnopqrstuvwxyz

Następnie możesz używać tokenu zapisanego w zmiennej środowiskowej za pomocą funkcji bot_token(), czyli tak:

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

Metoda getUpdates()pozwala nam uzyskać aktualizacje bota, czyli wiadomości, które mu zostały wysłane. Metoda from_chat_id(), pozwala uzyskać identyfikator czatu, z którego wiadomość została wysłana. Ten identyfikator jest nam potrzebny do wysyłania wiadomości z bota.

Oprócz identyfikatora czatu z obiektu uzyskanego przez metodę getUpdates() otrzymujesz również inne przydatne informacje. Na przykład informacje o użytkowniku, który wysłał wiadomość.

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"

Na tym etapie mamy już wszystko, czego potrzebujemy, aby wysłać wiadomość z bota na Telegram. Skorzystamy z metody sendMessage(), który musi zawierać identyfikator czatu, treść wiadomości oraz typ formatowania treści wiadomości. Typ formatowania może być Markdown lub HTML i jest określany przez argument tryb_analizy.

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

Podstawy formatowania Markdown:

  • Pogrubienie uzyskuje się przy użyciu znaku *:
    • przykład: *pogrubiony tekst*
    • wynik: pogrubiony tekst
  • Kursywę ustawia się przy użyciu podkreślenia:
    • przykład: _kursywa_
    • wynik: kursywa
  • Czcionka monospace, która zazwyczaj jest używana do oznaczania kodu, jest ustalana za pomocą akcentu — `:
    • przykład: `czcionka monospace`
    • wynik: czcionka monospace

Podstawy formatowania HTML:
W HTML zawijasz część tekstu, którą chcesz wyróżnić, w tagi, przykład: w tekście.

  • — otwierający tag
  • — zamykający tag

Tagi HTML

  • <b> — pogrubienie
    • przykład: <b>pogrubiony tekst</b>
    • wynik pogrubiony tekst
  • — kursywa
    • przykład: kursywa
    • wynik: kursywa
  • — czcionka monospace
    • przykład: czcionka monospace
    • wynik: czcionka monospace

Oprócz tekstu możesz wysyłać także inny content za pomocą specjalnych metod:

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

Tzn. na przykład za pomocą metody sendPhoto() możesz wysłać zapisany jako obrazek wykres, który stworzyłeś za pomocą pakietu ggplot2.

Sprawdzenie harmonogramu zadań systemu Windows i wysłanie powiadomienia o zadaniach, które zakończyły się błędem

Aby pracować z harmonogramem zadań systemu Windows, musisz zainstalować pakiet taskscheduleR, a dla wygody pracy z danymi zainstalujemy pakiet dplyr.

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

Następnie za pomocą funkcji taskscheduler_ls() pytamy o informacje o zadaniach z naszego harmonogramu. Za pomocą funkcji filter() z pakietu dplyr usuwamy z listy zadań te, które zostały pomyślnie wykonane i mają status ostatniego wyniku 0, oraz te, które jeszcze nigdy nie były uruchamiane i mają status 267011, wyłączone zadania oraz zadania, które są aktualnie uruchamiane.

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

W obiekcie task mamy teraz listę zadań, które zakończyły się błędem, tę listę musimy wysłać do Telegramu.

Jeśli przyjrzeć się każdemu poleceniu bliżej, to:

  • filter() — filtruje listę zadań zgodnie z opisanymi powyżej warunkami
  • select() — zostawia w tabeli tylko jedno pole z nazwą zadania
  • unique() — usuwa duplikaty nazw
  • unlist() — przekształca wybraną kolumnę tabeli w wektor
  • paste0() — łączy nazwy zadań w jeden ciąg i ustawia jako separator znak nowej linii, tzn. n.

Wszystko, co nam pozostaje, to wysłać ten wynik do Telegramu.

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

Na ten moment kod bota wygląda następująco:

Kod bota sprawdzającego zadania

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

}

Przy użyciu powyższego przykładu wprowadź do kodu token swojego bota oraz swój identyfikator czatu.

Możesz dodawać warunki filtrowania zadań, na przykład sprawdzając tylko te zadania, które zostały utworzone przez Ciebie, z wyłączeniem zadań systemowych.

Możesz również wyodrębnić różne ustawienia do oddzielnego pliku konfiguracyjnego i przechowywać w nim identyfikator czatu oraz token. Możesz czytać konfigurację na przykład za pomocą pakietu configr.

Przykład konfiguracji ini

[telegram_bot]
; Ustawienia bota Telegram oraz czatu, na który będą przychodziły powiadomienia
chat_id=12345678
bot_token=123456789:abcdefghijklmnopqrstuvwxyz"

Przykład odczytu zmiennych z konfiguracji w R

library(configr)

# Odczyt konfiguracji
config <- read.config('C:/ścieżka_do_konfiguracji/config.cfg', rcmd.parse = TRUE)

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

Konfigurujemy harmonogram uruchamiania sprawdzania zadań

Najbardziej szczegółowo proces konfiguracji uruchamiania skryptów w harmonogramie opisany jest w tym artykuł. Tutaj jedynie opiszę kroki, które należy wykonać. Jeśli którykolwiek z kroków jest dla Ciebie niezrozumiały, skontaktuj się z artykułem, do którego podałem link.

Załóżmy, że zapisaliśmy kod naszego bota w pliku check_bot.R. Aby zaplanować regularne uruchamianie tego pliku, wykonaj następujące kroki:

  1. Wpisz w zmiennej systemowej Path ścieżkę do folderu, w którym zainstalowano R, w systemie Windows ścieżka będzie mniej więcej taka: C:Program FilesRR-4.0.2bin.
  2. Utwórz wykonywalny plik bat, w którym będzie tylko jedna linia R CMD BATCH C:rscriptscheck_botcheck_bot.R. Zmień C:rscriptscheck_botcheck_bot.R na pełną ścieżkę do Twojego pliku R.
  3. Następnie skonfiguruj harmonogram uruchamiania za pomocą harmonogramu zadań systemu Windows, na przykład co pół godziny.

Podsumowanie

W tym artykule omówiliśmy, jak stworzyć bota i wysyłać za jego pomocą różne powiadomienia do Telegrama.

Opisałem zadanie monitorowania harmonogramu zadań systemu Windows, ale możesz wykorzystać materiał z tego artykułu do wysyłania wszelkich powiadomień, od prognozy pogody po notowania akcji na giełdzie, ponieważ R pozwala Ci połączyć się z ogromną liczbą źródeł danych.

W następnym artykule dowiemy się, jak dodać komendy i klawiaturę do bota, aby mógł on nie tylko wysyłać powiadomienia, ale także wykonywać bardziej złożone działania.

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster