آر ۾ ٽيليگرام بوٽ لکڻ (حصو 3): بوٽ ۾ ڪيبورڊ سپورٽ ڪيئن شامل ڪجي

هي ٽيون مضمون آهي سيريز ۾ ”رائٽنگ هڪ ٽيليگرام بوٽ ان آر“. پوئين اشاعتن ۾، اسان سکيا ته ٽيليگرام بوٽ ڪيئن ٺاهيو، ان ذريعي پيغام موڪليو، بوٽ ۾ ڪمانڊ ۽ ميسيج فلٽر شامل ڪيا ويا. تنهن ڪري، توهان کان پهريان هن مضمون کي پڙهڻ شروع ڪيو، مان توهان کي سفارش ڪريان ٿو ته توهان پڙهو پويون، ڇاڪاڻ ته هتي آئون هاڻي بوٽ بلڊنگ جي اڳ بيان ڪيل بنيادي ڳالهين تي نه ويندس.

هن آرٽيڪل ۾، اسان ڪيبورڊ شامل ڪندي پنهنجي بوٽ جي استعمال کي بهتر بڻائينداسين، جيڪو بوٽ انٽرفيس کي غير معمولي ۽ استعمال ڪرڻ آسان بڻائي سگهندو.

آر ۾ ٽيليگرام بوٽ لکڻ (حصو 3): بوٽ ۾ ڪيبورڊ سپورٽ ڪيئن شامل ڪجي

سيريز جا سڀئي مضمون ”آر ۾ ٽيليگرام بوٽ لکڻ“

  1. اسان هڪ بوٽ ٺاهيندا آهيون ۽ ان کي ٽيليگرام ۾ پيغام موڪلڻ لاءِ استعمال ڪندا آهيون
  2. بوٽ ۾ ڪمانڊ سپورٽ ۽ پيغام فلٽر شامل ڪريو
  3. بوٽ ۾ ڪيبورڊ سپورٽ ڪيئن شامل ڪجي

Contents

جيڪڏهن توهان ڊيٽا جي تجزيي ۾ دلچسپي رکو ٿا، توهان کي شايد دلچسپي وٺندي منهنجي ٽيليگرام и يوٽيوب چينلز. گهڻو ڪري مواد آر ٻولي لاء وقف آهي.

  1. ٽيليگرام بوٽ ڪهڙي قسم جا ڪي بورڊ سپورٽ ڪندو آهي؟
  2. جواب ڏيو ڪيبورڊ
  3. ان لائن ڪيبورڊ
    3.1. هڪ سادي بوٽ جو مثال ان لائن بٽڻ لاءِ سپورٽ سان
    3.2. ھڪڙو بوٽ جو ھڪڙو مثال جيڪو ھڪڙي چونڊيل شھر لاء موجوده موسم جي رپورٽ ڪري ٿو
    3.3. هڪ بوٽ جو هڪ مثال جيڪو ڏيکاري ٿو تازو آرٽيڪل جي هڪ فهرست ڏيکاري ٿو لنڪ سان مخصوص حب جي لنڪ سان habr.com
  4. ٿڪل

ٽيليگرام بوٽ ڪهڙي قسم جا ڪي بورڊ سپورٽ ڪندو آهي؟

هن لکڻ جي وقت تي telegram.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 بٽڻ هوندا:

  • چيٽ ID - bot سان گفتگو جي چيٽ 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()

مٿي ڏنل ڪوڊ جو مثال هلايو، 'Your BOT TOKEN' کي تبديل ڪرڻ کان پوءِ حقيقي ٽوڪن سان جيڪو توهان حاصل ڪيو هو جڏهن بوٽ ٺاهيندي بوٽو ايفٽر (مان هڪ بوٽ ٺاهڻ بابت ڳالهايو پهريون مضمون).

لانچ ڪرڻ کان پوء، بوٽ کي حڪم ڏيو /start، ڇاڪاڻ ته اھو اھو آھي جيڪو اسان ڪيبورڊ لانچ ڪرڻ جي وضاحت ڪئي آھي.

آر ۾ ٽيليگرام بوٽ لکڻ (حصو 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
)

آر ۾ ٽيليگرام بوٽ لکڻ (حصو 3): بوٽ ۾ ڪيبورڊ سپورٽ ڪيئن شامل ڪجي

ڪيبورڊ طريقو استعمال ڪندي چيٽ ڏانهن موڪليو ويو آهي sendMessage()، دليل ۾ reply_markup.

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

ان لائن ڪيبورڊ

جيئن مون مٿي لکيو آهي، ان لائن ڪيبورڊ هڪ مخصوص پيغام سان ڳنڍيل آهي. مکيه ڪيبورڊ جي ڀيٽ ۾ ڪم ڪرڻ ڪجهه وڌيڪ ڏکيو آهي.

شروعات ۾، توھان کي ان لائن ڪيبورڊ کي ڪال ڪرڻ لاءِ بوٽ ۾ ھڪڙو طريقو شامل ڪرڻو پوندو.

جواب ڏيڻ لاءِ ان لائن بٽڻ تي ڪلڪ ڪريو، توھان پڻ استعمال ڪري سگھو ٿا بوٽ جو طريقو answerCallbackQuery()، جيڪو ان لائن بٽڻ کي دٻائڻ واري صارف کي ٽيليگرام انٽرفيس ۾ نوٽيفڪيشن ڏيکاري سگھي ٿو.

ان لائن بٽڻ مان موڪليل ڊيٽا ٽيڪسٽ نه آهي، تنهنڪري ان کي پروسيس ڪرڻ لاءِ توهان کي ڪمانڊ استعمال ڪندي هڪ خاص هينڊلر ٺاهڻ جي ضرورت آهي CallbackQueryHandler().

ان لائن ڪيبورڊ ٺاهڻ جو ڪوڊ جيڪو پيڪيج جي سرڪاري مدد ۾ ڏنو ويو آهي 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)

توهان کي حڪم استعمال ڪندي هڪ ان لائن ڪيبورڊ ٺاهڻ جي ضرورت آهي InlineKeyboardMarkup(), ساڳئي اصول تي جوابي ڪيبورڊ جي طور تي. IN InlineKeyboardMarkup() ان لائن بٽڻن جي لسٽن جي لسٽ کي پاس ڪرڻ ضروري آھي، ھر ھڪ بٽڻ کي فنڪشن پاران ٺاھيو ويو آھي InlineKeyboardButton().

هڪ ان لائن بٽڻ يا ته ڪجهه ڊيٽا منتقل ڪري سگهي ٿو بوٽ ڏانهن هڪ دليل استعمال ڪندي callback_data, يا کوليو ڪو HTML صفحو بيان ڪيل دليل استعمال ڪندي url.

نتيجو هڪ فهرست هوندو جنهن ۾ هر عنصر پڻ ان لائن بٽڻ جي هڪ فهرست آهي جنهن کي هڪ قطار ۾ گڏ ڪرڻ جي ضرورت آهي.

اڳيون اسان ان لائن بٽڻ سان بوٽن جا ڪيترائي مثال ڏسندا.

هڪ سادي بوٽ جو مثال ان لائن بٽڻ لاءِ سپورٽ سان

پهريون، اسان ڪووڊ -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()

مٿي ڏنل ڪوڊ جو مثال هلايو، 'Your BOT TOKEN' کي تبديل ڪرڻ کان پوءِ حقيقي ٽوڪن سان جيڪو توهان حاصل ڪيو هو جڏهن بوٽ ٺاهيندي بوٽو ايفٽر (مان هڪ بوٽ ٺاهڻ بابت ڳالهايو پهريون مضمون).

نتيجو
آر ۾ ٽيليگرام بوٽ لکڻ (حصو 3): بوٽ ۾ ڪيبورڊ سپورٽ ڪيئن شامل ڪجي

اسان ٻه طريقا ٺاهيا:

  • امتحان - چيٽ ڏانهن موڪلڻ لاءِ ان لائن ڪيبورڊ
  • جواب_سي بي - ڪيبورڊ مان موڪليل ڊيٽا کي پروسيس ڪرڻ لاء.

ڊيٽا جيڪا هر بٽڻ مان موڪلي ويندي دليل ۾ بيان ڪئي وئي آهي callback_data، جڏهن هڪ بٽڻ ٺاهي. توھان حاصل ڪري سگھوٿا ڊيٽا موڪليل بٽڻ مان تعمير استعمال ڪندي update$callback_query$data، طريقي جي اندر جواب_سي بي.

ان لائن ڪيبورڊ تي جواب ڏيڻ لاءِ بوٽ لاءِ، طريقو جواب_سي بي خاص سنڀاليندڙ طرفان پروسيس ٿيل: 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()

مٿي ڏنل ڪوڊ جو مثال هلايو، 'Your BOT TOKEN' کي تبديل ڪرڻ کان پوءِ حقيقي ٽوڪن سان جيڪو توهان حاصل ڪيو هو جڏهن بوٽ ٺاهيندي بوٽو ايفٽر (مان هڪ بوٽ ٺاهڻ بابت ڳالهايو پهريون مضمون).

هاڻي اسان 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)، جيڪو bot کي ٻڌائي ٿو ته ان لائن ڪيبورڊ مان ڊيٽا حاصل ڪئي وئي آهي.

ھڪڙو بوٽ جو ھڪڙو مثال جيڪو ھڪڙي چونڊيل شھر لاء موجوده موسم جي رپورٽ ڪري ٿو

اچو ته هڪ بوٽ لکڻ جي ڪوشش ڪريون جيڪو موسم جي ڊيٽا جي درخواست ڪري ٿو.

ان جي ڪم جي منطق هن ريت هوندي. شروعاتي طور تي ٽيم پاران /start توهان مکيه ڪيبورڊ کي سڏيندا آهيو، جنهن ۾ صرف هڪ "موسم" بٽڻ آهي. هن بٽڻ تي ڪلڪ ڪرڻ سان توهان کي ان لائن ڪيبورڊ سان هڪ پيغام ملي ويندو جنهن شهر کي چونڊيو جنهن لاءِ توهان موجوده موسم معلوم ڪرڻ چاهيو ٿا. شهرن مان هڪ چونڊيو ۽ موجوده موسم حاصل ڪريو.

ھن ڪوڊ جي مثال ۾ اسين ڪيترائي اضافي پيڪيجز استعمال ڪنداسين:

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

مٿي ڏنل ڪوڊ جو مثال هلايو، 'Your BOT TOKEN' کي تبديل ڪرڻ کان پوءِ حقيقي ٽوڪن سان جيڪو توهان حاصل ڪيو هو جڏهن بوٽ ٺاهيندي بوٽو ايفٽر (مان هڪ بوٽ ٺاهڻ بابت ڳالهايو پهريون مضمون).

نتيجي طور، اسان جو بوٽ ڪم ڪندو ڪجھ هن طرح:
آر ۾ ٽيليگرام بوٽ لکڻ (حصو 3): بوٽ ۾ ڪيبورڊ سپورٽ ڪيئن شامل ڪجي

اسڪيم طور، هي بوٽ هن طرح ظاهر ڪري سگهجي ٿو:
آر ۾ ٽيليگرام بوٽ لکڻ (حصو 3): بوٽ ۾ ڪيبورڊ سپورٽ ڪيئن شامل ڪجي

اسان پيدا ڪيو آهي 3 طريقا موجود آهن اسان جي موسم جي بوٽ اندر:

  • شروع - مکيه بوٽ ڪيبورڊ لانچ ڪريو
  • موسم - شهر کي چونڊڻ لاءِ ان لائن ڪيبورڊ لانچ ڪريو
  • جواب_سي بي - مکيه طريقو جيڪو ڏنل شهر لاءِ API کان موسم جي درخواست ڪري ٿو ۽ ان کي چيٽ ڏانهن موڪلي ٿو.

طريقو شروع اسان ان کي حڪم سان شروع ڪيو /start، جيڪو سنڀاليندڙ طرفان لاڳو ڪيو ويندو آهي CommandHandler('start', start).

هڪ طريقو هلائڻ لاء موسم اسان ساڳئي نالي جو فلٽر ٺاهيو:

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

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

}
)

۽ اسان هن طريقي کي هيٺ ڏنل پيغام سنڀاليندڙ سان سڏين ٿا: MessageHandler(weather, filters = MessageFilters$weather).

۽ آخر ۾، اسان جو مکيه طريقو جواب_سي بي ان لائن بٽڻ کي دٻائڻ تي رد عمل، جيڪو خاص هينڊلر طرفان لاڳو ڪيو ويو آهي: CallbackQueryHandler(answer_cb).

هڪ طريقو اندر جواب_سي بي، اسان ڪيبورڊ مان موڪليل ڊيٽا کي پڙهون ٿا ۽ ان کي متغير ڏانهن لکون ٿا city: city <- update$callback_query$data. پوءِ اسان API کان موسم جي ڊيٽا جي درخواست ڪريون ٿا، پيغام ٺاھيو ۽ موڪليو، ۽ آخرڪار طريقو استعمال ڪريو answerCallbackQuery bot کي خبر ڏيڻ لاءِ ته اسان ان لائن بٽڻ جي ڪلڪ تي عمل ڪيو.

هڪ بوٽ جو هڪ مثال جيڪو ڏيکاري ٿو تازو مضمونن جي هڪ فهرست جنهن سان مخصوص حب جي لنڪ سان www.habr.com.

مان هي بوٽ پيش ڪريان ٿو توهان کي ڏيکارڻ لاءِ ته ڪيئن ڏيکاريو ان لائن بٽڻ جيڪي ويب پيج ڏانهن وٺي وڃن ٿا.

هن بوٽ جو منطق پوئين هڪ جهڙو آهي؛ شروعات ۾ اسان ڪمانڊ سان مکيه ڪيبورڊ لانچ ڪندا آهيون /start. اڳيون، بوٽ اسان کي 6 حب جي هڪ فهرست ڏئي ٿو مان چونڊڻ لاءِ، اسان اهو حب چونڊيو جنهن ۾ اسان دلچسپي رکون ٿا، ۽ چونڊيل حب مان 5 تازيون اشاعتون حاصل ڪيون ٿا.

جئين توھان سمجھو ٿا، ھن صورت ۾ اسان کي مضمونن جي ھڪڙي فهرست حاصل ڪرڻ جي ضرورت آھي، ۽ ھن لاء اسين ھڪڙو خاص پيڪيج استعمال ڪنداسين habR، جيڪو توهان کي اجازت ڏئي ٿو حبرا کان آرٽيڪل ۽ ڪجهه انگ اکر انهن تي آر.

پيڪيج انسٽال ڪريو 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()

مٿي ڏنل ڪوڊ جو مثال هلايو، 'Your BOT TOKEN' کي تبديل ڪرڻ کان پوءِ حقيقي ٽوڪن سان جيڪو توهان حاصل ڪيو هو جڏهن بوٽ ٺاهيندي بوٽو ايفٽر (مان هڪ بوٽ ٺاهڻ بابت ڳالهايو پهريون مضمون).

نتيجي طور، اسان هي نتيجو حاصل ڪنداسين:
آر ۾ ٽيليگرام بوٽ لکڻ (حصو 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)
}

اسان کي حڪم سان مخصوص حب مان آرٽيڪل جي هڪ فهرست ملي ٿي 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].

اڳيون، اسان هڪ فلٽر، هينڊلر ٺاهي ۽ اسان جو بوٽ لانچ ڪيو.

ٿڪل

هاڻي اهي بوٽ جيڪي توهان لکندا آهيو استعمال ڪرڻ لاءِ وڌيڪ آسان هوندا، ڇاڪاڻ ته اهي ڪيبورڊ مان ڪنٽرول ڪيا ويندا، بجاءِ ڪمانڊ داخل ڪرڻ سان. گهٽ ۾ گهٽ، جڏهن اسمارٽ فون ذريعي بوٽ سان لهه وچڙ ۾، ڪيبورڊ ان کي استعمال ڪرڻ جي عمل کي خاص طور تي آسان بڻائي ڇڏيندو.

ايندڙ آرٽيڪل ۾ اسان اهو معلوم ڪنداسين ته ڪيئن هڪ bot سان منطقي گفتگو ٺاهي ۽ ڊيٽابيس سان ڪم ڪيو وڃي.

جو ذريعو: www.habr.com

تبصرو شامل ڪريو