Uues Me oleme aru saanud, kuidas bot luua, ja initsialiseerinud klassi eksemplari. Bot Ja oleme tutvunud selle abil sõnumite saatmise meetoditega.
Selles artiklis jätkan seda teemat, seetõttu soovitan alustamiseks lugeda seda artiklit alles pärast eelneva lugemist. .
Seekord uurime, kuidas meie boti elavdada ning lisada sellele käsu toetuse, samuti tutvume klassiga Updater.
Artiklis kirjutame mõned lihtsad botid, viimane neist tuvastab antud päeva ja riigikoodi põhjal, kas päev on selles riigis puhkepäev või tööpäev vastavalt tootmiskalendrile. Kuid nagu ikka, on artikli eesmärk tutvustada teid paketi liidesega telegram.bot oma isiklike ülesannete lahendamiseks.

Kõik artiklid seeriast "Kirjutame telegrammi boti R keeles"
Sisukord
Kui teid huvitab andmeanalüüs, võivad teid huvitada minu ja kanalid, millel on suur osa sisu R keelele.
Klass Updater
Updater — see on klass, mis lihtsustab teie Telegrammi boti arendust ning kasutab kapi all klassi Dispetcher. Kooli eesmärk Updater on saada boti uuendusi (eelmisel artiklis kasutasime selleks meetodit getUpdates()), ja edastada need edasi Dispetcher.
Omalt poolt Dispetcher sisaldab endas teie loodud töötlejaid, st. klassi objekte Handler.
Handlers — töötlejad
Töötlejate abil lisate Dispetcher boti reageeringud erinevatele sündmustele. Artikli kirjutamise hetkel on telegram.bot lisatud järgmised töötlejate tüübid:
- MessageHandler — sõnumite töötleja
- CommandHandler — käsu töötleja
- CallbackQueryHandler — andmete töötleja, mis saadetakse Inline klaviatuuridest
- ErrorHandler — vigade töötleja, kui boti uuenduste päringud ebaõnnestuvad
Lisame botile esimese käsu, käsude töötleja
Kui te pole kunagi varem botte kasutanud ja ei tea, mis on käsk, siis tuleb käsk botile saata otse kaldkriipsuga / prefiksina.
Alustame lihtsate käskudega, st õpetame meie boti tervitama käsu järgi /hi.
Kood 1: Õpetame boti tervitama
library(telegram.bot)
# loome klassi Updater eksemplari
updater <- Updater('TEIE BOTA TOKEN')
# Kirjutame meetodi tervitamiseks
say_hello <- function(bot, update) {
# Kasutaja nimi, kellele tere öelda
user_name <- update$message$from$first_name
# Tervitusteate saatmine
bot$sendMessage(update$message$chat_id,
text = paste0("Tere tulemast, ", user_name, "!"),
parse_mode = "Markdown")
}
# loome töötleja
hi_hendler <- CommandHandler('hi', say_hello)
# lisame töötleja meie jaoturisse
updater <- updater + hi_hendler
# käivitame boti
updater$start_polling()Käivitage ülaltoodud koodinäide, asendades 'TEIE BOTA TOKEN' reaalse tokeniga, mille saate boti loomisel BotFather (boti loomise kohta rääkisin ma ).
Meetod start_polling() klassist Updater, mis kasutatakse koodi lõpus, käivitab lõpmatu tsükli boti uuenduste küsimiseks ja töötlemiseks.
Nüüd avame Telegrami ja saadame oma botile esimese käsu /hi.

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

- Loome klassi eksemplari
Updater; - Loome meetodid, st funktsioonid, mida meie bot täidab. Koodinäites on see funktsioon
say_hello(). Funktsioonidel, mida kasutate boti meetoditena, peavad olema kaks kohustuslikku argumenti — bot ja update, ja üks valikuline — args. Argument bot, see on teie bot, mille abil saate vastata sõnumitele, saata sõnumeid või kasutada kõiki teisi boti käesolevaid meetodeid. Argument update on see, mida bot kasutajalt sai, sisuliselt see, mida me esimeses artiklis saime meetodigetUpdates(). Argument args võimaldab teil töödelda täiendavaid andmeid, mille kasutaja saatis koos käsuga, sellele teemele me naaseme pisut hiljem; - Loome töötlejad, st seome kasutaja teatud tegevused eelnevalt loodud meetoditega. Tõeliselt on töötleja käivitaja, sündmus, mis kutsub esile mingi boti funktsiooni. Meie näites on selline käivitaja käsu saatmine
/hi, ja see realiseeritakse käsugahi_hendler <- CommandHandler('hi', say_hello). Funktsiooni esimene argumentCommandHandler()võimaldab teil määrata käsu, meie juhulhi, millele bot reageerib. Teine argument võimaldab määrata boti meetodi, me kutsub üles meetodisay_hello, mis täidetakse, kui kasutaja kutsub esile esimeses argumendis määratud käsu; - Seejärel lisame loodud töötleja meie klassi jaoturi.
Updater. Te saate lisada töötlejaid mitmel viisil, nagu eespool näidatud, kasutasin kõige lihtsamat, kasutades sümbolit+, stupdater <- updater + hi_hendler. Sama asja saab teha meetodi abiladd_handler(), mis kuulub klassiDispatcher, seda meetodit saab leida nii:updater$dispatcher$add_handler(); - Käivitame boti käsu abil
start_polling().
Tekstisõnumite töötleja ja filtrid
Oleme välja selgitanud, kuidas saata botile käske, kuid mõnikord on meil vaja, et bot reageeriks mitte ainult käskudele, vaid ka tavalistele tekstisõnumitele. Selleks on vajalik kasutada sõnumitöötlejat — MessageHandler.
Tavaliselt MessageHandler reakteerib kõigile sisenevatele sõnumitele. Seetõttu kasutatakse sageli sõnumitöötlejat koos filtritega. Õppime botile tervitama mitte ainult käsu kaudu /hi, vaid ka alati, kui botile saadetud sõnumis on üks järgmistest sõnadest: tere, tervitus, salut, hi, bonjour.
Hetkel me ei hakkama kirjutama uusi meetodeid, kuna meil on juba meetod, mille abil bot meiega tervitab. Meilt nõutakse ainult vajaliku filtri ja sõnumitöötleja loomist.
Kood 2: Lisame tekstisõnumite töötleja ja filtri
library(telegram.bot)
# loome Updater klassi objekti
updater <- Updater('TEIE BOTE TOKEN')
# Kirjutame tervituse meetodi
## tervituse käsk
say_hello <- function(bot, update) {
# Kasutajanimi, kellele peab tervitama
user_name <- update$message$from$first_name
# Saadame tervitus sõnumi
bot$sendMessage(update$message$chat_id,
text = paste0("Tere, ", user_name, "!"),
parse_mode = "Markdown",
reply_to_message_id = update$message$message_id)
}
# loome filtrid
MessageFilters$hi <- BaseFilter(function(message) {
# kontrollime, kas sõnumis esinevad sõnad: tere, tervitus, salut, hi, bonjour
grepl(x = message$text,
pattern = 'tere|tervitus|salut|hi|bonjour',
ignore.case = TRUE)
}
)
# loome töötleja
hi_hendler <- CommandHandler('hi', say_hello) # hi käsu töötleja
hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi)
# lisame töötlejad dekstraatorisse
updater <- updater +
hi_hendler +
hi_txt_hnd
# käivitame boti
updater$start_polling()Käivitage ülaltoodud koodinäide, asendades 'TEIE BOTA TOKEN' reaalse tokeniga, mille saate boti loomisel BotFather (boti loomise kohta rääkisin ma ).
Nüüd proovime saata botile mõned sõnumid, kus esinevad eelnevalt loetletud tervitussõnad:

Seega, kõigepealt õpetasime botile mitte ainult tervitada, vaid ka vastata tervitusele. Seda tegime argumendi reply_to_message_id, mis on saadaval meetodis sendMessage(), kuhu peab edastama vastatava sõnumi id. Saate sõnumi id nii: update$message$message_id.
Kuid mis kõige tähtsam, mida me tegime — lisasime botile filtrit funktsiooni kaudu BaseFilter():
# создаём фильтры
MessageFilters$hi <- BaseFilter(
# анонимная фильтрующая функция
function(message) {
# проверяем, встречается ли в тексте сообщения слова приветствия
grepl(x = message$text,
pattern = 'привет|здравствуй|салют|хай|бонжур',
ignore.case = TRUE)
}
)Kuidas olete võib-olla märganud, tuleb filtreid lisada objekti MessageFilters, kus algselt on juba väike komplekt valmis filtreid. Meie näites oleme objekti MessageFilters lisanud elemendi hi, see on uus filter.
To the function BaseFilter() peate edastama filtreerimisfunktsiooni. Põhimõtteliselt on filter lihtsalt funktsioon, mis võtab vastu sõnumi eksemplari ja tagastab TÕSI või FALSE. Meie näites oleme kirjutanud kõige lihtsama funktsiooni, mis базовая функция grepl() kontrollib sõnumi teksti, ja kui see vastab regulaaravale tere|tervitama|salut|hai|bonjour toob tagasi TÕSI.
Jätkame sõnumitöötlija loomist hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi). Funktsiooni esimene argument MessageHandler() — meetod, mis kutsub esile töötlejat, ja teine argument — see filter, mille alusel see kutsub. Meie puhul on see meie loodud filter MessageFilters$hi.
Ja lõpuks lisame sellesse just loodud töötleja hi_txt_hnd.
updater <- updater +
hi_hendler +
hi_txt_hndNagu ma juba mainisin, on paketis telegram.bot ja objekti MessageFilters juba olemas komplekt 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, mis sisaldavad audio faili
- document — Sõnumid saadetud dokumendiga
- photo — Sõnumid saadetud piltidega
- sticker — Sõnumid saadetud kleepekkidega
- video — Sõnumid videoga
- voice — Heli sõnumid
- contact — Sõnumid, mis sisaldavad Telegram kasutaja kontakti
- location — Sõnumid geolokatsiooniga
- venue — Edastatud sõnumid
- game — Mängud
Kui soovite kombineerida mõned filtrid ühes töötlejas, kasutage lihtsalt märki | — loogilise VÕI, ja märki & loogilise ma saan kasutada. Näiteks, kui soovite, et bot kutsub sama meetodi, kui see saab video, pildi või dokumendi, kasutage järgmise sõnumitöötlija loomise näidet:
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 sundida bot rakendama vajalikke käske. Kuid mõnel juhul, peale käsu nime, peame edastama ka mõned andmed selle täitmiseks.
Allpool on näide botist, mis tagastab antud kuupäeva ja riigi põhjal tööpäeva tüübi tootmiskalendrist.
Allpool toodud bot kasutab tootmiskalendri API-d .
Kood 3: Bot, mis teatab kuupäeva ja riigi põhjal
library(telegram.bot)
# loome Updater klassi eksemplari
updater <- Updater('1165649194:AAFkDqIzQ6Wq5GV0YU7PmEZcv1gmWIFIB_8')
# Kirjutame meetodi tervitamiseks
## tervituskäsk
check_date <- function(bot, update, args) {
# sisendid
day <- args[1] # kuupäev
country <- args[2] # riik
# sisendparameetrite kontroll
if ( !grepl('\d{4}-\d{2}-\d{2}', day) ) {
# Saatke 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)
# konverteerime POSIXtl formaati
y <- format(day, "%Y")
m <- format(day, "%m")
d <- format(day, "%d")
}
# Kontrolliks riik
## kontrollime, kas riik on määratud
## kui ei ole, seadistame ru
if ( ! country %in% c('ru', 'ua', 'by', 'kz', 'us') ) {
# Saatke kohandatud klaviatuur
bot$sendMessage(update$message$chat_id,
text = paste0(country, " - vale riigi kood, võimalikud väärtused: ru, by, kz, ua, us. Andmed on küsitud Venemaa kohta."),
parse_mode = "Markdown")
country <- 'ru'
}
# Teeme API päringu
# koosseis HTTP päring
url <- paste0("https://isdayoff.ru/api/getdata?",
"year=", y, "&",
"month=", m, "&",
"day=", d, "&",
"cc=", country, "&",
"pre=1&",
"covid=1")
# saame vastuse
res <- readLines(url)
# vastuse tõlgendamine
out <- switch(res,
"0" = "Tööpäev",
"1" = "Vaba päev",
"2" = "Lühenenud tööpäev",
"4" = "covid-19",
"100" = "Kuupäeva viga",
"101" = "Andmeid ei leitud",
"199" = "Teenuse viga")
# Saatke sõnum
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 haldurisse
updater <- updater + date_hendler
# käivitame boti
updater$start_polling()Käivitage ülaltoodud koodinäide, asendades 'TEIE BOTA TOKEN' reaalse tokeniga, mille saate boti loomisel BotFather (boti loomise kohta rääkisin ma ).
Oleme loonud boti, mille arsenalis on vaid üks meetod check_date, see meetod käivitatakse sama nimega käsuga.
Kuid lisaks meeskonna nimele ootab see meetod teilt kahe parameetri sisestamist: riigi koodi ja kuupäeva. Järgmisena kontrollib bot, kas antud päev vastavas riigis on puhkepäev, lühendatud või tööpäev vastavalt ametlikule tootmiskalendrile.
Et meie loodud meetod võtaks vastaan täiendavaid parameetreid koos käsuga, kasutage argumenti pass_args = TRUE funktsioonis CommandHandler(), ja meetodi loomisel, lisaks kohustuslikele argumentidele, bot, update looge valikuline — args. Nii loodud meetod võtab vastu parameetrid, mille te edastate botile pärast käsu nime. Parameetrid tuleb eristada tühikutega, meetodisse jõuavad need tekstilised vektoridena.
Lasemme nüüd meie bot käima ja testime seda.

Käivitame boti taustal
Viimane samm, mis meil on jäänud, on bot taustal käivitamine.
Käituge allpool kirjeldatud algoritmi järgi:
- Salvestage boti kood failina, millel on R laiend. RStudios töötades tehakse seda menüü kaudu Fail, käsu Save As….
- Lisa tee kausta bin, mis asub kaustas, kuhu olete R keele paigaldanud, muutes muutuja Path, juhiseid .
- Loo tavaline tekstifail, kuhu kirjutad ühe rea:
R CMD BATCH C:UsersAlseyDocumentsmy_bot.R. Asendage C:UsersAlseyDocumentsmy_bot.R kui kirjutad tee oma boti skripti juurde. Oluline on, et teel ei kohtu oleks kirillitsat ja tühikuid, kuna need võivad põhjustada probleeme boti käivitamisel. Salvestage see ja muutke selle laienduseks txt . Tundub, et bat. - Avage Windowsi ülesannete ajakavaja, on palju viise seda teha, näiteks avage mõni kaust ja sisestage aadressi
%windir%system32taskschd.msc \/s. Teisi käivitamisviise leiate . - Ajakavaja ülemises paremas menüüs vajutage "Loo ülesanne…".
- Üldine sakk määrake oma ülesandele suvaline nimi ja lülitage lüliti "Käivita kõikide kasutajate nimel".
- Minge "Toimingute" sakk, vajutage "Loo". Ribal "Programm või skript" vajutage "Sirvi", leidke teisel sammul loodud bat fail ja vajutage OLE.
- Vajutame OLE, vajadusel sisestage oma operatsioonisüsteemi konto parool.
- Otsige ajakavadest loodud ülesannet, valige see ja vajutage all paremas nurgas nuppu "Käivita".
Meie bot töötab taustal ja jätkab tööd, kuni te ei lõpeta ülesannet või ei lülita välja teie arvutit või serverit, millel see on avatud.
Kokkuvõte
Selles artiklis käsitlesime, kuidas kirjutada täisfunktsionaalne bot, mis mitte ainult ei suuda saatmise sõnumeid, vaid ka reageerima saadud sõnumitele ja käskudele. Saadud teadmised on piisavad, et lahendada enamik teie ülesandeid.
Järgmises artiklis räägime sellest, kuidas lisada botile klaviatuur, et muuta töö mugavamaks.
Tellige minu ja kanalid.
Allikas: habr.com
