R でテレグラム ボットを作成する (パート 3): ボットにキーボード サポートを追加する方法

これは「R で電報ボットを書く」シリーズの XNUMX 回目の記事です。 以前の出版物では、電報ボットの作成方法、それを介してメッセージを送信する方法、ボットにコマンドとメッセージ フィルターを追加する方法を学びました。 したがって、この記事を読み始める前に、以下を読むことを強くお勧めします。 前の、 なぜならここでは、前述したボット構築の基本についてはこれ以上説明しません。

この記事では、キーボードを追加することでボットの使いやすさを向上させます。これにより、ボットのインターフェイスが直感的で使いやすくなります。

R でテレグラム ボットを作成する (パート 3): ボットにキーボード サポートを追加する方法

シリーズ「R で電報ボットを書く」のすべての記事

  1. ボットを作成し、それを使用して電報でメッセージを送信します
  2. コマンド サポートとメッセージ フィルターをボットに追加する
  3. ボットにキーボードのサポートを追加する方法

ページ内容

データ分析に興味がある場合は、私の記事に興味があるかもしれません。 電報 и ユーチューブ チャンネル。 コンテンツのほとんどは R 言語専用です。

  1. Telegram ボットはどのタイプのキーボードをサポートしていますか?
  2. 返信キーボード
  3. インラインキーボード
    3.1. InLine ボタンをサポートする単純なボットの例
    3.2. 選択した都市の現在の天気を報告するボットの例
    3.3. habr.com の指定されたハブへのリンクを含む最新記事のリストを表示するボットの例
  4. まとめ

Telegram ボットはどのタイプのキーボードをサポートしていますか?

この記事の執筆時点 telegram.bot XNUMX 種類のキーボードを作成できます。

  • Reply - メインの通常のキーボード。メッセージ テキスト入力パネルの下にあります。 このようなキーボードは単にテキスト メッセージをボットに送信し、テキストとしてボタン自体に書かれたテキストを送信します。
  • インライン - 特定のボット メッセージに関連付けられたキーボード。 このキーボードは、押されたボタンに関連付けられたボット データを送信します。このデータは、ボタン自体に書かれたテキストとは異なる場合があります。 そして、そのようなボタンは次のように処理されます コールバッククエリハンドラ.

ボットがキーボードを開くためには、メソッドを通じてメッセージを送信するときに必要です 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() 単にリストを渡すだけでなく、リストのリストを渡す必要があるのでしょうか? 実際には、メイン リストを渡し、その中でボタンの各行を個別のリストで定義します。 複数のボタンを XNUMX 行に配置できます。

引数 resize_keyboard キーボードのボタンの最適なサイズと引数を自動的に選択できます。 one_time_keyboard ボタンを押すたびにキーボードを非表示にできます。

3 つのボタンを持つ単純なボットを作成してみましょう。

  • チャット ID - ボットとの対話のチャット ID を要求します
  • 私の名前 - あなたの名前をリクエストしてください
  • 私のログイン - 電報でユーザー名をリクエストします

コード 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()

「YOUR BOT TOKEN」を、ボットの作成時に受け取った実際のトークンに置き換えた後、上記のコード例を実行します。 ボットファザー (ボットの作成について話しました 最初の記事).

起動後、ボットにコマンドを与えます /start、 なぜならこれはまさにキーボードを起動するために定義したものです。

R でテレグラム ボットを作成する (パート 3): ボットにキーボード サポートを追加する方法

現時点で、メソッド、フィルター、ハンドラーを作成して指定されたコード例を解析することが難しい場合は、前のコード例に戻る必要があります。 статьеで、これらすべてを詳細に説明しました。

4 つのメソッドを作成しました。

  • start — キーボードを起動します
  • chat_id — チャット ID を要求する
  • my_name — あなたの名前をリクエストします
  • my_username — ログインを要求する

物申す メッセージフィルター テキストに基づいて 3 つのメッセージ フィルターを追加しました。

  • chat_id — テキスト付きメッセージ "Чат ID"
  • name — テキスト付きのメッセージ "Моё имя"
  • ユーザー名 — テキスト付きのメッセージ "Мой логин"

そして、指定されたコマンドとフィルターに基づいて、指定されたメソッドを実行する 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
)

今回の場合、すべてのボタンを下に並べて配置しましたが、ボタン リストのリストを変更することでボタンを XNUMX 行に配置することができます。 なぜならキーボード内の XNUMX 行は、ネストされたボタンのリストによって作成されます。ボタンを XNUMX 行に表示するには、キーボードを構築するコードの一部を次のように書き直す必要があります。

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()、インライン ボタンを押したユーザーに電報インターフェイスに通知を表示できます。

[インライン] ボタンから送信されるデータはテキストではないため、それを処理するには、次のコマンドを使用して特別なハンドラーを作成する必要があります。 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()、返信キーボードと同じ原理です。 で InlineKeyboardMarkup() インライン ボタンのリストのリストを渡す必要があります。個々のボタンは関数によって作成されます。 InlineKeyboardButton().

インライン ボタンは、引数を使用してボットにデータを渡すことができます。 callback_data、または引数を使用して指定された HTML ページを開きます。 url.

結果は、各要素が XNUMX 行に結合する必要があるインライン ボタンのリストでもあるリストになります。

次に、インライン ボタンを備えたボットの例をいくつか見ていきます。

InLine ボタンをサポートする単純なボットの例

まず、covid-19 の高速検査用のボットを作成します。 コマンドによる /test、XNUMX つのボタンを備えたキーボードが送信され、押されたボタンに応じて、テストの結果を示すメッセージが送信されます。

コード 2: インライン キーボードを備えた最も単純なボット

library(telegram.bot)

# создаём экземпляр класса Updater
updater <- Updater('ТОКЕН ВАШЕГО БОТА')

# метод для отправки InLine клавиатуры
test <- function(bot, update) {

  # создаём InLine клавиатуру
  IKM <- InlineKeyboardMarkup(
    inline_keyboard = list(
      list(
        InlineKeyboardButton("Да", callback_data = 'yes'),
        InlineKeyboardButton("Нет", callback_data = 'no')
      )
    )
  )

  # Отправляем клавиатуру в чат
  bot$sendMessage(update$message$chat_id, 
                  text = "Вы болете коронавирусом?", 
                  reply_markup = IKM)
}

# метод для обработки нажатия кнопки
answer_cb <- function(bot, update) {

  # полученные данные с кнопки
  data <- update$callback_query$data

  # получаем имя пользователя, нажавшего кнопку
  uname <- update$effective_user()$first_name

  # обработка результата
  if ( data == 'no' ) {

    msg <- paste0(uname, ", поздравляю, ваш тест на covid-19 отрицательный.")

  } else {

    msg <- paste0(uname, ", к сожалени ваш тест на covid-19 положительный.")

  }

  # Отправка сообщения
  bot$sendMessage(chat_id = update$from_chat_id(),
                  text = msg)

  # сообщаем боту, что запрос с кнопки принят
  bot$answerCallbackQuery(callback_query_id = update$callback_query$id) 
}

# создаём обработчики
inline_h      <- CommandHandler('test', test)
query_handler <- CallbackQueryHandler(answer_cb)

# добавляем обработчики в диспетчер
updater <- updater + inline_h + query_handler

# запускаем бота
updater$start_polling()

「YOUR BOT TOKEN」を、ボットの作成時に受け取った実際のトークンに置き換えた後、上記のコード例を実行します。 ボットファザー (ボットの作成について話しました 最初の記事).

結果:
R でテレグラム ボットを作成する (パート 3): ボットにキーボード サポートを追加する方法

次の XNUMX つのメソッドを作成しました。

  • test — チャットに送信するには インライン キーボード
  • 答え_cb — キーボードから送信されたデータを処理するため。

各ボタンから送信されるデータを引数で指定します callback_data、ボタンを作成するとき。 コンストラクトを使用してボタンから送信されたデータを受信できます update$callback_query$data、メソッド内で 答え_cb.

ボットがインライン キーボードに反応するには、メソッド 答え_cb 特別なハンドラーによって処理されます。 CallbackQueryHandler(answer_cb)。 [インライン] ボタンをクリックすると、指定されたメソッドが実行されます。 ハンドラ コールバッククエリハンドラ XNUMX つの引数を取ります。

  • callback — 実行する必要があるメソッド
  • pattern — 引数を使用してボタンにバインドされたデータによるフィルター処理 callback_data.

したがって、引数を使用すると、 pattern 各ボタンを押すための個別のメソッドを作成できます。

コード 3: インライン ボタンごとに個別のメソッド

library(telegram.bot)

# создаём экземпляр класса Updater
updater <- Updater('ТОКЕН ВАШЕГО БОТА')

# метод для отправки InLine клавиатуры
test <- function(bot, update) {  

  # создаём InLine клавиатуру
  IKM <- InlineKeyboardMarkup(
    inline_keyboard = list(
      list(
        InlineKeyboardButton("Да", callback_data = 'yes'),
        InlineKeyboardButton("Нет", callback_data = 'no')
      )
    )
  )

  # Отправляем клавиатуру в чат
  bot$sendMessage(update$message$chat_id, 
                  text = "Вы болете коронавирусом?", 
                  reply_markup = IKM)
}

# метод для обработки нажатия кнопки Да
answer_cb_yes <- function(bot, update) {

  # получаем имя пользователя, нажавшего кнопку
  uname <- update$effective_user()$first_name

  # обработка результата
  msg <- paste0(uname, ", к сожалени ваш текст на covid-19 положительный.")

  # Отправка сообщения
  bot$sendMessage(chat_id = update$from_chat_id(),
                  text = msg)

  # сообщаем боту, что запрос с кнопки принят
  bot$answerCallbackQuery(callback_query_id = update$callback_query$id) 
}

# метод для обработки нажатия кнопки Нет
answer_cb_no <- function(bot, update) {

  # получаем имя пользователя, нажавшего кнопку
  uname <- update$effective_user()$first_name

  msg <- paste0(uname, ", поздравляю, ваш текст на covid-19 отрицательный.")

  # Отправка сообщения
  bot$sendMessage(chat_id = update$from_chat_id(),
                  text = msg)

  # сообщаем боту, что запрос с кнопки принят
  bot$answerCallbackQuery(callback_query_id = update$callback_query$id) 
}

# создаём обработчики
inline_h          <- CommandHandler('test', test)
query_handler_yes <- CallbackQueryHandler(answer_cb_yes, pattern = 'yes')
query_handler_no  <- CallbackQueryHandler(answer_cb_no, pattern = 'no')

# добавляем обработчики в диспетчер
updater <- updater + 
            inline_h + 
            query_handler_yes +
            query_handler_no

# запускаем бота
updater$start_polling()

「YOUR BOT TOKEN」を、ボットの作成時に受け取った実際のトークンに置き換えた後、上記のコード例を実行します。 ボットファザー (ボットの作成について話しました 最初の記事).

これで 2 つの別々のメソッドを作成しました。 ボタンを押すごとに XNUMX つのメソッドが作成され、引数が使用されます。 pattern、ハンドラーを作成するとき:

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

メソッドコードの終了 答え_cb チーム bot$answerCallbackQuery(callback_query_id = update$callback_query$id)、インライン キーボードからデータを受信したことをボットに伝えます。

選択した都市の現在の天気を報告するボットの例

気象データをリクエストするボットを作成してみましょう。

その動作のロジックは次のようになります。 当初はチームによって /start 「天気」ボタンが XNUMX つだけあるメイン キーボードを呼び出します。 このボタンをクリックすると、現在の天気を調べたい都市を選択するためのメッセージがインライン キーボードで表示されます。 いずれかの都市を選択すると、現在の天気が表示されます。

このコード例では、いくつかの追加パッケージを使用します。

  • httr — HTTP リクエストを操作するためのパッケージ。これに基づいて API を操作する機能が構築されます。 この例では、無料の API を使用します。 オープンウェザーマップ.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()

「YOUR BOT TOKEN」を、ボットの作成時に受け取った実際のトークンに置き換えた後、上記のコード例を実行します。 ボットファザー (ボットの作成について話しました 最初の記事).

その結果、ボットは次のように動作します。
R でテレグラム ボットを作成する (パート 3): ボットにキーボード サポートを追加する方法

概略的には、このボットは次のように表現できます。
R でテレグラム ボットを作成する (パート 3): ボットにキーボード サポートを追加する方法

天気予報ボット内で使用できる 3 つのメソッドを作成しました。

  • start — メインボットのキーボードを起動します
  • 天気 — インラインキーボードを起動して都市を選択します
  • 答え_cb — 特定の都市の API から天気をリクエストし、チャットに送信するメイン メソッド。

方法 start コマンドで起動します /start、ハンドラーによって実装されます CommandHandler('start', start).

メソッドを実行するには 天気 同じ名前のフィルターを作成しました。

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

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

}
)

そして、次のメッセージ ハンドラーを使用してこのメ​​ソッドを呼び出します。 MessageHandler(weather, filters = MessageFilters$weather).

そして最終的に、私たちの主な方法は 答え_cb インライン ボタンの押下に反応します。これは特別なハンドラーによって実装されます。 CallbackQueryHandler(answer_cb).

メソッド内 答え_cb、キーボードから送信されたデータを読み取り、変数に書き込みます city: city <- update$callback_query$data。 次に、API から気象データをリクエストし、メッセージを生成して送信し、最後にメソッドを使用します。 answerCallbackQuery インライン ボタンのクリックを処理したことをボットに通知するためです。

から指定された Hub へのリンクを含む最新記事のリストを表示するボットの例 habr.com.

このボットは、Web ページにつながるインライン ボタンを表示する方法を示すために紹介します。

このボットのロジックは前のボットと似ており、最初に次のコマンドでメイン キーボードを起動します。 /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()

「YOUR 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)

ロジックは前のボットと非常によく似ていますが、この場合は関数を使用して記事のリストを含むインライン キーボードを動的に生成します。 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].

次に、フィルターとハンドラーを作成し、ボットを起動します。

まとめ

コマンドを入力するのではなくキーボードから制御されるため、作成したボットははるかに使いやすくなります。 少なくとも、スマートフォンを介してボットと対話する場合、キーボードを使用すると、その使用プロセスが大幅に簡素化されます。

次の記事では、ボットとの論理的な対話を構築し、データベースを操作する方法を説明します。

出所: habr.com

コメントを追加します