Scrivite un telegramma bot in R (parte 2): Aghjunghjendu supportu di cumandamentu è filtri di missaghju à u bot

В pubblicazione precedente avemu capitu cumu creà un bot, inizializatu una istanza di a classe Bot è divintò pràticu cù i metudi di mandà missaghji cù lu.

In questu articulu cuntinuu stu tema, per quessa, ricumandemu di cumincià à leghje stu articulu solu dopu avè lettu a prima parte.

Sta volta avemu da capisce cumu per rinvivisce u nostru bot è aghjunghje un supportu di cumandamentu, è ancu cunnosce a classe. Updater.

Duranti u cursu di l'articulu, scriveremu parechji bots simplici, l'ultimi, basatu annantu à una data data è u codice di u paese, determinanu se un ghjornu in un paese determinatu hè un weekend o un ghjornu di travagliu secondu u calendariu di produzzione. Ma, cum'è prima, u scopu di l'articulu hè di familiarizàvi cù l'interfaccia di u pacchettu telegram.bot per risolve i vostri prublemi.

Scrivite un telegramma bot in R (parte 2): Aghjunghjendu supportu di cumandamentu è filtri di missaghju à u bot

Tutti l'articuli di a serie "Scrivu un telegram bot in R"

  1. Creemu un bot è l'utilizanu per mandà missaghji in telegramma
  2. Aghjunghjite u supportu di cumandamentu è i filtri di messagi à u bot

Cuntenuti

Sè vo site interessatu in l'analisi di dati, pudete esse interessatu in u mo telegram и fratii canali. A maiò parte di u cuntenutu hè dedicatu à a lingua R.

  1. Classe di aghjurnamentu
  2. Handlers - maniscalchi
  3. Aghjunghjite u primu cumandamentu à u bot, gestore di cumanda
  4. Processore di missaghju di testu è filtri
  5. Adding Commands with Parameters
  6. Eseguite u bot in u fondu
  7. cunchiusioni

Classe di aghjurnamentu

Updater hè una classa chì face più faciule per voi per sviluppà un telegram bot, è usa a classa sottu u cappucciu Dispetcher. Assegnazione di classe Updater hè di riceve l'aghjurnamenti da u bot (in l'articulu precedente avemu usatu u metudu per questu scopu getUpdates()), è li trasfirìu più à Dispetcher.

A volta Dispetcher cuntene i gestori chì avete creatu, i.e. oggetti di classi Handler.

Handlers - maniscalchi

Cù handlers aghjunghje à Dispetcher reazioni di bot à diversi avvenimenti. A l'ora di scrive stu articulu in telegram.bot I seguenti tippi di gestori sò stati aghjuntu:

  • MessageHandler - Gestore di missaghji
  • CommandHandler - Gestore di cumandamenti
  • CallbackQueryHandler - Gestore di dati per i tastieri mandati da Inline
  • ErrorHandler - Gestore di errore quandu dumandate l'aghjurnamenti da u bot

Aghjunghjite u primu cumandamentu à u bot, gestore di cumanda

Se ùn avete mai utilizatu bots prima è ùn sapete micca ciò chì hè un cumandamentu, allora i cumandamenti à u bot anu da esse mandatu cù una barra in avanti. / cum'è un prefissu.

Avemu da principià cù cumandamenti simplici, i.e. insegnemu à u nostru bot à salutà u cumandamentu /hi.

Codice 1: Insegni à u bot à salutà

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

Eseguite l'esempiu di codice sopra, dopu avè rimpiazzatu "TU TOKEN BOT" cù u token reale chì avete ricevutu quandu crea u bot via BotPather (Aghju parlatu di creà un bot in primu articulu).

Metu start_polling() класса Updater, chì hè utilizatu à a fine di u codice, principia un ciclu infinitu di dumandà è processà l'aghjurnamenti da u bot.

Avà apremu Telegram è scrivite u primu cumandamentu à u nostru bot /hi.

Scrivite un telegramma bot in R (parte 2): Aghjunghjendu supportu di cumandamentu è filtri di missaghju à u bot

Avà u nostru bot capisce u cumandamentu /hi, è sapi salutà noi.

Schematically, u prucessu di custruisce un bot sèmplice pò esse rapprisintatu cum'è seguita.

Scrivite un telegramma bot in R (parte 2): Aghjunghjendu supportu di cumandamentu è filtri di missaghju à u bot

  1. Crea una istanza di a classe Updater;
  2. Creemu metudi, i.e. funzioni chì u nostru bot farà. In l'esempiu di codice questu hè una funzione say_hello(). E funzioni chì avete aduprà cum'è metudi di bot deve avè dui argumenti necessarii - B bot и aghjurnamentu, è una facultativa - args. Argumentu B bot, Questu hè u vostru bot, cù u so aiutu pudete risponde à i missaghji, mandà missaghji, o aduprà qualsiasi altri metudi dispunibuli per u bot. Argumentu aghjurnamentu questu hè ciò chì u bot hà ricevutu da l'utilizatore, in fattu, ciò chì avemu ricevutu in u primu articulu cù u metudu getUpdates(). Argumentu args permette di processà e dati supplementari mandati da l'utilizatore cù u cumandimu, avemu da vultà à stu tema un pocu dopu;
  3. Creemu handlers, i.e. Associemu alcune azzioni di l'utilizatori cù i metudi creati in u passu precedente. Essenzialmente, un gestore hè un trigger, un avvenimentu chì chjama una funzione di bot. In u nostru esempiu, un tali trigger hè di mandà un cumandamentu /hi, è hè implementatu da a squadra hi_hendler <- CommandHandler('hi', say_hello). Primu argumentu di funzione CommandHandler() permette di specificà un cumandamentu, in u nostru casu hi, à quale u bot risponda. U sicondu argumentu permette di specificà u metudu di u bot, chjameremu u metudu say_hello, chì serà eseguitu se l'utilizatore hà chjamatu u cumandamentu specificatu in u primu argumentu;
  4. In seguitu, aghjunghjemu u gestore creatu à u dispatcher di a nostra istanza di classe Updater. Puderete aghjustà i manipulatori in parechje manere; in l'esempiu sopra, aghju utilizatu u più simplice, usendu u segnu +, à dì updater <- updater + hi_hendler. U listessu pò esse fattu cù u metudu add_handler(), chì appartene à a classe Dispatcher, pudete truvà stu metudu cusì: updater$dispatcher$add_handler();
  5. Lanciari u bot cù u cumandimu start_polling().

Processore di missaghju di testu è filtri

Avemu capitu cumu mandà cumandamenti à u bot, ma qualchì volta avemu bisognu di u bot per risponde micca solu à i cumandamenti, ma ancu à qualchi missaghji di testu regulare. Per fà questu, avete bisognu di utilizà i gestori di messagi - MessageHandler.

strasurdinariu MessageHandler risponderà à assolutamente tutti i missaghji ricevuti. Dunque, i gestori di messagi sò spessu usati inseme cù filtri. Insegnemu à u bot à salutà micca solu à u cumandimu /hi, ma ancu ogni volta chì una di e seguenti parolle appare in u missaghju mandatu à u bot: salutu, salutu, salutu, hai, bonjour.

Per avà ùn scriveremu micca novi metudi, perchè ... Avemu digià un metudu per quale u bot ci saluta. Tuttu ciò chì avemu da fà hè di creà u filtru necessariu è u gestore di messagi.

Code 2: aghjunghje un gestore di missaghju di testu è 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()

Eseguite l'esempiu di codice sopra, dopu avè rimpiazzatu "TU TOKEN BOT" cù u token reale chì avete ricevutu quandu crea u bot via BotPather (Aghju parlatu di creà un bot in primu articulu).

Avà pruvemu à mandà à u bot parechji missaghji chì cuntenenu e parolle di salutu listate prima:
Scrivite un telegramma bot in R (parte 2): Aghjunghjendu supportu di cumandamentu è filtri di missaghju à u bot

Allora, prima di tuttu, avemu amparatu à u bot micca solu per salutà, ma per risponde à un salutu. Avemu fattu questu utilizendu l'argumentu risposta_à_message_id, chì hè dispunibule in u metudu sendMessage(), in quale avete bisognu di trasfiriri l'id di u messagiu à quale vulete risponde. Pudete ottene l'ID di u messagiu cusì: update$message$message_id.

Ma u principale chì avemu fattu era aghjunghje un filtru à u bot utilizendu a funzione BaseFilter():

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

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

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

)

Comu pudete avè nutatu, i filtri deve esse aghjuntu à l'ughjettu MessageFilters, chì inizialmente cuntene digià un picculu gruppu di filtri pronti. In u nostru esempiu, à l'ughjettu MessageFilters avemu aghjustatu un elementu hi, questu hè un novu filtru.

Per funziunà BaseFilter() avete bisognu di passà a funzione di filtru. Essenzialmente, un filtru hè solu una funzione chì riceve una istanza di missaghju è torna CALDO o In. In u nostru esempiu, avemu scrittu una funzione simplice chì, utilizendu a funzione basica grepl() verifica u testu di u messagiu è s'ellu currisponde à l'espressione regulare привет|здравствуй|салют|хай|бонжур torna CALDO.

Dopu avemu creatu un gestore di missaghju hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi). Primu argumentu di funzione MessageHandler() hè u metudu chì chjamarà u gestore, è u sicondu argumentu hè u filtru da quale serà chjamatu. In u nostru casu, questu hè u filtru chì avemu creatu MessageFilters$hi.

Eppo, à a fine, aghjunghje à u dispatcher u handler creatu hi_txt_hnd.

updater <- updater + 
             hi_hendler +
             hi_txt_hnd

Comu aghju scrittu sopra, in u pacchettu telegram.bot è ughjettu MessageFilters Ci hè digià un set di filtri integrati chì pudete aduprà:

  • all - Tutti i missaghji
  • testu - missaghji testu
  • cumanda - Cumandamenti, i.e. missaghji chì principianu cù /
  • risposta - Missaghji chì sò una risposta à un altru missaghju
  • audio - Missaghji chì cuntenenu un schedariu audio
  • document - Missaghji cù un documentu mandatu
  • photo - Missaghji cù l'imaghjini mandati
  • sticker - Missaghji cù un sticker mandatu
  • video - Missaghji cù video
  • voce - missaghji voce
  • cuntattu - Missaghji chì cuntenenu u cuntenutu di u telegramma di l'utilizatore
  • locu - Missaghji cù geolocalizazione
  • locu - Missaghji inoltrati
  • ghjocu - ghjochi

Se vulete cumminà certi filtri in un gestore solu aduprà u segnu | - cum'è una logica OR, è signu & cum'è logicu И. Per esempiu, sè vo vulete chì u bot chjamà u stessu metudu quandu riceve un video, una maghjina o un documentu, utilizate l'esempiu seguente per creà un gestore di missaghju:

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

Adding Commands with Parameters

Sapemu digià ciò chì i cumandamenti sò, cumu si creanu è cumu furzà u bot per eseguisce u cumandamentu desideratu. Ma in certi casi, in più di u nome di cumandamentu, avemu bisognu di passà qualchi dati per eseguisce.

Quì sottu hè un esempiu di un bot chì, datu una data data è un paese, vi torna u tipu di ghjornu da u calendariu di produzzione.

U bot sottu usa l'API di u calendariu di produzzione isdayoff.ru.

Codice 3: Bot chì raporta per data è paese

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

Eseguite l'esempiu di codice sopra, dopu avè rimpiazzatu "TU TOKEN BOT" cù u token reale chì avete ricevutu quandu crea u bot via BotPather (Aghju parlatu di creà un bot in primu articulu).

Avemu creatu un bot chì hà solu un metudu in u so arsenale check_date, Stu metudu hè chjamatu da u cumandamentu di u listessu nome.

Ma, in più di u nome di u cumandamentu, stu metudu deve esse inseritu dui parametri, u codice di u paese è a data. Dopu, u bot verifica se un ghjornu determinatu in u paese specificatu hè un weekend, un ghjornu scurciatu, o un ghjornu di travagliu secondu u calendariu ufficiale di produzzione.

Per u metudu chì creamu per accettà paràmetri supplementari cù u cumandamentu, utilizate l'argumentu pass_args = TRUE in funzione CommandHandler(), è quandu crea un metudu, in più di l'argumenti necessarii B bot, aghjurnamentu crea un opzionale - args. U metudu creatu in questu modu accettà i paràmetri chì passate à u bot dopu u nome di cumandamentu. I paràmetri devenu esse separati da un spaziu; seranu mandati à u metudu cum'è un vettore di testu.

Lanciamu è pruvà u nostru bot.

Scrivite un telegramma bot in R (parte 2): Aghjunghjendu supportu di cumandamentu è filtri di missaghju à u bot

Eseguite u bot in u fondu

L'ultimu passu chì avemu bisognu di compie hè di lancià u bot in u fondu.

Per fà questu, seguite l'algoritmu descrittu quì sottu:

  1. Salvà u codice bot in un schedariu cù l'estensione R. Quandu travaglia in RStudio, questu hè fattu per mezu di u menù File, squadra Salva Cum'è ....
  2. Aghjunghjite u percorsu à u cartulare bin, chì à u turnu si trova in u cartulare in quale avete installatu a lingua R, à a variabile Path, instructions. ccà.
  3. Crea un schedariu di testu regulare in quale scrive 1 linea: R CMD BATCH C:UsersAlseyDocumentsmy_bot.R. Invece di C: UsersAlseyDocumentsmy_bot.R scrivite u percorsu à u vostru script bot. À u listessu tempu, hè impurtante chì ùn ci sò micca caratteri cirillichi o spazii in a strada, perchè chistu pò causari prublemi quandu eseguisce u bot. Salvà, è rimpiazzà a so estensione cù txt nantu Bat.
  4. Apertura Windows Task Scheduler, ci sò parechje manere di fà questu, per esempiu, apre ogni cartulare è entre in l'indirizzu %windir%system32taskschd.msc /s. Altri metudi di lanciamentu ponu esse truvati ccà.
  5. In u menù in cima à destra di u scheduler, cliccate "Crea attività ...".
  6. Nant'à a tabulazione "Generale", dà à u vostru compitu un nome persunalizatu, è cambia u cambiamentu à u statu "Esegui per tutti l'utilizatori".
  7. Andà à a tabulazione "Azzioni", cliccate "Crea". In u campu "Programma o script", cliccate "Browse", truvate quellu creatu in u sicondu passu Bat u schedariu è cliccate OK.
  8. Cliccate OK è, se ne necessariu, inserite a password per u vostru contu di u sistema operatore.
  9. Truvate u compitu creatu in u scheduler, selezziunate è cliccate nantu à u buttone "Run" in u cantonu in basso à destra.

U nostru bot corre in sfondate è hà da travaglià finu à chì ferma u compitu, o spegne u vostru PC o u servitore nantu à quale hè stata lanciata.

cunchiusioni

In questu articulu, avemu capitu cumu per scrive un bot full-fledged chì ùn pò micca solu mandà missaghji, ma ancu risponde à i missaghji è i cumandamenti. A cunniscenza acquistata hè digià abbastanza per risolve a maiò parte di i vostri prublemi.

U prossimu articulu parlerà di cumu aghjunghje un teclatu à u bot per un travagliu più còmode.

Abbonate à u mo telegram и fratii canali.

Source: www.habr.com

Add a comment