نوشتن ربات تلگرام به زبان R (قسمت سوم): نحوه افزودن پشتیبانی از صفحه کلید به ربات

این سومین مقاله از مجموعه “نوشتن ربات تلگرام به زبان R” است. در نشریات قبلی با نحوه ایجاد ربات تلگرام، ارسال پیام از طریق آن، اضافه کردن دستورات و فیلترهای پیام به ربات آشنا شدیم. بنابراین، قبل از شروع خواندن این مقاله، به شدت توصیه می کنم که مطالعه کنید قبلی، زیرا در اینجا دیگر به اصول اولیه ساخت ربات که قبلاً توضیح داده شد نمی پردازم.

در این مقاله، با افزودن یک صفحه کلید، قابلیت استفاده ربات خود را بهبود خواهیم بخشید، که رابط کاربری ربات را بصری و آسان برای استفاده می کند.

نوشتن ربات تلگرام به زبان R (قسمت سوم): نحوه افزودن پشتیبانی از صفحه کلید به ربات

تمامی مطالب از سری “نوشتن ربات تلگرام به زبان R”

  1. ما یک ربات ایجاد می کنیم و از آن برای ارسال پیام در تلگرام استفاده می کنیم
  2. پشتیبانی دستورات و فیلترهای پیام را به ربات اضافه کنید
  3. نحوه اضافه کردن پشتیبانی از صفحه کلید به ربات

مقدار

اگر به تجزیه و تحلیل داده ها علاقه دارید، ممکن است به من علاقه مند شوید تلگراف и یوتیوب کانال ها بیشتر مطالب به زبان R اختصاص داده شده است.

  1. ربات تلگرام از چه نوع کیبوردهایی پشتیبانی می کند؟
  2. صفحه کلید پاسخ
  3. صفحه کلید درون خطی
    3.1. نمونه ای از یک ربات ساده با پشتیبانی از دکمه های InLine
    3.2. نمونه ای از یک ربات که آب و هوای فعلی یک شهر انتخاب شده را گزارش می کند
    3.3. نمونه ای از یک ربات که لیستی از آخرین مقالات را با پیوندهایی به هاب مشخص شده از habr.com نمایش می دهد.
  4. نتیجه

ربات تلگرام از چه نوع کیبوردهایی پشتیبانی می کند؟

در زمان نگارش این مطلب telegram.bot به شما امکان می دهد دو نوع صفحه کلید ایجاد کنید:

  • پاسخ - صفحه کلید اصلی و معمولی که در زیر پانل ورودی متن پیام قرار دارد. چنین صفحه کلیدی به سادگی یک پیام متنی برای ربات ارسال می کند و متنی را که روی خود دکمه نوشته شده است به عنوان متن ارسال می کند.
  • Inline - صفحه کلید مرتبط با یک پیام ربات خاص. این صفحه کلید داده های ربات مربوط به دکمه فشرده شده را ارسال می کند؛ این داده ها ممکن است با متن نوشته شده روی خود دکمه متفاوت باشد. و چنین دکمه هایی از طریق پردازش می شوند CallbackQueryHandler.

برای اینکه ربات صفحه کلید را باز کند، هنگام ارسال پیام از طریق روش ضروری است sendMessage()، صفحه کلید ایجاد شده قبلی را به عنوان آرگومان ارسال کنید reply_markup.

در زیر به چند نمونه نگاه خواهیم کرد.

صفحه کلید پاسخ

همانطور که در بالا نوشتم، این صفحه کلید اصلی کنترل ربات است.

نمونه ای از ایجاد صفحه کلید Reply از راهنمای رسمی

bot <- Bot(token = "TOKEN")
chat_id <- "CHAT_ID"

# Create Custom Keyboard
text <- "Aren't those custom keyboards cool?"
RKM <- ReplyKeyboardMarkup(
  keyboard = list(
    list(KeyboardButton("Yes, they certainly are!")),
    list(KeyboardButton("I'm not quite sure")),
    list(KeyboardButton("No..."))
  ),
  resize_keyboard = FALSE,
  one_time_keyboard = TRUE
)

# Send Custom Keyboard
bot$sendMessage(chat_id, text, reply_markup = RKM)

موارد فوق نمونه ای از راهنمای رسمی بسته است telegram.bot. برای ایجاد صفحه کلید، از تابع استفاده کنید ReplyKeyboardMarkup()، که به نوبه خود لیستی از دکمه های ایجاد شده توسط تابع را می گیرد KeyboardButton().

چرا در ReplyKeyboardMarkup() آیا لازم است نه فقط یک لیست، بلکه یک لیست از لیست ها را پاس کنید؟ واقعیت این است که شما لیست اصلی را پاس می کنید و در آن هر ردیف از دکمه ها را در لیست های جداگانه تعریف می کنید، زیرا می توانید چندین دکمه را در یک ردیف قرار دهید.

بحث و جدل resize_keyboard به شما اجازه می دهد تا به طور خودکار اندازه بهینه دکمه های صفحه کلید و آرگومان را انتخاب کنید one_time_keyboard به شما اجازه می دهد تا صفحه کلید را پس از فشار دادن هر دکمه مخفی کنید.

بیایید یک ربات ساده بنویسیم که دارای 3 دکمه باشد:

  • شناسه چت - شناسه چت گفتگو با ربات را درخواست کنید
  • نام من - نام خود را درخواست کنید
  • ورود من - نام کاربری خود را در تلگرام درخواست کنید

کد 1: ربات ساده با صفحه کلید Reply

library(telegram.bot)

# создаём экземпляр класса Updater
updater <- Updater('ТОКЕН ВАШЕГО БОТА')

# создаём методы
## метод для запуска клавиатуры
start <- function(bot, update) {

  # создаём клавиатуру
  RKM <- ReplyKeyboardMarkup(
    keyboard = list(
      list(KeyboardButton("Чат ID")),
      list(KeyboardButton("Моё имя")),
      list(KeyboardButton("Мой логин"))
    ),
    resize_keyboard = FALSE,
    one_time_keyboard = TRUE
  )

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

}

## метод возвразающий id чата
chat_id <- function(bot, update) {

  bot$sendMessage(update$message$chat_id, 
                  text = paste0("Чат id этого диалога: ", update$message$chat_id),
                  parse_mode = "Markdown")

}

## метод возвращающий имя
my_name <- function(bot, update) {

  bot$sendMessage(update$message$chat_id, 
                  text = paste0("Вас зовут ", update$message$from$first_name),
                  parse_mode = "Markdown")

}

## метод возвращающий логин
my_username <- function(bot, update) {

  bot$sendMessage(update$message$chat_id, 
                  text = paste0("Ваш логин ", update$message$from$username),
                  parse_mode = "Markdown")

}

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

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

}
)

## сообщения с текстом Моё имя
MessageFilters$name <- BaseFilter(function(message) {

  # проверяем текст сообщения
  message$text == "Моё имя"

}
)

## сообщения с текстом Мой логин
MessageFilters$username <- BaseFilter(function(message) {

  # проверяем текст сообщения
  message$text == "Мой логин"
)

# создаём обработчики
h_start    <- CommandHandler('start', start)
h_chat_id  <- MessageHandler(chat_id, filters = MessageFilters$chat_id)
h_name     <- MessageHandler(my_name, filters = MessageFilters$name)
h_username <- MessageHandler(my_username, filters = MessageFilters$username)

# добавляем обработчики в диспетчер
updater <- updater + 
            h_start +
            h_chat_id +
            h_name +
            h_username

# запускаем бота 
updater$start_polling()

پس از جایگزینی "YOUR BOT TOKEN" با رمز واقعی که هنگام ایجاد ربات دریافت کرده اید، مثال کد بالا را اجرا کنید. BotFather (من در مورد ایجاد یک ربات صحبت کردم مقاله اول).

پس از راه اندازی، به ربات فرمان بدهید /start، زیرا این دقیقاً همان چیزی است که ما برای راه اندازی صفحه کلید تعریف کردیم.

نوشتن ربات تلگرام به زبان R (قسمت سوم): نحوه افزودن پشتیبانی از صفحه کلید به ربات

اگر در حال حاضر تجزیه مثال کد داده شده با ایجاد متدها، فیلترها و کنترلرها برای شما دشوار است، باید به کد قبلی بازگردید. مقاله، که در آن همه اینها را به تفصیل شرح دادم.

ما 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
)

نوشتن ربات تلگرام به زبان R (قسمت سوم): نحوه افزودن پشتیبانی از صفحه کلید به ربات

صفحه کلید با استفاده از روش به چت ارسال می شود sendMessage()، در استدلال reply_markup.

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

صفحه کلید درون خطی

همانطور که در بالا نوشتم، صفحه کلید Inline به یک پیام خاص گره خورده است. کار با آن تا حدودی دشوارتر از صفحه کلید اصلی است.

در ابتدا باید روشی را برای فراخوانی صفحه کلید Inline به ربات اضافه کنید.

برای پاسخ به کلیک دکمه Inline، می توانید از روش ربات نیز استفاده کنید answerCallbackQuery()که می تواند یک اعلان را در رابط تلگرام برای کاربری که دکمه Inline را فشار می دهد نمایش دهد.

داده های ارسال شده از دکمه Inline متنی نیستند، بنابراین برای پردازش آنها باید با استفاده از دستور یک کنترل کننده ویژه ایجاد کنید CallbackQueryHandler().

کد ساخت صفحه کلید Inline که در راهنمای رسمی پکیج آورده شده است 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()، بر اساس همان اصل صفحه کلید Reply. که در InlineKeyboardMarkup() لازم است لیستی از لیست دکمه های Inline ارسال شود، هر دکمه جداگانه توسط تابع ایجاد می شود InlineKeyboardButton().

یک دکمه درون خطی می تواند برخی از داده ها را با استفاده از یک آرگومان به ربات ارسال کند callback_data، یا هر صفحه HTML مشخص شده با استفاده از آرگومان را باز کنید url.

نتیجه یک لیست خواهد بود که در آن هر عنصر همچنین لیستی از دکمه های Inline است که باید در یک ردیف ترکیب شوند.

در ادامه به چند نمونه از ربات ها با دکمه های Inline نگاه خواهیم کرد.

نمونه ای از یک ربات ساده با پشتیبانی از دکمه های InLine

ابتدا یک ربات برای آزمایش سریع کووید-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()

پس از جایگزینی "YOUR BOT TOKEN" با رمز واقعی که هنگام ایجاد ربات دریافت کرده اید، مثال کد بالا را اجرا کنید. BotFather (من در مورد ایجاد یک ربات صحبت کردم مقاله اول).

یافته ها:
نوشتن ربات تلگرام به زبان R (قسمت سوم): نحوه افزودن پشتیبانی از صفحه کلید به ربات

ما دو روش ایجاد کردیم:

  • آزمون - برای ارسال به چت صفحه کلید درون خطی
  • answer_cb - برای پردازش داده های ارسال شده از صفحه کلید.

داده هایی که از هر دکمه ارسال می شود در آرگومان مشخص شده است callback_data، هنگام ایجاد یک دکمه. شما می توانید داده های ارسال شده از دکمه را با استفاده از ساختار دریافت کنید update$callback_query$data، داخل روش answer_cb.

برای اینکه ربات به صفحه کلید Inline واکنش نشان دهد، روش answer_cb پردازش شده توسط یک کنترل کننده خاص: CallbackQueryHandler(answer_cb). که با کلیک روی دکمه Inline روش مشخص شده را اجرا می کند. هندلر CallbackQueryHandler دو استدلال می گیرد:

  • callback - روشی که باید اجرا شود
  • pattern - بر اساس داده هایی که با استفاده از آرگومان به دکمه متصل شده اند، فیلتر کنید callback_data.

بر این اساس، با استفاده از استدلال pattern برای فشار دادن هر دکمه می توانیم روش جداگانه ای بنویسیم:

کد 3: روش های جداگانه برای هر دکمه Inline

library(telegram.bot)

# создаём экземпляр класса Updater
updater <- Updater('ТОКЕН ВАШЕГО БОТА')

# метод для отправки InLine клавиатуры
test <- function(bot, update) {  

  # создаём InLine клавиатуру
  IKM <- InlineKeyboardMarkup(
    inline_keyboard = list(
      list(
        InlineKeyboardButton("Да", callback_data = 'yes'),
        InlineKeyboardButton("Нет", callback_data = 'no')
      )
    )
  )

  # Отправляем клавиатуру в чат
  bot$sendMessage(update$message$chat_id, 
                  text = "Вы болете коронавирусом?", 
                  reply_markup = IKM)
}

# метод для обработки нажатия кнопки Да
answer_cb_yes <- function(bot, update) {

  # получаем имя пользователя, нажавшего кнопку
  uname <- update$effective_user()$first_name

  # обработка результата
  msg <- paste0(uname, ", к сожалени ваш текст на covid-19 положительный.")

  # Отправка сообщения
  bot$sendMessage(chat_id = update$from_chat_id(),
                  text = msg)

  # сообщаем боту, что запрос с кнопки принят
  bot$answerCallbackQuery(callback_query_id = update$callback_query$id) 
}

# метод для обработки нажатия кнопки Нет
answer_cb_no <- function(bot, update) {

  # получаем имя пользователя, нажавшего кнопку
  uname <- update$effective_user()$first_name

  msg <- paste0(uname, ", поздравляю, ваш текст на covid-19 отрицательный.")

  # Отправка сообщения
  bot$sendMessage(chat_id = update$from_chat_id(),
                  text = msg)

  # сообщаем боту, что запрос с кнопки принят
  bot$answerCallbackQuery(callback_query_id = update$callback_query$id) 
}

# создаём обработчики
inline_h          <- CommandHandler('test', test)
query_handler_yes <- CallbackQueryHandler(answer_cb_yes, pattern = 'yes')
query_handler_no  <- CallbackQueryHandler(answer_cb_no, pattern = 'no')

# добавляем обработчики в диспетчер
updater <- updater + 
            inline_h + 
            query_handler_yes +
            query_handler_no

# запускаем бота
updater$start_polling()

پس از جایگزینی "YOUR BOT TOKEN" با رمز واقعی که هنگام ایجاد ربات دریافت کرده اید، مثال کد بالا را اجرا کنید. BotFather (من در مورد ایجاد یک ربات صحبت کردم مقاله اول).

حالا ما 2 روش جداگانه نوشته ایم. یک روش، برای هر دکمه فشار دهید و از آرگومان استفاده کنید 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 - بسته ای برای کار با درخواست های 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" با رمز واقعی که هنگام ایجاد ربات دریافت کرده اید، مثال کد بالا را اجرا کنید. BotFather (من در مورد ایجاد یک ربات صحبت کردم مقاله اول).

در نتیجه، ربات ما چیزی شبیه به این کار خواهد کرد:
نوشتن ربات تلگرام به زبان R (قسمت سوم): نحوه افزودن پشتیبانی از صفحه کلید به ربات

به طور شماتیک، این ربات را می توان به صورت زیر نشان داد:
نوشتن ربات تلگرام به زبان R (قسمت سوم): نحوه افزودن پشتیبانی از صفحه کلید به ربات

ما 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 را پردازش کرده ایم.

نمونه ای از یک ربات که لیستی از آخرین مقالات را با پیوندهایی به هاب مشخص شده از نشان می دهد www.habr.com.

من این ربات را ارائه می کنم تا به شما نشان دهم چگونه دکمه های Inline را که به صفحات وب منتهی می شوند نمایش دهید.

منطق این ربات مشابه ربات قبلی است؛ در ابتدا صفحه کلید اصلی را با دستور اجرا می کنیم /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()

پس از جایگزینی "YOUR BOT TOKEN" با رمز واقعی که هنگام ایجاد ربات دریافت کرده اید، مثال کد بالا را اجرا کنید. BotFather (من در مورد ایجاد یک ربات صحبت کردم مقاله اول).

در نتیجه به این نتیجه خواهیم رسید:
نوشتن ربات تلگرام به زبان R (قسمت سوم): نحوه افزودن پشتیبانی از صفحه کلید به ربات

ما فهرست هاب های موجود برای انتخاب در روش را کدگذاری کردیم habs:

## Метод вызова Inine клавиатуры
habs <- function(bot, update) {

  IKM <- InlineKeyboardMarkup(
    inline_keyboard = list(
      list(
        InlineKeyboardButton(text = 'R', callback_data = 'r'),
        InlineKeyboardButton(text = 'Data Mining', callback_data = 'data_mining'),
        InlineKeyboardButton(text = 'Data Engineering', callback_data = 'data_engineering')
      ),
      list(
        InlineKeyboardButton(text = 'Big Data', callback_data = 'bigdata'),
        InlineKeyboardButton(text = 'Python', callback_data = 'python'),
        InlineKeyboardButton(text = 'Визуализация данных', callback_data = 'data_visualization')
      )
    )
  )

  # Send Inline Keyboard
  bot$sendMessage(chat_id = update$message$chat_id, 
                  text = "Выберите Хаб", 
                  reply_markup = IKM)
}

ما لیستی از مقالات را از Hub مشخص شده با دستور دریافت می کنیم habr_hub_posts()، از بسته بندی habR. در عین حال به این نکته اشاره می کنیم که ما به لیست مقالات برای کل زمان نیاز نداریم، بلکه فقط به صفحه اولی که 20 مقاله در آن قرار دارد نیاز داریم. از جدول به دست آمده با استفاده از دستور head() ما فقط 5 مقاله برتر را که جدیدترین مقالات هستند باقی می گذاریم.

  # парсим Хабр
  posts <- head(habr_hub_posts(hub, 1), 5)

منطق بسیار شبیه به ربات قبلی است، اما در این مورد ما یک صفحه کلید Inline با لیستی از مقالات به صورت پویا با استفاده از تابع تولید می کنیم. lapply().

  # формируем список кнопок
  keys <- lapply(1:5, function(x) list(InlineKeyboardButton(posts$title[x], url = posts$link[x])))

  # формируем клавиатуру
  IKM <- InlineKeyboardMarkup(
    inline_keyboard =  keys 
    )

عنوان مقاله را در متن دکمه درج می کنیم posts$title[x]، و در برهان url لینک مقاله: url = posts$link[x].

در مرحله بعد، یک فیلتر، هندلرها ایجاد می کنیم و ربات خود را راه اندازی می کنیم.

نتیجه

اکنون ربات هایی که می نویسید برای استفاده بسیار راحت تر خواهند بود، زیرا به جای وارد کردن دستورات، از صفحه کلید کنترل می شوند. حداقل، هنگام تعامل با یک ربات از طریق تلفن هوشمند، صفحه کلید به طور قابل توجهی روند استفاده از آن را ساده می کند.

در مقاله بعدی نحوه ایجاد یک گفتگوی منطقی با یک ربات و کار با پایگاه داده را خواهیم فهمید.

منبع: www.habr.com

اضافه کردن نظر