Në ne e kuptuam se si të krijojmë një bot, inicializuam një ekzemplar të klasës Bot dhe u njohëm me metodat e dërgimit të mesazheve me të.
Në këtë artikull vazhdoj këtë temë, prandaj rekomandoj të filloni leximin e këtij artikulli vetëm pas leximit .
Së këtë herë do të kuptojmë se si ta zgjojmë botin tonë dhe do të shtojmë mbështetje për komandat, si dhe do të njohim klasën Updater.
Gjatë artikullit do të shkruajmë disa bota të thjeshta, i fundit do të përcaktojë nëse një ditë në vendin e caktuar sipas datës dhe kodit të vendit është pushim apo ditë pune sipas kalendarit të prodhimit. Por, siç e kemi thënë më parë, qëllimi i artikullit është t'iu njohim me ndërfaqen e paketës telegram.bot për zgjidhjen e detyrave tuaja të veta.

Të gjithë artikujt e serisë "Po shkruajmë një bot telegram në gjuhën R"
Përmbajtja
Nëse jeni të interesuar për analizën e të dhënave, ndoshta do t'ju interesojnë kanalet e mia dhe në të cilat shumica e përmbajtjes është e kushtuar gjuhës R.
Klasa Updater
Updater — është një klasë që e bën më të lehtë zhvillimin e botit në Telegram, dhe përdor brenda klasën Dispatcher. Qëllimi i klasës Updater është të marrë përditësimet nga boti (në artikullin e kaluar e përdorëm për këtë qëllim metodën getUpdates()), dhe t'i kalojë ato mëtej Dispatcher.
Nga ana e tij Dispatcher përmban trajnerët e krijuar nga ju, dmth. objektet e klasës Handler.
Handlers — trajnerët
Me anë të trajnerëve, ju shtoni në Dispatcher reaksionet e botit ndaj ngjarjeve të ndryshme. Në momentin e shkruar të artikullit, në telegram.bot janë shtuar lloje trajnerësh:
- MessageHandler — Trajneri i mesazheve
- CommandHandler — Trajneri i komandave
- CallbackQueryHandler — Trajneri i të dhënave të dërguara nga tastierat Inline
- ErrorHandler — Trajneri i gabimeve gjatë kërkesës përditësimi nga boti
Shtojmë komandën e parë në bot, trajneri i komandave
Nëse nuk keni përdorur ndonjëherë botë, dhe nuk e dini se çfarë është një komandë, komandat duhet t'i dërgoni botit me një slash të drejtpërdrejtë / si prefiks.
Do të fillojmë me komandat e thjeshta, dmth. do ta mësojmë botin tonë të përshëndesë me komandë /hi.
Kodi 1: Mësojmë botin të përshëndetet
library(telegram.bot)
# krijojmë një instancë të klasës Updater
updater <- Updater('TOKENI I BOTIT TUAJ')
# Shkruajmë një metodë për përshëndetje
say_hello <- function(bot, update) {
# Emri i përdoruesit me të cilin duhet të përshëndetet
user_name <- update$message$from$first_name
# Dërgimi i mesazhit të përshëndetjes
bot$sendMessage(update$message$chat_id,
text = paste0("Përshëndetje, ", user_name, "!"),
parse_mode = "Markdown")
}
# krijojmë një trajtues
hi_hendler <- CommandHandler('hi', say_hello)
# shtojmë trajtuesin në menaxherin
updater <- updater + hi_hendler
# nisëm botin
updater$start_polling()Shkruani shembullin e mësipërm të kodit, duke zëvendësuar ‘TOKENI I BOTIT TUAJ’ me tokenin real që keni marrë kur krijuat botin përmes BotFather (për krijimin e botit kam folur në ).
Metoda start_polling() klasës Updater, i cili përdoret në fund të kodit, nis një cikël të pafund të kërkesave dhe përpunimit të përditësimeve nga boti.
Tani hapim Telegramin dhe i shkruajmë botit tonë komandën e parë /hi.

Tani boti ynë kupton komandën /hi, dhe di të përshëndetet me ne.
Procesi për ndërtimin e një boti të tillë të thjeshtë mund të ilustrohet në mënyrë schematike si vijon.

- Krijojmë një instancë të klasës
Updater; - Krijojmë metoda, pra, funksione që do të kryejnë botin tonë. Në shembullin e kodit, kjo është funksioni
say_hello(). Funksionet që do të përdoren si metoda të botit duhet të kenë dy argumente obligative — bot dhe update, dhe një argument opsional — args. Argumenti bot, është pika që përfaqëson botin tuaj, me të cilin mund të përgjigjeni në mesazhe, të dërgoni mesazhe ose të përdorni çdo metodë tjetër të disponueshme për botin. Argumenti update është ajo që boti ka marrë nga përdoruesi, në esencë, ajo që në artikullin e parë morëm me anë të metodësgetUpdates(). Argumenti args lejon që të përpunoni të dhëna shtesë të dërguara nga përdoruesi së bashku me komandën, për këtë temë do të kthehemi përsëri pak më vonë; - Krijojmë trajtues, pra, lidhim disa veprime të përdoruesit me metodat e krijuara në hapin e kaluar. Në thelb, trajtuesi është një tregues, një ngjarje që aktivizon një funksion të botit. Në shembullin tonë, një tregues i tillë është dërgimi i komandës
/hi, dhe realizohet me komandënhi_hendler <- CommandHandler('hi', say_hello). Argumenti i parë i funksionitCommandHandler()lejon që të caktoni komandën, në rastin tonëhi, në të cilën boti do të përgjigjet. Argumenti i dytë lejon të specifikohet metoda e botit, ne do ta thërrasim metodënsay_hello, e cila do të ekzekutohet nëse përdoruesi thërret komandën e caktuar në argumentin e parë; - Më pas, e shtojmë trajtuesin e krijuar në menaxherin e instancës sonë të klasës
Updater. Trajtuesit mund të shtohen në disa mënyra, në shembullin më sipër kam përdorur atë më të thjeshtin, me anë të shenjës+, pra,updater <- updater + hi_hendler. E njëjta gjë mund të bëhet me anë të metodësadd_handler(), e cila i takon klasësDispatcher, mund ta gjeni këtë metodë kështu:updater$dispatcher$add_handler(); - Nisim botin me anë të komandës
start_polling().
Trajneri i mesazheve tekstuale dhe filtrat
Si të dërgojmë komanda boti e kuptuam, por ndonjëherë na nevojitet që boti të reagojë jo vetëm ndaj komandave, por edhe ndaj disa mesazheve të zakonshme, tekstuale. Për këtë është e nevojshme të përdoren trajtues të mesazheve — MessageHandler.
Normale MessageHandler do të reagojë ndaj të gjitha mesazheve të ardhshme. Pra, shpesh trajtuesit e mesazheve përdoren së bashku me filtrore. Le të mësojmë botin të përshëndesë jo vetëm me urdhër. /hi, por gjithmonë, kur në mesazhin e dërguar botit ndeshet një nga fjalët e mëposhtme: përshëndetje, salut, hi, bonjour.
Nuk do të shkruajmë metoda të reja për momentin, pasi kemi një metodë me anë të së cilës boti na përshëndet. Ne vetëm duhet të krijojmë filtrin e nevojshëm dhe trajtuesin e mesazheve.
Kodi 2: Shtojmë trajtuesin e mesazheve tekst dhe filtrin
library(telegram.bot)
# krijojmë një instancë të klasës Updater
updater <- Updater('TOKENI I BOTIT TUAJ')
# Shkruajmë metodën për përshëndetje
## komanda e përshëndetjes
say_hello <- function(bot, update) {
# Emri i përdoruesit me të cilin duhet të përshëndetemi
user_name <- update$message$from$first_name
# Dërgojmë mesazhin e përshëndetjes
bot$sendMessage(update$message$chat_id,
text = paste0("Përshëndetje, ", user_name, "!"),
parse_mode = "Markdown",
reply_to_message_id = update$message$message_id)
}
# krijojmë filtrat
MessageFilters$hi <- BaseFilter(function(message) {
# kontrollojmë nëse fjalët përshëndetje: përshëndetje, mirëmëngjes, salut, hi, bonjour ndodhen në tekstin e mesazhit
grepl(x = message$text,
pattern = 'përshëndetje|mirëmëngjes|salut|hi|bonjour',
ignore.case = TRUE)
}
)
# krijojmë menaxherin
hi_hendler <- CommandHandler('hi', say_hello) # menaxheri i komandës hi
hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi)
# shtojmë menaxherët në menaxherin
updater <- updater +
hi_hendler +
hi_txt_hnd
# startojmë botin
updater$start_polling()Shkruani shembullin e mësipërm të kodit, duke zëvendësuar ‘TOKENI I BOTIT TUAJ’ me tokenin real që keni marrë kur krijuat botin përmes BotFather (për krijimin e botit kam folur në ).
Tani do të përpiqemi të dërgojmë botit disa mesazhe, në të cilat do të përfshihen fjalët e përshëndetjes të përmendura më parë:

Pra, së pari e mësuam botin jo vetëm të përshëndesë, por edhe të përgjigjet ndaj përshëndetjes. E bëmë këtë përmes argumentit reply_to_message_id, i cili është i disponueshëm në metodën sendMessage(), në të cilën duhet të kaloni id e mesazhit për të cilin kërkohet përgjigje. Mund të merrni id e mesazhit kështu: update$message$message_id.
Por gjëja më e rëndësishme që kemi bërë është se kemi shtuar një filtrues për botin me funksionin BaseFilter():
# создаём фильтры
MessageFilters$hi <- BaseFilter(
# анонимная фильтрующая функция
function(message) {
# проверяем, встречается ли в тексте сообщения слова приветствия
grepl(x = message$text,
pattern = 'привет|здравствуй|салют|хай|бонжур',
ignore.case = TRUE)
}
)Siç keni mundur ta vini re, filtrat duhet të shtohen në objektin MessageFilters, i cili fillimisht ka një grup të vogël filtrash të gatshëm. Në shembullin tonë, në objektin MessageFilters ne shtuam elementin hi, ky është një filtrues i ri.
Në funksionin BaseFilter() ju duhet të kaloni një funksion filtrues. Në thelb, filtruesi është thjesht një funksion që merr një instancë të mesazhit dhe kthen TRUE ose FALSE. Në shembullin tonë, ne shkruam një funksion të thjeshtë që me anë të funksionit bazë grepl() kontrollon tekstin e mesazhit, dhe nëse ai përputhet me shprehjen e rregullt përshëndetje|mirëmëngjes|salut|hi|bonjur kthen TRUE.
Pastaj ne krijojmë një pritës mesazhesh hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi). Argumenti i parë i funksionit MessageHandler() — metoda që do të thërrasë pritësin, dhe argumenti i dytë është filtruesi me të cilin ai do të thirret. Në rastin tonë, ky është filtruesi që ne krijuam MessageFilters$hi.
Pra ndaj, ne shtojmë në menaxherin e krijuar vetëm tani, që përpunuesin hi_txt_hnd.
updater <- updater +
hi_hendler +
hi_txt_hndSiç kam shpjeguar më lartë, në paketë telegram.bot dhe objekt MessageFilters ka një grup filtrash të встроen, që mund të përdorni:
- all — Të gjitha mesazhet
- text — Mesazhet tekstuale
- command — Komandat, pra, mesazhet që fillojnë me
/ - reply — Mesazhet që janë përgjigje ndaj një mesazhi tjetër
- audio — Mesazhet që përmbajnë një skedar audio
- document — Mesazhet me dokumentin e dërguar
- photo — Mesazhet me imazhet e dërguara
- sticker — Mesazhet me stickerin e dërguar
- video — Mesazhet me video
- voice — Mesazhet me zë
- contact — Mesazhet që përmbajnë kontaktin e përdoruesit të Telegramit
- location — Mesazhet me gjeolokacion
- venue — Mesazhet e përcjella
- game — Loja
Nëse doni të kombini disa filtrat në një përpunues, thjesht përdorni shenjën | — si logjik OSE, dhe shenjën & si logjik DHE. Për shembull, nëse dëshironi që boti të thërrasë të njëjtin metodë kur merr një video, imazh ose dokument, përdorni shembullin e mëposhtëm për krijimin e një trajtuesi mesazhesh:
handler <- MessageHandler(callback,
MessageFilters$video | MessageFilters$photo | MessageFilters$document
)Shtimi i komandave me parametra
Ne tashmë e dimë se çfarë janë komandat, si t’i krijojmë ato dhe si ta bëjmë botin të ekzekutojë komandën e duhur. Por në disa raste, përveç emrit të komandës, na nevojitet të kalojmë disa të dhëna për realizimin e saj.
Më poshtë është një shembull i një boti, i cili, sipas një date dhe vendi të caktuar, ju kthen llojin e ditës nga kalendari prodhues.
Boti i paraqitur më poshtë përdor API-në e kalendarit prodhues .
Kodi 3: Boti që informon sipas datës dhe vendit
library(telegram.bot)
# krijojmë një instancë të klasës Updater
updater <- Updater('1165649194:AAFkDqIzQ6Wq5GV0YU7PmEZcv1gmWIFIB_8')
# Shkruajmë një metodë për përshëndetje
## komanda e përshëndetjes
check_date <- function(bot, update, args) {
# të dhënat hyrëse
day <- args[1] # data
country <- args[2] # vendi
# kontrolli i parametrave të futur
if ( !grepl('\d{4}-\d{2}-\d{2}', day) ) {
# Dërgo tastierë të personalizuar
bot$sendMessage(update$message$chat_id,
text = paste0(day, " - datë e pavlefshme, ju lutemi shkruani datën në formatin GGGG-MM-DD"),
parse_mode = "Markdown")
} else {
day <- as.Date(day)
# e konvertojmë në formatin POSIXtl
y <- format(day, "%Y")
m <- format(day, "%m")
d <- format(day, "%d")
}
# vendi për kontroll
## kontrollojmë nëse është caktuar vendi
## nëse nuk është caktuar, vendosim ru
if ( ! country %in% c('ru', 'ua', 'by', 'kz', 'us') ) {
# Dërgo tastierë të personalizuar
bot$sendMessage(update$message$chat_id,
text = paste0(country, " - kod i pavlefshëm vendi, vlerat e mundshme: ru, by, kz, ua, us. Të dhënat janë të kërkuara për Rusinë."),
parse_mode = "Markdown")
country <- 'ru'
}
# kërkesa për të dhëna nga API
# kompozimi i kërkesës HTTP
url <- paste0("https://isdayoff.ru/api/getdata?",
"year=", y, "&",
"month=", m, "&",
"day=", d, "&",
"cc=", country, "&",
"pre=1&",
"covid=1")
# marrim përgjigjen
res <- readLines(url)
# interpretimi i përgjigjes
out <- switch(res,
"0" = "Ditë e punës",
"1" = "Ditë jo pune",
"2" = "Ditë e shkurtuar e punës",
"4" = "covid-19",
"100" = "Gabim në datë",
"101" = "Të dhënat nuk u gjetën",
"199" = "Gabim i shërbimit")
# dërgojmë mesazhin
bot$sendMessage(update$message$chat_id,
text = paste0(day, " - ", out),
parse_mode = "Markdown")
}
# krijojmë trajtuesin
date_hendler <- CommandHandler('check_date', check_date, pass_args = TRUE)
# shtojmë trajtuesin në menaxher
updater <- updater + date_hendler
# në funksion të botit
updater$start_polling()Shkruani shembullin e mësipërm të kodit, duke zëvendësuar ‘TOKENI I BOTIT TUAJ’ me tokenin real që keni marrë kur krijuat botin përmes BotFather (për krijimin e botit kam folur në ).
Krijuam një robot që ka vetëm një metodë në arsenalin e tij check_date, kjo metodë thirret nga komandë e njëjtë.
Por, përveç emrit të komandës, kjo metodë pret që ju të jepni dy parametra, kodin e vendit dhe datën. Më pas, roboti kontrollon nëse dita e caktuar në vendin e shpallur është një ditë pushimi, një ditë e shkurtuar, ose një ditë pune sipas kalendarit zyrtar të prodhimit.
Për ta bërë metodën që ne po krijojmë të pranojë parametra shtesë me komandën, përdorni argumentin pass_args = TRUE në funksionin CommandHandler(), dhe kur krijoni metodën, përveç argumenteve të detyrueshme bot, update krijoni një opsional — args. Metoda e krijuar kështu do të pranojë parametrat që ju dërgoni robotit pas emrit të komandës. Parametrat duhet të ndahen me një hapësirë, ata do të arrijnë në metodë si një vektor teksti.
Le të fillojmë dhe ta testojmë robotin tonë.

E nisim botin në mënyrë sfondore
Hapi i fundit që na mbetet të kryejmë — të nisim robotin në mënyrë të fshehtë.
Për këtë, ndiqni algoritmin e përshkruar më poshtë:
- Ruani kodin e robotit në një skedar me zgjatjen R. Kur punoni në RStudio, kjo bëhet përmes menusë File, me komandën Save As….
- Shtoni rrugën për dosjen bin, e cila ndodhet në dosjen ku keni instaluar gjuhën R në variablin Path, instruksioni .
- Krijoni një skedë teksti të zakonshëm, në të cilën shkruani 1 rresht:
R CMD BATCH C:UsersAlseyDocumentsmy_bot.R. Në vend të C:UsersAlseyDocumentsmy_bot.R shkruani rrugën për skriptin tuaj të botit. Është e rëndësishme që në rrugë të mos ketë karaktere cirilike dhe hapësira, pasi kjo mund të shkaktojë probleme gjatë nisjes së botit. Ruajeni atë dhe ndryshoni zgjerimin nga txt në bat. - Hapni planifikuesin e detyrave Windows, ka shumë mënyra për ta bërë këtë, për shembull hapni çdo dosje dhe në adresë shkruani
%windir%system32taskschd.msc /s. Më shumë mënyra për nisjen mund të gjenden . - Në menunë e sipërme të djathtë të planifikuesit, klikoni "Krijo një detyrë…".
- Në kartelën "Të përgjithshmet", vendosni një emër të rastësishëm për detyrën tuaj, dhe kaloni kalimin në gjendjen "Të ekzekutohet për të gjithë përdoruesit".
- Shkoni te karta "Veprimet", klikoni "Krijo". Në fushën "Programi ose skripti" klikoni "Shfleto", gjeni skedën e krijuar në hapin e dytë bat skedë, dhe klikoni OK.
- Klikoni OK, nëse është e nevojshme, futni fjalëkalimin e llogarisë suaj të sistemit operativ.
- Gjejmë në planifikues detyrën e krijuar, e selektojmë dhe në këndin e poshtëm të djathtë klikojmë butonin "Kryej".
Boti ynë është i aktivizuar në mënyrë të sfondit dhe do të funksionojë derisa të ndaloni detyrën ose të fikni PC-në ose serverin ku e keni aktivizuar.
Përfundimi
Në këtë artikull kemi shqyrtuar se si të shkruajmë një bot të plotë, i cili jo vetëm që di të dërgojë mesazhe, por gjithashtu reagon ndaj mesazheve dhe komandave që vijnë. Njohuritë e marra janë tashmë të mjaftueshme për të zgjidhur shumicën e detyrave tuaja.
Në artikullin në vazhdim do të flasim për atë se si t'i shtojmë botit një tastierë, për një punë më të lehtë.
Abonohuni në kanalet e mia. dhe kanalet.
Burimi: habr.com
