R හි ටෙලිග්‍රාම් බොට් එකක් ලිවීම (3 කොටස): බොට් එකකට යතුරුපුවරු සහාය එක් කරන්නේ කෙසේද

මෙය "R හි ටෙලිග්‍රාම් බොට් ලිවීම" ලිපි මාලාවේ තුන්වන ලිපියයි. පෙර ප්‍රකාශනවලදී, අපි ටෙලිග්‍රාම් බොට් එකක් නිර්මාණය කරන ආකාරය, එය හරහා පණිවිඩ යැවීම, බොට් වෙත විධාන සහ පණිවිඩ පෙරහන් එකතු කරන ආකාරය ඉගෙන ගත්තෙමු. එමනිසා, ඔබ මෙම ලිපිය කියවීමට පෙර, ඔබ කියවන ලෙස මම තරයේ නිර්දේශ කරමි කලින්, නිසා මෙහිදී මම තවදුරටත් බොට් ගොඩනැගීමේ කලින් විස්තර කළ මූලික කරුණු මත රැඳී නොසිටිමි.

මෙම ලිපියෙන්, අපි යතුරු පුවරුවක් එක් කිරීමෙන් අපගේ බොට් භාවිතය වැඩි දියුණු කරන්නෙමු, එමඟින් බොට් අතුරු මුහුණත අවබෝධාත්මක සහ භාවිතයට පහසු වේ.

R හි ටෙලිග්‍රාම් බොට් එකක් ලිවීම (3 කොටස): බොට් එකකට යතුරුපුවරු සහාය එක් කරන්නේ කෙසේද

"R හි විදුලි පණිවුඩ බොට් ලිවීම" මාලාවේ සියලුම ලිපි

  1. අපි බොට් එකක් සාදා එය ටෙලිග්‍රාම් වලින් පණිවිඩ යැවීමට භාවිතා කරමු
  2. විධාන සහාය සහ පණිවිඩ පෙරහන් බොට් වෙත එක් කරන්න
  3. බොට් එකකට යතුරුපුවරු සහාය එකතු කරන්නේ කෙසේද

අන්තර්ගතය

ඔබ දත්ත විශ්ලේෂණයට කැමති නම්, ඔබ මගේ ගැන උනන්දු විය හැකිය ටෙලිග්රාෆ් и ප්රථම අදියර නාලිකා. බොහෝ අන්තර්ගතයන් R භාෂාව සඳහා කැප කර ඇත.

  1. ටෙලිග්‍රාම් බොට් සහාය දක්වන්නේ කුමන ආකාරයේ යතුරුපුවරු සඳහාද?
  2. පිළිතුරු යතුරු පුවරුව
  3. පේළිගත යතුරු පුවරුව
    3.1. InLine බොත්තම් සඳහා සහය ඇති සරල බොට් එකක උදාහරණයක්
    3.2. තෝරාගත් නගරයක් සඳහා වත්මන් කාලගුණය වාර්තා කරන බොට් එකක උදාහරණයක්
    3.3. habr.com වෙතින් නිශ්චිත Hub වෙත සබැඳි සහිත නවතම ලිපි ලැයිස්තුවක් පෙන්වන බොට් එකක උදාහරණයක්
  4. නිගමනය

ටෙලිග්‍රාම් බොට් සහාය දක්වන්නේ කුමන ආකාරයේ යතුරුපුවරු සඳහාද?

මේ ලියන මොහොතේ telegram.bot යතුරුපුවරු වර්ග දෙකක් නිර්මාණය කිරීමට ඔබට ඉඩ සලසයි:

  • පිළිතුර - පණිවිඩ පෙළ ආදාන පැනලය යටතේ පිහිටා ඇති ප්‍රධාන, සාමාන්‍ය යතුරු පුවරුව. එවැනි යතුරුපුවරුවක් බොට් වෙත කෙටි පණිවිඩයක් යවන අතර, පෙළ ලෙස එය බොත්තම මත ලියා ඇති පෙළ යවනු ඇත.
  • Inline - විශේෂිත bot පණිවිඩයක් සමඟ සම්බන්ධිත යතුරු පුවරුව. මෙම යතුරුපුවරුව එබූ බොත්තම හා සම්බන්ධ බොට් දත්ත යවයි; මෙම දත්ත බොත්තම මත ලියා ඇති පෙළට වඩා වෙනස් විය හැක. තවද එවැනි බොත්තම් සකසනු ලැබේ 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ක් ඇති සරල බොට් එකක් ලියමු:

  • කතාබස් හැඳුනුම්පත - බොට් සමඟ සංවාදයේ කතාබස් හැඳුනුම්පත ඉල්ලන්න
  • මගේ නම - ඔබේ නම ඉල්ලන්න
  • මගේ පිවිසුම - විදුලි පණිවුඩයේ ඔබගේ පරිශීලක නාමය ඉල්ලන්න

කේතය 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 හට විධානයක් ලබා දෙන්න /start, නිසා යතුරුපුවරුව දියත් කිරීමට අපි හරියටම නිර්වචනය කළේ මෙයයි.

R හි ටෙලිග්‍රාම් බොට් එකක් ලිවීම (3 කොටස): බොට් එකකට යතුරුපුවරු සහාය එක් කරන්නේ කෙසේද

ක්‍රම, පෙරහන් සහ හසුරුවන්න නිර්මාණය කිරීමත් සමඟ දී ඇති කේත උදාහරණය විග්‍රහ කිරීම මේ මොහොතේ ඔබට අපහසු නම්, ඔබ පෙර එකට ආපසු යා යුතුය. ලිපියයි, මම මේ සියල්ල විස්තරාත්මකව විස්තර කළෙමි.

අපි ක්රම 4 ක් නිර්මාණය කළා:

  • ආරම්භය - යතුරුපුවරුව දියත් කරන්න
  • chat_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)

ක්‍රමය ඇතුලේ තමයි keyboard එක නිර්මාණය වෙන්නේ 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 බොත්තම ක්ලික් කිරීමකට ප්‍රතිචාර දැක්වීමට, ඔබට bot ක්‍රමයද භාවිතා කළ හැක answerCallbackQuery(), ඉන්ලයින් බොත්තම එබූ පරිශීලකයාට විදුලි පණිවුඩ අතුරුමුහුණතෙහි දැනුම්දීමක් පෙන්විය හැක.

Inline බොත්තමෙන් එවන ලද දත්ත පෙළ නොවේ, එබැවින් එය සැකසීමට ඔබට විධානය භාවිතා කරමින් විශේෂ හසුරුවන්නක් සෑදිය යුතුය CallbackQueryHandler().

පැකේජයේ නිල උපකාරයෙන් ලබා දී ඇති ඉන්ලයින් යතුරු පුවරුවක් තැනීම සඳහා කේතය 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() ඉන්ලයින් බොත්තම් ලැයිස්තුවක් සම්මත කිරීම අවශ්ය වේ, එක් එක් බොත්තම් ශ්රිතය මගින් නිර්මාණය කර ඇත InlineKeyboardButton().

Inline බොත්තමකට තර්කයක් භාවිතයෙන් යම් දත්තයක් bot වෙත ලබා දිය හැක callback_data, හෝ තර්කය භාවිතයෙන් නිශ්චිතව දක්වා ඇති ඕනෑම HTML පිටුවක් විවෘත කරන්න url.

ප්‍රතිඵලය වනුයේ එක් එක් මූලද්‍රව්‍ය එක් පේළියකට ඒකාබද්ධ කළ යුතු පේළිගත බොත්තම් ලැයිස්තුවක් වන ලැයිස්තුවකි.

මීලඟට අපි Inline බොත්තම් සහිත bots සඳහා උදාහරණ කිහිපයක් බලමු.

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

හරහා බොට් එක සෑදීමේදී ඔබට ලැබුණු සැබෑ ටෝකනය සමඟ 'ඔබේ බොට් ටෝකනය' ප්‍රතිස්ථාපනය කිරීමෙන් පසු ඉහත කේත උදාහරණය ක්‍රියාත්මක කරන්න. බොට්ෆදර් (මම බොට් එකක් නිර්මාණය කිරීම ගැන කතා කළා පළමු ලිපිය).

ප්රතිඵලය:
R හි ටෙලිග්‍රාම් බොට් එකක් ලිවීම (3 කොටස): බොට් එකකට යතුරුපුවරු සහාය එක් කරන්නේ කෙසේද

අපි ක්රම දෙකක් නිර්මාණය කළා:

  • ටෙස්ට් — චැට් වෙත යැවීමට Inline යතුරු පුවරුව
  • answer_cb - යතුරුපුවරුවෙන් යවන ලද දත්ත සැකසීමට.

එක් එක් බොත්තමෙන් එවන දත්ත තර්කයේ දක්වා ඇත callback_data, බොත්තමක් සාදන විට. Construct එක භාවිතා කර බොත්තමෙන් යවන ලද දත්ත ඔබට ලබාගත හැක update$callback_query$data, ක්රමය ඇතුළත answer_cb.

බොට් ඉන්ලයින් යතුරුපුවරුවට ප්‍රතික්‍රියා කිරීමට, ක්‍රමය answer_cb විශේෂ හසුරුවන්නෙකු විසින් සකසන ලද: CallbackQueryHandler(answer_cb). ඉන්ලයින් බොත්තම ක්ලික් කළ විට නිශ්චිත ක්‍රමය ක්‍රියාත්මක කරයි. හසුරුවන්නා CallbackQueryHandler තර්ක දෙකක් ගනී:

  • callback - ධාවනය කළ යුතු ක්රමය
  • pattern — තර්කයක් භාවිතයෙන් බොත්තමට බැඳී ඇති දත්ත අනුව පෙරහන් කරන්න callback_data.

ඒ අනුව, තර්කය භාවිතා කිරීම pattern мы можем под нажатие каждой кнопки написать отдельный метод:

කේතය 3: එක් එක් පේළිගත බොත්තම සඳහා වෙනම ක්රම

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

හරහා බොට් එක සෑදීමේදී ඔබට ලැබුණු සැබෑ ටෝකනය සමඟ 'ඔබේ බොට් ටෝකනය' ප්‍රතිස්ථාපනය කිරීමෙන් පසු ඉහත කේත උදාහරණය ක්‍රියාත්මක කරන්න. බොට්ෆදර් (මම බොට් එකක් නිර්මාණය කිරීම ගැන කතා කළා පළමු ලිපිය).

දැන් අපි වෙනම ක්රම 2 ක් ලියා ඇත i.e. එක් ක්‍රමයක්, එක් එක් බොත්තම එබීම සඳහා, සහ තර්කය භාවිතා කළේය 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 - ඕනෑම API සමඟ වැඩ කරන පදනම මත HTTP ඉල්ලීම් සමඟ වැඩ කිරීම සඳහා පැකේජයක්. අපගේ නඩුවේදී අපි නොමිලේ 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()

හරහා බොට් එක සෑදීමේදී ඔබට ලැබුණු සැබෑ ටෝකනය සමඟ 'ඔබේ බොට් ටෝකනය' ප්‍රතිස්ථාපනය කිරීමෙන් පසු ඉහත කේත උදාහරණය ක්‍රියාත්මක කරන්න. බොට්ෆදර් (මම බොට් එකක් නිර්මාණය කිරීම ගැන කතා කළා පළමු ලිපිය).

එහි ප්‍රතිඵලයක් ලෙස අපගේ බොට් එක මෙවැනි දෙයක් ක්‍රියා කරයි.
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 බොත්තම ක්ලික් කිරීම සැකසූ බව bot වෙත දැනුම් දීම සඳහා.

නිශ්චිත හබ් වෙත සබැඳි සහිත නවතම ලිපි ලැයිස්තුවක් පෙන්වන බොට් එකක උදාහරණයක් www.habr.com.

Данного бота я привожу для того, что бы показать вам, как вывести Inline кнопки которые ведут на веб страницы.

මෙම bot හි තර්කනය පෙර එකට සමාන වේ; මුලදී අපි විධානය සමඟ ප්රධාන යතුරු පුවරුව දියත් කරමු /start. මීළඟට, බොට් අපට තෝරා ගැනීමට මධ්‍යස්ථාන 6 ක ලැයිස්තුවක් ලබා දෙයි, අපි උනන්දුවක් දක්වන මධ්‍යස්ථානය තෝරා ගනිමු, සහ තෝරාගත් මධ්‍යස්ථානයෙන් නවතම ප්‍රකාශන 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()

හරහා බොට් එක සෑදීමේදී ඔබට ලැබුණු සැබෑ ටෝකනය සමඟ 'ඔබේ බොට් ටෝකනය' ප්‍රතිස්ථාපනය කිරීමෙන් පසු ඉහත කේත උදාහරණය ක්‍රියාත්මක කරන්න. බොට්ෆදර් (මම බොට් එකක් නිර්මාණය කිරීම ගැන කතා කළා පළමු ලිපිය).

ප්රතිඵලයක් වශයෙන්, අපට මෙම ප්රතිඵලය ලැබෙනු ඇත:
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)

තර්කනය පෙර බොට් එකට බෙහෙවින් සමාන ය, නමුත් මෙම අවස්ථාවෙහිදී අපි ශ්‍රිතය භාවිතා කරමින් ගතිකව ලිපි ලැයිස්තුවක් සහිත ඉන්ලයින් යතුරු පුවරුවක් ජනනය කරමු. 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].

ඊළඟට, අපි පෙරහනක්, හසුරුවන්නක් සාදා අපගේ බොට් දියත් කරමු.

නිගමනය

දැන් ඔබ ලියන බොට්ස් භාවිතා කිරීමට වඩාත් පහසු වනු ඇත, ඒවා විධාන ඇතුළත් කිරීමෙන් නොව යතුරුපුවරුවෙන් පාලනය වනු ඇත. අවම වශයෙන්, ස්මාර්ට් ජංගම දුරකතනයක් හරහා බොට් සමඟ අන්තර් ක්රියා කරන විට, යතුරු පුවරුව එය භාවිතා කිරීමේ ක්රියාවලිය සැලකිය යුතු ලෙස සරල කරනු ඇත.

ඊළඟ ලිපියෙන් අපි බොට් එකක් සමඟ තාර්කික සංවාදයක් ගොඩනඟා දත්ත සමුදායන් සමඟ වැඩ කරන්නේ කෙසේදැයි සොයා බලමු.

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න