Pagsulat ug telegram bot sa R ​​(bahin 3): Giunsa pagdugang ang suporta sa keyboard sa usa ka bot

Kini ang ikatulo nga artikulo sa serye nga "Pagsulat sa telegrama bot sa R". Sa miaging mga publikasyon, nahibal-an namon kung giunsa paghimo ang usa ka telegram bot, pagpadala mga mensahe pinaagi niini, pagdugang mga mando ug mga filter sa mensahe sa bot. Busa, sa dili ka pa magsugod sa pagbasa niini nga artikulo, girekomenda ko nga basahon nimo kaniadto, kay Dinhi dili na ako maghisgot bahin sa gihulagway kaniadto nga mga sukaranan sa pagtukod sa bot.

Niini nga artikulo, among pauswagon ang usability sa among bot pinaagi sa pagdugang ug keyboard, nga maghimo sa bot interface nga intuitive ug dali gamiton.

Pagsulat ug telegram bot sa R ​​(bahin 3): Giunsa pagdugang ang suporta sa keyboard sa usa ka bot

Ang tanan nga mga artikulo gikan sa serye nga "Pagsulat sa usa ka telegrama bot sa R"

  1. Paghimo usa ka bot ug gamita kini aron magpadala mga mensahe sa telegrama
  2. Idugang ang suporta sa command ug mga filter sa mensahe sa bot
  3. Giunsa pagdugang ang suporta sa keyboard sa usa ka bot

Mga sulod

Kung interesado ka sa pagtuki sa datos, mahimong interesado ka sa akong telegram и youtube mga kanal. Kadaghanan sa sulod niini gipahinungod sa R ​​nga pinulongan.

  1. Unsang mga klase sa keyboard ang gisuportahan sa telegram bot?
  2. Tubag nga keyboard
  3. Inline nga keyboard
    3.1. Usa ka pananglitan sa usa ka yano nga bot nga adunay suporta alang sa mga buton sa InLine
    3.2. Usa ka pananglitan sa usa ka bot nga nagtaho sa kasamtangan nga panahon alang sa usa ka pinili nga siyudad
    3.3. Usa ka pananglitan sa usa ka bot nga nagpakita sa usa ka lista sa pinakabag-o nga mga artikulo nga adunay mga link sa piho nga Hub gikan sa habr.com
  4. konklusyon

Unsang mga klase sa keyboard ang gisuportahan sa telegram bot?

Sa panahon ning pagsulat telegram.bot nagtugot kanimo sa paghimo og duha ka matang sa mga keyboard:

  • Tubag - Ang panguna, regular nga keyboard, nga nahimutang sa ilawom sa panel sa input sa text message. Ang ingon nga keyboard nagpadala lamang og text message ngadto sa bot, ug ingon nga teksto kini ipadala ang teksto nga gisulat sa buton mismo.
  • Inline - Keyboard nga nakig-uban sa usa ka piho nga mensahe sa bot. Kini nga keyboard nagpadala sa data sa bot nga nalangkit sa buton nga gipindot; kini nga datos mahimong lahi sa teksto nga gisulat sa buton mismo. Ug ang ingon nga mga buton giproseso pinaagi sa CallbackQueryHandler.

Aron maablihan sa bot ang keyboard, gikinahanglan kung magpadala usa ka mensahe pinaagi sa pamaagi sendMessage(), ipasa ang nabuhat na nga keyboard isip argumento reply_markup.

Sa ubos atong tan-awon ang daghang mga pananglitan.

Tubag nga keyboard

Sama sa akong gisulat sa ibabaw, kini ang panguna nga keyboard sa pagkontrol sa bot.

Usa ka pananglitan sa paghimo og Reply keyboard gikan sa opisyal nga tabang

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)

Ang sa ibabaw usa ka pananglitan gikan sa opisyal nga tabang sa package telegram.bot. Aron makahimo og keyboard, gamita ang function ReplyKeyboardMarkup(), nga sa baylo nagkuha usa ka lista sa mga lista sa mga buton nga gihimo sa function KeyboardButton().

Ngano sa ReplyKeyboardMarkup() Kinahanglan ba nimo nga ipasa dili lang ang usa ka lista, apan usa ka lista sa mga lista? Ang kamatuoran mao nga imong gipasa ang nag-unang lista, ug niini imong gihubit ang matag laray sa mga buton sa lain nga mga lista, tungod kay Mahimo nimong ibutang ang daghang mga buton sa usa ka laray.

argumento resize_keyboard nagtugot kanimo sa awtomatikong pagpili sa labing maayo nga gidak-on sa mga buton sa keyboard, ug ang argumento one_time_keyboard nagtugot kanimo sa pagtago sa keyboard pagkahuman sa matag buton pagpindot.

Magsulat kita og usa ka yano nga bot nga adunay 3 ka buton:

  • Chat ID - Paghangyo chat ID sa diyalogo sa bot
  • Akong ngalan - Pangayo sa imong ngalan
  • Ang akong pag-login - Paghangyo sa imong username sa telegrama

Code 1: Yano nga bot nga adunay Reply 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()

Pagdalagan ang pananglitan sa code sa ibabaw, human ilisan ang 'YOUR BOT TOKEN' sa tinuod nga token nga imong nadawat sa paghimo sa bot pinaagi sa BotAmahan (Naghisgot ko bahin sa paghimo og bot sa unang artikulo).

Human sa paglansad, hatagi ang bot og sugo /start, kay Mao gyud kini ang among gipasabut aron ilunsad ang keyboard.

Pagsulat ug telegram bot sa R ​​(bahin 3): Giunsa pagdugang ang suporta sa keyboard sa usa ka bot

Kung sa pagkakaron lisud alang kanimo ang pag-parse sa gihatag nga pananglitan sa code, uban ang paghimo sa mga pamaagi, mga filter ug mga tigdumala, nan kinahanglan nga mobalik ka sa nauna. artikulo, diin akong gihulagway kining tanan sa detalye.

Naghimo kami og 4 nga mga pamaagi:

  • pagsugod — Ilusad ang keyboard
  • chat_id — Pangayo og chat ID
  • my_name — Pangayo sa imong ngalan
  • my_username — Paghangyo sa imong login

Sa pagsupak MessageFilters midugang og 3 nga mga filter sa mensahe base sa ilang teksto:

  • chat_id — Mga mensahe nga adunay teksto "Чат ID"
  • ngalan — Mga mensahe nga adunay teksto "Моё имя"
  • username — Mga mensahe nga adunay teksto "Мой логин"

Ug naghimo kami og 4 nga mga tigdumala nga, base sa gihatag nga mga mando ug mga pagsala, ipatuman ang mga piho nga pamaagi.

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

Ang keyboard mismo gihimo sa sulod sa pamaagi start() team ReplyKeyboardMarkup().

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

Sa among kaso, among gibutang ang tanan nga mga buton sa ilawom sa usag usa, apan mahimo namon nga ihan-ay kini sa usa ka laray pinaagi sa paghimo og mga pagbag-o sa lista sa mga lista sa buton. Kay Ang usa ka laray sa sulod sa keyboard gihimo pinaagi sa usa ka nested list sa mga buton, unya aron ipakita ang among mga buton sa usa ka laray kinahanglan namon nga isulat pag-usab ang bahin sa code alang sa paghimo sa keyboard sama niini:

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

Pagsulat ug telegram bot sa R ​​(bahin 3): Giunsa pagdugang ang suporta sa keyboard sa usa ka bot

Ang keyboard gipadala sa chat gamit ang pamaagi sendMessage(), sa argumento reply_markup.

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

Inline nga keyboard

Sama sa akong gisulat sa ibabaw, ang Inline nga keyboard gihigot sa usa ka piho nga mensahe. Mas lisud ang pagtrabaho kaysa sa panguna nga keyboard.

Sa sinugdan, kinahanglan nimong idugang ang usa ka pamaagi sa bot aron tawagan ang Inline nga keyboard.

Aron makatubag sa usa ka pag-klik sa Inline nga buton, mahimo usab nimo gamiton ang pamaagi sa bot answerCallbackQuery(), nga makapakita ug pahibalo sa interface sa telegrama sa user nga mopilit sa Inline nga buton.

Ang datos nga gipadala gikan sa Inline nga buton dili teksto, busa aron maproseso kini kinahanglan nimo nga maghimo usa ka espesyal nga handler gamit ang mando CallbackQueryHandler().

Ang code alang sa pagtukod sa usa ka Inline nga keyboard nga gihatag sa opisyal nga tabang sa package telegram.bot.

Kodigo alang sa paghimo og Inline nga keyboard gikan sa opisyal nga tabang

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

Kinahanglan ka nga maghimo usa ka Inline nga keyboard gamit ang mando InlineKeyboardMarkup(), sa samang prinsipyo sa Reply keyboard. SA InlineKeyboardMarkup() kinahanglan nga ipasa ang usa ka lista sa mga lista sa Inline nga mga buton, ang matag indibidwal nga butones gihimo sa function InlineKeyboardButton().

Ang usa ka inline nga butones mahimong makapasa sa pipila ka mga datos sa bot gamit ang usa ka argumento callback_data, o ablihi ang bisan unsang HTML nga panid nga gipiho gamit ang argumento url.

Ang resulta usa ka lista diin ang matag elemento usa usab ka lista sa Inline nga mga buton nga kinahanglan nga i-combine sa usa ka laray.

Sunod atong tan-awon ang daghang mga pananglitan sa mga bot nga adunay mga buton nga Inline.

Usa ka pananglitan sa usa ka yano nga bot nga adunay suporta alang sa mga buton sa InLine

Una, magsulat kami ug bot para sa express testing para sa covid-19. Pinaagi sa sugo /test, padad-an ka ug keyboard nga adunay duha ka buton, depende sa buton nga gipugos kini magpadala kanimo usa ka mensahe nga adunay mga resulta sa imong pagsulay.

Code 2: Ang pinakasimple nga bot nga adunay Inline nga 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()

Pagdalagan ang pananglitan sa code sa ibabaw, human ilisan ang 'YOUR BOT TOKEN' sa tinuod nga token nga imong nadawat sa paghimo sa bot pinaagi sa BotAmahan (Naghisgot ko bahin sa paghimo og bot sa unang artikulo).

Resulta:
Pagsulat ug telegram bot sa R ​​(bahin 3): Giunsa pagdugang ang suporta sa keyboard sa usa ka bot

Naghimo kami og duha ka pamaagi:

  • pagsulay — Aron ipadala sa chat Inline nga keyboard
  • tubag_cb — Aron maproseso ang datos nga gipadala gikan sa keyboard.

Ang datos nga ipadala gikan sa matag buton gipiho sa argumento callback_data, sa paghimo sa usa ka buton. Mahimo nimong madawat ang datos nga gipadala gikan sa buton gamit ang pagtukod update$callback_query$data, sulod sa pamaagi tubag_cb.

Para maka-react ang bot sa Inline nga keyboard, pamaagi tubag_cb giproseso sa usa ka espesyal nga handler: CallbackQueryHandler(answer_cb). Nga nagpadagan sa piho nga pamaagi kung ang Inline nga buton gi-klik. Handler CallbackQueryHandler nagkinahanglan og duha ka argumento:

  • callback — Ang paagi nga kinahanglang daganon
  • pattern — Pagsala pinaagi sa datos nga gigapos sa buton gamit ang argumento callback_data.

Busa, gamit ang argumento pattern Makasulat kami og lahi nga pamaagi sa pagpindot sa matag buton:

Code 3: Paglainlain nga mga pamaagi alang sa matag Inline nga buton

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

Pagdalagan ang pananglitan sa code sa ibabaw, human ilisan ang 'YOUR BOT TOKEN' sa tinuod nga token nga imong nadawat sa paghimo sa bot pinaagi sa BotAmahan (Naghisgot ko bahin sa paghimo og bot sa unang artikulo).

Karon gisulat namon ang 2 nga lahi nga pamaagi i.e. usa ka pamaagi, alang sa matag buton nga pagpindot, ug gigamit ang argumento pattern, sa paghimo sa ilang mga tigdumala:

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

Ang code sa pamaagi natapos tubag_cb team bot$answerCallbackQuery(callback_query_id = update$callback_query$id), nga nagsulti sa bot nga ang datos gikan sa inline nga keyboard nadawat.

Usa ka pananglitan sa usa ka bot nga nagtaho sa kasamtangan nga panahon alang sa usa ka pinili nga siyudad

Atong sulayan ang pagsulat ug bot nga nangayo ug datos sa panahon.

Ang lohika sa trabaho niini mao ang mosunod. Sa sinugdan sa team /start gitawag nimo ang main keyboard, nga adunay usa lamang ka buton nga "Weather". Pinaagi sa pag-klik niini nga buton makadawat ka usa ka mensahe nga adunay Inline nga keyboard aron mapili ang lungsod diin gusto nimo mahibal-an ang karon nga panahon. Pagpili usa sa mga lungsod ug kuhaa ang karon nga panahon.

Sa kini nga code nga pananglitan mogamit kami daghang dugang nga mga pakete:

  • httr - usa ka pakete alang sa pagtrabaho sa mga hangyo sa HTTP, base sa kung diin ang pagtrabaho sa bisan unsang API gitukod. Sa among kaso among gamiton ang libre nga API openweathermap.org.
  • stringr — usa ka pakete alang sa pagtrabaho kauban ang teksto, sa among kaso gamiton namon kini aron makamugna usa ka mensahe bahin sa panahon sa napili nga lungsod.

Code 4: Usa ka bot nga nagreport sa kasamtangan nga panahon alang sa pinili nga siyudad

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

Pagdalagan ang pananglitan sa code sa ibabaw, human ilisan ang 'YOUR BOT TOKEN' sa tinuod nga token nga imong nadawat sa paghimo sa bot pinaagi sa BotAmahan (Naghisgot ko bahin sa paghimo og bot sa unang artikulo).

Ingon usa ka sangputanan, ang among bot molihok sama niini:
Pagsulat ug telegram bot sa R ​​(bahin 3): Giunsa pagdugang ang suporta sa keyboard sa usa ka bot

Sa eskematiko, kini nga bot mahimong mahulagway sama niini:
Pagsulat ug telegram bot sa R ​​(bahin 3): Giunsa pagdugang ang suporta sa keyboard sa usa ka bot

Naghimo kami og 3 nga mga pamaagi nga magamit sa sulod sa among weather bot:

  • pagsugod - Ilunsad ang nag-unang bot keyboard
  • panahon - Ilunsad ang Inline nga keyboard aron makapili usa ka lungsod
  • tubag_cb — Ang panguna nga pamaagi nga naghangyo sa panahon gikan sa API alang sa usa ka lungsod ug ipadala kini sa chat.

Paagi pagsugod gilusad namo kini sa sugo /start, nga gipatuman sa handler CommandHandler('start', start).

Sa pagpadagan sa usa ka pamaagi panahon naghimo kami usa ka filter nga parehas nga ngalan:

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

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

}
)

Ug gitawag namo kini nga pamaagi sa mosunod nga tigdumala sa mensahe: MessageHandler(weather, filters = MessageFilters$weather).

Ug sa katapusan, ang among panguna nga pamaagi tubag_cb motubag sa pagpindot sa Inline nga mga buton, nga gipatuman sa usa ka espesyal nga handler: CallbackQueryHandler(answer_cb).

Sa sulod sa usa ka pamaagi tubag_cb, gibasa namo ang datos nga gipadala gikan sa keyboard ug isulat kini sa usa ka variable city: city <- update$callback_query$data. Dayon mihangyo kami sa datos sa panahon gikan sa API, makamugna ug magpadala ug mensahe, ug sa kataposan mogamit sa pamaagi answerCallbackQuery aron ipahibalo sa bot nga among giproseso ang pag-klik sa Inline nga buton.

Usa ka pananglitan sa usa ka bot nga nagpakita sa usa ka lista sa pinakabag-o nga mga artikulo nga adunay mga link sa gipiho nga Hub gikan sa www.habr.com.

Gipresentar nako kini nga bot aron ipakita kanimo kung giunsa pagpakita ang mga buton sa Inline nga padulong sa mga panid sa web.

Ang lohika sa kini nga bot parehas sa nauna; sa sinugdan gilusad namon ang panguna nga keyboard nga adunay mando /start. Sunod, ang bot naghatag kanamo og lista sa 6 ka hub nga mapilian, among pilion ang hub nga among gusto, ug makadawat sa 5 ka pinakabag-o nga publikasyon gikan sa pinili nga Hub.

Sama sa imong nasabtan, sa kini nga kaso kinahanglan namon nga makakuha usa ka lista sa mga artikulo, ug alang niini mogamit kami usa ka espesyal nga pakete habR, nga nagtugot kanimo sa paghangyo og mga artikulo gikan sa Habra ug pipila ka estadistika niini sa R.

I-install ang package habR posible lamang gikan sa github, diin kinahanglan nimo ang dugang nga pakete devtools. Aron ma-install, gamita ang code sa ubos.

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

Karon atong tan-awon ang code alang sa pagtukod sa bot nga gihulagway sa ibabaw:

Code 5: Usa ka bot nga nagpakita sa usa ka lista sa pinakabag-o nga mga artikulo sa pinili nga Hub

library(telegram.bot)
library(habR)

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

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

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

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

}

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

  IKM <- InlineKeyboardMarkup(
    inline_keyboard = list(
      list(
        InlineKeyboardButton(text = 'R', callback_data = 'R'),
        InlineKeyboardButton(text = 'Data Mining', callback_data = 'data_mining'),
        InlineKeyboardButton(text = 'Data Engineering', callback_data = 'data_engineering')
      ),
      list(
        InlineKeyboardButton(text = 'Big Data', callback_data = 'bigdata'),
        InlineKeyboardButton(text = 'Python', callback_data = 'python'),
        InlineKeyboardButton(text = 'Визуализация данных', callback_data = 'data_visualization')
      )
    )
  )

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

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

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

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

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

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

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

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

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

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

}

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

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

}
)

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

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

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

Pagdalagan ang pananglitan sa code sa ibabaw, human ilisan ang 'YOUR BOT TOKEN' sa tinuod nga token nga imong nadawat sa paghimo sa bot pinaagi sa BotAmahan (Naghisgot ko bahin sa paghimo og bot sa unang artikulo).

Ingon usa ka sangputanan, makuha namon kini nga sangputanan:
Pagsulat ug telegram bot sa R ​​(bahin 3): Giunsa pagdugang ang suporta sa keyboard sa usa ka bot

Gi-hardcode namon ang lista sa mga Hub nga magamit alang sa pagpili sa pamaagi 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)
}

Nakakuha kami usa ka lista sa mga artikulo gikan sa piho nga Hub nga adunay mando habr_hub_posts(), gikan sa pakete habR. Sa samang higayon, among gipunting nga wala namo kinahanglana ang listahan sa mga artikulo sa tibuok panahon, kondili ang unang panid lamang diin nahimutang ang 20 ka artikulo. Gikan sa resulta nga lamesa gamit ang command head() Gibilin lang namo ang top 5, nga mao ang pinakabag-o nga mga artikulo.

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

Ang lohika parehas kaayo sa miaging bot, apan sa kini nga kaso naghimo kami usa ka Inline nga keyboard nga adunay usa ka lista sa mga artikulo nga dinamikong gigamit ang function. lapply().

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

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

Atong isulod ang titulo sa artikulo ngadto sa buton nga teksto posts$title[x], ug sa argumento url link sa artikulo: url = posts$link[x].

Sunod, maghimo kami usa ka filter, tigdumala ug ilunsad ang among bot.

konklusyon

Karon ang mga bot nga imong gisulat mas sayon ​​​​gamiton, tungod sa kamatuoran nga sila kontrolado gikan sa keyboard, kay sa pagsulod sa mga sugo. Sa labing gamay, kung nakig-uban sa usa ka bot pinaagi sa usa ka smartphone, ang keyboard labi nga mapasimple ang proseso sa paggamit niini.

Sa sunod nga artikulo atong mahibal-an kung giunsa paghimo ang usa ka lohikal nga diyalogo sa usa ka bot ug magtrabaho kauban ang mga database.

Source: www.habr.com

Idugang sa usa ka comment