V 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í .
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.

Všetky články zo série "Píšeme telegramového bota v jazyku R"
Obsah
Ak vás zaujíma analýza dát, mohli by vás zaujímať moje a kanály. Väčšina obsahu je venovaná jazyku R.
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 ).
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.

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.

- Vytvárame inštanciu triedy
Updater; - 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ódougetUpdates(). 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; - 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íkazomhi_hendler <- CommandHandler('hi', say_hello). Prvý argument funkcieCommandHandler()umožňuje nastaviť príkaz, v našom prípadehi, na ktorý bude bot reagovať. Druhý argument umožňuje určiť metódu bota, budeme volať metódusay_hello, ktorá sa vykoná, ak používateľ vyvolal príkaz uvedený v prvom argumente; - 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ódyadd_handler(), ktorá patrí do triedyDispatcher, túto metódu môžeme nájsť takto:updater$dispatcher$add_handler(); - 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 ).
Teraz sa pokúsime poslať botovi niekoľko správ, v ktorých sa nachádzajú uvedené slová pozdravov:

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_hndAko 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. .
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 ).
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.

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:
- 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….
- Pridajte cestu k priečinku bin, ktorý sa nachádza v priečinku, kde ste nainštalovali jazyk R do premennej Path, inštrukcia .
- 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. - 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 . - V pravom hornom menu plánovača kliknite na "Vytvoriť úlohu…".
- 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".
- 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.
- Kliknite na OK, ak je to potrebné, zadajte heslo k vášmu účtu operačného systému.
- 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 a kanály.
Zdroj: habr.com
