Telegrammiroti kirjutamine R-is (2. osa): käsutoe ja sõnumifiltrite lisamine robotile

В eelmine väljaanne mõtlesime välja, kuidas luua robotit, initsialiseerisime klassi eksemplari Bot ja tutvus selle abil sõnumite saatmise meetoditega.

Selles artiklis jätkan seda teemat, seega soovitan seda artiklit lugeda alles pärast lugemist Esimene osa.

Sel korral mõtleme välja, kuidas oma robotit elustada ja lisada sellele käsutugi ning tutvume ka klassiga Updater.

Artikli käigus kirjutame mitu lihtsat robotit, viimased teevad etteantud kuupäeva ja riigikoodi alusel kindlaks, kas antud riigis on mõni päev tootmiskalendri järgi nädalavahetus või tööpäev. Kuid nagu varemgi, on artikli eesmärk tutvustada teid paketi liidesega telegram.bot oma probleemide lahendamiseks.

Telegrammiroti kirjutamine R-is (2. osa): käsutoe ja sõnumifiltrite lisamine robotile

Kõik artiklid sarjast “Telegrammiroti kirjutamine R-is”

  1. Loome roboti ja kasutame seda sõnumite saatmiseks telegrammis
  2. Lisage robotile käsutugi ja sõnumifiltrid

Sisu

Kui olete huvitatud andmete analüüsist, võite olla huvitatud minu telegramm и youtube kanalid. Suurem osa sisust on pühendatud R-keelele.

  1. Uuendaja klass
  2. Käitlejad – käitlejad
  3. Lisage esimene käsk robotile, käsutöötlejale
  4. Tekstisõnumite protsessor ja filtrid
  5. Käskude lisamine parameetritega
  6. Käivitage robot taustal
  7. Järeldus

Uuendaja klass

Updater on klass, mis muudab telegrammiroti väljatöötamise lihtsamaks ja kasutab kapoti all olevat klassi Dispetcher. Klassiülesanne Updater on saada robotilt värskendusi (eelmises artiklis kasutasime selleks meetodit getUpdates()) ja kandke need edasi aadressile Dispetcher.

Omakorda Dispetcher sisaldab teie loodud töötlejaid, st. klassi objektid Handler.

Käitlejad – käitlejad

Käsitsejatega, millele lisate Dispetcher robotite reaktsioonid erinevatele sündmustele. Selle artikli kirjutamise ajal aastal telegram.bot Lisatud on järgmist tüüpi töötlejad:

  • MessageHandler – sõnumitöötleja
  • CommandHandler – käskude töötleja
  • CallbackQueryHandler – Inline'ist saadetud klaviatuuride andmetöötleja
  • ErrorHandler – veakäsitleja robotilt värskenduste taotlemisel

Lisage esimene käsk robotile, käsutöötlejale

Kui te pole kunagi varem roboteid kasutanud ja ei tea, mis on käsk, siis tuleb käsud robotile saata kaldkriipsuga / eesliitena.

Alustame lihtsatest käskudest, st. õpetame oma robotit käsu peale tere ütlema /hi.

Kood 1: õpetage robotit tere ütlema

library(telegram.bot)

# создаём экземпляр класса Updater
updater <- Updater('ТОКЕН ВАШЕГО БОТА')

# Пишем метод для приветсвия
say_hello <- function(bot, update) {

  # Имя пользователя с которым надо поздароваться
  user_name <- update$message$from$first_name

  # Отправка приветственного сообщения
  bot$sendMessage(update$message$chat_id, 
                  text = paste0("Моё почтение, ", user_name, "!"), 
                  parse_mode = "Markdown")

}

# создаём обработчик 
hi_hendler <- CommandHandler('hi', say_hello)

# добаляем обработчик в диспетчер
updater <- updater + hi_hendler

# запускаем бота
updater$start_polling()

Käivitage ülaltoodud koodinäide pärast seda, kui olete asendanud "TEIE BOTI MÄRGI" tõelise märgiga, mille saite roboti loomisel BotFather (Ma rääkisin roboti loomisest esimene artikkel).

Meetod start_polling() klass Updater, mida kasutatakse koodi lõpus, käivitab lõputu tsükli, mis nõuab ja töötleb robotilt värskendusi.

Nüüd avame Telegrami ja kirjutame oma robotile esimene käsk /hi.

Telegrammiroti kirjutamine R-is (2. osa): käsutoe ja sõnumifiltrite lisamine robotile

Nüüd saab meie bot käsust aru /hi, ja teab, kuidas meid tervitada.

Skemaatiliselt saab sellise lihtsa roboti loomise protsessi kujutada järgmiselt.

Telegrammiroti kirjutamine R-is (2. osa): käsutoe ja sõnumifiltrite lisamine robotile

  1. Looge klassi eksemplar Updater;
  2. Loome meetodeid, st. funktsioone, mida meie bot täidab. Koodinäites on see funktsioon say_hello(). Funktsioonidel, mida kasutate robotmeetoditena, peab olema kaks nõutavat argumenti - bot и ajakohastamaja üks valikuline – vaidleb vastu. Argument bot, see on teie robot, mille abiga saate sõnumitele vastata, sõnumeid saata või kasutada muid robotile saadaolevaid meetodeid. Argument ajakohastama selle sai bot kasutajalt, tegelikult saime selle meetodi abil esimeses artiklis getUpdates(). Argument vaidleb vastu võimaldab töödelda kasutaja poolt koos käsuga saadetud täiendavaid andmeid, tuleme selle teema juurde veidi hiljem tagasi;
  3. Loome käitlejaid, st. Seome mõned kasutajatoimingud eelmises etapis loodud meetoditega. Põhimõtteliselt on käitleja päästik, sündmus, mis kutsub esile mõne roboti funktsiooni. Meie näites on selline päästik käsu saatmine /hi, ja selle rakendab meeskond hi_hendler <- CommandHandler('hi', say_hello). Funktsiooni esimene argument CommandHandler() võimaldab teil määrata meie puhul käsu hi, millele robot vastab. Teine argument võimaldab teil määrata bot-meetodi, me kutsume seda meetodit say_hello, mis käivitatakse, kui kasutaja kutsus välja esimeses argumendis määratud käsu;
  4. Järgmisena lisame loodud töötleja oma klassi eksemplari dispetšerile Updater. Käsitsejaid saab lisada mitmel viisil, ülaltoodud näites kasutasin kõige lihtsamat, kasutades märki +s.t. updater <- updater + hi_hendler. Sama saab teha meetodi abil add_handler(), mis kuulub klassi Dispatcher, leiate selle meetodi järgmiselt: updater$dispatcher$add_handler();
  5. Käivitage bot käsuga start_polling().

Tekstisõnumite protsessor ja filtrid

Mõtlesime välja, kuidas robotile käske saata, kuid mõnikord on meil vaja, et robot vastaks mitte ainult käskudele, vaid ka tavalistele tekstisõnumitele. Selleks peate kasutama sõnumitöötlejaid − Sõnumihaldur.

tavaline Sõnumihaldur vastab absoluutselt kõigile sissetulevatele sõnumitele. Seetõttu kasutatakse sõnumitöötlejaid sageli koos filtritega. Õpetagem robotit tere ütlema mitte ainult käsu peale /hi, aga ka alati, kui robotile saadetud sõnumis ilmub üks järgmistest sõnadest: tere, tere, salute, hai, bonjour.

Praegu me uusi meetodeid ei kirjuta, sest... Meil on juba meetod, mille abil bot meid tervitab. Peame vaid looma vajaliku filtri ja sõnumitöötleja.

Kood 2: lisage tekstisõnumite töötleja ja filter

library(telegram.bot)

# создаём экземпляр класса Updater
updater <- Updater('ТОКЕН ВАШЕГО БОТА')

# Пишем метод для приветсвия
## команда приветвия
say_hello <- function(bot, update) {

  # Имя пользователя с которым надо поздароваться
  user_name <- update$message$from$first_name

  # Отправляем приветсвенное сообщение
  bot$sendMessage(update$message$chat_id, 
                  text = paste0("Моё почтение, ", user_name, "!"),
                  parse_mode = "Markdown",
                  reply_to_message_id = update$message$message_id)

}

# создаём фильтры
MessageFilters$hi <- BaseFilter(function(message) {

  # проверяем, встречается ли в тексте сообщения слова: привет, здравствуй, салют, хай, бонжур
  grepl(x           = message$text, 
        pattern     = 'привет|здравствуй|салют|хай|бонжур',
        ignore.case = TRUE)
  }
)

# создаём обработчик 
hi_hendler <- CommandHandler('hi', say_hello) # обработчик команды hi
hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi)

# добаляем обработчики в диспетчер
updater <- updater + 
             hi_hendler +
             hi_txt_hnd

# запускаем бота
updater$start_polling()

Käivitage ülaltoodud koodinäide pärast seda, kui olete asendanud "TEIE BOTI MÄRGI" tõelise märgiga, mille saite roboti loomisel BotFather (Ma rääkisin roboti loomisest esimene artikkel).

Proovime nüüd saata robotile mitu sõnumit, mis sisaldavad varem loetletud tervitussõnu:
Telegrammiroti kirjutamine R-is (2. osa): käsutoe ja sõnumifiltrite lisamine robotile

Nii et esiteks õpetasime robotit mitte ainult tere ütlema, vaid ka tervitamisele vastama. Tegime seda argumenti kasutades reply_to_message_id, mis on meetodis saadaval sendMessage(), kuhu peate teisaldama selle sõnumi ID, millele soovite vastata. Sõnumi ID saate järgmiselt: update$message$message_id.

Kuid peamine, mida me tegime, oli funktsiooni abil robotile filtri lisamine BaseFilter():

# создаём фильтры
MessageFilters$hi <- BaseFilter( 

  # анонимная фильтрующая функция
  function(message) {

    # проверяем, встречается ли в тексте сообщения слова приветствия
    grepl(x           = message$text, 
          pattern     = 'привет|здравствуй|салют|хай|бонжур',
          ignore.case = TRUE)
  }

)

Nagu olete ehk märganud, tuleb objektile lisada filtreid Sõnumifiltrid, mis sisaldab esialgu juba väikest komplekti valmisfiltreid. Meie näites objektile Sõnumifiltrid lisasime elemendi hi, see on uus filter.

Funktsioonis BaseFilter() peate läbima filtrifunktsiooni. Põhimõtteliselt on filter lihtsalt funktsioon, mis võtab vastu sõnumieksemplari ja tagastab TRUE või FALSE. Meie näites kirjutasime lihtsa funktsiooni, mis kasutab põhifunktsiooni grepl() kontrollib sõnumi teksti ja seda, kas see ühtib regulaaravaldisega привет|здравствуй|салют|хай|бонжур naaseb TRUE.

Järgmisena loome sõnumitöötleja hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi). Funktsiooni esimene argument MessageHandler() on meetod, mis kutsub välja töötleja, ja teine ​​argument on filter, mille abil see välja kutsutakse. Meie puhul on see meie loodud filter MessageFilters$hi.

Noh, lõpuks lisame dispetšerile loodud töötleja hi_txt_hnd.

updater <- updater + 
             hi_hendler +
             hi_txt_hnd

Nagu ma eespool kirjutasin, pakendis telegram.bot ja objekt Sõnumifiltrid Sisseehitatud filtrite komplekt, mida saate kasutada, on juba olemas.

  • kõik — kõik sõnumid
  • text — tekstsõnumid
  • käsk — Käsud, s.o. sõnumid, mis algavad tähega /
  • vastus — sõnumid, mis on vastuseks teisele sõnumile
  • heli — helifaili sisaldavad sõnumid
  • dokument — saadetud dokumendiga sõnumid
  • foto – saadetud piltidega sõnumid
  • kleebis — saadetud kleebisega sõnumid
  • video — videoga sõnumid
  • hääl – häälsõnumid
  • kontakt — sõnumid, mis sisaldavad kasutaja telegrammi sisu
  • asukoht — geolokatsiooniga sõnumid
  • toimumiskoht — edastatud sõnumid
  • mäng — mängud

Kui soovite ühendada mõned filtrid ühes käitlejas, kasutage lihtsalt märki | - loogilisena VÕI, ja kirjutage alla & kui loogiline И. Näiteks kui soovite, et robot kutsuks video, pildi või dokumendi vastuvõtmisel sama meetodit, kasutage sõnumitöötleja loomiseks järgmist näidet.

handler <- MessageHandler(callback, 
  MessageFilters$video | MessageFilters$photo | MessageFilters$document
)

Käskude lisamine parameetritega

Teame juba, mis on käsud, kuidas neid luua ja kuidas sundida robotit soovitud käsku täitma. Kuid mõnel juhul peame selle täitmiseks lisaks käsu nimele edastama ka mõned andmed.

Allpool on näide robotist, mis antud kuupäeva ja riigi korral tagastab teile tootmiskalendrist päeva tüübi.

Allolev robot kasutab tootmiskalendri API-d isdayoff.ru.

Kood 3: robot, mis annab aru kuupäeva ja riigi järgi

library(telegram.bot)

# создаём экземпляр класса Updater
updater <- Updater('1165649194:AAFkDqIzQ6Wq5GV0YU7PmEZcv1gmWIFIB_8')

# Пишем метод для приветсвия
## команда приветвия
check_date <- function(bot, update, args) {

  # входящие данные
  day     <- args[1]  # дата
  country <- args[2]  # страна

  # проверка введённых параметров
  if ( !grepl('\d{4}-\d{2}-\d{2}', day) ) {

    # Send Custom Keyboard
    bot$sendMessage(update$message$chat_id, 
                    text = paste0(day, " - некорреткная дата, введите дату в формате ГГГГ-ММ-ДД"),
                    parse_mode = "Markdown")

  } else {
    day <- as.Date(day)
    # переводим в формат POSIXtl
    y <- format(day, "%Y")
    m <- format(day, "%m")
    d <- format(day, "%d")

  }

  # страна для проверки
  ## проверяем задана ли страна
  ## если не задана устанавливаем ru
  if ( ! country %in% c('ru', 'ua', 'by', 'kz', 'us') ) {

    # Send Custom Keyboard
    bot$sendMessage(update$message$chat_id, 
                    text = paste0(country, " - некорретктный код страны, возможнные значения: ru, by, kz, ua, us. Запрошены данные по России."),
                    parse_mode = "Markdown")

    country <- 'ru'

  }

  # запрос данных из API
  # компоновка HTTP запроса
  url <- paste0("https://isdayoff.ru/api/getdata?",
                "year=",  y, "&",
                "month=", m, "&",
                "day=",   d, "&",
                "cc=",    country, "&",
                "pre=1&",
                "covid=1")

  # получаем ответ
  res <- readLines(url)

  # интрепретация ответа
  out <- switch(res, 
                "0"   = "Рабочий день",
                "1"   = "Нерабочий день",
                "2"   = "Сокращённый рабочий день",
                "4"   = "covid-19",
                "100" = "Ошибка в дате",
                "101" = "Данные не найдены",
                "199" = "Ошибка сервиса")

  # отправляем сообщение
  bot$sendMessage(update$message$chat_id, 
                  text = paste0(day, " - ", out),
                  parse_mode = "Markdown")

}

# создаём обработчик 
date_hendler <- CommandHandler('check_date', check_date, pass_args = TRUE)

# добаляем обработчик в диспетчер
updater <- updater + date_hendler

# запускаем бота
updater$start_polling()

Käivitage ülaltoodud koodinäide pärast seda, kui olete asendanud "TEIE BOTI MÄRGI" tõelise märgiga, mille saite roboti loomisel BotFather (Ma rääkisin roboti loomisest esimene artikkel).

Lõime roboti, mille arsenalis on ainult üks meetod check_date, kutsutakse seda meetodit välja samanimelise käsuga.

Kuid lisaks käsu nimele nõuab see meetod kahe parameetri, riigi koodi ja kuupäeva sisestamist. Järgmisena kontrollib bot, kas antud riigis on ametliku tootmiskalendri järgi nädalavahetus, lühendatud päev või tööpäev.

Selleks, et meie loodud meetod aktsepteeriks koos käsuga täiendavaid parameetreid, kasutage argumenti pass_args = TRUE funktsioonis CommandHandler(), ja meetodi loomisel lisaks nõutavatele argumentidele bot, ajakohastama loo valikuline - vaidleb vastu. Sel viisil loodud meetod aktsepteerib parameetreid, mille edastate robotile käsu nime järel. Parameetrid tuleb eraldada tühikuga, need saadetakse meetodile tekstivektorina.

Käivitame ja testime oma robotit.

Telegrammiroti kirjutamine R-is (2. osa): käsutoe ja sõnumifiltrite lisamine robotile

Käivitage robot taustal

Viimane samm, mille peame tegema, on taustal roboti käivitamine.

Selleks järgige allpool kirjeldatud algoritmi:

  1. Salvestage boti kood faili laiendiga R. RStudios töötades tehakse seda menüü kaudu fail, meeskond Salvesta kui.
  2. Lisa tee kausta bin, mis omakorda asub kaustas, kuhu installisid keele R, tee muutujale Path, juhised siin.
  3. Looge tavaline tekstifail, kuhu kirjutage 1 rida: R CMD BATCH C:UsersAlseyDocumentsmy_bot.R... Selle asemel C:UsersAlseyDocumentsmy_bot.R kirjutage oma roboti skripti tee. Samas on oluline, et teele ei jääks kirillitsat ega tühikuid, sest see võib roboti käitamisel probleeme tekitada. Salvestage see ja asendage selle laiendus järgmisega txt edasi bat.
  4. Avage Windows Task Scheduler, selleks on palju võimalusi, näiteks avage mis tahes kaust ja sisestage aadress %windir%system32taskschd.msc /s. Leiate teisi käivitamisviise siin.
  5. Planeerija paremas ülanurgas klõpsake nuppu "Loo ülesanne...".
  6. Andke vahekaardil "Üldine" oma ülesandele kohandatud nimi ja lülitage lüliti olekusse "Käivita kõigile kasutajatele".
  7. Minge vahekaardile "Toimingud", klõpsake "Loo". Klõpsake väljal "Programm või skript" nuppu "Sirvi", leidke teises etapis loodud bat faili ja klõpsake nuppu OK.
  8. Klõpsake nuppu OK ja vajadusel sisestage oma operatsioonisüsteemi konto parool.
  9. Leidke ajakavas loodud ülesanne, valige see ja klõpsake paremas alanurgas nuppu "Käivita".

Meie robot töötab taustal ja töötab seni, kuni peatate ülesande või lülitate välja arvuti või serveri, millel see käivitati.

Järeldus

Selles artiklis mõtlesime välja, kuidas kirjutada täieõiguslik bot, mis ei saa mitte ainult sõnumeid saata, vaid ka vastata sissetulevatele sõnumitele ja käskudele. Saadud teadmistest piisab enamiku probleemide lahendamiseks.

Järgmine artikkel räägib sellest, kuidas mugavamaks tööks robotile klaviatuuri lisada.

Telli minu telegramm и youtube kanalid.

Allikas: www.habr.com

Lisa kommentaar