R मा टेलिग्राम बट लेख्दै (भाग 3): बोटमा किबोर्ड समर्थन कसरी थप्ने

यो शृङ्खलाको तेस्रो लेख हो "R मा टेलिग्राम बोट लेख्दै"। अघिल्ला प्रकाशनहरूमा, हामीले टेलिग्राम बोट कसरी बनाउने, त्यसमार्फत सन्देशहरू पठाउने, बटमा आदेशहरू र सन्देश फिल्टरहरू थप्ने तरिका सिकेका थियौं। तसर्थ, तपाईंले यो लेख पढ्न सुरु गर्नु अघि, म तपाईंलाई पढ्न सिफारिस गर्दछु अघिल्लो, किनभने यहाँ म बोट निर्माणको पहिले वर्णन गरिएको आधारभूत कुराहरूमा अब बस्ने छैन।

यस लेखमा, हामी किबोर्ड थपेर हाम्रो बोटको उपयोगिता सुधार गर्नेछौं, जसले बोट इन्टरफेसलाई सहज र प्रयोग गर्न सजिलो बनाउनेछ।

R मा टेलिग्राम बट लेख्दै (भाग 3): बोटमा किबोर्ड समर्थन कसरी थप्ने

"R मा टेलिग्राम बट लेख्दै" श्रृंखलाका सबै लेखहरू

  1. हामी बोट सिर्जना गर्छौं र टेलिग्राममा सन्देशहरू पठाउन प्रयोग गर्छौं
  2. बोटमा आदेश समर्थन र सन्देश फिल्टरहरू थप्नुहोस्
  3. बोटमा किबोर्ड समर्थन कसरी थप्ने

सामग्रीहरू

यदि तपाइँ डेटा विश्लेषणमा रुचि राख्नुहुन्छ भने, तपाइँ मेरो मा रुचि राख्न सक्नुहुन्छ टेलीग्राम и YouTube च्यानलहरू। अधिकांश सामग्री आर भाषामा समर्पित छ।

  1. टेलिग्राम बोटले कस्ता प्रकारका किबोर्डहरूलाई समर्थन गर्दछ?
  2. किबोर्ड जवाफ दिनुहोस्
  3. इनलाइन किबोर्ड
    3.1। InLine बटनहरूको लागि समर्थनको साथ एक साधारण बोटको उदाहरण
    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 प्रत्येक बटन थिचे पछि किबोर्ड लुकाउन अनुमति दिन्छ।

एउटा साधारण बोट लेखौं जसमा ३ वटा बटन हुनेछन्:

  • च्याट ID - बटसँग संवादको च्याट ID अनुरोध गर्नुहोस्
  • मेरो नाम - तपाईंको नाम अनुरोध गर्नुहोस्
  • मेरो लगइन - टेलिग्राममा तपाईंको प्रयोगकर्ता नाम अनुरोध गर्नुहोस्

कोड १: रिप्लाई किबोर्डको साथ सरल बट

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 मा टेलिग्राम बट लेख्दै (भाग 3): बोटमा किबोर्ड समर्थन कसरी थप्ने

यदि यस समयमा तपाइँलाई विधिहरू, फिल्टरहरू र ह्यान्डलरहरूको सिर्जनाको साथ दिइएको कोड उदाहरणलाई पार्स गर्न गाह्रो छ भने, तपाइँ अघिल्लोमा फर्कनु पर्छ। लेख, जसमा मैले यी सबैलाई विस्तृत रूपमा वर्णन गरेको छु।

हामीले 4 विधिहरू सिर्जना गरेका छौं:

  • सुरु गर्नुहोस् - किबोर्ड सुरु गर्नुहोस्
  • chat_id - च्याट ID अनुरोध गर्नुहोस्
  • my_name - तपाईंको नाम अनुरोध गर्नुहोस्
  • my_username - तपाईको लगइन अनुरोध गर्नुहोस्

बिरोध गर्ने MessageFilters तिनीहरूको पाठमा आधारित 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(), जवाफ किबोर्ड जस्तै समान सिद्धान्त मा। IN InlineKeyboardMarkup() इनलाइन बटनहरूको सूचीहरूको सूची पास गर्न आवश्यक छ, प्रत्येक व्यक्तिगत बटन प्रकार्यद्वारा सिर्जना गरिएको छ InlineKeyboardButton().

इनलाइन बटनले तर्क प्रयोग गरेर बोटमा केही डेटा पास गर्न सक्छ callback_data, वा तर्क प्रयोग गरी निर्दिष्ट गरिएको कुनै HTML पृष्ठ खोल्नुहोस् url.

परिणाम एक सूची हुनेछ जसमा प्रत्येक तत्व इनलाइन बटनहरूको सूची पनि हो जुन एक पङ्क्तिमा जोड्न आवश्यक छ।

अर्को हामी इनलाइन बटनहरूसँग बटहरूको धेरै उदाहरणहरू हेर्नेछौं।

InLine बटनहरूको लागि समर्थनको साथ एक साधारण बोटको उदाहरण

पहिले, हामी कोभिड-१९ को एक्स्प्रेस परीक्षणको लागि बोट लेख्नेछौं। आदेश द्वारा /test, यसले तपाइँलाई दुई बटनहरू भएको किबोर्ड पठाउनेछ, थिचिएको बटनको आधारमा यसले तपाइँलाई तपाइँको परीक्षणको नतिजा सहित सन्देश पठाउनेछ।

कोड २: इनलाइन किबोर्ड भएको सबैभन्दा सरल बट

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 मा टेलिग्राम बट लेख्दै (भाग 3): बोटमा किबोर्ड समर्थन कसरी थप्ने

हामीले दुई तरिकाहरू सिर्जना गरेका छौं:

  • परीक्षण - च्याट इनलाइन किबोर्डमा पठाउन
  • answer_cb - किबोर्डबाट पठाइएको डाटा प्रक्रिया गर्न।

प्रत्येक बटनबाट पठाइने डेटा तर्कमा निर्दिष्ट गरिएको छ callback_data, बटन सिर्जना गर्दा। तपाईं कन्स्ट्रक्ट प्रयोग गरेर बटनबाट पठाइएको डाटा प्राप्त गर्न सक्नुहुन्छ update$callback_query$data, विधि भित्र answer_cb.

बोटले इनलाइन किबोर्डमा प्रतिक्रिया दिनको लागि विधि answer_cb एक विशेष ह्यान्डलर द्वारा प्रशोधन: CallbackQueryHandler(answer_cb)। जसले इनलाइन बटन क्लिक गर्दा निर्दिष्ट विधि चलाउँछ। ह्यान्डलर CallbackQueryHandler दुई तर्कहरू लिन्छ:

  • callback - चलाउन आवश्यक विधि
  • pattern - तर्क प्रयोग गरेर बटनमा बाँधिएको डेटाद्वारा फिल्टर गर्नुहोस् callback_data.

तदनुसार, तर्क प्रयोग pattern हामी प्रत्येक बटन थिच्नको लागि छुट्टै विधि लेख्न सक्छौं:

कोड 3: प्रत्येक इनलाइन बटनको लागि अलग तरिकाहरू

library(telegram.bot)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

माथिको कोड उदाहरण चलाउनुहोस्, '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 तपाईले मुख्य किबोर्डलाई कल गर्नुहुन्छ, जसमा एउटा मात्र "मौसम" बटन छ। यस बटनमा क्लिक गरेर तपाईले हालको मौसम पत्ता लगाउन चाहनु भएको शहर चयन गर्न इनलाइन किबोर्डको साथ सन्देश प्राप्त गर्नुहुनेछ। एउटा सहर छान्नुहोस् र हालको मौसम पाउनुहोस्।

यस कोड उदाहरणमा हामी धेरै अतिरिक्त प्याकेजहरू प्रयोग गर्नेछौं:

  • httr - HTTP अनुरोधहरूसँग काम गर्ने प्याकेज, जसको आधारमा कुनै पनि एपीआईसँग काम बनाइएको छ। हाम्रो अवस्थामा हामी नि: शुल्क एपीआई प्रयोग गर्नेछौं openweathermap.org.
  • stringr - पाठ संग काम गर्न को लागी एक प्याकेज, हाम्रो मामला मा हामी यसलाई चयन शहर मा मौसम बारे सन्देश उत्पन्न गर्न प्रयोग गर्नेछौं।

कोड ४: चयन गरिएको सहरको हालको मौसम रिपोर्ट गर्ने बोट

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 मा टेलिग्राम बट लेख्दै (भाग 3): बोटमा किबोर्ड समर्थन कसरी थप्ने

योजनाबद्ध रूपमा, यो बोटलाई यसरी चित्रण गर्न सकिन्छ:
R मा टेलिग्राम बट लेख्दै (भाग 3): बोटमा किबोर्ड समर्थन कसरी थप्ने

हामीले हाम्रो मौसम बट भित्र उपलब्ध 3 विधिहरू सिर्जना गरेका छौं:

  • सुरु - मुख्य बोट किबोर्ड सुरु गर्नुहोस्
  • मौसम - शहर चयन गर्न इनलाइन किबोर्ड सुरु गर्नुहोस्
  • answer_cb - दिइएको सहरको लागि API बाट मौसम अनुरोध गर्ने र च्याटमा पठाउने मुख्य विधि।

विधि सुरु हामी यसलाई आदेशको साथ सुरू गर्छौं /start, जुन ह्यान्डलर द्वारा लागू गरिएको छ CommandHandler('start', start).

विधि चलाउन मौसम हामीले उही नामको फिल्टर सिर्जना गर्यौं:

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

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

}
)

र हामी निम्न सन्देश ह्यान्डलरको साथ यो विधिलाई कल गर्छौं: MessageHandler(weather, filters = MessageFilters$weather).

र अन्तमा, हाम्रो मुख्य विधि answer_cb इनलाइन बटनहरू थिच्दा प्रतिक्रिया दिन्छ, जुन विशेष ह्यान्डलरद्वारा लागू गरिएको छ: CallbackQueryHandler(answer_cb).

एक विधि भित्र answer_cb, हामी किबोर्डबाट पठाइएको डाटा पढ्छौं र यसलाई चरमा लेख्छौं city: city <- update$callback_query$data। त्यसपछि हामी API बाट मौसम डेटा अनुरोध गर्छौं, सन्देश उत्पन्न गर्छौं र पठाउँछौं, र अन्तमा विधि प्रयोग गर्छौं answerCallbackQuery बटलाई सूचित गर्नको लागि कि हामीले इनलाइन बटनको क्लिकलाई प्रशोधन गर्यौं।

बाट निर्दिष्ट हबको लिङ्कको साथ नवीनतम लेखहरूको सूची प्रदर्शन गर्ने बोटको उदाहरण www.habr.com.

मैले यो बोटलाई वेब पृष्ठहरूमा लैजाने इनलाइन बटनहरू कसरी प्रदर्शन गर्ने भनेर देखाउनको लागि प्रस्तुत गर्दछु।

यस बोटको तर्क अघिल्लो जस्तै छ; सुरुमा हामी कमाण्डको साथ मुख्य किबोर्ड सुरु गर्छौं /start। अर्को, बोटले हामीलाई छनोट गर्नको लागि ६ हबहरूको सूची दिन्छ, हामी आफूलाई रुचि भएको हब चयन गर्छौं, र चयन गरिएको हबबाट 6 सबैभन्दा भर्खरका प्रकाशनहरू प्राप्त गर्छौं।

तपाईंले बुझ्नुभएको रूपमा, यस अवस्थामा हामीले लेखहरूको सूची प्राप्त गर्न आवश्यक छ, र यसको लागि हामी विशेष प्याकेज प्रयोग गर्नेछौं 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 मा टेलिग्राम बट लेख्दै (भाग 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

एक टिप्पणी थप्न