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

"R मा टेलिग्राम बट लेख्दै" श्रृंखलाका सबै लेखहरू
सामग्रीहरू
यदि तपाइँ डेटा विश्लेषणमा रुचि राख्नुहुन्छ भने, तपाइँ मेरो मा रुचि राख्न सक्नुहुन्छ и च्यानलहरू। अधिकांश सामग्री आर भाषामा समर्पित छ।
3.1।
3.2।
3.3।
टेलिग्राम बटले कस्ता प्रकारका किबोर्डहरूलाई समर्थन गर्छ?
यो लेखन को समयमा telegram.bot तपाईंलाई दुई प्रकारका किबोर्डहरू सिर्जना गर्न अनुमति दिन्छ:
- जवाफ दिनुहोस् — सन्देश पाठ इनपुट प्यानल मुनि रहेको मुख्य, नियमित किबोर्ड। यो किबोर्डले बोटलाई केवल पाठ सन्देश पठाउँछ, र पाठको रूपमा यसले बटनमा लेखिएको पाठ पठाउनेछ।
- इनलाइन — एउटा विशेष बट सन्देशमा बाँधिएको किबोर्ड। यो किबोर्डले थिचिएको बटनमा बाँधिएको बट डेटा पठाउँछ, यो डेटा बटनमा लेखिएको पाठ भन्दा फरक हुन सक्छ। र त्यस्ता बटनहरू मार्फत प्रशोधन गरिन्छ कलब्याकक्वेरीह्यान्डलर.
बटले किबोर्ड खोल्नको लागि, विधि मार्फत सन्देश पठाउँदा यो आवश्यक छ 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 प्रत्येक बटन थिचेपछि किबोर्ड लुकाउन अनुमति दिन्छ।
एउटा साधारण बोट लेखौं जसमा ३ वटा बटन हुनेछन्:
- च्याट आईडी - बटसँगको संवादको अनुरोध च्याट आईडी
- मेरो नाम - तपाईंको नाम अनुरोध गर्नुहोस्
- मेरो लगइन - टेलिग्राममा तपाईंको प्रयोगकर्ता नाम अनुरोध गर्नुहोस्
कोड १: उत्तर किबोर्ड भएको सरल बोट
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, किनकि हामीले किबोर्ड सुरु गर्न यो परिभाषित गरेका छौं।

यदि अहिले तपाईंलाई विधि, फिल्टर र ह्यान्डलरहरू सिर्जना गर्दा दिइएको कोड उदाहरण बुझ्न गाह्रो लाग्छ भने, तपाईंले अघिल्लोमा फर्कनु पर्छ। , जसमा मैले यो सबै विस्तृत रूपमा वर्णन गरेको छु।
हामीले ४ वटा विधिहरू सिर्जना गरेका छौं:
- सुरु गर्नुहोस् — किबोर्ड सुरु गर्नुहोस्
- chat_id — अनुरोध च्याट ID
- मेरो नाम — तपाईंको नाम अनुरोध गर्नुहोस्
- my_username — आफ्नो लगइन अनुरोध गर्नुहोस्
वस्तु भित्र MessageFilters तिनीहरूको पाठद्वारा ३ सन्देश फिल्टरहरू थपियो:
- chat_id — पाठ सहितका सन्देशहरू
"Чат ID" - नाम — पाठ सहितका सन्देशहरू
"Моё имя" - प्रयोगकर्ता नाम — पाठ सहितका सन्देशहरू
"Мой логин"
अनि तिनीहरूले ४ वटा ह्यान्डलरहरू सिर्जना गरे जसले निर्दिष्ट आदेशहरू र फिल्टरहरूको आधारमा निर्दिष्ट विधिहरू कार्यान्वयन गर्नेछन्।
# создаём обработчики
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, यसले तपाईंलाई दुई बटनहरू भएको किबोर्ड पठाउनेछ, थिचिएको बटनको आधारमा यसले तपाईंको परीक्षणको नतिजा सहितको सन्देश पठाउनेछ।
कोड २: इनलाइन किबोर्ड भएको सबैभन्दा सरल बोट
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 (मैले बोट सिर्जना गर्ने बारे कुरा गरें ).
परिणाम:

हामीले दुई तरिकाहरू सिर्जना गरेका छौं:
- परीक्षण — च्याटमा पठाउन इनलाइन किबोर्ड
- उत्तर_सीबी — किबोर्डबाट पठाइएको डेटा प्रशोधन गर्न।
प्रत्येक बटनबाट पठाइने डेटा तर्कमा निर्दिष्ट गरिएको छ। callback_data, बटन सिर्जना गर्दा। तपाईंले निर्माण प्रयोग गरेर बटनबाट पठाइएको डेटा प्राप्त गर्न सक्नुहुन्छ update$callback_query$data, विधि भित्र उत्तर_सीबी.
इनलाइन किबोर्डमा बोटलाई प्रतिक्रिया दिनको लागि, विधि उत्तर_सीबी विशेष ह्यान्डलरद्वारा प्रशोधन गरिएको: CallbackQueryHandler(answer_cb)। जसले इनलाइन बटन थिच्दा निर्दिष्ट विधि चलाउँछ। ह्यान्डलर कलब्याकक्वेरीह्यान्डलर दुई तर्कहरू लिन्छ:
callback— चलाउनु पर्ने विधिpattern— आर्गुमेन्ट प्रयोग गरेर बटनमा बाँधिएको डेटा अनुसार फिल्टर गर्नुहोस्callback_data.
तदनुसार, तर्क प्रयोग गर्दै pattern हामी प्रत्येक बटन थिच्नेको लागि छुट्टै विधि लेख्न सक्छौं:
कोड ३: प्रत्येक इनलाइन बटनको लागि छुट्टाछुट्टै विधिहरू
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 (मैले बोट सिर्जना गर्ने बारे कुरा गरें ).
अब हामीले २ वटा छुट्टाछुट्टै विधिहरू लेखेका छौं, अर्थात् प्रत्येक बटन थिच्नेको लागि एउटा विधि, र तर्क प्रयोग गरेका छौं 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 प्रयोग गर्नेछौं। .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 (मैले बोट सिर्जना गर्ने बारे कुरा गरें ).
फलस्वरूप, हाम्रो बोटले यसरी काम गर्नेछ:

योजनाबद्ध रूपमा, यो बोट यसरी डिजाइन गर्न सकिन्छ:

हामीले हाम्रो मौसम बोट भित्र ३ वटा विधिहरू उपलब्ध गराएका छौं:
- सुरु — मुख्य बोट किबोर्ड सुरु गर्नुहोस्
- मौसम — शहर चयनको लागि इनलाइन किबोर्ड सुरु गर्नुहोस्
- उत्तर_सीबी — मुख्य विधि, जसले दिइएको शहरको लागि 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 हामीले इनलाइन बटन क्लिक प्रशोधन गरेका छौं भनेर बटलाई जानकारी गराउनको लागि।
निर्दिष्ट हबको लिङ्कहरू सहितको पछिल्लो लेखहरूको सूची प्रदर्शन गर्ने बोटको उदाहरण .
वेब पृष्ठहरूमा लैजाने इनलाइन बटनहरू कसरी प्रदर्शन गर्ने भनेर देखाउन म यो बट प्रदान गर्दैछु।
यस बोटको तर्क अघिल्लो जस्तै छ, सुरुमा हामी कमाण्डको साथ मुख्य किबोर्ड सुरु गर्छौं। /start। त्यसपछि, बोटले हामीलाई छनौट गर्न ६ हबहरूको सूची दिन्छ, हामी हामीलाई रुचि भएको हब चयन गर्छौं, र चयन गरिएको हबबाट ५ वटा सबैभन्दा भर्खरका प्रकाशनहरू प्राप्त गर्छौं।
तपाईंले बुझ्नुभएको कुरा, यस अवस्थामा हामीले लेखहरूको सूची प्राप्त गर्न आवश्यक छ, र यसको लागि हामी विशेष प्याकेज प्रयोग गर्नेछौं। habR, जसले तपाईंलाई हब्राहाबाट लेखहरू र R मा तिनीहरूको बारेमा केही तथ्याङ्कहरू अनुरोध गर्न अनुमति दिन्छ।
प्याकेज स्थापना गर्नुहोस् habR गिथबबाट मात्र सम्भव छ, जसको लागि तपाईंलाई थप प्याकेज चाहिन्छ devtools। स्थापना गर्न, तलको कोड प्रयोग गर्नुहोस्।
install.packages('devtools')
devtools::install_github('selesnow/habR')अब माथि वर्णन गरिएको बोट निर्माणको लागि कोड हेरौं:
कोड ५: चयन गरिएको हबमा सबैभन्दा भर्खरका लेखहरूको सूची प्रदर्शन गर्ने बोट
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 (मैले बोट सिर्जना गर्ने बारे कुरा गरें ).
फलस्वरूप, हामी निम्न परिणाम प्राप्त गर्नेछौं:

हामीले विधिमा चयनको लागि उपलब्ध हबहरूको सूची हार्डकोड गरेका छौं। 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। यस अवस्थामा, हामी संकेत गर्छौं कि हामीलाई सबै समयको लागि लेखहरूको सूची आवश्यक छैन, तर केवल पहिलो पृष्ठ जसमा २० लेखहरू अवस्थित छन्। परिणामस्वरूप तालिकाबाट, आदेश प्रयोग गरेर head() हामी शीर्ष ५ मात्र छोड्छौं, जुन सबैभन्दा भर्खरका लेखहरू हुन्।
# парсим Хабр
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
