Pisanie bota telegramowego w R (część 1): Tworzenie bota i używanie go do wysyłania wiadomości w telegramie

Liczba odbiorców Telegramu rośnie wykładniczo z każdym dniem, ułatwia to wygoda komunikatora, obecność kanałów, czatów i oczywiście możliwość tworzenia botów.

Boty można wykorzystać do zupełnie innych celów, od automatyzacji komunikacji z klientami po zarządzanie własnymi zadaniami.

Zasadniczo możesz używać telegramu do wykonywania dowolnych operacji za pośrednictwem bota: wysyłania lub żądania danych, uruchamiania zadań na serwerze, gromadzenia informacji w bazie danych, wysyłania e-maili i tak dalej.

Planuję napisać serię artykułów o tym, jak pracować z API bota telegramui pisz boty dostosowane do Twoich potrzeb.

Pisanie bota telegramowego w R (część 1): Tworzenie bota i używanie go do wysyłania wiadomości w telegramie

W tym pierwszym artykule dowiemy się, jak stworzyć bota telegramu i używać go do wysyłania powiadomień w telegramie.

Dzięki temu będziemy mieli 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 się nie powiedzie.

Jednak celem tej serii artykułów nie jest nauczenie Cię, jak napisać bota do konkretnego, wąskiego zadania, ale ogólne wprowadzenie Cię w składnię pakietu telegram.botoraz przykłady kodu, za pomocą których możesz pisać boty rozwiązujące własne problemy.

Zawartość

Jeśli interesuje Cię analiza danych, być może zainteresuje Cię mój telegram и youtube kanały. Większość treści jest poświęcona językowi R.

  1. Tworzenie bota telegramowego
  2. Instalowanie pakietu do pracy z botem telegramowym w R
  3. Wysyłanie wiadomości z R do Telegramu
  4. Konfigurowanie harmonogramu uruchamiania skanowania zadań
  5. wniosek

Tworzenie bota telegramowego

Najpierw musimy stworzyć bota. Odbywa się to za pomocą specjalnego bota Ojciec Bota, iść do powiązanie i napisz do bota /start.

Po czym otrzymasz wiadomość z listą poleceń:

Wiadomość od BotFathera

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

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

BotFather poprosi Cię o podanie nazwy bota i loginu.

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

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

Jeśli wszystko zrobiłeś poprawnie, otrzymasz następujący komunikat:

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

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

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

Instalowanie pakietu do pracy z botem telegramowym w R

Zakładam, że masz już zainstalowany język R i środowisko programistyczne RStudio. Jeśli tak nie jest, możesz na to spojrzeć film instruktażowy o tym, jak je zainstalować.

Do pracy z API Telegram Bot 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").

Więcej informacji na temat instalowania różnych pakietów można znaleźć na stronie ten film.

Po zainstalowaniu pakietu należy go podłączyć:

library(telegram.bot)

Wysyłanie wiadomości z R do Telegramu

Utworzonego przez Ciebie bota można znaleźć w Telegramie przy użyciu loginu podanego podczas tworzenia, w moim przypadku tak @my_test_bot.

Wyślij botowi dowolną wiadomość, na przykład „Hej, bocie”. W tej chwili potrzebujemy tego, aby uzyskać identyfikator Twojego czatu z botem.

Teraz napiszemy następujący kod w języku R.

library(telegram.bot)

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

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

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

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

Na początek tworzymy instancję naszego bota z funkcją Bot(), jako argument należy do niego przekazać wcześniej otrzymany token.

Przechowywanie tokena w kodzie nie jest uważane za najlepszą praktykę, więc można go przechowywać w zmiennej środowiskowej i z niej czytać. Domyślnie w pakiecie telegram.bot Zaimplementowano obsługę zmiennych środowiskowych o następujących nazwach: R_TELEGRAM_BOT_ИМЯ_ВАШЕГО_БОТА. Zamiast ИМЯ_ВАШЕГО_БОТА zamień nazwę podaną podczas tworzenia, w moim przypadku będzie to zmienna R_TELEGRAM_BOT_My Test Bot.

Istnieje kilka sposobów na utworzenie zmiennej środowiskowej, ja opowiem o najbardziej uniwersalnym i wieloplatformowym. Utwórz w swoim katalogu domowym (możesz go znaleźć za pomocą polecenia path.expand("~")) plik tekstowy z nazwą .Renviron. Można to również zrobić za pomocą polecenia file.edit(path.expand(file.path("~", ".Renviron"))).

I dodaj do niego następujący wiersz.

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

Następnie możesz wykorzystać token zapisany w zmiennej środowiskowej za pomocą funkcji bot_token(), tj. lubię to:

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

metoda getUpdates()pozwala nam uzyskać aktualizacje botów, tj. wiadomości, które do niego wysyłano. metoda from_chat_id(), pozwala uzyskać identyfikator czatu, z którego wysłano wiadomość. Potrzebujemy tego identyfikatora, aby wysyłać wiadomości z bota.

Oprócz identyfikatora czatu z obiektu uzyskanego metodą getUpdates() otrzymasz także 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"

Zatem na tym etapie mamy już wszystko, czego potrzebujemy, aby wysłać wiadomość od bota do Telegramu. Skorzystajmy z metody sendMessage(), do którego musisz przekazać identyfikator czatu, treść wiadomości i typ znacznika tekstu wiadomości. Typ znaczników może być Markdown lub HTML i jest ustawiany za pomocą argumentu parse_mode.

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

Podstawy formatowania Markdown:

  • Pogrubiona czcionka jest wyróżniona *:
    • przykład: *жирный шритф*
    • wynik: pogrubiona czcionka
  • Kursywę oznacza się podkreśleniami:
    • przykład: _курсив_
    • wynik: kursywa
  • Czcionka o stałej szerokości, która jest zwykle używana do podświetlania kodu programu, jest określana za pomocą apostrofów - `:
    • przykład: `czcionka o stałej szerokości`
    • wynik: моноширинный шрифт

Podstawy formatowania znaczników HTML:
W HTML zawijasz część tekstu, która ma zostać wyróżniona w tagach, np <тег>текст</тег>.

  • <tag> - znacznik otwierający
  • - znacznik zamykający

Tagi znaczników HTML

  • <b> - pogrubiona czcionka
    • przykład: <b>жирный шрифт</b>
    • wynik pogrubiona czcionka
  • <i> - kursywa
    • przykład: <i>курсив</i>
    • wynik: kursywa
  • — моноширинный шрифт
    • przykład: моноширинный шрифт
    • wynik: моноширинный шрифт

Oprócz tekstu możesz wysyłać inne treści 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"
)

Te. na przykład za pomocą metody sendPhoto() możesz przesłać wykres zapisany jako obraz utworzony za pomocą pakietu ggplot2.

Sprawdzanie Harmonogramu zadań systemu Windows i wysyłanie powiadomień o zadaniach, które zakończyły się nieprawidłowo

Aby pracować z Harmonogramem zadań systemu Windows, musisz zainstalować pakiet taskscheduleRi dla wygody pracy z danymi zainstaluj pakiet dplyr.

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

Następnie skorzystaj z funkcji taskscheduler_ls() prosimy o informacje o zadaniach od naszego harmonogramu. Korzystanie z funkcji filter() z pakietu dplyr Usuwamy z listy zadań te, które zostały zakończone pomyślnie i mają status ostatniego wyniku 0, oraz te, które nigdy nie zostały uruchomione i mają status 267011, zadania wyłączone oraz zadania aktualnie uruchomione.

# запрашиваем список задач
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 się nie powiodły, musimy wysłać tę listę do Telegramu.

Jeśli przyjrzymy się każdemu poleceniu bardziej szczegółowo, wówczas:

  • filter() — filtruje listę zadań zgodnie z warunkami opisanymi powyżej
  • select() — pozostawia w tabeli tylko jedno pole z nazwą zadań
  • unique() - usuwa zduplikowane nazwy
  • unlist() — konwertuje wybraną kolumnę tabeli na wektor
  • paste0() — łączy nazwy zadań w jeden wiersz i jako separator umieszcza znak końca wiersza, tj. n.

Pozostaje nam tylko wysłać ten wynik telegramem.

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

Zatem w tej chwili kod bota wygląda następująco:

Kod bota przeglądu zadań

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

}

Korzystając z powyższego przykładu, wstaw do kodu swój token bota i identyfikator czatu.

Możesz dodać warunki filtrowania zadań, np. sprawdzanie tylko tych zadań, które sam utworzyłeś, z wyłączeniem zadań systemowych.

Możesz także umieścić różne ustawienia w oddzielnym pliku konfiguracyjnym i przechowywać w nim identyfikator czatu i token. Możesz przeczytać konfigurację, na przykład, używając pakietu configr.

Przykładowa konfiguracja ini

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

Przykład odczytu zmiennych z konfiguracji w 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

Konfigurowanie harmonogramu uruchamiania skanowania zadań

Bardziej szczegółowo opisano proces ustawiania uruchamiania skryptów zgodnie z harmonogramem Artykuł. Tutaj opiszę jedynie kroki, które należy w tym celu wykonać. Jeśli któryś z etapów nie jest dla Ciebie jasny, to zapoznaj się z artykułem, do którego podałem link.

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

  1. Wpisz ścieżkę do folderu, w którym zainstalowany jest R, w zmiennej systemowej Path; w Windows ścieżka będzie wyglądać mniej więcej tak: C:Program FilesRR-4.0.2bin.
  2. Utwórz wykonywalny plik bat z tylko jedną linią R CMD BATCH C:rscriptscheck_botcheck_bot.R. Zastąpić C:rscriptscheck_botcheck_bot.R do pełnej ścieżki do pliku R.
  3. Następnie użyj Harmonogramu zadań systemu Windows, aby skonfigurować harmonogram uruchamiania, na przykład co pół godziny.

wniosek

W tym artykule dowiedzieliśmy się, jak stworzyć bota i używać go do wysyłania różnych powiadomień telegramem.

Opisałem zadanie monitorowania Harmonogramu Zadań Windows, ale materiały zawarte w tym artykule możesz wykorzystać do wysyłania dowolnych powiadomień, od prognozy pogody po notowania akcji na giełdzie, ponieważ R umożliwia połączenie z ogromną liczbą źródeł danych.

W kolejnym artykule dowiemy się, jak dodać do bota polecenia i klawiaturę, aby mógł nie tylko wysyłać powiadomienia, ale także wykonywać bardziej złożone akcje.

Źródło: www.habr.com

Dodaj komentarz