Po shkruajmë një bot telegram në gjuhën R (pjesa 2): Shtojmë mbështetje për komandat dhe filtrat e mesazheve

publikimi i mëparshëm ne e kuptuam se si të krijojmë një bot, inicializuam një ekzemplar të klasës Bot dhe u njohëm me metodat e dërgimit të mesazheve me të.

Në këtë artikull vazhdoj këtë temë, prandaj rekomandoj të filloni leximin e këtij artikulli vetëm pas leximit pjesës së parë.

Së këtë herë do të kuptojmë se si ta zgjojmë botin tonë dhe do të shtojmë mbështetje për komandat, si dhe do të njohim klasën Updater.

Gjatë artikullit do të shkruajmë disa bota të thjeshta, i fundit do të përcaktojë nëse një ditë në vendin e caktuar sipas datës dhe kodit të vendit është pushim apo ditë pune sipas kalendarit të prodhimit. Por, siç e kemi thënë më parë, qëllimi i artikullit është t'iu njohim me ndërfaqen e paketës telegram.bot për zgjidhjen e detyrave tuaja të veta.

Po shkruajmë një bot telegram në gjuhën R (pjesa 2): Shtojmë mbështetje për komandat dhe filtrat e mesazheve

Të gjithë artikujt e serisë "Po shkruajmë një bot telegram në gjuhën R"

  1. Krijojmë një bot dhe dërgojmë mesazhe me të në telegram
  2. Shtojmë mbështetje për komandat dhe filtrat e mesazheve

Përmbajtja

Nëse jeni të interesuar për analizën e të dhënave, ndoshta do t'ju interesojnë kanalet e mia telegram dhe youtube në të cilat shumica e përmbajtjes është e kushtuar gjuhës R.

  1. Klasa Updater
  2. Handlers — trajnerët
  3. Shtojmë komandën e parë në bot, trajneri i komandave
  4. Trajneri i mesazheve tekstuale dhe filtrat
  5. Shtimi i komandave me parametra
  6. E nisim botin në mënyrë sfondore
  7. Përfundimi

Klasa Updater

Updater — është një klasë që e bën më të lehtë zhvillimin e botit në Telegram, dhe përdor brenda klasën Dispatcher. Qëllimi i klasës Updater është të marrë përditësimet nga boti (në artikullin e kaluar e përdorëm për këtë qëllim metodën getUpdates()), dhe t'i kalojë ato mëtej Dispatcher.

Nga ana e tij Dispatcher përmban trajnerët e krijuar nga ju, dmth. objektet e klasës Handler.

Handlers — trajnerët

Me anë të trajnerëve, ju shtoni në Dispatcher reaksionet e botit ndaj ngjarjeve të ndryshme. Në momentin e shkruar të artikullit, në telegram.bot janë shtuar lloje trajnerësh:

  • MessageHandler — Trajneri i mesazheve
  • CommandHandler — Trajneri i komandave
  • CallbackQueryHandler — Trajneri i të dhënave të dërguara nga tastierat Inline
  • ErrorHandler — Trajneri i gabimeve gjatë kërkesës përditësimi nga boti

Shtojmë komandën e parë në bot, trajneri i komandave

Nëse nuk keni përdorur ndonjëherë botë, dhe nuk e dini se çfarë është një komandë, komandat duhet t'i dërgoni botit me një slash të drejtpërdrejtë / si prefiks.

Do të fillojmë me komandat e thjeshta, dmth. do ta mësojmë botin tonë të përshëndesë me komandë /hi.

Kodi 1: Mësojmë botin të përshëndetet

library(telegram.bot)

# krijojmë një instancë të klasës Updater
updater <- Updater('TOKENI I BOTIT TUAJ')

# Shkruajmë një metodë për përshëndetje
say_hello <- function(bot, update) {

  # Emri i përdoruesit me të cilin duhet të përshëndetet
  user_name <- update$message$from$first_name

  # Dërgimi i mesazhit të përshëndetjes
  bot$sendMessage(update$message$chat_id, 
                  text = paste0("Përshëndetje, ", user_name, "!"), 
                  parse_mode = "Markdown")

}

# krijojmë një trajtues
hi_hendler <- CommandHandler('hi', say_hello)

# shtojmë trajtuesin në menaxherin
updater <- updater + hi_hendler

# nisëm botin
updater$start_polling()

Shkruani shembullin e mësipërm të kodit, duke zëvendësuar ‘TOKENI I BOTIT TUAJ’ me tokenin real që keni marrë kur krijuat botin përmes BotFather (për krijimin e botit kam folur në të parë).

Metoda start_polling() klasës Updater, i cili përdoret në fund të kodit, nis një cikël të pafund të kërkesave dhe përpunimit të përditësimeve nga boti.

Tani hapim Telegramin dhe i shkruajmë botit tonë komandën e parë /hi.

Po shkruajmë një bot telegram në gjuhën R (pjesa 2): Shtojmë mbështetje për komandat dhe filtrat e mesazheve

Tani boti ynë kupton komandën /hi, dhe di të përshëndetet me ne.

Procesi për ndërtimin e një boti të tillë të thjeshtë mund të ilustrohet në mënyrë schematike si vijon.

Po shkruajmë një bot telegram në gjuhën R (pjesa 2): Shtojmë mbështetje për komandat dhe filtrat e mesazheve

  1. Krijojmë një instancë të klasës Updater;
  2. Krijojmë metoda, pra, funksione që do të kryejnë botin tonë. Në shembullin e kodit, kjo është funksioni say_hello(). Funksionet që do të përdoren si metoda të botit duhet të kenë dy argumente obligative — bot dhe update, dhe një argument opsional — args. Argumenti bot, është pika që përfaqëson botin tuaj, me të cilin mund të përgjigjeni në mesazhe, të dërgoni mesazhe ose të përdorni çdo metodë tjetër të disponueshme për botin. Argumenti update është ajo që boti ka marrë nga përdoruesi, në esencë, ajo që në artikullin e parë morëm me anë të metodës getUpdates(). Argumenti args lejon që të përpunoni të dhëna shtesë të dërguara nga përdoruesi së bashku me komandën, për këtë temë do të kthehemi përsëri pak më vonë;
  3. Krijojmë trajtues, pra, lidhim disa veprime të përdoruesit me metodat e krijuara në hapin e kaluar. Në thelb, trajtuesi është një tregues, një ngjarje që aktivizon një funksion të botit. Në shembullin tonë, një tregues i tillë është dërgimi i komandës /hi, dhe realizohet me komandën hi_hendler <- CommandHandler('hi', say_hello). Argumenti i parë i funksionit CommandHandler() lejon që të caktoni komandën, në rastin tonë hi, në të cilën boti do të përgjigjet. Argumenti i dytë lejon të specifikohet metoda e botit, ne do ta thërrasim metodën say_hello, e cila do të ekzekutohet nëse përdoruesi thërret komandën e caktuar në argumentin e parë;
  4. Më pas, e shtojmë trajtuesin e krijuar në menaxherin e instancës sonë të klasës Updater. Trajtuesit mund të shtohen në disa mënyra, në shembullin më sipër kam përdorur atë më të thjeshtin, me anë të shenjës +, pra, updater <- updater + hi_hendler. E njëjta gjë mund të bëhet me anë të metodës add_handler(), e cila i takon klasës Dispatcher, mund ta gjeni këtë metodë kështu: updater$dispatcher$add_handler();
  5. Nisim botin me anë të komandës start_polling().

Trajneri i mesazheve tekstuale dhe filtrat

Si të dërgojmë komanda boti e kuptuam, por ndonjëherë na nevojitet që boti të reagojë jo vetëm ndaj komandave, por edhe ndaj disa mesazheve të zakonshme, tekstuale. Për këtë është e nevojshme të përdoren trajtues të mesazheve — MessageHandler.

Normale MessageHandler do të reagojë ndaj të gjitha mesazheve të ardhshme. Pra, shpesh trajtuesit e mesazheve përdoren së bashku me filtrore. Le të mësojmë botin të përshëndesë jo vetëm me urdhër. /hi, por gjithmonë, kur në mesazhin e dërguar botit ndeshet një nga fjalët e mëposhtme: përshëndetje, salut, hi, bonjour.

Nuk do të shkruajmë metoda të reja për momentin, pasi kemi një metodë me anë të së cilës boti na përshëndet. Ne vetëm duhet të krijojmë filtrin e nevojshëm dhe trajtuesin e mesazheve.

Kodi 2: Shtojmë trajtuesin e mesazheve tekst dhe filtrin

library(telegram.bot)

# krijojmë një instancë të klasës Updater
updater <- Updater('TOKENI I BOTIT TUAJ')

# Shkruajmë metodën për përshëndetje
## komanda e përshëndetjes
say_hello <- function(bot, update) {

  # Emri i përdoruesit me të cilin duhet të përshëndetemi
  user_name <- update$message$from$first_name

  # Dërgojmë mesazhin e përshëndetjes
  bot$sendMessage(update$message$chat_id, 
                  text = paste0("Përshëndetje, ", user_name, "!"),
                  parse_mode = "Markdown",
                  reply_to_message_id = update$message$message_id)

}

# krijojmë filtrat
MessageFilters$hi <- BaseFilter(function(message) {

  # kontrollojmë nëse fjalët përshëndetje: përshëndetje, mirëmëngjes, salut, hi, bonjour ndodhen në tekstin e mesazhit
  grepl(x           = message$text, 
        pattern     = 'përshëndetje|mirëmëngjes|salut|hi|bonjour',
        ignore.case = TRUE)
  }
)

# krijojmë menaxherin 
hi_hendler <- CommandHandler('hi', say_hello) # menaxheri i komandës hi
hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi)

# shtojmë menaxherët në menaxherin
updater <- updater + 
             hi_hendler +
             hi_txt_hnd

# startojmë botin
updater$start_polling()

Shkruani shembullin e mësipërm të kodit, duke zëvendësuar ‘TOKENI I BOTIT TUAJ’ me tokenin real që keni marrë kur krijuat botin përmes BotFather (për krijimin e botit kam folur në të parë).

Tani do të përpiqemi të dërgojmë botit disa mesazhe, në të cilat do të përfshihen fjalët e përshëndetjes të përmendura më parë:
Po shkruajmë një bot telegram në gjuhën R (pjesa 2): Shtojmë mbështetje për komandat dhe filtrat e mesazheve

Pra, së pari e mësuam botin jo vetëm të përshëndesë, por edhe të përgjigjet ndaj përshëndetjes. E bëmë këtë përmes argumentit reply_to_message_id, i cili është i disponueshëm në metodën sendMessage(), në të cilën duhet të kaloni id e mesazhit për të cilin kërkohet përgjigje. Mund të merrni id e mesazhit kështu: update$message$message_id.

Por gjëja më e rëndësishme që kemi bërë është se kemi shtuar një filtrues për botin me funksionin BaseFilter():

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

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

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

)

Siç keni mundur ta vini re, filtrat duhet të shtohen në objektin MessageFilters, i cili fillimisht ka një grup të vogël filtrash të gatshëm. Në shembullin tonë, në objektin MessageFilters ne shtuam elementin hi, ky është një filtrues i ri.

Në funksionin BaseFilter() ju duhet të kaloni një funksion filtrues. Në thelb, filtruesi është thjesht një funksion që merr një instancë të mesazhit dhe kthen TRUE ose FALSE. Në shembullin tonë, ne shkruam një funksion të thjeshtë që me anë të funksionit bazë grepl() kontrollon tekstin e mesazhit, dhe nëse ai përputhet me shprehjen e rregullt përshëndetje|mirëmëngjes|salut|hi|bonjur kthen TRUE.

Pastaj ne krijojmë një pritës mesazhesh hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi). Argumenti i parë i funksionit MessageHandler() — metoda që do të thërrasë pritësin, dhe argumenti i dytë është filtruesi me të cilin ai do të thirret. Në rastin tonë, ky është filtruesi që ne krijuam MessageFilters$hi.

Pra ndaj, ne shtojmë në menaxherin e krijuar vetëm tani, që përpunuesin hi_txt_hnd.

updater <- updater + 
             hi_hendler +
             hi_txt_hnd

Siç kam shpjeguar më lartë, në paketë telegram.bot dhe objekt MessageFilters ka një grup filtrash të встроen, që mund të përdorni:

  • all — Të gjitha mesazhet
  • text — Mesazhet tekstuale
  • command — Komandat, pra, mesazhet që fillojnë me /
  • reply — Mesazhet që janë përgjigje ndaj një mesazhi tjetër
  • audio — Mesazhet që përmbajnë një skedar audio
  • document — Mesazhet me dokumentin e dërguar
  • photo — Mesazhet me imazhet e dërguara
  • sticker — Mesazhet me stickerin e dërguar
  • video — Mesazhet me video
  • voice — Mesazhet me zë
  • contact — Mesazhet që përmbajnë kontaktin e përdoruesit të Telegramit
  • location — Mesazhet me gjeolokacion
  • venue — Mesazhet e përcjella
  • game — Loja

Nëse doni të kombini disa filtrat në një përpunues, thjesht përdorni shenjën | — si logjik OSE, dhe shenjën & si logjik DHE. Për shembull, nëse dëshironi që boti të thërrasë të njëjtin metodë kur merr një video, imazh ose dokument, përdorni shembullin e mëposhtëm për krijimin e një trajtuesi mesazhesh:

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

Shtimi i komandave me parametra

Ne tashmë e dimë se çfarë janë komandat, si t’i krijojmë ato dhe si ta bëjmë botin të ekzekutojë komandën e duhur. Por në disa raste, përveç emrit të komandës, na nevojitet të kalojmë disa të dhëna për realizimin e saj.

Më poshtë është një shembull i një boti, i cili, sipas një date dhe vendi të caktuar, ju kthen llojin e ditës nga kalendari prodhues.

Boti i paraqitur më poshtë përdor API-në e kalendarit prodhues isdayoff.ru.

Kodi 3: Boti që informon sipas datës dhe vendit

library(telegram.bot)

# krijojmë një instancë të klasës Updater
updater <- Updater('1165649194:AAFkDqIzQ6Wq5GV0YU7PmEZcv1gmWIFIB_8')

# Shkruajmë një metodë për përshëndetje
## komanda e përshëndetjes
check_date <- function(bot, update, args) {

  # të dhënat hyrëse
  day     <- args[1]  # data
  country <- args[2]  # vendi

  # kontrolli i parametrave të futur
  if ( !grepl('\d{4}-\d{2}-\d{2}', day) ) {

    # Dërgo tastierë të personalizuar
    bot$sendMessage(update$message$chat_id, 
                    text = paste0(day, " - datë e pavlefshme, ju lutemi shkruani datën në formatin GGGG-MM-DD"),
                    parse_mode = "Markdown")

  } else {
    day <- as.Date(day)
    # e konvertojmë në formatin POSIXtl
    y <- format(day, "%Y")
    m <- format(day, "%m")
    d <- format(day, "%d")

  }

  # vendi për kontroll
  ## kontrollojmë nëse është caktuar vendi
  ## nëse nuk është caktuar, vendosim ru
  if ( ! country %in% c('ru', 'ua', 'by', 'kz', 'us') ) {

    # Dërgo tastierë të personalizuar
    bot$sendMessage(update$message$chat_id, 
                    text = paste0(country, " - kod i pavlefshëm vendi, vlerat e mundshme: ru, by, kz, ua, us. Të dhënat janë të kërkuara për Rusinë."),
                    parse_mode = "Markdown")

    country <- 'ru'

  }

  # kërkesa për të dhëna nga API
  # kompozimi i kërkesës HTTP
  url <- paste0("https://isdayoff.ru/api/getdata?",
                "year=",  y, "&",
                "month=", m, "&",
                "day=",   d, "&",
                "cc=",    country, "&",
                "pre=1&",
                "covid=1")

  # marrim përgjigjen
  res <- readLines(url)

  # interpretimi i përgjigjes
  out <- switch(res, 
                "0"   = "Ditë e punës",
                "1"   = "Ditë jo pune",
                "2"   = "Ditë e shkurtuar e punës",
                "4"   = "covid-19",
                "100" = "Gabim në datë",
                "101" = "Të dhënat nuk u gjetën",
                "199" = "Gabim i shërbimit")

  # dërgojmë mesazhin
  bot$sendMessage(update$message$chat_id, 
                  text = paste0(day, " - ", out),
                  parse_mode = "Markdown")

}

# krijojmë trajtuesin
date_hendler <- CommandHandler('check_date', check_date, pass_args = TRUE)

# shtojmë trajtuesin në menaxher
updater <- updater + date_hendler

# në funksion të botit
updater$start_polling()

Shkruani shembullin e mësipërm të kodit, duke zëvendësuar ‘TOKENI I BOTIT TUAJ’ me tokenin real që keni marrë kur krijuat botin përmes BotFather (për krijimin e botit kam folur në të parë).

Krijuam një robot që ka vetëm një metodë në arsenalin e tij check_date, kjo metodë thirret nga komandë e njëjtë.

Por, përveç emrit të komandës, kjo metodë pret që ju të jepni dy parametra, kodin e vendit dhe datën. Më pas, roboti kontrollon nëse dita e caktuar në vendin e shpallur është një ditë pushimi, një ditë e shkurtuar, ose një ditë pune sipas kalendarit zyrtar të prodhimit.

Për ta bërë metodën që ne po krijojmë të pranojë parametra shtesë me komandën, përdorni argumentin pass_args = TRUE në funksionin CommandHandler(), dhe kur krijoni metodën, përveç argumenteve të detyrueshme bot, update krijoni një opsional — args. Metoda e krijuar kështu do të pranojë parametrat që ju dërgoni robotit pas emrit të komandës. Parametrat duhet të ndahen me një hapësirë, ata do të arrijnë në metodë si një vektor teksti.

Le të fillojmë dhe ta testojmë robotin tonë.

Po shkruajmë një bot telegram në gjuhën R (pjesa 2): Shtojmë mbështetje për komandat dhe filtrat e mesazheve

E nisim botin në mënyrë sfondore

Hapi i fundit që na mbetet të kryejmë — të nisim robotin në mënyrë të fshehtë.

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

  1. Ruani kodin e robotit në një skedar me zgjatjen R. Kur punoni në RStudio, kjo bëhet përmes menusë File, me komandën Save As….
  2. Shtoni rrugën për dosjen bin, e cila ndodhet në dosjen ku keni instaluar gjuhën R në variablin Path, instruksioni këtu.
  3. Krijoni një skedë teksti të zakonshëm, në të cilën shkruani 1 rresht: R CMD BATCH C:UsersAlseyDocumentsmy_bot.R. Në vend të C:UsersAlseyDocumentsmy_bot.R shkruani rrugën për skriptin tuaj të botit. Është e rëndësishme që në rrugë të mos ketë karaktere cirilike dhe hapësira, pasi kjo mund të shkaktojë probleme gjatë nisjes së botit. Ruajeni atë dhe ndryshoni zgjerimin nga txtbat.
  4. Hapni planifikuesin e detyrave Windows, ka shumë mënyra për ta bërë këtë, për shembull hapni çdo dosje dhe në adresë shkruani %windir%system32taskschd.msc /s. Më shumë mënyra për nisjen mund të gjenden këtu.
  5. Në menunë e sipërme të djathtë të planifikuesit, klikoni "Krijo një detyrë…".
  6. Në kartelën "Të përgjithshmet", vendosni një emër të rastësishëm për detyrën tuaj, dhe kaloni kalimin në gjendjen "Të ekzekutohet për të gjithë përdoruesit".
  7. Shkoni te karta "Veprimet", klikoni "Krijo". Në fushën "Programi ose skripti" klikoni "Shfleto", gjeni skedën e krijuar në hapin e dytë bat skedë, dhe klikoni OK.
  8. Klikoni OK, nëse është e nevojshme, futni fjalëkalimin e llogarisë suaj të sistemit operativ.
  9. Gjejmë në planifikues detyrën e krijuar, e selektojmë dhe në këndin e poshtëm të djathtë klikojmë butonin "Kryej".

Boti ynë është i aktivizuar në mënyrë të sfondit dhe do të funksionojë derisa të ndaloni detyrën ose të fikni PC-në ose serverin ku e keni aktivizuar.

Përfundimi

Në këtë artikull kemi shqyrtuar se si të shkruajmë një bot të plotë, i cili jo vetëm që di të dërgojë mesazhe, por gjithashtu reagon ndaj mesazheve dhe komandave që vijnë. Njohuritë e marra janë tashmë të mjaftueshme për të zgjidhur shumicën e detyrave tuaja.

Në artikullin në vazhdim do të flasim për atë se si t'i shtojmë botit një tastierë, për një punë më të lehtë.

Abonohuni në kanalet e mia. telegram dhe youtube kanalet.

Burimi: habr.com

Bli një hosting të besueshëm për faqet me mbrojtje DDoS, VPS VDS serverë 🔥 Bli një hosting të besueshëm për faqet me mbrojtje DDoS, VPS VDS serverë | ProHoster