Scriviamo un bot telegram con il linguaggio R (parte 3): Come aggiungere supporto alla tastiera al bot

Questo è il terzo articolo della serie "Scrivere un bot di telegram in linguaggio R". Negli articoli precedenti abbiamo imparato a creare un bot di telegram, inviare messaggi tramite esso, e abbiamo aggiunto comandi e filtri per i messaggi. Pertanto, prima di iniziare la lettura di questo articolo, vi consiglio vivamente di consultare le pubblicazioni precedenti, poiché qui non mi soffermerò sulle basi già descritte nella costruzione di bot.

In questo articolo miglioreremo l'usabilità del nostro bot aggiungendo una tastiera che renderà l'interfaccia del bot intuitiva e facile da usare.

Scriviamo un bot telegram con il linguaggio R (parte 3): Come aggiungere supporto alla tastiera al bot

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

  1. Creiamo un bot e inviamo messaggi tramite esso su Telegram
  2. Aggiungiamo supporto per comandi e filtri dei messaggi
  3. Come aggiungere supporto per la tastiera al bot

Contenuto

Se siete interessati all'analisi dei dati, potrebbero interessarvi i miei telegram e youtube canali. Gran parte del contenuto è dedicato al linguaggio R.

  1. Quali tipi di tastiere supporta il bot di telegram
  2. Tastiera di risposta
  3. Tastiera in linea
    3.1. Esempio di un semplice bot con supporto per i pulsanti in linea
    3.2. Esempio di bot che fornisce il meteo attuale per la città selezionata
    3.3. Esempio di bot che mostra l'elenco degli articoli più recenti con i link dell'hub specificato da habr.com
  4. Conclusione

Quali tipi di tastiere supporta il bot di telegram

Al momento della scrittura dell'articolo telegram.bot ti permette di creare tastiere di due tipi:

  • Reply — La tastiera principale e standard che si trova sotto il pannello di immissione del testo del messaggio. Questa tastiera invia semplicemente al bot un messaggio di testo, riportando come testo quello scritto sul pulsante.
  • Inline — Tastiera collegata a un messaggio specifico del bot. Questa tastiera invia al bot dati associati al pulsante premuto, e questi dati possono differire dal testo scritto sul pulsante stesso. E le funzionalità di queste bottoni sono gestite tramite CallbackQueryHandler.

Per fare in modo che il bot apra la tastiera, è necessario inviare un messaggio tramite il metodo sendMessage(), passando la tastiera precedentemente creata come argomento reply_markup.

Di seguito analizzeremo alcuni esempi.

Tastiera di risposta

Come già scritto sopra, questa è la tastiera principale per il controllo del bot.

Esempio di creazione di una tastiera Reply dalla documentazione ufficiale

bot <- Bot(token = "TOKEN")
chat_id <- "CHAT_ID"

# Crea Tastiera Personalizzata
text <- "Non sono forse quelle tastiere personalizzate fantastiche?"
RKM <- ReplyKeyboardMarkup(
  keyboard = list(
    list(KeyboardButton("Sì, certamente lo sono!")),
    list(KeyboardButton("Non sono sicuro")),
    list(KeyboardButton("No..."))
  ),
  resize_keyboard = FALSE,
  one_time_keyboard = TRUE
)

# Invia Tastiera Personalizzata
bot$sendMessage(chat_id, text, reply_markup = RKM)

Il sopra è un esempio dalla documentazione ufficiale del pacchetto telegram.bot. Per creare la tastiera si utilizza la funzione ReplyKeyboardMarkup(), che a sua volta accetta un elenco di elenchi di pulsanti, creati dalla funzione KeyboardButton().

Perché in ReplyKeyboardMarkup() è necessario passare non solo un elenco, ma un elenco di elenchi? Il motivo è che si passa l'elenco principale, e in esso si definiscono separatamente ogni riga di pulsanti, poiché in una riga possono essere posizionati più pulsanti.

Argomento resize_keyboard consente di adattare automaticamente la dimensione ottimale dei pulsanti della tastiera, mentre l'argomento one_time_keyboard consente di nascondere la tastiera dopo ogni pressione del pulsante.

Scriviamo un bot semplice, che avrà 3 pulsanti:

  • ID chat — Richiedi l'ID chat del dialogo con il bot
  • Il mio nome — Richiedi il tuo nome
  • Il mio username — Richiedi il tuo nome utente su Telegram

Codice 1: Bot semplice con tastiera Reply

library(telegram.bot)

# creiamo un'istanza della classe Updater
updater <- Updater('TOKEN DEL TUO BOT')

# creiamo i metodi
## metodo per avviare la tastiera
start <- function(bot, update) {

  # creiamo la tastiera
  RKM <- ReplyKeyboardMarkup(
    keyboard = list(
      list(KeyboardButton("ID Chat")),
      list(KeyboardButton("Il mio nome")),
      list(KeyboardButton("Il mio username"))
    ),
    resize_keyboard = FALSE,
    one_time_keyboard = TRUE
  )

  # inviamo la tastiera
  bot$sendMessage(update$message$chat_id,
                  text = 'Scegli un comando', 
                  reply_markup = RKM)

}

## metodo che restituisce l'id della chat
chat_id <- function(bot, update) {

  bot$sendMessage(update$message$chat_id, 
                  text = paste0("ID chat di questo dialogo: ", update$message$chat_id),
                  parse_mode = "Markdown")

}

## metodo che restituisce il nome
my_name <- function(bot, update) {

  bot$sendMessage(update$message$chat_id, 
                  text = paste0("Ti chiami ", update$message$from$first_name),
                  parse_mode = "Markdown")

}

## metodo che restituisce lo username
my_username <- function(bot, update) {

  bot$sendMessage(update$message$chat_id, 
                  text = paste0("Il tuo username ", update$message$from$username),
                  parse_mode = "Markdown")

}

# creiamo i filtri
## messaggi con il testo ID Chat
MessageFilters$chat_id <- BaseFilter(function(message) {

  # controlliamo il testo del messaggio
  message$text == "ID Chat"

}
)

## messaggi con il testo Il mio nome
MessageFilters$name <- BaseFilter(function(message) {

  # controlliamo il testo del messaggio
  message$text == "Il mio nome"

}
)

## messaggi con il testo Il mio username
MessageFilters$username <- BaseFilter(function(message) {

  # controlliamo il testo del messaggio
  message$text == "Il mio username"
)

# creiamo i gestori
h_start    <- CommandHandler('start', start)
h_chat_id  <- MessageHandler(chat_id, filters = MessageFilters$chat_id)
h_name     <- MessageHandler(my_name, filters = MessageFilters$name)
h_username <- MessageHandler(my_username, filters = MessageFilters$username)

# aggiungiamo i gestori al dispatcher
updater <- updater + 
            h_start +
            h_chat_id +
            h_name +
            h_username

# avviamo il bot 
updater$start_polling()

Esegui l'esempio di codice fornito sopra, sostituendo ‘IL TOKEN DEL VOSTRO BOT’ con il token reale che hai ricevuto durante la creazione del bot tramite BotFather (ho parlato della creazione del bot in primo articolo).

Dopo l'avvio, invia al bot il comando /start, poiché è questo che abbiamo definito per avviare la tastiera.

Scriviamo un bot telegram con il linguaggio R (parte 3): Come aggiungere supporto alla tastiera al bot

Se attualmente hai difficoltà a comprendere l'esempio di codice fornito, che riguarda la creazione di metodi, filtri e gestori, dovresti tornare alla precedente articolo, in cui ho descritto tutto in dettaglio.

Abbiamo creato 4 metodi:

  • start — Avvio della tastiera
  • chat_id — Richiesta dell'identificativo della chat
  • my_name — Richiesta del proprio nome
  • my_username — Richiesta del proprio nickname

Nell'oggetto MessageFilters abbiamo aggiunto 3 filtri per i messaggi, basati sul loro testo:

  • chat_id — Messaggi con il testo "Chat ID"
  • name — Messaggi con il testo "Il mio nome"
  • username — Messaggi con il testo "Il mio nickname"

E abbiamo creato 4 gestori che eseguiranno i metodi specificati in base ai comandi e ai filtri assegnati.

# создаём обработчики
h_start    <- CommandHandler('start', start)
h_chat_id  <- MessageHandler(chat_id, filters = MessageFilters$chat_id)
h_name     <- MessageHandler(my_name, filters = MessageFilters$name)
h_username <- MessageHandler(my_username, filters = MessageFilters$username)

La tastiera stessa viene creata all'interno del metodo start() comando ReplyKeyboardMarkup().

RKM <- ReplyKeyboardMarkup(
    keyboard = list(
      list(KeyboardButton("Chat ID")),
      list(KeyboardButton("Il mio nome")),
      list(KeyboardButton("Il mio nickname"))
    ),
    resize_keyboard = FALSE,
    one_time_keyboard = TRUE
)

Nel nostro caso, abbiamo disposto tutti i pulsanti uno sotto l'altro, ma possiamo anche organizzarli in un'unica fila modificando la lista dei pulsanti. Poiché una fila all'interno della tastiera viene creata tramite una lista annidata di pulsanti, per visualizzare i nostri pulsanti in un'unica fila, dobbiamo riscrivere parte del codice per costruire la tastiera in questo modo:

RKM <- ReplyKeyboardMarkup(
    keyboard = list(
      list(
          KeyboardButton("Chat ID"),
          KeyboardButton("Il mio nome"),
          KeyboardButton("Il mio login")
     )
    ),
    resize_keyboard = FALSE,
    one_time_keyboard = TRUE
)

Scriviamo un bot telegram con il linguaggio R (parte 3): Come aggiungere supporto alla tastiera al bot

La tastiera viene inviata nella chat tramite il metodo sendMessage(), nell'argomento reply_markup.

  bot$sendMessage(update$message$chat_id,
                  text = 'Seleziona un comando', 
                  reply_markup = RKM)

Tastiera in linea

Come ho già scritto sopra, la tastiera Inline è associata a un messaggio specifico. Lavorare con essa è un po' più complesso rispetto alla tastiera principale.

Inizialmente, è necessario aggiungere al bot un metodo per richiamare la tastiera Inline.

Per rispondere alla pressione del pulsante Inline, è possibile utilizzare anche il metodo del bot answerCallbackQuery(), che può visualizzare una notifica nell'interfaccia di Telegram per l'utente che ha premuto il pulsante Inline.

I dati inviati con il pulsante Inline non sono testo, quindi è necessario creare un gestore speciale per elaborarli utilizzando il comando CallbackQueryHandler().

Il codice per costruire la tastiera Inline fornito nella documentazione ufficiale del pacchetto telegram.bot.

Il codice per costruire la tastiera Inline dalla documentazione ufficiale

# Initialize bot
bot <- Bot(token = "TOKEN")
chat_id <- "CHAT_ID"

# Create Inline Keyboard
text <- "Could you type their phone number, please?"
IKM <- InlineKeyboardMarkup(
  inline_keyboard = list(
    list(
      InlineKeyboardButton(1),
      InlineKeyboardButton(2),
      InlineKeyboardButton(3)
    ),
    list(
      InlineKeyboardButton(4),
      InlineKeyboardButton(5),
      InlineKeyboardButton(6)
    ),
    list(
      InlineKeyboardButton(7),
      InlineKeyboardButton(8),
      InlineKeyboardButton(9)
    ),
    list(
      InlineKeyboardButton("*"),
      InlineKeyboardButton(0),
      InlineKeyboardButton("#")
    )
  )
)

# Send Inline Keyboard
bot$sendMessage(chat_id, text, reply_markup = IKM)

Per costruire la tastiera Inline è necessario utilizzare il comando InlineKeyboardMarkup(), seguendo lo stesso principio della tastiera Reply. In InlineKeyboardMarkup() è necessario passare un elenco di liste di pulsanti Inline, ogni singolo pulsante è creato dalla funzione InlineKeyboardButton().

Il pulsante Inline può sia inviare dati al bot utilizzando l'argomento callback_data, sia aprire una pagina HTML specificata dall'argomento url.

Il risultato sarà un elenco in cui ogni elemento è a sua volta un elenco di pulsanti Inline, che devono essere uniti in una sola fila.

Successivamente, esamineremo alcuni esempi di bot con pulsanti Inline.

Esempio di un semplice bot con supporto per i pulsanti in linea

Per iniziare, scriveremo un bot per il test rapido del covid-19. Con il comando /test, invierà una tastiera con due pulsanti; a seconda del pulsante premuto, ti invierà un messaggio con i risultati del tuo test.

Codice 2: Un semplice bot con tastiera inline

library(telegram.bot)

# creiamo un'istanza della classe Updater
updater <- Updater('IL TOKEN DEL TUO BOT')

# metodo per inviare una tastiera InLine
test <- function(bot, update) {

  # creiamo la tastiera InLine
  IKM <- InlineKeyboardMarkup(
    inline_keyboard = list(
      list(
        InlineKeyboardButton("Sì", callback_data = 'yes'),
        InlineKeyboardButton("No", callback_data = 'no')
      )
    )
  )

  # Inviamo la tastiera nella chat
  bot$sendMessage(update$message$chat_id, 
                  text = "Hai il coronavirus?", 
                  reply_markup = IKM)
}

# metodo per gestire la pressione del pulsante
answer_cb <- function(bot, update) {

  # dati ricevuti dal pulsante
  data <- update$callback_query$data

  # otteniamo il nome utente della persona che ha premuto il pulsante
  uname <- update$effective_user()$first_name

  # elaborazione del risultato
  if ( data == 'no' ) {

    msg <- paste0(uname, ", congratulazioni, il tuo test per covid-19 è negativo.")

  } else {

    msg <- paste0(uname, ", sfortunatamente il tuo test per covid-19 è positivo.")

  }

  # Invio del messaggio
  bot$sendMessage(chat_id = update$from_chat_id(),
                  text = msg)

  # informiamo il bot che la richiesta dal pulsante è stata ricevuta
  bot$answerCallbackQuery(callback_query_id = update$callback_query$id) 
}

# creiamo i gestori
inline_h      <- CommandHandler('test', test)
query_handler <- CallbackQueryHandler(answer_cb)

# aggiungiamo i gestori al dispatcher
updater <- updater + inline_h + query_handler

# avviamo il bot
updater$start_polling()

Esegui l'esempio di codice fornito sopra, sostituendo ‘IL TOKEN DEL VOSTRO BOT’ con il token reale che hai ricevuto durante la creazione del bot tramite BotFather (ho parlato della creazione del bot in primo articolo).

Risultato:
Scriviamo un bot telegram con il linguaggio R (parte 3): Come aggiungere supporto alla tastiera al bot

Abbiamo creato due metodi:

  • test — Per inviare nel chat della Tastiera Inline
  • answer_cb — Per elaborare i dati inviati dalla tastiera.

I dati che saranno inviati con ogni pulsante sono impostati nell'argomento callback_data, quando si crea il pulsante. I dati inviati dal pulsante possono essere ottenuti tramite la costruzione update$callback_query$data, all'interno del metodo answer_cb.

Affinché il bot reagisca alla Tastiera Inline, il metodo answer_cb viene trattato da un gestore speciale: CallbackQueryHandler(answer_cb). Che attiva il metodo specificato al click del pulsante Inline. Il gestore CallbackQueryHandler accetta due argomenti:

  • callback — Il metodo che deve essere attivato
  • pattern — Filtro per i dati che sono legati al pulsante tramite l'argomento callback_data.

Pertanto, tramite l'argomento pattern possiamo scrivere un metodo separato per ogni pulsante cliccato:

Codice 3: Separiamo i metodi per ogni pulsante Inline

library(telegram.bot)

# creiamo un'istanza della classe Updater
updater <- Updater('IL TOKEN DEL TUO BOT')

# metodo per inviare una tastiera InLine
test <- function(bot, update) {  

  # creiamo la tastiera InLine
  IKM <- InlineKeyboardMarkup(
    inline_keyboard = list(
      list(
        InlineKeyboardButton("Sì", callback_data = 'yes'),
        InlineKeyboardButton("No", callback_data = 'no')
      )
    )
  )

  # Inviamo la tastiera alla chat
  bot$sendMessage(update$message$chat_id, 
                  text = "Hai il coronavirus?", 
                  reply_markup = IKM)
}

# metodo per gestire la pressione del pulsante Sì
answer_cb_yes <- function(bot, update) {

  # otteniamo il nome utente che ha premuto il pulsante
  uname <- update$effective_user()$first_name

  # elaborazione del risultato
  msg <- paste0(uname, ", sfortunatamente il tuo test per covid-19 è positivo.")

  # Invio del messaggio
  bot$sendMessage(chat_id = update$from_chat_id(),
                  text = msg)

  # informiamo il bot che la richiesta dal pulsante è stata ricevuta
  bot$answerCallbackQuery(callback_query_id = update$callback_query$id) 
}

# metodo per gestire la pressione del pulsante No
answer_cb_no <- function(bot, update) {

  # otteniamo il nome utente che ha premuto il pulsante
  uname <- update$effective_user()$first_name

  msg <- paste0(uname, ", congratulazioni, il tuo test per covid-19 è negativo.")

  # Invio del messaggio
  bot$sendMessage(chat_id = update$from_chat_id(),
                  text = msg)

  # informiamo il bot che la richiesta dal pulsante è stata ricevuta
  bot$answerCallbackQuery(callback_query_id = update$callback_query$id) 
}

# creiamo i gestori
inline_h          <- CommandHandler('test', test)
query_handler_yes <- CallbackQueryHandler(answer_cb_yes, pattern = 'yes')
query_handler_no  <- CallbackQueryHandler(answer_cb_no, pattern = 'no')

# aggiungiamo i gestori al dispatcher
updater <- updater + 
            inline_h + 
            query_handler_yes +
            query_handler_no

# avviamo il bot
updater$start_polling()

Esegui l'esempio di codice fornito sopra, sostituendo ‘IL TOKEN DEL VOSTRO BOT’ con il token reale che hai ricevuto durante la creazione del bot tramite BotFather (ho parlato della creazione del bot in primo articolo).

Ora abbiamo scritto 2 metodi separati, ovvero un metodo per ciascun pulsante, e utilizzato l'argomento pattern, durante la creazione dei loro gestori:

query_handler_yes <- CallbackQueryHandler(answer_cb_yes, pattern = 'yes')
query_handler_no <- CallbackQueryHandler(answer_cb_no, pattern = 'no')

Il codice del metodo termina answer_cb comando bot$answerCallbackQuery(callback_query_id = update$callback_query$id), che informa il bot che i dati dall'interfaccia della tastiera inline sono stati ricevuti.

Esempio di bot che fornisce il meteo attuale per la città selezionata

Proviamo a scrivere un bot che richieda dati sul meteo.

La logica del suo funzionamento sarà la seguente. Inizialmente, con il comando /start richiamate la tastiera principale, nella quale è presente solo un pulsante "Meteo". Cliccando su questo pulsante, riceverete un messaggio con una tastiera inline per selezionare la città di cui desiderate conoscere il meteo attuale. Selezionate una delle città e riceverete il meteo attuale.

In questo esempio di codice utilizzeremo alcuni pacchetti aggiuntivi:

  • httr — un pacchetto per lavorare con richieste HTTP, sulla base del quale si costruisce il lavoro con qualsiasi API. Nel nostro caso utilizzeremo l'API gratuita openweathermap.org.
  • stringr — un pacchetto per lavorare con il testo, nel nostro caso lo utilizzeremo per formulare il messaggio sul meteo nella città selezionata.

Codice 4: Un bot che fornisce le previsioni del tempo attuale per la città selezionata

library(telegram.bot)
library(httr)
library(stringr)

# creiamo un'istanza della classe Updater
updater <- Updater('IL TOKEN DEL TUO BOT')

# definiamo i metodi
## metodo per avviare la tastiera principale
start <- function(bot, update) {

  # creiamo la tastiera
  RKM <- ReplyKeyboardMarkup(
    keyboard = list(
      list(
        KeyboardButton("Metereologia")
      )
    ),
    resize_keyboard = TRUE,
    one_time_keyboard = TRUE
  )

  # inviamo la tastiera
  bot$sendMessage(update$message$chat_id,
                  text = 'Scegli un comando', 
                  reply_markup = RKM)

}

## Metodo per attivare la tastiera Inine
weather <- function(bot, update) {

  IKM <- InlineKeyboardMarkup(
    inline_keyboard = list(
      list(
        InlineKeyboardButton(text = 'Mosca', callback_data = 'New York,us'),
        InlineKeyboardButton(text = 'San Pietroburgo', callback_data = 'Saint Petersburg'),
        InlineKeyboardButton(text = 'New York', callback_data = 'New York')
      ),
      list(
        InlineKeyboardButton(text = 'Ekaterinburg', callback_data = 'Yekaterinburg,ru'),
        InlineKeyboardButton(text = 'Berlino', callback_data = 'Berlin,de'),
        InlineKeyboardButton(text = 'Parigi', callback_data = 'Paris,fr')
      ),
      list(
        InlineKeyboardButton(text = 'Roma', callback_data = 'Rome,it'),
        InlineKeyboardButton(text = 'Odessa', callback_data = 'Odessa,ua'),
        InlineKeyboardButton(text = 'Kyiv', callback_data = 'Kyiv,fr')
      ),
      list(
        InlineKeyboardButton(text = 'Tokyo', callback_data = 'Tokyo'),
        InlineKeyboardButton(text = 'Amsterdam', callback_data = 'Amsterdam,nl'),
        InlineKeyboardButton(text = 'Washington', callback_data = 'Washington,us')
      )
    )
  )

  # Invia la tastiera Inline
  bot$sendMessage(chat_id = update$message$chat_id, 
                  text = "Seleziona una città", 
                  reply_markup = IKM)
}

# metodo per il messaggio del tempo
answer_cb <- function(bot, update) {

  # otteniamo dalla richiesta il nome della città
  city <- update$callback_query$data

  # inviamo la richiesta
  ans <- GET('https://api.openweathermap.org/data/2.5/weather', 
             query = list(q     = city,
                          lang  = 'it',
                          units = 'metric',
                          appid = '4776568ccea136ffe4cda9f1969af340')) 

  # analizzando la risposta
  result <- content(ans)

  # formiamo il messaggio
  msg <- str_glue("{result$name} meteo:n",
                  "Temperatura attuale: {result$main$temp}n",
                  "Velocità del vento: {result$wind$speed}n",
                  "Descrizione: {result$weather[[1]]$description}")

  # inviamo informazioni sul meteo
  bot$sendMessage(chat_id = update$from_chat_id(),
                  text    = msg)

  bot$answerCallbackQuery(callback_query_id = update$callback_query$id) 
}

# definiamo i filtri
## messaggi con il testo Meteo
MessageFilters$weather <- BaseFilter(function(message) {

  # controlliamo il testo del messaggio
  message$text == "Metereologia"

}
)

# definiamo i gestori
h_start         <- CommandHandler('start', start)
h_weather       <- MessageHandler(weather, filters = MessageFilters$weather)
h_query_handler <- CallbackQueryHandler(answer_cb)

# aggiungiamo i gestori al dispatcher
updater <- updater + 
              h_start +
              h_weather +
              h_query_handler

# avviamo il bot
updater$start_polling()

Esegui l'esempio di codice fornito sopra, sostituendo ‘IL TOKEN DEL VOSTRO BOT’ con il token reale che hai ricevuto durante la creazione del bot tramite BotFather (ho parlato della creazione del bot in primo articolo).

Di conseguenza, il nostro bot funzionerà più o meno così:
Scriviamo un bot telegram con il linguaggio R (parte 3): Come aggiungere supporto alla tastiera al bot

Questo è un schema di come può essere progettato questo bot:
Scriviamo un bot telegram con il linguaggio R (parte 3): Come aggiungere supporto alla tastiera al bot

Abbiamo creato 3 metodi disponibili all'interno del nostro bot meteorologico:

  • start — Avvio della tastiera principale del bot
  • weather — Avvio della tastiera Inline per la selezione della città
  • answer_cb — Metodo principale che secondo la città fornita richiede le informazioni meteorologiche dall'API e le invia in chat.

Metodo start viene avviato con il comando /start, implementato dal gestore CommandHandler('start', start).

Per eseguire il metodo weather abbiamo creato un filtro omonimo:

# создаём фильтры
## сообщения с текстом Погода
MessageFilters$weather <- BaseFilter(function(message) {

  # проверяем текст сообщения
  message$text == "Погода"

}
)

E chiamiamo questo metodo con il seguente gestore messaggi: MessageHandler(weather, filters = MessageFilters$weather).

E infine, il nostro metodo principale answer_cb reagisce al tocco dei pulsanti Inline, cosa implementata da un gestore speciale: CallbackQueryHandler(answer_cb).

All'interno del metodo answer_cb, leggiamo i dati inviati dalla tastiera e li memorizziamo nella variabile city: city <- update$callback_query$data. Dopodiché richiediamo all'API i dati meteorologici, formiamo e inviamo un messaggio, e infine utilizziamo il metodo answerCallbackQuery per informare il bot che abbiamo elaborato la pressione del pulsante Inline.

Un esempio di bot che mostra un elenco degli articoli più recenti con i link per il Hub specificato da habr.com.

Questo bot lo presento per mostrarvi come generare pulsanti inline che rimandano a pagine web.

La logica di questo bot è simile alla precedente; inizialmente, avviamo la tastiera principale con il comando /start. Successivamente, il bot ci offre un elenco di 6 hub, scegliamo l'hub che ci interessa e riceviamo 5 delle pubblicazioni più recenti dall'hub selezionato.

Come potete capire, in questo caso dobbiamo ottenere un elenco di articoli, e per questo utilizzeremo un pacchetto speciale habR, che permette di richiedere articoli da Habr e alcune statistiche su di essi in R.

Il pacchetto habR può essere installato solo da github, per cui avrete bisogno di un pacchetto aggiuntivo devtools. Per l'installazione, utilizzate il codice fornito di seguito.

install.packages('devtools')
devtools::install_github('selesnow/habR')

Ora consideriamo il codice per costruire il bot descritto sopra:

Codice 5: Bot che mostra l'elenco degli articoli più recenti per l'hub selezionato.

library(telegram.bot)
library(habR)

# creiamo un'istanza della classe Updater
updater <- Updater('IL TOKEN DEL TUO BOT')

# creiamo i metodi
## metodo per avviare la tastiera principale
start <- function(bot, update) {

  # creiamo la tastiera
  RKM <- ReplyKeyboardMarkup(
    keyboard = list(
      list(
        KeyboardButton("Elenco articoli")
      )
    ),
    resize_keyboard = TRUE,
    one_time_keyboard = TRUE
  )

  # inviamo la tastiera
  bot$sendMessage(update$message$chat_id,
                  text = 'Seleziona un comando', 
                  reply_markup = RKM)

}

## Metodo per invocare la tastiera Inline
habs <- function(bot, update) {

  IKM <- InlineKeyboardMarkup(
    inline_keyboard = list(
      list(
        InlineKeyboardButton(text = 'R', callback_data = 'R'),
        InlineKeyboardButton(text = 'Data Mining', callback_data = 'data_mining'),
        InlineKeyboardButton(text = 'Data Engineering', callback_data = 'data_engineering')
      ),
      list(
        InlineKeyboardButton(text = 'Big Data', callback_data = 'bigdata'),
        InlineKeyboardButton(text = 'Python', callback_data = 'python'),
        InlineKeyboardButton(text = 'Visualizzazione dati', callback_data = 'data_visualization')
      )
    )
  )

  # Invia la tastiera Inline
  bot$sendMessage(chat_id = update$message$chat_id, 
                  text = "Seleziona Hub", 
                  reply_markup = IKM)
}

# metodo per il messaggio meteo
answer_cb <- function(bot, update) {

  # otteniamo dalla messaggio la città
  hub <- update$callback_query$data

  # messaggio che indica che i dati sono stati ricevuti dal pulsante
  bot$answerCallbackQuery(callback_query_id = update$callback_query$id, 
                          text = 'Attendi alcuni minuti, la richiesta è in elaborazione') 

  # messaggio che chiede di attendere mentre il bot recupera i dati
  mid <- bot$sendMessage(chat_id = update$from_chat_id(),
                         text    = "Attendi alcuni minuti mentre raccolgo i dati dall'Hub selezionato")

  # parse dell'Habr
  posts <- head(habr_hub_posts(hub, 1), 5)

  # rimuoviamo il messaggio di attesa
  bot$deleteMessage(update$from_chat_id(), mid$message_id) 

  # formiamo l'elenco dei pulsanti
  keys <- lapply(1:5, function(x) list(InlineKeyboardButton(posts$title[x], url = posts$link[x])))

  # formiamo la tastiera
  IKM <- InlineKeyboardMarkup(
    inline_keyboard =  keys 
    )

  # inviamo le informazioni sul meteo
  bot$sendMessage(chat_id = update$from_chat_id(),
                  text    = paste0("I 5 articoli più recenti dall'Hub ", hub),
                  reply_markup = IKM)

}

# creiamo i filtri
## messaggi con testo Meteo
MessageFilters$hubs <- BaseFilter(function(message) {

  # verifichiamo il testo del messaggio
  message$text == "Elenco articoli"

}
)

# creiamo i gestori
h_start         <- CommandHandler('start', start)
h_hubs          <- MessageHandler(habs, filters = MessageFilters$hubs)
h_query_handler <- CallbackQueryHandler(answer_cb)

# aggiungiamo i gestori al dispatcher
updater <- updater + 
  h_start +
  h_hubs  +
  h_query_handler

# avviamo il bot
updater$start_polling()

Esegui l'esempio di codice fornito sopra, sostituendo ‘IL TOKEN DEL VOSTRO BOT’ con il token reale che hai ricevuto durante la creazione del bot tramite BotFather (ho parlato della creazione del bot in primo articolo).

Alla fine otterremo questo risultato:
Scriviamo un bot telegram con il linguaggio R (parte 3): Come aggiungere supporto alla tastiera al bot

L'elenco dei Hub disponibili per la selezione è stato inserito hardcoded nel metodo habs:

## Метод вызова Inine клавиатуры
habs <- function(bot, update) {

  IKM <- InlineKeyboardMarkup(
    inline_keyboard = list(
      list(
        InlineKeyboardButton(text = 'R', callback_data = 'r'),
        InlineKeyboardButton(text = 'Data Mining', callback_data = 'data_mining'),
        InlineKeyboardButton(text = 'Data Engineering', callback_data = 'data_engineering')
      ),
      list(
        InlineKeyboardButton(text = 'Big Data', callback_data = 'bigdata'),
        InlineKeyboardButton(text = 'Python', callback_data = 'python'),
        InlineKeyboardButton(text = 'Визуализация данных', callback_data = 'data_visualization')
      )
    )
  )

  # Send Inline Keyboard
  bot$sendMessage(chat_id = update$message$chat_id, 
                  text = "Выберите Хаб", 
                  reply_markup = IKM)
}

Otteniamo l'elenco degli articoli dall'Hub specificato con il comando habr_hub_posts(), dal pacchetto habR. Indichiamo che non abbiamo bisogno dell'elenco degli articoli per tutto il tempo, ma solo della prima pagina su cui si trovano 20 articoli. Dalla tabella ottenuta, usando il comando head() teniamo solo i 5 più in alto, che sono gli articoli più recenti.

  # парсим Хабр
  posts <- head(habr_hub_posts(hub, 1), 5)

La logica è molto simile a quella del bot precedente, ma in questo caso generiamo dinamicamente la tastiera inline con l'elenco degli articoli usando la funzione lapply().

  # формируем список кнопок
  keys <- lapply(1:5, function(x) list(InlineKeyboardButton(posts$title[x], url = posts$link[x])))

  # формируем клавиатуру
  IKM <- InlineKeyboardMarkup(
    inline_keyboard =  keys 
    )

Nel testo del pulsante inseriamo il titolo dell'articolo posts$title[x], e nell'argomento url il collegamento all'articolo: url = posts$link[x].

Successivamente, creiamo un filtro, i gestori e avviamo il nostro bot.

Conclusione

Ora i bot che hai scritto saranno molto più facili da usare, grazie al fatto che il loro controllo avverrà tramite tastiera e non tramite l'immissione di comandi. Almeno nell'interazione con il bot tramite smartphone, la tastiera semplificherà notevolmente il processo di utilizzo.

Nel prossimo articolo vedremo come costruire un dialogo logico con il bot e lavorare con i database.

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster