Scrierea unui bot de telegramă în R (partea 2): adăugarea suportului de comandă și a filtrelor de mesaje la bot

В publicația anterioară ne-am dat seama cum să creăm un bot, am inițializat o instanță a clasei Bot și sa familiarizat cu metodele de trimitere a mesajelor folosindu-l.

În acest articol continui acest subiect, așa că recomand să începeți să citiți acest articol abia după ce ați citit prima parte.

De data aceasta, ne vom da seama cum să ne reînvie botul și să îi adăugăm suport de comandă și, de asemenea, să ne familiarizăm cu clasa Updater.

Pe parcursul articolului, vom scrie mai mulți roboți simpli, acesta din urmă va determina, pe baza unei date și a unui cod de țară dat, dacă o zi dintr-o anumită țară este un weekend sau o zi lucrătoare conform calendarului de producție. Dar, ca și înainte, scopul articolului este de a vă familiariza cu interfața pachetului telegram.bot pentru a-ți rezolva propriile probleme.

Scrierea unui bot de telegramă în R (partea 2): adăugarea suportului de comandă și a filtrelor de mesaje la bot

Toate articolele din seria „Scrierea unui bot telegram în R”

  1. Creăm un bot și îl folosim pentru a trimite mesaje în telegram
  2. Adăugați suport de comandă și filtre de mesaje la bot

Conținut

Dacă ești interesat de analiza datelor, s-ar putea să fii interesat de analiza mea telegramă и youtube canale. Cea mai mare parte a conținutului este dedicat limbajului R.

  1. Clasa de actualizare
  2. Manipulatori - manipulanti
  3. Adăugați prima comandă la bot, handler de comandă
  4. Procesor de mesaje text și filtre
  5. Adăugarea de comenzi cu parametri
  6. Rulați botul în fundal
  7. Concluzie

Clasa de actualizare

Updater este o clasă care vă ajută să dezvoltați un robot telegram și care utilizează clasa de sub capotă Dispetcher. Temă de clasă Updater este să primim actualizări de la bot (în articolul anterior am folosit metoda în acest scop getUpdates()), și transferați-le în continuare la Dispetcher.

La rândul său Dispetcher conţine handlerii pe care i-aţi creat, de ex. obiecte de clasă Handler.

Manipulatori - manipulanti

Cu handlere la care adăugați Dispetcher reacții bot la diverse evenimente. La momentul scrierii acestui articol în telegram.bot Au fost adăugate următoarele tipuri de handler:

  • MessageHandler — Manager de mesaje
  • CommandHandler — Manager de comandă
  • CallbackQueryHandler — Manager de date pentru tastaturi trimise de la Inline
  • ErrorHandler — Manager de erori atunci când se solicită actualizări de la bot

Adăugați prima comandă la bot, handler de comandă

Dacă nu ați folosit niciodată boți înainte și nu știți ce este o comandă, atunci comenzile către bot trebuie trimise folosind o bară oblică. / ca prefix.

Vom începe cu comenzi simple, de ex. haideți să învățăm botul nostru să salută la comandă /hi.

Cod 1: Învățați botul să spună bună

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

Rulați exemplul de cod de mai sus, după ce ați înlocuit „TOKEN-UL BOT” cu simbolul real pe care l-ați primit la crearea botului prin Tatăl Bot (Am vorbit despre crearea unui bot în primul articol).

metodă start_polling() clasă Updater, care este folosit la sfârșitul codului, începe o buclă nesfârșită de solicitare și procesare a actualizărilor de la bot.

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

Scrierea unui bot de telegramă în R (partea 2): adăugarea suportului de comandă și a filtrelor de mesaje la bot

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

Schematic, procesul de construire a unui robot atât de simplu poate fi descris după cum urmează.

Scrierea unui bot de telegramă în R (partea 2): adăugarea suportului de comandă și a filtrelor de mesaje la bot

  1. Creați o instanță a clasei Updater;
  2. Noi creăm metode, de ex. funcțiile pe care botul nostru le va îndeplini. În exemplul de cod, aceasta este o funcție say_hello(). Funcțiile pe care le veți folosi ca metode bot trebuie să aibă două argumente necesare - bot и actualizareși unul opțional - args. Argument bot, acesta este botul dvs., cu ajutorul acestuia puteți răspunde la mesaje, trimite mesaje sau utiliza orice alte metode disponibile pentru bot. Argument actualizare asta a primit botul de la utilizator, de fapt, ceea ce am primit în primul articol folosind metoda getUpdates(). Argument args vă permite să procesați date suplimentare trimise de utilizator împreună cu comanda, vom reveni la acest subiect puțin mai târziu;
  3. Creăm handleri, de ex. Asociem unele acțiuni ale utilizatorului cu metodele create la pasul anterior. În esență, un handler este un declanșator, un eveniment care apelează o funcție bot. În exemplul nostru, un astfel de declanșator trimite o comandă /hiși este implementat de echipă hi_hendler <- CommandHandler('hi', say_hello). Primul argument al funcției CommandHandler() vă permite să specificați o comandă, în cazul nostru hi, la care botul va răspunde. Al doilea argument vă permite să specificați metoda botului, 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 la dispecerul instanței noastre de clasă Updater. Puteți adăuga handlere în mai multe moduri în exemplul de mai sus, eu l-am folosit pe cel mai simplu, folosind semnul; +, adică updater <- updater + hi_hendler. Același lucru se poate face folosind metoda add_handler(), care aparține clasei Dispatcher, puteți găsi această metodă astfel: updater$dispatcher$add_handler();
  5. Lansați botul folosind comanda start_polling().

Procesor de mesaje text și filtre

Ne-am dat seama cum să trimitem comenzi către bot, dar uneori avem nevoie ca botul să răspundă nu numai la comenzi, ci și la unele mesaje text obișnuite. Pentru a face acest lucru, trebuie să utilizați handlere de mesaje − MessageHandler.

Normal MessageHandler va răspunde la absolut toate mesajele primite. Prin urmare, manipulatorii de mesaje sunt adesea folosiți împreună cu filtre. Să-l învățăm pe bot să spună salut nu numai la comandă /hi, dar și ori de câte ori în mesajul trimis botului apare unul dintre următoarele cuvinte: salut, salut, salut, hai, bonjour.

Deocamdată nu vom scrie metode noi, pentru că... Avem deja o metodă prin care botul ne întâmpină. Tot ce trebuie să facem este să creăm filtrul și handlerul de mesaje necesar.

Cod 2: Adăugați un handler de mesaje text și 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()

Rulați exemplul de cod de mai sus, după ce ați înlocuit „TOKEN-UL BOT” cu simbolul real pe care l-ați primit la crearea botului prin Tatăl Bot (Am vorbit despre crearea unui bot în primul articol).

Acum să încercăm să trimitem botului mai multe mesaje care conțin cuvintele de salut enumerate mai devreme:
Scrierea unui bot de telegramă în R (partea 2): adăugarea suportului de comandă și a filtrelor de mesaje la bot

Așa că, în primul rând, l-am învățat pe bot nu doar să spună salut, ci să răspundă la un salut. Am făcut asta folosind argumentul reply_to_message_id, care este disponibil în metodă sendMessage(), în care trebuie să transferați id-ul mesajului la care doriți să răspundeți. Puteți obține ID-ul mesajului astfel: update$message$message_id.

Dar principalul lucru pe care l-am făcut a fost să adăugăm un filtru la bot folosind funcția BaseFilter():

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

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

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

)

După cum probabil ați observat, filtrele trebuie adăugate la obiect Filtre de mesaje, care conține deja un mic set de filtre gata făcute. În exemplul nostru, la obiect Filtre de mesaje am adăugat un element hi, acesta este un filtru nou.

A functiona BaseFilter() trebuie să treci funcția de filtru. În esență, un filtru este doar o funcție care primește o instanță de mesaj și revine TRUE sau FALS. În exemplul nostru, am scris o funcție simplă care, folosind funcția de bază grepl() verifică textul mesajului și dacă se potrivește cu expresia regulată привет|здравствуй|салют|хай|бонжур se intoarce TRUE.

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

Ei bine, până la urmă, adăugăm la dispecer handlerul creat hi_txt_hnd.

updater <- updater + 
             hi_hendler +
             hi_txt_hnd

După cum am scris mai sus, în pachet telegram.bot și obiect Filtre de mesaje Există deja un set de filtre încorporate pe care le puteți utiliza:

  • toate — Toate mesajele
  • text — Mesaje text
  • comandă — Comenzi, de ex. mesaje care încep cu /
  • răspuns — Mesaje care reprezintă un răspuns la un alt mesaj
  • audio — Mesaje care conțin un fișier audio
  • document — Mesaje cu un document trimis
  • foto - Mesaje cu imagini trimise
  • autocolant — Mesaje cu un autocolant trimis
  • video — Mesaje cu video
  • voce - Mesaje vocale
  • contact — Mesaje care conțin conținutul telegramei utilizatorului
  • locație — Mesaje cu geolocalizare
  • loc — Mesaje redirecționate
  • joc — Jocuri

Dacă doriți să combinați câteva filtre într-un singur handler, utilizați semnul | - ca logic SAU, și semnează & la fel de logic И. De exemplu, dacă doriți ca botul să apeleze aceeași metodă atunci când primește un videoclip, o imagine sau un document, utilizați următorul exemplu pentru a crea un handler de mesaje:

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

Adăugarea de comenzi cu parametri

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

Mai jos este un exemplu de bot care, având în vedere o dată și o țară dată, vă returnează tipul de zi din calendarul de producție.

Botul de mai jos folosește API-ul calendar de producție isdayoff.ru.

Cod 3: Bot care raportează după dată și țară

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

Rulați exemplul de cod de mai sus, după ce ați înlocuit „TOKEN-UL BOT” cu simbolul real pe care l-ați primit la crearea botului prin Tatăl Bot (Am vorbit despre crearea unui bot în primul articol).

Am creat un bot care are o singură metodă în arsenalul său check_date, această metodă este apelată prin comanda cu același nume.

Dar, pe lângă numele comenzii, această metodă necesită să introduceți doi parametri, codul țării și data. Apoi, botul verifică dacă o anumită zi din țara specificată este un weekend, o zi scurtată sau o zi lucrătoare conform calendarului oficial de producție.

Pentru ca metoda pe care o creăm să accepte parametri suplimentari împreună cu comanda, utilizați argumentul pass_args = TRUE în funcțiune CommandHandler(), iar la crearea unei metode, pe lângă argumentele necesare bot, actualizare creați unul opțional - args. Metoda creată în acest fel va accepta parametrii pe care îi transmiteți botului după numele comenzii. Parametrii trebuie separați printr-un spațiu; vor fi trimiși la metodă ca vector text.

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

Scrierea unui bot de telegramă în R (partea 2): adăugarea suportului de comandă și a filtrelor de mesaje la bot

Rulați botul în fundal

Ultimul pas pe care trebuie să-l parcurgem este lansarea botului în fundal.

Pentru a face acest lucru, urmați algoritmul descris mai jos:

  1. Salvați codul bot într-un fișier cu extensia R. Când lucrați în RStudio, acest lucru se face prin meniu Fișier, echipa Salvează ca ....
  2. Adăugați calea către folderul bin, care la rândul său se află în folderul în care ați instalat limbajul R, la variabila Path, instrucțiuni aici.
  3. Creați un fișier text obișnuit în care scrieți 1 rând: R CMD BATCH C:UsersAlseyDocumentsmy_bot.R... In loc de C:UtilizatoriAlseyDocumentsmy_bot.R scrie calea către scriptul tău bot. În același timp, este important să nu existe caractere chirilice sau spații pe parcurs, deoarece acest lucru poate cauza probleme la rularea botului. Salvați-l și înlocuiți-i extensia cu txt pe bat.
  4. Deschideți Programatorul de activități Windows, există multe modalități de a face acest lucru, de exemplu, deschideți orice folder și introduceți adresa %windir%system32taskschd.msc /s. Alte metode de lansare pot fi găsite aici.
  5. În meniul din dreapta sus al programatorului, faceți clic pe „Creați sarcină...”.
  6. În fila „General”, dați sarcinii dvs. un nume personalizat și comutați comutatorul la starea „Rulează pentru toți utilizatorii”.
  7. Accesați fila „Acțiuni”, faceți clic pe „Creați”. În câmpul „Program sau script”, faceți clic pe „Răsfoiți”, găsiți-l pe cel creat în pasul al doilea bat fișier și faceți clic pe OK.
  8. Faceți clic pe OK și, dacă este necesar, introduceți parola pentru contul de sistem de operare.
  9. Găsiți sarcina creată în planificator, selectați-o și faceți clic pe butonul „Run” din colțul din dreapta jos.

Botul nostru rulează în fundal și va funcționa până când opriți sarcina sau opriți computerul sau serverul pe care a fost lansat.

Concluzie

În acest articol, ne-am dat seama cum să scriem un bot cu drepturi depline care poate nu numai să trimită mesaje, ci și să răspundă la mesajele și comenzile primite. Cunoștințele acumulate sunt deja suficiente pentru a vă rezolva majoritatea problemelor.

Următorul articol va vorbi despre cum să adăugați o tastatură la bot pentru o muncă mai convenabilă.

Abonați-vă la mine telegramă и youtube canale.

Sursa: www.habr.com

Cumpărați găzduire de încredere pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără găzduire web fiabilă cu protecție DDoS, servere VPS VDS | ProHoster