R-da telegramma botini yozish (3-qism): Botga klaviatura yordamini qanday qo'shish mumkin

Bu “Telegram botini R-da yozish” turkumidagi uchinchi maqola bo’lgan maqola yangiliklar.net saytiga kiritilgan. Avvalgi nashrlarda biz telegram botini yaratish, u orqali xabarlar yuborish, botga buyruqlar va xabarlar filtrlarini qo‘shishni o‘rgangan edik. Shuning uchun, ushbu maqolani o'qishni boshlashdan oldin, men sizga o'qishni tavsiya qilaman oldingi, chunki Bu erda men endi bot qurishning ilgari tasvirlangan asoslari haqida to'xtalmayman.

Ushbu maqolada biz bot interfeysini intuitiv va foydalanish uchun qulay qiladigan klaviatura qo'shish orqali botimizdan foydalanish qulayligini yaxshilaymiz.

R-da telegramma botini yozish (3-qism): Botga klaviatura yordamini qanday qo'shish mumkin

“Telegram botini R-da yozish” turkumidagi barcha maqolalar

  1. Biz bot yaratamiz va undan telegramda xabar yuborish uchun foydalanamiz
  2. Botga buyruqlarni qo'llab-quvvatlash va xabar filtrlarini qo'shing
  3. Botga klaviatura yordamini qanday qo'shish mumkin

Mundarija

Agar siz ma'lumotlarni tahlil qilish bilan qiziqsangiz, meni qiziqtirishi mumkin telegramma и youtube kanallar. Kontentning katta qismi R tiliga bag'ishlangan.

  1. Telegram boti qanday klaviatura turlarini qo'llab-quvvatlaydi?
  2. Javob klaviaturasi
  3. Inline klaviatura
    3.1. InLine tugmachalarini qo'llab-quvvatlaydigan oddiy botga misol
    3.2. Tanlangan shahar uchun joriy ob-havo haqida xabar beruvchi bot misoli
    3.3. Habr.com saytidan ko'rsatilgan Hubga havolalar bilan so'nggi maqolalar ro'yxatini ko'rsatadigan bot misoli
  4. xulosa

Telegram boti qanday klaviatura turlarini qo'llab-quvvatlaydi?

Ushbu yozish paytida telegram.bot ikki turdagi klaviatura yaratish imkonini beradi:

  • Javob berish - xabar matnini kiritish paneli ostida joylashgan asosiy, oddiy klaviatura. Bunday klaviatura shunchaki botga matnli xabar yuboradi va matn sifatida u tugmaning o'zida yozilgan matnni yuboradi.
  • Inline - Muayyan bot xabari bilan bog'langan klaviatura. Ushbu klaviatura bosilgan tugma bilan bog'liq bot ma'lumotlarini yuboradi; bu ma'lumotlar tugmaning o'zida yozilgan matndan farq qilishi mumkin. Va bunday tugmalar orqali qayta ishlanadi CallbackQueryHandler.

Bot klaviaturani ochishi uchun bu usul orqali xabar yuborishda kerak sendMessage(), ilgari yaratilgan klaviaturani argument sifatida o'tkazing reply_markup.

Quyida biz bir nechta misollarni ko'rib chiqamiz.

Javob klaviaturasi

Yuqorida yozganimdek, bu asosiy bot boshqaruv klaviaturasi.

Rasmiy yordamdan javob berish klaviaturasini yaratish misoli

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)

Yuqoridagilar paketning rasmiy yordamidan misoldir telegram.bot. Klaviatura yaratish uchun funksiyadan foydalaning ReplyKeyboardMarkup(), bu esa o'z navbatida funksiya tomonidan yaratilgan tugmalar ro'yxatini oladi KeyboardButton().

Nima uchun? ReplyKeyboardMarkup() Faqat ro'yxatni emas, balki ro'yxatlar ro'yxatini topshirishingiz kerakmi? Gap shundaki, siz asosiy ro'yxatni o'tasiz va unda har bir tugma qatorini alohida ro'yxatlarda aniqlaysiz, chunki Bir qatorda bir nechta tugmachalarni joylashtirishingiz mumkin.

dalil resize_keyboard klaviatura tugmalarining optimal hajmini va argumentni avtomatik tanlash imkonini beradi one_time_keyboard har bir tugmani bosgandan keyin klaviaturani yashirish imkonini beradi.

Keling, 3 ta tugmachali oddiy bot yozamiz:

  • Chat identifikatori - bot bilan suhbat identifikatorini so'rang
  • Mening ismim - Ismingizni so'rang
  • Mening loginim - Telegramda foydalanuvchi nomingizni so'rang

Kod 1: Javob berish klaviaturasi bilan oddiy 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()

Yuqoridagi kod misolini ishga tushiring, "BOT TOKEN" ni bot yaratishda olgan haqiqiy token bilan almashtirgandan so'ng. BotOta (Men bot yaratish haqida gapirdim birinchi maqola).

Ishga tushgandan so'ng, botga buyruq bering /start, chunki Klaviaturani ishga tushirish uchun aynan shu narsani aniqladik.

R-da telegramma botini yozish (3-qism): Botga klaviatura yordamini qanday qo'shish mumkin

Agar hozirgi vaqtda siz uchun usullar, filtrlar va ishlov beruvchilar yaratgan holda berilgan kod misolini tahlil qilish qiyin bo'lsa, avvalgisiga qaytishingiz kerak. maqola, unda men bularning barchasini batafsil tasvirlab berdim.

Biz 4 usulni yaratdik:

  • start — klaviaturani ishga tushiring
  • chat_id - Chat identifikatorini so'rash
  • my_name — Ismingizni so'rang
  • my_username — loginingizni so'rang

E'tiroz bildirish Xabar filtrlari matniga asoslangan 3 ta xabar filtri qo'shildi:

  • chat_id — matnli xabarlar "Чат ID"
  • nom — Matnli xabarlar "Моё имя"
  • foydalanuvchi nomi — Matnli xabarlar "Мой логин"

Va biz berilgan buyruqlar va filtrlar asosida belgilangan usullarni bajaradigan 4 ta ishlov beruvchini yaratdik.

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

Klaviaturaning o'zi usul ichida yaratilgan start() jamoa ReplyKeyboardMarkup().

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

Bizning holatlarimizda biz barcha tugmachalarni bir-birining ostiga joylashtirdik, lekin tugmalar ro'yxatiga o'zgartirishlar kiritish orqali ularni bir qatorga joylashtirishimiz mumkin. Chunki Klaviatura ichidagi bitta satr ichki tugmalar ro'yxati orqali yaratiladi, keyin tugmachalarimizni bir qatorda ko'rsatish uchun klaviaturani yaratish uchun kodning bir qismini quyidagicha qayta yozishimiz kerak:

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

R-da telegramma botini yozish (3-qism): Botga klaviatura yordamini qanday qo'shish mumkin

Klaviatura usul yordamida chatga yuboriladi sendMessage(), argumentda reply_markup.

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

Inline klaviatura

Yuqorida yozganimdek, Inline klaviaturasi ma'lum bir xabarga bog'langan. Asosiy klaviaturaga qaraganda u bilan ishlash biroz qiyinroq.

Dastlab, Inline klaviaturasini chaqirish uchun botga usul qo'shishingiz kerak.

Inline tugmachasini bosishga javob berish uchun siz bot usulidan ham foydalanishingiz mumkin answerCallbackQuery(), bu Inline tugmasini bosgan foydalanuvchiga telegram interfeysida bildirishnomani ko'rsatishi mumkin.

Inline tugmasidan yuborilgan ma'lumotlar matn emas, shuning uchun uni qayta ishlash uchun buyruq yordamida maxsus ishlov beruvchi yaratish kerak CallbackQueryHandler().

Inline klaviaturasini yaratish uchun kod paketning rasmiy yordamida keltirilgan telegram.bot.

Rasmiy yordamdan Inline klaviaturasini yaratish uchun kod

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

Buyruq yordamida Inline klaviaturasini yaratishingiz kerak InlineKeyboardMarkup(), Javob berish klaviaturasi bilan bir xil printsipda. IN InlineKeyboardMarkup() Inline tugmalari ro'yxatini o'tkazish kerak, har bir alohida tugma funksiya tomonidan yaratiladi InlineKeyboardButton().

Inline tugmasi argument yordamida ba'zi ma'lumotlarni botga o'tkazishi mumkin callback_data, yoki argument yordamida belgilangan istalgan HTML sahifani oching url.

Natijada, har bir element bir qatorga birlashtirilishi kerak bo'lgan Inline tugmalar ro'yxati bo'lgan ro'yxat bo'ladi.

Keyinchalik biz Inline tugmalari bo'lgan botlarning bir nechta misollarini ko'rib chiqamiz.

InLine tugmachalarini qo'llab-quvvatlaydigan oddiy botga misol

Birinchidan, biz covid-19 uchun ekspress test uchun bot yozamiz. Buyruq bo'yicha /test, u sizga ikkita tugmachali klaviaturani yuboradi, bosilgan tugmaga qarab u sizga test natijalari bilan xabar yuboradi.

Kod 2: Inline klaviaturali eng oddiy 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()

Yuqoridagi kod misolini ishga tushiring, "BOT TOKEN" ni bot yaratishda olgan haqiqiy token bilan almashtirgandan so'ng. BotOta (Men bot yaratish haqida gapirdim birinchi maqola).

natija:
R-da telegramma botini yozish (3-qism): Botga klaviatura yordamini qanday qo'shish mumkin

Biz ikkita usulni yaratdik:

  • sinov — Chatga yuborish uchun Inline klaviatura
  • answer_cb — Klaviaturadan yuborilgan ma'lumotlarni qayta ishlash uchun.

Har bir tugmachadan yuboriladigan ma'lumotlar argumentda ko'rsatilgan callback_data, tugma yaratishda. Tugmadan yuborilgan ma'lumotlarni konstruktsiyadan foydalanib olishingiz mumkin update$callback_query$data, usul ichida answer_cb.

Botning Inline klaviaturasiga munosabat bildirishi uchun usul answer_cb maxsus ishlov beruvchi tomonidan qayta ishlanadi: CallbackQueryHandler(answer_cb). Inline tugmasi bosilganda ko'rsatilgan usulni ishga tushiradi. Ishlovchi CallbackQueryHandler ikkita dalil oladi:

  • callback - Ishlatish kerak bo'lgan usul
  • pattern — Argument yordamida tugma bilan bogʻlangan maʼlumotlar boʻyicha filtrlang callback_data.

Shunga ko'ra, argumentdan foydalanish pattern Har bir tugmani bosish uchun alohida usul yozishimiz mumkin:

Kod 3: Har bir Inline tugmasi uchun alohida usullar

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

Yuqoridagi kod misolini ishga tushiring, "BOT TOKEN" ni bot yaratishda olgan haqiqiy token bilan almashtirgandan so'ng. BotOta (Men bot yaratish haqida gapirdim birinchi maqola).

Endi biz 2 ta alohida usulni yozdik, ya'ni. bitta usul, har bir tugma uchun bosing va argumentni ishlating pattern, ularning ishlov beruvchilarini yaratishda:

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

Usul kodi tugaydi answer_cb jamoa bot$answerCallbackQuery(callback_query_id = update$callback_query$id), bu botga ichki klaviaturadan ma'lumotlar olinganligini bildiradi.

Tanlangan shahar uchun joriy ob-havo haqida xabar beruvchi bot misoli

Keling, ob-havo ma'lumotlarini so'raydigan bot yozishga harakat qilaylik.

Uning ish mantig'i quyidagicha bo'ladi. Dastlab jamoa tomonidan /start faqat bitta "Ob-havo" tugmasi bo'lgan asosiy klaviaturani chaqirasiz. Ushbu tugmani bosish orqali siz joriy ob-havoni bilmoqchi bo'lgan shaharni tanlash uchun Inline klaviaturasi bilan xabar olasiz. Shaharlardan birini tanlang va hozirgi ob-havoni oling.

Ushbu kod misolida biz bir nechta qo'shimcha paketlardan foydalanamiz:

  • httr — HTTP so'rovlari bilan ishlash paketi, uning asosida har qanday API bilan ishlash quriladi. Bizning holatda biz bepul API dan foydalanamiz openweathermap.org.
  • stringr — matn bilan ishlash paketi, bizning holatlarimizda biz undan tanlangan shahardagi ob-havo haqida xabar yaratish uchun foydalanamiz.

Kod 4: tanlangan shahar uchun joriy ob-havo haqida xabar beruvchi bot

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

Yuqoridagi kod misolini ishga tushiring, "BOT TOKEN" ni bot yaratishda olgan haqiqiy token bilan almashtirgandan so'ng. BotOta (Men bot yaratish haqida gapirdim birinchi maqola).

Natijada, bizning botimiz shunday ishlaydi:
R-da telegramma botini yozish (3-qism): Botga klaviatura yordamini qanday qo'shish mumkin

Sxematik ravishda ushbu botni quyidagicha tasvirlash mumkin:
R-da telegramma botini yozish (3-qism): Botga klaviatura yordamini qanday qo'shish mumkin

Biz ob-havo botimizda mavjud bo'lgan 3 usulni yaratdik:

  • start — Asosiy bot klaviaturasini ishga tushiring
  • ob-havo — Shaharni tanlash uchun Inline klaviaturasini ishga tushiring
  • answer_cb — API-dan ma'lum bir shahar uchun ob-havo ma'lumotlarini so'rab, uni chatga yuboradigan asosiy usul.

usul start buyruq bilan ishga tushiramiz /start, bu ishlov beruvchi tomonidan amalga oshiriladi CommandHandler('start', start).

Usulni ishga tushirish uchun ob-havo biz bir xil nomdagi filtr yaratdik:

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

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

}
)

Va biz ushbu usulni quyidagi xabar ishlov beruvchisi bilan chaqiramiz: MessageHandler(weather, filters = MessageFilters$weather).

Va nihoyat, bizning asosiy usulimiz answer_cb maxsus ishlov beruvchi tomonidan amalga oshiriladigan Inline tugmachalarini bosishga javob beradi: CallbackQueryHandler(answer_cb).

Bir usul ichida answer_cb, biz klaviaturadan yuborilgan ma'lumotlarni o'qiymiz va uni o'zgaruvchiga yozamiz city: city <- update$callback_query$data. Keyin biz API-dan ob-havo ma'lumotlarini so'raymiz, xabar yaratamiz va yuboramiz va nihoyat usuldan foydalanamiz answerCallbackQuery botga Inline tugmachasini bosganimiz haqida xabar berish uchun.

Belgilangan Hub-ga havolalar bilan so'nggi maqolalar ro'yxatini ko'rsatadigan bot misoli www.habr.com.

Men ushbu botni veb-sahifalarga olib boradigan Inline tugmachalarini qanday ko'rsatishni ko'rsatish uchun taqdim etaman.

Ushbu botning mantig'i avvalgisiga o'xshaydi, dastlab biz asosiy klaviaturani buyruq bilan ishga tushiramiz /start. Keyinchalik, bot bizga tanlash uchun 6 ta markaz ro'yxatini beradi, biz o'zimizni qiziqtirgan markazni tanlaymiz va tanlangan Hubdan eng so'nggi 5 ta nashrni olamiz.

Siz tushunganingizdek, bu holda biz maqolalar ro'yxatini olishimiz kerak va buning uchun biz maxsus paketdan foydalanamiz habR, bu sizga Habra-dan maqolalar va ular bo'yicha ba'zi statistik ma'lumotlarni R-da so'rash imkonini beradi.

Paketni o'rnatish habR faqat github-dan mumkin, buning uchun sizga qo'shimcha paket kerak bo'ladi devtools. O'rnatish uchun quyidagi koddan foydalaning.

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

Endi yuqorida tavsiflangan botni yaratish kodini ko'rib chiqamiz:

Kod 5: Tanlangan Hubdagi eng so'nggi maqolalar ro'yxatini ko'rsatadigan bot

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

Yuqoridagi kod misolini ishga tushiring, "BOT TOKEN" ni bot yaratishda olgan haqiqiy token bilan almashtirgandan so'ng. BotOta (Men bot yaratish haqida gapirdim birinchi maqola).

Natijada biz quyidagi natijaga erishamiz:
R-da telegramma botini yozish (3-qism): Botga klaviatura yordamini qanday qo'shish mumkin

Biz usulda tanlash uchun mavjud bo'lgan Hublar ro'yxatini qattiq kodlashtirdik 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)
}

Belgilangan Hubdan buyruq bilan maqolalar ro'yxatini olamiz habr_hub_posts(), paketdan habR. Shu bilan birga, biz butun vaqt uchun maqolalar ro'yxatini emas, balki faqat 20 ta maqola joylashgan birinchi sahifani talab qilishini ta'kidlaymiz. Buyruq yordamida olingan jadvaldan head() Biz faqat eng so'nggi maqolalar bo'lgan eng yaxshi 5 tasini qoldiramiz.

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

Mantiq avvalgi botga juda o'xshaydi, ammo bu holda biz ushbu funktsiyadan dinamik ravishda maqolalar ro'yxati bilan Inline klaviaturasini yaratamiz. lapply().

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

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

Maqolaning sarlavhasini tugma matniga kiritamiz posts$title[x], va argumentda url maqolaga havola: url = posts$link[x].

Keyinchalik, biz filtr, ishlov beruvchilarni yaratamiz va botimizni ishga tushiramiz.

xulosa

Endi siz yozgan botlardan foydalanish ancha qulay bo'ladi, chunki ular buyruqlar kiritish orqali emas, balki klaviaturadan boshqariladi. Eng kamida, smartfon orqali bot bilan o'zaro aloqada bo'lganda, klaviatura undan foydalanish jarayonini sezilarli darajada soddalashtiradi.

Keyingi maqolada biz bot bilan mantiqiy dialogni qanday qurish va ma'lumotlar bazalari bilan ishlashni aniqlaymiz.

Manba: www.habr.com

a Izoh qo'shish