Kirjutame telegrammi boti R keeles (osa 2): Lisame botile käskude ja sõnumifiltrite toe

V eelnevas postituses 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 esimeses osas.

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.

Kirjutame telegrammi boti R keeles (osa 2): Lisame botile käskude ja sõnumifiltrite toe

Kõik artiklid seeriast "Kirjutame telegrammi boti R keeles"

  1. Loome boti ja saadame sellega sõnumeid telegrammi
  2. Lisame botile käskude toe ja sõnumifiltrid

Sisu

Kui teid huvitab andmeanalüüs, siis võivad teile huvi pakkuda minu telegram ja youtube kanalid, mille suurem osa sisust on pühendatud R keelele.

  1. Klass Updater
  2. Handlers — käsitlejad
  3. Lisame robotile esimese käsu, käsitleja käsud
  4. Tekstisõnumite käsitleja ja filtrid
  5. Käskude lisamine parameetritega
  6. Käivitame roboti taustal
  7. Kokkuvõte

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 esimesest artiklist).

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.

Kirjutame telegrammi boti R keeles (osa 2): Lisame botile käskude ja sõnumifiltrite toe

Nüüd meie bot mõistab käsku /hi, ja oskab meiega tervitada.

Skeemiliselt võib sellise lihtsa boti loomise protsessi kujutada järgmiselt.

Kirjutame telegrammi boti R keeles (osa 2): Lisame botile käskude ja sõnumifiltrite toe

  1. Loome klassi instantsi Updater;
  2. 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 abil getUpdates(). Argument args võimaldab teil töödelda täiendavaid andmeid, mida kasutaja saatis koos käsklusega, selle teema juurde naaseme veidi hiljem;
  3. 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äsuga hi_hendler <- CommandHandler('hi', say_hello). Funktsiooni esimene argument CommandHandler() lubab teil määrata käsu, meie puhul hi, mille bot reageerib. Teise argumendiga saab määrata bot'i meetodi; me kutsume meetodit say_hello, mis käivitatakse, kui kasutaja kutsub esimeses argumendis määratud käsku;
  4. 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 meetodi add_handler(), mis kuulub klassi Dispatcher, seda meetodit leiab nii: updater$dispatcher$add_handler();
  5. 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 esimesest artiklist).

Nüüd proovime botile saata mõned sõnumid, milles on varem mainitud tervitusõnad:
Kirjutame telegrammi boti R keeles (osa 2): Lisame botile käskude ja sõnumifiltrite toe

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_hnd

Nagu 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 isdayoff.ru.

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 esimesest artiklist).

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.

Kirjutame telegrammi boti R keeles (osa 2): Lisame botile käskude ja sõnumifiltrite toe

Käivitame roboti taustal

Viimane samm, mis meil veel jäänud on — käivitada bot taustal.

Selleks järgige allpool kirjeldatud algoritmi:

  1. Salvestage boti kood faili laiendusega R. RStudio keskkonnas saab seda teha menüü kaudu File, käsuga Save As….
  2. Lisage tee bin kausta, mis asub kaustas, kuhu installisite R-i, muutuja Path, juhend siin.
  3. 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.
  4. 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 siin.
  5. Planeerija ülemises paremas menüüs klõpsake nuppu "Looge ülesanne…".
  6. Üldvahelehel määrake oma ülesandele suvaline nimi ja lülitage lüliti "Käitage kõikide kasutajate nimel".
  7. 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.
  8. Klõpsame OK, vajadusel sisestage oma operatsioonisüsteemi konto parool.
  9. 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 telegram ja youtube kanalitega.

Allikas: habr.com

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster