Sau tus xov tooj bot hauv R (ib ntu 3): Yuav ua li cas ntxiv cov keyboard txhawb rau bot

Nov yog tsab xov xwm thib peb hauv koob "Sau ib lub xov tooj ntawm tes hauv R". Hauv kev tshaj tawm yav dhau los, peb tau kawm yuav ua li cas los tsim lub telegram bot, xa cov lus los ntawm nws, ntxiv cov lus txib thiab cov lus lim rau bot. Yog li ntawd, ua ntej koj pib nyeem tsab xov xwm no, kuv xav kom koj nyeem yav dhau los, vim Ntawm no kuv yuav tsis nyob ntawm cov lus piav qhia yav dhau los ntawm lub tsev bot.

Hauv tsab xov xwm no, peb yuav txhim kho kev siv tau ntawm peb cov bot los ntawm kev ntxiv cov keyboard, uas yuav ua rau bot interface intuitive thiab yooj yim rau siv.

Sau tus xov tooj bot hauv R (ib ntu 3): Yuav ua li cas ntxiv cov keyboard txhawb rau bot

Tag nrho cov ntawv los ntawm koob "Sau ib lub xov tooj bot hauv R"

  1. Peb tsim ib lub bot thiab siv nws los xa cov lus hauv telegram
  2. Ntxiv cov lus txhawb nqa thiab cov lus lim rau bot
  3. Yuav ua li cas ntxiv cov keyboard txhawb rau bot

Txheem

Yog tias koj txaus siab rau cov ntaub ntawv tsom xam, tej zaum koj yuav txaus siab rau kuv telegram и youtube cov channel. Cov ntsiab lus feem ntau yog mob siab rau R hom lus.

  1. Cov keyboards hom twg yog telegram bot txhawb?
  2. Teb cov keyboard
  3. Inline keyboard
    3.1. Ib qho piv txwv ntawm ib qho yooj yim bot nrog kev txhawb nqa rau InLine nyees khawm
    3.2. Ib qho piv txwv ntawm bot uas qhia txog huab cua tam sim no rau lub nroog xaiv
    3.3. Ib qho piv txwv ntawm bot uas qhia cov npe ntawm cov kab lus tshiab kawg nrog kev txuas mus rau Hub teev los ntawm habr.com
  4. xaus

Cov keyboards hom twg yog telegram bot txhawb?

Thaum lub sijhawm sau ntawv no telegram.bot tso cai rau koj los tsim ob hom keyboards:

  • Teb - Lub ntsiab lus tseem ceeb, cov keyboard tsis tu ncua, uas nyob hauv qab ntawm cov lus nkag hauv vaj huam sib luag. Xws li cov keyboard tsuas yog xa cov ntawv xa mus rau bot, thiab raws li cov ntawv nyeem nws yuav xa cov ntawv sau rau ntawm lub pob nws tus kheej.
  • Inline - Keyboard cuam tshuam nrog cov lus tshwj xeeb bot. Cov keyboard no xa cov ntaub ntawv bot cuam tshuam nrog lub khawm nias; cov ntaub ntawv no yuav txawv ntawm cov ntawv sau ntawm lub pob nws tus kheej. Thiab cov nyees khawm zoo li no tau ua tiav CallbackQueryHandler.

Txhawm rau kom bot qhib cov keyboard, nws yog qhov tsim nyog thaum xa lus los ntawm txoj kev sendMessage(), hla cov keyboard tsim yav dhau los ua kev sib cav reply_markup.

Hauv qab no peb yuav saib ob peb yam piv txwv.

Teb cov keyboard

Raws li kuv tau sau saum toj no, qhov no yog lub ntsiab bot tswj keyboard.

Ib qho piv txwv ntawm kev tsim cov ntawv teb teb los ntawm kev pab cuam

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)

Cov saum toj no yog ib qho piv txwv los ntawm kev pab ntawm lub pob telegram.bot. Txhawm rau tsim cov keyboard, siv cov haujlwm ReplyKeyboardMarkup(), uas nyob rau hauv lem coj ib daim ntawv teev cov npe ntawm cov nyees khawm uas yog tsim los ntawm cov muaj nuj nqi KeyboardButton().

Vim nyob rau hauv ReplyKeyboardMarkup() Koj puas yuav tsum dhau tsis yog ib daim ntawv teev npe, tab sis ib daim ntawv teev npe? Qhov tseeb yog tias koj dhau cov npe tseem ceeb, thiab hauv nws koj txhais txhua kab ntawm cov nyees khawm hauv cov npe cais, vim Koj tuaj yeem tso ob peb lub nyees khawm hauv ib kab.

sib cav resize_keyboard tso cai rau koj tuaj yeem xaiv qhov loj me ntawm cov keyboard khawm, thiab qhov kev sib cav one_time_keyboard tso cai rau koj nkaum cov keyboard tom qab txhua lub pob nyem.

Wb sau ib qho yooj yim bot uas yuav muaj 3 nyees khawm:

  • Tham ID - Thov tham ID ntawm kev sib tham nrog bot
  • Kuv lub npe - Thov koj lub npe
  • Kuv tus ID nkag mus - Thov koj tus username hauv telegram

Code 1: Yooj yim bot nrog teb cov keyboard

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

Khiav tus lej piv txwv saum toj no, tom qab hloov 'koj BOT TOKEN' nrog lub token tiag koj tau txais thaum tsim lub bot ntawm BotFather (Kuv tham txog kev tsim bot hauv thawj tsab xov xwm).

Tom qab tso tawm, muab cov lus txib rau bot /start, vim Qhov no yog raws nraim qhov peb tau hais kom tso tawm cov keyboard.

Sau tus xov tooj bot hauv R (ib ntu 3): Yuav ua li cas ntxiv cov keyboard txhawb rau bot

Yog tias tam sim no nws nyuaj rau koj los txheeb xyuas qhov piv txwv muab code, nrog rau kev tsim cov txheej txheem, cov ntxaij lim dej thiab cov neeg ua haujlwm, ces koj yuav tsum rov qab mus rau yav dhau los. Tshooj, nyob rau hauv uas kuv piav tag nrho cov no nyob rau hauv kom meej.

Peb tsim 4 txoj kev:

  • pib - Tua tawm cov keyboard
  • chat_id — Thov chat ID
  • my_name — Thov koj lub npe
  • my_username - Thov koj tus ID nkag mus

Los tawm tsam MessageFilters ntxiv 3 cov ntawv lim raws li lawv cov ntawv:

  • chat_id — Cov lus nrog cov ntawv "Чат ID"
  • npe - Cov lus nrog cov ntawv "Моё имя"
  • username — Cov lus nrog cov ntawv "Мой логин"

Thiab peb tau tsim 4 tus neeg tuav haujlwm uas, raws li cov lus txib thiab cov ntxaij lim dej tau muab, yuav ua tiav cov txheej txheem teev tseg.

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

Cov keyboard nws tus kheej yog tsim nyob rau hauv txoj kev start() pab ReplyKeyboardMarkup().

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

Hauv peb cov ntaub ntawv, peb muab tag nrho cov nyees khawm nyob rau hauv ib leeg, tab sis peb tuaj yeem npaj lawv hauv ib kab los ntawm kev hloov pauv cov npe ntawm cov npe khawm. Vim ib kab hauv cov keyboard yog tsim los ntawm ib daim ntawv teev cov nyees khawm, ces thiaj li yuav tso saib peb cov nyees khawm nyob rau hauv ib kab peb yuav tsum rov sau ib feem ntawm cov cai rau tsim cov keyboard zoo li no:

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

Sau tus xov tooj bot hauv R (ib ntu 3): Yuav ua li cas ntxiv cov keyboard txhawb rau bot

Cov keyboard raug xa mus rau kev sib tham siv txoj kev sendMessage(), hauv kev sib cav reply_markup.

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

Inline keyboard

Raws li kuv tau sau saum toj no, Inline keyboard yog khi rau cov lus tshwj xeeb. Nws yog qhov nyuaj me ntsis los ua haujlwm nrog ntau dua li cov keyboard tseem ceeb.

Thaum pib, koj yuav tsum tau ntxiv ib txoj hauv kev rau bot hu rau Inline keyboard.

Txhawm rau teb rau Inline khawm nyem, koj tuaj yeem siv txoj hauv kev bot answerCallbackQuery(), uas tuaj yeem tso cov ntawv ceeb toom hauv telegram interface rau tus neeg siv uas nias lub khawm Inline.

Cov ntaub ntawv xa los ntawm Inline khawm tsis yog cov ntawv nyeem, yog li txhawm rau ua nws koj yuav tsum tsim tus tuav tshwj xeeb siv cov lus txib CallbackQueryHandler().

Cov cai tsim ib qho Inline keyboard uas tau muab rau hauv kev pab cuam ntawm pob telegram.bot.

Code rau tsim ib qho Inline keyboard los ntawm kev pab cuam

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

Koj yuav tsum tsim ib qho Inline keyboard siv cov lus txib InlineKeyboardMarkup(), ntawm tib lub hauv paus ntsiab lus raws li cov lus teb keyboard. IN InlineKeyboardMarkup() Nws yog ib qho tsim nyog kom dhau ib daim ntawv teev npe ntawm Inline nyees khawm, txhua tus neeg khawm yog tsim los ntawm kev ua haujlwm InlineKeyboardButton().

Ib lub khawm inline tuaj yeem dhau qee cov ntaub ntawv mus rau bot siv qhov kev sib cav callback_data, lossis qhib ib nplooj ntawv HTML teev tseg siv qhov kev sib cav url.

Qhov tshwm sim yuav yog ib daim ntawv teev npe nyob rau hauv uas txhua lub caij tseem yog ib daim ntawv teev cov nyees khawm Inline uas yuav tsum tau muab tso rau hauv ib kab.

Tom ntej no peb yuav saib ntau qhov piv txwv ntawm bots nrog Inline nyees khawm.

Ib qho piv txwv ntawm ib qho yooj yim bot nrog kev txhawb nqa rau InLine nyees khawm

Ua ntej, peb yuav sau ib lub bot rau kev kuaj mob rau covid-19. Los ntawm kev hais kom ua /test, nws yuav xa koj cov keyboard nrog ob lub nyees khawm, nyob ntawm lub pob nyem nws yuav xa koj cov lus nrog cov txiaj ntsig ntawm koj qhov kev sim.

Code 2: Qhov yooj yim tshaj plaws bot nrog ib qho Inline keyboard

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

Khiav tus lej piv txwv saum toj no, tom qab hloov 'koj BOT TOKEN' nrog lub token tiag koj tau txais thaum tsim lub bot ntawm BotFather (Kuv tham txog kev tsim bot hauv thawj tsab xov xwm).

Tshwm sim:
Sau tus xov tooj bot hauv R (ib ntu 3): Yuav ua li cas ntxiv cov keyboard txhawb rau bot

Peb tsim ob txoj kev:

  • xeem - Xa mus tham Inline keyboard
  • teb_cb - Ua cov ntaub ntawv xa los ntawm cov keyboard.

Cov ntaub ntawv uas yuav raug xa los ntawm txhua lub pob yog teev nyob rau hauv qhov kev sib cav callback_data, thaum tsim ib lub pob. Koj tuaj yeem tau txais cov ntaub ntawv xa los ntawm lub pob uas siv qhov tsim update$callback_query$data, hauv txoj kev teb_cb.

Rau bot kom hnov ​​​​mob rau Inline keyboard, txoj kev teb_cb ua tiav los ntawm ib tug tshwj xeeb handler: CallbackQueryHandler(answer_cb). Uas khiav txoj kev teev tseg thaum lub khawm Inline yog clicked. Tus tuav CallbackQueryHandler siv ob qhov kev sib cav:

  • callback - Txoj kev uas yuav tsum tau ua
  • pattern - Lim los ntawm cov ntaub ntawv uas yog khi rau lub pob siv qhov kev sib cav callback_data.

Raws li, siv qhov kev sib cav pattern Peb tuaj yeem sau ib txoj hauv kev rau nias txhua lub pob:

Code 3: Sib cais txoj hauv kev rau txhua lub khawm 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()

Khiav tus lej piv txwv saum toj no, tom qab hloov 'koj BOT TOKEN' nrog lub token tiag koj tau txais thaum tsim lub bot ntawm BotFather (Kuv tham txog kev tsim bot hauv thawj tsab xov xwm).

Tam sim no peb tau sau 2 txoj kev sib cais i.e. ib txoj kev, rau txhua lub khawm nias, thiab siv qhov kev sib cav pattern, thaum tsim lawv handlers:

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

Txoj kev cai xaus teb_cb pab bot$answerCallbackQuery(callback_query_id = update$callback_query$id), uas qhia rau bot tias cov ntaub ntawv los ntawm cov keyboard inline tau txais.

Ib qho piv txwv ntawm bot uas qhia txog huab cua tam sim no rau lub nroog xaiv

Cia peb sim sau ib lub bot uas thov cov ntaub ntawv huab cua.

Lub logic ntawm nws txoj haujlwm yuav ua raws li hauv qab no. Pib los ntawm pab neeg /start koj hu rau lub ntsiab keyboard, uas muaj tsuas yog ib qho "Huab cua" khawm. Los ntawm txhaj rau ntawm lub pob no koj yuav tau txais cov lus nrog Inline keyboard xaiv lub nroog uas koj xav paub txog huab cua tam sim no. Xaiv ib lub nroog thiab tau txais huab cua tam sim no.

Hauv qhov piv txwv code no peb yuav siv ob peb pob ntxiv:

  • httr - ib pob rau kev ua haujlwm nrog HTTP thov, raws li kev ua haujlwm nrog API tsim. Hauv peb qhov xwm txheej peb yuav siv API pub dawb openweathermap.org.
  • stringr - ib pob rau kev ua hauj lwm nrog cov ntawv nyeem, nyob rau hauv peb cov ntaub ntawv peb yuav siv nws los tsim cov lus hais txog huab cua nyob rau hauv lub nroog xaiv.

Code 4: Ib lub bot uas qhia txog huab cua tam sim no rau lub nroog xaiv

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

Khiav tus lej piv txwv saum toj no, tom qab hloov 'koj BOT TOKEN' nrog lub token tiag koj tau txais thaum tsim lub bot ntawm BotFather (Kuv tham txog kev tsim bot hauv thawj tsab xov xwm).

Yog li ntawd, peb bot yuav ua haujlwm zoo li no:
Sau tus xov tooj bot hauv R (ib ntu 3): Yuav ua li cas ntxiv cov keyboard txhawb rau bot

Schematically, qhov no bot tuaj yeem piav qhia zoo li no:
Sau tus xov tooj bot hauv R (ib ntu 3): Yuav ua li cas ntxiv cov keyboard txhawb rau bot

Peb tau tsim 3 txoj hauv kev muaj nyob hauv peb cov huab cua bot:

  • pib - Tua tawm lub ntsiab bot keyboard
  • huab cua - Tua tawm Inline keyboard xaiv lub nroog
  • teb_cb - Txoj hauv kev tseem ceeb uas thov huab cua los ntawm API rau lub nroog muab thiab xa mus rau kev sib tham.

Txujci pib peb tso nws nrog cov lus txib /start, uas yog siv los ntawm tus tuav CommandHandler('start', start).

Kom khiav ib txoj kev huab cua peb tsim ib lub lim ntawm tib lub npe:

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

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

}
)

Thiab peb hu txoj kev no nrog cov lus hauv qab no: MessageHandler(weather, filters = MessageFilters$weather).

Thiab thaum kawg, peb txoj kev tseem ceeb teb_cb reacts rau nias Inline nyees khawm, uas yog siv los ntawm ib tug tshwj xeeb handler: CallbackQueryHandler(answer_cb).

Hauv ib txoj kev teb_cb, peb nyeem cov ntaub ntawv xa los ntawm cov keyboard thiab sau nws mus rau qhov sib txawv city: city <- update$callback_query$data. Tom qab ntawd peb thov cov ntaub ntawv huab cua los ntawm API, tsim thiab xa cov lus, thiab thaum kawg siv txoj kev answerCallbackQuery txhawm rau qhia rau bot tias peb tau ua tiav qhov nyem ntawm Inline khawm.

Ib qho piv txwv ntawm bot uas qhia cov npe ntawm cov kab lus tshiab kawg nrog kev txuas mus rau Hub teev los ntawm www.hab.com.

Kuv nthuav tawm no bot los qhia koj yuav ua li cas tso saib Inline nyees khawm uas ua rau cov nplooj ntawv web.

Lub logic ntawm cov bot no zoo ib yam li yav dhau los; pib peb tso lub ntsiab keyboard nrog cov lus txib /start. Tom ntej no, bot muab peb cov npe ntawm 6 hubs xaiv los ntawm, peb xaiv lub hub uas peb nyiam, thiab tau txais 5 cov ntawv tshaj tawm tsis ntev los no los ntawm Hub xaiv.

Raws li koj nkag siab, qhov no peb yuav tsum tau txais ib daim ntawv teev cov khoom, thiab rau qhov no peb yuav siv ib pob tshwj xeeb habR, uas tso cai rau koj thov cov ntawv los ntawm Habra thiab qee qhov txheeb cais ntawm lawv hauv R.

Nruab pob habR tsuas yog ua tau los ntawm github, uas koj yuav xav tau ib pob ntxiv devtools. Txhawm rau nruab, siv cov cai hauv qab no.

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

Tam sim no cia saib cov cai rau kev tsim lub bot tau piav qhia saum toj no:

Code 5: Ib qho bot uas qhia cov npe ntawm cov kab lus tsis ntev los no ntawm Hub xaiv

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

Khiav tus lej piv txwv saum toj no, tom qab hloov 'koj BOT TOKEN' nrog lub token tiag koj tau txais thaum tsim lub bot ntawm BotFather (Kuv tham txog kev tsim bot hauv thawj tsab xov xwm).

Raws li qhov tshwm sim, peb yuav tau txais qhov txiaj ntsig no:
Sau tus xov tooj bot hauv R (ib ntu 3): Yuav ua li cas ntxiv cov keyboard txhawb rau bot

Peb hardcoded cov npe ntawm Hubs muaj rau xaiv hauv txoj kev 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)
}

Peb tau txais ib daim ntawv teev cov kab lus los ntawm Hub teev nrog cov lus txib habr_hub_posts(), los ntawm pob habR. Nyob rau tib lub sijhawm, peb taw qhia tias peb tsis xav tau cov npe ntawm cov khoom rau tag nrho lub sijhawm, tab sis tsuas yog thawj nplooj ntawv ntawm 20 kab lus nyob. Los ntawm lub rooj tshwm sim siv cov lus txib head() Peb tsuas yog tso rau saum 5 xwb, uas yog cov kab lus tsis ntev los no.

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

Cov logic zoo ib yam li yav dhau los bot, tab sis nyob rau hauv cov ntaub ntawv no peb tsim ib tug Inline keyboard nrog ib daim ntawv teev cov khoom dynamically siv lub functionality. lapply().

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

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

Peb ntxig lub npe ntawm tsab xov xwm rau hauv cov ntawv khawm posts$title[x], thiab hauv kev sib cav url txuas rau kab lus: url = posts$link[x].

Tom ntej no, peb tsim ib lub lim, handlers thiab tso peb bot.

xaus

Tam sim no cov bots koj sau yuav yooj yim dua rau siv, vim tias lawv yuav raug tswj los ntawm cov keyboard, tsis yog nkag mus rau cov lus txib. Qhov tsawg kawg nkaus, thaum sib cuam tshuam nrog bot ntawm lub xov tooj smartphone, cov keyboard yuav ua kom yooj yim rau kev siv nws.

Hauv tsab xov xwm tom ntej no peb yuav txheeb xyuas yuav ua li cas los tsim kom muaj kev sib tham nrog bot thiab ua haujlwm nrog cov ntaub ntawv.

Tau qhov twg los: www.hab.com

Ntxiv ib saib