Scrivere un bot di Telegram in R (parte 2): aggiunta del supporto per i comandi e dei filtri dei messaggi al bot

В pubblicazione precedente abbiamo capito come creare un bot, inizializzato un'istanza della classe Bot e ho acquisito familiarità con i metodi di invio dei messaggi utilizzandolo.

In questo articolo continuo questo argomento, quindi consiglio di iniziare a leggere questo articolo solo dopo averlo letto la prima parte.

Questa volta scopriremo come far rivivere il nostro bot e aggiungervi il supporto per i comandi, oltre a familiarizzare con la classe Updater.

Nel corso dell'articolo scriveremo alcuni semplici bot, questi ultimi, in base ad una determinata data e codice paese, determineranno se un giorno in un determinato paese è un fine settimana o un giorno lavorativo secondo il calendario di produzione. Ma, come prima, lo scopo dell'articolo è familiarizzare con l'interfaccia del pacchetto telegram.bot per risolvere i tuoi problemi.

Scrivere un bot di Telegram in R (parte 2): aggiunta del supporto per i comandi e dei filtri dei messaggi al bot

Tutti gli articoli della serie "Scrivere un bot di Telegram in R"

  1. Creiamo un bot e lo utilizziamo per inviare messaggi in Telegram
  2. Aggiungi il supporto dei comandi e i filtri dei messaggi al bot

contenuto

Se sei interessato all'analisi dei dati, potresti essere interessato al mio Telegram и youtube canali. La maggior parte del contenuto è dedicata al linguaggio R.

  1. Classe di aggiornamento
  2. Gestori - gestori
  3. Aggiungi il primo comando al bot, gestore comandi
  4. Processore e filtri dei messaggi di testo
  5. Aggiunta di comandi con parametri
  6. Esegui il bot in background
  7. conclusione

Classe di aggiornamento

Updater è una classe che semplifica lo sviluppo di un bot di Telegram e utilizza la classe dietro le quinte Dispetcher. Assegnazione di classe Updater è ricevere aggiornamenti dal bot (nell'articolo precedente abbiamo utilizzato a questo scopo il metodo getUpdates()) e trasferirli ulteriormente in Dispetcher.

A sua volta Dispetcher contiene i gestori che hai creato, ad es. oggetti di classe Handler.

Gestori - gestori

Con i gestori a cui aggiungi Dispetcher reazioni dei bot a vari eventi. Al momento della stesura di questo articolo in telegram.bot Sono stati aggiunti i seguenti tipi di gestori:

  • MessageHandler: gestore dei messaggi
  • CommandHandler: gestore dei comandi
  • CallbackQueryHandler — Gestore dati per tastiere inviato da Inline
  • ErrorHandler: gestore degli errori durante la richiesta di aggiornamenti dal bot

Aggiungi il primo comando al bot, gestore comandi

Se non hai mai utilizzato i bot prima e non sai cos'è un comando, i comandi al bot devono essere inviati utilizzando una barra / come prefisso.

Inizieremo con comandi semplici, ad es. insegniamo al nostro bot a salutare a comando /hi.

Codice 1: insegnare al bot a salutare

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

Esegui l'esempio di codice sopra, dopo aver sostituito 'IL TUO BOT TOKEN' con il token reale che hai ricevuto durante la creazione del bot tramite BotPadre (Ho parlato della creazione di un bot in primo articolo).

metodo start_polling() classe Updater, utilizzato alla fine del codice, avvia un ciclo infinito di richiesta ed elaborazione degli aggiornamenti dal bot.

Adesso apriamo Telegram e scriviamo il primo comando al nostro bot /hi.

Scrivere un bot di Telegram in R (parte 2): aggiunta del supporto per i comandi e dei filtri dei messaggi al bot

Ora il nostro bot capisce il comando /hi, e sa come accoglierci.

Schematicamente, il processo di creazione di un bot così semplice può essere rappresentato come segue.

Scrivere un bot di Telegram in R (parte 2): aggiunta del supporto per i comandi e dei filtri dei messaggi al bot

  1. Crea un'istanza della classe Updater;
  2. Creiamo metodi, ad es. funzioni che il nostro bot eseguirà. Nell'esempio di codice questa è una funzione say_hello(). Le funzioni che utilizzerai come metodi bot devono avere due argomenti obbligatori: museruola и updatee uno facoltativo - args. Discussione museruola, questo è il tuo bot, con il suo aiuto puoi rispondere ai messaggi, inviare messaggi o utilizzare qualsiasi altro metodo disponibile per il bot. Discussione update questo è ciò che il bot ha ricevuto dall'utente, anzi, ciò che abbiamo ricevuto noi nel primo articolo utilizzando il metodo getUpdates(). Discussione args consente di elaborare dati aggiuntivi inviati dall'utente insieme al comando, torneremo su questo argomento poco dopo;
  3. Creiamo gestori, ad es. Associamo alcune azioni dell'utente ai metodi creati nel passaggio precedente. Essenzialmente, un gestore è un trigger, un evento che richiama alcune funzioni del bot. Nel nostro esempio, tale trigger invia un comando /hi, ed è implementato dal team hi_hendler <- CommandHandler('hi', say_hello). Primo argomento della funzione CommandHandler() ti permette di specificare un comando, nel nostro caso hi, a cui il bot risponderà. Il secondo argomento consente di specificare il metodo del bot, chiameremo il metodo say_hello, che verrà eseguito se l'utente chiama il comando specificato nel primo argomento;
  4. Successivamente, aggiungiamo il gestore creato al dispatcher della nostra istanza di classe Updater. Puoi aggiungere gestori in diversi modi; nell'esempio sopra ho usato quello più semplice, utilizzando il segno +Ie updater <- updater + hi_hendler. Lo stesso può essere fatto utilizzando il metodo add_handler(), che appartiene alla classe Dispatcher, puoi trovare questo metodo in questo modo: updater$dispatcher$add_handler();
  5. Avvia il bot utilizzando il comando start_polling().

Processore e filtri dei messaggi di testo

Abbiamo capito come inviare comandi al bot, ma a volte abbiamo bisogno che il bot risponda non solo ai comandi, ma anche ad alcuni normali messaggi di testo. Per fare ciò è necessario utilizzare i gestori di messaggi − Gestore dei messaggi.

ordinario Gestore dei messaggi risponderà assolutamente a tutti i messaggi in arrivo. Pertanto, i gestori di messaggi vengono spesso utilizzati insieme ai filtri. Insegniamo al bot a salutare non solo a comando /hi, ma anche ogni volta che nel messaggio inviato al bot compare una delle seguenti parole: ciao, ciao, saluto, hai, bonjour.

Per ora non scriveremo nessun nuovo metodo, perché... Abbiamo già un metodo con cui il bot ci saluta. Tutto quello che dobbiamo fare è creare il filtro e il gestore dei messaggi richiesti.

Codice 2: aggiungi un gestore e un filtro per i messaggi di testo

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

Esegui l'esempio di codice sopra, dopo aver sostituito 'IL TUO BOT TOKEN' con il token reale che hai ricevuto durante la creazione del bot tramite BotPadre (Ho parlato della creazione di un bot in primo articolo).

Ora proviamo a inviare al bot diversi messaggi contenenti le parole di saluto elencate in precedenza:
Scrivere un bot di Telegram in R (parte 2): aggiunta del supporto per i comandi e dei filtri dei messaggi al bot

Quindi, prima di tutto, abbiamo insegnato al bot non solo a salutare, ma a rispondere a un saluto. Lo abbiamo fatto utilizzando l'argomento risposta_a_ID_messaggio, disponibile nel metodo sendMessage(), nel quale devi trasferire l'id del messaggio a cui vuoi rispondere. Puoi ottenere l'ID del messaggio in questo modo: update$message$message_id.

Ma la cosa principale che abbiamo fatto è stata aggiungere un filtro al bot utilizzando la funzione BaseFilter():

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

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

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

)

Come avrai notato, è necessario aggiungere filtri all'oggetto Filtri messaggi, che inizialmente contiene già un piccolo set di filtri già pronti. Nel nostro esempio, all'oggetto Filtri messaggi abbiamo aggiunto un elemento hi, questo è un nuovo filtro.

In funzione BaseFilter() è necessario passare la funzione di filtro. Essenzialmente, un filtro è semplicemente una funzione che riceve un'istanza di messaggio e la restituisce TRUE o FALSO. Nel nostro esempio, abbiamo scritto una semplice funzione che, utilizzando la funzione basic grepl() controlla il testo del messaggio e se corrisponde all'espressione regolare привет|здравствуй|салют|хай|бонжур ritorna TRUE.

Successivamente creiamo un gestore di messaggi hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi). Primo argomento della funzione MessageHandler() è il metodo che chiamerà il gestore e il secondo argomento è il filtro con cui verrà chiamato. Nel nostro caso, questo è il filtro che abbiamo creato MessageFilters$hi.

Bene, alla fine aggiungiamo al dispatcher il gestore creato hi_txt_hnd.

updater <- updater + 
             hi_hendler +
             hi_txt_hnd

Come ho scritto sopra, nella confezione telegram.bot e oggetto Filtri messaggi Esiste già una serie di filtri integrati che puoi utilizzare:

  • all: tutti i messaggi
  • testo: messaggi di testo
  • comando — Comandi, ad es. messaggi che iniziano con /
  • risposta: messaggi che sono una risposta a un altro messaggio
  • audio: messaggi contenenti un file audio
  • documento: messaggi con un documento inviato
  • photo - Messaggi con immagini inviate
  • adesivo: messaggi con un adesivo inviato
  • video: messaggi con video
  • voce - Messaggi vocali
  • contatto: messaggi contenenti il ​​contenuto del telegramma dell'utente
  • location — Messaggi con geolocalizzazione
  • sede: messaggi inoltrati
  • gioco – Giochi

Se vuoi combinare alcuni filtri in un unico gestore usa semplicemente il segno | - come logico OR, e firmare & come logico И. Ad esempio, se desideri che il bot chiami lo stesso metodo quando riceve un video, un'immagine o un documento, utilizza il seguente esempio per creare un gestore di messaggi:

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

Aggiunta di comandi con parametri

Sappiamo già cosa sono i comandi, come crearli e come forzare il bot a eseguire il comando desiderato. Ma in alcuni casi, oltre al nome del comando, dobbiamo passare alcuni dati per eseguirlo.

Di seguito è riportato un esempio di bot che, dati una data e un paese, restituisce il tipo di giorno dal calendario di produzione.

Il bot seguente utilizza l'API del calendario di produzione isdayoff.ru.

Codice 3: Bot che segnala per data e 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()

Esegui l'esempio di codice sopra, dopo aver sostituito 'IL TUO BOT TOKEN' con il token reale che hai ricevuto durante la creazione del bot tramite BotPadre (Ho parlato della creazione di un bot in primo articolo).

Abbiamo creato un bot che ha un solo metodo nel suo arsenale check_date, questo metodo viene chiamato dal comando con lo stesso nome.

Ma, oltre al nome del comando, questo metodo richiede l'inserimento di due parametri, il codice paese e la data. Successivamente, il bot verifica se un determinato giorno nel paese specificato è un fine settimana, un giorno abbreviato o un giorno lavorativo secondo il calendario di produzione ufficiale.

Affinché il metodo che creiamo accetti parametri aggiuntivi insieme al comando, utilizzare l'argomento pass_args = TRUE in funzione CommandHandler()e durante la creazione di un metodo, oltre agli argomenti richiesti museruola, update creane uno facoltativo - args. Il metodo creato in questo modo accetterà i parametri che passerai al bot dopo il nome del comando. I parametri devono essere separati da uno spazio; verranno inviati al metodo come vettore di testo.

Lanciamo e testiamo il nostro bot.

Scrivere un bot di Telegram in R (parte 2): aggiunta del supporto per i comandi e dei filtri dei messaggi al bot

Esegui il bot in background

L'ultimo passaggio che dobbiamo completare è avviare il bot in background.

Per fare ciò, seguire l'algoritmo descritto di seguito:

  1. Salva il codice del bot in un file con estensione R. Quando si lavora in RStudio, ciò avviene tramite il menu Compila il , squadra Salva come….
  2. Aggiungi il percorso della cartella bin, che a sua volta si trova nella cartella in cui hai installato il linguaggio R, alla variabile Path, istruzioni qui.
  3. Crea un normale file di testo in cui scrivi 1 riga: R CMD BATCH C:UsersAlseyDocumentsmy_bot.R... Anziché C:UsersAlseyDocumentsmy_bot.R scrivi il percorso dello script del tuo bot. Allo stesso tempo, è importante che lungo il percorso non siano presenti caratteri o spazi cirillici, perché ciò potrebbe causare problemi durante l'esecuzione del bot. Salvalo e sostituisci la sua estensione con txt su bat.
  4. Apri l'Utilità di pianificazione di Windows, ci sono molti modi per farlo, ad esempio aprire qualsiasi cartella e inserire l'indirizzo %windir%system32taskschd.msc /s. È possibile trovare altri metodi di lancio qui.
  5. Nel menu in alto a destra dello scheduler, fai clic su "Crea attività...".
  6. Nella scheda "Generale", assegna alla tua attività un nome personalizzato e imposta l'interruttore sullo stato "Esegui per tutti gli utenti".
  7. Vai alla scheda "Azioni", fai clic su "Crea". Nel campo "Programma o script", fai clic su "Sfoglia", trova quello creato nel secondo passaggio bat file e fare clic su OK.
  8. Fai clic su OK e, se necessario, inserisci la password per l'account del tuo sistema operativo.
  9. Trova l'attività creata nello scheduler, selezionala e fai clic sul pulsante "Esegui" nell'angolo in basso a destra.

Il nostro bot viene eseguito in background e funzionerà finché non interrompi l'attività o spegni il PC o il server su cui è stato avviato.

conclusione

In questo articolo, abbiamo capito come scrivere un bot a tutti gli effetti in grado non solo di inviare messaggi, ma anche di rispondere a messaggi e comandi in arrivo. Le conoscenze acquisite sono già sufficienti per risolvere la maggior parte dei tuoi problemi.

Il prossimo articolo parlerà di come aggiungere una tastiera al bot per un lavoro più conveniente.

Iscriviti al mio Telegram и youtube canali.

Fonte: habr.com

Aggiungi un commento