R でテレグラム ボットを作成する (パート 2): コマンド サポートとメッセージ フィルターをボットに追加する

В 以前の出版物 ボットを作成する方法を考え出し、クラスのインスタンスを初期化しました Bot そして、それを使用してメッセージを送信する方法に慣れました。

この記事ではこのトピックの続きを説明するので、この記事を読んだ後に読み始めることをお勧めします。 最初の部分.

今回は、ボットを復活させてコマンドサポートを追加する方法を見つけ、クラスについても理解します。 Updater.

この記事の過程で、いくつかの単純なボットを作成します。後者は、指定された日付と国コードに基づいて、運用カレンダーに従って指定された国の日が週末であるか営業日であるかを判断します。 ただし、前と同様、この記事の目的はパッケージのインターフェイスに慣れることです。 telegram.bot 自分の問題を解決するために。

R でテレグラム ボットを作成する (パート 2): コマンド サポートとメッセージ フィルターをボットに追加する

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

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

ページ内容

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

  1. アップデータークラス
  2. ハンドラー - ハンドラー
  3. 最初のコマンドをボット、コマンド ハンドラーに追加します。
  4. テキストメッセージプロセッサとフィルタ
  5. パラメータ付きのコマンドの追加
  6. ボットをバックグラウンドで実行する
  7. まとめ

アップデータークラス

Updater 電報ボットの開発を容易にするクラスであり、内部でこのクラスを使用します Dispetcher。 クラスの割り当て Updater ボットから更新を受信することです (前の記事では、この目的のためにメソッドを使用しました) getUpdates())、さらにそれらを転送します Dispetcher.

順番に Dispetcher 作成したハンドラーが含まれています。 クラスオブジェクト Handler.

ハンドラー - ハンドラー

追加するハンドラーについて Dispetcher さまざまなイベントに対するボットの反応。 この記事を書いている時点では telegram.bot 次のタイプのハンドラーが追加されました。

  • MessageHandler — メッセージ ハンドラー
  • CommandHandler — コマンド ハンドラー
  • CallbackQueryHandler — Inline から送信されるキーボードのデータ ハンドラー
  • ErrorHandler — ボットからの更新をリクエストするときのエラー ハンドラー

最初のコマンドをボット、コマンド ハンドラーに追加します。

これまでにボットを使用したことがなく、コマンドが何なのかわからない場合は、ボットへのコマンドはスラッシュを使用して送信する必要があります。 / 接頭辞として。

簡単なコマンドから始めます。 ボットにコマンドで挨拶するように教えてみましょう /hi.

コード 1: ボットに挨拶を教える

library(telegram.bot)

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

# Пишем метод для приветсвия
say_hello <- function(bot, update) {

  # Имя пользователя с которым надо поздароваться
  user_name <- update$message$from$first_name

  # Отправка приветственного сообщения
  bot$sendMessage(update$message$chat_id, 
                  text = paste0("Моё почтение, ", user_name, "!"), 
                  parse_mode = "Markdown")

}

# создаём обработчик 
hi_hendler <- CommandHandler('hi', say_hello)

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

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

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

方法 start_polling() クラス Updaterコードの最後で使用されるこれにより、ボットからの更新の要求と処理の無限ループが開始されます。

それでは、Telegram を開いてボットに最初のコマンドを書き込んでみましょう /hi.

R でテレグラム ボットを作成する (パート 2): コマンド サポートとメッセージ フィルターをボットに追加する

これでボットがコマンドを理解できるようになりました /hi、そして私たちへの挨拶の仕方を知っています。

このような単純なボットを構築するプロセスは、次のように概略的に表すことができます。

R でテレグラム ボットを作成する (パート 2): コマンド サポートとメッセージ フィルターをボットに追加する

  1. クラスのインスタンスを作成する Updater;
  2. 私たちはメソッドを作成します。 ボットが実行する機能。 コード例では、これは関数です say_hello()。 ボット メソッドとして使用する関数には、XNUMX つの必須引数が必要です。 ボット и update、およびオプションの - XNUMX つ 引数。 口論 ボット、これはあなたのボットです。これを利用して、メッセージに返信したり、メッセージを送信したり、ボットで利用可能なその他の方法を使用したりできます。 口論 update これはボットがユーザーから受け取ったもので、実際には、メソッドを使用して最初の記事で受け取ったものです。 getUpdates()。 口論 引数 コマンドとともにユーザーから送信された追加データを処理できます。このトピックについては後ほど説明します。
  3. ハンドラーを作成します。 いくつかのユーザーアクションを前のステップで作成したメソッドに関連付けます。 基本的に、ハンドラーはトリガー、つまりボット関数を呼び出すイベントです。 この例では、そのようなトリガーはコマンドを送信しています。 /hi、チームによって実装されます hi_hendler <- CommandHandler('hi', say_hello)。 関数の最初の引数 CommandHandler() この場合、コマンドを指定できます hi、ボットが応答します。 XNUMX 番目の引数では、ボット メソッドを指定できます。メソッドを呼び出します。 say_hello、ユーザーが最初の引数で指定されたコマンドを呼び出した場合に実行されます。
  4. 次に、作成したハンドラーをクラス インスタンスのディスパッチャーに追加します。 Updater。 ハンドラーはいくつかの方法で追加できます。上の例では、記号を使用した最も単純な方法を使用しました。 +すなわち updater <- updater + hi_hendler。 メソッドを使用しても同じことができます add_handler()、クラスに属します Dispatcher、このメソッドは次のように見つけることができます。 updater$dispatcher$add_handler();
  5. コマンドを使用してボットを起動します start_polling().

テキストメッセージプロセッサとフィルタ

ボットにコマンドを送信する方法はわかりましたが、場合によっては、ボットがコマンドだけでなく、通常のテキスト メッセージにも応答する必要があります。 これを行うには、メッセージハンドラーを使用する必要があります- メッセージハンドラ.

ノーマル メッセージハンドラ 受信メッセージすべてに絶対に応答します。 したがって、メッセージ ハンドラーはフィルターと組み合わせて使用​​されることがよくあります。 コマンドだけでなく挨拶するようにボットに教えてみましょう /hiだけでなく、ボットに送信されるメッセージに次の単語のいずれかが出現するときも同様です: こんにちは、こんにちは、敬礼、ハイ、ボンジュール。

今のところ、新しいメソッドは作成しません。 ボットが私たちに挨拶する方法はすでにあります。 必要なのは、必要なフィルターとメッセージ ハンドラーを作成することだけです。

コード 2: テキスト メッセージ ハンドラーとフィルターを追加する

library(telegram.bot)

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

# Пишем метод для приветсвия
## команда приветвия
say_hello <- function(bot, update) {

  # Имя пользователя с которым надо поздароваться
  user_name <- update$message$from$first_name

  # Отправляем приветсвенное сообщение
  bot$sendMessage(update$message$chat_id, 
                  text = paste0("Моё почтение, ", user_name, "!"),
                  parse_mode = "Markdown",
                  reply_to_message_id = update$message$message_id)

}

# создаём фильтры
MessageFilters$hi <- BaseFilter(function(message) {

  # проверяем, встречается ли в тексте сообщения слова: привет, здравствуй, салют, хай, бонжур
  grepl(x           = message$text, 
        pattern     = 'привет|здравствуй|салют|хай|бонжур',
        ignore.case = TRUE)
  }
)

# создаём обработчик 
hi_hendler <- CommandHandler('hi', say_hello) # обработчик команды hi
hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi)

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

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

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

次に、前にリストした挨拶言葉を含むいくつかのメッセージをボットに送信してみましょう。
R でテレグラム ボットを作成する (パート 2): コマンド サポートとメッセージ フィルターをボットに追加する

そこで、まずボットに、ただ挨拶するだけでなく、挨拶に応答することも教えました。 引数を使用してこれを実行しました Reply_to_message_id、メソッドで利用可能です sendMessage(), ここに、応答したいメッセージの ID を転送する必要があります。 次のようにメッセージ ID を取得できます。 update$message$message_id.

しかし、私たちが行った主な作業は、関数を使用してボットにフィルターを追加することでした。 BaseFilter():

# создаём фильтры
MessageFilters$hi <- BaseFilter( 

  # анонимная фильтрующая функция
  function(message) {

    # проверяем, встречается ли в тексте сообщения слова приветствия
    grepl(x           = message$text, 
          pattern     = 'привет|здравствуй|салют|хай|бонжур',
          ignore.case = TRUE)
  }

)

お気づきかもしれませんが、オブジェクトにフィルターを追加する必要があります。 メッセージフィルター、これには最初から既製のフィルターの小さなセットが含まれています。 この例では、オブジェクトに対して メッセージフィルター 要素を追加しました hi、これは新しいフィルターです。

機能中 BaseFilter() フィルター関数を渡す必要があります。 本質的に、フィルターはメッセージ インスタンスを受け取って返す単なる関数です。 TRUE または 間違った情報。 この例では、基本関数を使用して、次のような単純な関数を作成しました。 grepl() メッセージテキストをチェックし、それが正規表現と一致するかどうかを確認します привет|здравствуй|салют|хай|бонжур 戻る TRUE.

次にメッセージハンドラーを作成します hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi)。 関数の最初の引数 MessageHandler() はハンドラーを呼び出すメソッドで、XNUMX 番目の引数はハンドラーの呼び出しに使用されるフィルターです。 私たちの場合、これは作成したフィルターです MessageFilters$hi.

最後に、作成したハンドラーをディスパッチャーに追加します。 hi_txt_hnd.

updater <- updater + 
             hi_hendler +
             hi_txt_hnd

上にも書きましたが、パッケージには telegram.bot そしてオブジェクト メッセージフィルター 使用できる組み込みフィルターのセットがすでに存在します。

  • all — すべてのメッセージ
  • text — テキストメッセージ
  • command — コマンド、つまりで始まるメッセージ /
  • Reply — 別のメッセージに対する返信であるメッセージ
  • audio — 音声ファイルを含むメッセージ
  • document — 送信されたドキュメントを含むメッセージ
  • 写真 - 送信された画像付きのメッセージ
  • ステッカー — 送信されたステッカーを含むメッセージ
  • ビデオ — ビデオ付きメッセージ
  • voice - 音声メッセージ
  • contact — ユーザーの電報内容を含むメッセージ
  • location — 地理位置情報を含むメッセージ
  • 会場 — 転送されたメッセージ
  • ゲーム — ゲーム

XNUMX つのハンドラーでいくつかのフィルターを結合したい場合は、記号を使用してください。 | - 論理的なものとして OR、および署名 & 論理的に И。 たとえば、ボットがビデオ、画像、またはドキュメントを受信したときに同じメソッドを呼び出すようにしたい場合は、次の例を使用してメッセージ ハンドラーを作成します。

handler <- MessageHandler(callback, 
  MessageFilters$video | MessageFilters$photo | MessageFilters$document
)

パラメータ付きのコマンドの追加

コマンドとは何か、その作成方法、ボットに目的のコマンドを強制的に実行する方法はすでにわかっています。 ただし、場合によっては、コマンド名に加えて、それを実行するためにデータを渡す必要があります。

以下は、特定の日付と国を指定すると、運用カレンダーから日付の種類を返すボットの例です。

以下のボットは実稼働カレンダー API を使用します isdayoff.ru.

コード 3: 日付と国別にレポートするボット

library(telegram.bot)

# создаём экземпляр класса Updater
updater <- Updater('1165649194:AAFkDqIzQ6Wq5GV0YU7PmEZcv1gmWIFIB_8')

# Пишем метод для приветсвия
## команда приветвия
check_date <- function(bot, update, args) {

  # входящие данные
  day     <- args[1]  # дата
  country <- args[2]  # страна

  # проверка введённых параметров
  if ( !grepl('\d{4}-\d{2}-\d{2}', day) ) {

    # Send Custom Keyboard
    bot$sendMessage(update$message$chat_id, 
                    text = paste0(day, " - некорреткная дата, введите дату в формате ГГГГ-ММ-ДД"),
                    parse_mode = "Markdown")

  } else {
    day <- as.Date(day)
    # переводим в формат POSIXtl
    y <- format(day, "%Y")
    m <- format(day, "%m")
    d <- format(day, "%d")

  }

  # страна для проверки
  ## проверяем задана ли страна
  ## если не задана устанавливаем ru
  if ( ! country %in% c('ru', 'ua', 'by', 'kz', 'us') ) {

    # Send Custom Keyboard
    bot$sendMessage(update$message$chat_id, 
                    text = paste0(country, " - некорретктный код страны, возможнные значения: ru, by, kz, ua, us. Запрошены данные по России."),
                    parse_mode = "Markdown")

    country <- 'ru'

  }

  # запрос данных из API
  # компоновка HTTP запроса
  url <- paste0("https://isdayoff.ru/api/getdata?",
                "year=",  y, "&",
                "month=", m, "&",
                "day=",   d, "&",
                "cc=",    country, "&",
                "pre=1&",
                "covid=1")

  # получаем ответ
  res <- readLines(url)

  # интрепретация ответа
  out <- switch(res, 
                "0"   = "Рабочий день",
                "1"   = "Нерабочий день",
                "2"   = "Сокращённый рабочий день",
                "4"   = "covid-19",
                "100" = "Ошибка в дате",
                "101" = "Данные не найдены",
                "199" = "Ошибка сервиса")

  # отправляем сообщение
  bot$sendMessage(update$message$chat_id, 
                  text = paste0(day, " - ", out),
                  parse_mode = "Markdown")

}

# создаём обработчик 
date_hendler <- CommandHandler('check_date', check_date, pass_args = TRUE)

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

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

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

メソッドを XNUMX つだけ備えたボットを作成しました check_date、このメソッドは同じ名前のコマンドによって呼び出されます。

ただし、この方法では、コマンド名に加えて、国コードと日付の XNUMX つのパラメーターを入力する必要があります。 次に、ボットは、指定された国の特定の日が、公式の運用カレンダーに従って週末、短縮日、または営業日であるかどうかを確認します。

作成したメソッドがコマンドとともに追加のパラメーターを受け入れるようにするには、引数を使用します pass_args = TRUE 機能的に CommandHandler()、メソッドを作成するときは、必要な引数に加えて、 ボット, update オプションのものを作成します - 引数。 この方法で作成されたメソッドは、コマンド名の後にボットに渡すパラメーターを受け入れます。 パラメータはスペースで区切る必要があり、テキスト ベクトルとしてメソッドに送信されます。

ボットを起動してテストしてみましょう。

R でテレグラム ボットを作成する (パート 2): コマンド サポートとメッセージ フィルターをボットに追加する

ボットをバックグラウンドで実行する

完了する必要がある最後のステップは、ボットをバックグラウンドで起動することです。

これを行うには、以下で説明するアルゴリズムに従います。

  1. ボット コードを拡張子 R のファイルに保存します。RStudio で作業する場合、これはメニューから行われます。 File、 チーム 名前を付けて保存….
  2. R 言語をインストールしたフォルダーにある bin フォルダーへのパスを Path 変数に追加します。 ここで.
  3. 通常のテキスト ファイルを作成し、次の 1 行を記述します。 R CMD BATCH C:UsersAlseyDocumentsmy_bot.R。 の代わりに C:UsersAlseyDocumentsmy_bot.R ボット スクリプトへのパスを記述します。 同時に、途中にキリル文字やスペースが存在しないことが重要です。 これにより、ボットの実行時に問題が発生する可能性があります。 それを保存し、拡張子を次のように置き換えます TXT на バット.
  4. Windows タスク スケジューラを開きます。これを行うにはさまざまな方法があります。たとえば、任意のフォルダを開いてアドレスを入力します。 %windir%system32taskschd.msc /s。 他の起動方法も見つかります ここで.
  5. スケジューラーの右上メニューで、「タスクの作成...」をクリックします。
  6. [全般] タブで、タスクにカスタム名を付け、スイッチを [すべてのユーザーに対して実行] 状態に切り替えます。
  7. 「アクション」タブに移動し、「作成」をクリックします。 「プログラムまたはスクリプト」フィールドで「参照」をクリックし、XNUMX番目のステップで作成したものを見つけます。 バット ファイルを選択し、「OK」をクリックします。
  8. [OK] をクリックし、必要に応じてオペレーティング システム アカウントのパスワードを入力します。
  9. スケジューラーで作成したタスクを見つけて選択し、右下隅にある「実行」ボタンをクリックします。

当社のボットはバックグラウンドで実行され、タスクが停止されるか、ボットが起動された PC またはサーバーの電源がオフになるまで動作します。

まとめ

この記事では、メッセージを送信するだけでなく、受信したメッセージやコマンドに応答できる本格的なボットを作成する方法を見つけました。 得られた知識はすでに問題のほとんどを解決するのに十分です。

次の記事では、作業をより便利にするためにボットにキーボードを追加する方法について説明します。

私の購読を購読してください 電報 и ユーチューブ チャネル。

出所: habr.com

コメントを追加します