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

Në publikimit të mëparshëm ne e kuptuam se si të krijojmë një bot, e inicializuam një shembull klase Bot dhe u familiarizuam me mënyrat e dërgimit të mesazheve me ndihmën e tij.

Në këtë artikull po vazhdoj këtë temë, prandaj rekomandoj të filloni leximin e këtij artikulli vetëm pasi të keni lexuar pjesën e parë.

Tani ne do të shqyrtojmë se si ta ngjallim botin tonë dhe do t'i shtojmë atij mbështetje për komanda, si dhe do të njiheni me klasën Updater.

Gjatë artikullit do të shkruajmë disa bota të thjeshta, të fundit do të përcaktojë nëse një ditë në këtë vend është pushim apo punë sipas kalendarit të prodhimit, por, siç ndodhi më parë, qëllimi i artikullit është të ju njoh me ndërfaqen e paketës telegram.bot për zgjidhjen e detyrave tuaja.

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

Të gjitha artikujt nga seria "Shkruajmë bota në telegram me gjuhën R"

  1. Krijojmë botën dhe dërgojmë mesazhe përmes saj në telegram
  2. Shtojmë mbështetje për komanda dhe filtrojmë mesazhet

Përmbajtja

Nëse jeni të interesuar për analizën e të dhënave, ndoshta do t'ju interesojnë kanalet e mia në telegram dhe youtube Shumica e përmbajtjes së të cilave i kushtohet gjuhës R.

  1. Klasa Updater
  2. Handlers — përpunuesit
  3. Shtojmë komandën e parë në bot, përpunuesin e komandave
  4. Përpunuesi i mesazheve tekstuale dhe filtrat
  5. Shtimi i komandave me parametra
  6. Nisim botin në modalitetin e prapavijës
  7. Përfundim

Klasa Updater

Updater — kjo është klasa që ju lehtëson zhvillimin e botit të Telegram-it dhe përdor në sfond klasën Dispetcher. Qëllimi i klasës Updater është që të marrë azhurnimet nga boti (në artikullin e mëparshëm ne përdorëm për këtë qëllim metodën getUpdates()), dhe t'i kalojmë ato më tej në Dispetcher.

Nga ana tjetër Dispetcher përmban përpunuesit që keni krijuar, dmth objektet e klasës Handler.

Handlers — përpunuesit

Me ndihmën e përpunuesve, ju shtoni në Dispetcher reaksionet e botit ndaj ngjarjeve të ndryshme. Në momentin e shkrimit të artikullit, në telegram.bot janë shtuar llojet e mëposhtme të përpunuesve:

  • MessageHandler — Përpunuesi i mesazheve
  • CommandHandler — Përpunuesi i komandave
  • CallbackQueryHandler — Përpunuesi i të dhënave të dërguara nga tastierat Inline
  • ErrorHandler — Përpunuesi i gabimeve gjatë kërkimit të azhurnimeve nga boti

Shtojmë komandën e parë në bot, përpunuesin e komandave

Nëse nuk keni përdorur kurrë bota dhe nuk jeni të njohur se çfarë është një komandë, komandat duhet t'i dërgoni botit me një slash të drejtpërdrejtë / si prefiks.

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

Kod 1: Mësojmë botin të përshëndesë

library(telegram.bot)

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

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

  # Emri i përdoruesit që 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("Të nderuar, ", user_name, "!"), 
                  parse_mode = "Markdown")

}

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

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

# fillojmë botin
updater$start_polling()

Ekzekutoni shembullin e kodit të mësipërm duke zëvendësuar ‘TOKENI JUAJ I BOTIT’ me tokenin e vërtetë që keni marrë gjatë krijimit të botit përmes BotFather (për krijimin e botit kam folur në artikullin e parë).

Sanitizer.replaceElementWithChildren() start_polling() klasës Updater, e cila përdoret në fund të kodit, aktivizon një cikël të pafund të kërkesash 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 për 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ë na përshëndesë.

Në mënyrë që procesi i ndërtimit të këtij boti të thjeshtë të paraqitet, mund ta ilustrojmë si më poshtë.

Po shkruajmë një bot për 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ë metodat, dmth. funksionet që do të realizojë boti ynë. Në shembullin e kodit, kjo është funksioni say_hello(). Funksionet që do të përdorni si metoda të botit duhet të kenë dy argumente të detyrueshme — bot dhe përditësim, dhe një të opsional — args. Argumenti bot, është boti juaj, me ndihmën e tij mund të përgjigjeni ndaj mesazheve, të dërgoni mesazhe, ose të përdorni çdo metodë tjetër të disponueshme për botin. Argumenti përditësim është ajo që boti ka marrë nga përdoruesi, në thelb, ajo që në artikullin e parë ne e morëm me metodën 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ë ne do të kthehemi pak më vonë;
  3. Krijojmë trajtuesit, dmth. lidhemi me disa veprime të përdoruesit me metodat e krijuara në hapin e kaluar. Në thelb, një trajtues është një trigger, një ngjarje që shkakton një funksion të botit. Në shembullin tonë, një trigger 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 të përcaktoni komandën, në rastin tonë hi, për të cilën boti do të reagojë. Argumenti i dytë lejon të përcaktoni metodën e botit, do të thërrasim metodën say_hello, i cili do të ekzekutohet nëse përdoruesi thërret komandën eSpecified në argumentin e parë;
  4. Më pas, shtojmë trajtuesin e krijuar në menaxherin e ekzemplarit tonë të klasës Updater. Trajtuesit mund të shtohen në disa mënyra, në shembullin e mësipërm përdora mënyrën më të thjeshtë, me anë të shenjës +, dmth. updater <- updater + hi_hendler. E njëjta gjë mund të bëhet me metodën add_handler(), e cila i përket klasës Dispatcher, këtë metodë mund ta gjejmë kështu: updater$dispatcher$add_handler();
  5. Nisim botin me komandën start_polling().

Përpunuesi i mesazheve tekstuale dhe filtrat

Si të dërgojmë komanda në botin mësuam, por ndonjëherë na kërkohet që boti të reagojë jo vetëm në komanda, por edhe në disa mesazhe të zakonshme, tekstuale. Për këtë, është e nevojshme të përdoren trajtuesit e mesazheve — MessageHandler.

Zakonisht MessageHandler do të reagojë në të gjitha mesazhet që hyjnë. Prandaj, shpesh trajtuesit e mesazheve përdoren së bashku me filtrat. Le të mësojmë botin të përshëndesë jo vetëm me komandën /hi, por gjithashtu gjithmonë kur në mesazhin e dërguar në bot përmban një nga këto fjalë: Përshëndetje, Mirëdita, Salute, Hi, Bonjour.

Për momentin nuk do të shkruajmë ndonjë metodë të re, pasi kemi një metodë me anë të cilës boti na përshëndet. Nga ne kërkohet vetëm të krijojmë filtrin e nevojshëm dhe trajtuesin e mesazheve.

Kodi 2: Shtoni trajtuesin e mesazheve tekstuale dhe filtrin

library(telegram.bot)

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

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

  # Emri i përdoruesit me të cilin duam të përshëndetem
  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 në tekstin e mesazhit paraqiten fjalët: Përshëndetje, Mirëdita, Salute, Hi, Bonjour
  grepl(x           = message$text, 
        pattern     = 'përshëndetje|mirëdita|salute|hi|bonjour',
        ignore.case = TRUE)
  }
)

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

# shtojmë trajtuesit në menaxher
updater <- updater + 
             hi_hendler +
             hi_txt_hnd

# nisim botin
updater$start_polling()

Ekzekutoni shembullin e kodit të mësipërm duke zëvendësuar ‘TOKENI JUAJ I BOTIT’ me tokenin e vërtetë që keni marrë gjatë krijimit të botit përmes BotFather (për krijimin e botit kam folur në artikullin e parë).

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

Kështu, së pari ne e mësuam botin jo vetëm të përshëndetet, por edhe të përgjigjet në përshëndetje. Këtë e realizuam përmes argumentit reply_to_message_id, i cili është i disponueshëm në metodën sendMessage(), në të cilën duhet të dërgohet ID e mesazhit në të cilin dëshirohet të përgjigjemi. Mund ta marrim ID-në e mesazhit kështu: update$message$message_id.

Por e rëndësishmja, ajo që bëmë — shtuam një filtrinë në bot përmes funksionit 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ë 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ë filtër i ri.

Në funksion BaseFilter() ju duhet të kaloni funksionin e filtrimit. Në thelb, një filtër — është thjesht një funksion, që merr një instancë mesazhi dhe kthen TRUE ose FALSE. Në shembullin tonë, ne shkruam një funksion të thjeshtë, i cili me ndihmën e funksionit bazë grepl() kontrollon tekstin e mesazhit, dhe nëse përputhet me shprehjen e përhershme përshëndetje|mirë se vini|sallut|hej|bonjur false, nëse elementi që do të zëvendësohet është TRUE.

Më pas ne krijojmë një trajtues mesazhesh hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi). Argumenti i parë i funksionit MessageHandler() — metoda që do të thërrasë trajtuesin, dhe argumenti i dytë — është filtër sipas të cilit do të thërritet. Në rastin tonë ky është filtri i krijuar prej nesh MessageFilters$hi.

Dhe në fund, ne shtojmë në menaxher trajtuesin që sapo krijuam hi_txt_hnd.

updater <- updater + 
             hi_hendler +
             hi_txt_hnd

Siç kam shkruar më sipër, në paketën telegram.bot dhe objektin MessageFilters ka një grup filtrash të integruar që mund të përdorni:

  • all — Të gjitha mesazhet
  • text — Mesazhe tekstuale
  • command — Komandat, pra mesazhe që fillojnë me /
  • reply — Mesazhe, që janë përgjigjje ndaj një mesazhi tjetër
  • audio — Mesazhe që përmbajnë një skedar audio
  • document — Mesazhe me një dokument të dërguar
  • photo — Mesazhe me imazhe të dërguara
  • sticker — Mesazhe me një sticker të dërguar
  • video — Mesazhe me video
  • voice — Mesazhe zanor
  • contact — Mesazhe që përmbajnë kontaktin e përdoruesit të Telegramit
  • location — Mesazhe me gjeolokacion
  • venue — Mesazhe të përcjella
  • game — Lojëra

Nëse dëshironi të kombinoni disa filtra në një trajtues, thjesht përdorni shenjën | — si për një logjikë OSE, dhe shenjën & si një logjikë DHE. Për shembull, nëse dëshironi që boti të thërrasë të njëjtën 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ë dhe si ta bëjmë botin të ekzekutojë komandën e nevojshme. Por në disa raste, përveç emrit të komandës, na nevojitet të kalojmë disa të dhëna për përmbushjen e saj.

Më poshtë është një shembull boti, i cili kthehet nga data dhe vendi i caktuar typin e ditës nga kalendari prodhues.

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

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

library(telegram.bot)

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

# Shkruajmë metodën 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, " - data e papërshtatshme, ju lutemi jepni datën në formatin GGGG-MM-DD"),
                    parse_mode = "Markdown")

  } else {
    day <- as.Date(day)
    # e kthejmë 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, " - kodi i vendit i papërshtatshëm, vlerat e mundshme: ru, by, kz, ua, us. Të dhënat kërkuar janë për Rusinë."),
                    parse_mode = "Markdown")

    country <- 'ru'

  }

  # kërkesa për të dhëna nga API
  # përgatitja e 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ë Pune",
                "1" = "Ditë Jo Pune",
                "2" = "Dite e Shkurtuar e Punes",
                "4" = "covid-19",
                "100" = "Gabim në datë",
                "101" = "Të dhënat nuk u gjetën",
                "199" = "Gabim në shërbim")

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

}

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

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

# fillojmë botin
updater$start_polling()

Ekzekutoni shembullin e kodit të mësipërm duke zëvendësuar ‘TOKENI JUAJ I BOTIT’ me tokenin e vërtetë që keni marrë gjatë krijimit të botit përmes BotFather (për krijimin e botit kam folur në artikullin e parë).

Kemi krijuar një bot që ka vetëm një metodë në arsenalin e tij check_date, kjo metodë thirret nga komanda 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, boti kontrollon nëse dita e caktuar në vendin e specifikuar është një ditë pushimi, e shkurtuar apo punuese sipas kalendarit zyrtar të prodhimit.

Për të bërë që metoda që po krijojmë të pranojë parametra shtesë së bashku me komandën, përdorni argumentin pass_args = TRUE në funksionin CommandHandler(), dhe kur krijoni metodën, përveç argumenteve të detyrueshme bot, përditësim krijoni një opsionale — args. Metoda e krijuar në këtë mënyrë do të pranojë parametrat që ju dërgoni botit pas emrit të komandës. Parametrat duhet të ndahen me një hapësirë, ndryshe ata do të hyjnë në metodë si një vektor tekstual.

Le t'i fillojmë dhe ta testojmë botin tonë.

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

Nisim botin në modalitetin e prapavijës

Hapi i fundit që na mbetet të kryejmë është të drejtojmë botin në mënyrë të fshehtë.

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

  1. Ruani kodin e botit në një skedë me zgjedhjen R. Kur punoni në RStudio, kjo bëhet përmes menusë Skedari, komandës Ruaj si….
  2. Shtoni rrugën për dosjen bin, e cila ndodhet në dosjen ku keni instaluar gjuhën R në variablën Path, udhëzimi këtu.
  3. Krijoni një skedë të zakonshme teksti, në të cilën shkruani një rresht: R CMD BATCH C:UsersAlseyDocumentsmy_bot.R. Në vend të C:UsersAlseyDocumentsmy_bot.R shkruani rrugën për skenarin tuaj të botit. Është e rëndësishme që në rrugë të mos ketë karaktere kirilike apo hapësira, pasi kjo mund të shkaktojë probleme gjatë fillimit të botit. Ruani atë dhe ndryshoni zgjedhjen nga txt në bat.
  4. Hapni Planifikuesin e Detyrave të Windows, ka shumë mënyra për ta bërë këtë, për shembull, hapni ndonjë dosje dhe në adresë shkruani %windir%system32taskschd.msc /s. Mënyra të tjera për fillimin mund të gjenden këtu.
  5. Në menunë e sipërme të djathtë të planifikuesit, klikoni "Krijo Një Detyrë…".
  6. Në skedën "Të Përgjithshme", caktoni një emër të rastësishëm për detyrën tuaj, dhe kaloni ndërruesin në gjendjen "Ekzekuto për të gjithë përdoruesit".
  7. Shkoni në skedën "Veprimet", klikoni "Krijo". Në fushën "Programi ose Skripti" klikoni "Shqyrto", gjeni skedën e krijuar në hapin e dytë bat dhe klikoni OK.
  8. Klikoni OK, nëse është e nevojshme, futni fjalëkalimin e llogarisë suaj të sistemit operativ.
  9. Gjeni në planifikues detyrën e krijuar, theksoni dhe në këndin e poshtëm të djathtë klikoni butonin "Ekzekuto".

Boti ynë është aktivizuar në mënyrë të fshehtë dhe do të funksionojë deri sa të ndaloni detyrën ose të fikni PC-në ose serverin ku e keni aktivizuar.

Përfundim

Në këtë artikull, ne shqyrtuam se si të shkruajmë një bot të plote, i cili jo vetëm që dërgon mesazhe, por gjithashtu reagon ndaj mesazheve dhe komandave të ardhura. Njohuritë e marra janë tashmë të mjaftueshme për të zgjidhur shumicën e detyrave tuaja.

Në artikullin e ardhshëm do të flasim për mënyrën se si të shtoni një tastierë në bot, për një punë më të lehtë.

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

Burimi: habr.com

Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS 🔥 Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS | ProHoster