আর-এ টেলিগ্রাম বট লেখা (৩য় অংশ): কীভাবে বটে কীবোর্ড সমর্থন যোগ করা যায়

এটি "R তে টেলিগ্রাম বট লেখা" সিরিজের তৃতীয় নিবন্ধ। পূর্ববর্তী প্রকাশনাগুলিতে, আমরা শিখেছি কিভাবে একটি টেলিগ্রাম বট তৈরি করতে হয়, এর মাধ্যমে বার্তা পাঠাতে হয়, বটে কমান্ড এবং বার্তা ফিল্টার যোগ করতে হয়। অতএব, আপনি এই নিবন্ধটি পড়া শুরু করার আগে, আমি আপনাকে পড়ার সুপারিশ করছি আগে, কারণ এখানে আমি আর বট বিল্ডিং এর পূর্বে বর্ণিত মৌলিক বিষয়গুলো নিয়ে আলোচনা করব না।

এই নিবন্ধে, আমরা একটি কীবোর্ড যোগ করে আমাদের বটের ব্যবহারযোগ্যতা উন্নত করব, যা বটের ইন্টারফেসকে স্বজ্ঞাত এবং ব্যবহার করা সহজ করে তুলবে।

আর-এ টেলিগ্রাম বট লেখা (৩য় অংশ): কীভাবে বটে কীবোর্ড সমর্থন যোগ করা যায়

"R তে টেলিগ্রাম বট লেখা" সিরিজের সমস্ত নিবন্ধ

  1. আমরা একটি বট তৈরি করি এবং টেলিগ্রামে বার্তা পাঠাতে এটি ব্যবহার করি
  2. বটে কমান্ড সমর্থন এবং বার্তা ফিল্টার যোগ করুন
  3. কীভাবে একটি বটে কীবোর্ড সমর্থন যোগ করবেন

সন্তুষ্ট

আপনি যদি ডেটা বিশ্লেষণে আগ্রহী হন তবে আপনি আমার প্রতি আগ্রহী হতে পারেন টেলিগ্রাম и ইউটিউব চ্যানেল যার বেশিরভাগ বিষয়বস্তু আর ভাষাকে নিবেদিত।

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

উপরের কোডের উদাহরণটি চালান, 'আপনার বট টোকেন' এর মাধ্যমে বট তৈরি করার সময় আপনি যে আসল টোকেন পেয়েছিলেন তার সাথে প্রতিস্থাপন করার পরে বটফ্যাটার (আমি একটি বট তৈরি করার কথা বলেছি প্রথম নিবন্ধ).

চালু করার পরে, বটটিকে একটি কমান্ড দিন /start, কারণ আমরা কীবোর্ড চালু করার জন্য ঠিক এটিই সংজ্ঞায়িত করেছি।

আর-এ টেলিগ্রাম বট লেখা (৩য় অংশ): কীভাবে বটে কীবোর্ড সমর্থন যোগ করা যায়

যদি এই মুহূর্তে পদ্ধতি, ফিল্টার এবং হ্যান্ডলার তৈরির সাথে প্রদত্ত কোড উদাহরণটি পার্স করা আপনার পক্ষে কঠিন হয়, তবে আপনার আগেরটিতে ফিরে যাওয়া উচিত প্রবন্ধ, যাতে আমি এই সব বিস্তারিত বর্ণনা করেছি।

আমরা 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)

কিবোর্ড নিজেই পদ্ধতির ভিতরে তৈরি করা হয় 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
)

আর-এ টেলিগ্রাম বট লেখা (৩য় অংশ): কীভাবে বটে কীবোর্ড সমর্থন যোগ করা যায়

পদ্ধতি ব্যবহার করে চ্যাটে কীবোর্ড পাঠানো হয় 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.

ফলাফলটি একটি তালিকা হবে যেখানে প্রতিটি উপাদান ইনলাইন বোতামগুলির একটি তালিকা যা একটি সারিতে একত্রিত করা প্রয়োজন।

পরবর্তীতে আমরা ইনলাইন বোতাম সহ বটের বেশ কয়েকটি উদাহরণ দেখব।

ইনলাইন বোতামগুলির জন্য সমর্থন সহ একটি সাধারণ বটের উদাহরণ

প্রথমত, আমরা কোভিড-১৯ এর জন্য এক্সপ্রেস পরীক্ষার জন্য একটি বট লিখব। আদেশ দ্বারা /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()

উপরের কোডের উদাহরণটি চালান, 'আপনার বট টোকেন' এর মাধ্যমে বট তৈরি করার সময় আপনি যে আসল টোকেন পেয়েছিলেন তার সাথে প্রতিস্থাপন করার পরে বটফ্যাটার (আমি একটি বট তৈরি করার কথা বলেছি প্রথম নিবন্ধ).

ফলাফল:
আর-এ টেলিগ্রাম বট লেখা (৩য় অংশ): কীভাবে বটে কীবোর্ড সমর্থন যোগ করা যায়

আমরা দুটি পদ্ধতি তৈরি করেছি:

  • পরীক্ষা - চ্যাট ইনলাইন কীবোর্ড পাঠাতে
  • উত্তর_সিবি — কীবোর্ড থেকে পাঠানো ডেটা প্রক্রিয়া করতে।

প্রতিটি বোতাম থেকে যে ডেটা পাঠানো হবে তা আর্গুমেন্টে নির্দিষ্ট করা আছে 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()

উপরের কোডের উদাহরণটি চালান, 'আপনার বট টোকেন' এর মাধ্যমে বট তৈরি করার সময় আপনি যে আসল টোকেন পেয়েছিলেন তার সাথে প্রতিস্থাপন করার পরে বটফ্যাটার (আমি একটি বট তৈরি করার কথা বলেছি প্রথম নিবন্ধ).

এখন আমরা 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()

উপরের কোডের উদাহরণটি চালান, 'আপনার বট টোকেন' এর মাধ্যমে বট তৈরি করার সময় আপনি যে আসল টোকেন পেয়েছিলেন তার সাথে প্রতিস্থাপন করার পরে বটফ্যাটার (আমি একটি বট তৈরি করার কথা বলেছি প্রথম নিবন্ধ).

ফলস্বরূপ, আমাদের বট এই মত কিছু কাজ করবে:
আর-এ টেলিগ্রাম বট লেখা (৩য় অংশ): কীভাবে বটে কীবোর্ড সমর্থন যোগ করা যায়

পরিকল্পিতভাবে, এই বটটিকে এভাবে চিত্রিত করা যেতে পারে:
আর-এ টেলিগ্রাম বট লেখা (৩য় অংশ): কীভাবে বটে কীবোর্ড সমর্থন যোগ করা যায়

আমরা আমাদের আবহাওয়া বটের মধ্যে উপলব্ধ 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 শুধুমাত্র 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()

উপরের কোডের উদাহরণটি চালান, 'আপনার বট টোকেন' এর মাধ্যমে বট তৈরি করার সময় আপনি যে আসল টোকেন পেয়েছিলেন তার সাথে প্রতিস্থাপন করার পরে বটফ্যাটার (আমি একটি বট তৈরি করার কথা বলেছি প্রথম নিবন্ধ).

ফলস্বরূপ, আমরা এই ফলাফলটি পাব:
আর-এ টেলিগ্রাম বট লেখা (৩য় অংশ): কীভাবে বটে কীবোর্ড সমর্থন যোগ করা যায়

আমরা পদ্ধতিতে নির্বাচনের জন্য উপলব্ধ হাবের তালিকা হার্ডকোড করেছি 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

একটি মন্তব্য জুড়ুন