Pisanje bota za telegram v R (3. del): Kako botu dodati podporo za tipkovnico

To je tretji članek v seriji "Pisanje bota za telegram v R". V prejšnjih publikacijah smo se naučili ustvariti telegramskega bota, prek njega pošiljati sporočila, botu dodali ukaze in filtre za sporočila. Zato, preden začnete brati ta članek, toplo priporočam, da ga preberete prejšnji, Ker Tukaj se ne bom več ukvarjal s prej opisanimi osnovami gradnje botov.

V tem članku bomo izboljšali uporabnost našega bota z dodajanjem tipkovnice, zaradi česar bo vmesnik bota intuitiven in enostaven za uporabo.

Pisanje bota za telegram v R (3. del): Kako botu dodati podporo za tipkovnico

Vsi članki iz serije “Pisanje telegram bota v R”

  1. Ustvarimo bota in ga uporabimo za pošiljanje sporočil v telegramu
  2. Botu dodajte podporo za ukaze in filtre sporočil
  3. Kako botu dodati podporo za tipkovnico

Vsebina

Če vas zanima analiza podatkov, vas bo morda zanimal moj telegram и youtube kanalov. Večina vsebine je posvečena jeziku R.

  1. Katere vrste tipkovnic podpira telegram bot?
  2. Tipkovnica za odgovor
  3. Vgrajena tipkovnica
    3.1. Primer preprostega bota s podporo za gumbe InLine
    3.2. Primer bota, ki sporoča trenutno vreme za izbrano mesto
    3.3. Primer bota, ki prikaže seznam najnovejših člankov s povezavami do navedenega središča s habr.com
  4. Zaključek

Katere vrste tipkovnic podpira telegram bot?

V času tega pisanja telegram.bot omogoča ustvarjanje dveh vrst tipkovnic:

  • Odgovori - glavna, običajna tipkovnica, ki se nahaja pod ploščo za vnos besedila sporočila. Takšna tipkovnica preprosto pošlje SMS sporočilo botu, kot besedilo pa bo poslalo besedilo, ki je napisano na samem gumbu.
  • V vrstici – tipkovnica, povezana z določenim sporočilom bota. Ta tipkovnica pošlje botu podatke, povezane s pritisnjenim gumbom; ti podatki se lahko razlikujejo od besedila, zapisanega na samem gumbu. In takšni gumbi so obdelani skozi CallbackQueryHandler.

Da bot odpre tipkovnico, je potrebno pri pošiljanju sporočila prek metode sendMessage(), posredujte predhodno ustvarjeno tipkovnico kot argument reply_markup.

Spodaj si bomo ogledali več primerov.

Tipkovnica za odgovor

Kot sem napisal zgoraj, je to glavna tipkovnica za nadzor botov.

Primer ustvarjanja Reply tipkovnice iz uradne pomoči

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)

Zgoraj je primer iz uradne pomoči za paket telegram.bot. Če želite ustvariti tipkovnico, uporabite funkcijo ReplyKeyboardMarkup(), ki nato prevzame seznam seznamov gumbov, ki jih ustvari funkcija KeyboardButton().

Zakaj ReplyKeyboardMarkup() Ali morate posredovati ne samo seznam, ampak seznam seznamov? Dejstvo je, da preidete glavni seznam in v njem določite vsako vrstico gumbov v ločenih seznamih, ker V eno vrstico lahko postavite več gumbov.

Prepir resize_keyboard omogoča samodejno izbiro optimalne velikosti gumbov na tipkovnici in argumenta one_time_keyboard vam omogoča, da skrijete tipkovnico po vsakem pritisku na gumb.

Napišimo preprostega bota, ki bo imel 3 gumbe:

  • ID klepeta - Zahtevaj ID klepeta za dialog z botom
  • Moje ime - zahtevajte svoje ime
  • Moja prijava - Zahtevajte svoje uporabniško ime v telegramu

Koda 1: Preprost bot s tipkovnico za odgovor

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()

Zaženite zgornji primer kode, potem ko ste zamenjali 'YOUR BOT TOKEN' s pravim žetonom, ki ste ga prejeli pri ustvarjanju bota prek BotOče (O ustvarjanju bota sem govoril v prvi članek).

Po zagonu dajte botu ukaz /start, Ker Točno to smo definirali za zagon tipkovnice.

Pisanje bota za telegram v R (3. del): Kako botu dodati podporo za tipkovnico

Če vam je trenutno težko razčleniti dani primer kode z ustvarjanjem metod, filtrov in obdelovalcev, se vrnite na prejšnjega članek, v katerem sem vse to podrobno opisal.

Ustvarili smo 4 metode:

  • start — Zaženite tipkovnico
  • chat_id — Zahtevajte ID klepeta
  • my_name — Zahtevajte svoje ime
  • my_username — Zahtevajte svojo prijavo

Ugovarjati MessageFilters dodal 3 filtre za sporočila glede na njihovo besedilo:

  • chat_id — Sporočila z besedilom "Чат ID"
  • ime — Sporočila z besedilom "Моё имя"
  • uporabniško ime — Sporočila z besedilom "Мой логин"

Ustvarili smo 4 upravljalnike, ki bodo na podlagi danih ukazov in filtrov izvajali navedene metode.

# создаём обработчики
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)

Sama tipkovnica je ustvarjena znotraj metode start() ekipa ReplyKeyboardMarkup().

RKM <- ReplyKeyboardMarkup(
    keyboard = list(
      list(KeyboardButton("Чат ID")),
      list(KeyboardButton("Моё имя")),
      list(KeyboardButton("Мой логин"))
    ),
    resize_keyboard = FALSE,
    one_time_keyboard = TRUE
)

V našem primeru smo vse gumbe postavili enega pod drugega, lahko pa jih uredimo v eno vrstico tako, da spremenimo seznam seznamov gumbov. Ker ena vrstica znotraj tipkovnice je ustvarjena z ugnezdenim seznamom gumbov, nato pa moramo za prikaz naših gumbov v eni vrstici prepisati del kode za sestavo tipkovnice, kot je ta:

RKM <- ReplyKeyboardMarkup(
    keyboard = list(
      list(
          KeyboardButton("Чат ID"),
          KeyboardButton("Моё имя"),
          KeyboardButton("Мой логин")
     )
    ),
    resize_keyboard = FALSE,
    one_time_keyboard = TRUE
)

Pisanje bota za telegram v R (3. del): Kako botu dodati podporo za tipkovnico

Tipkovnica se pošlje v klepet z metodo sendMessage(), v argumentu reply_markup.

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

Vgrajena tipkovnica

Kot sem napisal zgoraj, je tipkovnica Inline vezana na določeno sporočilo. Z njo je nekoliko težje delati kot z glavno tipkovnico.

Na začetku morate botu dodati metodo za klic vgrajene tipkovnice.

Če se želite odzvati na klik gumba Inline, lahko uporabite tudi metodo bota answerCallbackQuery(), ki lahko prikaže obvestilo v vmesniku telegrama uporabniku, ki pritisne gumb Inline.

Podatki, poslani z gumba Inline, niso besedilo, zato morate za njihovo obdelavo ustvariti poseben upravljalnik z ukazom CallbackQueryHandler().

Koda za izdelavo tipkovnice Inline, ki je podana v uradni pomoči paketa telegram.bot.

Koda za izdelavo tipkovnice Inline iz uradne pomoči

# 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)

Z ukazom morate sestaviti tipkovnico Inline InlineKeyboardMarkup(), po enakem principu kot tipkovnica za odgovor. IN InlineKeyboardMarkup() potrebno je posredovati seznam seznamov Inline gumbov, vsak posamezen gumb ustvari funkcija InlineKeyboardButton().

Gumb v vrstici lahko posreduje nekaj podatkov botu z uporabo argumenta callback_dataali odprite katero koli stran HTML, določeno z argumentom url.

Rezultat bo seznam, v katerem je vsak element tudi seznam Inline gumbov, ki jih je treba združiti v eno vrstico.

Nato si bomo ogledali nekaj primerov botov z gumbi Inline.

Primer preprostega bota s podporo za gumbe InLine

Najprej bomo napisali bota za ekspresno testiranje na covid-19. Po ukazu /test, vam bo poslal tipkovnico z dvema gumboma, odvisno od pritisnjenega gumba vam bo poslal sporočilo z rezultati vašega testiranja.

Koda 2: Najenostavnejši bot z vgrajeno tipkovnico

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()

Zaženite zgornji primer kode, potem ko ste zamenjali 'YOUR BOT TOKEN' s pravim žetonom, ki ste ga prejeli pri ustvarjanju bota prek BotOče (O ustvarjanju bota sem govoril v prvi članek).

Rezultat:
Pisanje bota za telegram v R (3. del): Kako botu dodati podporo za tipkovnico

Ustvarili smo dve metodi:

  • Test — Za pošiljanje v klepet Vgrajena tipkovnica
  • answer_cb — Za obdelavo podatkov, poslanih s tipkovnice.

Podatki, ki bodo poslani s posameznega gumba, so določeni v argumentu callback_data, ko ustvarjate gumb. Podatke, poslane z gumba, lahko prejmete s konstrukcijo update$callback_query$data, znotraj metode answer_cb.

Da se bot odzove na tipkovnico Inline, metoda answer_cb obdelan s posebnim upravljalnikom: CallbackQueryHandler(answer_cb). Ki zažene določeno metodo, ko kliknete gumb Inline. Voditelj CallbackQueryHandler sprejme dva argumenta:

  • callback — Metoda, ki jo je treba zagnati
  • pattern — Filtrirajte po podatkih, ki so vezani na gumb z uporabo argumenta callback_data.

V skladu s tem z uporabo argumenta pattern Za vsak gumb lahko napišemo ločen način:

Koda 3: Ločene metode za vsak gumb 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()

Zaženite zgornji primer kode, potem ko ste zamenjali 'YOUR BOT TOKEN' s pravim žetonom, ki ste ga prejeli pri ustvarjanju bota prek BotOče (O ustvarjanju bota sem govoril v prvi članek).

Zdaj smo napisali 2 ločeni metodi, tj. eno metodo za vsak pritisk na gumb in uporabil argument pattern, pri ustvarjanju njihovih upravljavcev:

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

Koda metode se konča answer_cb ekipa bot$answerCallbackQuery(callback_query_id = update$callback_query$id), ki botu sporoči, da so bili prejeti podatki z vgrajene tipkovnice.

Primer bota, ki sporoča trenutno vreme za izbrano mesto

Poskusimo napisati bota, ki zahteva vremenske podatke.

Logika njegovega dela bo naslednja. Sprva s strani ekipe /start pokličete glavno tipkovnico, ki ima samo en gumb »Vreme«. S klikom na ta gumb boste prejeli sporočilo z vgrajeno tipkovnico za izbiro mesta, za katerega želite izvedeti trenutno vreme. Izberite eno od mest in pridobite trenutno vreme.

V tem primeru kode bomo uporabili več dodatnih paketov:

  • httr — paket za delo z zahtevami HTTP, na podlagi katerega je zgrajeno delo s katerim koli API-jem. V našem primeru bomo uporabili brezplačen API openweathermap.org.
  • stringr — paket za delo z besedilom, v našem primeru ga bomo uporabili za ustvarjanje sporočila o vremenu v izbranem mestu.

Koda 4: Bot, ki poroča o trenutnem vremenu za izbrano mesto

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()

Zaženite zgornji primer kode, potem ko ste zamenjali 'YOUR BOT TOKEN' s pravim žetonom, ki ste ga prejeli pri ustvarjanju bota prek BotOče (O ustvarjanju bota sem govoril v prvi članek).

Posledično bo naš bot deloval nekako takole:
Pisanje bota za telegram v R (3. del): Kako botu dodati podporo za tipkovnico

Shematično je ta bot lahko prikazan takole:
Pisanje bota za telegram v R (3. del): Kako botu dodati podporo za tipkovnico

Ustvarili smo 3 metode, ki so na voljo v našem vremenskom robotu:

  • Začetek — Zaženite glavno botovo tipkovnico
  • vreme — Zaženite Inline keyboard, da izberete mesto
  • answer_cb — Glavna metoda, ki zahteva vreme od API-ja za dano mesto in ga pošlje v klepet.

Metoda Začetek zaženemo z ukazom /start, ki ga izvaja upravljavec CommandHandler('start', start).

Za zagon metode vreme ustvarili smo filter z istim imenom:

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

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

}
)

In to metodo pokličemo z naslednjim upravljalnikom sporočil: MessageHandler(weather, filters = MessageFilters$weather).

In na koncu naša glavna metoda answer_cb reagira na pritisk gumbov Inline, kar izvaja poseben upravljalnik: CallbackQueryHandler(answer_cb).

Znotraj metode answer_cb, preberemo podatke, poslane s tipkovnice, in jih zapišemo v spremenljivko city: city <- update$callback_query$data. Nato od API-ja zahtevamo vremenske podatke, ustvarimo in pošljemo sporočilo ter na koncu uporabimo metodo answerCallbackQuery da obvestimo bota, da smo obdelali klik gumba Inline.

Primer bota, ki prikaže seznam najnovejših člankov s povezavami do navedenega središča iz www.habr.com.

Predstavljam tega bota, da vam pokažem, kako prikazati gumbe Inline, ki vodijo do spletnih strani.

Logika tega bota je podobna prejšnjemu; na začetku z ukazom zaženemo glavno tipkovnico /start. Nato nam bot ponudi seznam 6 hubov, med katerimi lahko izbiramo, izberemo hub, ki nas zanima, in prejmemo 5 najnovejših objav iz izbranega Huba.

Kot razumete, moramo v tem primeru pridobiti seznam artiklov in za to bomo uporabili poseben paket habR, ki vam omogoča, da zahtevate članke iz Habre in nekaj statistike o njih v R.

Namesti paket habR možno samo iz githuba, za kar potrebujete dodaten paket devtools. Za namestitev uporabite spodnjo kodo.

install.packages('devtools')
devtools::install_github('selesnow/habR')

Zdaj pa si poglejmo kodo za izdelavo zgoraj opisanega bota:

Koda 5: bot, ki prikaže seznam najnovejših člankov v izbranem središču

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()

Zaženite zgornji primer kode, potem ko ste zamenjali 'YOUR BOT TOKEN' s pravim žetonom, ki ste ga prejeli pri ustvarjanju bota prek BotOče (O ustvarjanju bota sem govoril v prvi članek).

Kot rezultat bomo dobili ta rezultat:
Pisanje bota za telegram v R (3. del): Kako botu dodati podporo za tipkovnico

Trdo smo kodirali seznam vozlišč, ki so na voljo za izbiro v metodi 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)
}

Z ukazom dobimo seznam artiklov iz podanega Huba habr_hub_posts(), iz paketa habR. Ob tem opozarjamo, da ne potrebujemo seznama člankov za ves čas, temveč samo prvo stran, na kateri se nahaja 20 člankov. Iz dobljene tabele z ukazom head() Pustimo samo prvih 5, ki so najnovejši članki.

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

Logika je zelo podobna prejšnjemu botu, vendar v tem primeru ustvarimo vgrajeno tipkovnico s seznamom člankov dinamično z uporabo funkcije lapply().

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

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

V besedilo gumba vstavimo naslov članka posts$title[x], in v argumentu url povezava do članka: url = posts$link[x].

Nato ustvarimo filter, upravljalnike in zaženemo našega bota.

Zaključek

Zdaj bodo boti, ki jih pišete, veliko bolj priročni za uporabo, saj jih boste upravljali s tipkovnico in ne z vnosom ukazov. Vsaj pri interakciji z botom prek pametnega telefona bo tipkovnica bistveno poenostavila postopek njegove uporabe.

V naslednjem članku bomo ugotovili, kako zgraditi logičen dialog z botom in delati z bazami podatkov.

Vir: www.habr.com

Dodaj komentar