Píšeme telegramového bota v jazyku R (časť 2): Pridávame botovi podporu príkazov a filtre správ

V predchádzajúceho príspevku rozobrali sme, ako vytvoriť bota, inicializovali sme inštanciu triedy Bot a oboznámili sme sa s metódami posielania správ s jeho pomocou.

V tomto článku pokračujem v tejto téme, preto odporúčam začať čítanie tohto článku len po prečítaní prvej časti.

Tentoraz sa pozrieme, ako oživiť nášho bota a pridáme mu podporu príkazov, a taktiež sa oboznámime s triedou Updater.

Počas článku napíšeme niekoľko jednoduchých botov, posledný z nich bude na základe zadaného dátumu a kódu krajiny určovať, či je deň v danej krajine nepracovný alebo pracovný podľa pracovného kalendára. Ale, ako vždy, cieľom článku je oboznámiť vás s rozhraním balíka telegram.bot na riešenie vašich vlastných úloh.

Píšeme telegramového bota v jazyku R (časť 2): Pridávame botovi podporu príkazov a filtre správ

Všetky články zo série "Píšeme telegramového bota v jazyku R"

  1. Vytvárame bota a posielame s ním správy do telegramu
  2. Pridávame botovi podporu príkazov a filtre správ

Obsah

Ak vás zaujíma analýza dát, mohli by vás zaujímať moje telegram a youtube kanály. Väčšina obsahu je venovaná jazyku R.

  1. Trieda Updater
  2. Handlers – spracovatelia
  3. Pridávame prvý príkaz bota, spracovateľ príkazov
  4. Spracovateľ textových správ a filtre
  5. Pridanie príkazov s parametrami
  6. Spúšťame bota na pozadí
  7. Záver

Trieda Updater

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

Zasa Dispetcher obsahuje vytvorené spracovatele, t.j. objekty triedy Handler.

Handlers – spracovatelia

S pomocou spracovateľov pridávate do Dispetcher reakcie bota na rôzne udalosti. V okamihu písania článku sú v telegram.bot pridané nasledujúce typy spracovateľov:

  • MessageHandler – Spracovateľ správ
  • CommandHandler – Spracovateľ príkazov
  • CallbackQueryHandler – Spracovateľ údajov odosielaných z Inline klávesníc
  • ErrorHandler – Spracovateľ chýb pri požiadavke aktualizácií od bota

Pridávame prvý príkaz bota, spracovateľ príkazov

Ak ste nikdy predtým nepoužívali boty a neviete, čo je to príkaz, príkazy bota je potrebné posielať s použitím priameho lomítka / ako prefixu.

Začneme s jednoduchými príkazmi, t.j. naučíme nášho bota pozdravovať na príkaz /hi.

Kód 1: Učíme bota pozdravovať

library(telegram.bot)

# vytvoríme inštanciu triedy Updater
updater <- Updater('TOKEN VÁŠHO BOT'A')

# Píšeme metódu na privítanie
say_hello <- function(bot, update) {

  # Meno používateľa, s ktorým sa treba pozdraviť
  user_name <- update$message$from$first_name

  # Odoslanie privítacieho správy
  bot$sendMessage(update$message$chat_id, 
                  text = paste0("Moje pozdravy, ", user_name, "!"), 
                  parse_mode = "Markdown")

}

# vytvoríme spracovateľ 
hi_hendler <- CommandHandler('hi', say_hello)

# pridáme spracovateľa do správcu
updater <- updater + hi_hendler

# spustíme bota
updater$start_polling()

Spustite vyššie uvedený príklad kódu, pričom nahradíte 'TOKEN VÁŠHO BOTA' za skutočný token, ktorý ste získali pri vytváraní bota cez BotFather (vytvorenie bota som popísal v v prvej článku).

Metóda start_polling() triedy Updater, ktorý sa používa na konci kódu, spúšťa nekonečnú slučku požiadaviek a spracovania aktualizácií od bota.

Teraz otvoríme Telegram a napíšeme nášmu botovi príkaz /hi.

Píšeme telegramového bota v jazyku R (časť 2): Pridávame botovi podporu príkazov a filtre správ

Teraz náš bot rozumie príkazu /hi, a vie sa s nami pozdraviť.

Schematicky môžeme proces vytvárania takéhoto najjednoduchšieho bota zobraziť nasledovne.

Píšeme telegramového bota v jazyku R (časť 2): Pridávame botovi podporu príkazov a filtre správ

  1. Vytvárame inštanciu triedy Updater;
  2. Vytvárame metódy, t.j. funkcie, ktoré bude náš bot vykonávať. V príklade kódu je to funkcia say_hello(). Funkcie, ktoré budete používať ako metódy bota musia mať dva povinné argumenty — bot a update, a jeden nepovinný — args. Argument bot, to je váš bot, s jeho pomocou môžete odpovedať na správy, odosielať správy alebo používať akékoľvek iné dostupné metódy bota. Argument update to, čo bot dostal od používateľa, v podstate to, čo sme získavali v prvej časti metódou getUpdates(). Argument args umožňuje spracovať dodatočné údaje odoslané používateľom spolu s príkazom, k tejto téme sa vrátime neskôr;
  3. Vytvárame spracovateľov, t.j. spájame nejaké akcie používateľa s metódami vytvorenými v predchádzajúcom kroku. V podstate spracovateľ je spúšťač, udalosť, ktorá vyvoláva nejakú funkciu bota. V našom prípade je takým spúšťačom odoslanie príkazu /hi, a realizuje sa príkazom hi_hendler <- CommandHandler('hi', say_hello). Prvý argument funkcie CommandHandler() umožňuje nastaviť príkaz, v našom prípade hi, na ktorý bude bot reagovať. Druhý argument umožňuje určiť metódu bota, budeme volať metódu say_hello, ktorá sa vykoná, ak používateľ vyvolal príkaz uvedený v prvom argumente;
  4. Potom pridáme vytvorený spracovateľ do správcu našej inštancie triedy Updater. Existuje niekoľko spôsobov, ako pridať spracovateľov, v uvedenom príklade som použil najjednoduchší, pomocou znaku +, t.j. updater <- updater + hi_hendler. To isté je možné urobiť aj pomocou metódy add_handler(), ktorá patrí do triedy Dispatcher, túto metódu môžeme nájsť takto: updater$dispatcher$add_handler();
  5. Spúšťame bota pomocou príkazu start_polling().

Spracovateľ textových správ a filtre

Ako sme sa naučili posielať príkazy bota, ale niekedy potrebujeme, aby bot reagoval nielen na príkazy, ale aj na bežné textové správy. Na to je potrebné použiť spracovateľov správ — MessageHandler.

Bežný MessageHandler bude reagovať na všetky prichádzajúce správy. Preto sa spracovatelia správ často používajú spolu s filtrami. Naučme bota pozdraviť nielen na príkaz /hi, ale aj vždy, keď v správe zaslanej botovi narazíme na jedno z nasledujúcich slov: ahoj, zdravím, pozdrav, čau, bonjour.

Prezatím nebudeme písať nejaké nové metódy, pretože už máme metódu, pomocou ktorej s nami bot zdraví. Od nás sa vyžaduje iba vytvoriť potrebný filter a spracovateľ správ.

Kód 2: Pridáme spracovateľ textových správ a filter

library(telegram.bot)

# vytvoríme inštanciu triedy Updater
updater <- Updater('TOKEN VÁŠHO BOTA')

# Píšeme metódu na pozdrav
## príkaz na pozdrav
say_hello <- function(bot, update) {

  # Meno používateľa, s ktorým sa treba pozdraviť
  user_name <- update$message$from$first_name

  # Posielame pozdravné správy
  bot$sendMessage(update$message$chat_id, 
                  text = paste0("Môj pozdrav, ", user_name, "!"),
                  parse_mode = "Markdown",
                  reply_to_message_id = update$message$message_id)

}

# vytvárame filtre
MessageFilters$hi <- BaseFilter(function(message) {

  # kontrolujeme, či sa v texte správy nachádzajú tieto slová: ahoj, zdravím, pozdrav, čau, bonjour
  grepl(x           = message$text, 
        pattern     = 'ahoj|zdravím|pozdrav|čau|bonjour',
        ignore.case = TRUE)
  }
)

# vytvárame spracovateľ 
hi_hendler <- CommandHandler('hi', say_hello) # spracovateľ príkazu hi
hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi)

# pridávame spracovateľov do dispečera
updater <- updater + 
             hi_hendler +
             hi_txt_hnd

# spúšťame bota
updater$start_polling()

Spustite vyššie uvedený príklad kódu, pričom nahradíte 'TOKEN VÁŠHO BOTA' za skutočný token, ktorý ste získali pri vytváraní bota cez BotFather (vytvorenie bota som popísal v v prvej článku).

Teraz sa pokúsime poslať botovi niekoľko správ, v ktorých sa nachádzajú uvedené slová pozdravov:
Píšeme telegramového bota v jazyku R (časť 2): Pridávame botovi podporu príkazov a filtre správ

Takže najprv sme naučili bota nielen pozdraviť, ale aj odpovedať na pozdrav. Urobili sme to pomocou argumentu reply_to_message_id, ktorý je dostupný v metóde sendMessage(), do ktorej je potrebné odovzdať id správy, na ktorú je potrebné odpovedať. Id správy môžete získať nasledujúcim spôsobom: update$message$message_id.

Ale hlavné je, že sme pridali botovi filter pomocou funkcie BaseFilter():

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

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

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

)

Ako ste si mohli všimnúť, filtre je potrebné pridať do objektu MessageFilters, v ktorom už od začiatku existuje malý súbor predpripravených filtrov. V našom príklade sme do objektu MessageFilters pridali prvok hi, to je nový filter.

Do funkcie BaseFilter() Je potrebné odovzdať filtrovať funkciu. V podstate je filter len funkcia, ktorá prijíma inštanciu správy a vracia TRUE alebo FALSE. V našom príklade sme napísali najjednoduchšiu funkciu, ktorá pomocou základnej funkcie grepl() skontroluje text správy, a ak zodpovedá regulárnemu výrazu ahoj|zdravím|čau|salan|bonjour vracia TRUE.

Ďalej vytvárame spracovateľa správ hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi). Prvý argument funkcie MessageHandler() — metóda, ktorá vyvolá spracovateľa, a druhý argument je filter, podľa ktorého bude vyvolaný. V našom prípade to je filter, ktorý sme vytvorili MessageFilters$hi.

A nakoniec pridáme do riadiaceho systému práve vytvorený spracovateľ hi_txt_hnd.

updater <- updater + 
             hi_hendler +
             hi_txt_hnd

Ako som už spomínal vyššie, v balíku telegram.bot a objekte MessageFilters už existuje súbor vstavaných filtrov, ktoré môžete použiť:

  • all — Všetky správy
  • text — Textové správy
  • command — Príkazy, t.j. správy, ktoré začínajú na /
  • reply — Správy, ktoré sú odpoveďou na inú správu
  • audio — Správy, ktoré obsahujú audio súbor
  • document — Správy so zaslaným dokumentom
  • photo — Správy so zaslanými obrázkami
  • sticker — Správy so zaslaným samolepkou
  • video — Správy s videom
  • voice — Hlasové správy
  • contact — Správy, ktoré obsahujú kontakt užívateľa telegramu
  • location — Správy s geolokáciou
  • venue — Preposielané správy
  • game — Hry

Ak chcete zlúčiť niektoré filtre v jednom spracovateľovi, jednoducho použite znak | — ako logický ALEBO, a znak & ako logický A. Napríklad, ak chcete, aby bot vyvolával rovnakú metódu, keď dostane video, obrázok alebo dokument, použite nasledujúci príklad vytvorenia spracovateľa správ:

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

Pridanie príkazov s parametrami

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

Nižšie je príklad bota, ktorý vracia typ dňa z výrobných kalendárov podľa zadaného dátumu a krajiny.

Nižšie uvedený bot využíva API výrobného kalendára. isdayoff.ru.

Kód 3: Bot, ktorý oznamuje na základe dátumu a krajiny.

library(telegram.bot)

# vytvárame inštanciu triedy Updater
updater <- Updater('1165649194:AAFkDqIzQ6Wq5GV0YU7PmEZcv1gmWIFIB_8')

# Píšeme metódu na privítanie
## príkaz privítania
check_date <- function(bot, update, args) {

  # vstupné údaje
  day     <- args[1]  # dátum
  country <- args[2]  # krajina

  # kontrola zadaných parametrov
  if ( !grepl('\d{4}-\d{2}-\d{2}', day) ) {

    # Pošlite vlastnú klávesnicu
    bot$sendMessage(update$message$chat_id, 
                    text = paste0(day, " - nesprávny dátum, zadajte dátum v formáte RRRR-MM-DD"),
                    parse_mode = "Markdown")

  } else {
    day <- as.Date(day)
    # konvertujeme do formátu POSIXtl
    y <- format(day, "%Y")
    m <- format(day, "%m")
    d <- format(day, "%d")

  }

  # krajina na kontrolu
  ## kontrolujeme, či je zadaná krajina
  ## ak nie je zadaná, nastavujeme ru
  if ( ! country %in% c('ru', 'ua', 'by', 'kz', 'us') ) {

    # Pošlite vlastnú klávesnicu
    bot$sendMessage(update$message$chat_id, 
                    text = paste0(country, " - nesprávny kód krajiny, možné hodnoty: ru, by, kz, ua, us. Požadované údaje pre Rusko."),
                    parse_mode = "Markdown")

    country <- 'ru'

  }

  # požiadanie o údaje z API
  # zostavenie HTTP požiadavky
  url <- paste0("https://isdayoff.ru/api/getdata?",
                "year=",  y, "&",
                "month=", m, "&",
                "day=",   d, "&",
                "cc=",    country, "&",
                "pre=1&",
                "covid=1")

  # získavame odpoveď
  res <- readLines(url)

  # interpretácia odpovede
  out <- switch(res, 
                "0"   = "Pracovný deň",
                "1"   = "Nepracovný deň",
                "2"   = "Skrátený pracovný deň",
                "4"   = "covid-19",
                "100" = "Chyba v dátume",
                "101" = "Údaje neboli nájdené",
                "199" = "Chyba služby")

  # posielame správu
  bot$sendMessage(update$message$chat_id, 
                  text = paste0(day, " - ", out),
                  parse_mode = "Markdown")

}

# vytvárame spracovateľ 
date_hendler <- CommandHandler('check_date', check_date, pass_args = TRUE)

# pridávame spracovateľ do rozhraní
updater <- updater + date_hendler

# spúšťame bota
updater$start_polling()

Spustite vyššie uvedený príklad kódu, pričom nahradíte 'TOKEN VÁŠHO BOTA' za skutočný token, ktorý ste získali pri vytváraní bota cez BotFather (vytvorenie bota som popísal v v prvej článku).

Vytvorili sme bota, ktorý má vo svojom arzenáli len jednu metódu. check_date, táto metóda sa vyvoláva rovnakým príkazom.

Okrem názvu príkazu tento spôsob očakáva, že zadáte dva parametre, kód krajiny a dátum. Potom sa kontroluje, či je daný deň v uvedenej krajine sviatkom, skráteným dňom alebo pracovným dňom podľa oficiálneho pracovného kalendára.

Aby náš vytváraný spôsob prijímal dodatočné parametre spolu s príkazom, použite argument pass_args = TRUE v funkcii CommandHandler(), a pri vytváraní spôsobu, okrem povinných argumentov bot, update vytvorte voliteľný — args. Takto vytvorený spôsob prijme parametre, ktoré predávate botovi po názve príkazu. Parametre musíte oddeliť medzerou, do metódy sa dostanú ako textový vektor.

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

Píšeme telegramového bota v jazyku R (časť 2): Pridávame botovi podporu príkazov a filtre správ

Spúšťame bota na pozadí

Posledný krok, ktorý musíme vykonať, je spustiť bota na pozadí.

Na to postupujte podľa nižšie opísaného algoritmu:

  1. Uložte kód bota do súboru s príponou R. Pri práci v RStudio to robíte cez menu File, príkazom Uložiť ako….
  2. Pridajte cestu k priečinku bin, ktorý sa nachádza v priečinku, kde ste nainštalovali jazyk R do premennej Path, inštrukcia tu.
  3. Vytvorte obyčajný textový súbor, v ktorom napíšete 1 riadok: R CMD BATCH C:UsersAlseyDocumentsmy_bot.R. Namiesto C:UsersAlseyDocumentsmy_bot.R napíšte cestu k svojmu skriptu bota. Je dôležité, aby sa v ceste nenachádzala cyrilika a medzery, pretože to môže spôsobiť problémy pri spúšťaní bota. Uložte ho a nahraďte jeho príponu na txt na bat.
  4. Otvorenie Plánovača úloh Windows, existuje mnoho spôsobov, ako to urobiť, napríklad otvorte akýkoľvek priečinok a do adresy zadajte %windir%system32taskschd.msc /s. Ďalšie spôsoby spustenia nájdete tu.
  5. V pravom hornom menu plánovača kliknite na "Vytvoriť úlohu…".
  6. Na záložke "Všeobecné" zadajte ľubovoľný názov vašej úlohy a prepínač prepnite do stavu "Spúšťať pre všetkých používateľov".
  7. Prejdite na záložku "Akcie", kliknite na "Vytvoriť". V poli "Program alebo skript" kliknite na "Prehľadávať", nájdite vytvorený vo druhom kroku bat súbor a kliknite na OK.
  8. Kliknite na OK, ak je to potrebné, zadajte heslo k vášmu účtu operačného systému.
  9. Nájdite v plánovači vytvorenú úlohu, vyberte ju a v pravom dolnom rohu kliknite na tlačidlo "Spustiť".

Náš bot beží na pozadí a bude fungovať, pokiaľ nezastavíte úlohu alebo nevypnete svoj počítač alebo server, na ktorom je spustený.

Záver

V tomto článku sme sa naučili, ako napísať kompletného bota, ktorý nielenže vie posielať správy, ale aj reagovať na prichádzajúce správy a príkazy. Získané vedomosti sú už dostatočné na vyriešenie väčšiny vašich úloh.

V nasledujúcom článku sa budeme zaoberať tým, ako pridať botovi klávesnicu pre pohodlnejšiu prácu.

Prihlásite sa na môj telegram a youtube kanály.

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster