Telegrammas robota rakstīšana programmā R (2. daļa): komandu atbalsta un ziņojumu filtru pievienošana robotam

В iepriekšējā publikācija mēs izdomājām, kā izveidot robotprogrammatūru, inicializējām klases gadījumu Bot un iepazinās ar ziņu sūtīšanas metodēm, izmantojot to.

Šajā rakstā es turpinu šo tēmu, tāpēc iesaku sākt lasīt šo rakstu tikai pēc izlasīšanas pirmā daļa.

Šoreiz izdomāsim kā atdzīvināt mūsu botu un pievienot tam komandu atbalstu, kā arī iepazīsimies ar klasi Updater.

Raksta gaitā mēs uzrakstīsim vairākus vienkāršus botus, pēdējie, pamatojoties uz doto datumu un valsts kodu, noteiks, vai diena konkrētajā valstī ir nedēļas nogale vai darba diena saskaņā ar ražošanas kalendāru. Bet, tāpat kā iepriekš, raksta mērķis ir iepazīstināt jūs ar pakotnes saskarni telegram.bot lai atrisinātu savas problēmas.

Telegrammas robota rakstīšana programmā R (2. daļa): komandu atbalsta un ziņojumu filtru pievienošana robotam

Visi raksti no sērijas “Telegrammas robota rakstīšana R”

  1. Mēs izveidojam robotu un izmantojam to ziņojumu sūtīšanai telegrammā
  2. Pievienojiet robotam komandu atbalstu un ziņojumu filtrus

saturs

Ja jūs interesē datu analīze, jūs varētu interesēt mana telegramma и youtube kanāliem. Lielākā daļa satura ir veltīta R valodai.

  1. Atjauninātāja klase
  2. Hendleri - hendleri
  3. Pievienojiet pirmo komandu robotam, komandu apstrādātājam
  4. Īsziņu procesors un filtri
  5. Komandu pievienošana ar parametriem
  6. Palaidiet botu fonā
  7. Secinājums

Atjauninātāja klase

Updater ir klase, kas atvieglo telegrammas robota izstrādi un izmanto klasi, kas atrodas zem pārsega Dispetcher. Klases uzdevums Updater ir saņemt atjauninājumus no robotprogrammatūras (iepriekšējā rakstā mēs izmantojām šo metodi šim nolūkam getUpdates()), un pārsūtiet tos tālāk uz Dispetcher.

Savukārt Dispetcher satur jūsu izveidotos apdarinātājus, t.i. klases objekti Handler.

Hendleri - hendleri

Ar apstrādātājiem, kuriem pievienojat Dispetcher robotu reakcijas uz dažādiem notikumiem. Šī raksta rakstīšanas laikā telegram.bot Ir pievienoti šādi apstrādātāju veidi:

  • MessageHandler — ziņojumu apstrādātājs
  • CommandHandler — komandu apstrādātājs
  • CallbackQueryHandler — datu apstrādātājs tastatūrām, kas nosūtītas no Inline
  • ErrorHandler — kļūdu apstrādātājs, pieprasot atjauninājumus no robotprogrammatūras

Pievienojiet pirmo komandu robotam, komandu apstrādātājam

Ja jūs nekad iepriekš neesat izmantojis botus un nezināt, kas ir komanda, komandas robotam ir jānosūta, izmantojot slīpsvītru / kā prefiksu.

Sāksim ar vienkāršām komandām, t.i. iemācīsim savam robotam sasveicināties pēc komandas /hi.

1. kods: iemācīt robotam sveikt

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

Palaidiet iepriekš norādīto koda piemēru pēc tam, kad esat aizstājis 'YOUR BOOT TOKEN' ar īsto marķieri, ko saņēmāt, veidojot robotu, izmantojot BotFather (Es runāju par robota izveidi pirmais raksts).

Metode start_polling() klase Updater, kas tiek izmantots koda beigās, sāk bezgalīgu atjauninājumu pieprasīšanas un apstrādes cilpu no robotprogrammatūras.

Tagad atveram Telegram un ierakstīsim pirmo komandu mūsu robotam /hi.

Telegrammas robota rakstīšana programmā R (2. daļa): komandu atbalsta un ziņojumu filtru pievienošana robotam

Tagad mūsu robots saprot komandu /hi, un zina, kā mūs apsveikt.

Shematiski šāda vienkārša robotprogrammatūras izveides procesu var attēlot šādi.

Telegrammas robota rakstīšana programmā R (2. daļa): komandu atbalsta un ziņojumu filtru pievienošana robotam

  1. Izveidojiet klases gadījumu Updater;
  2. Veidojam metodes, t.i. funkcijas, kuras veiks mūsu robots. Koda piemērā šī ir funkcija say_hello(). Funkcijām, kuras izmantosit kā bot metodes, ir jābūt diviem obligātajiem argumentiem - cērme и atjaunināšanaun viens pēc izvēles - args. Arguments cērme, tas ir jūsu robots, ar tā palīdzību jūs varat atbildēt uz ziņojumiem, sūtīt ziņojumus vai izmantot citas robotam pieejamās metodes. Arguments atjaunināšana tas ir tas, ko robots saņēma no lietotāja, patiesībā to, ko mēs saņēmām pirmajā rakstā, izmantojot metodi getUpdates(). Arguments args ļauj apstrādāt papildu datus, ko lietotājs nosūtījis kopā ar komandu, pie šīs tēmas atgriezīsimies nedaudz vēlāk;
  3. Veidojam hendlerus, t.i. Dažas lietotāja darbības mēs saistām ar metodēm, kas izveidotas iepriekšējā darbībā. Būtībā apdarinātājs ir trigeris, notikums, kas izsauc kādu robota funkciju. Mūsu piemērā šāds trigeris ir komandas nosūtīšana /hi, un to ievieš komanda hi_hendler <- CommandHandler('hi', say_hello). Pirmā funkcijas arguments CommandHandler() ļauj norādīt komandu, mūsu gadījumā hi, uz kuru robots atbildēs. Otrais arguments ļauj norādīt bot metodi, mēs izsauksim metodi say_hello, kas tiks izpildīts, ja lietotājs izsauc pirmajā argumentā norādīto komandu;
  4. Tālāk mēs pievienojam izveidoto apdarinātāju mūsu klases instances dispečeram Updater. Apdarinātājus var pievienot vairākos veidos; iepriekš minētajā piemērā es izmantoju vienkāršāko, izmantojot zīmi +t.i. updater <- updater + hi_hendler. To pašu var izdarīt, izmantojot metodi add_handler(), kas pieder klasei Dispatcher, jūs varat atrast šo metodi šādi: updater$dispatcher$add_handler();
  5. Palaidiet botu, izmantojot komandu start_polling().

Īsziņu procesors un filtri

Mēs izdomājām, kā nosūtīt komandas robotam, taču dažreiz mums ir nepieciešams, lai robots reaģētu ne tikai uz komandām, bet arī uz dažām parastajām īsziņām. Lai to izdarītu, jums jāizmanto ziņojumu apstrādātāji − Message Handler.

Normāls Message Handler atbildēs uz pilnīgi visiem ienākošajiem ziņojumiem. Tāpēc ziņojumu apstrādātājus bieži izmanto kopā ar filtriem. Iemācīsim botam sveicināties ne tikai pēc komandas /hi, bet arī ikreiz, kad robotam nosūtītajā ziņojumā parādās kāds no šiem vārdiem: hello, hello, salute, hai, bonjour.

Pagaidām jaunas metodes nerakstīsim, jo... Mums jau ir metode, ar kuras palīdzību bots mūs sveicina. Viss, kas mums jādara, ir izveidot nepieciešamo filtru un ziņojumu apstrādātāju.

2. kods: pievienojiet īsziņu apstrādātāju un filtru

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

Palaidiet iepriekš norādīto koda piemēru pēc tam, kad esat aizstājis 'YOUR BOOT TOKEN' ar īsto marķieri, ko saņēmāt, veidojot robotu, izmantojot BotFather (Es runāju par robota izveidi pirmais raksts).

Tagad mēģināsim nosūtīt robotam vairākus ziņojumus, kas satur iepriekš uzskaitītos apsveikuma vārdus:
Telegrammas robota rakstīšana programmā R (2. daļa): komandu atbalsta un ziņojumu filtru pievienošana robotam

Tātad, pirmkārt, mēs iemācījām botam ne tikai sveikt, bet arī atbildēt uz sveicienu. Mēs to izdarījām, izmantojot argumentu reply_to_message_id, kas ir pieejama metodē sendMessage(), kurā jums jāpārsūta tā ziņojuma ID, uz kuru vēlaties atbildēt. Ziņojuma ID var iegūt šādi: update$message$message_id.

Bet galvenais, ko darījām, bija robotam, izmantojot funkciju, pievienojot filtru BaseFilter():

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

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

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

)

Kā jūs, iespējams, pamanījāt, objektam ir jāpievieno filtri Ziņojumu filtri, kas sākotnēji jau satur nelielu gatavu filtru komplektu. Mūsu piemērā uz objektu Ziņojumu filtri mēs pievienojām elementu hi, šis ir jauns filtrs.

Funkcijā BaseFilter() jums ir jāiziet filtra funkcija. Būtībā filtrs ir tikai funkcija, kas saņem ziņojuma gadījumu un atgriež TRUE vai FALSE. Mūsu piemērā mēs uzrakstījām vienkāršu funkciju, kas, izmantojot pamatfunkciju grepl() pārbauda ziņojuma tekstu un to, vai tas atbilst regulārajai izteiksmei привет|здравствуй|салют|хай|бонжур atgriežas TRUE.

Tālāk mēs izveidojam ziņojumu apstrādātāju hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi). Pirmā funkcijas arguments MessageHandler() ir metode, kas izsauks apdarinātāju, un otrais arguments ir filtrs, ar kuru tas tiks izsaukts. Mūsu gadījumā šis ir mūsu izveidotais filtrs MessageFilters$hi.

Nu, beigās mēs pievienojam dispečeram izveidoto apstrādātāju hi_txt_hnd.

updater <- updater + 
             hi_hendler +
             hi_txt_hnd

Kā jau rakstīju iepriekš, iepakojumā telegram.bot un iebilst Ziņojumu filtri Jau ir iebūvētu filtru komplekts, ko varat izmantot:

  • visas — visas ziņas
  • text — Īsziņas
  • pavēle ​​— Komandas, t.i. ziņas, kas sākas ar /
  • atbilde — ziņas, kas ir atbilde uz citu ziņu
  • audio — ziņas, kas satur audio failu
  • dokuments — ziņojumi ar nosūtītu dokumentu
  • foto — ziņas ar nosūtītajiem attēliem
  • uzlīme — ziņas ar nosūtītu uzlīmi
  • video — ziņas ar video
  • balss — balss ziņas
  • kontakts — ziņojumi, kas satur lietotāja telegrammas saturu
  • atrašanās vieta — ziņojumi ar ģeogrāfisko atrašanās vietu
  • vieta — pārsūtītās ziņas
  • spēle — spēles

Ja vēlaties apvienot dažus filtrus vienā apdarinātājā, vienkārši izmantojiet zīmi | - kā loģisks VAI, un parakstieties & kā loģiski И. Piemēram, ja vēlaties, lai robots, saņemot video, attēlu vai dokumentu, izsauktu to pašu metodi, izmantojiet šo piemēru, lai izveidotu ziņojumu apstrādātāju:

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

Komandu pievienošana ar parametriem

Mēs jau zinām, kas ir komandas, kā tās izveidot un kā piespiest robotu izpildīt vēlamo komandu. Bet dažos gadījumos papildus komandas nosaukumam mums ir jānodod daži dati, lai to izpildītu.

Tālāk ir parādīts robota piemērs, kas, ņemot vērā norādīto datumu un valsti, atgriež dienas veidu no ražošanas kalendāra.

Tālāk esošais robots izmanto ražošanas kalendāra API isdayoff.ru.

3. kods: robots, kas ziņo pēc datuma un valsts

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

Palaidiet iepriekš norādīto koda piemēru pēc tam, kad esat aizstājis 'YOUR BOOT TOKEN' ar īsto marķieri, ko saņēmāt, veidojot robotu, izmantojot BotFather (Es runāju par robota izveidi pirmais raksts).

Mēs izveidojām robotu, kura arsenālā ir tikai viena metode check_date, šo metodi izsauc tāda paša nosaukuma komanda.

Bet papildus komandas nosaukumam, izmantojot šo metodi, ir jāievada divi parametri, valsts kods un datums. Pēc tam robots pārbauda, ​​vai konkrētā diena norādītajā valstī ir nedēļas nogale, saīsināta diena vai darba diena saskaņā ar oficiālo ražošanas kalendāru.

Lai mūsu izveidotā metode kopā ar komandu pieņemtu papildu parametrus, izmantojiet argumentu pass_args = TRUE funkcijā CommandHandler(), un, veidojot metodi, papildus nepieciešamajiem argumentiem cērme, atjaunināšana izveidot neobligātu - args. Šādā veidā izveidotā metode pieņems parametrus, kurus jūs nododat robotam pēc komandas nosaukuma. Parametri ir jāatdala ar atstarpi; tie tiks nosūtīti metodei kā teksta vektors.

Palaidīsim un pārbaudīsim mūsu robotprogrammatūru.

Telegrammas robota rakstīšana programmā R (2. daļa): komandu atbalsta un ziņojumu filtru pievienošana robotam

Palaidiet botu fonā

Pēdējais solis, kas mums jāveic, ir bota palaišana fonā.

Lai to izdarītu, izpildiet tālāk aprakstīto algoritmu:

  1. Saglabājiet bota kodu failā ar paplašinājumu R. Strādājot programmā RStudio, tas tiek darīts, izmantojot izvēlni fileja, komanda Saglabāt kā.
  2. Pievienojiet ceļu uz mapi bin, kas savukārt atrodas mapē, kurā instalējāt R valodu, mainīgajam Ceļš, instrukcijas šeit.
  3. Izveidojiet parastu teksta failu, kurā ierakstiet 1 rindiņu: R CMD BATCH C:UsersAlseyDocumentsmy_bot.R. Tā vietā, lai C:UsersAlseyDocumentsmy_bot.R uzrakstiet ceļu uz robota skriptu. Tajā pašā laikā ir svarīgi, lai ceļā nebūtu kirilicas rakstzīmju vai atstarpju, jo tas var radīt problēmas, palaižot robotu. Saglabājiet to un aizstājiet tā paplašinājumu ar txt par bat.
  4. Atveriet Windows uzdevumu plānotāju, ir daudz veidu, kā to izdarīt, piemēram, atveriet jebkuru mapi un ievadiet adresi %windir%system32taskschd.msc /s. Var atrast citas palaišanas metodes šeit.
  5. Plānotāja augšējā labajā izvēlnē noklikšķiniet uz "Izveidot uzdevumu...".
  6. Cilnē "Vispārīgi" piešķiriet savam uzdevumam pielāgotu nosaukumu un pārslēdziet slēdzi uz stāvokli "Palaist visiem lietotājiem".
  7. Dodieties uz cilni "Darbības", noklikšķiniet uz "Izveidot". Laukā "Programma vai skripts" noklikšķiniet uz "Pārlūkot", atrodiet otrajā darbībā izveidoto bat failu un noklikšķiniet uz Labi.
  8. Noklikšķiniet uz Labi un, ja nepieciešams, ievadiet sava operētājsistēmas konta paroli.
  9. Atrodiet izveidoto uzdevumu plānotājā, atlasiet to un noklikšķiniet uz pogas “Palaist” apakšējā labajā stūrī.

Mūsu robots darbojas fonā un darbosies līdz brīdim, kad apturēsit uzdevumu vai izslēgsit datoru vai serveri, kurā tas tika palaists.

Secinājums

Šajā rakstā mēs izdomājām, kā uzrakstīt pilnvērtīgu robotu, kas var ne tikai nosūtīt ziņojumus, bet arī atbildēt uz ienākošajiem ziņojumiem un komandām. Iegūtās zināšanas jau ir pietiekamas, lai atrisinātu lielāko daļu jūsu problēmu.

Nākamajā rakstā tiks runāts par to, kā botam pievienot tastatūru ērtākam darbam.

Abonējiet manu telegramma и youtube kanālus.

Avots: www.habr.com

Pievieno komentāru