R로 텔레그램 봇 작성(3부): 봇에 키보드 지원을 추가하는 방법

이 글은 “R로 텔레그램 봇 작성하기” 시리즈의 세 번째 글입니다. 이전 발행물에서는 텔레그램 봇을 생성하고 이를 통해 메시지를 보내는 방법, 봇에 명령 및 메시지 필터를 추가하는 방법을 배웠습니다. 그러므로 이 글을 읽기 전에 꼭 읽어보시길 권합니다. 이전의, 왜냐하면 여기서는 이전에 설명한 봇 구축의 기본 사항에 대해 더 이상 설명하지 않겠습니다.

이 기사에서는 키보드를 추가하여 봇 인터페이스를 직관적이고 사용하기 쉽게 만들어 봇의 유용성을 향상시킬 것입니다.

R로 텔레그램 봇 작성(3부): 봇에 키보드 지원을 추가하는 방법

"R로 텔레그램 봇 작성" 시리즈의 모든 기사

  1. 우리는 봇을 만들고 그것을 사용하여 텔레그램으로 메시지를 보냅니다.
  2. 봇에 명령 지원 및 메시지 필터 추가
  3. 봇에 키보드 지원을 추가하는 방법

내용

데이터 분석에 관심이 있다면 제 글에도 관심이 있으실 겁니다. 전보 и 유튜브 채널. 대부분의 콘텐츠는 R 언어에 전념합니다.

  1. 텔레그램 봇은 어떤 유형의 키보드를 지원하나요?
  2. 답장 키보드
  3. 인라인 키보드
    3.1. 인라인 버튼을 지원하는 간단한 봇의 예
    3.2. 선택한 도시의 현재 날씨를 보고하는 봇의 예
    3.3. habr.com의 지정된 허브에 대한 링크와 함께 최신 기사 목록을 표시하는 봇의 예
  4. 결론

텔레그램 봇은 어떤 유형의 키보드를 지원하나요?

이 글을 쓰는 시점에서 telegram.bot 두 가지 유형의 키보드를 만들 수 있습니다.

  • 답장 - 메시지 텍스트 입력 패널 아래에 있는 기본 일반 키보드입니다. 이러한 키보드는 단순히 봇에 문자 메시지를 보내고, 버튼 자체에 쓰여진 텍스트를 텍스트로 보냅니다.
  • 인라인 - 특정 봇 메시지와 연결된 키보드입니다. 이 키보드는 누른 버튼과 관련된 봇 데이터를 전송합니다. 이 데이터는 버튼 자체에 작성된 텍스트와 다를 수 있습니다. 그리고 이러한 버튼은 다음을 통해 처리됩니다. 콜백쿼리 핸들러.

봇이 키보드를 열려면 메소드를 통해 메시지를 보낼 때 필요합니다. sendMessage(), 이전에 생성된 키보드를 인수로 전달합니다. reply_markup.

아래에서는 몇 가지 예를 살펴보겠습니다.

답장 키보드

위에서 쓴 것처럼 메인 봇 제어 키보드입니다.

공식 도움말에서 응답 키보드를 만드는 예

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)

위는 패키지 공식 도움말의 예입니다. telegram.bot. 키보드를 만들려면 다음 기능을 사용하십시오. ReplyKeyboardMarkup(), 이는 함수에 의해 생성된 버튼 목록의 목록을 가져옵니다. KeyboardButton().

ReplyKeyboardMarkup() 목록뿐만 아니라 목록의 목록도 전달해야 합니까? 사실은 메인 목록을 전달하고 그 안에 각 버튼 행을 별도의 목록으로 정의한다는 것입니다. 여러 개의 버튼을 한 행에 배치할 수 있습니다.

논의 resize_keyboard 키보드 버튼의 최적 크기와 인수를 자동으로 선택할 수 있습니다. one_time_keyboard 각 버튼을 누른 후 키보드를 숨길 수 있습니다.

3개의 버튼이 있는 간단한 봇을 작성해 보겠습니다.

  • 채팅 ID - 봇과의 대화에 대한 채팅 ID 요청
  • 내 이름 - 당신의 이름을 요청하세요
  • 내 로그인 - 텔레그램에서 사용자 이름을 요청하세요

코드 1: 응답 키보드가 있는 간단한 봇

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

'YOUR BOT TOKEN'을 봇을 생성할 때 받은 실제 토큰으로 바꾼 후 위의 코드 예제를 실행하세요. 봇 아버지 (저는 봇을 만드는 것에 대해 이야기했습니다. 첫 번째 기사).

실행 후 봇에게 명령을 내리세요. /start, 왜냐하면 이것이 바로 우리가 키보드를 실행하기 위해 정의한 것입니다.

R로 텔레그램 봇 작성(3부): 봇에 키보드 지원을 추가하는 방법

현재 메소드, 필터 및 핸들러를 생성하여 주어진 코드 예제를 구문 분석하는 것이 어려운 경우 이전 코드로 돌아가야 합니다. 기사, 이 모든 것을 자세히 설명했습니다.

우리는 4가지 메소드를 만들었습니다:

  • start — 키보드 실행
  • chat_id — 채팅 ID 요청
  • my_name — 이름을 요청하세요
  • my_username — 로그인을 요청하세요

반대하다 메시지 필터 텍스트를 기반으로 3개의 메시지 필터를 추가했습니다.

  • chat_id — 텍스트가 포함된 메시지 "Чат ID"
  • 이름 — 텍스트가 포함된 메시지 "Моё имя"
  • 사용자 이름 — 텍스트가 포함된 메시지 "Мой логин"

그리고 주어진 명령과 필터를 기반으로 지정된 메서드를 실행하는 4개의 핸들러를 만들었습니다.

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

키보드 자체는 메소드 내부에서 생성됩니다. start()ReplyKeyboardMarkup().

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

우리의 경우 모든 버튼을 서로 아래에 배치했지만 버튼 목록 목록을 변경하여 한 행에 정렬할 수 있습니다. 왜냐하면 키보드 내부의 한 행은 중첩된 버튼 목록을 통해 생성됩니다. 그런 다음 버튼을 한 행에 표시하려면 다음과 같이 키보드를 구성하기 위한 코드의 일부를 다시 작성해야 합니다.

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

R로 텔레그램 봇 작성(3부): 봇에 키보드 지원을 추가하는 방법

키보드는 다음 메소드를 사용하여 채팅으로 전송됩니다. sendMessage(), 논쟁에서 reply_markup.

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

인라인 키보드

위에서 쓴 것처럼 인라인 키보드는 특정 메시지와 연결되어 있습니다. 메인 키보드보다 조작하기가 다소 어렵습니다.

처음에는 인라인 키보드를 호출하기 위해 봇에 메서드를 추가해야 합니다.

인라인 버튼 클릭에 응답하려면 봇 메서드를 사용할 수도 있습니다. answerCallbackQuery(), 인라인 버튼을 누른 사용자에게 텔레그램 인터페이스에 알림을 표시할 수 있습니다.

인라인 버튼에서 전송된 데이터는 텍스트가 아니므로 이를 처리하려면 다음 명령을 사용하여 특수 핸들러를 생성해야 합니다. CallbackQueryHandler().

패키지의 공식 도움말에 제공되는 인라인 키보드를 구축하기 위한 코드 telegram.bot.

공식 도움말에서 인라인 키보드를 작성하기 위한 코드

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

다음 명령을 사용하여 인라인 키보드를 구축해야 합니다. InlineKeyboardMarkup(), 응답 키보드와 동일한 원리입니다. 안에 InlineKeyboardMarkup() 인라인 버튼 목록을 전달해야 하며, 각 개별 버튼은 함수에 의해 생성됩니다. InlineKeyboardButton().

인라인 버튼은 인수를 사용하여 일부 데이터를 봇에 전달할 수 있습니다. callback_data, 또는 인수를 사용하여 지정된 HTML 페이지를 엽니다. url.

결과는 각 요소가 하나의 행으로 결합되어야 하는 인라인 버튼 목록이기도 한 목록이 됩니다.

다음으로 인라인 버튼이 있는 봇의 몇 가지 예를 살펴보겠습니다.

인라인 버튼을 지원하는 간단한 봇의 예

먼저, covid-19에 대한 빠른 테스트를 위한 봇을 작성하겠습니다. 명령으로 /test, 두 개의 버튼이 있는 키보드를 보내며, 누른 버튼에 따라 테스트 결과가 포함된 메시지를 보냅니다.

코드 2: 인라인 키보드를 갖춘 가장 간단한 봇

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

'YOUR BOT TOKEN'을 봇을 생성할 때 받은 실제 토큰으로 바꾼 후 위의 코드 예제를 실행하세요. 봇 아버지 (저는 봇을 만드는 것에 대해 이야기했습니다. 첫 번째 기사).

결과 :
R로 텔레그램 봇 작성(3부): 봇에 키보드 지원을 추가하는 방법

우리는 두 가지 방법을 만들었습니다.

  • test — 채팅 인라인 키보드로 보내기
  • 답변_cb — 키보드에서 전송된 데이터를 처리합니다.

각 버튼에서 전송될 데이터는 인수에 지정됩니다. callback_data, 버튼을 생성할 때. 구문을 사용하여 버튼에서 보낸 데이터를 받을 수 있습니다. update$callback_query$data, 메서드 내부 답변_cb.

봇이 인라인 키보드에 반응하도록 하려면 다음과 같이 하세요. 답변_cb 특수 핸들러에 의해 처리됨: CallbackQueryHandler(answer_cb). 인라인 버튼을 클릭하면 지정된 메서드가 실행됩니다. 매니저 콜백쿼리 핸들러 두 가지 인수를 사용합니다.

  • callback — 실행해야 하는 메소드
  • pattern — 인수를 사용하여 버튼에 바인딩된 데이터로 필터링합니다. callback_data.

따라서 인수를 사용하여 pattern 각 버튼을 누르는 별도의 메서드를 작성할 수 있습니다.

코드 3: 각 인라인 버튼에 대한 별도의 메서드

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

'YOUR BOT TOKEN'을 봇을 생성할 때 받은 실제 토큰으로 바꾼 후 위의 코드 예제를 실행하세요. 봇 아버지 (저는 봇을 만드는 것에 대해 이야기했습니다. 첫 번째 기사).

이제 우리는 2가지 별도의 메소드를 작성했습니다. 각 버튼을 누를 때마다 하나의 방법을 사용하고 인수를 사용했습니다. pattern, 핸들러를 생성할 때:

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

메소드 코드 끝 답변_cbbot$answerCallbackQuery(callback_query_id = update$callback_query$id), 인라인 키보드의 데이터가 수신되었음을 봇에게 알립니다.

선택한 도시의 현재 날씨를 보고하는 봇의 예

날씨 데이터를 요청하는 봇을 작성해 보겠습니다.

그 작업의 논리는 다음과 같습니다. 처음에는 팀에서 /start "날씨" 버튼이 하나만 있는 기본 키보드를 호출합니다. 이 버튼을 클릭하면 현재 날씨를 확인하려는 도시를 선택하라는 인라인 키보드 메시지가 표시됩니다. 도시 중 하나를 선택하고 현재 날씨를 확인하세요.

이 코드 예제에서는 몇 가지 추가 패키지를 사용합니다.

  • httr — 모든 API 작업을 기반으로 하는 HTTP 요청 작업용 패키지입니다. 우리의 경우에는 무료 API를 사용하겠습니다. openweathermap.org.
  • stringr — 텍스트 작업을 위한 패키지입니다. 이 경우 선택한 도시의 날씨에 대한 메시지를 생성하는 데 이를 사용합니다.

코드 4: 선택한 도시의 현재 날씨를 보고하는 봇

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

'YOUR BOT TOKEN'을 봇을 생성할 때 받은 실제 토큰으로 바꾼 후 위의 코드 예제를 실행하세요. 봇 아버지 (저는 봇을 만드는 것에 대해 이야기했습니다. 첫 번째 기사).

결과적으로 우리 봇은 다음과 같이 작동합니다.
R로 텔레그램 봇 작성(3부): 봇에 키보드 지원을 추가하는 방법

도식적으로 이 봇은 다음과 같이 묘사될 수 있습니다.
R로 텔레그램 봇 작성(3부): 봇에 키보드 지원을 추가하는 방법

우리는 날씨 봇 내에서 사용할 수 있는 3가지 방법을 만들었습니다.

  • 스타트 — 메인 봇 키보드 실행
  • 날씨 — 도시를 선택하려면 인라인 키보드를 실행하세요.
  • 답변_cb — API에서 특정 도시의 날씨를 요청하고 이를 채팅으로 보내는 기본 메소드입니다.

방법 스타트 우리는 명령으로 그것을 실행합니다 /start, 이는 핸들러에 의해 구현됩니다. CommandHandler('start', start).

메소드를 실행하려면 날씨 같은 이름의 필터를 만들었습니다.

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

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

}
)

그리고 다음 메시지 핸들러를 사용하여 이 메서드를 호출합니다. MessageHandler(weather, filters = MessageFilters$weather).

그리고 결국 우리의 주요 방법은 답변_cb 특수 핸들러에 의해 구현되는 인라인 버튼을 누르는 것에 반응합니다. CallbackQueryHandler(answer_cb).

메소드 내부 답변_cb, 키보드에서 보낸 데이터를 읽고 변수에 씁니다. city: city <- update$callback_query$data. 그런 다음 API에서 날씨 데이터를 요청하고 메시지를 생성 및 보낸 다음 마지막으로 메서드를 사용합니다. answerCallbackQuery 인라인 버튼 클릭을 처리했음을 봇에게 알리기 위해.

지정된 허브에 대한 링크가 포함된 최신 기사 목록을 표시하는 봇의 예 habr.com.

웹 페이지로 연결되는 인라인 버튼을 표시하는 방법을 보여주기 위해 이 봇을 소개합니다.

이 봇의 논리는 이전 것과 유사합니다. 처음에는 다음 명령을 사용하여 기본 키보드를 시작합니다. /start. 다음으로, 봇은 선택할 수 있는 6개의 허브 목록을 제공하고, 관심 있는 허브를 선택하고, 선택한 허브에서 가장 최근 출판물 5개를 받습니다.

아시다시피, 이 경우 기사 목록을 가져와야 하며 이를 위해 특별 패키지를 사용합니다. habR, Habra의 기사와 R의 일부 통계를 요청할 수 있습니다.

패키지 설치 habR 추가 패키지가 필요한 github에서만 가능합니다. devtools. 설치하려면 아래 코드를 사용하세요.

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

이제 위에서 설명한 봇을 구축하기 위한 코드를 살펴보겠습니다.

코드 5: 선택한 허브의 최신 기사 목록을 표시하는 봇

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

'YOUR BOT TOKEN'을 봇을 생성할 때 받은 실제 토큰으로 바꾼 후 위의 코드 예제를 실행하세요. 봇 아버지 (저는 봇을 만드는 것에 대해 이야기했습니다. 첫 번째 기사).

결과적으로 다음과 같은 결과를 얻게 됩니다.
R로 텔레그램 봇 작성(3부): 봇에 키보드 지원을 추가하는 방법

메소드에서 선택할 수 있는 허브 목록을 하드코딩했습니다. 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)
}

다음 명령을 사용하여 지정된 허브에서 기사 목록을 가져옵니다. habr_hub_posts(), 패키지에서 habR. 동시에 우리는 전체 시간에 대한 기사 목록이 필요하지 않고 20개의 기사가 있는 첫 페이지만 필요하다는 점을 지적합니다. 명령을 사용하여 결과 테이블에서 head() 가장 최근 기사인 상위 5개만 남깁니다.

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

논리는 이전 봇과 매우 유사하지만 이 경우 함수를 사용하여 기사 목록이 포함된 인라인 키보드를 동적으로 생성합니다. lapply().

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

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

버튼 텍스트에 기사 제목을 삽입합니다. posts$title[x], 그리고 인수에서 url 기사 링크: url = posts$link[x].

다음으로 필터와 핸들러를 만들고 봇을 시작합니다.

결론

이제 여러분이 작성하는 봇은 명령을 입력하는 대신 키보드로 제어할 수 있기 때문에 훨씬 더 편리하게 사용할 수 있습니다. 최소한 스마트폰을 통해 봇과 상호 작용할 때 키보드는 사용 프로세스를 크게 단순화합니다.

다음 기사에서는 봇과 논리적 대화를 구축하고 데이터베이스로 작업하는 방법을 알아 보겠습니다.

출처 : habr.com

코멘트를 추가