Písanie telegramového robota v R (časť 2): Pridanie podpory príkazov a filtrov správ do robota

В predchádzajúcej publikácii prišli sme na to, ako vytvoriť bota, inicializovali sme inštanciu triedy Bot a oboznámil sa s metódami odosielania správ pomocou nej.

V tomto článku pokračujem v tejto téme, preto odporúčam začať čítať tento článok až po prečítaní prvá časť.

Tentokrát prídeme na to, ako oživiť nášho bota a pridať k nemu podporu príkazov a tiež sa zoznámime s triedou Updater.

V priebehu článku si napíšeme niekoľko jednoduchých botov, ktorí na základe daného dátumu a kódu krajiny určia, či je v danej krajine deň víkend alebo pracovný deň podľa produkčného kalendára. Ale ako predtým, účelom článku je oboznámiť vás s rozhraním balíka telegram.bot riešiť svoje vlastné problémy.

Písanie telegramového robota v R (časť 2): Pridanie podpory príkazov a filtrov správ do robota

Všetky články zo série „Písanie telegramového robota v R“

  1. Vytvárame robota a používame ho na odosielanie správ v telegrame
  2. Pridajte do robota podporu príkazov a filtre správ

Obsah

Ak máte záujem o analýzu údajov, mohla by vás zaujímať moja telegram и youtube kanálov. Väčšina obsahu je venovaná jazyku R.

  1. Trieda Updater
  2. Psovodi - psovodi
  3. Pridajte prvý príkaz do robota, obslužného programu príkazov
  4. Procesor textových správ a filtre
  5. Pridávanie príkazov s parametrami
  6. Spustite robota na pozadí
  7. Záver

Trieda Updater

Updater je trieda, ktorá vám uľahčuje vývoj telegramového robota a používa triedu pod kapotou Dispetcher. Zadanie triedy Updater je prijímať aktualizácie od robota (v predchádzajúcom článku sme na tento účel použili metódu getUpdates()) a preniesť ich ďalej do Dispetcher.

Na druhej strane Dispetcher obsahuje vami vytvorené handlery, t.j. objekty triedy Handler.

Psovodi - psovodi

S obsluhou, ku ktorej sa pridáte Dispetcher reakcie robotov na rôzne udalosti. V čase písania tohto článku v telegram.bot Boli pridané nasledujúce typy manipulátorov:

  • MessageHandler — Obsluha správ
  • CommandHandler — Ovládač príkazov
  • CallbackQueryHandler — Obslužný nástroj pre klávesnice odoslané z Inline
  • ErrorHandler — Obslužný program chýb pri požadovaní aktualizácií od robota

Pridajte prvý príkaz do robota, obslužného programu príkazov

Ak ste nikdy predtým nepoužili roboty a neviete, čo je to príkaz, príkazy sa musia robotovi odoslať pomocou lomky / ako predpona.

Začneme jednoduchými príkazmi, t.j. naučme nášho robota pozdraviť na povel /hi.

Kód 1: Naučte robota pozdraviť

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

Spustite vyššie uvedený príklad kódu po nahradení 'Your BOT TOKEN' skutočným tokenom, ktorý ste dostali pri vytváraní robota cez Obaja Otec (Hovoril som o vytvorení robota v prvý článok).

metóda start_polling() trieda Updater, ktorý sa používa na konci kódu, spúšťa nekonečnú slučku vyžiadania a spracovania aktualizácií od robota.

Teraz otvorme telegram a napíšme prvý príkaz nášmu robotovi /hi.

Písanie telegramového robota v R (časť 2): Pridanie podpory príkazov a filtrov správ do robota

Teraz náš robot rozumie príkazu /hia vie nás pozdraviť.

Schematicky môže byť proces budovania takého jednoduchého robota znázornený nasledovne.

Písanie telegramového robota v R (časť 2): Pridanie podpory príkazov a filtrov správ do robota

  1. Vytvorte inštanciu triedy Updater;
  2. Vytvárame metódy, t.j. funkcie, ktoré bude vykonávať náš robot. V príklade kódu ide o funkciu say_hello(). Funkcie, ktoré budete používať ako metódy robotov, musia mať dva povinné argumenty - Bot и aktualizovaťa jeden voliteľný - args. Argumentovať Bot, toto je váš robot, s jeho pomocou môžete odpovedať na správy, odosielať správy alebo používať akékoľvek iné metódy dostupné pre robota. Argumentovať aktualizovať to je to, čo robot dostal od používateľa, v skutočnosti to, čo sme dostali v prvom článku pomocou metódy getUpdates(). Argumentovať args umožňuje spracovať ďalšie údaje odoslané používateľom spolu s príkazom, k tejto téme sa vrátime o niečo neskôr;
  3. Vytvárame handlerov, t.j. Niektoré akcie používateľa spájame s metódami vytvorenými v predchádzajúcom kroku. V podstate je handler spúšťačom, udalosťou, ktorá volá nejakú funkciu robota. V našom príklade je takýmto spúšťačom odoslanie príkazu /hia implementuje ho tím hi_hendler <- CommandHandler('hi', say_hello). Prvý argument funkcie CommandHandler() umožňuje zadať príkaz, v našom prípade hi, na ktorý robot odpovie. Druhý argument vám umožňuje určiť metódu bota, metódu zavoláme say_hello, ktorý sa vykoná, ak používateľ zavolá príkaz uvedený v prvom argumente;
  4. Ďalej pridáme vytvorený handler do dispečera našej inštancie triedy Updater. Obslužné nástroje môžete pridať niekoľkými spôsobmi; v príklade vyššie som použil najjednoduchší pomocou znaku +, t.j. updater <- updater + hi_hendler. To isté možno urobiť pomocou metódy add_handler(), ktorý patrí do triedy Dispatcher, môžete nájsť túto metódu takto: updater$dispatcher$add_handler();
  5. Spustite robota pomocou príkazu start_polling().

Procesor textových správ a filtre

Prišli sme na to, ako posielať botom príkazy, no niekedy potrebujeme, aby bot odpovedal nielen na príkazy, ale aj na nejaké bežné textové správy. Na to musíte použiť obslužné programy správ − MessageHandler.

Normálne MessageHandler odpovie úplne na všetky prichádzajúce správy. Preto sa obslužné programy správ často používajú spolu s filtrami. Naučme bota pozdraviť nielen na povel /hi, ale aj vždy, keď sa v správe odoslanej robotovi objaví jedno z nasledujúcich slov: ahoj, ahoj, salute, hai, bonjour.

Zatiaľ nebudeme písať žiadne nové metódy, pretože... Už máme metódu, ktorou nás robot pozdraví. Všetko, čo musíme urobiť, je vytvoriť požadovaný filter a obslužný program správ.

Kód 2: Pridajte obsluhu a filter textových správ

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

Spustite vyššie uvedený príklad kódu po nahradení 'Your BOT TOKEN' skutočným tokenom, ktorý ste dostali pri vytváraní robota cez Obaja Otec (Hovoril som o vytvorení robota v prvý článok).

Teraz sa pokúsme poslať robotovi niekoľko správ obsahujúcich pozdravné slová uvedené vyššie:
Písanie telegramového robota v R (časť 2): Pridanie podpory príkazov a filtrov správ do robota

Takže v prvom rade sme robota naučili nielen pozdraviť, ale aj odpovedať na pozdrav. Urobili sme to pomocou argumentu answer_to_message_id, ktorý je dostupný v metóde sendMessage(), do ktorého je potrebné preniesť id správy, na ktorú chcete odpovedať. ID správy môžete získať takto: update$message$message_id.

Ale hlavná vec, ktorú sme urobili, bolo pridanie filtra do robota pomocou funkcie BaseFilter():

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

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

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

)

Ako ste si mohli všimnúť, do objektu je potrebné pridať filtre MessageFilters, ktorý na začiatku už obsahuje malú sadu hotových filtrov. V našom príklade k objektu MessageFilters pridali sme prvok hi, toto je nový filter.

Vo funkcii BaseFilter() musíte prejsť funkciou filtra. Filter je v podstate len funkcia, ktorá prijíma inštanciu správy a vracia sa TRUE alebo FALSE. V našom príklade sme napísali jednoduchú funkciu, ktorá pomocou základnej funkcie grepl() skontroluje text správy a či sa zhoduje s regulárnym výrazom привет|здравствуй|салют|хай|бонжур sa vracia TRUE.

Ďalej vytvoríme obsluhu správ hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi). Prvý argument funkcie MessageHandler() je metóda, ktorá bude volať obslužný program, a druhý argument je filter, pomocou ktorého sa bude volať. V našom prípade je to filter, ktorý sme vytvorili MessageFilters$hi.

No a na záver pridávame dispečerovi vytvoreného handlera hi_txt_hnd.

updater <- updater + 
             hi_hendler +
             hi_txt_hnd

Ako som písal vyššie, v balení telegram.bot a objekt MessageFilters Už existuje sada vstavaných filtrov, ktoré môžete použiť:

  • all — Všetky správy
  • text — Textové správy
  • príkaz — Príkazy, t.j. správy, ktoré začínajú na /
  • odpovedať — Správy, ktoré sú odpoveďou na inú správu
  • audio — Správy obsahujúce zvukový súbor
  • dokument — Správy s odoslaným dokumentom
  • fotografia - Správy s odoslanými obrázkami
  • nálepka — Správy s odoslanou nálepkou
  • video — Správy s videom
  • hlas - hlasové správy
  • kontakt — Správy obsahujúce obsah telegramu používateľa
  • poloha — Správy s geolokáciou
  • miesto — Preposlané správy
  • hra — Hry

Ak chcete skombinovať niektoré filtre do jedného obslužného programu, stačí použiť znak | - ako logické ORa podpíšte sa & ako logické И. Ak napríklad chcete, aby robot zavolal rovnakú metódu, keď dostane video, obrázok alebo dokument, použite nasledujúci príklad na vytvorenie obsluhy správ:

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

Pridávanie príkazov s parametrami

Už vieme, čo sú príkazy, ako ich vytvoriť a ako prinútiť robota vykonať požadovaný príkaz. V niektorých prípadoch však okrem názvu príkazu musíme na jeho vykonanie odovzdať aj nejaké údaje.

Nižšie je uvedený príklad robota, ktorý vám pri danom dátume a krajine vráti typ dňa z produkčného kalendára.

Bot nižšie používa rozhranie API produkčného kalendára isdayoff.ru.

Kód 3: Robot, ktorý podáva správy podľa dátumu a krajiny

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

Spustite vyššie uvedený príklad kódu po nahradení 'Your BOT TOKEN' skutočným tokenom, ktorý ste dostali pri vytváraní robota cez Obaja Otec (Hovoril som o vytvorení robota v prvý článok).

Vytvorili sme robota, ktorý má vo svojom arzenáli iba jednu metódu check_date, táto metóda sa volá príkazom s rovnakým názvom.

Okrem názvu príkazu však táto metóda vyžaduje zadanie dvoch parametrov, kódu krajiny a dátumu. Potom bot skontroluje, či je daný deň v zadanej krajine víkendom, skráteným dňom alebo pracovným dňom podľa oficiálneho produkčného kalendára.

Aby metóda, ktorú vytvoríme, akceptovala spolu s príkazom aj ďalšie parametre, použite argument pass_args = TRUE vo funkcii CommandHandler(), a pri vytváraní metódy okrem požadovaných argumentov Bot, aktualizovať vytvoriť voliteľnú - args. Takto vytvorená metóda bude akceptovať parametre, ktoré odovzdáte botovi za názvom príkazu. Parametre musia byť oddelené medzerou, budú odoslané do metódy ako textový vektor.

Poďme spustiť a otestovať nášho robota.

Písanie telegramového robota v R (časť 2): Pridanie podpory príkazov a filtrov správ do robota

Spustite robota na pozadí

Posledným krokom, ktorý musíme dokončiť, je spustenie robota na pozadí.

Ak to chcete urobiť, postupujte podľa nižšie uvedeného algoritmu:

  1. Uložte kód bota do súboru s príponou R. Pri práci v RStudio sa to robí cez menu rezeň, tím Uložiť ako.
  2. Pridajte cestu k priečinku bin, ktorý sa nachádza v priečinku, do ktorého ste nainštalovali jazyk R, do premennej Path, inštrukcie tu.
  3. Vytvorte obyčajný textový súbor, do ktorého napíšte 1 riadok: R CMD BATCH C:UsersAlseyDocumentsmy_bot.R... Namiesto C:UsersAlseyDocumentsmy_bot.R napíšte cestu k skriptu vášho robota. Zároveň je dôležité, aby na ceste neboli žiadne znaky azbuky ani medzery, pretože to môže spôsobiť problémy pri spustení robota. Uložte ho a nahraďte jeho rozšírenie s txt na pálke.
  4. Otvorte Plánovač úloh systému Windows, existuje mnoho spôsobov, ako to urobiť, napríklad otvorte ľubovoľný priečinok a zadajte adresu %windir%system32taskschd.msc /s. Ďalšie spôsoby spustenia možno nájsť tu.
  5. V pravej hornej ponuke plánovača kliknite na „Vytvoriť úlohu...“.
  6. Na karte Všeobecné priraďte svojej úlohe vlastný názov a prepnite prepínač do stavu Spustiť pre všetkých používateľov.
  7. Prejdite na kartu „Akcie“, kliknite na „Vytvoriť“. V poli „Program alebo skript“ kliknite na „Prehľadávať“ a nájdite ten vytvorený v druhom kroku pálke súbor a kliknite na tlačidlo OK.
  8. Kliknite na tlačidlo OK a v prípade potreby zadajte heslo svojho účtu operačného systému.
  9. Nájdite vytvorenú úlohu v plánovači, vyberte ju a kliknite na tlačidlo „Spustiť“ v pravom dolnom rohu.

Náš robot beží na pozadí a bude fungovať, kým nezastavíte úlohu alebo nevypnete počítač alebo server, na ktorom bol spustený.

Záver

V tomto článku sme prišli na to, ako napísať plnohodnotného bota, ktorý dokáže nielen posielať správy, ale aj reagovať na prichádzajúce správy a príkazy. Získané znalosti už stačia na vyriešenie väčšiny vašich problémov.

Nasledujúci článok bude hovoriť o tom, ako pridať klávesnicu do robota pre pohodlnejšiu prácu.

Prihlásiť sa na odber môjho telegram и youtube kanály.

Zdroj: hab.com

Pridať komentár