Pisanie bota telegramowego w R (część 2): Dodanie obsługi poleceń i filtrów wiadomości do bota

В poprzednia publikacja wymyśliliśmy, jak stworzyć bota, zainicjowaliśmy instancję klasy Bot i zapoznał się ze sposobami wysyłania wiadomości za jego pomocą.

W tym artykule kontynuuję ten temat, dlatego zalecam rozpoczęcie czytania tego artykułu dopiero po jego przeczytaniu część pierwsza.

Tym razem zastanowimy się jak ożywić naszego bota i dodać do niego obsługę poleceń, a także zapoznamy się z klasą Updater.

W trakcie artykułu napiszemy kilka prostych botów, które na podstawie podanej daty i kodu kraju określą, czy dzień w danym kraju jest weekendem, czy dniem roboczym według kalendarza produkcyjnego. Jednak tak jak poprzednio, celem artykułu jest zapoznanie się z interfejsem pakietu telegram.bot aby rozwiązać własne problemy.

Pisanie bota telegramowego w R (część 2): Dodanie obsługi poleceń i filtrów wiadomości do bota

Wszystkie artykuły z serii „Pisanie bota telegramowego w R”

  1. Tworzymy bota i używamy go do wysyłania wiadomości w telegramie
  2. Dodaj obsługę poleceń i filtry wiadomości do bota

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. Klasa aktualizatora
  2. Handlarze - handlerzy
  3. Dodaj pierwsze polecenie do bota, moduł obsługi poleceń
  4. Procesor i filtry wiadomości tekstowych
  5. Dodawanie poleceń z parametrami
  6. Uruchom bota w tle
  7. wniosek

Klasa aktualizatora

Updater to klasa, która ułatwia tworzenie bota telegramu i wykorzystuje tę klasę pod maską Dispetcher. Przydział zajęć Updater polega na otrzymywaniu aktualizacji od bota (w poprzednim artykule wykorzystaliśmy w tym celu metodę getUpdates()) i przenieść je dalej do Dispetcher.

Z kolei Dispetcher zawiera procedury obsługi, które utworzyłeś, tj. obiekty klasowe Handler.

Handlarze - handlerzy

Z modułami obsługi, do których dodajesz Dispetcher reakcje botów na różne zdarzenia. W momencie pisania tego artykułu w telegram.bot Dodano następujące typy handlerów:

  • MessageHandler — moduł obsługi wiadomości
  • CommandHandler — moduł obsługi poleceń
  • CallbackQueryHandler — Procedura obsługi danych dla klawiatur wysyłanych z Inline
  • ErrorHandler — Obsługa błędów podczas żądania aktualizacji od bota

Dodaj pierwsze polecenie do bota, moduł obsługi poleceń

Jeśli nigdy wcześniej nie korzystałeś z botów i nie wiesz co to jest polecenie, to polecenia do bota należy wysyłać za pomocą ukośnika / jako przedrostek.

Zaczniemy od prostych poleceń, tj. nauczmy naszego bota przywitania się na komendę /hi.

Kod 1: Nauczenie bota, jak się przywitać

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

Uruchom powyższy przykładowy kod, po zastąpieniu „TWOJEGO ŻETONA BOTA” prawdziwym tokenem, który otrzymałeś podczas tworzenia bota poprzez Ojciec Bota (Mówiłem o stworzeniu bota w Pierwszy artykuł).

metoda start_polling() klasa Updater, który jest używany na końcu kodu, rozpoczyna nieskończoną pętlę żądania i przetwarzania aktualizacji od bota.

Otwórzmy teraz Telegram i napiszmy pierwsze polecenie naszemu botowi /hi.

Pisanie bota telegramowego w R (część 2): Dodanie obsługi poleceń i filtrów wiadomości do bota

Teraz nasz bot rozumie polecenie /hii wie, jak nas przywitać.

Schematycznie proces budowy takiego prostego bota można przedstawić następująco.

Pisanie bota telegramowego w R (część 2): Dodanie obsługi poleceń i filtrów wiadomości do bota

  1. Utwórz instancję klasy Updater;
  2. Tworzymy metody, tj. funkcje, które będzie wykonywał nasz bot. W przykładzie kodu jest to funkcja say_hello(). Funkcje, których będziesz używać jako metod bota, muszą mieć dwa wymagane argumenty - pysk и aktualizacjai jeden opcjonalny - args. Argument pysk, to jest Twój bot, za jego pomocą możesz odpowiadać na wiadomości, wysyłać wiadomości lub korzystać z innych metod dostępnych dla bota. Argument aktualizacja to właśnie bot otrzymał od użytkownika, a właściwie to, co otrzymaliśmy w pierwszym artykule dotyczącym tej metody getUpdates(). Argument args pozwala na przetwarzanie dodatkowych danych przesłanych przez użytkownika wraz z poleceniem, do tego tematu wrócimy nieco później;
  3. Tworzymy handlery tj. Niektóre działania użytkownika kojarzymy z metodami utworzonymi w poprzednim kroku. Zasadniczo moduł obsługi to wyzwalacz, zdarzenie wywołujące jakąś funkcję bota. W naszym przykładzie takim wyzwalaczem jest wysłanie polecenia /hii jest wdrażany przez zespół hi_hendler <- CommandHandler('hi', say_hello). Pierwszy argument funkcji CommandHandler() pozwala w naszym przypadku określić polecenie hi, na co bot odpowie. Drugi argument pozwala określić metodę bota, metodę wywołamy say_hello, które zostanie wykonane jeśli użytkownik wywoła polecenie podane w pierwszym argumencie;
  4. Następnie dodajemy utworzony moduł obsługi do dyspozytora instancji naszej klasy Updater. Procedury obsługi można dodawać na kilka sposobów, w powyższym przykładzie użyłem najprostszego, wykorzystując znak +tj. updater <- updater + hi_hendler. To samo można zrobić za pomocą metody add_handler(), który należy do klasy Dispatcher, możesz znaleźć tę metodę w następujący sposób: updater$dispatcher$add_handler();
  5. Uruchom bota za pomocą polecenia start_polling().

Procesor i filtry wiadomości tekstowych

Wymyśliliśmy, jak wysyłać polecenia do bota, ale czasami potrzebujemy, aby bot reagował nie tylko na polecenia, ale także na niektóre zwykłe wiadomości tekstowe. Aby to zrobić, musisz użyć programów obsługi wiadomości − Obsługa wiadomości.

Normalny Obsługa wiadomości odpowie na absolutnie wszystkie przychodzące wiadomości. Dlatego procedury obsługi komunikatów są często używane razem z filtrami. Nauczmy bota witać się nie tylko na komendę /hi, ale także zawsze, gdy w wiadomości wysłanej do bota pojawi się jedno z poniższych słów: hello, hello, salute, hai, bonjour.

Na razie nie będziemy pisać żadnych nowych metod, bo... Mamy już metodę, dzięki której bot nas wita. Wszystko, co musimy zrobić, to utworzyć wymagany filtr i procedurę obsługi wiadomości.

Kod 2: Dodaj moduł obsługi i filtr wiadomości tekstowych

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

Uruchom powyższy przykładowy kod, po zastąpieniu „TWOJEGO ŻETONA BOTA” prawdziwym tokenem, który otrzymałeś podczas tworzenia bota poprzez Ojciec Bota (Mówiłem o stworzeniu bota w Pierwszy artykuł).

Spróbujmy teraz wysłać botowi kilka wiadomości zawierających wymienione wcześniej słowa powitania:
Pisanie bota telegramowego w R (część 2): Dodanie obsługi poleceń i filtrów wiadomości do bota

Przede wszystkim nauczyliśmy bota nie tylko się przywitać, ale także odpowiedzieć na powitanie. Zrobiliśmy to za pomocą argumentu odpowiedz_na_wiadomość_id, który jest dostępny w metodzie sendMessage(), do którego musisz przenieść identyfikator wiadomości, na którą chcesz odpowiedzieć. Identyfikator wiadomości można uzyskać w następujący sposób: update$message$message_id.

Ale najważniejszą rzeczą, którą zrobiliśmy, było dodanie filtra do bota za pomocą funkcji BaseFilter():

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

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

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

)

Jak zapewne zauważyłeś, do obiektu należy dodać filtry Filtry wiadomości, który początkowo zawiera już niewielki zestaw gotowych filtrów. W naszym przykładzie do obiektu Filtry wiadomości dodaliśmy element hi, to jest nowy filtr.

W funkcji BaseFilter() musisz przekazać funkcję filtru. Zasadniczo filtr to po prostu funkcja, która odbiera instancję komunikatu i zwraca TRUE lub FAŁSZYWY. W naszym przykładzie napisaliśmy prostą funkcję, która korzystając z funkcji podstawowej grepl() sprawdza tekst wiadomości i czy pasuje do wyrażenia regularnego привет|здравствуй|салют|хай|бонжур zwroty TRUE.

Następnie tworzymy procedurę obsługi wiadomości hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi). Pierwszy argument funkcji MessageHandler() to metoda, która wywoła procedurę obsługi, a drugi argument to filtr, za pomocą którego zostanie wywołana. W naszym przypadku jest to stworzony przez nas filtr MessageFilters$hi.

Cóż, na koniec dodajemy do dyspozytora utworzony handler cześć_txt_hnd.

updater <- updater + 
             hi_hendler +
             hi_txt_hnd

Jak pisałem powyżej, w pakiecie telegram.bot i obiekt Filtry wiadomości Istnieje już zestaw wbudowanych filtrów, z których możesz skorzystać:

  • wszystko — Wszystkie wiadomości
  • tekst — Wiadomości tekstowe
  • polecenie — Polecenia, tj. wiadomości zaczynające się od /
  • odpowiedź — Wiadomości będące odpowiedzią na inną wiadomość
  • audio — Wiadomości zawierające plik audio
  • dokument — Wiadomości z wysłanym dokumentem
  • zdjęcie - Wiadomości z wysłanymi obrazami
  • naklejka — Wiadomości z wysłaną naklejką
  • wideo — Wiadomości z wideo
  • głos - Wiadomości głosowe
  • kontakt — Wiadomości zawierające treść telegramu użytkownika
  • lokalizacja — Wiadomości z geolokalizacją
  • miejsce — Wiadomości przekazane dalej
  • gra — Gry

Jeśli chcesz połączyć kilka filtrów w jednym programie obsługi, po prostu użyj znaku | – jako logiczne Ori podpisz & jako logiczne И. Na przykład, jeśli chcesz, aby bot wywoływał tę samą metodę po odebraniu wideo, obrazu lub dokumentu, użyj poniższego przykładu, aby utworzyć procedurę obsługi wiadomości:

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

Dodawanie poleceń z parametrami

Wiemy już, czym są polecenia, jak je utworzyć i jak zmusić bota do wykonania żądanego polecenia. Jednak w niektórych przypadkach oprócz nazwy polecenia musimy przekazać pewne dane, aby je wykonać.

Poniżej przykład bota, który podając podaną datę i kraj zwraca typ dnia z kalendarza produkcyjnego.

Bot poniżej korzysta z API kalendarza produkcyjnego isdayoff.ru.

Kod 3: Bot raportujący według daty i kraju

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

Uruchom powyższy przykładowy kod, po zastąpieniu „TWOJEGO ŻETONA BOTA” prawdziwym tokenem, który otrzymałeś podczas tworzenia bota poprzez Ojciec Bota (Mówiłem o stworzeniu bota w Pierwszy artykuł).

Stworzyliśmy bota, który w swoim arsenale ma tylko jedną metodę check_date, metoda ta jest wywoływana poleceniem o tej samej nazwie.

Jednak oprócz nazwy polecenia ta metoda wymaga wprowadzenia dwóch parametrów: kodu kraju i daty. Następnie bot sprawdza, czy dany dzień we wskazanym kraju jest weekendem, dniem skróconym, czy dniem roboczym według oficjalnego kalendarza produkcyjnego.

Aby tworzona przez nas metoda akceptowała wraz z poleceniem dodatkowe parametry, należy użyć argumentu pass_args = TRUE w funkcji CommandHandler()i podczas tworzenia metody, oprócz wymaganych argumentów pysk, aktualizacja utwórz opcjonalny - args. Utworzona w ten sposób metoda przyjmie parametry, które przekażesz botowi po nazwie polecenia. Parametry muszą być oddzielone spacją, zostaną przesłane do metody jako wektor tekstowy.

Uruchommy i przetestujmy naszego bota.

Pisanie bota telegramowego w R (część 2): Dodanie obsługi poleceń i filtrów wiadomości do bota

Uruchom bota w tle

Ostatnim krokiem, który musimy wykonać, jest uruchomienie bota w tle.

Aby to zrobić, postępuj zgodnie z algorytmem opisanym poniżej:

  1. Zapisz kod bota do pliku z rozszerzeniem R. Podczas pracy w RStudio odbywa się to poprzez menu filet, zespół Zapisz jako….
  2. Dodaj ścieżkę do folderu bin, który z kolei znajduje się w folderze, w którym zainstalowałeś język R, do zmiennej Path, instrukcje tutaj.
  3. Utwórz zwykły plik tekstowy, w którym napisz 1 linię: R CMD BATCH C:UsersAlseyDocumentsmy_bot.R. Zamiast C:UsersAlseyDocumentsmy_bot.R wpisz ścieżkę do skryptu bota. Jednocześnie ważne jest, aby po drodze nie było znaków cyrylicy ani spacji, ponieważ może to powodować problemy podczas uruchamiania bota. Zapisz go i zamień jego rozszerzenie na txt na bat.
  4. Otwórz Harmonogram zadań systemu Windows. Można to zrobić na wiele sposobów, na przykład otwórz dowolny folder i wprowadź adres %windir%system32taskschd.msc /s. Można znaleźć inne metody uruchamiania tutaj.
  5. W prawym górnym menu harmonogramu kliknij „Utwórz zadanie…”.
  6. Na karcie „Ogólne” nadaj swojemu zadaniu niestandardową nazwę i przełącz przełącznik w stan „Uruchom dla wszystkich użytkowników”.
  7. Przejdź do zakładki „Akcje”, kliknij „Utwórz”. W polu „Program lub skrypt” kliknij „Przeglądaj” i znajdź ten utworzony w drugim kroku bat plik i kliknij OK.
  8. Kliknij OK i jeśli to konieczne, wprowadź hasło do konta w systemie operacyjnym.
  9. Znajdź utworzone zadanie w harmonogramie, wybierz je i kliknij przycisk „Uruchom” w prawym dolnym rogu.

Nasz bot działa w tle i będzie działał do momentu zatrzymania zadania lub wyłączenia komputera lub serwera, na którym zostało uruchomione.

wniosek

W tym artykule wymyśliliśmy, jak napisać pełnoprawnego bota, który może nie tylko wysyłać wiadomości, ale także odpowiadać na przychodzące wiadomości i polecenia. Zdobyta wiedza wystarczy już na rozwiązanie większości Twoich problemów.

W następnym artykule omówimy, jak dodać klawiaturę do bota, aby zapewnić wygodniejszą pracę.

Subskrybuj mój telegram и youtube kanały.

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

Dodaj komentarz