R тилинде телеграмма ботун жазуу (3-бөлүк): Клавиатураны ботко кантип кошуу керек

Бул "R-де телеграмма ботун жазуу" сериясындагы үчүнчү макала. Мурунку басылмаларда биз телеграмма ботун кантип түзүүнү, ал аркылуу билдирүүлөрдү жөнөтүүнү, ботко буйруктарды жана билдирүү чыпкаларын кошконду үйрөндүк. Ошондуктан, бул макаланы окуп баштаардан мурун, мен сизге окууну сунуштайм мурунку, анткени Бул жерде мен мындан ары бот куруунун мурда сүрөттөлгөн негиздерине токтолбойм.

Бул макалада биз боттун интерфейсин интуитивдик жана колдонууга оңой кылган клавиатураны кошуу менен боттун колдонуу мүмкүнчүлүгүн жакшыртабыз.

R тилинде телеграмма ботун жазуу (3-бөлүк): Клавиатураны ботко кантип кошуу керек

"Телеграмма ботун R тилинде жазуу" сериясындагы бардык макалалар

  1. Биз бот түзүп, аны телеграммага билдирүүлөрдү жөнөтүү үчүн колдонобуз
  2. Ботко буйрук колдоону жана билдирүү чыпкаларын кошуңуз
  3. Ботко клавиатураны кантип кошуу керек

ыраазы

Эгер сиз маалыматтарды талдоо кызыктырсаңыз, сизди менин телеграмма и YouTube каналдар. Мазмундун көбү R тилине арналган.

  1. Телеграм боту клавиатуралардын кандай түрлөрүн колдойт?
  2. Жооп берүү баскычтобу
  3. Inline клавиатура
    3.1. InLine баскычтарын колдогон жөнөкөй боттун мисалы
    3.2. Тандалган шаардын учурдагы аба ырайын кабарлаган боттун мисалы
    3.3. habr.com сайтынан көрсөтүлгөн Hub шилтемелери менен акыркы макалалардын тизмесин көрсөткөн боттун мисалы
  4. жыйынтыктоо

Телеграм боту клавиатуралардын кандай түрлөрүн колдойт?

Бул жазуу учурунда telegram.bot клавиатуранын эки түрүн түзүүгө мүмкүндүк берет:

  • Жооп берүү - билдирүүнүн текстин киргизүү панелинин астында жайгашкан негизги, кадимки клавиатура. Мындай клавиатура жөн гана ботко тексттик билдирүү жөнөтөт, ал эми текст катары ал баскычтын өзүнө жазылган текстти жөнөтөт.
  • Inline - белгилүү бир бот билдирүүсү менен байланышкан баскычтоп. Бул клавиатура басылган баскычка байланыштуу бот маалыматтарын жөнөтөт; бул маалымат баскычтын өзүндө жазылган тексттен айырмаланышы мүмкүн. Жана мындай баскычтар аркылуу иштетилет 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 баскычы бар жөнөкөй бот жазалы:

  • Чат ID - бот менен диалогдун чат ID суроо
  • Менин атым - Атыңызды сураңыз
  • Менин логиним - 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()

Жогорудагы коддун мисалын иштетиңиз, "СЕНИН БОТ ТОКЕНИН" ботту түзүүдө алган чыныгы токенге алмаштыргандан кийин BotFather (Мен бот түзүү жөнүндө айттым биринчи макала).

Ишке киргизгенден кийин, ботко буйрук бериңиз /start, анткени Бул клавиатураны ишке киргизүү үчүн биз аныктаган нерсе.

R тилинде телеграмма ботун жазуу (3-бөлүк): Клавиатураны ботко кантип кошуу керек

Эгерде учурда сизге методдорду, чыпкаларды жана иштеткичтерди түзүү менен берилген код мисалын талдоо кыйын болсо, анда мурункусуна кайтууңуз керек. макала, анда мен мунун баарын майда-чүйдөсүнө чейин сүрөттөп бердим.

Биз 4 ыкманы түздүк:

  • баштоо — Баскычтопту ишке киргизиңиз
  • chat_id — Чат 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)

Inline клавиатура

Мен жогоруда жазгандай, Inline клавиатура белгилүү бир билдирүүгө байланган. Негизги клавиатурага караганда аны менен иштөө бир аз кыйыныраак.

Башында, сиз Inline баскычтопту чакыруу үчүн ботко ыкманы кошушуңуз керек.

Inline баскычын чыкылдатууга жооп берүү үчүн, сиз бот ыкмасын да колдонсоңуз болот answerCallbackQuery(), ал Inline баскычын баскан колдонуучуга телеграмма интерфейсинде эскертмени көрсөтө алат.

Inline баскычынан жөнөтүлгөн маалыматтар текст эмес, андыктан аны иштетүү үчүн буйрукту колдонуу менен атайын иштеткичти түзүү керек CallbackQueryHandler().

Пакеттин расмий жардамында берилген Inline клавиатурасын куруу коду telegram.bot.

Расмий жардамдан Inline клавиатурасын куруу үчүн код

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

Сиз буйрукту колдонуп Inline клавиатура куруу керек InlineKeyboardMarkup(), Жооп берүү баскычтобу сыяктуу эле принцип боюнча. IN InlineKeyboardMarkup() Inline баскычтарынын тизмелеринин тизмесин өткөрүп берүү керек, ар бир жеке баскыч функция тарабынан түзүлөт InlineKeyboardButton().

Саналуу баскыч аргумент аркылуу ботко кээ бир маалыматтарды өткөрүп бере алат callback_data, же аргумент аркылуу көрсөтүлгөн каалаган HTML баракты ачыңыз url.

Натыйжада тизме пайда болот, анда ар бир элемент бир катарга бириктирилиши керек болгон Inline баскычтарынын тизмеси.

Кийинки биз 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()

Жогорудагы коддун мисалын иштетиңиз, "СЕНИН БОТ ТОКЕНИН" ботту түзүүдө алган чыныгы токенге алмаштыргандан кийин BotFather (Мен бот түзүү жөнүндө айттым биринчи макала).

жыйынтыгы:
R тилинде телеграмма ботун жазуу (3-бөлүк): Клавиатураны ботко кантип кошуу керек

Биз эки ыкманы жараткан:

  • текшерүү — Чатка жөнөтүү үчүн Inline клавиатура
  • answer_cb — Баскычтоптон жиберилген маалыматтарды иштетүү үчүн.

Ар бир баскычтан жөнөтүлө турган маалыматтар аргументте көрсөтүлгөн callback_data, баскычты түзүүдө. Сиз конструкцияны колдонуу менен баскычтан жөнөтүлгөн маалыматтарды ала аласыз update$callback_query$data, методдун ичинде answer_cb.

Боттун Inline клавиатурасына реакция кылышы үчүн, метод answer_cb атайын иштетүүчү тарабынан иштелип чыккан: CallbackQueryHandler(answer_cb). Inline баскычы басылганда көрсөтүлгөн ыкманы иштетет. Handler CallbackQueryHandler эки аргумент алат:

  • callback — Иштетүү керек болгон ыкма
  • pattern — Аргумент аркылуу баскычка байланган маалыматтар боюнча чыпкалоо callback_data.

Демек, аргументти колдонуу pattern Ар бир баскычты басуунун өзүнчө ыкмасын жаза алабыз:

Код 3: Ар бир 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()

Жогорудагы коддун мисалын иштетиңиз, "СЕНИН БОТ ТОКЕНИН" ботту түзүүдө алган чыныгы токенге алмаштыргандан кийин BotFather (Мен бот түзүү жөнүндө айттым биринчи макала).

Азыр биз 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()

Жогорудагы коддун мисалын иштетиңиз, "СЕНИН БОТ ТОКЕНИН" ботту түзүүдө алган чыныгы токенге алмаштыргандан кийин BotFather (Мен бот түзүү жөнүндө айттым биринчи макала).

Натыйжада, биздин бот төмөнкүдөй иштейт:
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 ботко биз Inline баскычын чыкылдатууну иштеткенибизди билдирүү үчүн.

Көрсөтүлгөн Хабга шилтемелер менен акыркы макалалардын тизмесин көрсөткөн боттун мисалы www.habr.com.

Мен бул ботту сизге веб-баракчаларга алып баруучу Inline баскычтарын кантип көрсөтүү керектигин көрсөтүү үчүн сунуштайм.

Бул боттун логикасы мурункуга окшош, алгач биз команда менен негизги клавиатураны ишке киргизебиз /start. Андан кийин, бот бизге тандоо үчүн 6 хабдын тизмесин берет, биз кызыккан хабды тандайбыз жана тандалган Хабдан эң акыркы 5 басылманы алабыз.

Сиз түшүнгөндөй, бул учурда биз макалалардын тизмесин алышыбыз керек, бул үчүн биз атайын пакетти колдонобуз habR, бул Хабрадан макалаларды жана алар боюнча кээ бир статистиканы Р.

Пакетти орнотуу 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()

Жогорудагы коддун мисалын иштетиңиз, "СЕНИН БОТ ТОКЕНИН" ботту түзүүдө алган чыныгы токенге алмаштыргандан кийин BotFather (Мен бот түзүү жөнүндө айттым биринчи макала).

Натыйжада, биз бул натыйжаны алабыз:
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)
}

Биз буйрук менен көрсөтүлгөн Hub макалалардын тизмесин алабыз 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].

Андан кийин биз фильтрди, иштеткичтерди түзүп, ботту ишке киргизебиз.

жыйынтыктоо

Эми сиз жазган ботторду колдонуу бир топ ыңгайлуу болот, анткени алар буйруктарды киргизүү менен эмес, клавиатурадан башкарылат. Жок дегенде, смартфон аркылуу бот менен иштешкенде, клавиатура аны колдонуу процессин кыйла жөнөкөйлөтөт.

Кийинки макалада биз бот менен логикалык диалогду кантип курууну жана маалымат базалары менен иштөөнү билебиз.

Source: www.habr.com

Комментарий кошуу