Nulis bot telegram ing R (part 3): Cara nambah dhukungan keyboard menyang bot

Iki minangka artikel katelu ing seri "Nulis bot telegram ing R". Ing publikasi sadurunge, kita sinau carane nggawe bot telegram, ngirim pesen liwat, nambah printah lan saringan pesen menyang bot. Mula, sadurunge sampeyan miwiti maca artikel iki, aku menehi saran supaya sampeyan maca sadurunge, amarga Ing kene aku ora bakal mikir babagan dhasar bangunan bot sing wis diterangake sadurunge.

Ing artikel iki, kita bakal nambah kegunaan bot kita kanthi nambahake keyboard, sing bakal nggawe antarmuka bot intuisi lan gampang digunakake.

Nulis bot telegram ing R (part 3): Cara nambah dhukungan keyboard menyang bot

Kabeh artikel saka seri "Nulis bot telegram ing R"

  1. Kita nggawe bot lan digunakake kanggo ngirim pesen ing telegram
  2. Tambah dhukungan printah lan saringan pesen menyang bot
  3. Cara nambah dhukungan keyboard menyang bot

Isi

Yen sampeyan kasengsem ing analisis data, sampeyan bisa uga kasengsem ing sandi telegram и youtube saluran. Sebagéyan gedhé isiné dikhususaké kanggo basa R.

  1. Jinis keyboard apa sing didhukung bot telegram?
  2. keyboard balesan
  3. Papan tombol inline
    3.1. Conto bot prasaja kanthi dhukungan kanggo tombol InLine
    3.2. Conto bot sing nglaporake cuaca saiki kanggo kutha sing dipilih
    3.3. Conto bot sing nampilake dhaptar artikel paling anyar kanthi pranala menyang Hub sing ditemtokake saka habr.com
  4. kesimpulan

Jinis keyboard apa sing didhukung bot telegram?

Ing wektu iki nulis telegram.bot ngidini sampeyan nggawe rong jinis keyboard:

  • Reply - Papan tombol utama, biasa, sing ana ing sangisore panel input teks pesen. Papan tombol kasebut mung ngirim pesen teks menyang bot, lan minangka teks bakal ngirim teks sing ditulis ing tombol kasebut dhewe.
  • Inline - Papan tombol sing ana gandhengane karo pesen bot tartamtu. Papan tombol iki ngirim data bot sing digandhengake karo tombol sing ditekan; data iki bisa uga beda karo teks sing ditulis ing tombol kasebut. Lan tombol kuwi diproses liwat CallbackQueryHandler.

Supaya bot mbukak keyboard, perlu nalika ngirim pesen liwat metode kasebut sendMessage(), pass keyboard sing digawe sadurunge minangka argumen reply_markup.

Ing ngisor iki kita bakal ndeleng sawetara conto.

keyboard balesan

Nalika aku nulis ing ndhuwur, iki minangka keyboard kontrol bot utama.

Conto nggawe keyboard Reply saka 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)

Ing ndhuwur minangka conto saka bantuan resmi paket kasebut telegram.bot. Kanggo nggawe keyboard, gunakake fungsi kasebut ReplyKeyboardMarkup(), sing banjur njupuk dhaptar dhaptar tombol sing digawe dening fungsi kasebut KeyboardButton().

Napa ing ReplyKeyboardMarkup() Apa sampeyan kudu ngliwati ora mung dhaptar, nanging dhaptar dhaptar? Kasunyatane yaiku sampeyan ngliwati dhaptar utama, lan sampeyan nemtokake saben baris tombol ing dhaptar sing kapisah, amarga Sampeyan bisa nyelehake sawetara tombol ing siji baris.

Argumentasi resize_keyboard ngijini sampeyan kanthi otomatis milih ukuran optimal tombol keyboard, lan bantahan one_time_keyboard ngijini sampeyan kanggo ndhelikake keyboard sawise saben tombol pencet.

Ayo nulis bot prasaja sing bakal duwe 3 tombol:

  • Chat ID - Njaluk chatting ID dialog karo bot
  • Jenengku - Njaluk jenengmu
  • Login sandi - Nyuwun jeneng pangguna sampeyan ing telegram

Kode 1: Bot prasaja kanthi keyboard Balas

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

Jalanake conto kode ing ndhuwur, sawise ngganti 'TOKEN BOT YOUR' karo token nyata sing ditampa nalika nggawe bot liwat BotBapak (Aku ngomong babagan nggawe bot ing artikel pisanan).

Sawise diluncurake, wenehi perintah marang bot /start, amarga Iki persis sing ditetepake kanggo miwiti keyboard.

Nulis bot telegram ing R (part 3): Cara nambah dhukungan keyboard menyang bot

Yen saiki angel kanggo njlentrehake conto kode sing diwenehake, kanthi nggawe metode, saringan lan panangan, mula sampeyan kudu bali menyang sing sadurunge. artikel, ing ngendi aku nerangake kabeh iki kanthi rinci.

Kita nggawe 4 cara:

  • miwiti - Bukak keyboard
  • chat_id - Nyuwun ID chat
  • my_name - Njaluk jeneng sampeyan
  • my_username - Nyuwun login

Kanggo mbantah MessageFilters nambahake 3 saringan pesen adhedhasar teks kasebut:

  • chat_id - Pesen nganggo teks "Чат ID"
  • jeneng - Pesen karo teks "Моё имя"
  • jeneng panganggo - Pesen karo teks "Мой логин"

Lan kita nggawe 4 panangan sing, adhedhasar printah lan saringan sing diwenehake, bakal nglakokake metode sing ditemtokake.

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

Papan tombol kasebut dhewe digawe ing njero metode kasebut start() tim ReplyKeyboardMarkup().

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

Ing kasus kita, kita sijine kabeh tombol ing saben liyane, nanging kita bisa ngatur ing siji baris kanthi nggawe owah-owahan ing dhaptar dhaptar tombol. Amarga siji baris ing keyboard digawe liwat dhaptar tombol, banjur kanggo nampilake tombol ing siji baris, kita kudu nulis ulang bagean kode kanggo mbangun keyboard kaya iki:

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

Nulis bot telegram ing R (part 3): Cara nambah dhukungan keyboard menyang bot

Papan tombol dikirim menyang obrolan nggunakake metode kasebut sendMessage(), ing argumentasi reply_markup.

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

Papan tombol inline

Nalika aku nulis ing ndhuwur, keyboard Inline disambungake menyang pesen tartamtu. Luwih angel digarap tinimbang keyboard utama.

Kaping pisanan, sampeyan kudu nambah cara menyang bot kanggo nelpon keyboard Inline.

Kanggo nanggapi klik tombol Inline, sampeyan uga bisa nggunakake cara bot answerCallbackQuery(), sing bisa nampilake kabar ing antarmuka telegram kanggo pangguna sing menet tombol Inline.

Data sing dikirim saka tombol Inline dudu teks, mula kanggo ngolah sampeyan kudu nggawe pawang khusus nggunakake perintah kasebut CallbackQueryHandler().

Kode kanggo mbangun keyboard Inline sing diwenehake ing bantuan resmi paket kasebut telegram.bot.

Kode kanggo mbangun keyboard Inline saka 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)

Sampeyan kudu mbangun keyboard Inline nggunakake printah InlineKeyboardMarkup(), kanthi prinsip sing padha karo keyboard Reply. ING InlineKeyboardMarkup() iku perlu kanggo pass dhaptar dhaptar tombol Inline, saben tombol individu digawe dening fungsi InlineKeyboardButton().

Tombol inline bisa ngirim sawetara data menyang bot nggunakake argumen callback_data, utawa mbukak sembarang kaca HTML sing ditemtokake nggunakake argumen url.

Asil bakal dhaftar kang saben unsur uga dhaftar tombol Inline sing kudu digabungake dadi siji baris.

Sabanjure kita bakal ndeleng sawetara conto bot kanthi tombol Inline.

Conto bot prasaja kanthi dhukungan kanggo tombol InLine

Pisanan, kita bakal nulis bot kanggo tes ekspres kanggo covid-19. Miturut dhawuh /test, bakal ngirim keyboard karo rong tombol, gumantung ing tombol dipencet bakal ngirim pesen karo asil testing Panjenengan.

Kode 2: Bot paling gampang nganggo 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()

Jalanake conto kode ing ndhuwur, sawise ngganti 'TOKEN BOT YOUR' karo token nyata sing ditampa nalika nggawe bot liwat BotBapak (Aku ngomong babagan nggawe bot ing artikel pisanan).

Asil:
Nulis bot telegram ing R (part 3): Cara nambah dhukungan keyboard menyang bot

Kita nggawe rong cara:

  • test — Kanggo ngirim menyang chatting Inline keyboard
  • jawaban_cb - Kanggo ngolah data sing dikirim saka keyboard.

Data sing bakal dikirim saka saben tombol ditemtokake ing argumen callback_data, nalika nggawe tombol. Sampeyan bisa nampa data sing dikirim saka tombol nggunakake mbangun update$callback_query$data, nang metode jawaban_cb.

Supaya bot nanggepi keyboard Inline, metode jawaban_cb diproses dening pawang khusus: CallbackQueryHandler(answer_cb). Kang nganggo cara sing ditemtokake nalika tombol Inline diklik. Pawang CallbackQueryHandler njupuk rong argumen:

  • callback - Cara sing kudu ditindakake
  • pattern - Filter miturut data sing kaiket ing tombol nggunakake argumen callback_data.

Dadi, nggunakake argumentasi pattern Kita bisa nulis cara sing kapisah kanggo mencet saben tombol:

Kode 3: Cara kapisah kanggo saben 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()

Jalanake conto kode ing ndhuwur, sawise ngganti 'TOKEN BOT YOUR' karo token nyata sing ditampa nalika nggawe bot liwat BotBapak (Aku ngomong babagan nggawe bot ing artikel pisanan).

Saiki kita wis nulis 2 cara kapisah i.e. siji cara, kanggo saben tombol pencet, lan digunakake argumen pattern, nalika nggawe pawang:

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

Kode metode rampung jawaban_cb tim bot$answerCallbackQuery(callback_query_id = update$callback_query$id), sing ngandhani bot yen data saka keyboard inline wis ditampa.

Conto bot sing nglaporake cuaca saiki kanggo kutha sing dipilih

Ayo coba nulis bot sing njaluk data cuaca.

Logika karyane bakal kaya ing ngisor iki. Kaping pisanan dening tim /start sampeyan nelpon keyboard utama, kang wis mung siji tombol "Weather". Kanthi ngeklik tombol iki, sampeyan bakal nampa pesen kanthi keyboard Inline kanggo milih kutha sing pengin sampeyan ngerteni cuaca saiki. Pilih salah siji kutha lan entuk cuaca saiki.

Ing conto kode iki, kita bakal nggunakake sawetara paket tambahan:

  • httr - paket kanggo nggarap panjalukan HTTP, kanthi basis sing bisa digunakake karo API apa wae. Ing kasus kita, kita bakal nggunakake API gratis openweathermap.org.
  • stringr - paket kanggo nggarap teks, ing kasus kita bakal digunakake kanggo ngasilake pesen babagan cuaca ing kutha sing dipilih.

Kode 4: Bot sing nglaporake cuaca saiki kanggo kutha sing 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()

Jalanake conto kode ing ndhuwur, sawise ngganti 'TOKEN BOT YOUR' karo token nyata sing ditampa nalika nggawe bot liwat BotBapak (Aku ngomong babagan nggawe bot ing artikel pisanan).

Akibaté, bot kita bakal bisa kaya mangkene:
Nulis bot telegram ing R (part 3): Cara nambah dhukungan keyboard menyang bot

Secara skematis, bot iki bisa digambarake kaya mangkene:
Nulis bot telegram ing R (part 3): Cara nambah dhukungan keyboard menyang bot

Kita wis nggawe 3 cara sing kasedhiya ing bot cuaca:

  • wiwitan - Bukak keyboard bot utama
  • weather - Bukak keyboard Inline kanggo milih kutha
  • jawaban_cb - Cara utama sing njaluk cuaca saka API kanggo kutha tartamtu lan dikirim menyang chatting.

Cara wiwitan kita miwiti karo printah /start, sing dileksanakake dening pawang CommandHandler('start', start).

Kanggo mbukak metode weather kita nggawe saringan kanthi jeneng sing padha:

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

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

}
)

Lan kita nelpon cara iki kanthi panangan pesen ing ngisor iki: MessageHandler(weather, filters = MessageFilters$weather).

Lan ing pungkasan, cara utama kita jawaban_cb bereaksi kanggo mencet tombol Inline, sing ditindakake dening pawang khusus: CallbackQueryHandler(answer_cb).

Ing njero metode jawaban_cb, kita maca data sing dikirim saka keyboard lan nulis menyang variabel city: city <- update$callback_query$data. Banjur kita njaluk data cuaca saka API, ngasilake lan ngirim pesen, lan pungkasane nggunakake metode kasebut answerCallbackQuery kanggo ngandhani bot yen kita ngolah klik tombol Inline.

Conto bot sing nampilake dhaptar artikel paling anyar kanthi pranala menyang Hub sing ditemtokake saka www.habr.com.

Aku nampilake bot iki kanggo nuduhake sampeyan carane nampilake tombol Inline sing ngarah menyang kaca web.

Logika bot iki padha karo sing sadurunge; wiwitane kita miwiti keyboard utama kanthi prentah /start. Sabanjure, bot menehi kita dhaptar 6 hub kanggo milih saka, kita pilih hub kita kasengsem ing, lan nampa 5 publikasi paling anyar saka Hub dipilih.

Kaya sing sampeyan ngerteni, ing kasus iki, kita kudu entuk dhaptar artikel, lan iki bakal nggunakake paket khusus habR, sing ngidini sampeyan njaluk artikel saka Habra lan sawetara statistik ing R.

Instal paket habR mung bisa saka github, sing mbutuhake paket tambahan devtools. Kanggo nginstal, gunakake kode ing ngisor iki.

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

Saiki ayo goleki kode kanggo mbangun bot sing diterangake ing ndhuwur:

Kode 5: Bot sing nampilake dhaptar artikel paling anyar ing Hub sing 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()

Jalanake conto kode ing ndhuwur, sawise ngganti 'TOKEN BOT YOUR' karo token nyata sing ditampa nalika nggawe bot liwat BotBapak (Aku ngomong babagan nggawe bot ing artikel pisanan).

Akibaté, kita bakal entuk asil iki:
Nulis bot telegram ing R (part 3): Cara nambah dhukungan keyboard menyang bot

We hardcoded dhaftar Hub kasedhiya kanggo pilihan ing cara 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)
}

Kita entuk dhaptar artikel saka Hub sing ditemtokake kanthi prentah habr_hub_posts(), saka paket habR. Ing wektu sing padha, kita nyatakake yen kita ora butuh dhaptar artikel kanggo kabeh wektu, nanging mung kaca pisanan sing ana 20 artikel. Saka tabel asil nggunakake printah head() Kita mung ninggalake 5 ndhuwur, yaiku artikel paling anyar.

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

Logika meh padha karo bot sadurunge, nanging ing kasus iki, kita nggawe keyboard Inline kanthi dhaptar artikel kanthi dinamis nggunakake fungsi kasebut. lapply().

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

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

Kita masang judhul artikel menyang teks tombol posts$title[x], lan ing argumentasi url link menyang artikel: url = posts$link[x].

Sabanjure, kita nggawe saringan, panangan lan miwiti bot kita.

kesimpulan

Saiki bot sing sampeyan tulis bakal luwih trep kanggo digunakake, amarga kasunyatane bakal dikontrol saka keyboard, tinimbang ngetik perintah. Paling ora, nalika sesambungan karo bot liwat smartphone, keyboard bakal nyederhanakake proses nggunakake.

Ing artikel sabanjure kita bakal nemtokake cara nggawe dialog logis karo bot lan nggarap database.

Source: www.habr.com

Add a comment