Pisanje telegram bota u R (3. dio): Kako dodati podršku za tipkovnicu botu

Ovo je treći članak u seriji “Pisanje telegram bota u R”. U prethodnim publikacijama naučili smo kako napraviti telegram bot, slati poruke preko njega, dodali komande i filtere poruka botu. Stoga, prije nego što počnete čitati ovaj članak, toplo preporučujem da pročitate prethodni, jer Ovdje se više neću zadržavati na prethodno opisanim osnovama izgradnje botova.

U ovom članku ćemo poboljšati upotrebljivost našeg bota dodavanjem tipkovnice, koja će sučelje bota učiniti intuitivnim i lakim za korištenje.

Pisanje telegram bota u R (3. dio): Kako dodati podršku za tipkovnicu botu

Svi članci iz serije “Pisanje telegram bota u R”

  1. Kreiramo bota i koristimo ga za slanje poruka u telegramu
  2. Dodajte podršku za komande i filtere poruka botu
  3. Kako dodati podršku za tastaturu botu

Sadržaj

Ako ste zainteresovani za analizu podataka, možda će vas zanimati moja telegram и youtube kanala. Većina sadržaja je posvećena R jeziku.

  1. Koje tipove tastatura podržava telegram bot?
  2. Tastatura za odgovor
  3. Inline tastatura
    3.1. Primjer jednostavnog bota s podrškom za InLine dugmad
    3.2. Primjer bota koji javlja trenutno vrijeme za odabrani grad
    3.3. Primjer bota koji prikazuje listu najnovijih članaka s vezama do navedenog Hub-a sa habr.com
  4. zaključak

Koje tipove tastatura podržava telegram bot?

U vrijeme pisanja ovog teksta telegram.bot omogućava vam da kreirate dve vrste tastatura:

  • Odgovor – Glavna, obična tastatura, koja se nalazi ispod panela za unos teksta poruke. Takva tastatura jednostavno šalje tekstualnu poruku botu, a kao tekst će poslati tekst koji je napisan na samom dugmetu.
  • Inline - tastatura povezana sa određenom porukom o botu. Ova tastatura šalje botu podatke povezane sa pritisnutim dugmetom; ovi podaci se mogu razlikovati od teksta napisanog na samom dugmetu. I takva dugmad se obrađuju CallbackQueryHandler.

Da bi bot otvorio tastaturu, potrebno je prilikom slanja poruke putem metode sendMessage(), proslijedite prethodno kreiranu tastaturu kao argument reply_markup.

U nastavku ćemo pogledati nekoliko primjera.

Tastatura za odgovor

Kao što sam gore napisao, ovo je glavna tastatura za kontrolu bota.

Primjer kreiranja tastature za odgovor iz službene 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)

Gore navedeno je primjer iz službene pomoći paketa telegram.bot. Da biste kreirali tastaturu, koristite funkciju ReplyKeyboardMarkup(), koji zauzvrat uzima listu lista dugmadi koje kreira funkcija KeyboardButton().

Zašto u ReplyKeyboardMarkup() Trebate li proslijediti ne samo listu, već listu lista? Činjenica je da prođete glavnu listu iu njoj svaki red dugmadi definirate u posebnim listama, jer Možete postaviti nekoliko dugmadi u jedan red.

Argument resize_keyboard omogućava vam da automatski odaberete optimalnu veličinu dugmadi na tastaturi i argument one_time_keyboard omogućava vam da sakrijete tastaturu nakon svakog pritiska na dugme.

Hajde da napišemo jednostavnog bota koji će imati 3 dugmeta:

  • Chat ID - Zahtjev za chat ID dijaloga sa botom
  • Moje ime - Zatražite svoje ime
  • Moja prijava - Zatražite svoje korisničko ime u telegramu

Kod 1: Jednostavan bot sa tastaturom 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()

Pokrenite gornji primjer koda, nakon što zamijenite 'YOUR BOT TOKEN' sa pravim tokenom koji ste dobili prilikom kreiranja bota putem BotFather (Razgovarao sam o stvaranju bota u prvi članak).

Nakon pokretanja, dajte botu komandu /start, jer To je upravo ono što smo definisali za pokretanje tastature.

Pisanje telegram bota u R (3. dio): Kako dodati podršku za tipkovnicu botu

Ako vam je trenutno teško raščlaniti dati primjer koda, uz kreiranje metoda, filtera i rukovatelja, onda se trebate vratiti na prethodni članak, u kojem sam sve ovo detaljno opisao.

Kreirali smo 4 metode:

  • start — Pokrenite tastaturu
  • chat_id — Zatražite ID za ćaskanje
  • my_name — Zatražite svoje ime
  • my_username — Zatražite svoju prijavu

Prigovoriti MessageFilters dodala 3 filtera poruka na osnovu njihovog teksta:

  • chat_id — Poruke sa tekstom "Чат ID"
  • ime — Poruke sa tekstom "Моё имя"
  • korisničko ime — Poruke sa tekstom "Мой логин"

I kreirali smo 4 rukovaoca koji će, na osnovu datih komandi i filtera, izvršavati 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 tastatura se kreira unutar metode start() tim ReplyKeyboardMarkup().

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

U našem slučaju, postavili smo sve dugmad jedno ispod drugog, ali možemo ih rasporediti u jedan red tako što ćemo napraviti izmene na listi lista dugmadi. Jer jedan red unutar tastature se kreira kroz ugniježđenu listu dugmadi, a zatim da bismo prikazali naše dugmad u jednom redu moramo prepisati dio koda za konstrukciju tastature ovako:

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

Pisanje telegram bota u R (3. dio): Kako dodati podršku za tipkovnicu botu

Tastatura se šalje u chat pomoću metode sendMessage(), u argumentu reply_markup.

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

Inline tastatura

Kao što sam gore napisao, Inline tastatura je vezana za određenu poruku. Sa njom je nešto teže raditi nego sa glavnom tastaturom.

U početku, morate dodati metodu botu za pozivanje Inline tipkovnice.

Da biste odgovorili na klik na dugme Inline, možete koristiti i metod bota answerCallbackQuery(), koji može prikazati obavještenje u interfejsu telegrama korisniku koji pritisne dugme Inline.

Podaci koji se šalju sa dugmeta Inline nisu tekst, tako da za njihovu obradu morate kreirati poseban rukovalac pomoću naredbe CallbackQueryHandler().

Kod za izradu Inline tastature koji je dat u službenoj pomoći paketa telegram.bot.

Kod za pravljenje inline tastature iz službene 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)

Morate da napravite inline tastaturu koristeći naredbu InlineKeyboardMarkup(), po istom principu kao i tastatura za odgovor. IN InlineKeyboardMarkup() potrebno je proći listu lista Inline dugmadi, svako pojedinačno dugme kreira funkcija InlineKeyboardButton().

Ugrađeno dugme može ili prenijeti neke podatke botu koristeći argument callback_data, ili otvorite bilo koju HTML stranicu navedenu koristeći argument url.

Rezultat će biti lista u kojoj je svaki element ujedno i lista Inline dugmadi koje je potrebno kombinirati u jedan red.

Zatim ćemo pogledati nekoliko primjera botova s ​​ugrađenim gumbima.

Primjer jednostavnog bota s podrškom za InLine dugmad

Prvo ćemo napisati bota za ekspresno testiranje na covid-19. Po komandi /test, poslaće vam tastaturu sa dva dugmeta, u zavisnosti od pritiska na dugme, poslaće vam poruku sa rezultatima vašeg testiranja.

Kod 2: Najjednostavniji bot sa ugrađenom tastaturom

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

Pokrenite gornji primjer koda, nakon što zamijenite 'YOUR BOT TOKEN' sa pravim tokenom koji ste dobili prilikom kreiranja bota putem BotFather (Razgovarao sam o stvaranju bota u prvi članak).

Rezultat:
Pisanje telegram bota u R (3. dio): Kako dodati podršku za tipkovnicu botu

Napravili smo dvije metode:

  • test — Za slanje na ćaskanje Inline tastatura
  • answer_cb — Za obradu podataka poslatih sa tastature.

Podaci koji će biti poslati sa svakog dugmeta navedeni su u argumentu callback_data, prilikom kreiranja dugmeta. Možete primiti podatke poslane sa dugmeta koristeći konstrukciju update$callback_query$data, unutar metode answer_cb.

Metoda da bot reaguje na inline tastaturu answer_cb obrađuje poseban rukovalac: CallbackQueryHandler(answer_cb). Koji pokreće navedenu metodu kada se klikne na dugme Inline. Handler CallbackQueryHandler uzima dva argumenta:

  • callback — Metoda koju treba pokrenuti
  • pattern — Filtrirajte prema podacima koji su vezani za dugme pomoću argumenta callback_data.

Shodno tome, koristeći argument pattern Možemo napisati posebnu metodu za pritiskanje svakog dugmeta:

Kod 3: Odvojene metode za svako dugme u liniji

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

Pokrenite gornji primjer koda, nakon što zamijenite 'YOUR BOT TOKEN' sa pravim tokenom koji ste dobili prilikom kreiranja bota putem BotFather (Razgovarao sam o stvaranju bota u prvi članak).

Sada smo napisali 2 odvojene metode, tj. jedan metod, za svaki pritisak na dugme, i koristio argument pattern, prilikom kreiranja njihovih rukovatelja:

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

Šifra metode završava answer_cb tim bot$answerCallbackQuery(callback_query_id = update$callback_query$id), koji govori botu da su primljeni podaci sa ugrađene tastature.

Primjer bota koji javlja trenutno vrijeme za odabrani grad

Pokušajmo napisati bota koji traži podatke o vremenu.

Logika njegovog rada bit će sljedeća. U početku od strane tima /start pozivate glavnu tastaturu, koja ima samo jedno dugme „Vreme“. Klikom na ovo dugme dobićete poruku sa Inline tastaturom da odaberete grad za koji želite da saznate trenutno vreme. Odaberite jedan od gradova i saznajte trenutno vrijeme.

U ovom primjeru koda koristit ćemo nekoliko dodatnih paketa:

  • httr — paket za rad sa HTTP zahtjevima, na osnovu kojeg se gradi rad sa bilo kojim API-jem. U našem slučaju koristićemo besplatni API openweathermap.org.
  • stringr — paket za rad sa tekstom, u našem slučaju ćemo ga koristiti za generiranje poruke o vremenu u odabranom gradu.

Šifra 4: Bot koji javlja trenutno vrijeme za odabrani grad

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

Pokrenite gornji primjer koda, nakon što zamijenite 'YOUR BOT TOKEN' sa pravim tokenom koji ste dobili prilikom kreiranja bota putem BotFather (Razgovarao sam o stvaranju bota u prvi članak).

Kao rezultat, naš bot će raditi otprilike ovako:
Pisanje telegram bota u R (3. dio): Kako dodati podršku za tipkovnicu botu

Šematski, ovaj bot se može prikazati ovako:
Pisanje telegram bota u R (3. dio): Kako dodati podršku za tipkovnicu botu

Napravili smo 3 metode dostupne unutar našeg vremenskog bota:

  • start — Pokrenite glavnu tastaturu za bot
  • vrijeme — Pokrenite Inline tastaturu da odaberete grad
  • answer_cb — Glavni metod koji traži vremensku prognozu od API-ja za dati grad i šalje ga u chat.

Metoda start pokrećemo ga komandom /start, koji implementira rukovalac CommandHandler('start', start).

Za pokretanje metode vrijeme kreirali smo filter istog imena:

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

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

}
)

I mi pozivamo ovu metodu sa sljedećim rukovaocem poruka: MessageHandler(weather, filters = MessageFilters$weather).

I na kraju, naša glavna metoda answer_cb reaguje na pritiskanje Inline dugmadi, koje implementira poseban rukovalac: CallbackQueryHandler(answer_cb).

Unutar metode answer_cb, čitamo podatke poslane sa tastature i zapisujemo ih u varijablu city: city <- update$callback_query$data. Zatim tražimo podatke o vremenu od API-ja, generiramo i šaljemo poruku i na kraju koristimo metodu answerCallbackQuery kako bismo obavijestili bota da smo obradili klik na dugme Inline.

Primjer bota koji prikazuje listu najnovijih članaka s vezama do navedenog Hub-a www.habr.com.

Predstavljam ovog bota da vam pokažem kako da prikažete Inline dugmad koja vode do web stranica.

Logika ovog bota je slična prethodnoj; u početku naredbom pokrećemo glavnu tastaturu /start. Zatim, bot nam daje listu od 6 čvorišta koje možemo izabrati, mi biramo čvorište koje nas zanima i primamo 5 najnovijih publikacija sa odabranog Hub-a.

Kao što razumijete, u ovom slučaju moramo dobiti listu članaka, a za to ćemo koristiti poseban paket habR, koji vam omogućava da zatražite članke od Habre i neke statistike o njima u R.

Instaliraj paket habR moguće samo sa githuba, za šta će vam trebati dodatni paket devtools. Za instalaciju koristite kod ispod.

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

Sada pogledajmo kod za izgradnju gore opisanog bota:

Kod 5: bot koji prikazuje listu najnovijih članaka na odabranom Hub-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()

Pokrenite gornji primjer koda, nakon što zamijenite 'YOUR BOT TOKEN' sa pravim tokenom koji ste dobili prilikom kreiranja bota putem BotFather (Razgovarao sam o stvaranju bota u prvi članak).

Kao rezultat, dobit ćemo ovaj rezultat:
Pisanje telegram bota u R (3. dio): Kako dodati podršku za tipkovnicu botu

Čvrsto smo kodirali listu čvorišta dostupnih za odabir u 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)
}

Dobijamo listu članaka iz navedenog Hub-a pomoću naredbe habr_hub_posts(), iz paketa habR. Istovremeno, ističemo da nam nije potrebna lista članaka za cijelo vrijeme, već samo prva stranica na kojoj se nalazi 20 članaka. Iz rezultirajuće tablice pomoću naredbe head() Ostavljamo samo prvih 5, a to su najnoviji članci.

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

Logika je vrlo slična prethodnom botu, ali u ovom slučaju generišemo Inline tastaturu sa listom članaka dinamički koristeći funkciju lapply().

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

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

U tekst dugmeta ubacujemo naslov članka posts$title[x], iu argumentu url link na članak: url = posts$link[x].

Zatim kreiramo filter, rukovaoce i pokrećemo našeg bota.

zaključak

Sada će botovi koje pišete biti mnogo praktičniji za korištenje, zbog činjenice da će se njima upravljati s tastature, a ne unosom komandi. U najmanju ruku, kada komunicirate s botom putem pametnog telefona, tastatura će značajno pojednostaviti proces korištenja.

U sljedećem članku ćemo shvatiti kako izgraditi logički dijalog s botom i raditi s bazama podataka.

izvor: www.habr.com

Dodajte komentar