R'de telgraf botu yazma (bölüm 3): Bir bota klavye desteği nasıl eklenir

Bu, “R'de telgraf botu yazma” serisinin üçüncü makalesidir. Önceki yayınlarımızda telgraf botu oluşturmayı, onun üzerinden mesaj göndermeyi, bota komutlar ve mesaj filtreleri eklemeyi öğrendik. Bu nedenle bu makaleyi okumaya başlamadan önce okumanızı şiddetle tavsiye ederim. öncesi, Çünkü Burada artık bot oluşturmanın daha önce açıklanan temelleri üzerinde durmayacağım.

Bu yazımızda bot arayüzünü sezgisel ve kullanımı kolay hale getirecek bir klavye ekleyerek botumuzun kullanılabilirliğini artıracağız.

R'de telgraf botu yazma (bölüm 3): Bir bota klavye desteği nasıl eklenir

“R'de telgraf botu yazma” serisindeki tüm makaleler

  1. Bir bot oluşturuyoruz ve onu telgrafta mesaj göndermek için kullanıyoruz
  2. Bot'a komut desteği ve mesaj filtreleri ekleyin
  3. Bir bota klavye desteği nasıl eklenir?

Içerik

Veri analiziyle ilgileniyorsanız, benim ilginizi çekebilir telgraf и Youtube kanallar. İçeriğin çoğu R diline ayrılmıştır.

  1. Telegram botu ne tür klavyeleri destekliyor?
  2. Yanıt klavyesi
  3. Satır içi klavye
    3.1 InLine düğmelerini destekleyen basit bir bot örneği
    3.2 Seçilen bir şehir için mevcut hava durumunu bildiren bir bot örneği
    3.3 Habr.com'dan belirtilen Hub'a bağlantılar içeren en son makalelerin listesini görüntüleyen bir bot örneği
  4. Sonuç

Telegram botu ne tür klavyeleri destekliyor?

Bu yazının yazıldığı sırada telegram.bot iki tür klavye oluşturmanıza olanak tanır:

  • Yanıtla - Mesaj metni giriş panelinin altında bulunan ana, normal klavye. Böyle bir klavye bota basitçe bir metin mesajı gönderir ve metin olarak düğmenin üzerinde yazılan metni gönderir.
  • Satır İçi - Belirli bir bot mesajıyla ilişkili klavye. Bu klavye, basılan düğmeyle ilişkili bot verilerini gönderir; bu veriler, düğmenin üzerinde yazılı olan metinden farklı olabilir. Ve bu tür düğmeler aracılığıyla işlenir Geri AramaSorgu İşleyicisi.

Botun klavyeyi açabilmesi için yöntem aracılığıyla mesaj gönderirken gereklidir. sendMessage(), önceden oluşturulan klavyeyi argüman olarak iletin reply_markup.

Aşağıda birkaç örneğe bakacağız.

Yanıt klavyesi

Yukarıda yazdığım gibi bu ana bot kontrol klavyesidir.

Resmi yardımdan Yanıt klavyesi oluşturma örneği

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)

Yukarıdaki paketin resmi yardımından bir örnektir telegram.bot. Klavye oluşturmak için işlevi kullanın ReplyKeyboardMarkup(), bu da işlev tarafından oluşturulan düğme listelerinin bir listesini alır KeyboardButton().

Neden içinde ReplyKeyboardMarkup() Yalnızca bir listeyi değil, bir liste listesini de iletmeniz mi gerekiyor? Önemli olan, ana listeyi iletmeniz ve burada her düğme satırını ayrı listelerde tanımlamanızdır, çünkü Bir satıra birden fazla düğme yerleştirebilirsiniz.

tartışma resize_keyboard klavye düğmelerinin en uygun boyutunu ve bağımsız değişkeni otomatik olarak seçmenize olanak tanır one_time_keyboard düğmeye her bastığınızda klavyeyi gizlemenize olanak tanır.

3 butonu olacak basit bir bot yazalım:

  • Sohbet Kimliği - Botla diyaloğun sohbet kimliğini isteyin
  • Benim adım - Adınızı isteyin
  • Giriş bilgilerim - Telegramda kullanıcı adınızı isteyin

Kod 1: Yanıtla klavyeli basit bot

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İNİZ' kısmını, botu oluştururken aldığınız gerçek jetonla değiştirdikten sonra yukarıdaki kod örneğini çalıştırın. BotBaba (Bir bot oluşturmaktan bahsetmiştim ilk makale).

Başlattıktan sonra bota bir komut verin /start, Çünkü Klavyeyi başlatmak için tanımladığımız şey tam olarak budur.

R'de telgraf botu yazma (bölüm 3): Bir bota klavye desteği nasıl eklenir

Şu anda verilen kod örneğini yöntemlerin, filtrelerin ve işleyicilerin oluşturulmasıyla ayrıştırmanız zorsa, bir öncekine dönmelisiniz. Makale, tüm bunları ayrıntılı olarak anlattım.

4 yöntem oluşturduk:

  • start — Klavyeyi başlatır
  • chat_id — Sohbet kimliği ister
  • my_name — Adınızı isteyin
  • my_username — Giriş yapmanızı ister

İtiraz etmek Mesaj Filtreleri metinlerine göre 3 mesaj filtresi eklendi:

  • chat_id — Metin içeren mesajlar "Чат ID"
  • name — Metin içeren mesajlar "Моё имя"
  • kullanıcı adı — Metin içeren mesajlar "Мой логин"

Ve verilen komutlara ve filtrelere dayanarak belirtilen yöntemleri yürütecek 4 işleyici oluşturduk.

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

Klavyenin kendisi yöntemin içinde oluşturulur start() takım ReplyKeyboardMarkup().

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

Bizim uygulamamızda tüm butonları birbirinin altına yerleştirdik ancak buton listeleri listesinde değişiklik yaparak onları tek sıra halinde düzenleyebiliriz. Çünkü Klavyenin içindeki bir satır, iç içe geçmiş düğme listesi aracılığıyla oluşturulur, ardından düğmelerimizi tek satırda görüntülemek için klavyeyi şu şekilde oluşturmak için kodun bir kısmını yeniden yazmamız gerekir:

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

R'de telgraf botu yazma (bölüm 3): Bir bota klavye desteği nasıl eklenir

Klavye, yöntem kullanılarak sohbete gönderilir sendMessage(), tartışmada reply_markup.

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

Satır içi klavye

Yukarıda yazdığım gibi Satır İçi klavye belirli bir mesaja bağlıdır. Ana klavyeyle çalışmak biraz daha zordur.

Başlangıçta, Satır İçi klavyeyi çağırmak için bota bir yöntem eklemeniz gerekir.

Satır içi düğme tıklamasına yanıt vermek için bot yöntemini de kullanabilirsiniz. answerCallbackQuery()Inline düğmesine basan kullanıcıya telgraf arayüzünde bir bildirim görüntüleyebilen.

Satır İçi düğmesinden gönderilen veriler metin değildir, dolayısıyla bunları işlemek için komutu kullanarak özel bir işleyici oluşturmanız gerekir. CallbackQueryHandler().

Paketin resmi yardımında verilen Satır İçi klavye oluşturma kodu telegram.bot.

Resmi yardımdan Satır İçi klavye oluşturma kodu

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

Komutu kullanarak bir Satır İçi klavye oluşturmanız gerekir InlineKeyboardMarkup()Yanıtla klavyesiyle aynı prensiptedir. İÇİNDE InlineKeyboardMarkup() Satır içi düğmelerin listesinin iletilmesi gerekir; her bir düğme, işlev tarafından oluşturulur. InlineKeyboardButton().

Satır içi bir düğme, bir argüman kullanarak bazı verileri bota iletebilir callback_dataveya bağımsız değişkeni kullanarak belirtilen herhangi bir HTML sayfasını açın url.

Sonuç, her öğenin aynı zamanda bir satırda birleştirilmesi gereken Satır İçi düğmelerin bir listesi olduğu bir liste olacaktır.

Daha sonra Inline düğmeli birkaç bot örneğine bakacağız.

InLine düğmelerini destekleyen basit bir bot örneği

Öncelikle covid-19'a yönelik ekspres test için bir bot yazacağız. Komutayla /test, size iki düğmeli bir klavye gönderecek, basılan düğmeye bağlı olarak size testinizin sonuçlarını içeren bir mesaj gönderecektir.

Kod 2: Satır içi klavyeye sahip en basit bot

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İNİZ' kısmını, botu oluştururken aldığınız gerçek jetonla değiştirdikten sonra yukarıdaki kod örneğini çalıştırın. BotBaba (Bir bot oluşturmaktan bahsetmiştim ilk makale).

Sonuç:
R'de telgraf botu yazma (bölüm 3): Bir bota klavye desteği nasıl eklenir

İki yöntem oluşturduk:

  • test — Sohbete göndermek için Satır içi klavye
  • cevap_cb — Klavyeden gönderilen verileri işlemek için.

Her düğmeden gönderilecek veriler argümanda belirtilir callback_data, bir düğme oluştururken. Yapıyı kullanarak düğmeden gönderilen verileri alabilirsiniz. update$callback_query$data, yöntemin içinde cevap_cb.

Botun Satır İçi klavyeye tepki vermesi için yöntem cevap_cb özel bir işleyici tarafından işlendi: CallbackQueryHandler(answer_cb). Satır İçi düğmesine tıklandığında belirtilen yöntemi çalıştırır. İşleyici Geri AramaSorgu İşleyicisi iki argüman alır:

  • callback — Çalıştırılması gereken yöntem
  • pattern — Bir bağımsız değişken kullanarak düğmeye bağlanan verilere göre filtreleyin callback_data.

Buna göre argümanı kullanarak pattern Her tuşa basmak için ayrı bir yöntem yazabiliriz:

Kod 3: Her Satır İçi düğme için ayrı yöntemler

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İNİZ' kısmını, botu oluştururken aldığınız gerçek jetonla değiştirdikten sonra yukarıdaki kod örneğini çalıştırın. BotBaba (Bir bot oluşturmaktan bahsetmiştim ilk makale).

Şimdi 2 ayrı yöntem yazdık; her düğmeye basıldığında bir yöntem kullanıldı ve argüman kullanıldı pattern, işleyicilerini oluştururken:

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

Yöntem kodu biter cevap_cb takım bot$answerCallbackQuery(callback_query_id = update$callback_query$id)Bu, bota satır içi klavyeden verilerin alındığını bildirir.

Seçilen bir şehir için mevcut hava durumunu bildiren bir bot örneği

Hava durumu verilerini isteyen bir bot yazmaya çalışalım.

Çalışma mantığı şu şekilde olacaktır. Başlangıçta ekip tarafından /start yalnızca bir “Hava Durumu” düğmesi olan ana klavyeyi çağırırsınız. Bu düğmeye tıkladığınızda, mevcut hava durumunu öğrenmek istediğiniz şehri seçmeniz için Inline klavyeyle bir mesaj alacaksınız. Şehirlerden birini seçin ve güncel hava durumunu alın.

Bu kod örneğinde birkaç ek paket kullanacağız:

  • httr — herhangi bir API ile çalışmanın temel alındığı, HTTP istekleriyle çalışmaya yönelik bir paket. Bizim durumumuzda ücretsiz API'yi kullanacağız openweathermap.org.
  • stringr — metinle çalışmak için bir paket; bizim durumumuzda onu seçilen şehirdeki hava durumu hakkında bir mesaj oluşturmak için kullanacağız.

Kod 4: Seçilen şehrin güncel hava durumunu bildiren bir bot

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İNİZ' kısmını, botu oluştururken aldığınız gerçek jetonla değiştirdikten sonra yukarıdaki kod örneğini çalıştırın. BotBaba (Bir bot oluşturmaktan bahsetmiştim ilk makale).

Sonuç olarak botumuz şöyle çalışacak:
R'de telgraf botu yazma (bölüm 3): Bir bota klavye desteği nasıl eklenir

Şematik olarak bu bot şu şekilde gösterilebilir:
R'de telgraf botu yazma (bölüm 3): Bir bota klavye desteği nasıl eklenir

Hava durumu botumuzda 3 yöntem oluşturduk:

  • başlama — Ana bot klavyesini başlatın
  • hava — Bir şehir seçmek için Satır İçi klavyeyi başlatın
  • cevap_cb — Belirli bir şehir için API'den hava durumunu talep eden ve bunu sohbete gönderen ana yöntem.

yöntem başlama komutuyla başlatıyoruz /startişleyici tarafından uygulanan CommandHandler('start', start).

Bir yöntemi çalıştırmak için hava aynı adda bir filtre oluşturduk:

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

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

}
)

Ve bu yöntemi aşağıdaki mesaj işleyicisiyle çağırıyoruz: MessageHandler(weather, filters = MessageFilters$weather).

Ve sonunda ana yöntemimiz cevap_cb özel bir işleyici tarafından uygulanan Satır İçi düğmelere basıldığında tepki verir: CallbackQueryHandler(answer_cb).

Bir yöntemin içinde cevap_cbklavyeden gönderilen veriyi okuyup bir değişkene yazıyoruz city: city <- update$callback_query$data. Daha sonra API'den hava durumu verilerini talep ediyoruz, bir mesaj oluşturup gönderiyoruz ve son olarak yöntemi kullanıyoruz answerCallbackQuery Bot'a Satır İçi düğmesine tıklamayı işlediğimizi bildirmek için.

Belirtilen Hub'a bağlantılar içeren en son makalelerin listesini görüntüleyen bir bot örneği habr.com.

Bu botu size web sayfalarına yönlendiren Inline düğmelerin nasıl görüntüleneceğini göstermek için sunuyorum.

Bu botun mantığı bir öncekine benzer; başlangıçta ana klavyeyi şu komutla başlatıyoruz; /start. Daha sonra bot bize aralarından seçim yapabileceğimiz 6 hub'ın listesini veriyor, ilgilendiğimiz hub'ı seçiyoruz ve seçilen Hub'dan en yeni 5 yayını alıyoruz.

Anladığınız gibi bu durumda bir makale listesi almamız gerekiyor ve bunun için özel bir paket kullanacağız. habRBu, Habra'dan makaleler ve R'de bunlarla ilgili bazı istatistikler talep etmenize olanak tanır.

Kurulum paketi habR yalnızca ek bir pakete ihtiyaç duyacağınız github'dan mümkündür devtools. Kurulum için aşağıdaki kodu kullanın.

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

Şimdi yukarıda açıklanan botu oluşturma koduna bakalım:

Kod 5: Seçilen Hub'daki en son makalelerin listesini görüntüleyen bir bot

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İNİZ' kısmını, botu oluştururken aldığınız gerçek jetonla değiştirdikten sonra yukarıdaki kod örneğini çalıştırın. BotBaba (Bir bot oluşturmaktan bahsetmiştim ilk makale).

Sonuç olarak şu sonucu elde edeceğiz:
R'de telgraf botu yazma (bölüm 3): Bir bota klavye desteği nasıl eklenir

Yöntemde seçilebilecek Hub'ların listesini sabit kodladık 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)
}

Komutla belirtilen Hub'dan makalelerin bir listesini alıyoruz habr_hub_posts(), paketten habR. Aynı zamanda tüm zaman için bir makale listesine ihtiyacımız olmadığını, yalnızca 20 makalenin bulunduğu ilk sayfaya ihtiyacımız olduğunu belirtiyoruz. Komutu kullanarak ortaya çıkan tablodan head() Yalnızca en yeni makaleler olan ilk 5'i bırakıyoruz.

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

Mantık önceki bota çok benzer, ancak bu durumda işlevi kullanarak dinamik olarak makalelerin listesini içeren bir Satır İçi klavye oluşturuyoruz lapply().

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

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

Makalenin başlığını buton metnine ekliyoruz posts$title[x]ve tartışmada url makalenin bağlantısı: url = posts$link[x].

Daha sonra bir filtre ve işleyiciler oluşturup botumuzu başlatıyoruz.

Sonuç

Artık yazdığınız botların kullanımı komut girmek yerine klavyeden kontrol edileceği için çok daha rahat olacaktır. En azından, bir akıllı telefon aracılığıyla bir botla etkileşime girerken klavye, onu kullanma sürecini önemli ölçüde basitleştirecektir.

Bir sonraki makalede bir botla nasıl mantıksal bir diyalog oluşturulacağını ve veritabanlarıyla nasıl çalışılacağını bulacağız.

Kaynak: habr.com

DDoS korumalı siteler, VPS VDS sunucuları için güvenilir hosting satın alın 🔥 DDoS korumalı, güvenilir VPS ve VDS sunucu barındırma hizmeti satın alın | ProHoster