V oleme selgeks teinud, kuidas luua boti, initsialiseerisime klassi eksemplari Bot ja tutvusime selle kaudu sõnumite saatmise meetoditega.
Selles artiklis jätkan seda teemat, seega soovitan seda artiklit lugeda alles pärast eelneva lugemist .
Seekord uurime, kuidas elustada meie boti ja lisame sellele käskude toe ning tutvume klassiga Updater.
Artiklis kirjutame mitmest lihtsast botist, viimane neist määrab antud kuupäeva ja riigi koodi põhjal, kas päev on selles riigis puhkepäev või tööpäev vastavalt tootmis kalendrile. Kuid nagu varem, on artikli eesmärk tutvustada teid paketi telegram.bot kasutamiseks oma isiklike ülesannete lahendamiseks.

Kõik artiklid seeriast "Kirjutame telegrammi boti R keeles"
Sisu
Kui teid huvitab andmeanalüüs, siis võivad teile huvi pakkuda minu ja kanalid, mille suurem osa sisust on pühendatud R keelele.
Klass Updater
Updater — see on klass, mis lihtsustab teid Telegrami roboti arendamisel, ja kasutab sisemiselt klassi Dispetcher. Klassifunktsioon Updater on saada uuendusi robotilt (eelnevas artiklis kasutasime selle eesmärgi saavutamiseks meetodit getUpdates()), ja edastada need edasi Dispetcher.
Omakorda Dispetcher sisaldab teie loodud käsitlejad, st objekti klassi Handler.
Handlers — käsitlejad
Käitlejate abil lisate Dispetcher robotile reageeringud erinevatele sündmustele. Artikli kirjutamise hetkel on telegram.bot lisatud järgmised käsitlejate tüübid:
- MessageHandler — sõnumite käsitleja
- CommandHandler — käskude käsitleja
- CallbackQueryHandler — andmete käsitleja, mis saadetakse Inline klaviatuuridest
- ErrorHandler — vigade käsitleja robotilt uuenduste pärimise korral
Lisame robotile esimese käsu, käsitleja käsud
Kui te pole kunagi varem roboteid kasutanud ja ei tea, mis on käsk, siis tuleb robotile käsud saata otse kaldkriipsuga / prefiksina.
Alustame lihtsatest käskudest, st õpetame meie robotit tervitama käsu järgi /hi.
Kood 1: Õpetame boti tervitama
library(telegram.bot)
# Loome Updater klassi instantsi
updater <- Updater('TEIE BOTE TOKEN')
# Kirjutame tervitamise meetodi
say_hello <- function(bot, update) {
# Kasutaja nimi, kellele tervitamine määratud
user_name <- update$message$from$first_name
# Tervitavate sõnumite saatmine
bot$sendMessage(update$message$chat_id,
text = paste0("Tere, ", user_name, "!"),
parse_mode = "Markdown")
}
# Loome käitleja
hi_hendler <- CommandHandler('hi', say_hello)
# Lisame käitleja haldurisse
updater <- updater + hi_hendler
# Käivitame boti
updater$start_polling()Käivitage ülaltoodud koodinäide, asendades ‘TEIE BOTE TOKEN’ tegeliku tokeniga, mille said, kui lõite boti läbi BotFather (boti loomise kohta rääkisin ma ).
Meetod start_polling() klass Updater, mida kasutatakse koodi lõpus, et alustada boti pidevat küsimise ja uuenduste töötlemise tsüklit.
Nüüd avame Telegrami ja kirjutame meie botile esimese käsu /hi.

Nüüd meie bot mõistab käsku /hi, ja oskab meiega tervitada.
Skeemiliselt võib sellise lihtsa boti loomise protsessi kujutada järgmiselt.

- Loome klassi instantsi
Updater; - Loome meetodeid, st funktsioone, mida meie bot täidab. Koodinäites on see funktsioon
say_hello(). Funktsioonid, mida te kasutate botimeetoditena, peavad omama kahte kohustuslikku argumenti — bot ja update, ja ühte valikulist — args. Argument bot, ongi teie bot, mille abil saate vastata sõnumitele, saata sõnumeid või kasutada muid botile saadaval olevaid meetodeid. Argument update on see, mida bot kasutas kasutajalt saadud, põhimõtteliselt, see, mida me esimeses artiklis saime meetodi abilgetUpdates(). Argument args võimaldab teil töödelda täiendavaid andmeid, mida kasutaja saatis koos käsklusega, selle teema juurde naaseme veidi hiljem; - Loome töötlejaid, st seome mõned kasutaja tegevused eelnevalt loodud meetoditega. Sisuliselt on töötleja käivitaja, sündmus, mis kutsub esile botifunktsiooni. Meie näites on selline käivitaja käsu saatmine
/hi, ja see realiseeritakse käsugahi_hendler <- CommandHandler('hi', say_hello). Funktsiooni esimene argumentCommandHandler()lubab teil määrata käsu, meie puhulhi, mille bot reageerib. Teise argumendiga saab määrata bot'i meetodi; me kutsume meetoditsay_hello, mis käivitatakse, kui kasutaja kutsub esimeses argumendis määratud käsku; - Edasi lisame loodud käsitleja meie klassi eksemplari vahemenüüsse
Updater. Käsitlejate lisamiseks on mitu viisi, eespool toodud näites kasutasin kõige lihtsamat, kasutades sümbolit+, st.updater <- updater + hi_hendler. Sama saab teha meetodiadd_handler(), mis kuulub klassiDispatcher, seda meetodit leiab nii:updater$dispatcher$add_handler(); - Käivitame boti käsuga
start_polling().
Tekstisõnumite käsitleja ja filtrid
Oleme aru saanud, kuidas bot'ile käske saata, kuid mõnikord on meil vaja, et bot reageeriks mitte ainult käskudele, vaid ka tavalistele tekstisõnumitele. Selleks on vaja kasutada sõnumite käsitlejaid — MessageHandler.
Tavaline MessageHandler reaktsioon täiesti kõikidele sissetulevatele sõnumitele. Seetõttu kasutatakse sageli sõnumite käsitlejaid koos filtritega. Õpime bot'i tervitama mitte ainult käsu kaudu /hi, aga ka alati, kui botile saadetud sõnumis esineb üks järgmistest sõnadest: tere, tervitame, salut, hei, bonjour.
Kuni me ei hakka kirjutama uusi meetodeid, kuna meil on juba meetod, mille abil bot meiega tervitust vahetab. Meie ülesanne on vaid luua vajalik filter ja sõnumitöötlija.
Kood 2: Lisame tekstisõnumite töötleja ja filtri
library(telegram.bot)
# loome Updater klassi eksemplar
updater <- Updater('TEIE BOTTIDE TOKEN')
# Kirjutame tervitamise meetodi
## tervitamise käsk
say_hello <- function(bot, update) {
# Kasutaja nimi, kellega tervitame
user_name <- update$message$from$first_name
# Saadame tervitussõnumi
bot$sendMessage(update$message$chat_id,
text = paste0("Tere tulemast, ", user_name, "!"),
parse_mode = "Markdown",
reply_to_message_id = update$message$message_id)
}
# Loome filtrid
MessageFilters$hi <- BaseFilter(function(message) {
# kontrollime, kas sõnumi tekstis on sõnad: tere, tervitus, salut, hi, bonjour
grepl(x = message$text,
pattern = 'tere|tervitus|salut|hi|bonjour',
ignore.case = TRUE)
}
)
# Loome töötleja
yi_hendler <- CommandHandler('hi', say_hello) # hi käsu töötleja
hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi)
# lisame töötlejad haldurisse
updater <- updater +
hi_hendler +
hi_txt_hnd
# Käivitame boti
updater$start_polling()Käivitage ülaltoodud koodinäide, asendades ‘TEIE BOTE TOKEN’ tegeliku tokeniga, mille said, kui lõite boti läbi BotFather (boti loomise kohta rääkisin ma ).
Nüüd proovime botile saata mõned sõnumid, milles on varem mainitud tervitusõnad:

Nii et kõigepealt õpetasime botile mitte lihtsalt tere öelda, vaid ka tervitusele vastata. Selle saavutamiseks kasutasime argumenti reply_to_message_id, mis on saadaval meetodis sendMessage(), kuhu tuleb edastada vastatava sõnumi id. Sõnumi id saate järgmisega: update$message$message_id.
Kuid kõige tähtsam on see, et me lisasime botile filtri funktsiooni abil BaseFilter():
# создаём фильтры
MessageFilters$hi <- BaseFilter(
# анонимная фильтрующая функция
function(message) {
# проверяем, встречается ли в тексте сообщения слова приветствия
grepl(x = message$text,
pattern = 'привет|здравствуй|салют|хай|бонжур',
ignore.case = TRUE)
}
)Nagu olete märganud, tuleb filtrid lisada objekti MessageFilters, mis sisaldab juba väikest komplekti valmis filtreid. Meie näites lisasime objekti MessageFilters me komponendi hi, see on uus filter.
Funktsioonisse BaseFilter() peate edastama filtrifunktsiooni. Tegelikult on filter lihtsalt funktsioon, mis saab sõnumi eksemplari ja tagastab TRUE või FALSE. Meie näites kirjutasime lihtsa funktsiooni, mis põhifunktsiooni abil grepl() kontrollib sõnumi teksti, ja kui see vastab regulaaravaldusele tervitus|hea päeva|tere|hi|bonjour tagastab TRUE.
Seejärel loome sõnumite töötleja hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi). Funktsiooni esimene argument MessageHandler() — meetod, mis kutsub töötlejat, ja teine argument — filter, mille alusel see kutsub. Meie juhul on see loodud filter MessageFilters$hi.
Nii et lõpuks lisame just loodud käsitleja haldurisse hi_txt_hnd.
updater <- updater +
hi_hendler +
hi_txt_hndNagu ma varem kirjutasin, on paketis telegram.bot ja objektil MessageFilters juba valmis hulk sisseehitatud filtreid, mida saate kasutada:
- all — Kõik sõnumid
- text — Tekstsõnumid
- command — Käsklused, st sõnumid, mis algavad
/ - reply — Sõnumid, mis on vastuseks teisele sõnumile
- audio — Sõnumid, millel on audiotüüp
- document — Sõnumid saadetud dokumendiga
- photo — Sõnumid saadetud piltidega
- sticker — Sõnumid saadetud kleebistega
- video — Sõnumid videoga
- voice — Häälõnumid
- contact — Sõnumid, milles on Telegrami kasutaja kontakt
- location — Sõnumid geolokatsiooniga
- venue — Edastatud sõnumid
- game — Mängud
Kui soovite mõned filtrid kombineerida ühes käsitlejas, kasutage lihtsalt märki | — loogilise VÕI, ja märk & loogilise JA. Näiteks, kui soovite, et bot kutsuks sama meetodit, kui ta saab video, pildi või dokumendi, kasutage järgmise näite sõnumi töötleja loomiseks:
handler <- MessageHandler(callback,
MessageFilters$video | MessageFilters$photo | MessageFilters$document
)Käskude lisamine parameetritega
Me juba teame, mis on käsud, kuidas neid luua ja kuidas bot panna vajalikku käsku täitma. Kuid mõnel juhul on meil lisaks käsu nimele vaja edastada ka teatud andmed selle täitmiseks.
Allpool on näide botist, mis tagastab määratud kuupäeva ja riigi alusel tootmiskalendri tüübi.
Allpool toodud bot kasutab tootmiskalendri API-d .
Kood 3: Bot, mis teatab kuupäeva ja riigi järgi
library(telegram.bot)
# loome klassi Updater eksemplari
updater <- Updater('1165649194:AAFkDqIzQ6Wq5GV0YU7PmEZcv1gmWIFIB_8')
# kirjutame meetodi tervitamiseks
## tervituse käsk
check_date <- function(bot, update, args) {
# sisend andmed
day <- args[1] # kuupäev
country <- args[2] # riik
# sisendparameetrite kontrollimine
if ( !grepl('\d{4}-\d{2}-\d{2}', day) ) {
# Saada kohandatud klaviatuur
bot$sendMessage(update$message$chat_id,
text = paste0(day, " - vale kuupäev, palun sisestage kuupäev formaadis AAAA-KK-PÄEV"),
parse_mode = "Markdown")
} else {
day <- as.Date(day)
# muuda POSIXtl formaati
y <- format(day, "%Y")
m <- format(day, "%m")
d <- format(day, "%d")
}
# kontrollitav riik
## kontrollime, kas riik on määratud
## kui ei ole määratud, seadistame ru
if ( ! country %in% c('ru', 'ua', 'by', 'kz', 'us') ) {
# Saada kohandatud klaviatuur
bot$sendMessage(update$message$chat_id,
text = paste0(country, " - vale riigi kood, võimalikud väärtused: ru, by, kz, ua, us. Täiendavad andmed Venemaa kohta."),
parse_mode = "Markdown")
country <- 'ru'
}
# päringud API andmete saamiseks
# HTTP päringu koostamine
url <- paste0("https://isdayoff.ru/api/getdata?",
"year=", y, "&",
"month=", m, "&",
"day=", d, "&",
"cc=", country, "&",
"pre=1&",
"covid=1")
# saadud vastus
res <- readLines(url)
# vastuse tõlgendamine
out <- switch(res,
"0" = "Tööpäev",
"1" = "Puhkepäev",
"2" = "Lühendatud tööpäev",
"4" = "covid-19",
"100" = "Kuupäeva viga",
"101" = "Andmeid ei leitud",
"199" = "Teenuse viga")
# saadame sõnumi
bot$sendMessage(update$message$chat_id,
text = paste0(day, " - ", out),
parse_mode = "Markdown")
}
# loome töötleja
date_hendler <- CommandHandler('check_date', check_date, pass_args = TRUE)
# lisame töötleja kuvandisse
updater <- updater + date_hendler
# käivitame roboti
updater$start_polling()Käivitage ülaltoodud koodinäide, asendades ‘TEIE BOTE TOKEN’ tegeliku tokeniga, mille said, kui lõite boti läbi BotFather (boti loomise kohta rääkisin ma ).
Oleme loonud boti, mille arsenalis on vaid üks meetod check_date, see meetod kutsutakse esile sama nimega käsu kaudu.
Kuid peale käsu nime ootab see meetod teilt kahe parameetri sisestamist: riigi koodi ja kuupäeva. Edasi kontrollib bot, kas antud päev on määratud riigis ametliku töökalendri kohaselt puhkepäev, lühendatud või tööpäev.
Kuna me loodud meetod peaks võtma lisaparameetreid koos käsuga, kasutage argumenti pass_args = TRUE funktsioonis CommandHandler(), ja meetodi loomisel, peale kohustuslike argumentide bot, update looge valikuline — args. Selliselt loodud meetod aktsepteerib parameetreid, mida edastate botile käsu nimetuse järel. Parameetrid tuleb eraldada tühikuga, meetodisse sisenevad nad tekstivektorina.
Käivitame ja testime meie boti.

Käivitame roboti taustal
Viimane samm, mis meil veel jäänud on — käivitada bot taustal.
Selleks järgige allpool kirjeldatud algoritmi:
- Salvestage boti kood faili laiendusega R. RStudio keskkonnas saab seda teha menüü kaudu File, käsuga Save As….
- Lisage tee bin kausta, mis asub kaustas, kuhu installisite R-i, muutuja Path, juhend .
- Looge tavaline tekstifail, kuhu kirjutage 1 rida:
R CMD BATCH C:UsersAlseyDocumentsmy_bot.R. Selle asemel C:UsersAlseyDocumentsmy_bot.R pange oma botiskripti tee. Oluline on, et teel ei oleks tsirkillit ja tühikuid, kuna need võivad bot'i käivitamisel probleeme tekitada. Salvestage see ja muutke selle laienduseks txt järgnevaga bat. - Avage Windowsi ülesannete planeerija, see avada mitmel viisil, näiteks avage mõni kaust ja sisestage aadressi
%windir%system32taskschd.msc /s. Teiste käivitamisviiside leidmiseks otsige . - Planeerija ülemises paremas menüüs klõpsake nuppu "Looge ülesanne…".
- Üldvahelehel määrake oma ülesandele suvaline nimi ja lülitage lüliti "Käitage kõikide kasutajate nimel".
- Minge vahekaardile "Toimingud", klõpsake nuppu "Looge". "Programm või skript" väljale klõpsake nuppu "Sirvi", leidke teises etapis loodud bat fail ja klõpsake OK.
- Klõpsame OK, vajadusel sisestage oma operatsioonisüsteemi konto parool.
- Leiame planeerijas loodud ülesande, valime selle ja paremalt alumisest nurgast vajutame nuppu "Teosta".
Meie bot töötab taustal ning see jätkab töötamist kuni te ei peata ülesannet või ei lülita välja oma arvutit või serverit, millel see on käivitatud.
Kokkuvõte
Selles artiklis oleme käsitlenud, kuidas kirjutada täisfunktsionaalset boti, mis mitte ainult ei suuda saata sõnumeid, vaid ka reageerida sissetulevatele sõnumitele ja käskudele. Saadud teadmistest piisab enamiku teie ülesannete lahendamiseks.
Järgmises artiklis räägime sellest, kuidas lisada botile klaviatuur, et muuta töötamine mugavamaks.
Liituge minu ja kanalitega.
Allikas: habr.com
