Ysgrifennu bot telegram yn R (rhan 3): Sut i ychwanegu cefnogaeth bysellfwrdd i bot

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 blaenorol, 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.

Ysgrifennu bot telegram yn R (rhan 3): Sut i ychwanegu cefnogaeth bysellfwrdd i bot

Pob erthygl o'r gyfres “Ysgrifennu bot telegram yn R”

  1. Rydyn ni'n creu bot ac yn ei ddefnyddio i anfon negeseuon mewn telegram
  2. Ychwanegu cefnogaeth gorchymyn a hidlwyr neges i'r bot
  3. Sut i ychwanegu cefnogaeth bysellfwrdd at bot

Cynnwys

Os oes gennych ddiddordeb mewn dadansoddi data, efallai y bydd gennych ddiddordeb yn fy telegram и youtube sianeli. Mae'r rhan fwyaf o'r cynnwys wedi'i neilltuo i'r iaith R.

  1. Pa fathau o fysellfyrddau y mae'r bot telegram yn eu cefnogi?
  2. Reply клавиатура
  3. Bysellfwrdd ar-lein
    3.1. Enghraifft o bot syml gyda chefnogaeth ar gyfer botymau InLine
    3.2. Enghraifft o bot sy'n adrodd am y tywydd presennol ar gyfer dinas ddethol
    3.3. Enghraifft o bot sy'n dangos rhestr o'r erthyglau diweddaraf gyda dolenni i'r Hyb penodedig o habr.com
  4. Casgliad

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 CallbackQueryHandler.

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.

Reply клавиатура

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. Для создания клавиатуры используется функция 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

Код 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()

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 erthygl gyntaf).

Ar ôl ei lansio, rhowch orchymyn i'r bot /start, achos Dyma'n union yr hyn a ddiffiniwyd gennym i lansio'r bysellfwrdd.

Ysgrifennu bot telegram yn R (rhan 3): Sut i ychwanegu cefnogaeth bysellfwrdd i bot

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 Erthygl, lle disgrifiais hyn i gyd yn fanwl.

Мы создали 4 метода:

  • cychwyn - Lansio'r bysellfwrdd
  • chat_id — Cais ID sgwrs
  • my_name — Запрос своего имени
  • 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 "Моё имя"
  • username — Сообщения с текстом "Мой логин"

И создали 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)

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
)

Ysgrifennu bot telegram yn R (rhan 3): Sut i ychwanegu cefnogaeth bysellfwrdd i bot

Отправляется клавиатура в чат методом sendMessage(), в аргументе reply_markup.

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

Bysellfwrdd ar-lein

Как я уже писал выше, Inline клавиатура привязана к конкретному сообщению. С ней работать несколько сложнее чем с основной клавиатурой.

Изначально вам необходимо добавить боту метод, для вызова 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.

В результате будет список, в котором каждый элемент так же является списком Inline кнопок, которые необходимо объединить в один ряд.

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.

Код 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()

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 erthygl gyntaf).

Canlyniad:
Ysgrifennu bot telegram yn R (rhan 3): Sut i ychwanegu cefnogaeth bysellfwrdd i bot

Rydym wedi creu dau ddull:

  • prawf — I anfon i sgwrs Bysellfwrdd Inline
  • answer_cb — Prosesu data a anfonir o'r bysellfwrdd.

Mae'r data a anfonir o bob botwm wedi'i nodi yn y ddadl callback_data, при создании кнопки. Получить отправленные с кнопки данные можно с помощью конструкции update$callback_query$data, y tu mewn i'r dull answer_cb.

Что бы бот реагировал на Inline клавиатуру, метод answer_cb обрабатывается специальным обработчиком: CallbackQueryHandler(answer_cb). Sy'n rhedeg y dull penodedig pan fydd y botwm Inline yn cael ei glicio. Triniwr CallbackQueryHandler принимает два аргумента:

  • callback — Y dull y mae angen ei redeg
  • pattern — Hidlo yn ôl data sydd wedi'i rwymo i'r botwm gan ddefnyddio dadl callback_data.

Yn unol â hynny, gan ddefnyddio'r ddadl pattern мы можем под нажатие каждой кнопки написать отдельный метод:

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 erthygl gyntaf).

Теперь мы написали 2 отдельных метода, т.е. по одному методу, под нажатие каждой кнопки, и использовали аргумент pattern, при создании их обработчиков:

query_handler_yes <- CallbackQueryHandler(answer_cb_yes, pattern = 'yes')
query_handler_no  <- CallbackQueryHandler(answer_cb_no, pattern = 'no')

Заканчивается код метода answer_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 openweathermap.org.
  • stringr — пакет для работы с текстом, в нашем случае мы будем его использовать для формирования сообщения о погоде в выбранном городе.

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 erthygl gyntaf).

В результате наш бот будет работать примерно так:
Ysgrifennu bot telegram yn R (rhan 3): Sut i ychwanegu cefnogaeth bysellfwrdd i bot

Yn sgematig, gellir darlunio'r bot hwn fel hyn:
Ysgrifennu bot telegram yn R (rhan 3): Sut i ychwanegu cefnogaeth bysellfwrdd i bot

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
  • answer_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 у нас запускается командой /start, sy'n cael ei weithredu gan y triniwr CommandHandler('start', start).

Для запуска метода tywydd мы создали одноимённый фильтр:

# создаём фильтры
## сообщения с текстом Погода
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 answer_cb yn ymateb i wasgu botymau Inline, a weithredir gan driniwr arbennig: CallbackQueryHandler(answer_cb).

Y tu mewn i ddull answer_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 для того, что бы сообщить боту, о том, что мы обработали нажатие Inline кнопки.

Enghraifft o bot sy'n dangos rhestr o'r erthyglau diweddaraf gyda dolenni i'r Hyb penodedig o hab.com.

Rwy'n cyflwyno'r bot hwn i ddangos i chi sut i arddangos botymau Inline sy'n arwain at dudalennau gwe.

Логика данного бота схожа с предыдущим, изначально мы запускаем основную клавиатуру командой /start. Далее бот даёт нам на выбор список из 6 хабов, мы выбираем интересующий нас хаб, и получаем 5 самых свежих публикаций из выбранного Хаба.

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 можно только из github, для чего вам понадобится дополнительный пакет 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 erthygl gyntaf).

O ganlyniad, byddwn yn cael y canlyniad hwn:
Ysgrifennu bot telegram yn R (rhan 3): Sut i ychwanegu cefnogaeth bysellfwrdd i bot

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(), из пакета 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], а в аргумент url dolen i'r erthygl: url = posts$link[x].

Nesaf, rydyn ni'n creu hidlydd, trinwyr ac yn lansio ein bot.

Casgliad

Теперь написанные вами боты будут значительно удобней в работе, за счёт того, что управление ими будет осуществляться с клавиатуры, а не вводом команд. Как минимум при взаимодействии с ботом через смартфон клавиатура ощутимо упростит процесс его использования.

В следующей статье мы разберёмся как строить логический диалог с ботом, и работать с базами данных.

Ffynhonnell: hab.com

Ychwanegu sylw