Að skrifa símskeyti botni í R (hluti 3): Hvernig á að bæta lyklaborðsstuðningi við vélmenni

Þetta er þriðja greinin í röðinni „Að skrifa símskeyti láni í R“. Í fyrri útgáfum lærðum við hvernig á að búa til símskeyti botni, senda skilaboð í gegnum hann, bæta skipunum og skilaboðasíur við botninn. Þess vegna, áður en þú byrjar að lesa þessa grein, mæli ég eindregið með því að þú lesir fyrri, vegna þess Hér mun ég ekki lengur dvelja við áður lýst grunnatriði botnabyggingar.

Í þessari grein munum við bæta notagildi botni okkar með því að bæta við lyklaborði, sem mun gera botniviðmótið leiðandi og auðvelt í notkun.

Að skrifa símskeyti botni í R (hluti 3): Hvernig á að bæta lyklaborðsstuðningi við vélmenni

Allar greinar úr seríunni „Að skrifa símskeyti láni í R“

  1. Við búum til bot og notum það til að senda skilaboð í símskeyti
  2. Bættu stjórnunarstuðningi og skilaboðasíum við botninn
  3. Hvernig á að bæta lyklaborðsstuðningi við vélmenni

efni

Ef þú hefur áhuga á gagnagreiningu gætirðu haft áhuga á mínum símskeyti и YouTube rásir. Mest af efninu er tileinkað R tungumálinu.

  1. Hvaða gerðir af lyklaborðum styður símskeyti botninn?
  2. Svara lyklaborð
  3. Innbyggt lyklaborð
    3.1. Dæmi um einfaldan vélmenni með stuðningi fyrir InLine hnappa
    3.2. Dæmi um vélmenni sem tilkynnir núverandi veður fyrir valda borg
    3.3. Dæmi um vélmenni sem sýnir lista yfir nýjustu greinarnar með tenglum á tilgreinda Hub frá habr.com
  4. Ályktun

Hvaða gerðir af lyklaborðum styður símskeyti botninn?

Þegar þetta er skrifað telegram.bot gerir þér kleift að búa til tvær tegundir af lyklaborðum:

  • Svar - Aðallyklaborðið, sem er staðsett undir innsláttarspjaldinu fyrir skilaboð. Slíkt lyklaborð sendir einfaldlega textaskilaboð til botnsins og sem texti mun það senda textann sem er skrifaður á hnappinn sjálfan.
  • Innbyggt - Lyklaborð tengt tilteknum botnaskilaboðum. Þetta lyklaborð sendir lánagögnin sem tengjast hnappinum sem ýtt er á; þessi gögn geta verið frábrugðin textanum sem skrifaður er á hnappinn sjálfan. Og slíkir hnappar eru unnar í gegnum CallbackQueryHandler.

Til þess að botninn geti opnað lyklaborðið er það nauðsynlegt þegar þú sendir skilaboð í gegnum aðferðina sendMessage(), sendu lyklaborðið sem áður var búið til sem rök reply_markup.

Hér að neðan munum við skoða nokkur dæmi.

Svara lyklaborð

Eins og ég skrifaði hér að ofan, þá er þetta aðal stjórnunarlyklaborðið.

Dæmi um að búa til svarlyklaborð frá opinberu hjálpinni

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)

Ofangreint er dæmi frá opinberri aðstoð pakkans telegram.bot. Notaðu aðgerðina til að búa til lyklaborð ReplyKeyboardMarkup(), sem aftur tekur lista yfir lista yfir hnappa sem eru búnir til með aðgerðinni KeyboardButton().

Af hverju í ReplyKeyboardMarkup() Þarftu að standast ekki bara lista heldur lista yfir lista? Staðreyndin er sú að þú ferð framhjá aðallistanum og í honum skilgreinirðu hverja röð af hnöppum í aðskildum listum, vegna þess að Þú getur sett nokkra hnappa í einni röð.

Rök resize_keyboard gerir þér kleift að velja sjálfkrafa bestu stærð lyklaborðshnappa og rökin one_time_keyboard gerir þér kleift að fela lyklaborðið eftir hverja hnappsýtingu.

Við skulum skrifa einfaldan vélmenni sem mun hafa 3 hnappa:

  • Spjallauðkenni - Biddu um spjallauðkenni samræðna við lánamann
  • Nafn mitt - Biddu um nafn þitt
  • Innskráningin mín - Biddu um notandanafn þitt í símskeyti

Kóði 1: Einfaldur láni með svarlyklaborði

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

Keyrðu kóðadæmið hér að ofan, eftir að hafa skipt út 'YOUR BOT TOKEN' fyrir raunverulega táknið sem þú fékkst þegar þú bjóst til botninn í gegnum BotFaðir (Ég talaði um að búa til vélmenni í fyrstu grein).

Eftir ræsingu, gefðu botni skipun /start, vegna þess Þetta er nákvæmlega það sem við skilgreindum til að ræsa lyklaborðið.

Að skrifa símskeyti botni í R (hluti 3): Hvernig á að bæta lyklaborðsstuðningi við vélmenni

Ef í augnablikinu er erfitt fyrir þig að flokka tiltekið kóðadæmi, með því að búa til aðferðir, síur og meðhöndlun, þá ættir þú að fara aftur í það fyrra grein, þar sem ég lýsti þessu öllu í smáatriðum.

Við bjuggum til 4 aðferðir:

  • byrja — Ræstu lyklaborðið
  • chat_id — Biðja um spjallauðkenni
  • mitt_nafn — Biðjið um nafnið þitt
  • my_username - Biddu um innskráningu þína

Að mótmæla Skilaboðasíur bætt við 3 skilaboðasíur byggðar á texta þeirra:

  • chat_id — Skilaboð með texta "Чат ID"
  • nafn — Skilaboð með texta "Моё имя"
  • notendanafn — Skilaboð með texta "Мой логин"

Og við bjuggum til 4 meðhöndlara sem, byggt á tilteknum skipunum og síum, munu framkvæma tilgreindar aðferðir.

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

Lyklaborðið sjálft er búið til inni í aðferðinni start() teymið ReplyKeyboardMarkup().

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

Í okkar tilviki settum við alla hnappa undir hvern annan, en við getum raðað þeim í eina röð með því að gera breytingar á lista yfir hnappalista. Vegna þess að ein röð inni á lyklaborðinu er búin til í gegnum hreiðraðan lista af hnöppum, svo til að birta hnappana okkar í einni röð þurfum við að endurskrifa hluta kóðans til að smíða lyklaborðið svona:

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

Að skrifa símskeyti botni í R (hluti 3): Hvernig á að bæta lyklaborðsstuðningi við vélmenni

Lyklaborðið er sent í spjallið með aðferðinni sendMessage(), í röksemdafærslunni reply_markup.

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

Innbyggt lyklaborð

Eins og ég skrifaði hér að ofan er Inline lyklaborðið bundið við ákveðin skilaboð. Það er nokkuð erfiðara að vinna með það en aðallyklaborðið.

Upphaflega þarftu að bæta aðferð við botmanninn til að hringja í innbyggða lyklaborðið.

Til að bregðast við smelli á Inline hnappinn geturðu líka notað botnaaðferðina answerCallbackQuery(), sem getur birt tilkynningu í símskeyti viðmótinu til notandans sem ýtir á Inline hnappinn.

Gögnin sem send eru frá Inline hnappinum eru ekki texti, svo til að vinna úr þeim þarftu að búa til sérstakan meðhöndlun með skipuninni CallbackQueryHandler().

Kóðinn til að smíða Inline lyklaborð sem er gefinn upp í opinberri hjálp pakkans telegram.bot.

Kóði til að smíða innbyggt lyklaborð frá opinberu hjálpinni

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

Þú þarft að búa til Inline lyklaborð með því að nota skipunina InlineKeyboardMarkup(), á sömu reglu og svarlyklaborðið. IN InlineKeyboardMarkup() það er nauðsynlegt að senda lista yfir lista yfir Inline hnappa, hver einstakur hnappur er búinn til af aðgerðinni InlineKeyboardButton().

Innbyggður hnappur getur annaðhvort sent nokkur gögn til vélmannsins með því að nota rök callback_data, eða opnaðu hvaða HTML síðu sem er tilgreind með því að nota rökin url.

Niðurstaðan verður listi þar sem hver þáttur er einnig listi yfir Inline hnappa sem þarf að sameina í eina röð.

Næst munum við skoða nokkur dæmi um vélmenni með Inline hnöppum.

Dæmi um einfaldan vélmenni með stuðningi fyrir InLine hnappa

Í fyrsta lagi munum við skrifa vélmenni fyrir hraðprófanir fyrir covid-19. Eftir skipun /test, það mun senda þér lyklaborð með tveimur hnöppum, eftir því hvaða hnapp er ýtt á mun það senda þér skilaboð með niðurstöðum úr prófunum þínum.

Kóði 2: Einfaldasti vélmenni með innbyggðu lyklaborði

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

Keyrðu kóðadæmið hér að ofan, eftir að hafa skipt út 'YOUR BOT TOKEN' fyrir raunverulega táknið sem þú fékkst þegar þú bjóst til botninn í gegnum BotFaðir (Ég talaði um að búa til vélmenni í fyrstu grein).

Niðurstaða:
Að skrifa símskeyti botni í R (hluti 3): Hvernig á að bæta lyklaborðsstuðningi við vélmenni

Við bjuggum til tvær aðferðir:

  • próf — Til að senda á innbyggða spjalllyklaborðið
  • svara_cb — Til að vinna úr gögnum sem send eru af lyklaborðinu.

Gögnin sem verða send frá hverjum hnappi eru tilgreind í röksemdafærslunni callback_data, þegar þú býrð til hnapp. Þú getur fengið gögnin send frá hnappinum með því að nota smíða update$callback_query$data, inni í aðferðinni svara_cb.

Fyrir vélmenni til að bregðast við innbyggða lyklaborðinu, aðferð svara_cb unnið af sérstökum meðhöndlun: CallbackQueryHandler(answer_cb). Sem keyrir tilgreinda aðferð þegar smellt er á Inline hnappinn. Handhafi CallbackQueryHandler tekur tvö rök:

  • callback — Aðferðin sem þarf að keyra
  • pattern — Sía eftir gögnum sem eru bundin við hnappinn með því að nota rök callback_data.

Í samræmi við það, með því að nota rökin pattern Við getum skrifað sérstaka aðferð til að ýta á hvern hnapp:

Kóði 3: Aðskildar aðferðir fyrir hvern innbyggðan hnapp

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

Keyrðu kóðadæmið hér að ofan, eftir að hafa skipt út 'YOUR BOT TOKEN' fyrir raunverulega táknið sem þú fékkst þegar þú bjóst til botninn í gegnum BotFaðir (Ég talaði um að búa til vélmenni í fyrstu grein).

Nú höfum við skrifað 2 aðskildar aðferðir þ.e. ein aðferð, fyrir hverja hnapp sem ýtt er á, og notaði rökin pattern, þegar þeir búa til stjórnendur þeirra:

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

Aðferðarkóði lýkur svara_cb teymið bot$answerCallbackQuery(callback_query_id = update$callback_query$id), sem segir botninum að gögn frá innbyggða lyklaborðinu hafi borist.

Dæmi um vélmenni sem tilkynnir núverandi veður fyrir valda borg

Við skulum reyna að skrifa vélmenni sem biður um veðurgögn.

Rökfræðin í starfi þess verður sem hér segir. Upphaflega af liðinu /start þú hringir í aðallyklaborðið, sem hefur aðeins einn „veður“ hnapp. Með því að smella á þennan hnapp færðu skilaboð með innbyggða lyklaborðinu til að velja borgina sem þú vilt fá að vita um núverandi veður fyrir. Veldu eina af borgunum og fáðu núverandi veður.

Í þessu kóðadæmi munum við nota nokkra viðbótarpakka:

  • httr — pakki til að vinna með HTTP beiðnum, á grundvelli þess sem vinna með hvaða API er byggð. Í okkar tilviki munum við nota ókeypis API openweathermap.org.
  • stringr — pakki til að vinna með texta, í okkar tilfelli munum við nota hann til að búa til skilaboð um veðrið í völdu borginni.

Kóði 4: Bot sem tilkynnir núverandi veður fyrir valda borg

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

Keyrðu kóðadæmið hér að ofan, eftir að hafa skipt út 'YOUR BOT TOKEN' fyrir raunverulega táknið sem þú fékkst þegar þú bjóst til botninn í gegnum BotFaðir (Ég talaði um að búa til vélmenni í fyrstu grein).

Fyrir vikið mun vélmenni okkar virka eitthvað á þessa leið:
Að skrifa símskeyti botni í R (hluti 3): Hvernig á að bæta lyklaborðsstuðningi við vélmenni

Á skematískan hátt er hægt að sýna þennan botn svona:
Að skrifa símskeyti botni í R (hluti 3): Hvernig á að bæta lyklaborðsstuðningi við vélmenni

Við höfum búið til 3 aðferðir í boði í veðurbotnum okkar:

  • Byrja — Ræstu aðalvélalyklaborðið
  • Veður — Ræstu innbyggða lyklaborðið til að velja borg
  • svara_cb — Aðalaðferðin sem biður um veðrið frá API fyrir tiltekna borg og sendir það í spjallið.

Aðferð Byrja við ræsum það með skipuninni /start, sem er útfært af stjórnandanum CommandHandler('start', start).

Til að keyra aðferð Veður við bjuggum til síu með sama nafni:

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

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

}
)

Og við köllum þessa aðferð með eftirfarandi skilaboðum: MessageHandler(weather, filters = MessageFilters$weather).

Og að lokum, aðalaðferðin okkar svara_cb bregst við því að ýta á Inline hnappa, sem er útfært af sérstökum meðhöndlun: CallbackQueryHandler(answer_cb).

Inni í aðferð svara_cb, lesum við gögnin sem send eru af lyklaborðinu og skrifum þau í breytu city: city <- update$callback_query$data. Síðan biðjum við um veðurgögn frá API, búum til og sendum skilaboð og notum að lokum aðferðina answerCallbackQuery til að upplýsa botninn um að við unnum að smella á Inline hnappinn.

Dæmi um vélmenni sem sýnir lista yfir nýjustu greinarnar með tenglum á tilgreinda Hub frá www.habr.com.

Ég kynni þennan botn til að sýna þér hvernig á að birta innbyggða hnappa sem leiða á vefsíður.

Rökfræði þessa vélmenni er svipuð og fyrri; upphaflega ræsum við aðallyklaborðið með skipuninni /start. Næst gefur botni okkur lista yfir 6 miðstöðvar til að velja úr, við veljum miðstöðina sem við höfum áhuga á og fáum 5 nýjustu útgáfurnar frá völdum miðstöð.

Eins og þú skilur, í þessu tilfelli þurfum við að fá lista yfir greinar, og fyrir þetta munum við nota sérstakan pakka habR, sem gerir þér kleift að biðja um greinar frá Habra og smá tölfræði um þær í R.

Settu upp pakka habR aðeins mögulegt frá github, sem þú þarft auka pakka fyrir devtools. Til að setja upp skaltu nota kóðann hér að neðan.

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

Nú skulum við líta á kóðann til að byggja upp botninn sem lýst er hér að ofan:

Kóði 5: Bot sem sýnir lista yfir nýjustu greinarnar á völdum miðstöð

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

Keyrðu kóðadæmið hér að ofan, eftir að hafa skipt út 'YOUR BOT TOKEN' fyrir raunverulega táknið sem þú fékkst þegar þú bjóst til botninn í gegnum BotFaðir (Ég talaði um að búa til vélmenni í fyrstu grein).

Fyrir vikið munum við fá þessa niðurstöðu:
Að skrifa símskeyti botni í R (hluti 3): Hvernig á að bæta lyklaborðsstuðningi við vélmenni

Við harðkóða listann yfir Hubs sem hægt er að velja í aðferðinni 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)
}

Við fáum lista yfir greinar frá tilgreindum Hub með skipuninni habr_hub_posts(), úr pakkanum habR. Jafnframt bendum við á að við þurfum ekki greinarlista fyrir allan tímann heldur aðeins fyrstu síðuna sem 20 greinar eru á. Frá töflunni sem myndast með því að nota skipunina head() Við skiljum aðeins eftir topp 5, sem eru nýjustu greinarnar.

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

Rökfræðin er mjög svipuð fyrri botni, en í þessu tilfelli búum við til Inline lyklaborð með lista yfir greinar á kraftmikinn hátt með því að nota aðgerðina lapply().

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

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

Við setjum titil greinarinnar inn í hnappatextann posts$title[x], og í röksemdafærslunni url tengill á grein: url = posts$link[x].

Næst búum við til síu, meðhöndlara og ræsum botann okkar.

Ályktun

Nú verða vélmennin sem þú skrifar mun þægilegri í notkun, vegna þess að þeim verður stjórnað frá lyklaborðinu, frekar en með því að slá inn skipanir. Að minnsta kosti, þegar þú hefur samskipti við vélmenni í gegnum snjallsíma, mun lyklaborðið einfalda verulega notkun þess.

Í næstu grein munum við reikna út hvernig á að byggja upp rökrétta samræður við vélmenni og vinna með gagnagrunna.

Heimild: www.habr.com

Bæta við athugasemd