Nulis bot telegram dina basa Sunda (bagian 3): Kumaha carana nambahkeun rojongan keyboard kana bot

Ieu artikel katilu dina séri "Nulis bot telegram dina basa Sunda". Dina publikasi saméméhna, urang diajar kumaha carana nyieun bot telegram, ngirim pesen ngaliwatan eta, paréntah ditambahkeun jeung saringan pesen ka bot. Ku alatan éta, saméméh anjeun mimiti maca artikel ieu, kuring nyarankeun pisan yén anjeun maca saméméhna, sabab Di dieu kuring moal deui cicing dina dasar-dasar wangunan bot anu dijelaskeun sateuacana.

Dina artikel ieu, urang bakal ningkatkeun usability tina bot urang ku nambahkeun keyboard, nu bakal nyieun panganteur bot intuitif jeung gampang ngagunakeun.

Nulis bot telegram dina basa Sunda (bagian 3): Kumaha carana nambahkeun rojongan keyboard kana bot

Sadaya tulisan tina séri "Nulis bot telegram dina basa Sunda"

  1. Kami nyiptakeun bot sareng dianggo pikeun ngirim pesen dina telegram
  2. Tambihkeun dukungan paréntah sareng saringan pesen ka bot
  3. Kumaha nambihan dukungan keyboard kana bot

eusi

Lamun museurkeun analisis data, Anjeun bisa jadi kabetot dina abdi telegram и youtube saluran. Seuseueurna eusina dikhususkeun kanggo basa Sunda.

  1. Jenis keyboard naon anu dirojong bot telegram?
  2. keyboard balesan
  3. Kibor inline
    3.1. Conto bot basajan kalayan dukungan pikeun tombol InLine
    3.2. Conto bot anu ngalaporkeun cuaca ayeuna pikeun kota anu dipilih
    3.3. Conto bot nu mintonkeun daptar artikel panganyarna kalawan tumbu ka Hub husus ti habr.com
  4. kacindekan

Jenis keyboard naon anu dirojong bot telegram?

Dina waktu tulisan ieu telegram.bot ngidinan Anjeun pikeun nyieun dua jenis keyboard:

  • Bales - The utama, keyboard biasa, anu perenahna di handapeun panel input téks pesen. Kibor sapertos kitu ngan ukur ngirim pesen téks ka bot, sareng salaku téks éta bakal ngirim téks anu ditulis dina tombol éta sorangan.
  • Inline - Keyboard pakait sareng pesen bot husus. Kibor ieu ngirimkeun data bot anu aya hubunganana sareng tombol anu dipencet; data ieu tiasa bénten sareng téks anu ditulis dina tombol éta sorangan. Sareng tombol sapertos kitu diolah CallbackQueryHandler.

Pikeun bot pikeun muka keyboard, perlu nalika ngirim pesen ngaliwatan métode sendMessage(), lulus keyboard dijieun saméméhna salaku argumen reply_markup.

Di handap ieu urang bakal ningali sababaraha conto.

keyboard balesan

Salaku I wrote luhur, ieu téh keyboard kontrol bot utama.

Conto nyieun keyboard Bales ti pitulung resmi

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)

Di luhur mangrupikeun conto tina pitulung resmi bungkusan telegram.bot. Pikeun nyieun kibor, paké pungsi ReplyKeyboardMarkup(), anu dina gilirannana nyokot daptar daptar tombol nu dijieun ku fungsi KeyboardButton().

Naha di ReplyKeyboardMarkup() Naha anjeun kedah lulus sanés ngan ukur daptar, tapi daptar daptar? Kanyataan yén anjeun lulus daptar utama, sareng di jerona anjeun netepkeun unggal baris tombol dina daptar anu misah, sabab Anjeun tiasa nempatkeun sababaraha tombol dina hiji baris.

Argumen resize_keyboard ngidinan Anjeun pikeun otomatis milih ukuran optimal tombol keyboard, jeung argumen one_time_keyboard ngidinan Anjeun pikeun nyumputkeun keyboard sanggeus unggal tombol pencét.

Hayu urang nyerat bot saderhana anu bakal ngagaduhan 3 tombol:

  • Chat ID - Nyuhunkeun obrolan ID dialog sareng bot
  • Ngaran abdi - Nyuhunkeun nami anjeun
  • Login abdi - Nyuhunkeun nami pangguna anjeun dina telegram

Kode 1: Bot basajan sareng keyboard Balas

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

Jalankeun conto kode di luhur, saatos ngagentos 'TOKEN BOT ANDA' sareng token nyata anu anjeun tampi nalika nyiptakeun bot via BotBapa (Kuring ngobrol ngeunaan nyieun bot di artikel munggaran).

Saatos peluncuran, pasihan bot paréntah /start, sabab Ieu persis naon anu urang tangtukeun pikeun ngaluncurkeun keyboard.

Nulis bot telegram dina basa Sunda (bagian 3): Kumaha carana nambahkeun rojongan keyboard kana bot

Lamun ayeuna hese pikeun anjeun parse conto kode dibikeun, jeung kreasi métode, saringan jeung pawang, mangka anjeun kudu balik deui ka saméméhna. artikel, di mana kuring ngajelaskeun sadayana ieu sacara rinci.

Kami nyiptakeun 4 metode:

  • ngamimitian - Jalankeun kibor
  • chat_id - Nyuhunkeun obrolan ID
  • my_name - Nyuhunkeun nami anjeun
  • my_username - Nyuhunkeun login anjeun

Pikeun ngabantah MessageFilters ditambahkeun 3 saringan pesen dumasar kana téks maranéhanana:

  • chat_id - Talatah kalayan téks "Чат ID"
  • ngaran - Talatah kalawan téks "Моё имя"
  • ngaran pamaké - Talatah kalawan téks "Мой логин"

Sareng kami nyiptakeun 4 pawang anu, dumasar kana paréntah sareng saringan anu dipasihkeun, bakal ngalaksanakeun metodeu anu ditangtukeun.

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

Kibor sorangan didamel di jero metodeu start() tim ReplyKeyboardMarkup().

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

Dina kasus urang, urang nempatkeun sagala tombol di handapeun silih, tapi urang bisa ngatur eta dina hiji baris ku nyieun parobahan dina daptar daptar tombol. Sabab hiji baris di jero kibor dijieun ngaliwatan daptar nested sahiji tombol, lajeng dina urutan pikeun nembongkeun tombol urang dina hiji baris urang kudu nulis balik bagian tina kode pikeun ngawangun keyboard kawas kieu:

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

Nulis bot telegram dina basa Sunda (bagian 3): Kumaha carana nambahkeun rojongan keyboard kana bot

Kibor dikirim ka obrolan nganggo metodeu sendMessage(), dina argumen reply_markup.

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

Kibor inline

Salaku I wrote luhur, keyboard Inline dihijikeun ka pesen husus. Ieu rada leuwih hese digawekeun ku ti keyboard utama.

Mimitina, anjeun kedah nambihan metode ka bot pikeun nyauran keyboard Inline.

Pikeun ngabales hiji klik tombol Inline, anjeun ogé tiasa nganggo metode bot answerCallbackQuery(), anu tiasa nampilkeun béwara dina antarmuka telegram ka pangguna anu mencét tombol Inline.

Data anu dikirim tina tombol Inline sanés téks, janten pikeun ngolah éta anjeun kedah nyiptakeun panangan khusus nganggo paréntah CallbackQueryHandler().

Kodeu pikeun ngawangun keyboard Inline anu dipasihkeun dina pitulung resmi bungkusan telegram.bot.

Kode pikeun ngawangun keyboard Inline tina pitulung resmi

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

Anjeun kedah ngawangun keyboard Inline nganggo paréntah InlineKeyboardMarkup(), dina prinsipna sarua jeung keyboard Bales. DI InlineKeyboardMarkup() perlu lulus daptar daptar tombol Inline, unggal tombol individu dijieun ku fungsi InlineKeyboardButton().

Tombol inline tiasa ngirimkeun sababaraha data ka bot nganggo argumen callback_data, atawa muka sagala kaca HTML dieusian maké argumen url.

Hasilna bakal daptar dimana unggal unsur ogé daptar tombol Inline anu kedah digabungkeun kana hiji baris.

Salajengna urang bakal ningali sababaraha conto bot sareng tombol Inline.

Conto bot basajan kalayan dukungan pikeun tombol InLine

Mimiti, urang bakal nyerat bot pikeun tés éksprési pikeun covid-19. Ku paréntah /test, éta bakal ngirim anjeun keyboard sareng dua tombol, gumantung kana tombol anu dipencet éta bakal ngirim anjeun pesen kalayan hasil tés anjeun.

Kode 2: Bot pangbasajanna sareng keyboard 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()

Jalankeun conto kode di luhur, saatos ngagentos 'TOKEN BOT ANDA' sareng token nyata anu anjeun tampi nalika nyiptakeun bot via BotBapa (Kuring ngobrol ngeunaan nyieun bot di artikel munggaran).

Hasil:
Nulis bot telegram dina basa Sunda (bagian 3): Kumaha carana nambahkeun rojongan keyboard kana bot

Kami nyiptakeun dua metode:

  • ujian — Pikeun ngirim ka obrolan kibor Inline
  • jawaban_cb - Pikeun ngolah data anu dikirim tina kibor.

Data anu bakal dikirim ti unggal tombol dieusian dina argumen callback_data, nalika nyieun tombol. Anjeun tiasa nampi data anu dikirim tina tombol nganggo konstruk update$callback_query$data, jero métode jawaban_cb.

Pikeun bot meta kana keyboard Inline, metoda jawaban_cb diolah ku pawang husus: CallbackQueryHandler(answer_cb). Anu ngajalankeun metodeu anu ditangtukeun nalika tombol Inline diklik. Panangan CallbackQueryHandler nyandak dua argumen:

  • callback - Métode anu kedah dijalankeun
  • pattern - Filter ku data anu kabeungkeut kana tombol ngagunakeun argumen callback_data.

Sasuai, ngagunakeun argumen pattern Urang tiasa nyerat metode anu misah pikeun mencét unggal tombol:

Kode 3: Métode misah pikeun unggal tombol 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()

Jalankeun conto kode di luhur, saatos ngagentos 'TOKEN BOT ANDA' sareng token nyata anu anjeun tampi nalika nyiptakeun bot via BotBapa (Kuring ngobrol ngeunaan nyieun bot di artikel munggaran).

Ayeuna kami geus ditulis 2 métode misah i.e. hiji metodeu, pikeun tiap tombol pencét, sarta dipaké argumen pattern, nalika nyiptakeun pananganana:

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

Kodeu métode ends jawaban_cb tim bot$answerCallbackQuery(callback_query_id = update$callback_query$id), nu ngabejaan bot yén data ti keyboard inline geus narima.

Conto bot anu ngalaporkeun cuaca ayeuna pikeun kota anu dipilih

Hayu urang cobian nyerat bot anu nyuhunkeun data cuaca.

Logika karyana bakal kieu. Mimitina ku tim /start Anjeun nelepon keyboard utama, nu boga ngan hiji tombol "Cuaca". Ku ngaklik tombol ieu anjeun bakal nampi pesen kalayan keyboard Inline pikeun milih kota anu anjeun hoyong terang cuaca ayeuna. Pilih salah sahiji kota sareng kéngingkeun cuaca ayeuna.

Dina conto kode ieu kami bakal nganggo sababaraha bungkusan tambahan:

  • httr - paket pikeun gawé bareng requests HTTP, dina dasar nu gawéna kalayan sagala API diwangun. Dina hal kami urang bakal nganggo API gratis openweathermap.org.
  • stringr - pakét pikeun gawé bareng téks, bisi urang bakal ngagunakeun eta pikeun ngahasilkeun pesen ngeunaan cuaca di kota dipilih.

Kode 4: Bot anu ngalaporkeun cuaca ayeuna pikeun kota anu dipilih

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

Jalankeun conto kode di luhur, saatos ngagentos 'TOKEN BOT ANDA' sareng token nyata anu anjeun tampi nalika nyiptakeun bot via BotBapa (Kuring ngobrol ngeunaan nyieun bot di artikel munggaran).

Hasilna, bot urang bakal tiasa dianggo sapertos kieu:
Nulis bot telegram dina basa Sunda (bagian 3): Kumaha carana nambahkeun rojongan keyboard kana bot

Sacara skématik, bot ieu tiasa digambarkeun sapertos kieu:
Nulis bot telegram dina basa Sunda (bagian 3): Kumaha carana nambahkeun rojongan keyboard kana bot

Kami parantos nyiptakeun 3 metode anu aya dina bot cuaca kami:

  • ngamimitian - Jalankeun keyboard bot utama
  • hawa - Jalankeun keyboard Inline pikeun milih kota
  • jawaban_cb - Metodeu utama anu nyuhunkeun cuaca ti API pikeun kota anu dipasihkeun sareng dikirim ka obrolan.

Metode ngamimitian urang ngajalankeun eta kalawan paréntah /start, nu dilaksanakeun ku pawang CommandHandler('start', start).

Pikeun ngajalankeun hiji métode hawa kami nyiptakeun saringan tina nami anu sami:

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

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

}
)

Sareng urang nyauran metode ieu sareng panangan pesen di handap ieu: MessageHandler(weather, filters = MessageFilters$weather).

Sarta dina tungtungna, metoda utama urang jawaban_cb meta pikeun mencét tombol Inline, anu dilaksanakeun ku pawang khusus: CallbackQueryHandler(answer_cb).

Di jero hiji métode jawaban_cb, urang baca data nu dikirim ti keyboard jeung nulis ka variabel city: city <- update$callback_query$data. Teras we nyuhunkeun data cuaca ti API, ngahasilkeun sareng ngirim pesen, sareng tungtungna nganggo metodeu answerCallbackQuery pikeun nginpokeun ka bot yén kami ngolah klik tombol Inline.

Conto bot nu mintonkeun daptar artikel panganyarna kalawan tumbu ka Hub husus tina www.habr.com.

Kuring nampilkeun bot ieu pikeun nunjukkeun anjeun kumaha cara nampilkeun tombol Inline anu nuju ka halaman wéb.

Logika bot ieu sami sareng anu sateuacana; mimitina urang ngaluncurkeun keyboard utama kalayan paréntah /start. Salajengna, bot méré urang daptar 6 hub a milih tina, urang pilih hub kami museurkeun, sarta tampa petunjuk 5 publikasi panganyarna tina Hub dipilih.

Sakumaha anjeun ngartos, dina hal ieu urang kedah kéngingkeun daptar tulisan, sareng pikeun ieu kami bakal nganggo pakét khusus habR, nu ngidinan Anjeun pikeun ménta artikel ti Habra jeung sababaraha statistik ngeunaan eta dina basa Sunda.

Pasang pakét habR ngan mungkin tina github, dimana anjeun peryogi pakét tambahan devtools. Pikeun masang, nganggo kode di handap.

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

Ayeuna hayu urang tingali kodeu pikeun ngawangun bot anu dijelaskeun di luhur:

Kode 5: Bot nu mintonkeun daptar artikel panganyarna dina Hub nu dipilih

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

Jalankeun conto kode di luhur, saatos ngagentos 'TOKEN BOT ANDA' sareng token nyata anu anjeun tampi nalika nyiptakeun bot via BotBapa (Kuring ngobrol ngeunaan nyieun bot di artikel munggaran).

Hasilna, urang bakal nampi hasil ieu:
Nulis bot telegram dina basa Sunda (bagian 3): Kumaha carana nambahkeun rojongan keyboard kana bot

Urang hardcoded daptar Hub sadia pikeun pilihan dina metoda 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)
}

Kami nampi daptar tulisan tina Hub anu ditangtukeun ku paréntah habr_hub_posts(), tina pakét habR. Dina waktos anu sami, kami nunjukkeun yén kami henteu peryogi daptar tulisan salami waktos, tapi ngan ukur halaman munggaran anu aya 20 tulisan. Tina tabel anu dihasilkeun ngagunakeun paréntah head() Urang ninggalkeun ngan luhureun 5, nu artikel panganyarna.

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

Logikana sami sareng bot sateuacana, tapi dina hal ieu kami ngahasilkeun keyboard Inline kalayan daptar tulisan anu dinamis ngagunakeun fungsina. lapply().

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

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

Urang selapkeun judul artikel kana téks tombol posts$title[x], sarta dina argumen url link ka artikel: url = posts$link[x].

Salajengna, urang nyieun filter, pawang jeung ngajalankeun bot urang.

kacindekan

Ayeuna bot-bot anu anjeun tulis bakal langkung gampang dianggo, kusabab kanyataan yén aranjeunna bakal dikontrol tina kibor, tinimbang ku ngalebetkeun paréntah. Sahenteuna, nalika berinteraksi sareng bot liwat smartphone, keyboard bakal nyederhanakeun prosés ngagunakeunana.

Dina artikel salajengna urang bakal terang kumaha ngawangun dialog logis sareng bot sareng damel sareng database.

sumber: www.habr.com

Tambahkeun komentar