프로호스터 > 블로그 > 관리 > R로 텔레그램 봇 작성(3부): 봇에 키보드 지원을 추가하는 방법
R로 텔레그램 봇 작성(3부): 봇에 키보드 지원을 추가하는 방법
이 글은 “R로 텔레그램 봇 작성하기” 시리즈의 세 번째 글입니다. 이전 발행물에서는 텔레그램 봇을 생성하고 이를 통해 메시지를 보내는 방법, 봇에 명령 및 메시지 필터를 추가하는 방법을 배웠습니다. 그러므로 이 글을 읽기 전에 꼭 읽어보시길 권합니다. 이전의, 왜냐하면 여기서는 이전에 설명한 봇 구축의 기본 사항에 대해 더 이상 설명하지 않겠습니다.
이 기사에서는 키보드를 추가하여 봇 인터페이스를 직관적이고 사용하기 쉽게 만들어 봇의 유용성을 향상시킬 것입니다.
우리의 경우 모든 버튼을 서로 아래에 배치했지만 버튼 목록 목록을 변경하여 한 행에 정렬할 수 있습니다. 왜냐하면 키보드 내부의 한 행은 중첩된 버튼 목록을 통해 생성됩니다. 그런 다음 버튼을 한 행에 표시하려면 다음과 같이 키보드를 구성하기 위한 코드의 일부를 다시 작성해야 합니다.
다음 명령을 사용하여 인라인 키보드를 구축해야 합니다. 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'을 봇을 생성할 때 받은 실제 토큰으로 바꾼 후 위의 코드 예제를 실행하세요. 봇 아버지 (저는 봇을 만드는 것에 대해 이야기했습니다. 첫 번째 기사).
결과 :
우리는 두 가지 방법을 만들었습니다.
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, 핸들러를 생성할 때:
'YOUR BOT TOKEN'을 봇을 생성할 때 받은 실제 토큰으로 바꾼 후 위의 코드 예제를 실행하세요. 봇 아버지 (저는 봇을 만드는 것에 대해 이야기했습니다. 첫 번째 기사).
결과적으로 우리 봇은 다음과 같이 작동합니다.
도식적으로 이 봇은 다음과 같이 묘사될 수 있습니다.
우리는 날씨 봇 내에서 사용할 수 있는 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_hub_posts(), 패키지에서 habR. 동시에 우리는 전체 시간에 대한 기사 목록이 필요하지 않고 20개의 기사가 있는 첫 페이지만 필요하다는 점을 지적합니다. 명령을 사용하여 결과 테이블에서 head() 가장 최근 기사인 상위 5개만 남깁니다.