R میں ٹیلیگرام بوٹ لکھنا (حصہ 3): بوٹ میں کی بورڈ سپورٹ کیسے شامل کریں۔

"R میں ٹیلیگرام بوٹ لکھنا" سیریز کا یہ تیسرا مضمون ہے۔ پچھلی اشاعتوں میں، ہم نے سیکھا کہ ٹیلیگرام بوٹ کیسے بنایا جاتا ہے، اس کے ذریعے پیغامات کیسے بھیجے جاتے ہیں، بوٹ میں کمانڈز اور میسج فلٹرز شامل کیے جاتے ہیں۔ لہذا، اس سے پہلے کہ آپ اس مضمون کو پڑھنا شروع کریں، میں آپ کو مشورہ دیتا ہوں کہ آپ پڑھیں پچھلےکیونکہ یہاں میں بوٹ بلڈنگ کی پہلے بیان کردہ بنیادی باتوں پر مزید توجہ نہیں دوں گا۔

اس مضمون میں، ہم ایک کی بورڈ شامل کرکے اپنے بوٹ کے استعمال کو بہتر بنائیں گے، جو بوٹ انٹرفیس کو بدیہی اور استعمال میں آسان بنائے گا۔

R میں ٹیلیگرام بوٹ لکھنا (حصہ 3): بوٹ میں کی بورڈ سپورٹ کیسے شامل کریں۔

سیریز کے تمام مضامین "R میں ٹیلیگرام بوٹ لکھنا"

  1. ہم ایک بوٹ بناتے ہیں اور اسے ٹیلیگرام میں پیغامات بھیجنے کے لیے استعمال کرتے ہیں۔
  2. بوٹ میں کمانڈ سپورٹ اور میسج فلٹرز شامل کریں۔
  3. بوٹ میں کی بورڈ سپورٹ کیسے شامل کریں۔

مواد

اگر آپ ڈیٹا کے تجزیے میں دلچسپی رکھتے ہیں، تو آپ کو میری میں دلچسپی ہو سکتی ہے۔ تار и یو ٹیوب پر چینلز زیادہ تر مواد R زبان کے لیے وقف ہے۔

  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 بٹن ہوں گے:

  • چیٹ آئی ڈی - بوٹ کے ساتھ ڈائیلاگ کی چیٹ آئی ڈی کی درخواست کریں۔
  • میرا نام - اپنے نام کی درخواست کریں۔
  • میرا لاگ ان - ٹیلیگرام میں اپنے صارف نام کی درخواست کریں۔

کوڈ 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کیونکہ یہ بالکل وہی ہے جو ہم نے کی بورڈ کو لانچ کرنے کے لیے بیان کیا ہے۔

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)

ان لائن کی بورڈ

جیسا کہ میں نے اوپر لکھا، ان لائن کی بورڈ ایک مخصوص پیغام سے جڑا ہوا ہے۔ مرکزی کی بورڈ کے مقابلے میں اس کے ساتھ کام کرنا کچھ زیادہ مشکل ہے۔

ابتدائی طور پر، آپ کو ان لائن کی بورڈ کو کال کرنے کے لیے بوٹ میں ایک طریقہ شامل کرنے کی ضرورت ہے۔

ان لائن بٹن کلک کا جواب دینے کے لیے، آپ بوٹ کا طریقہ بھی استعمال کر سکتے ہیں۔ 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()جوابی کی بورڈ کے اسی اصول پر۔ میں InlineKeyboardMarkup() ان لائن بٹنوں کی فہرستوں کی ایک فہرست پاس کرنا ضروری ہے، ہر انفرادی بٹن فنکشن کے ذریعے تخلیق کیا جاتا ہے۔ InlineKeyboardButton().

ایک ان لائن بٹن یا تو دلیل کا استعمال کرتے ہوئے بوٹ کو کچھ ڈیٹا منتقل کر سکتا ہے۔ callback_data، یا دلیل کا استعمال کرتے ہوئے مخصوص کردہ HTML صفحہ کھولیں۔ url.

نتیجہ ایک فہرست ہو گا جس میں ہر عنصر ان لائن بٹنوں کی فہرست بھی ہے جنہیں ایک قطار میں جوڑنے کی ضرورت ہے۔

اگلا ہم ان لائن بٹنوں کے ساتھ بوٹس کی کئی مثالیں دیکھیں گے۔

ان لائن بٹنوں کے لیے سپورٹ کے ساتھ ایک سادہ بوٹ کی مثال

سب سے پہلے، ہم 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()

اوپر دیے گئے کوڈ کی مثال چلائیں، 'YOUR BOT TOKEN' کو اس اصلی ٹوکن سے بدلنے کے بعد جو آپ کو بوٹ بناتے وقت موصول ہوا تھا۔ بوٹ فیتر (میں نے ایک بوٹ بنانے کے بارے میں بات کی۔ پہلا مضمون).

نتیجہ:
R میں ٹیلیگرام بوٹ لکھنا (حصہ 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)، جو بوٹ کو بتاتا ہے کہ ان لائن کی بورڈ سے ڈیٹا موصول ہوا ہے۔

بوٹ کی ایک مثال جو کسی منتخب شہر کے موجودہ موسم کی اطلاع دیتی ہے۔

آئیے ایک بوٹ لکھنے کی کوشش کرتے ہیں جو موسم کے ڈیٹا کی درخواست کرتا ہے۔

اس کے کام کی منطق حسب ذیل ہوگی۔ ابتدائی طور پر ٹیم کی طرف سے /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' کو اس اصلی ٹوکن سے بدلنے کے بعد جو آپ کو بوٹ بناتے وقت موصول ہوا تھا۔ بوٹ فیتر (میں نے ایک بوٹ بنانے کے بارے میں بات کی۔ پہلا مضمون).

نتیجے کے طور پر، ہمارا بوٹ کچھ اس طرح کام کرے گا:
R میں ٹیلیگرام بوٹ لکھنا (حصہ 3): بوٹ میں کی بورڈ سپورٹ کیسے شامل کریں۔

اسکیماتی طور پر، اس بوٹ کو اس طرح دکھایا جا سکتا ہے:
R میں ٹیلیگرام بوٹ لکھنا (حصہ 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 بوٹ کو مطلع کرنے کے لیے کہ ہم نے ان لائن بٹن کے کلک پر کارروائی کی۔

بوٹ کی ایک مثال جو تازہ ترین مضامین کی فہرست دکھاتی ہے جس میں مخصوص حب کے لنکس ہیں۔ www.habr.com.

میں یہ بوٹ آپ کو دکھانے کے لیے پیش کرتا ہوں کہ ان لائن بٹن کو کیسے ڈسپلے کیا جائے جو ویب صفحات کی طرف لے جاتے ہیں۔

اس بوٹ کی منطق پچھلے والی کی طرح ہے؛ ابتدائی طور پر ہم کمانڈ کے ساتھ مین کی بورڈ لانچ کرتے ہیں۔ /start. اگلا، بوٹ ہمیں منتخب کرنے کے لیے 6 حبس کی فہرست دیتا ہے، ہم اس مرکز کا انتخاب کرتے ہیں جس میں ہماری دلچسپی ہے، اور منتخب کردہ حب سے 5 تازہ ترین اشاعتیں موصول ہوتی ہیں۔

جیسا کہ آپ سمجھتے ہیں، اس معاملے میں ہمیں مضامین کی فہرست حاصل کرنے کی ضرورت ہے، اور اس کے لیے ہم ایک خصوصی پیکج استعمال کریں گے۔ habR، جو آپ کو حبرا سے مضامین اور R میں ان پر کچھ اعدادوشمار کی درخواست کرنے کی اجازت دیتا ہے۔

پیکیج انسٹال کریں۔ habR صرف گیتوب سے ممکن ہے، جس کے لیے آپ کو ایک اضافی پیکیج کی ضرورت ہوگی۔ 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' کو اس اصلی ٹوکن سے بدلنے کے بعد جو آپ کو بوٹ بناتے وقت موصول ہوا تھا۔ بوٹ فیتر (میں نے ایک بوٹ بنانے کے بارے میں بات کی۔ پہلا مضمون).

نتیجے کے طور پر، ہم یہ نتیجہ حاصل کریں گے:
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)
}

ہمیں کمانڈ کے ساتھ مخصوص حب سے مضامین کی فہرست ملتی ہے۔ 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

نیا تبصرہ شامل کریں