In telegrambot skriuwe yn R (diel 2): ​​Kommando-stipe en berjochtfilters tafoegje oan 'e bot

В foarige publikaasje wy fûnen út hoe't jo in bot meitsje, inisjalisearre in eksimplaar fan 'e klasse Bot en waard fertroud mei de metoaden foar it ferstjoeren fan berjochten dêrmei.

Yn dit artikel gean ik troch mei dit ûnderwerp, dus ik riede oan om dit artikel pas nei it lêzen te begjinnen earste diel.

Dizze kear sille wy útfine hoe't jo ús bot opnij meitsje kinne en kommando-stipe oan tafoegje, en ek yn 'e kunde komme mei de klasse Updater.

Yn 'e rin fan it artikel sille wy ferskate ienfâldige bots skriuwe, de lêste sil, basearre op in opjûne datum en lânkoade, bepale oft in dei yn in bepaald lân in wykein of in wurkdei is neffens de produksjekalinder. Mar, lykas earder, is it doel fan it artikel om jo fertroud te meitsjen mei de pakketynterface telegram.bot om jo eigen problemen op te lossen.

In telegrambot skriuwe yn R (diel 2): ​​Kommando-stipe en berjochtfilters tafoegje oan 'e bot

Alle artikels út 'e searje "In telegrambot skriuwe yn R"

  1. Wy meitsje in bot en brûke it om berjochten te ferstjoeren yn telegram
  2. Foegje kommando-stipe en berjochtfilters ta oan de bot

Ynhâld

As jo ​​​​ynteressearre binne yn gegevensanalyse, kinne jo miskien wêze ynteressearre yn myn telegram и youtube kanalen. It grutste part fan de ynhâld is wijd oan de R-taal.

  1. Updater klasse
  2. Handlers - hannelers
  3. Foegje it earste kommando ta oan de bot, kommando handler
  4. Tekstberjochtprosessor en filters
  5. Kommando's tafoegje mei parameters
  6. Run de bot op 'e eftergrûn
  7. konklúzje

Updater klasse

Updater is in klasse dy't makket it makliker foar jo in ûntwikkeljen telegram bot, en brûkt de klasse ûnder de motorkap Dispetcher. Klasse opdracht Updater is om updates te ûntfangen fan 'e bot (yn it foarige artikel hawwe wy de metoade foar dit doel brûkt getUpdates()), en ferpleatse se fierder nei Dispetcher.

Oan 'e oare kant Dispetcher befettet de handlers dy't jo makke hawwe, d.w.s. klasse objekten Handler.

Handlers - hannelers

Mei handlers jo tafoegje oan Dispetcher bot reaksjes op ferskate eveneminten. Op it momint fan it skriuwen fan dit artikel yn telegram.bot De folgjende soarten hannelers binne tafoege:

  • MessageHandler - Berjochtbehearder
  • CommandHandler - Kommando-hanneler
  • CallbackQueryHandler - Data handler foar toetseboerden ferstjoerd fan Inline
  • ErrorHandler - Flaterhanneler by it oanfreegjen fan updates fan 'e bot

Foegje it earste kommando ta oan de bot, kommando handler

As jo ​​noch noait earder bots brûkt hawwe en net witte wat in kommando is, dan moatte kommando's nei de bot stjoerd wurde mei in slash / as foarheaksel.

Wy sille begjinne mei ienfâldige kommando's, d.w.s. litte wy ús bot leare om op kommando hallo te sizzen /hi.

Koade 1: De bot leare om hallo te sizzen

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()

Rinne it hjirboppe koadefoarbyld út, nei it ferfangen fan 'YOUR BOT TOKEN' mei it echte token dat jo ûntfongen hawwe by it meitsjen fan de bot fia BotFather (Ik hie it oer it meitsjen fan in bot yn earste artikel).

Metoade start_polling() klasse Updater, dy't brûkt wurdt oan 'e ein fan' e koade, begjint in einleaze loop fan it oanfreegjen en ferwurkjen fan updates fan 'e bot.

Litte wy no Telegram iepenje en it earste kommando skriuwe nei ús bot /hi.

In telegrambot skriuwe yn R (diel 2): ​​Kommando-stipe en berjochtfilters tafoegje oan 'e bot

No begrypt ús bot it kommando /hi, en wit ús te groetsjen.

Skematysk kin it proses fan it bouwen fan sa'n ienfâldige bot as folget wurde ôfbylde.

In telegrambot skriuwe yn R (diel 2): ​​Kommando-stipe en berjochtfilters tafoegje oan 'e bot

  1. Meitsje in eksimplaar fan 'e klasse Updater;
  2. Wy meitsje metoaden, d.w.s. funksjes dy't ús bot sil útfiere. Yn it koadefoarbyld is dit in funksje say_hello(). De funksjes dy't jo sille brûke as botmetoaden moatte twa fereaske arguminten hawwe - bot и update, en ien opsjoneel - args. Argumint bot, dit is jo bot, mei har help kinne jo antwurdzje op berjochten, berjochten ferstjoere, of elke oare metoade brûke dy't beskikber is foar de bot. Argumint update dit is wat de bot fan 'e brûker krige, yn feite, wat wy yn it earste artikel krigen hawwe mei de metoade getUpdates(). Argumint args kinne jo ferwurkje oanfoljende gegevens stjoerd troch de brûker tegearre mei it kommando, wy sille werom nei dit ûnderwerp in bytsje letter;
  3. Wy meitsje handlers, d.w.s. Wy assosjearje guon brûkersaksjes mei de metoaden makke yn 'e foarige stap. Yn essinsje is in handler in trigger, in evenemint dat in botfunksje neamt. Yn ús foarbyld is sa'n trigger it ferstjoeren fan in kommando /hi, en wurdt útfierd troch it team hi_hendler <- CommandHandler('hi', say_hello). Earste funksje argumint CommandHandler() kinne jo in kommando opjaan, yn ús gefal hi, dêr't de bot sil reagearje. It twadde argumint lit jo de botmetoade opjaan, wy sille de metoade neame say_hello, dy't útfierd wurde as de brûker it kommando neamde yn it earste argumint;
  4. Dêrnei foegje wy de oanmakke handler ta oan de dispatcher fan ús klasse-eksimplaar Updater. Jo kinne tafoegje handlers op ferskate manieren yn it foarbyld hjirboppe, Ik brûkte de simpelste, mei help fan it teken; +, d.h. updater <- updater + hi_hendler. Itselde kin dien wurde mei de metoade add_handler(), dy't by de klasse heart Dispatcher, kinne jo dizze metoade sa fine: updater$dispatcher$add_handler();
  5. Wy starte de bot mei it kommando start_polling().

Tekstberjochtprosessor en filters

Wy hawwe útfûn hoe't jo kommando's nei de bot kinne stjoere, mar soms moatte wy de bot net allinich op kommando's reagearje, mar ek op guon reguliere tekstberjochten. Om dit te dwaan moatte jo berjochtbehannelers brûke - MessageHandler.

Wenstich MessageHandler sil reagearje op absolút alle ynkommende berjochten. Dêrom wurde berjochtbehannelers faak brûkt tegearre mei filters. Litte wy de bot leare om hallo te sizzen net allinich op kommando /hi.

Foar no sille wy gjin nije metoaden skriuwe, om't ... Wy hawwe al in metoade wêrmei't de bot ús begroetet. Alles wat wy hoege te dwaan is it fereaske filter en berjochtbehearder oan te meitsjen.

Koade 2: Foegje in tekst berjocht handler en 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()

Rinne it hjirboppe koadefoarbyld út, nei it ferfangen fan 'YOUR BOT TOKEN' mei it echte token dat jo ûntfongen hawwe by it meitsjen fan de bot fia BotFather (Ik hie it oer it meitsjen fan in bot yn earste artikel).

Litte wy no besykje de bot ferskate berjochten te stjoeren dy't de earder neamde groetwurden befetsje:
In telegrambot skriuwe yn R (diel 2): ​​Kommando-stipe en berjochtfilters tafoegje oan 'e bot

Dat, foarearst, learden wy de bot net allinich om hallo te sizzen, mar te reagearjen op in groet. Wy diene dit mei it argumint reply_to_message_id, dy't beskikber is yn 'e metoade sendMessage(), dêr't jo de id fan it berjocht dêr't jo op reagearje wolle oerdrage moatte. Jo kinne de berjocht-id sa krije: update$message$message_id.

Mar it wichtichste ding dat wy diene wie in filter tafoegje oan 'e bot mei de funksje BaseFilter():

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

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

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

)

Lykas jo miskien hawwe opfallen, moatte filters wurde tafoege oan it objekt MessageFilters, dy't ynearsten al in lyts set fan klearmakke filters befettet. Yn ús foarbyld, nei it objekt MessageFilters wy tafoege in elemint hi, dit is in nij filter.

Funksjonearje BaseFilter() jo moatte de filterfunksje trochjaan. Yn essinsje is in filter gewoan in funksje dy't in berjochteksimplaar ûntfangt en weromkomt WIER of FALSK. Yn ús foarbyld hawwe wy in ienfâldige funksje skreaun dy't de basisfunksje brûke grepl() kontrolearret de berjochttekst en as it oerienkomt mei de reguliere ekspresje привет|здравствуй|салют|хай|бонжур jout werom WIER.

Dêrnei meitsje wy in berjochtbehearder hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi). Earste funksje argumint MessageHandler() is de metoade dy't de handler sil neame, en it twadde argumint is it filter wêrmei it sil wurde neamd. Yn ús gefal is dit it filter dat wy makke hawwe MessageFilters$hi.

No, op it lêst foegje wy de oanmakke handler ta oan de dispatcher hi_txt_hnd.

updater <- updater + 
             hi_hendler +
             hi_txt_hnd

Lykas ik hjirboppe skreau, yn it pakket telegram.bot en foarwerp MessageFilters D'r is al in set ynboude filters dy't jo kinne brûke:

  • allegear - Alle berjochten
  • tekst - Tekstberjochten
  • kommando - Kommando's, d.w.s. berjochten dy't begjinne mei /
  • antwurdzje - Berjochten dy't in antwurd binne op in oar berjocht
  • audio - Berjochten mei in audiobestân
  • dokumint - Berjochten mei in ferstjoerd dokumint
  • foto - Berjochten mei ferstjoerde ôfbyldings
  • sticker - Berjochten mei in ferstjoerde sticker
  • fideo - Berjochten mei fideo
  • stim - Stim berjochten
  • kontakt - Berjochten dy't de telegramynhâld fan 'e brûker befetsje
  • lokaasje - Berjochten mei geolokaasje
  • venue - Trochstjoerde berjochten
  • spultsje - Games

As jo ​​​​wat filters wolle kombinearje yn ien handler, brûk gewoan it teken | - as in logyske Or, en tekenje & as logysk И. As jo ​​​​bygelyks wolle dat de bot deselde metoade neamt as it in fideo, ôfbylding of dokumint ûntfangt, brûk dan it folgjende foarbyld om in berjochthanneler te meitsjen:

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

Kommando's tafoegje mei parameters

Wy witte al wat kommando's binne, hoe't se se meitsje en hoe't jo de bot twinge om it winske kommando út te fieren. Mar yn guon gefallen, neist de kommandonamme, moatte wy wat gegevens trochjaan om it út te fieren.

Hjirûnder is in foarbyld fan in bot dy't, jûn in opjûne datum en lân, jo it deitype werombringt fan 'e produksjekalinder.

De bot hjirûnder brûkt de produksjekalinder API isdayoff.ru.

Koade 3: Bot dat rapportearret troch datum en lân

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()

Rinne it hjirboppe koadefoarbyld út, nei it ferfangen fan 'YOUR BOT TOKEN' mei it echte token dat jo ûntfongen hawwe by it meitsjen fan de bot fia BotFather (Ik hie it oer it meitsjen fan in bot yn earste artikel).

Wy hawwe in bot makke dy't mar ien metoade yn har arsenal hat check_date, dizze metoade wurdt neamd troch it kommando mei deselde namme.

Mar, neist de kommandonamme, fereasket dizze metoade dat jo twa parameters ynfiere, de lânkoade en de datum. Dêrnei kontrolearret de bot oft in opjûne dei yn it opjûne lân in wykein, in ferkoarte dei of in wurkdei is neffens de offisjele produksjekalinder.

Om de metoade dy't wy meitsje om ekstra parameters te akseptearjen tegearre mei it kommando, brûk it argumint pass_args = TRUE yn funksje CommandHandler(), en by it meitsjen fan in metoade, neist de fereaske arguminten bot, update meitsje in opsjonele ien - args. De op dizze manier makke metoade akseptearret de parameters dy't jo trochjaan oan de bot nei de kommandonamme. De parameters moatte wurde skieden troch in spaasje se wurde stjoerd nei de metoade as in tekst vector.

Litte wy ús bot lansearje en testen.

In telegrambot skriuwe yn R (diel 2): ​​Kommando-stipe en berjochtfilters tafoegje oan 'e bot

Run de bot op 'e eftergrûn

De lêste stap dy't wy moatte foltôgje is om de bot op 'e eftergrûn te starten.

Om dit te dwaan, folgje it hjirûnder beskreaune algoritme:

  1. Bewarje de botkoade yn in bestân mei de tafoeging R. By it wurkjen yn RStudio wurdt dit dien fia it menu file, team Opslaan as ....
  2. Foegje it paad ta oan 'e bin-map, dy't op syn beurt leit yn 'e map wêryn jo de R-taal ynstalleare, oan 'e Path-fariabele, ynstruksjes hjir.
  3. Meitsje in gewoane teksttriem wêryn 1 rigel skriuwt: R CMD BATCH C:UsersAlseyDocumentsmy_bot.R... Ynstee C:UsersAlseyDocumentsmy_bot.R skriuw it paad nei jo botskript. Tagelyk is it wichtich dat der gjin Syrillyske tekens of spaasjes ûnderweis binne, om't dit kin problemen feroarsaakje by it útfieren fan de bot. Bewarje it, en ferfange syn útwreiding mei txt op bat.
  4. Iepenje Windows Task Scheduler, d'r binne in protte manieren om dit te dwaan, bygelyks elke map iepenje en it adres ynfiere %windir%system32taskschd.msc /s. Oare startmetoaden kinne fûn wurde hjir.
  5. Klikje yn it boppeste menu fan 'e planner op "taak oanmeitsje ...".
  6. Op it ljepblêd "Algemien" jou jo taak in oanpaste namme, en skeakelje de skeakel nei de steat "Rinne foar alle brûkers".
  7. Gean nei it ljepblêd "Aksjes", klikje op "Meitsje". Klikje yn it fjild "Programma of skript" op "Blêdzje", fyn dejinge dy't makke is yn 'e twadde stap bat bestân en klikje op OK.
  8. Klikje op OK en, as it nedich is, fier it wachtwurd yn foar jo bestjoeringssysteemaccount.
  9. Fyn de oanmakke taak yn 'e planner, selektearje it en klikje op de knop "Utfiere" yn 'e rjochter ûnderhoeke.

Us bot rint op 'e eftergrûn en sil wurkje oant jo de taak stopje, of jo PC of server útsette wêrop it waard lansearre.

konklúzje

Yn dit artikel hawwe wy útfûn hoe't jo in folsleine bot skriuwe kinne dy't net allinich berjochten ferstjoere kin, mar ek reagearje op ynkommende berjochten en kommando's. De opdien kennis is al genôch om de measte fan jo problemen op te lossen.

It folgjende artikel sil prate oer hoe't jo in toetseboerd tafoegje oan 'e bot foar handiger wurk.

Ynskriuwe op myn telegram и youtube kanalen.

Boarne: www.habr.com

Add a comment