Навиштани боти телеграмма дар R (қисми 3): Чӣ тавр ба бот дастгирии клавиатураро илова кардан мумкин аст

Ин мақолаи сеюм дар силсилаи "Навиштани боти телеграмма дар R" аст. Дар нашрияҳои қаблӣ мо фаҳмидем, ки чӣ тавр сохтани боти телеграмма, ирсоли паёмҳо тавассути он, илова кардани фармонҳо ва филтрҳои паёмӣ ба бот. Аз ин рӯ, пеш аз оғози хондани ин мақола, ман тавсия медиҳам, ки хонед гузашта, зеро Дар ин ҷо ман дигар дар бораи асосҳои қаблан тавсифшудаи сохтани бот таваққуф намекунам.

Дар ин мақола, мо қобилияти истифодабарии боти худро тавассути илова кардани клавиатура беҳтар хоҳем кард, ки интерфейси ботро беихтиёрона ва истифодаи осон мегардонад.

Навиштани боти телеграмма дар R (қисми 3): Чӣ тавр ба бот дастгирии клавиатураро илова кардан мумкин аст

Ҳама мақолаҳо аз силсилаи "Навиштани боти телеграмма дар R"

  1. Мо бот эҷод мекунем ва онро барои фиристодани паёмҳо дар телеграмма истифода мебарем
  2. Ба бот дастгирии фармон ва филтрҳои паём илова кунед
  3. Чӣ тавр илова кардани дастгирии клавиатура ба бот

Мундариҷа

Агар шумо ба таҳлили маълумот таваҷҷӯҳ дошта бошед, шумо шояд ба ман таваҷҷӯҳ кунед телеграмма и YouTube каналхо. Аксари мундариҷа ба забони R бахшида шудаанд.

  1. Боти телеграм кадом намуди клавиатураҳоро дастгирӣ мекунад?
  2. Клавиатураи ҷавоб
  3. Клавиатураи дарунсохт
    3.1. Намунаи боти оддӣ бо дастгирии тугмаҳои InLine
    3.2. Намунаи бот, ки дар бораи обу ҳавои ҷории як шаҳри интихобшуда гузориш медиҳад
    3.3. Намунаи бот, ки рӯйхати мақолаҳои охиринро бо истинод ба Hub муайяншуда аз habr.com намоиш медиҳад
  4. хулоса

Боти телеграм кадом намуди клавиатураҳоро дастгирӣ мекунад?

Дар замони навиштани ин telegram.bot ба шумо имкон медиҳад, ки ду намуди клавиатура эҷод кунед:

  • Ҷавоб додан - Клавиатураи асосӣ ва муқаррарӣ, ки дар зери панели вуруди матни паём ҷойгир аст. Чунин клавиатура танҳо ба бот паёми матнӣ мефиристад ва ҳамчун матн он матни дар худи тугма навишташударо мефиристад.
  • Inline - Клавиатура бо паёми боти мушаххас алоқаманд аст. Ин клавиатура маълумоти боти марбут ба тугмаи пахшшударо мефиристад; ин маълумот метавонад аз матни дар худи тугма навишташуда фарқ кунад. Ва чунин тугмаҳо тавассути коркард карда мешаванд CallbackQueryHandler.

Барои он ки бот клавиатураро кушояд, ҳангоми фиристодани паём тавассути усул зарур аст sendMessage(), клавиатураи қаблан сохташударо ҳамчун аргумент гузаронед reply_markup.

Дар зер мо якчанд мисолҳоро дида мебароем.

Клавиатураи ҷавоб

Тавре ки ман дар боло навишта будам, ин клавиатураи асосии идоракунии бот мебошад.

Намунаи сохтани клавиатураи Ҷавоб аз кӯмаки расмӣ

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)

Дар боло намунаи кӯмаки расмии баста аст telegram.bot. Барои сохтани клавиатура, функсияро истифода баред ReplyKeyboardMarkup(), ки дар навбати худ рӯйхати рӯйхатҳои тугмаҳоро, ки аз ҷониби функсия сохта шудаанд, мегирад KeyboardButton().

Чаро дар ReplyKeyboardMarkup() Оё шумо бояд на танҳо рӯйхат, балки рӯйхати рӯйхатҳоро гузаронед? Гап дар он аст, ки шумо рӯйхати асосиро мегузаред ва дар он шумо ҳар як сатри тугмаҳоро дар рӯйхатҳои алоҳида муайян мекунед, зеро Шумо метавонед якчанд тугмаҳоро дар як қатор ҷойгир кунед.

Баҳс resize_keyboard ба шумо имкон медиҳад, ки ба таври худкор андозаи оптималии тугмаҳои клавиатура ва далелро интихоб кунед one_time_keyboard ба шумо имкон медиҳад, ки пас аз ҳар як пахшкунии тугма клавиатураро пинҳон кунед.

Биёед боти оддиеро нависем, ки 3 тугма дорад:

  • Чат ID - ID-и муколамаро бо бот дархост кунед
  • Номи ман - Номи худро дархост кунед
  • Логини ман - Номи корбарии худро дар телеграм дархост кунед

Рамзи 1: Боти оддӣ бо клавиатураи Ҷавоб

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

Мисоли рамзи дар боло зикршударо иҷро кунед, пас аз иваз кардани 'BOT TOKEN' -и шумо бо аломати воқеӣ, ки ҳангоми сохтани бот тавассути тавассути он гирифтаед. БотПадар (Ман дар бораи сохтани бот дар мақолаи аввал).

Пас аз оғоз, ба бот фармон диҳед /start, зеро Ин маҳз ҳамон чизест, ки мо барои оғоз кардани клавиатура муайян кардем.

Навиштани боти телеграмма дар R (қисми 3): Чӣ тавр ба бот дастгирии клавиатураро илова кардан мумкин аст

Агар дар айни замон барои шумо таҳлили мисоли рамзи додашуда бо эҷоди усулҳо, филтрҳо ва коркардкунандагон душвор бошад, пас шумо бояд ба пешина баргардед. мақола, ки дар он ман хамаи инро муфассал баён кардам.

Мо 4 усулро таҳия кардем:

  • оғоз — Клавиатураро оғоз кунед
  • chat_id — ID-и чатро дархост кунед
  • my_name — Номи худро дархост кунед
  • my_username — Воридшавии худро дархост кунед

Эътироз кардан Филтрҳои паёмҳо 3 филтрҳои паёмиро дар асоси матни онҳо илова карданд:

  • chat_id — Паёмҳо бо матн "Чат ID"
  • ном — Паёмҳо бо матн "Моё имя"
  • номи корбар — Паёмҳо бо матн "Мой логин"

Ва мо 4 коркардкунанда эҷод кардем, ки дар асоси фармонҳо ва филтрҳои додашуда усулҳои муайяншударо иҷро мекунанд.

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

Худи клавиатура дар дохили усул сохта шудааст start() даста ReplyKeyboardMarkup().

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

Дар ҳолати мо, мо ҳама тугмаҳоро дар зери ҳамдигар ҷойгир кардем, аммо мо метавонем онҳоро бо ворид кардани тағирот ба рӯйхати рӯйхатҳои тугмаҳо дар як саф ҷойгир кунем. Зеро як сатр дар дохили клавиатура тавассути рӯйхати дохилии тугмаҳо сохта мешавад, пас барои дар як сатр намоиш додани тугмаҳои мо мо бояд як қисми кодро барои сохтани клавиатура аз нав нависем:

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

Навиштани боти телеграмма дар R (қисми 3): Чӣ тавр ба бот дастгирии клавиатураро илова кардан мумкин аст

Бо истифода аз усул клавиатура ба чат фиристода мешавад sendMessage(), дар баҳс reply_markup.

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

Клавиатураи дарунсохт

Тавре ки ман дар боло навишта будам, клавиатураи Inline ба паёми мушаххас вобаста аст. Бо он кор кардан нисбат ба клавиатураи асосӣ каме мушкилтар аст.

Дар аввал, шумо бояд ба бот усулеро илова кунед, то клавиатураи Inline занг занед.

Барои посух додан ба пахши тугмаи Inline, шумо инчунин метавонед усули ботро истифода баред answerCallbackQuery(), ки метавонад огоҳиномаро дар интерфейси телеграмма ба корбаре, ки тугмаи Inline-ро пахш мекунад, нишон диҳад.

Маълумоте, ки аз тугмаи Inline фиристода мешавад, матн нест, бинобар ин барои коркарди он шумо бояд бо истифода аз фармон коркарди махсус эҷод кунед CallbackQueryHandler().

Рамзи сохтани клавиатураи Inline, ки дар кӯмаки расмии баста оварда шудааст telegram.bot.

Рамз барои сохтани клавиатураи Inline аз ёрии расмӣ

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

Шумо бояд бо истифода аз фармон клавиатураи Inline созед InlineKeyboardMarkup(), бо ҳамон принсипе, ки клавиатураи ҷавоб. ДАР InlineKeyboardMarkup() Рӯйхати рӯйхатҳои тугмаҳои Inlineро гузаштан лозим аст, ки ҳар як тугмаи инфиродӣ аз ҷониби функсия сохта мешавад InlineKeyboardButton().

Тугмаи дарунсохт метавонад ё бо истифода аз аргумент баъзе маълумотро ба бот интиқол диҳад callback_data, ё ягон саҳифаи HTML-ро, ки бо истифода аз аргумент муайян шудааст, кушоед url.

Дар натиҷа рӯйхате хоҳад буд, ки дар он ҳар як элемент инчунин рӯйхати тугмаҳои Inline мебошад, ки бояд дар як сатр муттаҳид карда шаванд.

Минбаъд мо якчанд мисолҳои ботҳоро бо тугмаҳои Inline дида мебароем.

Намунаи боти оддӣ бо дастгирии тугмаҳои InLine

Аввалан, мо барои санҷиши экспресс барои covid-19 бот менависем. Бо фармон /test, он ба шумо клавиатураро бо ду тугма мефиристад, вобаста ба тугмаи пахшшуда ба шумо паёмеро бо натиҷаҳои санҷиши шумо мефиристад.

Рамзи 2: Бот соддатарин бо клавиатураи 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()

Мисоли рамзи дар боло зикршударо иҷро кунед, пас аз иваз кардани 'BOT TOKEN' -и шумо бо аломати воқеӣ, ки ҳангоми сохтани бот тавассути тавассути он гирифтаед. БотПадар (Ман дар бораи сохтани бот дар мақолаи аввал).

Натиҷа:
Навиштани боти телеграмма дар R (қисми 3): Чӣ тавр ба бот дастгирии клавиатураро илова кардан мумкин аст

Мо ду усулро таҳия кардем:

  • озмоиш — Барои фиристодан ба чат клавиатураи Inline
  • answer_cb — Барои коркарди маълумоти аз клавиатура фиристодашуда.

Маълумоте, ки аз ҳар як тугма фиристода мешавад, дар аргумент муайян карда мешавад callback_data, ҳангоми сохтани тугма. Шумо метавонед маълумоти аз тугмаи фиристодашуда бо истифода аз сохтор қабул кунед update$callback_query$data, дар дохили усул answer_cb.

Барои бот вокуниш ба клавиатураи Inline, усули answer_cb аз ҷониби коркардкунандаи махсус коркард карда мешавад: CallbackQueryHandler(answer_cb). Он усули муайяншударо ҳангоми пахш кардани тугмаи Inline иҷро мекунад. Корфармо CallbackQueryHandler ду далел мегирад:

  • callback — Усулеро, ки ба кор бурдан лозим аст
  • pattern — Аз рӯи маълумоте, ки бо истифода аз аргумент ба тугма баста шудааст, филтр кунед callback_data.

Мувофиқи он, бо истифода аз далел pattern Мо метавонем барои пахш кардани ҳар як тугма усули алоҳида нависем:

Рамзи 3: Усулҳои алоҳида барои ҳар як тугмаи 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()

Мисоли рамзи дар боло зикршударо иҷро кунед, пас аз иваз кардани 'BOT TOKEN' -и шумо бо аломати воқеӣ, ки ҳангоми сохтани бот тавассути тавассути он гирифтаед. БотПадар (Ман дар бораи сохтани бот дар мақолаи аввал).

Ҳоло мо 2 усули алоҳида навиштаем, яъне. як усул, барои ҳар як тугма пахш кунед, ва далели истифода бурда мешавад pattern, ҳангоми сохтани коркардкунандагони худ:

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

Рамзи усул ба охир мерасад answer_cb даста bot$answerCallbackQuery(callback_query_id = update$callback_query$id), ки ба бот мегӯяд, ки маълумот аз клавиатураи дохилӣ гирифта шудааст.

Намунаи бот, ки дар бораи обу ҳавои ҷории як шаҳри интихобшуда гузориш медиҳад

Биёед кӯшиш кунем, ки ботеро нависем, ки маълумоти обу ҳаворо дархост мекунад.

Мантиқи кори он чунин хоҳад буд. Дар аввал аз ҷониби даста /start шумо ба клавиатураи асосӣ занг мезанед, ки танҳо як тугмаи "Оба" дорад. Бо пахш кардани ин тугма шумо бо клавиатураи Inline паёме мегиред, то шаҳреро интихоб кунед, ки дар он обу ҳавои кунуниро фаҳмидан мехоҳед. Яке аз шаҳрҳоро интихоб кунед ва обу ҳавои кунуниро гиред.

Дар ин мисоли код мо якчанд бастаҳои иловагиро истифода хоҳем кард:

  • httr — бастаи кор бо дархостҳои HTTP, ки дар асоси он кор бо ҳама гуна API сохта шудааст. Дар ҳолати мо мо API-и ройгонро истифода хоҳем бурд openweathermap.org.
  • stringr — маҷмӯа барои кор бо матн, дар ҳолати мо мо онро барои тавлиди паём дар бораи обу ҳаво дар шаҳри интихобшуда истифода мебарем.

Рамзи 4: Бот, ки обу ҳавои ҷории шаҳри интихобшударо гузориш медиҳад

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

Мисоли рамзи дар боло зикршударо иҷро кунед, пас аз иваз кардани 'BOT TOKEN' -и шумо бо аломати воқеӣ, ки ҳангоми сохтани бот тавассути тавассути он гирифтаед. БотПадар (Ман дар бораи сохтани бот дар мақолаи аввал).

Дар натиҷа, боти мо чунин кор хоҳад кард:
Навиштани боти телеграмма дар R (қисми 3): Чӣ тавр ба бот дастгирии клавиатураро илова кардан мумкин аст

Схематикӣ, ин ботро метавон чунин тасвир кард:
Навиштани боти телеграмма дар R (қисми 3): Чӣ тавр ба бот дастгирии клавиатураро илова кардан мумкин аст

Мо дар дохили боти обу ҳавои мо 3 усулро офаридаем:

  • Таърихи оѓоз — Клавиатураи асосии ботро оғоз кунед
  • обу ҳаво — Барои интихоби шаҳр клавиатураи Inline -ро оғоз кунед
  • answer_cb — Усули асосие, ки обу ҳаворо аз API барои як шаҳр дархост мекунад ва онро ба чат мефиристад.

метод Таърихи оѓоз мо онро бо фармон ба кор меандозем /start, ки аз ҷониби коркардкунанда амалӣ карда мешавад CommandHandler('start', start).

Барои иҷро кардани усул обу ҳаво мо филтри бо ҳамон ном сохтаем:

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

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

}
)

Ва мо ин усулро бо коркардкунандаи паёмҳои зерин даъват мекунем: MessageHandler(weather, filters = MessageFilters$weather).

Ва дар охир, усули асосии мо answer_cb ба пахш кардани тугмаҳои Inline, ки аз ҷониби коркарди махсус амалӣ карда мешавад, вокуниш нишон медиҳад: CallbackQueryHandler(answer_cb).

Дар дохили як усул answer_cb, мо маълумоти аз клавиатура фиристодашударо мехонем ва онро ба тағирёбанда менависем city: city <- update$callback_query$data. Сипас мо аз API маълумотҳои обу ҳаво талаб мекунем, паём тавлид ва ирсол мекунем ва дар ниҳоят ин усулро истифода мебарем answerCallbackQuery то ба бот хабар диҳем, ки мо клики тугмаи Inline-ро коркард кардем.

Намунаи бот, ки рӯйхати мақолаҳои охиринро бо истинод ба Hub муайяншуда нишон медиҳад will.com.

Ман ин ботро пешниҳод мекунам, то ба шумо нишон диҳад, ки чӣ гуна тугмаҳои Inline-ро, ки ба веб саҳифаҳо оварда мерасонанд, нишон диҳед.

Мантиқи ин бот ба боти қаблӣ монанд аст, дар аввал мо клавиатураи асосиро бо фармон ба кор меандозем /start. Баъдан, бот ба мо рӯйхати 6 марказро барои интихоб медиҳад, мо марказеро, ки ба мо таваҷҷӯҳ дорем, интихоб мекунем ва аз Hub интихобшуда 5 нашри охиринро мегирем.

Тавре ки шумо мефаҳмед, дар ин ҳолат мо бояд рӯйхати мақолаҳоро гирем ва барои ин мо бастаи махсусро истифода мебарем habR, ки ба шумо имкон медиҳад, ки мақолаҳоро аз Ҳабра дархост кунед ва баъзе омор дар бораи онҳо дар R.

Бастаро насб кунед habR танҳо аз github имконпазир аст, ки барои он ба шумо бастаи иловагӣ лозим мешавад devtools. Барои насб кардан, рамзи зерро истифода баред.

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

Акнун биёед ба коди сохтани боти дар боло тавсифшуда назар андозем:

Рамзи 5: Бот, ки рӯйхати мақолаҳои охиринро дар 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()

Мисоли рамзи дар боло зикршударо иҷро кунед, пас аз иваз кардани 'BOT TOKEN' -и шумо бо аломати воқеӣ, ки ҳангоми сохтани бот тавассути тавассути он гирифтаед. БотПадар (Ман дар бораи сохтани бот дар мақолаи аввал).

Дар натиҷа, мо чунин натиҷа мегирем:
Навиштани боти телеграмма дар R (қисми 3): Чӣ тавр ба бот дастгирии клавиатураро илова кардан мумкин аст

Мо рӯйхати марказҳои барои интихоб дар усул дастрасро сахт рамзгузорӣ кардем 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)
}

Мо рӯйхати мақолаҳоро аз Hub муайяншуда бо фармон мегирем habr_hub_posts(), аз баста habR. Дар баробари ин, мо қайд мекунем, ки ба мо на рӯйхати мақолаҳо барои тамоми вақт, балки танҳо саҳифаи аввал, ки дар он 20 мақола ҷойгир аст, лозим аст. Аз ҷадвали натиҷавӣ бо истифода аз фармон head() Мо танҳо 5-и беҳтаринро мегузорем, ки мақолаҳои охирин мебошанд.

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

Мантиқ ба боти қаблӣ хеле монанд аст, аммо дар ин ҳолат мо клавиатураи Inline-ро бо рӯйхати мақолаҳо ба таври динамикӣ бо истифода аз функсия тавлид мекунем lapply().

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

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

Мо ба матни тугма сарлавҳаи мақоларо дохил мекунем posts$title[x], ва дар баҳс url пайванд ба мақола: url = posts$link[x].

Минбаъд, мо филтр, коркардкунандагонро эҷод мекунем ва боти худро оғоз мекунем.

хулоса

Акнун ботҳое, ки шумо менависед, барои истифода хеле қулайтар хоҳанд буд, зеро онҳо на бо ворид кардани фармонҳо, балки аз клавиатура идора карда мешаванд. Ҳадди ақал, ҳангоми муошират бо бот тавассути смартфон, клавиатура раванди истифодаи онро ба таври назаррас содда мекунад.

Дар мақолаи навбатӣ мо мефаҳмем, ки чӣ тавр бо бот муколамаи мантиқӣ бунёд кардан ва бо пойгоҳи додаҳо кор кардан мумкин аст.

Манбаъ: will.com

Илова Эзоҳ