Në ne e kuptuam se si të krijojmë një bot, e inicializuam një shembull klase Bot dhe u familiarizuam me mënyrat e dërgimit të mesazheve me ndihmën e tij.
Në këtë artikull po vazhdoj këtë temë, prandaj rekomandoj të filloni leximin e këtij artikulli vetëm pasi të keni lexuar .
Tani ne do të shqyrtojmë se si ta ngjallim botin tonë dhe do t'i shtojmë atij mbështetje për komanda, si dhe do të njiheni me klasën Updater.
Gjatë artikullit do të shkruajmë disa bota të thjeshta, të fundit do të përcaktojë nëse një ditë në këtë vend është pushim apo punë sipas kalendarit të prodhimit, por, siç ndodhi më parë, qëllimi i artikullit është të ju njoh me ndërfaqen e paketës telegram.bot për zgjidhjen e detyrave tuaja.

Të gjitha artikujt nga seria "Shkruajmë bota në telegram me 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 në dhe Shumica e përmbajtjes së të cilave i kushtohet gjuhës R.
Klasa Updater
Updater — kjo është klasa që ju lehtëson zhvillimin e botit të Telegram-it dhe përdor në sfond klasën Dispetcher. Qëllimi i klasës Updater është që të marrë azhurnimet nga boti (në artikullin e mëparshëm ne përdorëm për këtë qëllim metodën getUpdates()), dhe t'i kalojmë ato më tej në Dispetcher.
Nga ana tjetër Dispetcher përmban përpunuesit që keni krijuar, dmth objektet e klasës Handler.
Handlers — përpunuesit
Me ndihmën e përpunuesve, ju shtoni në Dispetcher reaksionet e botit ndaj ngjarjeve të ndryshme. Në momentin e shkrimit të artikullit, në telegram.bot janë shtuar llojet e mëposhtme të përpunuesve:
- MessageHandler — Përpunuesi i mesazheve
- CommandHandler — Përpunuesi i komandave
- CallbackQueryHandler — Përpunuesi i të dhënave të dërguara nga tastierat Inline
- ErrorHandler — Përpunuesi i gabimeve gjatë kërkimit të azhurnimeve nga boti
Shtojmë komandën e parë në bot, përpunuesin e komandave
Nëse nuk keni përdorur kurrë bota dhe nuk jeni të njohur se çfarë është një komandë, komandat duhet t'i dërgoni botit me një slash të drejtpërdrejtë / si prefiks.
Të fillojmë me komandat e thjeshta, dmth të mësojmë botin tonë të përshëndesë me komandën /hi.
Kod 1: Mësojmë botin të përshëndesë
library(telegram.bot)
# krijojmë një instancë të klasës Updater
updater <- Updater('TOKENI JUAJ I BOTIT')
# Shkruajmë metodën për përshëndetje
say_hello <- function(bot, update) {
# Emri i përdoruesit që 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("Të nderuar, ", user_name, "!"),
parse_mode = "Markdown")
}
# krijojmë trajtuesin
hi_hendler <- CommandHandler('hi', say_hello)
# shtojmë trajtuesin në menaxher
updater <- updater + hi_hendler
# fillojmë botin
updater$start_polling()Ekzekutoni shembullin e kodit të mësipërm duke zëvendësuar ‘TOKENI JUAJ I BOTIT’ me tokenin e vërtetë që keni marrë gjatë krijimit të botit përmes BotFather (për krijimin e botit kam folur në ).
Sanitizer.replaceElementWithChildren() start_polling() klasës Updater, e cila përdoret në fund të kodit, aktivizon një cikël të pafund të kërkesash 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ë na përshëndesë.
Në mënyrë që procesi i ndërtimit të këtij boti të thjeshtë të paraqitet, mund ta ilustrojmë si më poshtë.

- Krijojmë një instancë të klasës
Updater; - Krijojmë metodat, dmth. funksionet që do të realizojë boti ynë. Në shembullin e kodit, kjo është funksioni
say_hello(). Funksionet që do të përdorni si metoda të botit duhet të kenë dy argumente të detyrueshme — bot dhe përditësim, dhe një të opsional — args. Argumenti bot, është boti juaj, me ndihmën e tij mund të përgjigjeni ndaj mesazheve, të dërgoni mesazhe, ose të përdorni çdo metodë tjetër të disponueshme për botin. Argumenti përditësim është ajo që boti ka marrë nga përdoruesi, në thelb, ajo që në artikullin e parë ne e morëm me metodëngetUpdates(). 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ë ne do të kthehemi pak më vonë; - Krijojmë trajtuesit, dmth. lidhemi me disa veprime të përdoruesit me metodat e krijuara në hapin e kaluar. Në thelb, një trajtues është një trigger, një ngjarje që shkakton një funksion të botit. Në shembullin tonë, një trigger 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 të përcaktoni komandën, në rastin tonëhi, për të cilën boti do të reagojë. Argumenti i dytë lejon të përcaktoni metodën e botit, do të thërrasim metodënsay_hello, i cili do të ekzekutohet nëse përdoruesi thërret komandën eSpecified në argumentin e parë; - Më pas, shtojmë trajtuesin e krijuar në menaxherin e ekzemplarit tonë të klasës
Updater. Trajtuesit mund të shtohen në disa mënyra, në shembullin e mësipërm përdora mënyrën më të thjeshtë, me anë të shenjës+, dmth.updater <- updater + hi_hendler. E njëjta gjë mund të bëhet me metodënadd_handler(), e cila i përket klasësDispatcher, këtë metodë mund ta gjejmë kështu:updater$dispatcher$add_handler(); - Nisim botin me komandën
start_polling().
Përpunuesi i mesazheve tekstuale dhe filtrat
Si të dërgojmë komanda në botin mësuam, por ndonjëherë na kërkohet që boti të reagojë jo vetëm në komanda, por edhe në disa mesazhe të zakonshme, tekstuale. Për këtë, është e nevojshme të përdoren trajtuesit e mesazheve — MessageHandler.
Zakonisht MessageHandler do të reagojë në të gjitha mesazhet që hyjnë. Prandaj, shpesh trajtuesit e mesazheve përdoren së bashku me filtrat. Le të mësojmë botin të përshëndesë jo vetëm me komandën /hi, por gjithashtu gjithmonë kur në mesazhin e dërguar në bot përmban një nga këto fjalë: Përshëndetje, Mirëdita, Salute, Hi, Bonjour.
Për momentin nuk do të shkruajmë ndonjë metodë të re, pasi kemi një metodë me anë të cilës boti na përshëndet. Nga ne kërkohet vetëm të krijojmë filtrin e nevojshëm dhe trajtuesin e mesazheve.
Kodi 2: Shtoni trajtuesin e mesazheve tekstuale dhe filtrin
library(telegram.bot)
# krijojmë një ekzemplar të klasës Updater
updater <- Updater('TOKENI I BOTIT TUAJ')
# Shkruajmë një metodë për përshëndetje
## komanda e përshëndetjes
say_hello <- function(bot, update) {
# Emri i përdoruesit me të cilin duam të përshëndetem
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 në tekstin e mesazhit paraqiten fjalët: Përshëndetje, Mirëdita, Salute, Hi, Bonjour
grepl(x = message$text,
pattern = 'përshëndetje|mirëdita|salute|hi|bonjour',
ignore.case = TRUE)
}
)
# krijojmë trajtuesin
hi_hendler <- CommandHandler('hi', say_hello) # trajtuesi i komandës hi
hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi)
# shtojmë trajtuesit në menaxher
updater <- updater +
hi_hendler +
hi_txt_hnd
# nisim botin
updater$start_polling()Ekzekutoni shembullin e kodit të mësipërm duke zëvendësuar ‘TOKENI JUAJ I BOTIT’ me tokenin e vërtetë që keni marrë gjatë krijimit të botit përmes BotFather (për krijimin e botit kam folur në ).
Tani tani, do të përpiqemi të dërgojmë disa mesazhe në bot, ku do të përdoren fjalët e përmendura më parë për përshëndetje:

Kështu, së pari ne e mësuam botin jo vetëm të përshëndetet, por edhe të përgjigjet në përshëndetje. Këtë e realizuam përmes argumentit reply_to_message_id, i cili është i disponueshëm në metodën sendMessage(), në të cilën duhet të dërgohet ID e mesazhit në të cilin dëshirohet të përgjigjemi. Mund ta marrim ID-në e mesazhit kështu: update$message$message_id.
Por e rëndësishmja, ajo që bëmë — shtuam një filtrinë në bot përmes funksionit BaseFilter():
# создаём фильтры
MessageFilters$hi <- BaseFilter(
# анонимная фильтрующая функция
function(message) {
# проверяем, встречается ли в тексте сообщения слова приветствия
grepl(x = message$text,
pattern = 'привет|здравствуй|салют|хай|бонжур',
ignore.case = TRUE)
}
)Siç mund ta keni vënë 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ë filtër i ri.
Në funksion BaseFilter() ju duhet të kaloni funksionin e filtrimit. Në thelb, një filtër — është thjesht një funksion, që merr një instancë mesazhi dhe kthen TRUE ose FALSE. Në shembullin tonë, ne shkruam një funksion të thjeshtë, i cili me ndihmën e funksionit bazë grepl() kontrollon tekstin e mesazhit, dhe nëse përputhet me shprehjen e përhershme përshëndetje|mirë se vini|sallut|hej|bonjur false, nëse elementi që do të zëvendësohet është TRUE.
Më pas ne krijojmë një trajtues mesazhesh hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi). Argumenti i parë i funksionit MessageHandler() — metoda që do të thërrasë trajtuesin, dhe argumenti i dytë — është filtër sipas të cilit do të thërritet. Në rastin tonë ky është filtri i krijuar prej nesh MessageFilters$hi.
Dhe në fund, ne shtojmë në menaxher trajtuesin që sapo krijuam hi_txt_hnd.
updater <- updater +
hi_hendler +
hi_txt_hndSiç kam shkruar më sipër, në paketën telegram.bot dhe objektin MessageFilters ka një grup filtrash të integruar që mund të përdorni:
- all — Të gjitha mesazhet
- text — Mesazhe tekstuale
- command — Komandat, pra mesazhe që fillojnë me
/ - reply — Mesazhe, që janë përgjigjje ndaj një mesazhi tjetër
- audio — Mesazhe që përmbajnë një skedar audio
- document — Mesazhe me një dokument të dërguar
- photo — Mesazhe me imazhe të dërguara
- sticker — Mesazhe me një sticker të dërguar
- video — Mesazhe me video
- voice — Mesazhe zanor
- contact — Mesazhe që përmbajnë kontaktin e përdoruesit të Telegramit
- location — Mesazhe me gjeolokacion
- venue — Mesazhe të përcjella
- game — Lojëra
Nëse dëshironi të kombinoni disa filtra në një trajtues, thjesht përdorni shenjën | — si për një logjikë OSE, dhe shenjën & si një logjikë DHE. Për shembull, nëse dëshironi që boti të thërrasë të njëjtën 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ë dhe si ta bëjmë botin të ekzekutojë komandën e nevojshme. Por në disa raste, përveç emrit të komandës, na nevojitet të kalojmë disa të dhëna për përmbushjen e saj.
Më poshtë është një shembull boti, i cili kthehet nga data dhe vendi i caktuar typin e ditës nga kalendari prodhues.
Boti i paraqitur më poshtë përdor API-në e kalendarit prodhues .
Kodi 3: Boti që raporton sipas datës dhe vendit
library(telegram.bot)
# krijojmë një instancë të klasës Updater
updater <- Updater('1165649194:AAFkDqIzQ6Wq5GV0YU7PmEZcv1gmWIFIB_8')
# Shkruajmë metodën 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, " - data e papërshtatshme, ju lutemi jepni datën në formatin GGGG-MM-DD"),
parse_mode = "Markdown")
} else {
day <- as.Date(day)
# e kthejmë 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, " - kodi i vendit i papërshtatshëm, vlerat e mundshme: ru, by, kz, ua, us. Të dhënat kërkuar janë për Rusinë."),
parse_mode = "Markdown")
country <- 'ru'
}
# kërkesa për të dhëna nga API
# përgatitja e 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ë Pune",
"1" = "Ditë Jo Pune",
"2" = "Dite e Shkurtuar e Punes",
"4" = "covid-19",
"100" = "Gabim në datë",
"101" = "Të dhënat nuk u gjetën",
"199" = "Gabim në shërbim")
# dërgojmë mesazhin
bot$sendMessage(update$message$chat_id,
text = paste0(day, " - ", out),
parse_mode = "Markdown")
}
# krijojmë procesorin
date_hendler <- CommandHandler('check_date', check_date, pass_args = TRUE)
# shtojmë procesorin në menaxher
updater <- updater + date_hendler
# fillojmë botin
updater$start_polling()Ekzekutoni shembullin e kodit të mësipërm duke zëvendësuar ‘TOKENI JUAJ I BOTIT’ me tokenin e vërtetë që keni marrë gjatë krijimit të botit përmes BotFather (për krijimin e botit kam folur në ).
Kemi krijuar një bot që ka vetëm një metodë në arsenalin e tij check_date, kjo metodë thirret nga komanda 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, boti kontrollon nëse dita e caktuar në vendin e specifikuar është një ditë pushimi, e shkurtuar apo punuese sipas kalendarit zyrtar të prodhimit.
Për të bërë që metoda që po krijojmë të pranojë parametra shtesë së bashku me komandën, përdorni argumentin pass_args = TRUE në funksionin CommandHandler(), dhe kur krijoni metodën, përveç argumenteve të detyrueshme bot, përditësim krijoni një opsionale — args. Metoda e krijuar në këtë mënyrë do të pranojë parametrat që ju dërgoni botit pas emrit të komandës. Parametrat duhet të ndahen me një hapësirë, ndryshe ata do të hyjnë në metodë si një vektor tekstual.
Le t'i fillojmë dhe ta testojmë botin tonë.

Nisim botin në modalitetin e prapavijës
Hapi i fundit që na mbetet të kryejmë është të drejtojmë botin në mënyrë të fshehtë.
Për këtë, ndiqni algoritmin e përshkruar më poshtë:
- Ruani kodin e botit në një skedë me zgjedhjen R. Kur punoni në RStudio, kjo bëhet përmes menusë Skedari, komandës Ruaj si….
- Shtoni rrugën për dosjen bin, e cila ndodhet në dosjen ku keni instaluar gjuhën R në variablën Path, udhëzimi .
- Krijoni një skedë të zakonshme teksti, në të cilën shkruani një rresht:
R CMD BATCH C:UsersAlseyDocumentsmy_bot.R. Në vend të C:UsersAlseyDocumentsmy_bot.R shkruani rrugën për skenarin tuaj të botit. Është e rëndësishme që në rrugë të mos ketë karaktere kirilike apo hapësira, pasi kjo mund të shkaktojë probleme gjatë fillimit të botit. Ruani atë dhe ndryshoni zgjedhjen nga txt në bat. - Hapni Planifikuesin e Detyrave të Windows, ka shumë mënyra për ta bërë këtë, për shembull, hapni ndonjë dosje dhe në adresë shkruani
%windir%system32taskschd.msc /s. Mënyra të tjera për fillimin mund të gjenden . - Në menunë e sipërme të djathtë të planifikuesit, klikoni "Krijo Një Detyrë…".
- Në skedën "Të Përgjithshme", caktoni një emër të rastësishëm për detyrën tuaj, dhe kaloni ndërruesin në gjendjen "Ekzekuto për të gjithë përdoruesit".
- Shkoni në skedën "Veprimet", klikoni "Krijo". Në fushën "Programi ose Skripti" klikoni "Shqyrto", gjeni skedën e krijuar në hapin e dytë bat dhe klikoni OK.
- Klikoni OK, nëse është e nevojshme, futni fjalëkalimin e llogarisë suaj të sistemit operativ.
- Gjeni në planifikues detyrën e krijuar, theksoni dhe në këndin e poshtëm të djathtë klikoni butonin "Ekzekuto".
Boti ynë është aktivizuar në mënyrë të fshehtë dhe do të funksionojë deri sa të ndaloni detyrën ose të fikni PC-në ose serverin ku e keni aktivizuar.
Përfundim
Në këtë artikull, ne shqyrtuam se si të shkruajmë një bot të plote, i cili jo vetëm që dërgon mesazhe, por gjithashtu reagon ndaj mesazheve dhe komandave të ardhura. Njohuritë e marra janë tashmë të mjaftueshme për të zgjidhur shumicën e detyrave tuaja.
Në artikullin e ardhshëm do të flasim për mënyrën se si të shtoni një tastierë në bot, për një punë më të lehtë.
Regjistrohuni në kanalet e mia. dhe kanalet.
Burimi: habr.com
