Γράψιμο ενός bot τηλεγραφήματος σε R (μέρος 3): Πώς να προσθέσετε υποστήριξη πληκτρολογίου σε ένα bot

Αυτό είναι το τρίτο άρθρο της σειράς «Γράφοντας ένα bot τηλεγραφήματος στο R». Σε προηγούμενες δημοσιεύσεις, μάθαμε πώς να δημιουργούμε ένα bot τηλεγραφήματος, να στέλνουμε μηνύματα μέσω αυτού, να προσθέσουμε εντολές και φίλτρα μηνυμάτων στο bot. Επομένως, πριν ξεκινήσετε να διαβάζετε αυτό το άρθρο, σας συνιστώ ανεπιφύλακτα να διαβάσετε προηγούμενος, επειδή Εδώ δεν θα σταθώ πλέον στα βασικά στοιχεία της κατασκευής bot που περιγράφηκαν προηγουμένως.

Σε αυτό το άρθρο, θα βελτιώσουμε τη χρηστικότητα του bot μας προσθέτοντας ένα πληκτρολόγιο, το οποίο θα κάνει τη διεπαφή bot διαισθητική και εύκολη στη χρήση.

Γράψιμο ενός bot τηλεγραφήματος σε R (μέρος 3): Πώς να προσθέσετε υποστήριξη πληκτρολογίου σε ένα bot

Όλα τα άρθρα από τη σειρά "Γράφοντας ένα bot τηλεγραφήματος στο R"

  1. Δημιουργούμε ένα bot και το χρησιμοποιούμε για να στείλουμε μηνύματα στο τηλεγράφημα
  2. Προσθέστε υποστήριξη εντολών και φίλτρα μηνυμάτων στο bot
  3. Πώς να προσθέσετε υποστήριξη πληκτρολογίου σε ένα bot

περιεχόμενο

Εάν ενδιαφέρεστε για την ανάλυση δεδομένων, μπορεί να σας ενδιαφέρει το δικό μου τηλεγράφημα и YouTube καναλιών. Το μεγαλύτερο μέρος του περιεχομένου του οποίου είναι αφιερωμένο στη γλώσσα R.

  1. Τι τύπους πληκτρολογίων υποστηρίζει το bot του telegram;
  2. Πληκτρολόγιο απάντησης
  3. Ενσωματωμένο πληκτρολόγιο
    3.1. Ένα παράδειγμα απλού bot με υποστήριξη για κουμπιά InLine
    3.2. Ένα παράδειγμα ρομπότ που αναφέρει τον τρέχοντα καιρό για μια επιλεγμένη πόλη
    3.3. Ένα παράδειγμα ρομπότ που εμφανίζει μια λίστα με τα πιο πρόσφατα άρθρα με συνδέσμους προς το καθορισμένο Hub από το habr.com
  4. Συμπέρασμα

Τι τύπους πληκτρολογίων υποστηρίζει το bot του telegram;

Τη στιγμή της συγγραφής αυτής telegram.bot σας επιτρέπει να δημιουργήσετε δύο τύπους πληκτρολογίων:

  • Απάντηση - Το κύριο, κανονικό πληκτρολόγιο, το οποίο βρίσκεται κάτω από τον πίνακα εισαγωγής κειμένου μηνύματος. Ένα τέτοιο πληκτρολόγιο απλώς στέλνει ένα μήνυμα κειμένου στο bot και ως κείμενο θα στείλει το κείμενο που είναι γραμμένο στο ίδιο το κουμπί.
  • Ενσωματωμένο - Πληκτρολόγιο που σχετίζεται με ένα συγκεκριμένο μήνυμα bot. Αυτό το πληκτρολόγιο στέλνει τα δεδομένα bot που σχετίζονται με το κουμπί που πατήθηκε· αυτά τα δεδομένα μπορεί να διαφέρουν από το κείμενο που είναι γραμμένο στο ίδιο το κουμπί. Και τέτοια κουμπιά υποβάλλονται σε επεξεργασία CallbackQueryHandler.

Για να ανοίξει το bot το πληκτρολόγιο, είναι απαραίτητο κατά την αποστολή μηνύματος μέσω της μεθόδου sendMessage(), περάστε το πληκτρολόγιο που δημιουργήθηκε προηγουμένως ως όρισμα reply_markup.

Παρακάτω θα δούμε αρκετά παραδείγματα.

Πληκτρολόγιο απάντησης

Όπως έγραψα παραπάνω, αυτό είναι το κύριο πληκτρολόγιο ελέγχου bot.

Ένα παράδειγμα δημιουργίας πληκτρολογίου Απάντηση από την επίσημη βοήθεια

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

# Create Custom Keyboard
text <- "Aren't those custom keyboards cool?"
RKM <- ReplyKeyboardMarkup(
  keyboard = list(
    list(KeyboardButton("Yes, they certainly are!")),
    list(KeyboardButton("I'm not quite sure")),
    list(KeyboardButton("No..."))
  ),
  resize_keyboard = FALSE,
  one_time_keyboard = TRUE
)

# Send Custom Keyboard
bot$sendMessage(chat_id, text, reply_markup = RKM)

Το παραπάνω είναι ένα παράδειγμα από την επίσημη βοήθεια του πακέτου telegram.bot. Για να δημιουργήσετε ένα πληκτρολόγιο, χρησιμοποιήστε τη λειτουργία ReplyKeyboardMarkup(), το οποίο με τη σειρά του παίρνει μια λίστα με λίστες κουμπιών που δημιουργούνται από τη συνάρτηση KeyboardButton().

Γιατί μέσα ReplyKeyboardMarkup() Χρειάζεται να περάσετε όχι απλώς μια λίστα, αλλά μια λίστα λιστών; Το γεγονός είναι ότι περνάτε την κύρια λίστα και σε αυτήν ορίζετε κάθε σειρά κουμπιών σε ξεχωριστές λίστες, επειδή Μπορείτε να τοποθετήσετε πολλά κουμπιά σε μία σειρά.

Επιχείρημα resize_keyboard σας επιτρέπει να επιλέξετε αυτόματα το βέλτιστο μέγεθος των κουμπιών του πληκτρολογίου και το όρισμα one_time_keyboard σας επιτρέπει να αποκρύψετε το πληκτρολόγιο μετά από κάθε πάτημα κουμπιού.

Ας γράψουμε ένα απλό bot που θα έχει 3 κουμπιά:

  • Αναγνωριστικό συνομιλίας - Ζητήστε αναγνωριστικό συνομιλίας για διάλογο με το bot
  • Το όνομά μου - Ζητήστε το όνομά σας
  • Η σύνδεσή μου - Ζητήστε το όνομα χρήστη σας στο τηλεγράφημα

Κωδικός 1: Απλό bot με πληκτρολόγιο απάντησης

library(telegram.bot)

# создаём экземпляр класса Updater
updater <- Updater('ТОКЕН ВАШЕГО БОТА')

# создаём методы
## метод для запуска клавиатуры
start <- function(bot, update) {

  # создаём клавиатуру
  RKM <- ReplyKeyboardMarkup(
    keyboard = list(
      list(KeyboardButton("Чат ID")),
      list(KeyboardButton("Моё имя")),
      list(KeyboardButton("Мой логин"))
    ),
    resize_keyboard = FALSE,
    one_time_keyboard = TRUE
  )

  # отправляем клавиатуру
  bot$sendMessage(update$message$chat_id,
                  text = 'Выберите команду', 
                  reply_markup = RKM)

}

## метод возвразающий id чата
chat_id <- function(bot, update) {

  bot$sendMessage(update$message$chat_id, 
                  text = paste0("Чат id этого диалога: ", update$message$chat_id),
                  parse_mode = "Markdown")

}

## метод возвращающий имя
my_name <- function(bot, update) {

  bot$sendMessage(update$message$chat_id, 
                  text = paste0("Вас зовут ", update$message$from$first_name),
                  parse_mode = "Markdown")

}

## метод возвращающий логин
my_username <- function(bot, update) {

  bot$sendMessage(update$message$chat_id, 
                  text = paste0("Ваш логин ", update$message$from$username),
                  parse_mode = "Markdown")

}

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

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

}
)

## сообщения с текстом Моё имя
MessageFilters$name <- BaseFilter(function(message) {

  # проверяем текст сообщения
  message$text == "Моё имя"

}
)

## сообщения с текстом Мой логин
MessageFilters$username <- BaseFilter(function(message) {

  # проверяем текст сообщения
  message$text == "Мой логин"
)

# создаём обработчики
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)

# добавляем обработчики в диспетчер
updater <- updater + 
            h_start +
            h_chat_id +
            h_name +
            h_username

# запускаем бота 
updater$start_polling()

Εκτελέστε το παραπάνω παράδειγμα κώδικα, αφού αντικαταστήσετε το "YOUR BOT TOKEN" με το πραγματικό διακριτικό που λάβατε κατά τη δημιουργία του bot μέσω BotFather (Μίλησα για τη δημιουργία ενός bot στο πρώτο άρθρο).

Μετά την εκκίνηση, δώστε στο bot μια εντολή /start, επειδή Αυτό ακριβώς ορίσαμε για την εκκίνηση του πληκτρολογίου.

Γράψιμο ενός bot τηλεγραφήματος σε R (μέρος 3): Πώς να προσθέσετε υποστήριξη πληκτρολογίου σε ένα bot

Εάν αυτή τη στιγμή είναι δύσκολο για εσάς να αναλύσετε το συγκεκριμένο παράδειγμα κώδικα, με τη δημιουργία μεθόδων, φίλτρων και χειριστών, τότε θα πρέπει να επιστρέψετε στο προηγούμενο άρθρο, στο οποίο περιέγραψα όλα αυτά αναλυτικά.

Δημιουργήσαμε 4 μεθόδους:

  • έναρξη — Εκκινήστε το πληκτρολόγιο
  • chat_id — Ζητήστε αναγνωριστικό συνομιλίας
  • my_name — Ζητήστε το όνομά σας
  • my_username — Ζητήστε τη σύνδεσή σας

Αντιλέγω, διαμαρτύρομαι Φίλτρα μηνυμάτων πρόσθεσε 3 φίλτρα μηνυμάτων με βάση το κείμενό τους:

  • chat_id — Μηνύματα με κείμενο "Чат ID"
  • όνομα — Μηνύματα με κείμενο "Моё имя"
  • όνομα χρήστη — Μηνύματα με κείμενο "Мой логин"

Και δημιουργήσαμε 4 χειριστές που, με βάση δεδομένες εντολές και φίλτρα, θα εκτελέσουν τις καθορισμένες μεθόδους.

# создаём обработчики
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)

Το ίδιο το πληκτρολόγιο δημιουργείται μέσα στη μέθοδο start() ομάδα ReplyKeyboardMarkup().

RKM <- ReplyKeyboardMarkup(
    keyboard = list(
      list(KeyboardButton("Чат ID")),
      list(KeyboardButton("Моё имя")),
      list(KeyboardButton("Мой логин"))
    ),
    resize_keyboard = FALSE,
    one_time_keyboard = TRUE
)

Στην περίπτωσή μας, τοποθετήσαμε όλα τα κουμπιά το ένα κάτω από το άλλο, αλλά μπορούμε να τα τακτοποιήσουμε σε μία σειρά κάνοντας αλλαγές στη λίστα με τις λίστες κουμπιών. Επειδή Μια σειρά μέσα στο πληκτρολόγιο δημιουργείται μέσω μιας ένθετης λίστας κουμπιών, στη συνέχεια για να εμφανίσουμε τα κουμπιά μας σε μια σειρά πρέπει να ξαναγράψουμε μέρος του κώδικα για την κατασκευή του πληκτρολογίου ως εξής:

RKM <- ReplyKeyboardMarkup(
    keyboard = list(
      list(
          KeyboardButton("Чат ID"),
          KeyboardButton("Моё имя"),
          KeyboardButton("Мой логин")
     )
    ),
    resize_keyboard = FALSE,
    one_time_keyboard = TRUE
)

Γράψιμο ενός bot τηλεγραφήματος σε R (μέρος 3): Πώς να προσθέσετε υποστήριξη πληκτρολογίου σε ένα bot

Το πληκτρολόγιο αποστέλλεται στη συνομιλία χρησιμοποιώντας τη μέθοδο sendMessage(), στο επιχείρημα reply_markup.

  bot$sendMessage(update$message$chat_id,
                  text = 'Выберите команду', 
                  reply_markup = RKM)

Ενσωματωμένο πληκτρολόγιο

Όπως έγραψα παραπάνω, το πληκτρολόγιο Inline συνδέεται με ένα συγκεκριμένο μήνυμα. Είναι κάπως πιο δύσκολο να δουλέψεις από το κύριο πληκτρολόγιο.

Αρχικά, πρέπει να προσθέσετε μια μέθοδο στο bot για να καλέσετε το Inline πληκτρολόγιο.

Για να απαντήσετε σε ένα κλικ στο κουμπί Inline, μπορείτε επίσης να χρησιμοποιήσετε τη μέθοδο bot answerCallbackQuery(), το οποίο μπορεί να εμφανίσει μια ειδοποίηση στη διεπαφή του τηλεγραφήματος στον χρήστη που πατά το κουμπί Inline.

Τα δεδομένα που αποστέλλονται από το κουμπί Inline δεν είναι κείμενο, επομένως για να τα επεξεργαστείτε πρέπει να δημιουργήσετε έναν ειδικό χειριστή χρησιμοποιώντας την εντολή CallbackQueryHandler().

Ο κωδικός κατασκευής ενός Inline πληκτρολογίου ο οποίος δίνεται στην επίσημη βοήθεια του πακέτου telegram.bot.

Κωδικός για την κατασκευή ενός πληκτρολογίου Inline από την επίσημη βοήθεια

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

Πρέπει να δημιουργήσετε ένα ενσωματωμένο πληκτρολόγιο χρησιμοποιώντας την εντολή InlineKeyboardMarkup(), με την ίδια αρχή με το πληκτρολόγιο Απάντηση. ΣΕ InlineKeyboardMarkup() είναι απαραίτητο να περάσετε μια λίστα με λίστες με κουμπιά Inline, κάθε μεμονωμένο κουμπί δημιουργείται από τη συνάρτηση InlineKeyboardButton().

Ένα ενσωματωμένο κουμπί μπορεί είτε να μεταβιβάσει ορισμένα δεδομένα στο bot χρησιμοποιώντας ένα όρισμα callback_data, ή ανοίξτε οποιαδήποτε σελίδα HTML που καθορίστηκε χρησιμοποιώντας το όρισμα url.

Το αποτέλεσμα θα είναι μια λίστα στην οποία κάθε στοιχείο είναι επίσης μια λίστα με κουμπιά Inline που πρέπει να συνδυαστούν σε μια σειρά.

Στη συνέχεια θα δούμε αρκετά παραδείγματα bots με κουμπιά Inline.

Ένα παράδειγμα απλού bot με υποστήριξη για κουμπιά InLine

Αρχικά, θα γράψουμε ένα bot για εξπρές τεστ για covid-19. Με εντολή /test, θα σας στείλει ένα πληκτρολόγιο με δύο κουμπιά, ανάλογα με το κουμπί που θα πατήσετε θα σας στείλει ένα μήνυμα με τα αποτελέσματα της δοκιμής σας.

Κωδικός 2: Το πιο απλό bot με ενσωματωμένο πληκτρολόγιο

library(telegram.bot)

# создаём экземпляр класса Updater
updater <- Updater('ТОКЕН ВАШЕГО БОТА')

# метод для отправки InLine клавиатуры
test <- function(bot, update) {

  # создаём InLine клавиатуру
  IKM <- InlineKeyboardMarkup(
    inline_keyboard = list(
      list(
        InlineKeyboardButton("Да", callback_data = 'yes'),
        InlineKeyboardButton("Нет", callback_data = 'no')
      )
    )
  )

  # Отправляем клавиатуру в чат
  bot$sendMessage(update$message$chat_id, 
                  text = "Вы болете коронавирусом?", 
                  reply_markup = IKM)
}

# метод для обработки нажатия кнопки
answer_cb <- function(bot, update) {

  # полученные данные с кнопки
  data <- update$callback_query$data

  # получаем имя пользователя, нажавшего кнопку
  uname <- update$effective_user()$first_name

  # обработка результата
  if ( data == 'no' ) {

    msg <- paste0(uname, ", поздравляю, ваш тест на covid-19 отрицательный.")

  } else {

    msg <- paste0(uname, ", к сожалени ваш тест на covid-19 положительный.")

  }

  # Отправка сообщения
  bot$sendMessage(chat_id = update$from_chat_id(),
                  text = msg)

  # сообщаем боту, что запрос с кнопки принят
  bot$answerCallbackQuery(callback_query_id = update$callback_query$id) 
}

# создаём обработчики
inline_h      <- CommandHandler('test', test)
query_handler <- CallbackQueryHandler(answer_cb)

# добавляем обработчики в диспетчер
updater <- updater + inline_h + query_handler

# запускаем бота
updater$start_polling()

Εκτελέστε το παραπάνω παράδειγμα κώδικα, αφού αντικαταστήσετε το "YOUR BOT TOKEN" με το πραγματικό διακριτικό που λάβατε κατά τη δημιουργία του bot μέσω BotFather (Μίλησα για τη δημιουργία ενός bot στο πρώτο άρθρο).

Το αποτέλεσμα:
Γράψιμο ενός bot τηλεγραφήματος σε R (μέρος 3): Πώς να προσθέσετε υποστήριξη πληκτρολογίου σε ένα bot

Δημιουργήσαμε δύο μεθόδους:

  • δοκιμή — Για αποστολή στη συνομιλία Ενσωματωμένο πληκτρολόγιο
  • answer_cb — Για επεξεργασία δεδομένων που αποστέλλονται από το πληκτρολόγιο.

Τα δεδομένα που θα σταλούν από κάθε κουμπί καθορίζονται στο όρισμα callback_data, κατά τη δημιουργία ενός κουμπιού. Μπορείτε να λάβετε τα δεδομένα που αποστέλλονται από το κουμπί χρησιμοποιώντας την κατασκευή update$callback_query$data, μέσα στη μέθοδο answer_cb.

Για να αντιδράσει το bot στο Inline πληκτρολόγιο, μέθοδος answer_cb επεξεργάζεται από ειδικό χειριστή: CallbackQueryHandler(answer_cb). Η οποία εκτελεί την καθορισμένη μέθοδο όταν κάνετε κλικ στο κουμπί Inline. Χειριστής CallbackQueryHandler παίρνει δύο επιχειρήματα:

  • callback — Η μέθοδος που πρέπει να εκτελεστεί
  • pattern — Φιλτράρισμα κατά δεδομένα που είναι συνδεδεμένα με το κουμπί χρησιμοποιώντας ένα όρισμα callback_data.

Κατά συνέπεια, χρησιμοποιώντας το επιχείρημα pattern Μπορούμε να γράψουμε μια ξεχωριστή μέθοδο για το πάτημα κάθε κουμπιού:

Κωδικός 3: Ξεχωριστές μεθόδους για κάθε κουμπί Inline

library(telegram.bot)

# создаём экземпляр класса Updater
updater <- Updater('ТОКЕН ВАШЕГО БОТА')

# метод для отправки InLine клавиатуры
test <- function(bot, update) {  

  # создаём InLine клавиатуру
  IKM <- InlineKeyboardMarkup(
    inline_keyboard = list(
      list(
        InlineKeyboardButton("Да", callback_data = 'yes'),
        InlineKeyboardButton("Нет", callback_data = 'no')
      )
    )
  )

  # Отправляем клавиатуру в чат
  bot$sendMessage(update$message$chat_id, 
                  text = "Вы болете коронавирусом?", 
                  reply_markup = IKM)
}

# метод для обработки нажатия кнопки Да
answer_cb_yes <- function(bot, update) {

  # получаем имя пользователя, нажавшего кнопку
  uname <- update$effective_user()$first_name

  # обработка результата
  msg <- paste0(uname, ", к сожалени ваш текст на covid-19 положительный.")

  # Отправка сообщения
  bot$sendMessage(chat_id = update$from_chat_id(),
                  text = msg)

  # сообщаем боту, что запрос с кнопки принят
  bot$answerCallbackQuery(callback_query_id = update$callback_query$id) 
}

# метод для обработки нажатия кнопки Нет
answer_cb_no <- function(bot, update) {

  # получаем имя пользователя, нажавшего кнопку
  uname <- update$effective_user()$first_name

  msg <- paste0(uname, ", поздравляю, ваш текст на covid-19 отрицательный.")

  # Отправка сообщения
  bot$sendMessage(chat_id = update$from_chat_id(),
                  text = msg)

  # сообщаем боту, что запрос с кнопки принят
  bot$answerCallbackQuery(callback_query_id = update$callback_query$id) 
}

# создаём обработчики
inline_h          <- CommandHandler('test', test)
query_handler_yes <- CallbackQueryHandler(answer_cb_yes, pattern = 'yes')
query_handler_no  <- CallbackQueryHandler(answer_cb_no, pattern = 'no')

# добавляем обработчики в диспетчер
updater <- updater + 
            inline_h + 
            query_handler_yes +
            query_handler_no

# запускаем бота
updater$start_polling()

Εκτελέστε το παραπάνω παράδειγμα κώδικα, αφού αντικαταστήσετε το "YOUR BOT TOKEN" με το πραγματικό διακριτικό που λάβατε κατά τη δημιουργία του bot μέσω BotFather (Μίλησα για τη δημιουργία ενός bot στο πρώτο άρθρο).

Τώρα έχουμε γράψει 2 ξεχωριστές μεθόδους π.χ. μία μέθοδο, για κάθε κουμπί πατήστε και χρησιμοποίησε το όρισμα pattern, κατά τη δημιουργία των χειριστών τους:

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

Ο κωδικός μεθόδου τελειώνει answer_cb ομάδα bot$answerCallbackQuery(callback_query_id = update$callback_query$id), το οποίο λέει στο bot ότι έχουν ληφθεί δεδομένα από το ενσωματωμένο πληκτρολόγιο.

Ένα παράδειγμα ρομπότ που αναφέρει τον τρέχοντα καιρό για μια επιλεγμένη πόλη

Ας προσπαθήσουμε να γράψουμε ένα ρομπότ που ζητά δεδομένα καιρού.

Η λογική της δουλειάς του θα είναι η εξής. Αρχικά από την ομάδα /start καλείτε το κύριο πληκτρολόγιο, το οποίο έχει μόνο ένα κουμπί "Καιρός". Κάνοντας κλικ σε αυτό το κουμπί θα λάβετε ένα μήνυμα με το πληκτρολόγιο Inline για να επιλέξετε την πόλη για την οποία θέλετε να μάθετε τον τρέχοντα καιρό. Επιλέξτε μία από τις πόλεις και δείτε τον τρέχοντα καιρό.

Σε αυτό το παράδειγμα κώδικα θα χρησιμοποιήσουμε πολλά πρόσθετα πακέτα:

  • httr — ένα πακέτο για εργασία με αιτήματα HTTP, βάσει του οποίου δημιουργείται η εργασία με οποιοδήποτε API. Στην περίπτωσή μας θα χρησιμοποιήσουμε το δωρεάν API openweathermap.org.
  • stringr — ένα πακέτο για εργασία με κείμενο, στην περίπτωσή μας θα το χρησιμοποιήσουμε για να δημιουργήσουμε ένα μήνυμα σχετικά με τον καιρό στην επιλεγμένη πόλη.

Κωδικός 4: Ένα ρομπότ που αναφέρει τον τρέχοντα καιρό για την επιλεγμένη πόλη

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

# создаём экземпляр класса Updater
updater <- Updater('ТОКЕН ВАШЕГО БОТА')

# создаём методы
## метод для запуска основной клавиатуры
start <- function(bot, update) {

  # создаём клавиатуру
  RKM <- ReplyKeyboardMarkup(
    keyboard = list(
      list(
        KeyboardButton("Погода")
      )
    ),
    resize_keyboard = TRUE,
    one_time_keyboard = TRUE
  )

  # отправляем клавиатуру
  bot$sendMessage(update$message$chat_id,
                  text = 'Выберите команду', 
                  reply_markup = RKM)

}

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

  IKM <- InlineKeyboardMarkup(
    inline_keyboard = list(
      list(
        InlineKeyboardButton(text = 'Москва', callback_data = 'New York,us'),
        InlineKeyboardButton(text = 'Санкт-Петербург', callback_data = 'Saint Petersburg'),
        InlineKeyboardButton(text = 'Нью-Йорк', callback_data = 'New York')
      ),
      list(
        InlineKeyboardButton(text = 'Екатеринбург', callback_data = 'Yekaterinburg,ru'),
        InlineKeyboardButton(text = 'Берлин', callback_data = 'Berlin,de'),
        InlineKeyboardButton(text = 'Париж', callback_data = 'Paris,fr')
      ),
      list(
        InlineKeyboardButton(text = 'Рим', callback_data = 'Rome,it'),
        InlineKeyboardButton(text = 'Одесса', callback_data = 'Odessa,ua'),
        InlineKeyboardButton(text = 'Киев', callback_data = 'Kyiv,fr')
      ),
      list(
        InlineKeyboardButton(text = 'Токио', callback_data = 'Tokyo'),
        InlineKeyboardButton(text = 'Амстердам', callback_data = 'Amsterdam,nl'),
        InlineKeyboardButton(text = 'Вашингтон', callback_data = 'Washington,us')
      )
    )
  )

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

# метод для сообщения погоды
answer_cb <- function(bot, update) {

  # получаем из сообщения город
  city <- update$callback_query$data

  # отправляем запрос
  ans <- GET('https://api.openweathermap.org/data/2.5/weather', 
             query = list(q     = city,
                          lang  = 'ru',
                          units = 'metric',
                          appid = '4776568ccea136ffe4cda9f1969af340')) 

  # парсим ответ
  result <- content(ans)

  # формируем сообщение
  msg <- str_glue("{result$name} погода:n",
                  "Текущая температура: {result$main$temp}n",
                  "Скорость ветра: {result$wind$speed}n",
                  "Описание: {result$weather[[1]]$description}")

  # отправляем информацию о погоде
  bot$sendMessage(chat_id = update$from_chat_id(),
                  text    = msg)

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

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

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

}
)

# создаём обработчики
h_start         <- CommandHandler('start', start)
h_weather       <- MessageHandler(weather, filters = MessageFilters$weather)
h_query_handler <- CallbackQueryHandler(answer_cb)

# добавляем обработчики в диспетчер
updater <- updater + 
              h_start +
              h_weather +
              h_query_handler

# запускаем бота
updater$start_polling()

Εκτελέστε το παραπάνω παράδειγμα κώδικα, αφού αντικαταστήσετε το "YOUR BOT TOKEN" με το πραγματικό διακριτικό που λάβατε κατά τη δημιουργία του bot μέσω BotFather (Μίλησα για τη δημιουργία ενός bot στο πρώτο άρθρο).

Ως αποτέλεσμα, το bot μας θα λειτουργεί κάπως έτσι:
Γράψιμο ενός bot τηλεγραφήματος σε R (μέρος 3): Πώς να προσθέσετε υποστήριξη πληκτρολογίου σε ένα bot

Σχηματικά, αυτό το bot μπορεί να απεικονιστεί ως εξής:
Γράψιμο ενός bot τηλεγραφήματος σε R (μέρος 3): Πώς να προσθέσετε υποστήριξη πληκτρολογίου σε ένα bot

Έχουμε δημιουργήσει 3 διαθέσιμες μεθόδους μέσα στο bot καιρού:

  • Εκκίνηση — Εκκινήστε το κύριο πληκτρολόγιο bot
  • καιρός — Εκκινήστε το Inline πληκτρολόγιο για να επιλέξετε μια πόλη
  • answer_cb — Η κύρια μέθοδος που ζητά τον καιρό από το API για μια δεδομένη πόλη και τον στέλνει στη συνομιλία.

Μέθοδος Εκκίνηση το εκκινούμε με την εντολή /start, το οποίο υλοποιείται από τον χειριστή CommandHandler('start', start).

Για να εκτελέσετε μια μέθοδο καιρός δημιουργήσαμε ένα φίλτρο με το ίδιο όνομα:

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

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

}
)

Και καλούμε αυτήν τη μέθοδο με τον ακόλουθο χειριστή μηνυμάτων: MessageHandler(weather, filters = MessageFilters$weather).

Και στο τέλος, η κύρια μέθοδος μας answer_cb αντιδρά στο πάτημα των κουμπιών Inline, το οποίο υλοποιείται από έναν ειδικό χειριστή: CallbackQueryHandler(answer_cb).

Μέσα σε μια μέθοδο answer_cb, διαβάζουμε τα δεδομένα που αποστέλλονται από το πληκτρολόγιο και τα γράφουμε σε μια μεταβλητή city: city <- update$callback_query$data. Στη συνέχεια ζητάμε δεδομένα καιρού από το API, δημιουργούμε και στέλνουμε ένα μήνυμα και, τέλος, χρησιμοποιούμε τη μέθοδο answerCallbackQuery προκειμένου να ενημερώσουμε το bot ότι επεξεργαστήκαμε το κλικ του κουμπιού Inline.

Ένα παράδειγμα ρομπότ που εμφανίζει μια λίστα με τα πιο πρόσφατα άρθρα με συνδέσμους προς το καθορισμένο Hub από www.habr.com.

Παρουσιάζω αυτό το bot για να σας δείξω πώς να εμφανίζετε τα κουμπιά Inline που οδηγούν σε ιστοσελίδες.

Η λογική αυτού του bot είναι παρόμοια με το προηγούμενο· αρχικά ξεκινάμε το κύριο πληκτρολόγιο με την εντολή /start. Στη συνέχεια, το bot μας δίνει μια λίστα με 6 κόμβους για να διαλέξουμε, επιλέγουμε τον κόμβο που μας ενδιαφέρει και λαμβάνουμε τις 5 πιο πρόσφατες δημοσιεύσεις από το επιλεγμένο Κέντρο.

Όπως καταλαβαίνετε, σε αυτήν την περίπτωση πρέπει να λάβουμε μια λίστα άρθρων και για αυτό θα χρησιμοποιήσουμε ένα ειδικό πακέτο habR, το οποίο σας επιτρέπει να ζητάτε άρθρα από τη Habra και ορισμένα στατιστικά στοιχεία για αυτά στο R.

Εγκαταστήστε το πακέτο habR είναι δυνατή μόνο από το github, για το οποίο θα χρειαστείτε ένα επιπλέον πακέτο devtools. Για εγκατάσταση, χρησιμοποιήστε τον παρακάτω κώδικα.

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

Τώρα ας δούμε τον κώδικα για τη δημιουργία του bot που περιγράφεται παραπάνω:

Κωδικός 5: Ένα ρομπότ που εμφανίζει μια λίστα με τα πιο πρόσφατα άρθρα στο επιλεγμένο Hub

library(telegram.bot)
library(habR)

# создаём экземпляр класса Updater
updater <- Updater('ТОКЕН ВАШЕГО БОТА')

# создаём методы
## метод для запуска основной клавиатуры
start <- function(bot, update) {

  # создаём клавиатуру
  RKM <- ReplyKeyboardMarkup(
    keyboard = list(
      list(
        KeyboardButton("Список статей")
      )
    ),
    resize_keyboard = TRUE,
    one_time_keyboard = TRUE
  )

  # отправляем клавиатуру
  bot$sendMessage(update$message$chat_id,
                  text = 'Выберите команду', 
                  reply_markup = RKM)

}

## Метод вызова 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)
}

# метод для сообщения погоды
answer_cb <- function(bot, update) {

  # получаем из сообщения город
  hub <- update$callback_query$data

  # сообщение о том, что данные по кнопке получены
  bot$answerCallbackQuery(callback_query_id = update$callback_query$id, 
                          text = 'Подождите несколько минут, запрос обрабатывается') 

  # сообщение о том, что надо подождать пока бот получит данные
  mid <- bot$sendMessage(chat_id = update$from_chat_id(),
                         text    = "Подождите несколько минут пока, я соберу данные по выбранному Хабу")

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

  # удаляем сообщение о том, что надо подождать
  bot$deleteMessage(update$from_chat_id(), mid$message_id) 

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

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

  # отправляем информацию о погоде
  bot$sendMessage(chat_id = update$from_chat_id(),
                  text    = paste0("5 наиболее свежих статей из Хаба ", hub),
                  reply_markup = IKM)

}

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

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

}
)

# создаём обработчики
h_start         <- CommandHandler('start', start)
h_hubs          <- MessageHandler(habs, filters = MessageFilters$hubs)
h_query_handler <- CallbackQueryHandler(answer_cb)

# добавляем обработчики в диспетчер
updater <- updater + 
  h_start +
  h_hubs  +
  h_query_handler

# запускаем бота
updater$start_polling()

Εκτελέστε το παραπάνω παράδειγμα κώδικα, αφού αντικαταστήσετε το "YOUR BOT TOKEN" με το πραγματικό διακριτικό που λάβατε κατά τη δημιουργία του bot μέσω BotFather (Μίλησα για τη δημιουργία ενός bot στο πρώτο άρθρο).

Ως αποτέλεσμα, θα έχουμε αυτό το αποτέλεσμα:
Γράψιμο ενός bot τηλεγραφήματος σε R (μέρος 3): Πώς να προσθέσετε υποστήριξη πληκτρολογίου σε ένα bot

Κωδικοποιήσαμε τη λίστα των Hub που είναι διαθέσιμα για επιλογή στη μέθοδο 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)
}

Λαμβάνουμε μια λίστα άρθρων από το καθορισμένο Hub με την εντολή habr_hub_posts(), από τη συσκευασία habR. Ταυτόχρονα επισημαίνουμε ότι δεν χρειαζόμαστε λίστα άρθρων για όλη την ώρα, αλλά μόνο την πρώτη σελίδα στην οποία βρίσκονται 20 άρθρα. Από τον πίνακα που προκύπτει χρησιμοποιώντας την εντολή head() Αφήνουμε μόνο το top 5, που είναι τα πιο πρόσφατα άρθρα.

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

Η λογική είναι πολύ παρόμοια με το προηγούμενο bot, αλλά σε αυτήν την περίπτωση δημιουργούμε ένα ενσωματωμένο πληκτρολόγιο με μια λίστα άρθρων δυναμικά χρησιμοποιώντας τη συνάρτηση lapply().

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

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

Εισάγουμε τον τίτλο του άρθρου στο κείμενο του κουμπιού posts$title[x], και στο επιχείρημα url σύνδεσμος προς το άρθρο: url = posts$link[x].

Στη συνέχεια, δημιουργούμε ένα φίλτρο, χειριστές και εκκινούμε το bot μας.

Συμπέρασμα

Τώρα τα bots που γράφεις θα είναι πολύ πιο βολικά στη χρήση, λόγω του ότι θα ελέγχονται από το πληκτρολόγιο, παρά με την εισαγωγή εντολών. Τουλάχιστον, κατά την αλληλεπίδραση με ένα bot μέσω smartphone, το πληκτρολόγιο θα απλοποιήσει σημαντικά τη διαδικασία χρήσης του.

Στο επόμενο άρθρο θα καταλάβουμε πώς να δημιουργήσουμε έναν λογικό διάλογο με ένα bot και να εργαστούμε με βάσεις δεδομένων.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο