Shkrimi i një boti telegrami në R (pjesa 2): Shtimi i mbështetjes së komandës dhe filtrave të mesazheve në bot

В publikimi i mëparshëm ne kuptuam se si të krijonim një bot, inicializuam një shembull të klasës Bot dhe u njoh me metodat e dërgimit të mesazheve duke e përdorur atë.

Në këtë artikull unë vazhdoj këtë temë, kështu që ju rekomandoj të filloni ta lexoni këtë artikull vetëm pasi ta keni lexuar Pjesa e parë.

Këtë herë do të kuptojmë se si ta ringjallim botin tonë dhe të shtojmë mbështetje komanduese në të, dhe gjithashtu të njihemi me klasën Updater.

Gjatë rrjedhës së artikullit, ne do të shkruajmë disa bote të thjeshta, këto të fundit, bazuar në një datë të caktuar dhe kodin e shtetit, do të përcaktojnë nëse një ditë në një vend të caktuar është një fundjavë apo një ditë pune sipas kalendarit të prodhimit. Por, si më parë, qëllimi i artikullit është t'ju njohë me ndërfaqen e paketës telegram.bot për të zgjidhur problemet tuaja.

Shkrimi i një boti telegrami në R (pjesa 2): Shtimi i mbështetjes së komandës dhe filtrave të mesazheve në bot

Të gjithë artikujt nga seria "Të shkruajmë një bot telegram në R"

  1. Ne krijojmë një bot dhe e përdorim për të dërguar mesazhe në telegram
  2. Shtoni mbështetjen e komandës dhe filtrat e mesazheve në bot

Përmbajtje

Nëse jeni të interesuar për analizën e të dhënave, mund të jeni të interesuar për mua telegram и youtube kanalet. Pjesa më e madhe e përmbajtjes i kushtohet gjuhës R.

  1. Klasa e përditësuesit
  2. Trajtues - mbajtës
  3. Shtoni komandën e parë te boti, mbajtësi i komandave
  4. Procesori dhe filtrat e mesazheve me tekst
  5. Shtimi i komandave me parametra
  6. Drejtoni robotin në sfond
  7. Përfundim

Klasa e përditësuesit

Updater është një klasë që e bën më të lehtë për ju zhvillimin e një bot telegrami dhe përdor klasën nën kapuç Dispetcher. Detyrë në klasë Updater është të marrësh përditësime nga roboti (në artikullin e mëparshëm kemi përdorur metodën për këtë qëllim getUpdates()), dhe transferojini ato më tej në Dispetcher.

Nga ana e saj Dispetcher përmban mbajtësit që keni krijuar, d.m.th. objektet e klasës Handler.

Trajtues - mbajtës

Me mbajtësit që ju i shtoni Dispetcher reagimet e botit ndaj ngjarjeve të ndryshme. Në kohën e shkrimit të këtij artikulli në telegram.bot Janë shtuar llojet e mëposhtme të mbajtësve:

  • Message Handler - Trajtuesi i mesazheve
  • Command Handler - Trajtues i komandave
  • CallbackQueryHandler - Trajtuesi i të dhënave për tastierat e dërguara nga Inline
  • Error Handler - Trajuesi i gabimeve kur kërkon përditësime nga roboti

Shtoni komandën e parë te boti, mbajtësi i komandave

Nëse nuk keni përdorur kurrë më parë robotë dhe nuk e dini se çfarë është një komandë, atëherë komandat te roboti duhet të dërgohen duke përdorur një prerje përpara / si parashtesë.

Do të fillojmë me komanda të thjeshta, d.m.th. le të mësojmë botin tonë të thotë përshëndetje në komandë /hi.

Kodi 1: Mësimi i robotit të thotë përshëndetje

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

Ekzekutoni shembullin e kodit të mësipërm, pasi të zëvendësoni 'TUAJ BOT TOKEN' me tokenin e vërtetë që keni marrë gjatë krijimit të robotit nëpërmjet BotBabai (Unë fola për krijimin e një roboti në artikulli i parë).

Метод start_polling() klasë Updater, i cili përdoret në fund të kodit, fillon një lak të pafund të kërkesave dhe përpunimit të përditësimeve nga roboti.

Tani le të hapim Telegram dhe të shkruajmë komandën e parë në bot tonë /hi.

Shkrimi i një boti telegrami në R (pjesa 2): Shtimi i mbështetjes së komandës dhe filtrave të mesazheve në bot

Tani boti ynë e kupton komandën /hi, dhe di si të na përshëndesë.

Skematikisht, procesi i ndërtimit të një boti kaq të thjeshtë mund të përshkruhet si më poshtë.

Shkrimi i një boti telegrami në R (pjesa 2): Shtimi i mbështetjes së komandës dhe filtrave të mesazheve në bot

  1. Krijo një shembull të klasës Updater;
  2. Ne krijojmë metoda, d.m.th. funksionet që do të kryejë boti ynë. Në shembullin e kodit ky është një funksion say_hello(). Funksionet që do të përdorni si metoda bot duhet të kenë dy argumente të kërkuara - bot и Përditësimi, dhe një opsionale - harqe. Argument bot, ky është roboti juaj, me ndihmën e tij mund t'u përgjigjeni mesazheve, të dërgoni mesazhe ose të përdorni çdo metodë tjetër të disponueshme për robotin. Argumenti Përditësimi kjo është ajo që mori roboti nga përdoruesi, në fakt, ajo që morëm në artikullin e parë duke përdorur metodën getUpdates(). Argument harqe ju lejon të përpunoni të dhëna shtesë të dërguara nga përdoruesi së bashku me komandën, ne do të kthehemi në këtë temë pak më vonë;
  3. Ne krijojmë mbajtës, d.m.th. Ne i lidhim disa veprime të përdoruesit me metodat e krijuara në hapin e mëparshëm. Në thelb, një mbajtës është një shkas, një ngjarje që thërret disa funksione bot. Në shembullin tonë, një shkas i tillë është dërgimi i një komande /hi, dhe zbatohet nga ekipi hi_hendler <- CommandHandler('hi', say_hello). Argumenti i parë i funksionit CommandHandler() ju lejon të specifikoni një komandë, në rastin tonë hi, të cilit roboti do të përgjigjet. Argumenti i dytë ju lejon të specifikoni metodën bot, ne do ta quajmë metodën say_hello, i cili do të ekzekutohet nëse përdoruesi thërret komandën e specifikuar në argumentin e parë;
  4. Më pas, ne shtojmë mbajtësin e krijuar në dispeçerin e shembullit tonë të klasës Updater. Mund të shtoni mbajtës në disa mënyra; në shembullin e mësipërm, unë përdora më të thjeshtën, duke përdorur shenjën +, dmth updater <- updater + hi_hendler. E njëjta gjë mund të bëhet duke përdorur metodën add_handler(), që i përket klasës Dispatcher, ju mund ta gjeni këtë metodë si kjo: updater$dispatcher$add_handler();
  5. Nisni botin duke përdorur komandën start_polling().

Procesori dhe filtrat e mesazheve me tekst

Ne kuptuam se si t'i dërgojmë komanda bot-it, por ndonjëherë na duhet që roboti t'i përgjigjet jo vetëm komandave, por edhe disa mesazheve të rregullta me tekst. Për ta bërë këtë ju duhet të përdorni mbajtësit e mesazheve − Transportuesi i mesazheve.

Normal Transportuesi i mesazheve do t'i përgjigjet absolutisht të gjitha mesazheve në hyrje. Prandaj, mbajtësit e mesazheve shpesh përdoren së bashku me filtrat. Le ta mësojmë robotin të thotë përshëndetje jo vetëm me komandë /hi, por edhe sa herë që shfaqet një nga fjalët e mëposhtme në mesazhin e dërguar botit: përshëndetje, përshëndetje, përshëndetje, hai, bonjour.

Tani për tani nuk do të shkruajmë asnjë metodë të re, sepse... Ne tashmë kemi një metodë me të cilën roboti na përshëndet. Gjithçka që duhet të bëjmë është të krijojmë filtrin e kërkuar dhe mbajtësin e mesazheve.

Kodi 2: Shtoni një mbajtës dhe filtër të mesazheve me tekst

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

Ekzekutoni shembullin e kodit të mësipërm, pasi të zëvendësoni 'TUAJ BOT TOKEN' me tokenin e vërtetë që keni marrë gjatë krijimit të robotit nëpërmjet BotBabai (Unë fola për krijimin e një roboti në artikulli i parë).

Tani le të përpiqemi t'i dërgojmë robotit disa mesazhe që përmbajnë fjalët përshëndetëse të renditura më parë:
Shkrimi i një boti telegrami në R (pjesa 2): Shtimi i mbështetjes së komandës dhe filtrave të mesazheve në bot

Pra, para së gjithash, ne i mësuam robotit jo vetëm të përshëndes, por t'i përgjigjet një përshëndetjeje. Ne e bëmë këtë duke përdorur argumentin reply_to_message_id, e cila është e disponueshme në metodë sendMessage(), në të cilën duhet të transferoni ID-në e mesazhit të cilit dëshironi t'i përgjigjeni. Ju mund ta merrni ID-në e mesazhit si kjo: update$message$message_id.

Por gjëja kryesore që bëmë ishte shtimi i një filtri në bot duke përdorur funksionin BaseFilter():

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

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

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

)

Siç mund ta keni vënë re, filtrat duhet të shtohen në objekt Filtrat e mesazheve, i cili fillimisht tashmë përmban një grup të vogël filtrash të gatshëm. Në shembullin tonë, tek objekti Filtrat e mesazheve kemi shtuar një element hi, ky është një filtër i ri.

Në funksion BaseFilter() ju duhet të kaloni funksionin e filtrit. Në thelb, një filtër është vetëm një funksion që merr një shembull mesazhi dhe kthehet TRUE ose I RREMË. Në shembullin tonë, ne kemi shkruar një funksion të thjeshtë që, duke përdorur funksionin bazë grepl() kontrollon tekstin e mesazhit dhe nëse përputhet me shprehjen e rregullt привет|здравствуй|салют|хай|бонжур kthehet TRUE.

Më pas krijojmë një mbajtës mesazhesh hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi). Argumenti i parë i funksionit MessageHandler() është metoda që do të thërrasë mbajtësin, dhe argumenti i dytë është filtri me të cilin do të thirret. Në rastin tonë, ky është filtri që kemi krijuar MessageFilters$hi.

Epo, në fund, ne i shtojmë dispeçerit mbajtësin e krijuar hi_txt_hnd.

updater <- updater + 
             hi_hendler +
             hi_txt_hnd

Siç kam shkruar më lart, në paketë telegram.bot dhe objekt Filtrat e mesazheve Ekziston tashmë një grup filtrash të integruar që mund të përdorni:

  • të gjitha — Të gjitha mesazhet
  • tekst — Mesazhe me tekst
  • komanda - Komandat, d.m.th. mesazhet që fillojnë me /
  • përgjigje — Mesazhet që janë përgjigje ndaj një mesazhi tjetër
  • audio — Mesazhe që përmbajnë një skedar audio
  • dokument - Mesazhe me një dokument të dërguar
  • foto - Mesazhe me imazhe të dërguara
  • ngjitëse — Mesazhe me një ngjitëse të dërguar
  • video — Mesazhe me video
  • zë - Mesazhe zanore
  • kontakt - Mesazhe që përmbajnë përmbajtjen e telegramit të përdoruesit
  • vendndodhja — Mesazhet me vendndodhjen gjeografike
  • vendi - Mesazhet e përcjella
  • lojë - lojëra

Nëse dëshironi të kombinoni disa filtra në një mbajtës, thjesht përdorni shenjën | - si logjike OR, dhe nënshkruani & si logjike И. Për shembull, nëse dëshironi që roboti të thërrasë të njëjtën metodë kur merr një video, imazh ose dokument, përdorni shembullin e mëposhtëm për të krijuar një mbajtës mesazhesh:

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

Shtimi i komandave me parametra

Ne tashmë e dimë se cilat janë komandat, si t'i krijojmë ato dhe si ta detyrojmë robotin të ekzekutojë komandën e dëshiruar. Por në disa raste, përveç emrit të komandës, duhet të kalojmë disa të dhëna për ta ekzekutuar atë.

Më poshtë është një shembull i një roboti që, duke pasur parasysh një datë dhe shtet të caktuar, ju kthen llojin e ditës nga kalendari i prodhimit.

Roboti më poshtë përdor API-në e kalendarit të prodhimit isdayoff.ru.

Kodi 3: Bot që raporton sipas datës dhe vendit

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

Ekzekutoni shembullin e kodit të mësipërm, pasi të zëvendësoni 'TUAJ BOT TOKEN' me tokenin e vërtetë që keni marrë gjatë krijimit të robotit nëpërmjet BotBabai (Unë fola për krijimin e një roboti në artikulli i parë).

Ne krijuam një robot që ka vetëm një metodë në arsenalin e tij check_date, kjo metodë quhet me komandën me të njëjtin emër.

Por, përveç emrit të komandës, kjo metodë kërkon që të futni dy parametra, kodin e shtetit dhe datën. Më pas, roboti kontrollon nëse një ditë e caktuar në vendin e specifikuar është një fundjavë, një ditë e shkurtuar ose një ditë pune sipas kalendarit zyrtar të prodhimit.

Në mënyrë që metoda që krijojmë të pranojë parametra shtesë së bashku me komandën, përdorni argumentin pass_args = TRUE në funksion CommandHandler(), dhe kur krijoni një metodë, përveç argumenteve të kërkuara bot, Përditësimi krijoni një opsionale - harqe. Metoda e krijuar në këtë mënyrë do të pranojë parametrat që i kaloni botit pas emrit të komandës. Parametrat duhet të ndahen me një hapësirë; ato do të dërgohen në metodë si një vektor teksti.

Le të nisim dhe testojmë botin tonë.

Shkrimi i një boti telegrami në R (pjesa 2): Shtimi i mbështetjes së komandës dhe filtrave të mesazheve në bot

Drejtoni robotin në sfond

Hapi i fundit që duhet të përfundojmë është të lëshojmë bot-in në sfond.

Për ta bërë këtë, ndiqni algoritmin e përshkruar më poshtë:

  1. Ruani kodin bot në një skedar me shtesën R. Kur punoni në RStudio, kjo bëhet përmes menysë Skedar, ekip Ruaj si ....
  2. Shtoni shtegun në dosjen bin, e cila nga ana tjetër ndodhet në dosjen në të cilën keni instaluar gjuhën R, në variablin Path, udhëzime këtu.
  3. Krijoni një skedar teksti të rregullt në të cilin shkruani 1 rresht: R CMD BATCH C:UsersAlseyDocumentsmy_bot.R... Në vend të kësaj C:UsersAlseyDocumentsmy_bot.R shkruani shtegun për skriptin tuaj të botit. Në të njëjtën kohë, është e rëndësishme që gjatë rrugës të mos ketë karaktere cirilike ose hapësira, sepse kjo mund të shkaktojë probleme gjatë ekzekutimit të robotit. Ruajeni atë dhe zëvendësoni zgjerimin e tij me txt mbi bat.
  4. Hapni Windows Task Scheduler, ka shumë mënyra për ta bërë këtë, për shembull, hapni çdo dosje dhe futni adresën %windir%system32taskschd.msc /s. Mund të gjenden metoda të tjera të nisjes këtu.
  5. Në menunë e sipërme djathtas të planifikuesit, klikoni "Krijo detyrë...".
  6. Në skedën "Të përgjithshme", jepni detyrës tuaj një emër të personalizuar dhe kaloni çelësin në gjendjen "Run për të gjithë përdoruesit".
  7. Shkoni te skedari "Veprimet", klikoni "Krijo". Në fushën "Programi ose skenari", klikoni "Shfleto", gjeni atë të krijuar në hapin e dytë bat skedar dhe klikoni OK.
  8. Klikoni OK dhe, nëse është e nevojshme, futni fjalëkalimin për llogarinë tuaj të sistemit operativ.
  9. Gjeni detyrën e krijuar në planifikuesin, zgjidhni atë dhe klikoni butonin "Run" në këndin e poshtëm të djathtë.

Boti ynë funksionon në sfond dhe do të funksionojë derisa të ndaloni detyrën ose të fikni kompjuterin ose serverin tuaj në të cilin është nisur.

Përfundim

Në këtë artikull, ne kuptuam se si të shkruajmë një bot të plotë që jo vetëm që mund të dërgojë mesazhe, por edhe t'u përgjigjet mesazheve dhe komandave në hyrje. Njohuritë e marra tashmë janë të mjaftueshme për të zgjidhur shumicën e problemeve tuaja.

Artikulli tjetër do të flasë se si të shtoni një tastierë në bot për punë më të përshtatshme.

Regjistrohu në tim telegram и youtube kanalet.

Burimi: www.habr.com

Shto një koment