Menulis bot telegram di R (bagian 3): Cara menambahkan dukungan keyboard ke bot

Ini adalah artikel ketiga dalam seri “Menulis bot telegram di R”. Dalam publikasi sebelumnya, kita mempelajari cara membuat bot telegram, mengirim pesan melaluinya, menambahkan perintah dan filter pesan ke bot. Oleh karena itu, sebelum Anda mulai membaca artikel ini, saya sangat menyarankan Anda membaca sebelumnya, Karena Di sini saya tidak akan lagi membahas dasar-dasar pembuatan bot yang dijelaskan sebelumnya.

Pada artikel ini, kami akan meningkatkan kegunaan bot kami dengan menambahkan keyboard, yang akan membuat antarmuka bot menjadi intuitif dan mudah digunakan.

Menulis bot telegram di R (bagian 3): Cara menambahkan dukungan keyboard ke bot

Semua artikel dari seri “Menulis bot telegram di R”

  1. Kami membuat bot dan menggunakannya untuk mengirim pesan di telegram
  2. Tambahkan dukungan perintah dan filter pesan ke bot
  3. Bagaimana cara menambahkan dukungan keyboard ke bot

kadar

Jika Anda tertarik dengan analisis data, Anda mungkin tertarik dengan saya Telegram и Youtube saluran. Sebagian besar konten didedikasikan untuk bahasa R.

  1. Jenis keyboard apa yang didukung bot telegram?
  2. Balas papan ketik
  3. Papan ketik sebaris
    3.1. Contoh bot sederhana dengan dukungan tombol InLine
    3.2. Contoh bot yang melaporkan cuaca terkini untuk kota yang dipilih
    3.3. Contoh bot yang menampilkan daftar artikel terbaru dengan link ke Hub yang ditentukan dari habr.com
  4. Kesimpulan

Jenis keyboard apa yang didukung bot telegram?

Pada saat penulisan ini telegram.bot memungkinkan Anda membuat dua jenis keyboard:

  • Balasan - Keyboard biasa utama, yang terletak di bawah panel input teks pesan. Keyboard seperti itu hanya mengirimkan pesan teks ke bot, dan sebagai teks, ia akan mengirimkan teks yang tertulis pada tombol itu sendiri.
  • Inline - Keyboard yang terkait dengan pesan bot tertentu. Keyboard ini mengirimkan data bot yang terkait dengan tombol yang ditekan; data ini mungkin berbeda dari teks yang tertulis pada tombol itu sendiri. Dan tombol-tombol tersebut diproses CallbackQueryHandler.

Agar bot dapat membuka keyboard, diperlukan saat mengirim pesan melalui metode tersebut sendMessage(), berikan keyboard yang dibuat sebelumnya sebagai argumen reply_markup.

Di bawah ini kita akan melihat beberapa contoh.

Balas papan ketik

Seperti yang saya tulis di atas, ini adalah keyboard kontrol bot utama.

Contoh pembuatan keyboard Reply dari bantuan resmi

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)

Di atas adalah contoh dari bantuan resmi paket tersebut telegram.bot. Untuk membuat keyboard, gunakan fungsinya ReplyKeyboardMarkup(), yang pada gilirannya mengambil daftar daftar tombol yang dibuat oleh fungsi tersebut KeyboardButton().

Mengapa masuk ReplyKeyboardMarkup() Apakah Anda perlu melewati bukan hanya daftar, tapi daftar daftar? Faktanya adalah Anda meneruskan daftar utama, dan di dalamnya Anda menentukan setiap baris tombol dalam daftar terpisah, karena Anda dapat menempatkan beberapa tombol dalam satu baris.

Argumen resize_keyboard memungkinkan Anda memilih secara otomatis ukuran tombol keyboard yang optimal, dan argumennya one_time_keyboard memungkinkan Anda menyembunyikan keyboard setelah setiap tombol ditekan.

Mari kita tulis bot sederhana yang memiliki 3 tombol:

  • ID Obrolan - Minta ID obrolan untuk berdialog dengan bot
  • Nama saya - Minta nama Anda
  • Login saya - Minta nama pengguna Anda di telegram

Kode 1: Bot sederhana dengan keyboard Balasan

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

Jalankan contoh kode di atas, setelah mengganti 'TOKEN BOT ANDA' dengan token asli yang Anda terima saat membuat bot melalui ayah kedua (Saya berbicara tentang membuat bot di artikel pertama).

Setelah diluncurkan, beri perintah pada bot /start, Karena Inilah yang kami tentukan untuk meluncurkan keyboard.

Menulis bot telegram di R (bagian 3): Cara menambahkan dukungan keyboard ke bot

Jika saat ini sulit bagi Anda untuk mengurai contoh kode yang diberikan, dengan pembuatan metode, filter, dan penangan, maka Anda harus kembali ke yang sebelumnya Artikel, di mana saya menjelaskan semua ini secara rinci.

Kami membuat 4 metode:

  • mulai — Meluncurkan keyboard
  • chat_id — Meminta ID obrolan
  • nama_saya — Meminta nama Anda
  • my_username — Minta login Anda

Untuk menolak Filter Pesan menambahkan 3 filter pesan berdasarkan teksnya:

  • chat_id — Pesan dengan teks "Чат ID"
  • nama — Pesan dengan teks "Моё имя"
  • nama pengguna — Pesan dengan teks "Мой логин"

Dan kami membuat 4 penangan yang, berdasarkan perintah dan filter yang diberikan, akan menjalankan metode yang ditentukan.

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

Keyboard itu sendiri dibuat di dalam metode ini start() tim ReplyKeyboardMarkup().

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

Dalam kasus kami, kami menempatkan semua tombol di bawah satu sama lain, tetapi kami dapat mengaturnya dalam satu baris dengan membuat perubahan pada daftar daftar tombol. Karena satu baris di dalam keyboard dibuat melalui daftar tombol yang disarangkan, lalu untuk menampilkan tombol-tombol kita dalam satu baris kita perlu menulis ulang sebagian kode untuk membuat keyboard seperti ini:

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

Menulis bot telegram di R (bagian 3): Cara menambahkan dukungan keyboard ke bot

Keyboard dikirim ke obrolan menggunakan metode ini sendMessage(), dalam argumen reply_markup.

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

Papan ketik sebaris

Seperti yang saya tulis di atas, keyboard Inline terikat pada pesan tertentu. Ini agak lebih sulit untuk digunakan daripada keyboard utama.

Awalnya, Anda perlu menambahkan metode ke bot untuk memanggil keyboard Inline.

Untuk merespon klik tombol Inline, Anda juga dapat menggunakan metode bot answerCallbackQuery(), yang dapat menampilkan notifikasi di antarmuka telegram kepada pengguna yang menekan tombol Inline.

Data yang dikirimkan dari tombol Inline bukanlah berupa teks, sehingga untuk mengolahnya perlu dibuat handler khusus dengan menggunakan perintah CallbackQueryHandler().

Kode untuk membuat keyboard Inline yang diberikan dalam bantuan resmi paket telegram.bot.

Kode untuk membuat keyboard Inline dari bantuan resmi

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

Anda perlu membuat keyboard Inline menggunakan perintah InlineKeyboardMarkup(), dengan prinsip yang sama seperti papan ketik Balasan. DI DALAM InlineKeyboardMarkup() perlu untuk meneruskan daftar daftar tombol Inline, setiap tombol dibuat oleh fungsi InlineKeyboardButton().

Tombol sebaris dapat meneruskan beberapa data ke bot menggunakan argumen callback_data, atau buka halaman HTML mana pun yang ditentukan menggunakan argumen url.

Hasilnya adalah daftar yang setiap elemennya juga merupakan daftar tombol Inline yang perlu digabungkan menjadi satu baris.

Selanjutnya kita akan melihat beberapa contoh bot dengan tombol Inline.

Contoh bot sederhana dengan dukungan tombol InLine

Pertama, kami akan menulis bot untuk pengujian cepat untuk covid-19. Atas perintah /test, ia akan mengirimi Anda keyboard dengan dua tombol, tergantung pada tombol yang ditekan, ia akan mengirimi Anda pesan berisi hasil pengujian Anda.

Kode 2: Bot paling sederhana dengan keyboard 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 <- 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()

Jalankan contoh kode di atas, setelah mengganti 'TOKEN BOT ANDA' dengan token asli yang Anda terima saat membuat bot melalui ayah kedua (Saya berbicara tentang membuat bot di artikel pertama).

Hasilnya:
Menulis bot telegram di R (bagian 3): Cara menambahkan dukungan keyboard ke bot

Kami membuat dua metode:

  • uji — Untuk mengirim ke obrolan Keyboard sebaris
  • jawaban_cb — Untuk memproses data yang dikirim dari keyboard.

Data yang akan dikirim dari setiap tombol ditentukan dalam argumen callback_data, saat membuat tombol. Anda dapat menerima data yang dikirim dari tombol menggunakan konstruk update$callback_query$data, di dalam metode jawaban_cb.

Agar bot bereaksi terhadap keyboard Inline, metode jawaban_cb diproses oleh pawang khusus: CallbackQueryHandler(answer_cb). Yang menjalankan metode yang ditentukan ketika tombol Inline diklik. Penangan CallbackQueryHandler mengambil dua argumen:

  • callback — Metode yang perlu dijalankan
  • pattern — Filter berdasarkan data yang terikat pada tombol menggunakan argumen callback_data.

Oleh karena itu, dengan menggunakan argumen pattern Kita dapat menulis metode terpisah untuk menekan setiap tombol:

Kode 3: Metode terpisah untuk setiap tombol 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()

Jalankan contoh kode di atas, setelah mengganti 'TOKEN BOT ANDA' dengan token asli yang Anda terima saat membuat bot melalui ayah kedua (Saya berbicara tentang membuat bot di artikel pertama).

Sekarang kami telah menulis 2 metode terpisah yaitu. satu metode, untuk setiap tombol tekan, dan gunakan argumennya pattern, saat membuat penangannya:

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

Kode metode berakhir jawaban_cb tim bot$answerCallbackQuery(callback_query_id = update$callback_query$id), yang memberi tahu bot bahwa data dari keyboard inline telah diterima.

Contoh bot yang melaporkan cuaca terkini untuk kota yang dipilih

Mari kita coba menulis bot yang meminta data cuaca.

Logika kerjanya adalah sebagai berikut. Awalnya oleh tim /start Anda memanggil keyboard utama, yang hanya memiliki satu tombol “Cuaca”. Dengan mengklik tombol ini Anda akan menerima pesan dengan keyboard Inline untuk memilih kota yang ingin Anda ketahui cuacanya saat ini. Pilih salah satu kota dan dapatkan cuaca saat ini.

Dalam contoh kode ini kita akan menggunakan beberapa paket tambahan:

  • httr — paket untuk bekerja dengan permintaan HTTP, yang menjadi dasar pembuatan pekerjaan dengan API apa pun. Dalam kasus kami, kami akan menggunakan API gratis openweathermap.org.
  • stringr — paket untuk bekerja dengan teks, dalam kasus kami, kami akan menggunakannya untuk menghasilkan pesan tentang cuaca di kota yang dipilih.

Kode 4: Bot yang melaporkan cuaca terkini untuk kota yang dipilih

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

Jalankan contoh kode di atas, setelah mengganti 'TOKEN BOT ANDA' dengan token asli yang Anda terima saat membuat bot melalui ayah kedua (Saya berbicara tentang membuat bot di artikel pertama).

Hasilnya, bot kita akan bekerja seperti ini:
Menulis bot telegram di R (bagian 3): Cara menambahkan dukungan keyboard ke bot

Secara skematis bot ini dapat digambarkan seperti ini:
Menulis bot telegram di R (bagian 3): Cara menambahkan dukungan keyboard ke bot

Kami telah membuat 3 metode yang tersedia di dalam bot cuaca kami:

  • awal — Luncurkan keyboard bot utama
  • cuaca — Luncurkan keyboard Inline untuk memilih kota
  • jawaban_cb — Metode utama yang meminta cuaca dari API untuk kota tertentu dan mengirimkannya ke obrolan.

metode awal kami meluncurkannya dengan perintah /start, yang diimplementasikan oleh handler CommandHandler('start', start).

Untuk menjalankan suatu metode cuaca kami membuat filter dengan nama yang sama:

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

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

}
)

Dan kami memanggil metode ini dengan penangan pesan berikut: MessageHandler(weather, filters = MessageFilters$weather).

Dan pada akhirnya, metode utama kami jawaban_cb bereaksi terhadap penekanan tombol Inline, yang diimplementasikan oleh pengendali khusus: CallbackQueryHandler(answer_cb).

Di dalam suatu metode jawaban_cb, kita membaca data yang dikirim dari keyboard dan menuliskannya ke variabel city: city <- update$callback_query$data. Kemudian kami meminta data cuaca dari API, membuat dan mengirim pesan, dan terakhir menggunakan metode tersebut answerCallbackQuery untuk memberi tahu bot bahwa kami memproses klik tombol Inline.

Contoh bot yang menampilkan daftar artikel terbaru dengan link ke Hub yang ditentukan dari www.habr.com.

Saya menyajikan bot ini untuk menunjukkan kepada Anda cara menampilkan tombol Inline yang mengarah ke halaman web.

Logika bot ini mirip dengan yang sebelumnya, awalnya kami meluncurkan keyboard utama dengan perintah /start. Selanjutnya, bot memberi kita daftar 6 hub untuk dipilih, kita memilih hub yang kita minati, dan menerima 5 publikasi terbaru dari Hub yang dipilih.

Seperti yang Anda pahami, dalam hal ini kita perlu mendapatkan daftar artikel, dan untuk ini kita akan menggunakan paket khusus habR, yang memungkinkan Anda meminta artikel dari Habra dan beberapa statistiknya di R.

Instal paket habR hanya mungkin dari github, yang mana Anda memerlukan paket tambahan devtools. Untuk menginstal, gunakan kode di bawah ini.

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

Sekarang mari kita lihat kode untuk membuat bot yang dijelaskan di atas:

Kode 5: Bot yang menampilkan daftar artikel terbaru di Hub yang dipilih

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

Jalankan contoh kode di atas, setelah mengganti 'TOKEN BOT ANDA' dengan token asli yang Anda terima saat membuat bot melalui ayah kedua (Saya berbicara tentang membuat bot di artikel pertama).

Hasilnya, kita akan mendapatkan hasil ini:
Menulis bot telegram di R (bagian 3): Cara menambahkan dukungan keyboard ke bot

Kami melakukan hardcode pada daftar Hub yang tersedia untuk dipilih dalam metode ini 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)
}

Kami mendapatkan daftar artikel dari Hub yang ditentukan dengan perintah habr_hub_posts(), dari paket habR. Pada saat yang sama, kami menunjukkan bahwa kami tidak memerlukan daftar artikel sepanjang waktu, tetapi hanya halaman pertama yang berisi 20 artikel. Dari tabel yang dihasilkan menggunakan perintah head() Kami hanya menyisakan 5 teratas yang merupakan artikel terbaru.

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

Logikanya sangat mirip dengan bot sebelumnya, namun dalam kasus ini kami membuat keyboard Inline dengan daftar artikel secara dinamis menggunakan fungsi tersebut lapply().

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

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

Kami memasukkan judul artikel ke dalam teks tombol posts$title[x], dan dalam argumen url tautan ke artikel: url = posts$link[x].

Selanjutnya, kami membuat filter, penangan, dan meluncurkan bot kami.

Kesimpulan

Sekarang bot yang Anda tulis akan jauh lebih nyaman digunakan, karena bot tersebut akan dikontrol dari keyboard, bukan dengan memasukkan perintah. Minimal, saat berinteraksi dengan bot melalui smartphone, keyboard akan sangat menyederhanakan proses penggunaannya.

Pada artikel berikutnya kita akan mengetahui cara membangun dialog logis dengan bot dan bekerja dengan database.

Sumber: www.habr.com

Tambah komentar