Telegram bot írása R-ben (3. rész): Hogyan adhatunk billentyűzet támogatást egy bothoz

Ez a harmadik cikk a „Telegram bot írása R-ben” sorozatban. A korábbi publikációkban megtanultuk, hogyan lehet táviratbotot létrehozni, üzeneteket küldeni rajta, parancsokat és üzenetszűrőket adtunk hozzá a bothoz. Ezért, mielőtt elkezdi olvasni ezt a cikket, nagyon ajánlom, hogy olvassa el előző, mert Itt most nem fogok tovább foglalkozni a botépítés korábban leírt alapjaival.

Ebben a cikkben egy billentyűzet hozzáadásával javítjuk a robotunk használhatóságát, amely intuitív és könnyen használhatóvá teszi a bot felületét.

Telegram bot írása R-ben (3. rész): Hogyan adhatunk billentyűzet támogatást egy bothoz

Az összes cikk a „Telegram bot írása R-ben” sorozatból

  1. Létrehozunk egy botot, és ezzel üzeneteket küldünk táviratban
  2. Parancstámogatás és üzenetszűrők hozzáadása a bothoz
  3. Hogyan adhatunk billentyűzet támogatást egy bothoz

Tartalom

Ha érdekel az adatelemzés, akkor az én oldalam is érdekelheti távirat и youtube csatornák. A tartalom nagy része az R nyelvnek szól.

  1. Milyen típusú billentyűzeteket támogat a telegram bot?
  2. Válasz billentyűzet
  3. Beépített billentyűzet
    3.1. Példa egy egyszerű botra, amely támogatja az InLine gombokat
    3.2. Példa egy robotra, amely egy kiválasztott város aktuális időjárását jelenti
    3.3. Példa egy robotra, amely megjeleníti a legfrissebb cikkek listáját a megadott Hub-ra mutató hivatkozásokkal a habr.com webhelyről
  4. Következtetés

Milyen típusú billentyűzeteket támogat a telegram bot?

Jelen írás idején telegram.bot kétféle billentyűzet létrehozását teszi lehetővé:

  • Válasz – A fő, normál billentyűzet, amely az üzenet szövegbeviteli panelje alatt található. Egy ilyen billentyűzet egyszerűen szöveges üzenetet küld a botnak, és szövegként azt a szöveget küldi el, amely magára a gombra van írva.
  • Inline – Egy adott botüzenethez társított billentyűzet. Ez a billentyűzet elküldi a megnyomott gombhoz tartozó botadatokat; ezek az adatok eltérhetnek a gombon lévő szövegtől. És az ilyen gombokat feldolgozzák CallbackQueryHandler.

Ahhoz, hogy a bot megnyithassa a billentyűzetet, ez szükséges, amikor üzenetet küld a módszerrel sendMessage(), adja át a korábban létrehozott billentyűzetet argumentumként reply_markup.

Az alábbiakban néhány példát nézünk meg.

Válasz billentyűzet

Ahogy fentebb is írtam, ez a fő botvezérlő billentyűzet.

Példa válasz-billentyűzet létrehozására a hivatalos súgóból

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)

A fenti egy példa a csomag hivatalos súgójából telegram.bot. Billentyűzet létrehozásához használja a funkciót ReplyKeyboardMarkup(), amely viszont a funkció által létrehozott gombok listáját tartalmazza KeyboardButton().

Miért ReplyKeyboardMarkup() Nem csak egy listát kell átadnia, hanem egy listát is? A helyzet az, hogy átadja a fő listát, és abban minden gombsort külön listákban határoz meg, mert Egy sorban több gombot is elhelyezhet.

Érv resize_keyboard lehetővé teszi a billentyűzet gombjainak optimális méretének és argumentumának automatikus kiválasztását one_time_keyboard lehetővé teszi a billentyűzet elrejtését minden gombnyomás után.

Írjunk egy egyszerű botot, aminek 3 gombja lesz:

  • Chat ID – A bottal folytatott párbeszéd csevegési azonosítójának kérése
  • A nevem – Kérje a nevét
  • Saját bejelentkezés - Kérje felhasználónevét táviratban

1. kód: Egyszerű bot Válasz billentyűzettel

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

Futtassa a fenti kódpéldát, miután lecserélte a „YOUR BOT TOKEN” szót arra a valódi tokenre, amelyet a bot létrehozásakor kapott BotFather (A bot létrehozásáról beszéltem első cikk).

Az indítás után adjon parancsot a botnak /start, mert Pontosan ezt határoztuk meg a billentyűzet elindításához.

Telegram bot írása R-ben (3. rész): Hogyan adhatunk billentyűzet támogatást egy bothoz

Ha pillanatnyilag nehezen tudja értelmezni az adott kódpéldát metódusok, szűrők és kezelők létrehozásával, akkor térjen vissza az előzőhöz cikk, amelyben mindezt részletesen leírtam.

4 módszert hoztunk létre:

  • start — A billentyűzet elindítása
  • chat_id – Csevegésazonosító kérése
  • my_name — Kérje el a nevét
  • my_username — Kérje bejelentkezési adatait

Tiltakozni Üzenetszűrők hozzáadott 3 üzenetszűrőt a szövegük alapján:

  • chat_id – Üzenetek szöveggel "Чат ID"
  • név — szöveges üzenetek "Моё имя"
  • felhasználónév — szöveges üzenetek "Мой логин"

És létrehoztunk 4 kezelőt, amelyek a megadott parancsok és szűrők alapján végrehajtják a megadott metódusokat.

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

Maga a billentyűzet a metóduson belül jön létre start() csapat ReplyKeyboardMarkup().

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

Esetünkben az összes gombot egymás alá helyeztük, de a gomblisták listáját módosítva egy sorba is rendezhetjük. Mert A billentyűzeten belül egy sor egy beágyazott gomblistán keresztül jön létre, majd ahhoz, hogy gombjainkat egy sorban jelenítsük meg, át kell írnunk a kód egy részét a billentyűzet felépítéséhez, így:

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

Telegram bot írása R-ben (3. rész): Hogyan adhatunk billentyűzet támogatást egy bothoz

A billentyűzet a módszerrel kerül elküldésre a chatbe sendMessage(), az érvelésben reply_markup.

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

Beépített billentyűzet

Ahogy fentebb írtam, az Inline billentyűzet egy adott üzenethez van kötve. Valamivel nehezebb vele dolgozni, mint a fő billentyűzettel.

Kezdetben hozzá kell adni egy módszert a bothoz az Inline billentyűzet meghívásához.

Ha válaszolni szeretne egy Inline gombra kattintásra, használhatja a bot módszert is answerCallbackQuery(), amely értesítést jeleníthet meg a távirati felületen az Inline gombot megnyomó felhasználó számára.

Az Inline gombról küldött adatok nem szövegesek, így azok feldolgozásához speciális kezelőt kell létrehozni a paranccsal CallbackQueryHandler().

Az Inline billentyűzet elkészítésének kódja, amely a csomag hivatalos súgójában található telegram.bot.

Inline billentyűzet készítésének kódja a hivatalos súgóból

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

A parancs segítségével be kell építeni egy Inline billentyűzetet InlineKeyboardMarkup(), ugyanazon az elven, mint a Válasz billentyűzet. BAN BEN InlineKeyboardMarkup() át kell adni az Inline gombok listáját, minden egyes gombot a funkció hozza létre InlineKeyboardButton().

Egy soron belüli gomb argumentum segítségével adhat át adatokat a botnak callback_data, vagy nyissa meg az argumentummal megadott bármely HTML-oldalt url.

Az eredmény egy lista lesz, amelyben minden elem egyben egy sorba egyesítendő Inline gombok listája is.

A következőkben számos példát tekintünk meg az Inline gombokkal rendelkező robotokra.

Példa egy egyszerű botra, amely támogatja az InLine gombokat

Először is írunk egy robotot a Covid-19 expressz teszteléséhez. Parancs alapján /test, küld Önnek egy két gombos billentyűzetet, a megnyomott gombtól függően üzenetet küld a tesztelés eredményével.

2. kód: A legegyszerűbb bot Inline billentyűzettel

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

Futtassa a fenti kódpéldát, miután lecserélte a „YOUR BOT TOKEN” szót arra a valódi tokenre, amelyet a bot létrehozásakor kapott BotFather (A bot létrehozásáról beszéltem első cikk).

Eredmény:
Telegram bot írása R-ben (3. rész): Hogyan adhatunk billentyűzet támogatást egy bothoz

Két módszert hoztunk létre:

  • teszt – Csevegésbe küldése Inline billentyűzet
  • válasz_cb — A billentyűzetről küldött adatok feldolgozásához.

Az egyes gombokról küldendő adatok az argumentumban vannak megadva callback_data, gomb létrehozásakor. A gombról küldött adatokat a konstrukció segítségével fogadhatja update$callback_query$data, a módszeren belül válasz_cb.

Ahhoz, hogy a bot reagáljon az Inline billentyűzetre, módszer válasz_cb speciális kezelő által feldolgozva: CallbackQueryHandler(answer_cb). Amely az Inline gombra kattintva a megadott metódust futtatja. Kezelő CallbackQueryHandler két érvet vesz fel:

  • callback — A módszer, amelyet le kell futtatni
  • pattern — Szűrés a gombhoz kötött adatok alapján argumentum segítségével callback_data.

Ennek megfelelően az érvelést felhasználva pattern Minden gombnyomásra külön módszert írhatunk:

3. kód: Külön módszer minden Inline gombhoz

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

Futtassa a fenti kódpéldát, miután lecserélte a „YOUR BOT TOKEN” szót arra a valódi tokenre, amelyet a bot létrehozásakor kapott BotFather (A bot létrehozásáról beszéltem első cikk).

Most 2 külön módszert írtunk i.e. egy módszert minden gombnyomásra, és használta az argumentumot pattern, kezelőik létrehozásakor:

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

A módszer kódja véget ér válasz_cb csapat bot$answerCallbackQuery(callback_query_id = update$callback_query$id), amely közli a bottal, hogy a beépített billentyűzetről származó adatok érkeztek.

Példa egy robotra, amely egy kiválasztott város aktuális időjárását jelenti

Próbáljunk meg írni egy botot, amely időjárási adatokat kér.

Munkájának logikája a következő lesz. Kezdetben a csapat által /start hívja a fő billentyűzetet, amelyen csak egy „Időjárás” gomb van. Erre a gombra kattintva üzenetet kap az Inline billentyűzettel, hogy válassza ki azt a várost, amelynek aktuális időjárását szeretné megtudni. Válasszon egyet a városok közül, és tekintse meg az aktuális időjárást.

Ebben a kódpéldában több további csomagot fogunk használni:

  • httr — egy csomag a HTTP kérésekkel való munkavégzéshez, amely alapján bármilyen API-val való munka épül. Esetünkben az ingyenes API-t fogjuk használni openweathermap.org.
  • stringr — egy csomag szöveggel való munkához, esetünkben ezzel fogunk üzenetet generálni a kiválasztott város időjárásáról.

4-es kód: Egy bot, amely a kiválasztott város aktuális időjárását jelenti

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

Futtassa a fenti kódpéldát, miután lecserélte a „YOUR BOT TOKEN” szót arra a valódi tokenre, amelyet a bot létrehozásakor kapott BotFather (A bot létrehozásáról beszéltem első cikk).

Ennek eredményeként a robotunk a következőképpen fog működni:
Telegram bot írása R-ben (3. rész): Hogyan adhatunk billentyűzet támogatást egy bothoz

Sematikusan ez a bot a következőképpen ábrázolható:
Telegram bot írása R-ben (3. rész): Hogyan adhatunk billentyűzet támogatást egy bothoz

Három módszert hoztunk létre az időjárás-robotunkon belül:

  • kezdet — Indítsa el a fő bot-billentyűzetet
  • időjárás — Indítsa el az Inline billentyűzetet a város kiválasztásához
  • válasz_cb — A fő módszer, amely lekéri az időjárást az API-tól egy adott városhoz, és elküldi a chatnek.

módszer kezdet paranccsal elindítjuk /start, amelyet a kezelő valósít meg CommandHandler('start', start).

Egy módszer futtatásához időjárás létrehoztunk egy azonos nevű szűrőt:

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

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

}
)

És ezt a metódust a következő üzenetkezelővel hívjuk: MessageHandler(weather, filters = MessageFilters$weather).

És a végén a fő módszerünk válasz_cb reagál az Inline gombok megnyomására, amelyet egy speciális kezelő valósít meg: CallbackQueryHandler(answer_cb).

Egy módszer belsejében válasz_cb, beolvassuk a billentyűzetről küldött adatokat és beírjuk egy változóba city: city <- update$callback_query$data. Ezután kérünk időjárási adatokat az API-tól, generálunk és küldünk egy üzenetet, végül használjuk a metódust answerCallbackQuery annak érdekében, hogy tájékoztassuk a botot, hogy feldolgoztuk az Inline gomb kattintását.

Példa egy robotra, amely megjeleníti a legfrissebb cikkek listáját a megadott központra mutató hivatkozásokkal will.com.

Ezt a botot azért mutatom be, hogy megmutassam, hogyan jeleníthetők meg a weboldalakra vezető Inline gombok.

Ennek a botnak a logikája hasonló az előzőhöz, kezdetben a fő billentyűzetet indítjuk el a paranccsal /start. Ezután a bot megad egy listát, amely 6 központ közül választhat, mi kiválasztjuk a minket érdeklő hubot, és megkapjuk a kiválasztott Hub 5 legfrissebb kiadványát.

Amint megérti, ebben az esetben meg kell szereznünk a cikkek listáját, és ehhez egy speciális csomagot fogunk használni habR, amely lehetővé teszi cikkek kérését a Habrától és néhány statisztikát az R-ben.

Telepítse a csomagot habR csak githubból lehetséges, amihez szükség lesz egy kiegészítő csomagra devtools. A telepítéshez használja az alábbi kódot.

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

Most nézzük meg a fent leírt bot felépítésének kódját:

5. kód: Egy bot, amely megjeleníti a kiválasztott Hub legfrissebb cikkeinek listáját

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

Futtassa a fenti kódpéldát, miután lecserélte a „YOUR BOT TOKEN” szót arra a valódi tokenre, amelyet a bot létrehozásakor kapott BotFather (A bot létrehozásáról beszéltem első cikk).

Ennek eredményeként a következő eredményt kapjuk:
Telegram bot írása R-ben (3. rész): Hogyan adhatunk billentyűzet támogatást egy bothoz

A metódusban kiválasztható Hubok listáját keményen kódoltuk 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)
}

A paranccsal megkapjuk a cikkek listáját a megadott Hubról habr_hub_posts(), a csomagból habR. Ugyanakkor felhívjuk a figyelmet arra, hogy nem a teljes időre vonatkozó cikklistára van szükségünk, hanem csak az első oldalra, amelyen 20 cikk található. Az eredményül kapott táblázatból a paranccsal head() Csak az első 5-öt hagyjuk meg, amelyek a legfrissebb cikkek.

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

A logika nagyon hasonló az előző bothoz, de ebben az esetben dinamikusan generálunk egy Inline billentyűzetet cikkek listájával a függvény segítségével lapply().

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

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

A gomb szövegébe beillesztjük a cikk címét posts$title[x], és az érvelésben url link a cikkhez: url = posts$link[x].

Ezután létrehozunk egy szűrőt, kezelőket, és elindítjuk a botunkat.

Következtetés

Mostantól sokkal kényelmesebb lesz az Ön által írt robotok használata, mivel a billentyűzetről vezérelhetők, nem pedig parancsok beírásával. Ha egy bottal okostelefonon keresztül kommunikál, a billentyűzet jelentősen leegyszerűsíti a használat folyamatát.

A következő cikkben kitaláljuk, hogyan építhetünk fel logikai párbeszédet egy bottal és hogyan dolgozhatunk adatbázisokkal.

Forrás: will.com

Hozzászólás