Հեռագրային բոտ գրել R-ով (մաս 3). Ինչպես ավելացնել ստեղնաշարի աջակցություն բոտին

Սա «R-ով հեռագրային բոտ գրելը» շարքի երրորդ հոդվածն է։ Նախորդ հրապարակումներում մենք սովորեցինք, թե ինչպես ստեղծել telegram bot, ուղարկել հաղորդագրություններ դրա միջոցով, ավելացնել հրամաններ և հաղորդագրությունների զտիչներ բոտին: Հետևաբար, նախքան այս հոդվածը կարդալը, ես խորհուրդ եմ տալիս կարդալ նախորդ, որովհետեւ Այստեղ ես այլևս չեմ կանգնի բոտերի կառուցման նախկինում նկարագրված հիմունքների վրա:

Այս հոդվածում մենք կբարելավենք մեր բոտի օգտագործելիությունը՝ ավելացնելով ստեղնաշար, որը կդարձնի բոտի ինտերֆեյսը ինտուիտիվ և հեշտ օգտագործման համար:

Հեռագրային բոտ գրել R-ով (մաս 3). Ինչպես ավելացնել ստեղնաշարի աջակցություն բոտին

Բոլոր հոդվածները «Telegram bot գրել R-ում» շարքից

  1. Մենք ստեղծում ենք բոտ և օգտագործում այն ​​հեռագրում հաղորդագրություններ ուղարկելու համար
  2. Բոտին ավելացրեք հրամանների աջակցություն և հաղորդագրությունների զտիչներ
  3. Ինչպես ավելացնել ստեղնաշարի աջակցություն բոտին

Պարունակություն

Եթե ​​դուք հետաքրքրված եք տվյալների վերլուծությամբ, ապա ձեզ կարող է հետաքրքրել իմը հեռագիր и youtube ալիքներ. Բովանդակության մեծ մասը նվիրված է R լեզվին։

  1. Ի՞նչ տեսակի ստեղնաշարեր է աջակցում Telegram-ի բոտը:
  2. Պատասխանել ստեղնաշար
  3. Ներքին ստեղնաշար
    3.1: Պարզ բոտի օրինակ՝ InLine կոճակների աջակցությամբ
    3.2: Բոտի օրինակ, որը հաղորդում է ընտրված քաղաքի ընթացիկ եղանակը
    3.3: Բոտի օրինակ, որը ցուցադրում է ամենավերջին հոդվածների ցանկը՝ habr.com-ից նշված Hub-ի հղումներով:
  4. Ամփոփում

Ի՞նչ տեսակի ստեղնաշարեր է աջակցում Telegram-ի բոտը:

Այս գրելու պահին telegram.bot թույլ է տալիս ստեղծել երկու տեսակի ստեղնաշար.

  • Պատասխան - Հիմնական, սովորական ստեղնաշար, որը գտնվում է հաղորդագրության տեքստի մուտքագրման վահանակի տակ: Նման ստեղնաշարը պարզապես տեքստային հաղորդագրություն է ուղարկում բոտին, և որպես տեքստ այն կուղարկի տեքստը, որը գրված է հենց կոճակի վրա։
  • Inline - ստեղնաշար, որը կապված է կոնկրետ բոտի հաղորդագրության հետ: Այս ստեղնաշարն ուղարկում է սեղմված կոճակի հետ կապված բոտի տվյալները։ Այս տվյալները կարող են տարբերվել հենց կոճակի վրա գրված տեքստից։ Եվ նման կոճակները մշակվում են միջոցով CallbackQueryHandler.

Որպեսզի բոտը բացի ստեղնաշարը, անհրաժեշտ է մեթոդով հաղորդագրություն ուղարկելիս sendMessage(), որպես արգումենտ փոխանցեք նախկինում ստեղծված ստեղնաշարը reply_markup.

Ստորև մենք կանդրադառնանք մի քանի օրինակների:

Պատասխանել ստեղնաշար

Ինչպես վերևում գրեցի, սա բոտերի կառավարման հիմնական ստեղնաշարն է:

Պաշտոնական օգնությունից Reply ստեղնաշար ստեղծելու օրինակ

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 - Հայցեք բոտի հետ երկխոսության chat ID
  • Իմ անունը - Խնդրիր քո անունը
  • Իմ մուտքը - Խնդրեք ձեր օգտվողի անունը Telegram-ում

Կոդ 1. Պարզ բոտ՝ Reply ստեղնաշարով

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

Գործարկեք վերը նշված կոդի օրինակը՝ «ՁԵՐ ԲՈՏ ՏՈԿԵՆ»-ը փոխարինելուց հետո բոտը ստեղծելիս ստացած իրական նշանով: BotFather (Ես խոսեցի բոտ ստեղծելու մասին առաջին հոդվածը).

Գործարկումից հետո բոտին հրաման տվեք /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.

Ներքին ստեղնաշարի ստեղծման կոդը պաշտոնական օգնությունից

# 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(), նույն սկզբունքով, ինչ Reply ստեղնաշարը։ IN InlineKeyboardMarkup() անհրաժեշտ է փոխանցել Inline կոճակների ցուցակները, յուրաքանչյուր առանձին կոճակ ստեղծվում է ֆունկցիայի կողմից InlineKeyboardButton().

Ներկառուցված կոճակը կամ կարող է որոշ տվյալներ փոխանցել բոտին՝ օգտագործելով արգումենտ callback_data, կամ բացեք ցանկացած HTML էջ, որը նշված է փաստարկի միջոցով url.

Արդյունքը կլինի ցուցակ, որտեղ յուրաքանչյուր տարր նաև Inline կոճակների ցանկ է, որոնք պետք է միավորվեն մեկ տողի մեջ:

Հաջորդիվ մենք կանդրադառնանք Inline կոճակներով բոտերի մի քանի օրինակների:

Պարզ բոտի օրինակ՝ InLine կոճակների աջակցությամբ

Նախ՝ մենք կգրենք բոտ՝ COVID-19-ի էքսպրես թեստավորման համար։ Հրամանով /test, այն ձեզ կուղարկի երկու կոճակով ստեղնաշար, կախված սեղմված կոճակից այն ձեզ հաղորդագրություն կուղարկի ձեր թեստավորման արդյունքներով:

Կոդ 2. Ներքին ստեղնաշարով ամենապարզ բոտը

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

Գործարկեք վերը նշված կոդի օրինակը՝ «ՁԵՐ ԲՈՏ ՏՈԿԵՆ»-ը փոխարինելուց հետո բոտը ստեղծելիս ստացած իրական նշանով: BotFather (Ես խոսեցի բոտ ստեղծելու մասին առաջին հոդվածը).

Արդյունքը:
Հեռագրային բոտ գրել R-ով (մաս 3). Ինչպես ավելացնել ստեղնաշարի աջակցություն բոտին

Մենք ստեղծել ենք երկու մեթոդ.

  • փորձարկում — Զրուցարան ուղարկելու համար Ներկառուցված ստեղնաշար
  • պատասխան_կբ — Ստեղնաշարից ուղարկված տվյալները մշակելու համար:

Տվյալները, որոնք կուղարկվեն յուրաքանչյուր կոճակից, նշված են արգումենտում callback_data, կոճակ ստեղծելիս: Կոճակից ուղարկված տվյալները կարող եք ստանալ՝ օգտագործելով կոնստրուկցիան update$callback_query$data, մեթոդի ներսում պատասխան_կբ.

Որպեսզի բոտը արձագանքի Inline ստեղնաշարին, մեթոդ պատասխան_կբ մշակված հատուկ մշակողի կողմից. 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()

Գործարկեք վերը նշված կոդի օրինակը՝ «ՁԵՐ ԲՈՏ ՏՈԿԵՆ»-ը փոխարինելուց հետո բոտը ստեղծելիս ստացած իրական նշանով: BotFather (Ես խոսեցի բոտ ստեղծելու մասին առաջին հոդվածը).

Այժմ մենք գրել ենք 2 առանձին մեթոդ, այսինքն. մեկ մեթոդ, յուրաքանչյուր կոճակի համար սեղմել և օգտագործել փաստարկը pattern, դրանց մշակիչները ստեղծելիս.

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

Մեթոդի կոդը ավարտվում է պատասխան_կբ թիմը 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()

Գործարկեք վերը նշված կոդի օրինակը՝ «ՁԵՐ ԲՈՏ ՏՈԿԵՆ»-ը փոխարինելուց հետո բոտը ստեղծելիս ստացած իրական նշանով: BotFather (Ես խոսեցի բոտ ստեղծելու մասին առաջին հոդվածը).

Արդյունքում մեր բոտը կաշխատի այսպես.
Հեռագրային բոտ գրել R-ով (մաս 3). Ինչպես ավելացնել ստեղնաշարի աջակցություն բոտին

Սխեմատիկորեն այս բոտը կարելի է պատկերել այսպես.
Հեռագրային բոտ գրել R-ով (մաս 3). Ինչպես ավելացնել ստեղնաշարի աջակցություն բոտին

Մենք ստեղծել ենք 3 եղանակ, որոնք հասանելի են մեր եղանակային բոտում.

  • Սկիզբ - Գործարկել հիմնական բոտի ստեղնաշարը
  • եղանակ — Գործարկեք Inline ստեղնաշարը՝ քաղաք ընտրելու համար
  • պատասխան_կբ — Հիմնական մեթոդը, որը API-ից խնդրում է եղանակը տվյալ քաղաքի համար և ուղարկում այն ​​չաթին:

մեթոդ Սկիզբ մենք այն գործարկում ենք հրամանով /start, որն իրականացվում է մշակողի կողմից CommandHandler('start', start).

Մեթոդ գործարկելու համար եղանակ մենք ստեղծեցինք համանուն ֆիլտր.

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

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

}
)

Եվ այս մեթոդը մենք անվանում ենք հետևյալ հաղորդագրությունների մշակմամբ. MessageHandler(weather, filters = MessageFilters$weather).

Եվ վերջում մեր հիմնական մեթոդը պատասխան_կբ արձագանքում է Inline կոճակները սեղմելուն, որն իրականացվում է հատուկ մշակողի կողմից. CallbackQueryHandler(answer_cb).

Մեթոդի ներսում պատասխան_կբ, կարդում ենք ստեղնաշարից ուղարկված տվյալները և գրում փոփոխականի վրա city: city <- update$callback_query$data. Այնուհետև API-ից խնդրում ենք եղանակի տվյալներ, ստեղծում և ուղարկում հաղորդագրություն և վերջապես օգտագործում ենք մեթոդը answerCallbackQuery որպեսզի տեղեկացնենք բոտին, որ մենք մշակել ենք Inline կոճակի սեղմումը:

Բոտի օրինակ, որը ցուցադրում է վերջին հոդվածների ցանկը՝ նշված Հաբ-ից հղումներով www.habr.com.

Ես ներկայացնում եմ այս բոտը՝ ցույց տալու համար, թե ինչպես ցուցադրել վեբ էջեր տանող Inline կոճակները:

Այս բոտի տրամաբանությունը նման է նախորդին, սկզբում մենք գործարկում ենք հիմնական ստեղնաշարը հրամանով /start. Այնուհետև, բոտը մեզ տալիս է ընտրելու համար նախատեսված 6 հանգույցների ցուցակ, մենք ընտրում ենք մեզ հետաքրքրող հանգույցը և ստանում ընտրված Հաբից ամենավերջին 5 հրապարակումները:

Ինչպես հասկանում եք, այս դեպքում մենք պետք է ստանանք հոդվածների ցանկ, և դրա համար մենք կօգտագործենք հատուկ փաթեթ habR, որը թույլ է տալիս պահանջել հոդվածներ Habra-ից և դրանց վերաբերյալ որոշ վիճակագրություն Ռ.

Տեղադրեք փաթեթը habR հնարավոր է միայն github-ից, որի համար անհրաժեշտ կլինի լրացուցիչ փաթեթ devtools. Տեղադրելու համար օգտագործեք ստորև նշված կոդը:

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

Այժմ եկեք նայենք վերը նկարագրված բոտի ստեղծման կոդը.

Կոդ 5. բոտ, որը ցուցադրում է ամենավերջին հոդվածների ցանկը ընտրված հանգույցում

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

Գործարկեք վերը նշված կոդի օրինակը՝ «ՁԵՐ ԲՈՏ ՏՈԿԵՆ»-ը փոխարինելուց հետո բոտը ստեղծելիս ստացած իրական նշանով: BotFather (Ես խոսեցի բոտ ստեղծելու մասին առաջին հոդվածը).

Արդյունքում մենք կստանանք հետևյալ արդյունքը.
Հեռագրային բոտ գրել 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].

Հաջորդը, մենք ստեղծում ենք զտիչ, մշակիչներ և գործարկում մեր բոտը:

Ամփոփում

Այժմ ձեր գրած բոտերը շատ ավելի հարմար կլինեն օգտագործելու համար, քանի որ դրանք կկառավարվեն ստեղնաշարից, այլ ոչ թե հրամաններ մուտքագրելով։ Նվազագույնը սմարթֆոնի միջոցով բոտի հետ շփվելիս ստեղնաշարը զգալիորեն կհեշտացնի դրա օգտագործման գործընթացը։

Հաջորդ հոդվածում մենք կպարզենք, թե ինչպես կարելի է տրամաբանական երկխոսություն կառուցել բոտի հետ և աշխատել տվյալների բազաների հետ:

Source: www.habr.com

Добавить комментарий