Scriem un bot Telegram în limba R (partea 2): Adăugăm botului suport pentru comenzi și filtre de mesaje.

În anterioare Am înțeles cum să creăm un bot și am inițializat o instanță a clasei Bot și ne-am familiarizat cu metodele de trimitere a mesajelor folosind acesta.

În acest articol continui această temă, așa că recomand citirea acestui articol doar după ce ați citit prima parte.

De data aceasta vom învăța cum să dăm viață botului nostru și să adăugăm suport pentru comenzi, precum și să ne familiarizăm cu clasa Updater.

Pe parcursul articolului, vom scrie câțiva bot-uri simple, ultimul va determina, în funcție de data specificată și codul țării, dacă ziua respectivă este o zi liberă sau lucrătoare conform calendarului de producție. Dar, ca de obicei, scopul articolului este să vă familiarizeze cu interfața pachetului telegram.bot pentru a rezolva propriile probleme.

Scriem un bot Telegram în limba R (partea 2): Adăugăm botului suport pentru comenzi și filtre de mesaje.

Toate articolele din seria "Scriem un bot Telegram în limbajul R"

  1. Creăm un bot și trimitem mesaje prin el în Telegram
  2. Adăugăm suport pentru comenzi și filtre de mesaje botului

Cuprins

Dacă sunteți interesat de analiza datelor, s-ar putea să vă intereseze canalele mele. telegram și youtube Marea parte a conținutului lor este dedicată limbajului R.

  1. Clasa Updater
  2. Handlers — manevratori
  3. Adăugăm prima comandă botului, manevrator de comenzi
  4. Manevrarea mesajelor text și filtrele
  5. Adăugarea comenzilor cu parametrii
  6. Pornim botul în fundal
  7. Concluzie

Clasa Updater

Updater — este o clasă care vă simplifică dezvoltarea botului Telegram și folosește în spate clasa Dispetcher. Scopul clasei Updater constă în a obține actualizările de la bot (în articolul anterior am folosit pentru acest scop metoda getUpdates()), și a le transmite mai departe în Dispetcher.

La rândul său Dispetcher conține manevratorii pe care i-ați creat, adică obiectele clasei Handler.

Handlers — manevratori

Cu ajutorul manevratorilor, adăugați în Dispetcher reacțiile botului la diferite evenimente. La momentul redactării articolului, în telegram.bot au fost adăugate următoarele tipuri de manevratori:

  • MessageHandler — Manevrarea mesajelor
  • CommandHandler — Manevrarea comenzilor
  • CallbackQueryHandler — Manevrarea datelor trimise din tastaturile Inline
  • ErrorHandler — Manevrarea erorilor la solicitarea actualizărilor de la bot

Adăugăm prima comandă botului, manevrator de comenzi

Dacă nu ați folosit niciodată bot-uri și nu știți ce este o comandă, comanda trebuie trimisă botului cu ajutorul unui slash direct / ca prefix.

Să începem cu comenzi simple, adică să-l învățăm pe botul nostru să salute la comanda /hi.

Cod 1: Învățăm botul să salute

library(telegram.bot)

# Cream un exemplu al clasei Updater
updater <- Updater('TOKENUL BOTULUI DVS.')

# Scriem metoda pentru salut
say_hello <- function(bot, update) {

  # Numele utilizatorului cu care trebuie să ne salutăm
  user_name <- update$message$from$first_name

  # Trimiterea unui mesaj de întâmpinare
  bot$sendMessage(update$message$chat_id, 
                  text = paste0("Bună, ", user_name, "!"), 
                  parse_mode = "Markdown")

}

# Creăm un handler 
hi_hendler <- CommandHandler('hi', say_hello)

# Adăugăm handlerul în dispatcher
updater <- updater + hi_hendler

# Lansăm botul
updater$start_polling()

Rulați exemplul de cod de mai sus, înlocuind 'TOKENUL BOTULUI DUMNEAVOASTRĂ' cu token-ul real pe care l-ați primit când ați creat botul prin BotFather (despre crearea botului am vorbit în articolul nostru inițial).

Metoda start_polling() clasei Updater, care este folosit la finalul codului, inițiază un ciclu infinit de interogare și procesare a actualizărilor de la bot.

Acum deschidem Telegram și scriem prima comandă botului nostru /hi.

Scriem un bot Telegram în limba R (partea 2): Adăugăm botului suport pentru comenzi și filtre de mesaje.

Acum botul nostru înțelege comanda /hi, și știe să ne salute.

Simplificat, procesul de creare a unui astfel de bot simplu poate fi reprezentat astfel.

Scriem un bot Telegram în limba R (partea 2): Adăugăm botului suport pentru comenzi și filtre de mesaje.

  1. Creăm un exemplu al clasei Updater;
  2. Creăm metode, adică funcții pe care botul nostru le va executa. În exemplul de cod, aceasta este funcția say_hello(). Funcțiile care vor fi folosite ca metode ale botului trebuie să aibă două argumente obligatorii — bot și update, și unul opțional — args. Argumentul bot, acesta este botul vostru, cu ajutorul căruia puteți răspunde la mesaje, trimite mesaje sau utiliza orice alte metode disponibile botului. Argumentul update este ceea ce botul a primit de la utilizator, de fapt, ceea ce în primul articol am obținut prin metoda getUpdates(). Argumentul args îți permite să procesezi date suplimentare trimise de utilizator împreună cu comanda, la această temă vom reveni mai târziu;
  3. Creăm handleri, adică legăm anumite acțiuni ale utilizatorului de metodele create la pasul precedent. Practic, un handler este un triger, un eveniment care declanșează o funcție a botului. În exemplul nostru, acest triger este trimiterea comenzii /hi, și este realizat prin comanda hi_hendler <- CommandHandler('hi', say_hello). Primul argument al funcției CommandHandler() îți permite să stabilești comanda, în cazul nostru hi, la care botul va răspunde. Al doilea argument permite specificarea metodei botului, noi vom apela metoda say_hello, care va fi executată dacă utilizatorul a apelat comanda specificată în primul argument;
  4. Apoi, adăugăm handlerul creat în dispatcher-ul exemplului nostru de clasă Updater. Poate fi adăugat handler în mai multe moduri, în exemplul de mai sus am folosit cel mai simplu, cu ajutorul semnului +, adică updater <- updater + hi_hendler. Aceleași lucruri pot fi realizate cu ajutorul metodei add_handler(), care aparține clasei Dispatcher, această metodă poate fi găsită astfel: updater$dispatcher$add_handler();
  5. Pornim robotul folosind comanda start_polling().

Manevrarea mesajelor text și filtrele

Am înțeles cum să trimitem comenzi robotului, dar uneori este necesar ca robotul să reacționeze nu doar la comenzi, ci și la anumite mesaje text obișnuite. Pentru aceasta este necesar să folosim handler-e pentru mesaje — MessageHandler.

Obișnuit MessageHandler va răspunde la absolut toate mesajele primite. De aceea, de multe ori handler-ele pentru mesaje sunt folosite împreună cu filtre. Să învățăm robotul să salute nu doar la comandă /hi, ci întotdeauna când în mesajul trimis robotului apare unul dintre următoarele cuvinte: salut, bună, salutare, hei, bonjour.

Deocamdată nu vom scrie metode noi, deoarece avem deja o metodă prin care robotul ne salută. Tot ce trebuie să facem este să creăm filtrul necesar și handler-ul pentru mesaje.

Cod 2: Adăugăm handler pentru mesaje text și filtru

library(telegram.bot)

# creăm un exemplu al clasei Updater
updater <- Updater('TOKENUL ROBOTULUI TĂU')

# Scriem metoda de salut
## comanda de salut
say_hello <- function(bot, update) {

  # Numele utilizatorului cu care trebuie să salutăm
  user_name <- update$message$from$first_name

  # Trimitem mesajul de salut
  bot$sendMessage(update$message$chat_id, 
                  text = paste0("Salut, ", user_name, "!"),
                  parse_mode = "Markdown",
                  reply_to_message_id = update$message$message_id)

}

# creăm filtre
MessageFilters$hi <- BaseFilter(function(message) {

  # verificăm dacă în textul mesajului apar cuvintele: salut, bună, salutare, hei, bonjour
  grepl(x           = message$text, 
        pattern     = 'salut|bună|salutare|hei|bonjour',
        ignore.case = TRUE)
  }
)

# creăm handler-ul 
hi_hendler <- CommandHandler('hi', say_hello) # handler pentru comanda hi
hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi)

# adăugăm handler-ele în dispatcher
updater <- updater + 
             hi_hendler +
             hi_txt_hnd

# pornim robotul
updater$start_polling()

Rulați exemplul de cod de mai sus, înlocuind 'TOKENUL BOTULUI DUMNEAVOASTRĂ' cu token-ul real pe care l-ați primit când ați creat botul prin BotFather (despre crearea botului am vorbit în articolul nostru inițial).

Acum vom încerca să trimitem robotului mai multe mesaje care vor conține cuvintele de salut enumerate mai devreme:
Scriem un bot Telegram în limba R (partea 2): Adăugăm botului suport pentru comenzi și filtre de mesaje.

Așadar, în primul rând, am învățat robotul nu doar să salute, ci să răspundă la salut. Am realizat acest lucru cu ajutorul argumentului reply_to_message_id, care este disponibil în metodă. sendMessage(), la care trebuie transmis id-ul mesajului la care se dorește un răspuns. Poți obține id-ul mesajului astfel: update$message$message_id.

Dar principalul lucru pe care l-am realizat - am adăugat un filtru botului folosind funcția BaseFilter():

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

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

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

)

Așa cum ai putut observa, filtrele trebuie adăugate în obiectul MessageFilters, care de la început are deja un mic set de filtre gata. În exemplul nostru, în obiectul MessageFilters am adăugat elementul hi, acesta este un nou filtru.

În funcția BaseFilter() trebuie să transmiți funcția de filtrare. Practic, un filtru este pur și simplu o funcție care primește instanța unui mesaj și returnează TRUE sau FALSE. În exemplul nostru, am scris o funcție simplă care folosește funcția de bază grepl() pentru a verifica textul mesajului și, dacă acesta se potrivește expresiei regulate salut|bună|către|hi|bonjour întoarce TRUE.

Apoi, creăm un handler pentru mesaje hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi). Primul argument al funcției MessageHandler() — metoda care va apela handler-ul, iar al doilea argument este filtrul după care va fi apelat. În cazul nostru, acesta este filtrul creat de noi MessageFilters$hi.

Și, în final, adăugăm în dispatcher handler-ul creat mai devreme hi_txt_hnd.

updater <- updater + 
             hi_hendler +
             hi_txt_hnd

Așa cum am menționat mai sus, în pachetul telegram.bot și în obiectul MessageFilters există deja un set de filtre încorporate pe care le poți utiliza:

  • all — Toate mesajele
  • text — Mesaje text
  • command — Comenzi, adică mesaje care încep cu /
  • reply — Mesaje care sunt răspunsuri la alte mesaje
  • audio — Mesaje care conțin fișiere audio
  • document — Mesaje cu un document trimis
  • photo — Mesaje cu imagini trimise
  • sticker — Mesaje cu un sticker trimis
  • video — Mesaje cu video
  • voice — Mesaje vocale
  • contact — Mesaje care conțin contactul unui utilizator Telegram
  • location — Mesaje cu geolocație
  • venue — Mesaje redirecționate
  • game — Jocuri

Dacă vrei să combini anumite filtre într-un singur handler, folosește semnul | — ca operator logic SAU, și semnul & ca operator logic Și. De exemplu, dacă vrei ca botul să apeleze aceeași metodă când primește video, imagine sau document, folosește următorul exemplu de creare a handler-ului de mesaje:

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

Adăugarea comenzilor cu parametrii

Deja știm ce sunt comenzile, cum să le creăm și cum să facem botul să execute comanda dorită. Dar, în anumite cazuri, pe lângă numele comenzii, trebuie să transmitem și unele date pentru a o executa.

Mai jos este un exemplu de bot care returnează tipul zilei din calendarul de producție, pe baza unei date și unei țări specificate.

Botul de mai jos folosește API-ul calendarului de producție. isdayoff.ro.

Cod 3: Bot care informează despre data și țara

library(telegram.bot)

# creăm o instanță a clasei Updater
updater <- Updater('1165649194:AAFkDqIzQ6Wq5GV0YU7PmEZcv1gmWIFIB_8')

# Scriem metoda pentru salut
## comanda de salut
check_date <- function(bot, update, args) {

  # datele de intrare
  day     <- args[1]  # data
  country <- args[2]  # țara

  # verificarea parametrilor introduși
  if ( !grepl('\d{4}-\d{2}-\d{2}', day) ) {

    # Trimite tastatură personalizată
    bot$sendMessage(update$message$chat_id, 
                    text = paste0(day, " - dată incorectă, introduceți data în formatul AAAA-LL-ZZ"),
                    parse_mode = "Markdown")

  } else {
    day <- as.Date(day)
    # conversia în format POSIXtl
    y <- format(day, "%Y")
    m <- format(day, "%m")
    d <- format(day, "%d")

  }

  # țara pentru verificare
  ## verificăm dacă țara este specificată
  ## dacă nu este specificată, setăm ru
  if ( ! country %in% c('ru', 'ua', 'by', 'kz', 'us') ) {

    # Trimite tastatură personalizată
    bot$sendMessage(update$message$chat_id, 
                    text = paste0(country, " - cod de țară incorect, valorile posibile sunt: ru, by, kz, ua, us. Datele solicitate pentru Rusia."),
                    parse_mode = "Markdown")

    country <- 'ru'

  }

  # cererea de date din API
  # compunerea cererii HTTP
  url <- paste0("https://isdayoff.ru/api/getdata?",
                "year=",  y, "&",
                "month=", m, "&",
                "day=",   d, "&",
                "cc=",    country, "&",
                "pre=1&",
                "covid=1")

  # obținem răspunsul
  res <- readLines(url)

  # interpretarea răspunsului
  out <- switch(res, 
                "0"   = "Zi lucrătoare",
                "1"   = "Zi nelucrătoare",
                "2"   = "Zi lucrătoare redusă",
                "4"   = "covid-19",
                "100" = "Eroare în dată",
                "101" = "Datele nu au fost găsite",
                "199" = "Eroare de serviciu")

  # trimitem mesajul
  bot$sendMessage(update$message$chat_id, 
                  text = paste0(day, " - ", out),
                  parse_mode = "Markdown")

}

# creăm un handler
date_hendler <- CommandHandler('check_date', check_date, pass_args = TRUE)

# adăugăm handlerul în dispatcher
updater <- updater + date_hendler

# pornim botul
updater$start_polling()

Rulați exemplul de cod de mai sus, înlocuind 'TOKENUL BOTULUI DUMNEAVOASTRĂ' cu token-ul real pe care l-ați primit când ați creat botul prin BotFather (despre crearea botului am vorbit în articolul nostru inițial).

Am creat un bot care are în arsenal un singur metodă. check_date, această metodă este apelată de comanda cu același nume.

Dar, pe lângă numele comenzii, această metodă așteaptă de la dumneavoastră introducerea a două parametrii, codul țării și data. Apoi, botul verifică dacă ziua specificată în țara respectivă este o zi liberă, scurtată sau lucrătoare conform calendarului oficial.

Pentru ca metoda pe care o creăm să accepte parametrii suplimentari împreună cu comanda, utilizați argumentul pass_args = TRUE în funcția CommandHandler(), și la crearea metodei, pe lângă argumentele obligatorii, bot, update creați un opțional — args. Metoda astfel creată va accepta parametrii pe care îi transmiteți botului după numele comenzii. Parametrii trebuie separați printr-un spațiu, iar în metodă vor ajunge sub formă de vector text.

Să pornim și să testăm botul nostru.

Scriem un bot Telegram în limba R (partea 2): Adăugăm botului suport pentru comenzi și filtre de mesaje.

Pornim botul în fundal

Ultimul pas pe care trebuie să-l facem este să pornim botul în fundal.

Pentru aceasta, urmați algoritmul descris mai jos:

  1. Salvați codul botului într-un fișier cu extensia R. Când lucrați în RStudio, acest lucru se face prin meniul File, comanda Save As….
  2. Adăugați calea către folderul bin, care, la rândul său, se află în folderul în care ați instalat limba R în variabila Path, instrucțiunile aici.
  3. Creați un fișier text normal, în care să scrieți 1 linie: R CMD BATCH C:UsersAlseyDocumentsmy_bot.R. În loc de C:UsersAlseyDocumentsmy_bot.R scrieți calea către scriptul dumneavoastră bot. Este important ca în cale să nu se întâlnească caractere chirilice sau spații, deoarece acest lucru poate cauza probleme la pornirea botului. Salvați-l și schimbați-i extensia cu txt pe bat.
  4. Deschideți Planificatorul de sarcini Windows, există multe moduri de a face acest lucru, de exemplu deschideți orice folder și în adresă introduceți %windir%system32taskschd.msc /s. Alte moduri de lansare pot fi găsite aici.
  5. În colțul din dreapta sus al planificatorului, faceți clic pe "Creează o sarcină…".
  6. În tab-ul "Generale", asignați un nume aleatoriu sarcinii dumneavoastră și schimbați comutatorul în starea "Executați pentru toți utilizatorii".
  7. Mergeți la tab-ul "Acțiuni", faceți clic pe "Creează". În câmpul "Program sau script", faceți clic pe "Răsfoiește", găsiți fișierul creat la pasul doi bat , și faceți clic pe OK.
  8. Faceți clic pe OK, și, dacă este necesar, introduceți parola contului dumneavoastră de operare.
  9. Căutați sarcina creată în planificator, seleccionați-o și în colțul din dreapta jos faceți clic pe butonul "Execută".

Botul nostru este activat în modul de fundal și va funcționa până când veți opri sarcina sau veți închide PC-ul sau serverul pe care l-ați lansat.

Concluzie

În acest articol, am analizat cum să scriem un bot complet, care nu doar că trimite mesaje, dar reacționează și la mesajele și comenzile primite. Cunoștințele obținute sunt deja suficiente pentru a rezolva majoritatea sarcinilor dumneavoastră.

În articolul următor, ne vom concentra asupra modului de a adăuga o tastatură botului, pentru a îmbunătăți experiența de utilizare.

Abonați-vă la telegram și youtube canalele mele.

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster