Kitba ta' telegramma bot f'R (parti 3): Kif iżżid l-appoġġ tat-tastiera ma' bot

Dan huwa t-tielet artiklu fis-serje "Kitba ta' bot telegramma f'R". F'pubblikazzjonijiet preċedenti, tgħallimna kif noħolqu bot telegramma, nibagħtu messaġġi permezz tiegħu, żidna kmandi u filtri tal-messaġġi mal-bot. Għalhekk, qabel ma tibda taqra dan l-artikolu, nirrakkomanda ħafna li taqra preċedenti, għax Hawnhekk mhux se noqgħod aktar fuq il-punti bażiċi deskritti qabel tal-bini tal-bot.

F'dan l-artikolu, se ntejbu l-użabilità tal-bot tagħna billi nżidu tastiera, li tagħmel l-interface tal-bot intuwittivi u faċli biex tużah.

Kitba ta' telegramma bot f'R (parti 3): Kif iżżid l-appoġġ tat-tastiera ma' bot

L-artikoli kollha mis-serje "Kitba ta' bot ta' telegramma f'R"

  1. Aħna noħolqu bot u nużawh biex nibagħtu messaġġi f'telegramma
  2. Żid appoġġ għall-kmand u filtri tal-messaġġi mal-bot
  3. Kif iżżid l-appoġġ tat-tastiera għal bot

Kontenut

Jekk inti interessat fl-analiżi tad-dejta, tista' tkun interessat f'tiegħi telegramma и YouTube kanali. Ħafna mill-kontenut huwa ddedikat għal-lingwa R.

  1. Liema tipi ta' tastieri jappoġġja t-telegram bot?
  2. Tastiera Irrispondi
  3. Tastiera inline
    3.1. Eżempju ta' bot sempliċi b'appoġġ għall-buttuni InLine
    3.2. Eżempju ta' bot li jirrapporta t-temp kurrenti għal belt magħżula
    3.3. Eżempju ta' bot li juri lista tal-aħħar artikli b'links għall-Hub speċifikat minn habr.com
  4. Konklużjoni

Liema tipi ta' tastieri jappoġġja t-telegram bot?

Fiż-żmien ta’ din il-kitba telegram.bot jippermettilek toħloq żewġ tipi ta 'tastieri:

  • Tweġiba - It-tastiera prinċipali, regolari, li tinsab taħt il-pannell tad-dħul tat-test tal-messaġġ. Tastiera bħal din sempliċement tibgħat messaġġ test lill-bot, u bħala t-test tibgħat it-test li huwa miktub fuq il-buttuna nnifisha.
  • Inline - Tastiera assoċjata ma' messaġġ bot speċifiku. Din it-tastiera tibgħat id-dejta tal-bot assoċjata mal-buttuna ippressata; din id-dejta tista’ tkun differenti mit-test miktub fuq il-buttuna nnifisha. U buttuni bħal dawn huma pproċessati permezz CallbackQueryHandler.

Sabiex il-bot jiftaħ it-tastiera, huwa meħtieġ meta tibgħat messaġġ permezz tal-metodu sendMessage(), jgħaddi t-tastiera maħluqa qabel bħala argument reply_markup.

Hawn taħt se nħarsu lejn diversi eżempji.

Tastiera Irrispondi

Kif ktibt hawn fuq, din hija t-tastiera ewlenija tal-kontroll tal-bot.

Eżempju tal-ħolqien ta' tastiera Reply mill-għajnuna uffiċjali

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)

Dan ta 'hawn fuq huwa eżempju mill-għajnuna uffiċjali tal-pakkett telegram.bot. Biex toħloq tastiera, uża l-funzjoni ReplyKeyboardMarkup(), li mbagħad tieħu lista ta 'listi ta' buttuni li huma maħluqa mill-funzjoni KeyboardButton().

Għaliex ġewwa ReplyKeyboardMarkup() Għandek bżonn tgħaddi mhux biss lista, iżda lista ta 'listi? Il-fatt hu li tgħaddi l-lista ewlenija, u fiha tiddefinixxi kull ringiela ta 'buttuni f'listi separati, għaliex Tista 'tpoġġi diversi buttuni f'ringiela waħda.

argument resize_keyboard jippermettilek tagħżel awtomatikament id-daqs ottimali tal-buttuni tat-tastiera, u l-argument one_time_keyboard jippermettilek taħbi t-tastiera wara kull tagħfas tal-buttuna.

Ejja nikteb bot sempliċi li jkollu 3 buttuni:

  • Chat ID - Itlob l-ID taċ-chat tad-djalogu mal-bot
  • Jisimni - Itlob ismek
  • Il-login tiegħi - Itlob l-isem tal-utent tiegħek fit-telegramma

Kodiċi 1: Bot sempliċi bit-tastiera Reply

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

Mexxi l-eżempju tal-kodiċi ta' hawn fuq, wara li ssostitwixxi 'T-TOKEN BOT TIEGĦEK' bit-token reali li rċevejt meta ħoloq il-bot permezz BotFather (Tkellimt dwar il-ħolqien ta' bot fi l-ewwel artiklu).

Wara t-tnedija, agħti kmand lill-bot /start, għax Dan huwa eżattament dak li ddefinijna biex inniedu t-tastiera.

Kitba ta' telegramma bot f'R (parti 3): Kif iżżid l-appoġġ tat-tastiera ma' bot

Jekk bħalissa huwa diffiċli għalik li teżamina l-eżempju tal-kodiċi mogħti, bil-ħolqien ta 'metodi, filtri u handlers, allura għandek terġa' lura għal dik ta 'qabel artikolu, li fiha ddeskrivejt dan kollu fid-dettall.

Ħloqna 4 metodi:

  • start — Tnedija t-tastiera
  • chat_id — Itlob l-ID taċ-chat
  • my_name — Itlob ismek
  • my_username — Itlob il-login tiegħek

Toġġezzjona Filtri tal-Messaġġ żiedu 3 filtri tal-messaġġi bbażati fuq it-test tagħhom:

  • chat_id — Messaġġi bit-test "Чат ID"
  • isem — Messaġġi bit-test "Моё имя"
  • username — Messaġġi bit-test "Мой логин"

U ħloqna 4 handlers li, ibbażati fuq kmandi u filtri mogħtija, se jesegwixxu l-metodi speċifikati.

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

It-tastiera nnifisha hija maħluqa ġewwa l-metodu start() tim ReplyKeyboardMarkup().

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

Fil-każ tagħna, poġġejna l-buttuni kollha taħt xulxin, iżda nistgħu nirranġawhom f'ringiela waħda billi nagħmlu bidliet fil-lista tal-listi tal-buttuni. Għax ringiela waħda ġewwa t-tastiera tinħoloq permezz ta' lista ta' buttuni mnaqqsa, imbagħad biex nuru l-buttuni tagħna f'ringiela waħda għandna bżonn nerġgħu nikteb parti mill-kodiċi għall-kostruzzjoni tat-tastiera bħal din:

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

Kitba ta' telegramma bot f'R (parti 3): Kif iżżid l-appoġġ tat-tastiera ma' bot

It-tastiera tintbagħat liċ-chat bl-użu tal-metodu sendMessage(), fl-argument reply_markup.

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

Tastiera inline

Kif ktibt hawn fuq, it-tastiera Inline hija marbuta ma 'messaġġ speċifiku. Huwa kemmxejn aktar diffiċli biex taħdem biha mit-tastiera prinċipali.

Inizjalment, għandek bżonn iżżid metodu mal-bot biex issejjaħ it-tastiera Inline.

Biex tirrispondi għal ikklikkja fuq buttuna Inline, tista 'wkoll tuża l-metodu bot answerCallbackQuery(), li jista' juri notifika fl-interface tat-telegramma lill-utent li jagħfas il-buttuna Inline.

Id-dejta mibgħuta mill-buttuna Inline mhix test, għalhekk biex tipproċessa trid toħloq handler speċjali billi tuża l-kmand CallbackQueryHandler().

Il-kodiċi għall-bini ta 'keyboard Inline li huwa mogħti fl-għajnuna uffiċjali tal-pakkett telegram.bot.

Kodiċi għall-bini ta 'keyboard Inline mill-għajnuna uffiċjali

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

Għandek bżonn tibni tastiera Inline billi tuża l-kmand InlineKeyboardMarkup(), fuq l-istess prinċipju bħat-tastiera Reply. IN InlineKeyboardMarkup() huwa meħtieġ li tgħaddi lista ta 'listi ta' buttuni Inline, kull buttuna individwali hija maħluqa mill-funzjoni InlineKeyboardButton().

Buttuna inline tista' jew tgħaddi xi dejta lill-bot billi tuża argument callback_data, jew tiftaħ kwalunkwe paġna HTML speċifikata billi tuża l-argument url.

Ir-riżultat se jkun lista li fiha kull element huwa wkoll lista ta 'buttuni Inline li jeħtieġ li jiġu kkombinati f'ringiela waħda.

Sussegwentement se nħarsu lejn diversi eżempji ta 'bots b'buttuni Inline.

Eżempju ta' bot sempliċi b'appoġġ għall-buttuni InLine

L-ewwel, se niktbu bot għall-ittestjar espress għal covid-19. Bi kmand /test, se tibgħatlek tastiera b'żewġ buttuni, skont il-buttuna magħfusa tibgħatlek messaġġ bir-riżultati tal-ittestjar tiegħek.

Kodiċi 2: L-aktar bot sempliċi b'tastiera Inline

library(telegram.bot)

# создаём экземпляр класса Updater
updater <- Updater('ТОКЕН ВАШЕГО БОТА')

# метод для отправки InLine клавиатуры
test <- function(bot, update) {

  # создаём InLine клавиатуру
  IKM <- InlineKeyboardMarkup(
    inline_keyboard = list(
      list(
        InlineKeyboardButton("Да", callback_data = 'yes'),
        InlineKeyboardButton("Нет", callback_data = 'no')
      )
    )
  )

  # Отправляем клавиатуру в чат
  bot$sendMessage(update$message$chat_id, 
                  text = "Вы болете коронавирусом?", 
                  reply_markup = IKM)
}

# метод для обработки нажатия кнопки
answer_cb <- 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()

Mexxi l-eżempju tal-kodiċi ta' hawn fuq, wara li ssostitwixxi 'T-TOKEN BOT TIEGĦEK' bit-token reali li rċevejt meta ħoloq il-bot permezz BotFather (Tkellimt dwar il-ħolqien ta' bot fi l-ewwel artiklu).

Riżultat:
Kitba ta' telegramma bot f'R (parti 3): Kif iżżid l-appoġġ tat-tastiera ma' bot

Ħloqna żewġ metodi:

  • test — Biex tibgħat lill-chat Tastiera Inline
  • tweġiba_cb — Biex tipproċessa data mibgħuta mit-tastiera.

Id-dejta li se tintbagħat minn kull buttuna hija speċifikata fl-argument callback_data, meta toħloq buttuna. Tista' tirċievi d-dejta mibgħuta mill-buttuna billi tuża l-kostruzzjoni update$callback_query$data, ġewwa l-metodu tweġiba_cb.

Biex il-bot jirreaġixxi għat-tastiera Inline, metodu tweġiba_cb ipproċessat minn handler speċjali: CallbackQueryHandler(answer_cb). Li jmexxi l-metodu speċifikat meta l-buttuna Inline tiġi kklikkjata. Handler CallbackQueryHandler jieħu żewġ argumenti:

  • callback — Il-metodu li jeħtieġ li jitħaddem
  • pattern — Iffiltra minn data li hija marbuta mal-buttuna billi tuża argument callback_data.

Għaldaqstant, bl-użu tal-argument pattern Nistgħu niktbu metodu separat biex tagħfas kull buttuna:

Kodiċi 3: Metodi separati għal kull buttuna Inline

library(telegram.bot)

# создаём экземпляр класса Updater
updater <- Updater('ТОКЕН ВАШЕГО БОТА')

# метод для отправки InLine клавиатуры
test <- function(bot, update) {  

  # создаём InLine клавиатуру
  IKM <- InlineKeyboardMarkup(
    inline_keyboard = list(
      list(
        InlineKeyboardButton("Да", callback_data = 'yes'),
        InlineKeyboardButton("Нет", callback_data = 'no')
      )
    )
  )

  # Отправляем клавиатуру в чат
  bot$sendMessage(update$message$chat_id, 
                  text = "Вы болете коронавирусом?", 
                  reply_markup = IKM)
}

# метод для обработки нажатия кнопки Да
answer_cb_yes <- function(bot, update) {

  # получаем имя пользователя, нажавшего кнопку
  uname <- update$effective_user()$first_name

  # обработка результата
  msg <- paste0(uname, ", к сожалени ваш текст на covid-19 положительный.")

  # Отправка сообщения
  bot$sendMessage(chat_id = update$from_chat_id(),
                  text = msg)

  # сообщаем боту, что запрос с кнопки принят
  bot$answerCallbackQuery(callback_query_id = update$callback_query$id) 
}

# метод для обработки нажатия кнопки Нет
answer_cb_no <- function(bot, update) {

  # получаем имя пользователя, нажавшего кнопку
  uname <- update$effective_user()$first_name

  msg <- paste0(uname, ", поздравляю, ваш текст на covid-19 отрицательный.")

  # Отправка сообщения
  bot$sendMessage(chat_id = update$from_chat_id(),
                  text = msg)

  # сообщаем боту, что запрос с кнопки принят
  bot$answerCallbackQuery(callback_query_id = update$callback_query$id) 
}

# создаём обработчики
inline_h          <- CommandHandler('test', test)
query_handler_yes <- CallbackQueryHandler(answer_cb_yes, pattern = 'yes')
query_handler_no  <- CallbackQueryHandler(answer_cb_no, pattern = 'no')

# добавляем обработчики в диспетчер
updater <- updater + 
            inline_h + 
            query_handler_yes +
            query_handler_no

# запускаем бота
updater$start_polling()

Mexxi l-eżempju tal-kodiċi ta' hawn fuq, wara li ssostitwixxi 'T-TOKEN BOT TIEGĦEK' bit-token reali li rċevejt meta ħoloq il-bot permezz BotFather (Tkellimt dwar il-ħolqien ta' bot fi l-ewwel artiklu).

Issa ktibna 2 metodi separati i.e. metodu wieħed, għal kull buttuna agħfas, u użat l-argument pattern, meta joħolqu l-handlers tagħhom:

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

Il-kodiċi tal-metodu jintemm tweġiba_cb tim bot$answerCallbackQuery(callback_query_id = update$callback_query$id), li jgħid lill-bot li data mit-tastiera inline ġiet riċevuta.

Eżempju ta' bot li jirrapporta t-temp kurrenti għal belt magħżula

Ejja nippruvaw niktbu bot li jitlob data tat-temp.

Il-loġika tal-ħidma tagħha se tkun kif ġej. Inizjalment mit-tim /start inti ssejjaħ it-tastiera prinċipali, li għandha buttuna waħda biss "Temp". Billi tikklikkja fuq din il-buttuna tirċievi messaġġ bit-tastiera Inline biex tagħżel il-belt li għaliha trid issir taf it-temp attwali. Agħżel waħda mill-ibliet u tikseb it-temp attwali.

F'dan l-eżempju tal-kodiċi se nużaw diversi pakketti addizzjonali:

  • httr — pakkett biex taħdem ma 'talbiet HTTP, li fuq il-bażi tiegħu tinbena x-xogħol ma' kwalunkwe API. Fil-każ tagħna se nużaw l-API b'xejn openweathermap.org.
  • stringr — pakkett biex taħdem mat-test, fil-każ tagħna se nużawh biex niġġeneraw messaġġ dwar it-temp fil-belt magħżula.

Kodiċi 4: Bot li jirrapporta t-temp kurrenti għall-belt magħżula

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

Mexxi l-eżempju tal-kodiċi ta' hawn fuq, wara li ssostitwixxi 'T-TOKEN BOT TIEGĦEK' bit-token reali li rċevejt meta ħoloq il-bot permezz BotFather (Tkellimt dwar il-ħolqien ta' bot fi l-ewwel artiklu).

Bħala riżultat, il-bot tagħna se jaħdem xi ħaġa bħal din:
Kitba ta' telegramma bot f'R (parti 3): Kif iżżid l-appoġġ tat-tastiera ma' bot

Skematikament, dan il-bot jista 'jiġi mpinġi hekk:
Kitba ta' telegramma bot f'R (parti 3): Kif iżżid l-appoġġ tat-tastiera ma' bot

Ħloqna 3 metodi disponibbli ġewwa l-bot tat-temp tagħna:

  • Bidu — Tnedija tat-tastiera tal-bot prinċipali
  • temp — Tnedija tat-tastiera Inline biex tagħżel belt
  • tweġiba_cb — Il-metodu ewlieni li jitlob it-temp mill-API għal belt partikolari u jibgħatha liċ-chat.

Metodu Bidu innieduha bil-kmand /start, li hija implimentata mill-handler CommandHandler('start', start).

Biex tmexxi metodu temp ħloqna filtru bl-istess isem:

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

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

}
)

U nsejħu dan il-metodu bl-immaniġġjar tal-messaġġi li ġej: MessageHandler(weather, filters = MessageFilters$weather).

U fl-aħħar, il-metodu ewlieni tagħna tweġiba_cb jirreaġixxi għall-ippressar tal-buttuni Inline, li hija implimentata minn handler speċjali: CallbackQueryHandler(answer_cb).

Ġewwa metodu tweġiba_cb, naqraw id-dejta mibgħuta mit-tastiera u niktbuha f'varjabbli city: city <- update$callback_query$data. Imbagħad nitolbu data tat-temp mill-API, niġġeneraw u nibagħtu messaġġ, u fl-aħħar nużaw il-metodu answerCallbackQuery sabiex ninfurmaw lill-bot li pproċessajna l-ikklikkja tal-buttuna Inline.

Eżempju ta' bot li juri lista tal-aħħar artikli b'links għall-Hub speċifikat minn www.habr.com.

Nippreżenta dan il-bot biex nuruk kif turi buttuni Inline li jwasslu għal paġni tal-web.

Il-loġika ta 'dan il-bot hija simili għal dik ta' qabel; inizjalment inniedu t-tastiera ewlenija bil-kmand /start. Sussegwentement, il-bot jagħtina lista ta '6 hubs minn fejn nagħżlu, aħna nagħżlu l-hub li aħna interessati fih, u nirċievu l-5 pubblikazzjonijiet l-aktar reċenti mill-Hub magħżul.

Kif tifhem, f'dan il-każ irridu nġibu lista ta 'artikoli, u għal dan se nużaw pakkett speċjali habR, li jippermettilek titlob artikli mingħand Habra u xi statistika dwarhom f'R.

Installa pakkett habR possibbli biss minn github, li għalih ser ikollok bżonn pakkett addizzjonali devtools. Biex tinstalla, uża l-kodiċi hawn taħt.

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

Issa ejja nħarsu lejn il-kodiċi għall-bini tal-bot deskritt hawn fuq:

Kodiċi 5: Bot li juri lista tal-artikoli l-aktar riċenti fuq iċ-Hub magħżul

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

Mexxi l-eżempju tal-kodiċi ta' hawn fuq, wara li ssostitwixxi 'T-TOKEN BOT TIEGĦEK' bit-token reali li rċevejt meta ħoloq il-bot permezz BotFather (Tkellimt dwar il-ħolqien ta' bot fi l-ewwel artiklu).

Bħala riżultat, se nġibu dan ir-riżultat:
Kitba ta' telegramma bot f'R (parti 3): Kif iżżid l-appoġġ tat-tastiera ma' bot

Aħna kkodifikajna l-lista ta 'Hubs disponibbli għall-għażla fil-metodu 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)
}

Ikollna lista ta 'artikoli mill-Hub speċifikat bil-kmand habr_hub_posts(), mill-pakkett habR. Fl-istess ħin, nirrimarkaw li m'għandniex bżonn lista ta 'artikoli għall-ħin kollu, iżda biss l-ewwel paġna li fiha jinsabu 20 artiklu. Mit-tabella li tirriżulta bl-użu tal-kmand head() Inħallu biss l-aqwa 5, li huma l-artikoli l-aktar riċenti.

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

Il-loġika hija simili ħafna għall-bot preċedenti, iżda f'dan il-każ niġġeneraw tastiera Inline b'lista ta 'artikoli b'mod dinamiku billi tuża l-funzjoni lapply().

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

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

Aħna daħħal it-titlu tal-artiklu fit-test tal-buttuna posts$title[x], u fl-argument url link għall-artiklu: url = posts$link[x].

Sussegwentement, noħolqu filtru, handlers u nniedu l-bot tagħna.

Konklużjoni

Issa l-bots li tikteb se jkunu ħafna aktar konvenjenti biex jintużaw, minħabba l-fatt li se jkunu kkontrollati mit-tastiera, aktar milli billi ddaħħlu kmandi. Bħala minimu, meta jinteraġixxi ma 'bot permezz ta' smartphone, it-tastiera tissimplifika b'mod sinifikanti l-proċess tal-użu tagħha.

Fl-artiklu li jmiss ser insemmu kif nibnu djalogu loġiku ma 'bot u naħdmu ma' databases.

Sors: www.habr.com

Żid kumment