Dyma'r drydedd erthygl yn y gyfres “Writing a telegram bot in R”. Mewn cyhoeddiadau blaenorol, fe wnaethom ddysgu sut i greu bot telegram, anfon negeseuon drwyddo, ychwanegu gorchmynion a hidlwyr neges at y bot. Felly, cyn i chi ddechrau darllen yr erthygl hon, rwy'n argymell yn fawr eich bod chi'n darllen , achos Yma ni fyddaf mwyach yn canolbwyntio ar y pethau sylfaenol a ddisgrifiwyd yn flaenorol o adeiladu bot.
Yn yr erthygl hon, byddwn yn gwella defnyddioldeb ein bot trwy ychwanegu bysellfwrdd, a fydd yn gwneud rhyngwyneb y bot yn reddfol ac yn hawdd ei ddefnyddio.

Pob erthygl o'r gyfres “Ysgrifennu bot telegram yn R”
Cynnwys
Os oes gennych ddiddordeb mewn dadansoddi data, efallai y bydd gennych ddiddordeb yn fy и sianeli. Mae'r rhan fwyaf o'r cynnwys wedi'i neilltuo i'r iaith R.
3.1.
3.2.
3.3.
Pa fathau o fysellfyrddau y mae'r bot telegram yn eu cefnogi?
Ar adeg ysgrifennu'r ysgrifen hon telegram.bot yn caniatáu ichi greu dau fath o fysellfyrddau:
- Ymateb - Y prif, bysellfwrdd rheolaidd, sydd wedi'i leoli o dan y panel mewnbwn testun neges. Yn syml, mae bysellfwrdd o'r fath yn anfon neges destun i'r bot, ac fel y testun bydd yn anfon y testun sydd wedi'i ysgrifennu ar y botwm ei hun.
- Mewn-lein - Bysellfwrdd sy'n gysylltiedig â neges bot penodol. Mae'r bysellfwrdd hwn yn anfon y data bot sy'n gysylltiedig â'r botwm sy'n cael ei wasgu; gall y data hwn fod yn wahanol i'r testun sydd wedi'i ysgrifennu ar y botwm ei hun. Ac mae botymau o'r fath yn cael eu prosesu drwodd Triniwr Galwad yn Ôl.
Er mwyn i'r bot agor y bysellfwrdd, mae'n angenrheidiol wrth anfon neges trwy'r dull sendMessage(), pasiwch y bysellfwrdd a grëwyd yn flaenorol fel dadl reply_markup.
Isod byddwn yn edrych ar sawl enghraifft.
Bysellfwrdd ateb
Fel yr ysgrifennais uchod, dyma'r prif fysellfwrdd rheoli bot.
Enghraifft o greu bysellfwrdd Reply o'r cymorth swyddogol
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)Mae'r uchod yn enghraifft o gymorth swyddogol y pecyn telegram.bot. I greu bysellfwrdd, defnyddiwch y swyddogaeth ReplyKeyboardMarkup(), sydd yn ei dro yn cymryd rhestr o restrau o fotymau sy'n cael eu creu gan y swyddogaeth KeyboardButton().
Pam i mewn ReplyKeyboardMarkup() Oes angen i chi basio nid yn unig rhestr, ond rhestr o restrau? Y ffaith yw eich bod chi'n pasio'r brif restr, ac ynddi rydych chi'n diffinio pob rhes o fotymau mewn rhestrau ar wahân, oherwydd Gallwch chi osod nifer o fotymau mewn un rhes.
ddadl resize_keyboard yn eich galluogi i ddewis yn awtomatig y maint gorau posibl o fotymau bysellfwrdd, a'r ddadl one_time_keyboard yn eich galluogi i guddio'r bysellfwrdd ar ôl pwyso pob botwm.
Gadewch i ni ysgrifennu bot syml a fydd â 3 botymau:
- ID Sgwrs - Cais ID sgwrs o ddeialog gyda bot
- Fy enw i - Gofynnwch am eich enw
- Fy mewngofnodi - Gofynnwch am eich enw defnyddiwr mewn telegram
Cod 1: Bot syml gyda bysellfwrdd Ateb
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()Rhedeg yr enghraifft cod uchod, ar ôl amnewid 'EICH BOT TOKEN' gyda'r tocyn go iawn a gawsoch wrth greu'r bot trwy Tad Bot (Siaradais am greu bot yn ).
Ar ôl ei lansio, rhowch orchymyn i'r bot /start, achos Dyma'n union yr hyn a ddiffiniwyd gennym i lansio'r bysellfwrdd.

Os yw'n anodd ar hyn o bryd i chi ddosrannu'r enghraifft cod a roddwyd, gyda chreu dulliau, hidlwyr a thrinwyr, yna dylech ddychwelyd i'r un blaenorol , lle disgrifiais hyn i gyd yn fanwl.
Rydym wedi creu 4 dull:
- cychwyn - Lansio'r bysellfwrdd
- chat_id — Cais ID sgwrs
- my_name — Gofynnwch am eich enw
- my_username — Gofynnwch am eich mewngofnodi
I wrthwynebu MessageFilters ychwanegu 3 hidlydd neges yn seiliedig ar eu testun:
- chat_id — Negeseuon gyda thestun
"Чат ID" - enw - Negeseuon gyda thestun
"Моё имя" - enw defnyddiwr - Negeseuon gyda thestun
"Мой логин"
Ac fe wnaethom greu 4 triniwr a fydd, yn seiliedig ar orchmynion a hidlwyr a roddwyd, yn gweithredu'r dulliau penodedig.
# создаём обработчики
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)Mae'r bysellfwrdd ei hun yn cael ei greu y tu mewn i'r dull start() tîm ReplyKeyboardMarkup().
RKM <- ReplyKeyboardMarkup(
keyboard = list(
list(KeyboardButton("Чат ID")),
list(KeyboardButton("Моё имя")),
list(KeyboardButton("Мой логин"))
),
resize_keyboard = FALSE,
one_time_keyboard = TRUE
)Yn ein hachos ni, fe wnaethom osod yr holl fotymau o dan ei gilydd, ond gallwn eu trefnu mewn un rhes trwy wneud newidiadau i'r rhestr o restrau botymau. Achos mae un rhes y tu mewn i'r bysellfwrdd yn cael ei chreu trwy restr nythu o fotymau, yna er mwyn arddangos ein botymau mewn un rhes mae angen i ni ailysgrifennu rhan o'r cod ar gyfer adeiladu'r bysellfwrdd fel hyn:
RKM <- ReplyKeyboardMarkup(
keyboard = list(
list(
KeyboardButton("Чат ID"),
KeyboardButton("Моё имя"),
KeyboardButton("Мой логин")
)
),
resize_keyboard = FALSE,
one_time_keyboard = TRUE
)
Anfonir y bysellfwrdd i'r sgwrs gan ddefnyddio'r dull sendMessage(), yn y ddadl reply_markup.
bot$sendMessage(update$message$chat_id,
text = 'Выберите команду',
reply_markup = RKM)Bysellfwrdd ar-lein
Fel yr ysgrifennais uchod, mae'r bysellfwrdd Inline yn gysylltiedig â neges benodol. Mae ychydig yn anoddach gweithio ag ef na'r prif fysellfwrdd.
I ddechrau, mae angen ichi ychwanegu dull at y bot i alw'r bysellfwrdd Inline.
I ymateb i glic botwm Inline, gallwch hefyd ddefnyddio'r dull bot answerCallbackQuery(), a all arddangos hysbysiad yn y rhyngwyneb telegram i'r defnyddiwr sy'n pwyso'r botwm Inline.
Nid yw'r data a anfonir o'r botwm Inline yn destun, felly i'w brosesu mae angen i chi greu triniwr arbennig gan ddefnyddio'r gorchymyn CallbackQueryHandler().
Y cod ar gyfer adeiladu bysellfwrdd Inline a roddir yn y cymorth swyddogol y pecyn telegram.bot.
Cod ar gyfer adeiladu bysellfwrdd Inline o'r cymorth swyddogol
# 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)Mae angen i chi adeiladu bysellfwrdd Inline gan ddefnyddio'r gorchymyn InlineKeyboardMarkup(), ar yr un egwyddor â'r bysellfwrdd Reply. YN InlineKeyboardMarkup() mae angen pasio rhestr o restrau o fotymau Inline, mae pob botwm unigol yn cael ei greu gan y swyddogaeth InlineKeyboardButton().
Gall botwm mewn-lein naill ai drosglwyddo rhywfaint o ddata i'r bot gan ddefnyddio dadl callback_data, neu agor unrhyw dudalen HTML a nodir gan ddefnyddio'r ddadl url.
Y canlyniad fydd rhestr lle mae pob elfen hefyd yn rhestr o fotymau Inline y mae angen eu cyfuno yn un rhes.
Nesaf byddwn yn edrych ar sawl enghraifft o bots gyda botymau Inline.
Enghraifft o bot syml gyda chefnogaeth ar gyfer botymau InLine
Yn gyntaf, byddwn yn ysgrifennu bot ar gyfer profion cyflym ar gyfer covid-19. Trwy orchymyn /test, bydd yn anfon bysellfwrdd gyda dau fotwm i chi, yn dibynnu ar y botwm pwyso bydd yn anfon neges atoch gyda chanlyniadau eich profion.
Cod 2: Y bot symlaf gyda bysellfwrdd 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()Rhedeg yr enghraifft cod uchod, ar ôl amnewid 'EICH BOT TOKEN' gyda'r tocyn go iawn a gawsoch wrth greu'r bot trwy Tad Bot (Siaradais am greu bot yn ).
Canlyniad:

Rydym wedi creu dau ddull:
- prawf — I anfon i sgwrs Bysellfwrdd Inline
- ateb_cb — Prosesu data a anfonir o'r bysellfwrdd.
Mae'r data a anfonir o bob botwm wedi'i nodi yn y ddadl callback_data, wrth greu botwm. Gallwch dderbyn y data a anfonwyd o'r botwm gan ddefnyddio'r lluniad update$callback_query$data, y tu mewn i'r dull ateb_cb.
Er mwyn i'r bot ymateb i'r bysellfwrdd Inline, dull ateb_cb wedi'i brosesu gan driniwr arbennig: CallbackQueryHandler(answer_cb). Sy'n rhedeg y dull penodedig pan fydd y botwm Inline yn cael ei glicio. Triniwr Triniwr Galwad yn Ôl yn cymryd dwy ddadl:
callback— Y dull y mae angen ei redegpattern— Hidlo yn ôl data sydd wedi'i rwymo i'r botwm gan ddefnyddio dadlcallback_data.
Yn unol â hynny, gan ddefnyddio'r ddadl pattern Gallwn ysgrifennu dull ar wahân ar gyfer pwyso pob botwm:
Cod 3: Dulliau ar wahân ar gyfer pob botwm 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()Rhedeg yr enghraifft cod uchod, ar ôl amnewid 'EICH BOT TOKEN' gyda'r tocyn go iawn a gawsoch wrth greu'r bot trwy Tad Bot (Siaradais am greu bot yn ).
Nawr rydym wedi ysgrifennu 2 ddull ar wahân h.y. un dull, ar gyfer pob gwasg botwm, a defnyddio'r ddadl pattern, wrth greu eu trinwyr:
query_handler_yes <- CallbackQueryHandler(answer_cb_yes, pattern = 'yes')
query_handler_no <- CallbackQueryHandler(answer_cb_no, pattern = 'no')Cod y dull yn dod i ben ateb_cb tîm bot$answerCallbackQuery(callback_query_id = update$callback_query$id), sy'n dweud wrth y bot bod data o'r bysellfwrdd mewnol wedi'i dderbyn.
Enghraifft o bot sy'n adrodd am y tywydd presennol ar gyfer dinas ddethol
Gadewch i ni geisio ysgrifennu bot sy'n gofyn am ddata tywydd.
Bydd rhesymeg ei waith fel a ganlyn. I ddechrau gan y tîm /start rydych chi'n galw'r prif fysellfwrdd, sydd â dim ond un botwm "Tywydd". Drwy glicio ar y botwm hwn byddwch yn derbyn neges gyda'r bysellfwrdd Inline i ddewis y ddinas yr ydych am ddarganfod y tywydd presennol ar ei chyfer. Dewiswch un o'r dinasoedd a chael y tywydd presennol.
Yn yr enghraifft cod hwn byddwn yn defnyddio sawl pecyn ychwanegol:
httr- pecyn ar gyfer gweithio gyda cheisiadau HTTP, y mae gwaith gydag unrhyw API wedi'i adeiladu ar ei sail. Yn ein hachos ni byddwn yn defnyddio'r API rhad ac am ddim .stringr— pecyn ar gyfer gweithio gyda thestun, yn ein hachos ni byddwn yn ei ddefnyddio i gynhyrchu neges am y tywydd yn y ddinas a ddewiswyd.
Cod 4: Bot sy'n adrodd am y tywydd presennol ar gyfer y ddinas a ddewiswyd
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()Rhedeg yr enghraifft cod uchod, ar ôl amnewid 'EICH BOT TOKEN' gyda'r tocyn go iawn a gawsoch wrth greu'r bot trwy Tad Bot (Siaradais am greu bot yn ).
O ganlyniad, bydd ein bot yn gweithio rhywbeth fel hyn:

Yn sgematig, gellir darlunio'r bot hwn fel hyn:

Rydym wedi creu 3 dull sydd ar gael y tu mewn i'n bot tywydd:
- dechrau - Lansio'r prif fysellfwrdd bot
- tywydd — Lansio bysellfwrdd Inline i ddewis dinas
- ateb_cb - Y prif ddull sy'n gofyn am y tywydd gan yr API ar gyfer dinas benodol a'i anfon i'r sgwrs.
Dull dechrau rydym yn ei lansio gyda'r gorchymyn /start, sy'n cael ei weithredu gan y triniwr CommandHandler('start', start).
I redeg dull tywydd rydym wedi creu hidlydd o'r un enw:
# создаём фильтры
## сообщения с текстом Погода
MessageFilters$weather <- BaseFilter(function(message) {
# проверяем текст сообщения
message$text == "Погода"
}
)Ac rydym yn galw'r dull hwn gyda'r triniwr negeseuon canlynol: MessageHandler(weather, filters = MessageFilters$weather).
Ac yn y diwedd, ein prif ddull ateb_cb yn ymateb i wasgu botymau Inline, a weithredir gan driniwr arbennig: CallbackQueryHandler(answer_cb).
Y tu mewn i ddull ateb_cb, rydym yn darllen y data a anfonwyd o'r bysellfwrdd ac yn ei ysgrifennu i newidyn city: city <- update$callback_query$data. Yna rydym yn gofyn am ddata tywydd o'r API, yn cynhyrchu ac yn anfon neges, ac yn olaf yn defnyddio'r dull answerCallbackQuery er mwyn hysbysu'r bot ein bod wedi prosesu clic ar y botwm Inline.
Enghraifft o bot sy'n dangos rhestr o'r erthyglau diweddaraf gyda dolenni i'r Hyb penodedig o .
Rwy'n cyflwyno'r bot hwn i ddangos i chi sut i arddangos botymau Inline sy'n arwain at dudalennau gwe.
Mae rhesymeg y bot hwn yn debyg i'r un blaenorol; i ddechrau rydym yn lansio'r prif fysellfwrdd gyda'r gorchymyn /start. Nesaf, mae'r bot yn rhoi rhestr i ni o 6 hwb i ddewis ohonynt, rydym yn dewis y canolbwynt y mae gennym ddiddordeb ynddo, ac yn derbyn y 5 cyhoeddiad diweddaraf o'r Hyb a ddewiswyd.
Fel y deallwch, yn yr achos hwn mae angen i ni gael rhestr o erthyglau, ac ar gyfer hyn byddwn yn defnyddio pecyn arbennig habR, sy'n eich galluogi i ofyn am erthyglau gan Habra a rhai ystadegau arnynt yn R.
Gosod pecyn habR dim ond yn bosibl o github, y bydd angen pecyn ychwanegol arnoch chi devtools. I osod, defnyddiwch y cod isod.
install.packages('devtools')
devtools::install_github('selesnow/habR')Nawr, gadewch i ni edrych ar y cod ar gyfer adeiladu'r bot a ddisgrifir uchod:
Cod 5: Bot sy'n dangos rhestr o'r erthyglau diweddaraf ar yr Hyb a ddewiswyd
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()Rhedeg yr enghraifft cod uchod, ar ôl amnewid 'EICH BOT TOKEN' gyda'r tocyn go iawn a gawsoch wrth greu'r bot trwy Tad Bot (Siaradais am greu bot yn ).
O ganlyniad, byddwn yn cael y canlyniad hwn:

Fe wnaethom ni roi cod caled i'r rhestr o Hybiau sydd ar gael i'w dewis yn y dull 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)
}Rydyn ni'n cael rhestr o erthyglau o'r Hyb penodedig gyda'r gorchymyn habr_hub_posts(), o'r pecyn habR. Ar yr un pryd, rydym yn nodi nad oes angen rhestr o erthyglau arnom am yr amser cyfan, ond dim ond y dudalen gyntaf y mae 20 erthygl wedi'u lleoli arni. O'r tabl canlyniadol gan ddefnyddio'r gorchymyn head() Rydym yn gadael y 5 uchaf yn unig, sef yr erthyglau mwyaf diweddar.
# парсим Хабр
posts <- head(habr_hub_posts(hub, 1), 5)Mae'r rhesymeg yn debyg iawn i'r bot blaenorol, ond yn yr achos hwn rydym yn cynhyrchu bysellfwrdd Inline gyda rhestr o erthyglau yn ddeinamig gan ddefnyddio'r ffwythiant lapply().
# формируем список кнопок
keys <- lapply(1:5, function(x) list(InlineKeyboardButton(posts$title[x], url = posts$link[x])))
# формируем клавиатуру
IKM <- InlineKeyboardMarkup(
inline_keyboard = keys
)Rydyn ni'n mewnosod teitl yr erthygl yn y testun botwm posts$title[x], ac yn y ddadl url dolen i'r erthygl: url = posts$link[x].
Nesaf, rydyn ni'n creu hidlydd, trinwyr ac yn lansio ein bot.
Casgliad
Nawr bydd y bots y byddwch chi'n eu hysgrifennu yn llawer mwy cyfleus i'w defnyddio, oherwydd y ffaith y byddant yn cael eu rheoli o'r bysellfwrdd, yn hytrach na thrwy fynd i mewn i orchmynion. O leiaf, wrth ryngweithio â bot trwy ffôn clyfar, bydd y bysellfwrdd yn symleiddio'r broses o'i ddefnyddio yn sylweddol.
Yn yr erthygl nesaf byddwn yn darganfod sut i adeiladu deialog rhesymegol gyda bot a gweithio gyda chronfeydd data.
Ffynhonnell: hab.com
