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

Uues eelmine postitus 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. esimeses osas.

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.

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

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

  1. Loome boti ja saadame tema kaudu sõnumeid telegrammis
  2. Lisame botile toetuse käskudele ja sõnumifilteritele

Sisukord

Kui teid huvitab andmeanalüüs, võivad teid huvitada minu telegram ja youtube kanalid, millel on suur osa sisu R keelele.

  1. Klass Updater
  2. Handlers — töötlejad
  3. Lisame botile esimese käsu, käsude töötleja
  4. Tekstisõnumite töötleja ja filtrid
  5. Käskude lisamine parameetritega
  6. Käivitame boti taustal
  7. Kokkuvõte

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 esimene artikkel).

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.

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

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

Schemaaliselt saab sellise lihtsa boti loomise protsessi kujutada järgmiselt.

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

  1. Loome klassi eksemplari Updater;
  2. 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 meetodi getUpdates(). Argument args võimaldab teil töödelda täiendavaid andmeid, mille kasutaja saatis koos käsuga, sellele teemele me naaseme pisut hiljem;
  3. 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äsuga hi_hendler <- CommandHandler('hi', say_hello). Funktsiooni esimene argument CommandHandler() võimaldab teil määrata käsu, meie juhul hi, millele bot reageerib. Teine argument võimaldab määrata boti meetodi, me kutsub üles meetodi say_hello, mis täidetakse, kui kasutaja kutsub esile esimeses argumendis määratud käsu;
  4. 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 +, st updater <- updater + hi_hendler. Sama asja saab teha meetodi abil add_handler(), mis kuulub klassi Dispatcher, seda meetodit saab leida nii: updater$dispatcher$add_handler();
  5. 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 esimene artikkel).

Nüüd proovime saata botile mõned sõnumid, kus esinevad eelnevalt loetletud tervitussõnad:
Kirjutame R keeles telegrammi boti (osa 2): Lisame botile käsitlemise ja sõnumifiltrite toe

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_hnd

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

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 esimene artikkel).

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.

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

Käivitame boti taustal

Viimane samm, mis meil on jäänud, on bot taustal käivitamine.

Käituge allpool kirjeldatud algoritmi järgi:

  1. Salvestage boti kood failina, millel on R laiend. RStudios töötades tehakse seda menüü kaudu Fail, käsu Save As….
  2. Lisa tee kausta bin, mis asub kaustas, kuhu olete R keele paigaldanud, muutes muutuja Path, juhiseid siit.
  3. 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.
  4. 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 siit.
  5. Ajakavaja ülemises paremas menüüs vajutage "Loo ülesanne…".
  6. Üldine sakk määrake oma ülesandele suvaline nimi ja lülitage lüliti "Käivita kõikide kasutajate nimel".
  7. Minge "Toimingute" sakk, vajutage "Loo". Ribal "Programm või skript" vajutage "Sirvi", leidke teisel sammul loodud bat fail ja vajutage OLE.
  8. Vajutame OLE, vajadusel sisestage oma operatsioonisüsteemi konto parool.
  9. 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 telegram ja youtube kanalid.

Allikas: habr.com

Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster