Sähkebotin kirjoittaminen R:ssä (osa 3): Kuinka lisätä näppäimistötukea bottiin

Tämä on kolmas artikkeli sarjassa "Sähkebotin kirjoittaminen R:ssä". Aiemmissa julkaisuissa opimme luomaan sähkebotin, lähettämään viestejä sen kautta, lisäsimme bottiin komentoja ja viestisuodattimia. Siksi, ennen kuin aloitat tämän artikkelin lukemisen, suosittelen, että luet sen Edellinen, koska Tässä en enää viivyttele aiemmin kuvattuissa botin rakentamisen perusteissa.

Tässä artikkelissa parannamme bottimme käytettävyyttä lisäämällä näppäimistön, joka tekee botin käyttöliittymästä intuitiivisen ja helppokäyttöisen.

Sähkebotin kirjoittaminen R:ssä (osa 3): Kuinka lisätä näppäimistötukea bottiin

Kaikki artikkelit sarjasta "Sähköbotin kirjoittaminen R:ssä"

  1. Luomme botin ja käytämme sitä viestien lähettämiseen sähkeissä
  2. Lisää komentotuki ja viestisuodattimet bottiin
  3. Kuinka lisätä näppäimistötukea bottiin

Pitoisuus

Jos olet kiinnostunut data-analyysistä, saatat olla kiinnostunut minun sähke и youtube kanavia. Suurin osa sisällöstä on omistettu R-kielelle.

  1. Minkä tyyppisiä näppäimistöjä telegram-botti tukee?
  2. Vastaa näppäimistö
  3. Sisäänrakennettu näppäimistö
    3.1. Esimerkki yksinkertaisesta robotista, joka tukee InLine-painikkeita
    3.2. Esimerkki robotista, joka raportoi valitun kaupungin nykyisen sään
    3.3. Esimerkki robotista, joka näyttää luettelon uusimmista artikkeleista ja linkit määritettyyn keskukseen osoitteesta habr.com
  4. Johtopäätös

Minkä tyyppisiä näppäimistöjä telegram-botti tukee?

Tätä kirjoitettaessa telegram.bot voit luoda kahdentyyppisiä näppäimistöjä:

  • Vastaa – Tavallinen päänäppäimistö, joka sijaitsee viestin tekstinsyöttöpaneelin alla. Tällainen näppäimistö yksinkertaisesti lähettää tekstiviestin bottiin, ja tekstinä se lähettää tekstin, joka on kirjoitettu itse painikkeeseen.
  • Inline - Tiettyyn bottiviestiin liittyvä näppäimistö. Tämä näppäimistö lähettää painikkeen painamiseen liittyvät bottitiedot; nämä tiedot voivat poiketa itse painikkeeseen kirjoitetusta tekstistä. Ja sellaiset painikkeet käsitellään läpi CallbackQueryHandler.

Jotta botti voi avata näppäimistön, se on välttämätöntä lähetettäessä viestiä menetelmän kautta sendMessage(), välitä aiemmin luotu näppäimistö argumenttina reply_markup.

Alla tarkastellaan useita esimerkkejä.

Vastaa näppäimistö

Kuten edellä kirjoitin, tämä on pääbotin ohjausnäppäimistö.

Esimerkki vastausnäppäimistön luomisesta virallisesta ohjeesta

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)

Yllä oleva on esimerkki paketin virallisesta ohjeesta telegram.bot. Voit luoda näppäimistön käyttämällä toimintoa ReplyKeyboardMarkup(), joka puolestaan ​​ottaa luettelon toiminnon luomista painikkeiden luetteloista KeyboardButton().

Miksi ReplyKeyboardMarkup() Onko sinun välitettävä luettelon lisäksi luettelo luetteloista? Tosiasia on, että ohitat pääluettelon ja määrität siinä jokaisen painikerivin erillisiksi luetteloiksi, koska Voit sijoittaa useita painikkeita samalle riville.

perustelu resize_keyboard voit valita automaattisesti optimaalisen näppäimistön painikkeiden koon ja argumentin one_time_keyboard voit piilottaa näppäimistön jokaisen painikkeen painalluksen jälkeen.

Kirjoitetaan yksinkertainen robotti, jossa on 3 painiketta:

  • Chat ID - Pyydä keskustelutunnusta botin kanssa
  • Nimeni - Pyydä nimeäsi
  • Kirjautumiseni - Pyydä käyttäjätunnustasi sähkeessä

Koodi 1: Yksinkertainen robotti Vastaus-näppäimistöllä

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

Suorita yllä oleva koodiesimerkki sen jälkeen, kun olet korvannut 'YOUR BOT TOKEN' oikealla tunnuksella, jonka sait luodessasi bottia BotIsä (Puhuin botin luomisesta ensimmäinen artikkeli).

Käynnistyksen jälkeen anna botille komento /start, koska Juuri tämän määritimme näppäimistön käynnistämiseksi.

Sähkebotin kirjoittaminen R:ssä (osa 3): Kuinka lisätä näppäimistötukea bottiin

Jos sinulla on tällä hetkellä vaikea jäsentää annettua koodiesimerkkiä menetelmien, suodattimien ja käsittelijöiden luomisen kanssa, sinun tulee palata edelliseen статье, jossa kuvailin tämän kaiken yksityiskohtaisesti.

Loimme 4 menetelmää:

  • aloita — Käynnistä näppäimistö
  • chat_id – Pyydä chat-tunnusta
  • my_name — Pyydä nimesi
  • my_username — Pyydä kirjautumistasi

Vastustaa Viestisuodattimet lisäsi 3 viestisuodatinta niiden tekstin perusteella:

  • chat_id — tekstiä sisältävät viestit "Чат ID"
  • nimi — Tekstiä sisältävät viestit "Моё имя"
  • käyttäjätunnus — Tekstiä sisältävät viestit "Мой логин"

Ja loimme 4 käsittelijää, jotka annettujen komentojen ja suodattimien perusteella suorittavat määritetyt menetelmät.

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

Itse näppäimistö luodaan menetelmän sisällä start() joukkue ReplyKeyboardMarkup().

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

Meidän tapauksessamme sijoitimme kaikki painikkeet toistensa alle, mutta voimme järjestää ne yhdeksi riviksi tekemällä muutoksia painikeluetteloon. Koska yksi rivi näppäimistön sisällä luodaan sisäkkäisen näppäinluettelon kautta, jolloin painikkeemme näyttämiseksi yhdellä rivillä meidän on kirjoitettava uudelleen osa koodista näppäimistön rakentamiseksi seuraavasti:

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

Sähkebotin kirjoittaminen R:ssä (osa 3): Kuinka lisätä näppäimistötukea bottiin

Näppäimistö lähetetään chattiin menetelmällä sendMessage(), argumentissa reply_markup.

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

Sisäänrakennettu näppäimistö

Kuten edellä kirjoitin, tekstin sisäinen näppäimistö on sidottu tiettyyn viestiin. Sen kanssa työskentely on hieman vaikeampaa kuin päänäppäimistön kanssa.

Aluksi sinun on lisättävä bottiin menetelmä kutsuaksesi Inline-näppäimistöä.

Vastataksesi upotetun painikkeen napsautukseen voit myös käyttää bot-menetelmää answerCallbackQuery(), joka voi näyttää ilmoituksen sähkeen käyttöliittymässä käyttäjälle, joka painaa Inline-painiketta.

Inline-painikkeesta lähetettävät tiedot eivät ole tekstiä, joten niiden käsittelemiseksi sinun on luotava erityinen käsittelijä komennolla CallbackQueryHandler().

Inline-näppäimistön rakentamisen koodi, joka annetaan paketin virallisessa ohjeessa telegram.bot.

Koodi sisäisen näppäimistön rakentamiseen virallisesta ohjeesta

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

Sinun on rakennettava sisäinen näppäimistö komennolla InlineKeyboardMarkup(), samalla periaatteella kuin Vastaa-näppäimistö. SISÄÄN InlineKeyboardMarkup() on tarpeen välittää luettelo Inline-painikkeiden luetteloista, jokainen yksittäinen painike on toiminnon luoma InlineKeyboardButton().

Inline-painike voi joko välittää tietoja botille argumentin avulla callback_datatai avaa mikä tahansa argumentilla määritetty HTML-sivu url.

Tuloksena on luettelo, jossa jokainen elementti on myös luettelo upotetuista painikkeista, jotka on yhdistettävä yhdeksi riviksi.

Seuraavaksi tarkastellaan useita esimerkkejä roboteista, joissa on Inline-painikkeita.

Esimerkki yksinkertaisesta robotista, joka tukee InLine-painikkeita

Ensin kirjoitamme botin covid-19:n pikatestausta varten. Käskyllä /test, se lähettää sinulle näppäimistön, jossa on kaksi painiketta, riippuen painetusta painikkeesta, se lähettää sinulle viestin, jossa on testitulokset.

Koodi 2: Yksinkertaisin robotti sisäänrakennetulla näppäimistöllä

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

Suorita yllä oleva koodiesimerkki sen jälkeen, kun olet korvannut 'YOUR BOT TOKEN' oikealla tunnuksella, jonka sait luodessasi bottia BotIsä (Puhuin botin luomisesta ensimmäinen artikkeli).

Результат:
Sähkebotin kirjoittaminen R:ssä (osa 3): Kuinka lisätä näppäimistötukea bottiin

Loimme kaksi menetelmää:

  • testi — Lähettääksesi chattiin Inline-näppäimistö
  • vastaus_cb — Käsitelläksesi näppäimistöltä lähetettyjä tietoja.

Kustakin painikkeesta lähetettävät tiedot määritetään argumentissa callback_data, kun luot painiketta. Voit vastaanottaa painikkeesta lähetetyt tiedot konstruktion avulla update$callback_query$data, menetelmän sisällä vastaus_cb.

Jotta botti reagoi Inline-näppäimistöön, menetelmä vastaus_cb erikoiskäsittelijän käsittelemä: CallbackQueryHandler(answer_cb). Joka suorittaa määritetyn menetelmän, kun Inline-painiketta napsautetaan. Käsittelijä CallbackQueryHandler vaatii kaksi argumenttia:

  • callback — Menetelmä, joka on suoritettava
  • pattern — Suodata tietojen mukaan, jotka on sidottu painikkeeseen argumentin avulla callback_data.

Näin ollen argumenttia käyttäen pattern Voimme kirjoittaa erillisen menetelmän kunkin painikkeen painamiseen:

Koodi 3: Erilliset menetelmät jokaiselle Inline-painikkeelle

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

Suorita yllä oleva koodiesimerkki sen jälkeen, kun olet korvannut 'YOUR BOT TOKEN' oikealla tunnuksella, jonka sait luodessasi bottia BotIsä (Puhuin botin luomisesta ensimmäinen artikkeli).

Nyt olemme kirjoittaneet 2 erillistä menetelmää, ts. yksi menetelmä jokaiselle painikkeen painallukselle ja käytti argumenttia pattern, kun luot käsittelijöitä:

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

Menetelmäkoodi päättyy vastaus_cb joukkue bot$answerCallbackQuery(callback_query_id = update$callback_query$id), joka kertoo botille, että tiedot on vastaanotettu upotetun näppäimistön kautta.

Esimerkki robotista, joka raportoi valitun kaupungin nykyisen sään

Yritetään kirjoittaa botti, joka pyytää säätietoja.

Sen työn logiikka on seuraava. Aluksi joukkueen toimesta /start kutsut päänäppäimistön, jossa on vain yksi "Sää"-painike. Napsauttamalla tätä painiketta saat Inline-näppäimistöllä viestin, jonka avulla voit valita kaupungin, jonka nykyisen sään haluat selvittää. Valitse yksi kaupungeista ja katso nykyinen sää.

Tässä koodiesimerkissä käytämme useita lisäpaketteja:

  • httr - HTTP-pyyntöjen kanssa työskentelyyn tarkoitettu paketti, jonka perusteella rakennetaan työ minkä tahansa API:n kanssa. Meidän tapauksessamme käytämme ilmaista API:ta openweathermap.org.
  • stringr - paketti tekstin kanssa työskentelyyn, meidän tapauksessamme käytämme sitä viestin luomiseen valitun kaupungin säästä.

Koodi 4: Botti, joka raportoi valitun kaupungin nykyisen sään

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

Suorita yllä oleva koodiesimerkki sen jälkeen, kun olet korvannut 'YOUR BOT TOKEN' oikealla tunnuksella, jonka sait luodessasi bottia BotIsä (Puhuin botin luomisesta ensimmäinen artikkeli).

Tämän seurauksena bottimme toimii seuraavasti:
Sähkebotin kirjoittaminen R:ssä (osa 3): Kuinka lisätä näppäimistötukea bottiin

Kaavamaisesti tämä botti voidaan kuvata seuraavasti:
Sähkebotin kirjoittaminen R:ssä (osa 3): Kuinka lisätä näppäimistötukea bottiin

Olemme luoneet 3 menetelmää, jotka ovat käytettävissä sääbotissamme:

  • Alkaa — Käynnistä botin päänäppäimistö
  • sää- — Käynnistä Inline-näppäimistö valitaksesi kaupungin
  • vastaus_cb — Päämenetelmä, joka pyytää säätietoja tietyn kaupungin API:lta ja lähettää sen chattiin.

menetelmä Alkaa käynnistämme sen komennolla /start, jonka käsittelijä toteuttaa CommandHandler('start', start).

Menetelmän suorittaminen sää- loimme samannimisen suodattimen:

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

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

}
)

Ja kutsumme tätä menetelmää seuraavalla viestinkäsittelijällä: MessageHandler(weather, filters = MessageFilters$weather).

Ja lopuksi tärkein menetelmämme vastaus_cb reagoi Inline-painikkeiden painamiseen, jonka toteuttaa erityinen käsittelijä: CallbackQueryHandler(answer_cb).

Menetelmän sisällä vastaus_cb, luemme näppäimistöltä lähetetyt tiedot ja kirjoitamme ne muuttujaan city: city <- update$callback_query$data. Sitten pyydämme säätietoja API:lta, luomme ja lähetämme viestin ja lopuksi käytämme menetelmää answerCallbackQuery ilmoittaaksemme botille, että olemme käsitelleet Inline-painikkeen napsautuksen.

Esimerkki robotista, joka näyttää luettelon viimeisimmistä artikkeleista ja linkit määritettyyn Hubiin will.com.

Esitän tämän botin näyttääkseni, kuinka voit näyttää Web-sivuille johtavia upotettuja painikkeita.

Tämän botin logiikka on samanlainen kuin edellisessä; aluksi käynnistämme päänäppäimistön komennolla /start. Seuraavaksi botti antaa meille luettelon kuudesta keskittimestä, joista valita, valitsemme kiinnostavan keskuksen ja vastaanotamme viisi viimeisintä julkaisua valitusta Hubista.

Kuten ymmärrät, tässä tapauksessa meidän on saatava luettelo artikkeleista, ja käytämme tätä varten erityistä pakettia habR, jonka avulla voit pyytää artikkeleita Habrasta ja joitain tilastoja niistä R:ssä.

Asenna paketti habR mahdollista vain githubista, jota varten tarvitset lisäpaketin devtools. Käytä alla olevaa koodia asentaaksesi.

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

Katsotaan nyt yllä kuvattua koodia botin rakentamiseen:

Koodi 5: Botti, joka näyttää luettelon valitun keskittimen viimeisimmistä artikkeleista

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

Suorita yllä oleva koodiesimerkki sen jälkeen, kun olet korvannut 'YOUR BOT TOKEN' oikealla tunnuksella, jonka sait luodessasi bottia BotIsä (Puhuin botin luomisesta ensimmäinen artikkeli).

Tuloksena saamme seuraavan tuloksen:
Sähkebotin kirjoittaminen R:ssä (osa 3): Kuinka lisätä näppäimistötukea bottiin

Koodasimme menetelmässä valittavissa olevien keskittimien luettelon 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)
}

Saamme luettelon artikkeleista määritetystä Hubista komennolla habr_hub_posts(), paketista habR. Samalla huomautamme, että emme tarvitse artikkeliluetteloa koko ajalta, vaan vain ensimmäisen sivun, jolla on 20 artikkelia. Tuloksena olevasta taulukosta komennolla head() Jätämme vain viisi parasta, jotka ovat uusimmat artikkelit.

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

Logiikka on hyvin samanlainen kuin edellinen botti, mutta tässä tapauksessa luomme upotetun näppäimistön artikkeliluettelolla dynaamisesti käyttämällä toimintoa lapply().

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

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

Lisäämme artikkelin otsikon painikkeen tekstiin posts$title[x], ja argumentissa url linkki artikkeliin: url = posts$link[x].

Seuraavaksi luomme suodattimen, käsittelijät ja käynnistämme bottimme.

Johtopäätös

Nyt kirjoittamasi botit ovat paljon mukavampia käyttää, koska niitä ohjataan näppäimistöltä komentojen sijaan. Ainakin kun olet vuorovaikutuksessa botin kanssa älypuhelimen kautta, näppäimistö yksinkertaistaa merkittävästi sen käyttöä.

Seuraavassa artikkelissa selvitetään, kuinka rakentaa looginen vuoropuhelu botin kanssa ja työskennellä tietokantojen kanssa.

Lähde: will.com

Lisää kommentti