I Vi har klurat ut hur man skapar en bot och initierat en instans av klassen Bot och bekantat oss med metoderna för att skicka meddelanden med hjÀlp av den.
I den hÀr artikeln fortsÀtter jag med detta Àmne, sÄ jag rekommenderar att du först lÀser .
Denna gÄng ska vi ta reda pÄ hur vi livar upp vÄr bot och lÀgger till kommando stödet samt bekantar oss med klassen Updater.
Under artikeln kommer vi att skriva flera enkla bots, den sista kommer att avgöra om en angiven dag med ett lands kod Àr en helg eller arbetsdag enligt produktionskalendern. Men, som tidigare, Àr syftet med artikeln att introducera dig till paketets grÀnssnitt telegram.bot för att lösa dina egna uppgifter.

Alla artiklar i serien "Skriver en Telegram-bot pÄ R"
InnehÄll
Om du Àr intresserad av dataanalys kan du vara intresserad av mina och kanaler. Största delen av innehÄllet handlar om R-sprÄket.
Klassen Updater
Updater â det Ă€r en klass som förenklar utvecklingen av en Telegram-bot och anvĂ€nder inuti klassen Dispatcher. Klassens syfte Updater Ă€r att hĂ€mta uppdateringar frĂ„n boten (i den föregĂ„ende artikeln anvĂ€nde vi metoden getUpdates()), och skicka dem vidare till Dispatcher.
I sin tur Dispatcher innehÄller de skapade hanterarna, dvs. objekten av klassen Handler.
Handlers â hanterare
Med hjÀlp av hanterarna lÀgger du till Dispatcher botens reaktioner pÄ olika hÀndelser. Vid tidpunkten för artikelns skrivande har telegram.bot följande typer av hanterare lagts till:
- MessageHandler â Meddelandehanterare
- CommandHandler â Kommandohanterare
- CallbackQueryHandler â Hanterare för data skickat frĂ„n Inline-tangentbord
- ErrorHandler â Felhanterare vid begĂ€ran om uppdateringar frĂ„n boten
Vi lÀgger till det första kommandot till boten, kommandohanteraren
Om du aldrig tidigare har anvÀnt bots och inte Àr medveten om vad ett kommando Àr, sÄ behöver du skicka kommandon till boten med ett snedstreck / som prefix.
Vi börjar med enkla kommandon, dvs. vi lÀr vÄr bot att hÀlsa pÄ kommando /hi.
Kod 1: Vi lÀr boten att hÀlsa
library(telegram.bot)
# Skapar en instans av klassen Updater
updater <- Updater('DIN BOTS TOKEN')
# Skriver en metod för att ge ett vÀlkomnande
say_hello <- function(bot, update) {
# AnvÀndarnamn att hÀlsa pÄ
user_name <- update$message$from$first_name
# Skickar ett vÀlkomstmeddelande
bot$sendMessage(update$message$chat_id,
text = paste0("Hej, ", user_name, "!"),
parse_mode = "Markdown")
}
# Skapar en hanterare
hi_hendler <- CommandHandler('hi', say_hello)
# LÀgg till hanteraren i övervakaren
updater <- updater + hi_hendler
# Startar boten
updater$start_polling()Kör koden ovan efter att ha bytt ut âDINA BOT TOKENâ mot den verkliga token som du fick nĂ€r du skapade boten via BotFather (jag beskrev hur man skapar en bot i ).
Metod start_polling() klassen Updater, som anvÀnds i slutet av koden, startar en oÀndlig loop för att begÀra och behandla uppdateringar frÄn boten.
Nu öppnar vi Telegram och skriver vÄrt första kommando till vÄr bot /hi.

Nu förstÄr vÄr bot kommandot /hi, och kan hÀlsa pÄ oss.
Schematic kan processen för att skapa en sÄdan enkel bot beskrivas som följer.

- Skapar en instans av klassen
Updater; - Skapar metoder, det vill sÀga funktioner som vÄr bot ska utföra. I exempel koden Àr det funktionen
say_hello(). Funktioner som du kommer att anvĂ€nda som botmetoder mĂ„ste ha tvĂ„ obligatoriska argument â bot och update, och ett valfritt â args. Argumentet botĂ€r din bot, med hjĂ€lp av den kan du svara pĂ„ meddelanden, skicka meddelanden, eller anvĂ€nda andra tillgĂ€ngliga metoder för boten. Argumentet update Ă€r det som boten mottog frĂ„n anvĂ€ndaren, i sjĂ€lva verket vad vi i den första artikeln fick med metodengetUpdates(). Argumentet args lĂ„ter dig behandla ytterligare data som skickas av anvĂ€ndaren tillsammans med kommandot, vi kommer att Ă„terkomma till detta Ă€mne lite senare; - Skapar hanterare, det vill sĂ€ga kopplar vissa Ă„tgĂ€rder av anvĂ€ndaren till de metoder som skapades i föregĂ„ende steg. I sjĂ€lva verket Ă€r en hanterare en trigger, en hĂ€ndelse som utlöser en funktion i boten. I vĂ„rt exempel Ă€r en sĂ„dan trigger att skicka kommandot
/hi, och implementeras med kommandothi_hendler <- CommandHandler('hi', say_hello). Den första argumentet i funktionenCommandHandler()lÄter dig stÀlla in kommandot, i vÄrt fallhi, som boten kommer att reagera pÄ. Det andra argumentet lÄter dig ange botens metod, vi kommer att kalla metodensay_hello, som kommer att köras om anvÀndaren aktiverade det angivna kommandot i det första argumentet; - Sedan lÀgger vi till den skapade hanteraren i övervakaren för vÄr instans av klassen
Updater. Du kan lÀgga till hanterare pÄ flera sÀtt, i exemplet ovan anvÀnde jag den enklaste metoden med hjÀlp av tecknet+, dvs.updater <- updater + hi_hendler. Detsamma kan göras med metodenadd_handler(), som hör till klassenDispatcher, den hÀr metoden kan du hitta sÄ hÀr:updater$dispatcher$add_handler(); - Vi startar boten med kommandot
start_polling().
Hanterare för textmeddelanden och filter
Vi har förstĂ„tt hur vi ska skicka kommandon till boten, men ibland behöver vi att boten reagerar inte bara pĂ„ kommandon utan Ă€ven pĂ„ vanliga textmeddelanden. För detta Ă€ndamĂ„l mĂ„ste vi anvĂ€nda meddelandehanterare â MessageHandler.
Standard MessageHandler som kommer att reagera pÄ absolut alla inkommande meddelanden. DÀrför anvÀnds meddelandehanterare ofta tillsammans med filter. LÄt oss lÀra boten att hÀlsa inte bara pÄ kommando /hi, utan alltid nÀr meddelandet som skickas till boten innehÄller ett av följande ord: hej, hÀlsar, salut, hej, bonjour.
Vi kommer inte att skriva nÄgra nya metoder just nu, eftersom vi redan har en metod som lÄter boten hÀlsa pÄ oss. Det vi behöver göra Àr att skapa det nödvÀndiga filtret och meddelandehanteraren.
Kod 2: LÀgg till en hanterare för textmeddelanden och filter
library(telegram.bot)
# Skapa en instans av klassen Updater
updater <- Updater('DIN BOTS TOKEN')
# Skriv en metod för att hÀlsa
## hÀlsningskommando
say_hello <- function(bot, update) {
# AnvÀndarnamnet som boten ska hÀlsa pÄ
user_name <- update$message$from$first_name
# Skicka ett vÀlkomstmeddelande
bot$sendMessage(update$message$chat_id,
text = paste0("Mina hÀlsningar, ", user_name, "!"),
parse_mode = "Markdown",
reply_to_message_id = update$message$message_id)
}
# Skapa filter
MessageFilters$hi <- BaseFilter(function(message) {
# Kontrollera om texten i meddelandet innehÄller orden: hej, hÀlsar, salut, hej, bonjour
grepl(x = message$text,
pattern = 'hej|hÀlsar|salut|hej|bonjour',
ignore.case = TRUE)
}
)
# Skapa hanterare
hi_hendler <- CommandHandler('hi', say_hello) # hanterare för kommandot hi
hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi)
# LĂ€gg till hanterare i dispatchern
updater <- updater +
hi_hendler +
hi_txt_hnd
# Starta boten
updater$start_polling()Kör koden ovan efter att ha bytt ut âDINA BOT TOKENâ mot den verkliga token som du fick nĂ€r du skapade boten via BotFather (jag beskrev hur man skapar en bot i ).
Nu ska vi försöka skicka boten flera meddelanden som innehÄller de tidigare nÀmnda hÀlsningsorden:

SÄ, först och frÀmst har vi lÀrt boten att inte bara hÀlsa, utan att svara pÄ hÀlsningar. Vi gjorde detta med hjÀlp av argumentet reply_to_message_id, som Àr tillgÀngligt i metoden sendMessage(), dÀr id:t pÄ meddelandet som ska besvaras mÄste anges. Du kan fÄ id:t pÄ meddelandet sÄ hÀr: update$message$message_id.
Men det viktigaste vi har gjort Àr att vi har lagt till en filterfunktion till boten med hjÀlp av BaseFilter():
# ŃĐŸĐ·ĐŽĐ°ŃĐŒ ŃОлŃŃŃŃ
MessageFilters$hi <- BaseFilter(
# Đ°ĐœĐŸĐœĐžĐŒĐœĐ°Ń ŃОлŃŃŃŃŃŃĐ°Ń ŃŃĐœĐșŃĐžŃ
function(message) {
# ĐżŃĐŸĐČĐ”ŃŃĐ”ĐŒ, ĐČŃŃŃĐ”ŃаДŃŃŃ Đ»Đž ĐČ ŃĐ”ĐșŃŃĐ” ŃĐŸĐŸĐ±ŃĐ”ĐœĐžŃ ŃĐ»ĐŸĐČа ĐżŃĐžĐČĐ”ŃŃŃĐČĐžŃ
grepl(x = message$text,
pattern = 'ĐżŃĐžĐČĐ”Ń|Đ·ĐŽŃаĐČŃŃĐČŃĐč|ŃалŃŃ|Ń
аĐč|Đ±ĐŸĐœĐ¶ŃŃ',
ignore.case = TRUE)
}
)Som du kanske har lagt mÀrke till, mÄste filter lÀggas till i objektet MessageFilters, som frÄn början redan har en liten uppsÀttning fÀrdiga filter. I vÄrt exempel i objektet MessageFilters har vi lagt till ett element hi, detta Àr en ny filter.
I funktionen BaseFilter() mÄste du skicka filterfunktionen. I grunden Àr ett filter bara en funktion som fÄr ett meddelandeexemplar och returnerar SANN eller FALSK. I vÄrt exempel skrev vi en mycket enkel funktion som med hjÀlp av den grundlÀggande funktionen grepl() kontrollerar meddelandetexten, och om den matchar det reguljÀra uttrycket hej|hallÄ|tjena|hi|bonjour ÄtervÀnder SANN.
DÀrefter skapar vi en meddelandehanterare hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi). Den första argumentet i funktionen MessageHandler() Àr metoden som kommer att anropa hanteraren, och det andra argumentet Àr filteret enligt vilket det kommer att anropas. I vÄrt fall Àr detta det filter vi har skapat MessageFilters$hi.
Och slutligen lÀgger vi till den skapade hanteraren i förvaltaren som just skapades hi_txt_hnd.
updater <- updater +
hi_hendler +
hi_txt_hndSom jag nÀmnt tidigare finns det i paketet telegram.bot och objektet MessageFilters redan en uppsÀttning inbyggda filter som du kan anvÀnda:
- all â Alla meddelanden
- text â Textmeddelanden
- command â Kommandon, dvs. meddelanden som börjar med
/ - reply â Meddelanden som Ă€r svar pĂ„ ett annat meddelande
- audio â Meddelanden som innehĂ„ller en ljudfil
- document â Meddelanden med ett skickat dokument
- photo â Meddelanden med skickade bilder
- sticker â Meddelanden med ett skickat klistermĂ€rke
- video â Meddelanden med video
- voice â Röstmeddelanden
- contact â Meddelanden som innehĂ„ller kontaktinformation för en Telegram-anvĂ€ndare
- location â Meddelanden med geolokalisering
- venue â Vidarebefordrade meddelanden
- game â Spel
Om du vill kombinera vissa filter i en hanterare, anvĂ€nd bara tecknet | â som en logisk ELLER, och tecknet & som en logisk Och. Till exempel, om du vill att botten ska anropa samma metod nĂ€r den fĂ„r video, bild eller dokument, anvĂ€nd följande exempel för att skapa en meddelandehanterare:
handler <- MessageHandler(callback,
MessageFilters$video | MessageFilters$photo | MessageFilters$document
)LĂ€gg till kommandon med parametrar
Vi vet redan vad kommandon Àr, hur man skapar dem och hur man fÄr botten att utföra det önskade kommandot. Men i vissa fall, förutom kommandots namn, behöver vi ocksÄ skicka viss data för att det ska kunna utföras.
Nedan finns ett exempel pÄ en bot som, baserat pÄ ett angivet datum och land, returnerar typen av dag frÄn produktionskalendern.
Den bot som beskrivs nedan anvÀnder API:et för produktionskalendern .
Kod 3: En bot som meddelar baserat pÄ datum och land
library(telegram.bot)
# Skapar en instans av klassen Updater
updater <- Updater('1165649194:AAFkDqIzQ6Wq5GV0YU7PmEZcv1gmWIFIB_8')
# Skriver en metod för vÀlkomnande
## VĂ€lkomstkommando
check_date <- function(bot, update, args) {
# IngÄende data
day <- args[1] # datum
country <- args[2] # land
# Kontroll av inmatade parametrar
if ( !grepl('\d{4}-\d{2}-\d{2}', day) ) {
# Skicka specialtangentbord
bot$sendMessage(update$message$chat_id,
text = paste0(day, " - ogiltigt datum, ange datum i formatet Ă
Ă
Ă
Ă
-MM-DD"),
parse_mode = "Markdown")
} else {
day <- as.Date(day)
# Omvandla till format POSIXtl
y <- format(day, "%Y")
m <- format(day, "%m")
d <- format(day, "%d")
}
# Land för kontroll
## Kolla om landet Àr angivet
## Om det inte Àr angivet sÀtts det till ru
if ( ! country %in% c('ru', 'ua', 'by', 'kz', 'us') ) {
# Skicka specialtangentbord
bot$sendMessage(update$message$chat_id,
text = paste0(country, " - ogiltig landkod, möjliga vÀrden: ru, by, kz, ua, us. EfterfrÄgade data för Ryssland."),
parse_mode = "Markdown")
country <- 'ru'
}
# BegÀr data frÄn API
# Montering av HTTP-förfrÄgan
url <- paste0("https://isdayoff.ru/api/getdata?",
"year=", y, "&",
"month=", m, "&",
"day=", d, "&",
"cc=", country, "&",
"pre=1&",
"covid=1")
# FÄr svar
res <- readLines(url)
# Tolkning av svar
out <- switch(res,
"0" = "Arbetsdag",
"1" = "Icke-arbetsdag",
"2" = "Förkortad arbetsdag",
"4" = "covid-19",
"100" = "Fel i datumet",
"101" = "Data hittades inte",
"199" = "TjÀnstefel")
# Skicka meddelande
bot$sendMessage(update$message$chat_id,
text = paste0(day, " - ", out),
parse_mode = "Markdown")
}
# Skapa en hanterare
date_hendler <- CommandHandler('check_date', check_date, pass_args = TRUE)
# LĂ€gger till hanteraren i dispatcher
updater <- updater + date_hendler
# Startar botten
updater$start_polling()Kör koden ovan efter att ha bytt ut âDINA BOT TOKENâ mot den verkliga token som du fick nĂ€r du skapade boten via BotFather (jag beskrev hur man skapar en bot i ).
Vi har skapat en bot som har en enda metod i sin arsenal check_date, denna metod anropas av kommandot med samma namn.
Men, förutom kommandots namn, förvÀntar sig denna metod att du anger tvÄ parametrar, landkod och datum. DÀrefter kontrollerar boten om den angivna dagen i det angivna landet Àr en helgdag, kort dag eller arbetsdag enligt den officiella produktionskalendern.
För att den metod vi skapar ska ta emot ytterligare parametrar tillsammans med kommandot, anvĂ€nd argumentet pass_args = TRUE i funktionen CommandHandler(), och nĂ€r du skapar metoden, förutom de obligatoriska argumenten, bot, update skapa en valfriâ args. Den metod som skapats pĂ„ detta sĂ€tt kommer att ta emot parametrar som du skickar till boten efter kommandots namn. Parametrarna mĂ„ste separeras med ett mellanslag, och de kommer att tas emot i form av en textvektor.
LÄt oss starta och testa vÄr bot.

Kör boten i bakgrunden
Det sista steget vi har kvar att utföra Àr att köra boten i bakgrunden.
För att göra detta, följ den nedan beskrivna algoritmen:
- Spara botens kod i en fil med R-tillĂ€gget. NĂ€r du arbetar i RStudio görs detta via menyn Arkiv, med kommandot Spara somâŠ.
- LÀgg till sökvÀgen till bin-mappen, som i sin tur ligger i mappen dÀr du installerade R-sprÄket i variabeln Path, instruktion .
- Skapa en vanlig textfil dÀr du skriver en rad:
R CMD BATCH C:UsersAlseyDocumentsmy_bot.R. IstĂ€llet för C:UsersAlseyDocumentsmy_bot.R skriv sökvĂ€gen till ditt bot-script. Det Ă€r viktigt att ingen kyrilliska eller mellanslag förekommer i sökvĂ€gen, eftersom detta kan orsaka problem vid körning av boten. Spara det, och Ă€ndra dess tillĂ€gg frĂ„n txt till bat. - Ăppna Windows aktivitetsplanerare, det finns mĂ„nga sĂ€tt att göra detta, till exempel kan du öppna vilken mapp som helst och skriva in adressen
%windir%system32taskschd.msc \/s. Andra sĂ€tt att starta kan hittas . - I det övre högra menyn i aktivitetsplaneraren, klicka pĂ„ "Skapa uppgiftâŠ".
- I fliken "AllmÀnt", ange ett valfritt namn för din uppgift, och sÀtt omkopplaren till "Kör för alla anvÀndare".
- GÄ till fliken "à tgÀrder", klicka pÄ "Skapa". I fÀltet "Program eller skript", klicka pÄ "BlÀddra", hitta filen skapad i steg tvÄ bat och klicka OK.
- Klicka OK, ange vid behov lösenordet för ditt operativsystemskonto.
- Hitta den skapade uppgiften i aktivitetsplaneraren, markera den och klicka pÄ knappen "Kör" i det nedre högra hörnet.
VÄr bot körs i bakgrunden och kommer att fungera tills du stoppar uppgiften eller stÀnger av din PC eller server dÀr den körs.
Slutsats
I den hÀr artikeln har vi gÄtt igenom hur man skriver en komplett bot som inte bara kan skicka meddelanden utan ocksÄ reagera pÄ inkommande meddelanden och kommandon. Kunskapen du har fÄtt Àr tillrÀcklig för att lösa de flesta av dina uppgifter.
I nÀsta artikel kommer vi att diskutera hur man lÀgger till ett tangentbord till boten för en mer anvÀndarvÀnlig upplevelse.
Prenumerera pÄ min och kanaler.
KĂ€lla: habr.com
