R тілінде телеграмма ботын жазу (3-бөлім): Ботқа пернетақта қолдауын қалай қосуға болады

Бұл «R тілінде телеграмма ботын жазу» сериясының үшінші мақаласы. Алдыңғы жарияланымдарда біз телеграмма ботын қалай жасау керектігін, ол арқылы хабарлама жіберуді үйрендік, ботқа командалар мен хабар сүзгілерін қостық. Сондықтан, осы мақаланы оқуды бастамас бұрын, мен сізге оқуға кеңес беремін алдыңғы, өйткені Бұл жерде мен бұдан былай бот құрудың бұрын сипатталған негіздеріне тоқталмаймын.

Бұл мақалада біз бот интерфейсін интуитивті және пайдалануды жеңілдететін пернетақтаны қосу арқылы боттың ыңғайлылығын жақсартамыз.

R тілінде телеграмма ботын жазу (3-бөлім): Ботқа пернетақта қолдауын қалай қосуға болады

«R тілінде телеграмма ботын жазу» сериясының барлық мақалалары

  1. Біз бот жасаймыз және оны телеграмда хабарламалар жіберу үшін пайдаланамыз
  2. Ботқа пәрменді қолдау және хабар сүзгілерін қосу
  3. Ботқа пернетақта қолдауын қалай қосуға болады

Мазмұны

Егер сіз деректерді талдауға қызығушылық танытсаңыз, сізді мені қызықтыруы мүмкін жеделхат и YouTube арналар. Мазмұнның көп бөлігі R тіліне арналған.

  1. Telegram боты пернетақталардың қандай түрлерін қолдайды?
  2. Жауап беру пернетақтасы
  3. Кірістірілген пернетақта
    3.1. InLine түймелерін қолдайтын қарапайым боттың мысалы
    3.2. Таңдалған қаланың ағымдағы ауа райын хабарлайтын бот мысалы
    3.3. habr.com сайтындағы көрсетілген хабқа сілтемелері бар соңғы мақалалар тізімін көрсететін бот мысалы.
  4. қорытынды

Telegram боты пернетақталардың қандай түрлерін қолдайды?

Осы жазу кезінде telegram.bot пернетақтаның екі түрін жасауға мүмкіндік береді:

  • Жауап беру - хабарлама мәтінін енгізу тақтасының астында орналасқан негізгі, кәдімгі пернетақта. Мұндай пернетақта ботқа жай ғана мәтіндік хабарлама жібереді, ал мәтін ретінде ол түйменің өзінде жазылған мәтінді жібереді.
  • Кірістірілген - белгілі бір бот хабарламасымен байланыстырылған пернетақта. Бұл пернетақта басылған түймемен байланысты бот деректерін жібереді; бұл деректер түйменің өзінде жазылған мәтіннен өзгеше болуы мүмкін. Және мұндай түймелер арқылы өңделеді CallbackQueryHandler.

Бот пернетақтаны ашу үшін әдіс арқылы хабарлама жіберген кезде қажет 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 түймесі бар қарапайым бот жазайық:

  • Чат идентификаторы - ботпен диалогтың чат идентификаторын сұрау
  • Менің атым - атыңызды сұраңыз
  • Менің логинім - Telegram-да пайдаланушы атыңызды сұраңыз

Код 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()

"СІЗДІҢ BOT TOKEN" дегенді бот арқылы жасаған кезде алған нақты таңбалауышпен ауыстырғаннан кейін жоғарыдағы код мысалын іске қосыңыз. БотӘке (Мен бот жасау туралы айттым бірінші мақала).

Іске қосқаннан кейін ботқа пәрмен беріңіз /start, өйткені Бұл пернетақтаны іске қосу үшін дәл осылай анықтадық.

R тілінде телеграмма ботын жазу (3-бөлім): Ботқа пернетақта қолдауын қалай қосуға болады

Егер қазіргі уақытта әдістерді, сүзгілерді және өңдеушілерді жасау арқылы берілген код үлгісін талдау қиын болса, онда сіз алдыңғысына оралуыңыз керек. мақала, онда мен мұның бәрін егжей-тегжейлі сипаттадым.

Біз 4 әдісті жасадық:

  • бастау — Пернетақтаны іске қосыңыз
  • chat_id — чат идентификаторын сұрау
  • my_name — атыңызды сұраңыз
  • my_username — логиніңізді сұраңыз

Қарсылық білдіру MessageFilters мәтініне негізделген 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(), ол Inline түймесін басқан пайдаланушыға телеграм интерфейсінде хабарландыруды көрсете алады.

Inline батырмасынан жіберілген деректер мәтін емес, сондықтан оны өңдеу үшін пәрмен арқылы арнайы өңдеуші жасау керек 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(), Жауап беру пернетақтасымен бірдей принцип бойынша. IN InlineKeyboardMarkup() Кірістірілген түймелер тізімдерінің тізімін беру қажет, әрбір жеке түйме функция арқылы жасалады InlineKeyboardButton().

Кірістірілген түйме аргумент арқылы ботқа кейбір деректерді бере алады callback_data, немесе аргумент арқылы көрсетілген кез келген HTML бетін ашыңыз url.

Нәтиже әрбір элемент бір жолға біріктірілуі қажет кірістірілген түймелердің тізімі болатын тізім болады.

Әрі қарай біз Inline түймелері бар боттардың бірнеше мысалын қарастырамыз.

InLine түймелерін қолдайтын қарапайым боттың мысалы

Біріншіден, біз covid-19 экспресс-тестілеу үшін бот жазамыз. Бұйрық бойынша /test, ол сізге екі түймесі бар пернетақтаны жібереді, басылған түймеге байланысты ол сізге сынақ нәтижелері туралы хабарлама жібереді.

Код 2: 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()

"СІЗДІҢ BOT TOKEN" дегенді бот арқылы жасаған кезде алған нақты таңбалауышпен ауыстырғаннан кейін жоғарыдағы код мысалын іске қосыңыз. БотӘке (Мен бот жасау туралы айттым бірінші мақала).

нәтижесі:
R тілінде телеграмма ботын жазу (3-бөлім): Ботқа пернетақта қолдауын қалай қосуға болады

Біз екі әдісті жасадық:

  • сынақ — Чатқа жіберу үшін Inline пернетақтасы
  • answer_cb — Пернетақтадан жіберілген деректерді өңдеу үшін.

Әрбір түймеден жіберілетін деректер аргументте көрсетілген callback_data, түймені жасау кезінде. Конструкцияны пайдаланып түймеден жіберілген деректерді алуға болады update$callback_query$data, әдіс ішінде answer_cb.

Боттың кірістірілген пернетақтаға әрекет етуі үшін әдіс answer_cb арнайы өңдеуші өңдейді: CallbackQueryHandler(answer_cb). Кірістірілген түйме басылғанда көрсетілген әдісті іске қосады. Өңдеуші CallbackQueryHandler екі аргумент алады:

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

"СІЗДІҢ BOT TOKEN" дегенді бот арқылы жасаған кезде алған нақты таңбалауышпен ауыстырғаннан кейін жоғарыдағы код мысалын іске қосыңыз. БотӘке (Мен бот жасау туралы айттым бірінші мақала).

Енді біз 2 бөлек әдісті жаздық, яғни. әр түйме үшін бір әдісті басып, аргументті пайдаланыңыз pattern, өңдеушілерін жасаған кезде:

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

Әдіс коды аяқталады answer_cb командасы bot$answerCallbackQuery(callback_query_id = update$callback_query$id), ол ботқа кірістірілген пернетақтадан деректердің қабылданғанын хабарлайды.

Таңдалған қаланың ағымдағы ауа райын хабарлайтын бот мысалы

Ауа райы деректерін сұрайтын бот жазуға тырысайық.

Оның жұмысының логикасы келесідей болады. Бастапқыда командамен /start бір ғана «Ауа райы» түймесі бар негізгі пернетақтаны шақырасыз. Осы түймені басу арқылы сіз ағымдағы ауа райын білгіңіз келетін қаланы таңдау үшін Inline пернетақтасы бар хабарлама аласыз. Қалалардың бірін таңдап, ағымдағы ауа райын алыңыз.

Бұл код мысалында біз бірнеше қосымша пакеттерді қолданамыз:

  • httr — HTTP сұрауларымен жұмыс істеуге арналған пакет, оның негізінде кез келген API-мен жұмыс құрастырылады. Біздің жағдайда біз тегін 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()

"СІЗДІҢ BOT TOKEN" дегенді бот арқылы жасаған кезде алған нақты таңбалауышпен ауыстырғаннан кейін жоғарыдағы код мысалын іске қосыңыз. БотӘке (Мен бот жасау туралы айттым бірінші мақала).

Нәтижесінде біздің бот келесідей жұмыс істейді:
R тілінде телеграмма ботын жазу (3-бөлім): Ботқа пернетақта қолдауын қалай қосуға болады

Схемалық түрде бұл ботты келесідей бейнелеуге болады:
R тілінде телеграмма ботын жазу (3-бөлім): Ботқа пернетақта қолдауын қалай қосуға болады

Біз ауа райы ботында қол жетімді 3 әдісті жасадық:

  • бастау — Негізгі бот пернетақтасын іске қосыңыз
  • ауа райы — Қаланы таңдау үшін Inline пернетақтасын іске қосыңыз
  • answer_cb — Берілген қала үшін API-дан ауа-райын сұрайтын және оны чатқа жіберетін негізгі әдіс.

Әдіс бастау пәрменімен іске қосамыз /start, оны өңдеуші жүзеге асырады CommandHandler('start', start).

Әдісті іске қосу үшін ауа райы біз аттас сүзгіні жасадық:

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

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

}
)

Және біз бұл әдісті келесі хабарлама өңдегішімен шақырамыз: MessageHandler(weather, filters = MessageFilters$weather).

Ақыр соңында, біздің негізгі әдісіміз answer_cb Арнайы өңдеуші жүзеге асыратын Inline түймелерін басқанда әрекет етеді: CallbackQueryHandler(answer_cb).

Әдістің ішінде answer_cb, пернетақтадан жіберілген деректерді оқып, оны айнымалыға жазамыз city: city <- update$callback_query$data. Содан кейін біз API-дан ауа-райы деректерін сұраймыз, хабарлама жасап, жібереміз және соңында әдісті қолданамыз answerCallbackQuery ботқа кірістірілген түймені басуды өңдегенімізді хабарлау үшін.

Көрсетілген Хабқа сілтемелері бар соңғы мақалалар тізімін көрсететін бот мысалы www.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()

"СІЗДІҢ 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)

Логика алдыңғы ботқа өте ұқсас, бірақ бұл жағдайда функцияны қолдана отырып, мақалалар тізімі бар Inline пернетақтасын жасаймыз. 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].

Содан кейін біз сүзгіні, өңдеушілерді жасап, ботты іске қосамыз.

қорытынды

Енді сіз жазған боттарды пайдалану әлдеқайда ыңғайлы болады, себебі олар командаларды енгізу арқылы емес, пернетақтадан басқарылатын болады. Кем дегенде, смартфон арқылы ботпен әрекеттесу кезінде пернетақта оны пайдалану процесін айтарлықтай жеңілдетеді.

Келесі мақалада біз ботпен логикалық диалог құру және деректер қорымен жұмыс істеу жолын анықтаймыз.

Ақпарат көзі: www.habr.com

пікір қалдыру