2017年12月6日水曜日

slack-ruby-bot でイベント API を使う方法

概要

過去に Ruby + slack-api というライブラリを使ってリアルタイム API を試しました
それと同じことが slack-ruby-bot でもできるので試してみました
基本はイベントに応じて反応するボットを作成すれば OK です
Slack のイベント API で使えるイベントの一覧はこちらです

環境

  • macOS X 10.13.1
  • ruby 2.4.1p111
  • slack-ruby-bot 0.10.5

事前準備

前回の記事を参考にボットをチャネルに追加するところまで完了してください
今回作成するボットも同じチャネルでテストします
ちがうチャネルでボットをテストする場合はちゃんと invite してからメッセージを送ったりして試しましょう

メッセージのイベントに反応してみる

まずはメッセージ送信時にボット側のサーバに適当にロギングする処理を書いてみましょう

  • vim message_event.rb
# coding: utf-8
require 'slack-ruby-bot'

server = SlackRubyBot::Server.new(
  token: 'xoxb-111111111111-xxxxxxxxxxxxxxxxxxxxxxxx',
  hook_handlers: {
    message: [->(client, data) { puts "メッセージを受信しました" }]
  }
)
server.run

SlackRubyBot::Server クラスのインスタンスを作成します
その際に Bots インテグレーションで取得した API Token を指定します
また、hook_handlers を使って各イベント時に処理する内容を記載することもできる
今回は message イベントが発生したときにメッセージを出力しています
では実行してみましょう

  • bundle exec ruby message_event.rb

起動してボットがいるチャネルで何でもいいので発言してみましょう
するとプロンプトに puts のメッセージが表示されるのが確認できると思います

D, [2017-12-06T14:46:55.363616 #33653] DEBUG -- SlackRubyBot::Client#dispatch: channel=C1QD3RVNZ, source_team=T1QDA7KG9, team=T1QDA7KG9, text=a, ts=1512539214.000227, type=message, user=U1QDESGLS
メッセージを受信しました

イベントの反応時に独自クラスを使用する

先ほどのサンプルではイベント発生時にクロージャを使って処理を実装しました
複雑な処理をさせたいときには独自のクラスを作成してそのクラス内に処理を記載することができます

  • vim message_event.rb
# coding: utf-8
require 'slack-ruby-bot'

class Bot
  def call(client, data)
    puts data
  end
end

server = SlackRubyBot::Server.new(
  token: 'xoxb-111111111111-xxxxxxxxxxxxxxxxxxxxxxxx',
  hook_handlers: {
    message: Bot.new
  }
)
server.run

クラスを作成し call というメソッドを実装するとそれを勝手にコールバックメソッドとして実行してくれます
そしてそのクラスのインスタンスを先ほどクロージャで指定した部分に置き換えれば OK です
実行してチャネルにメッセージを送信する以下のようにメッセージのデバッグ情報が出力されると思います

channel=C1QD3RVNZ, source_team=T1QDA7KG9, team=T1QDA7KG9, text=b, ts=1512539887.000130, type=message, user=U1QDESGLS

ボットにチャネルへ返信させる

今度は puts デバッグではなくオウム返しでメッセージを返信させたいと思います

vim message_event.rb

# coding: utf-8
require 'slack-ruby-bot'
SlackRubyBot::Client.logger.level = Logger::WARN

class Bot
  def call(client, data)
    client.say(text: data.text, channel: data.channel)
  end
end

server = SlackRubyBot::Server.new(
  token: 'xoxb-111111111111-xxxxxxxxxxxxxxxxxxxxxxxx',
  hook_handlers: {
    message: Bot.new
  }
)
server.run

client.say を使います
引数に送信するメッセージとメッセージを送信するチャネル情報を設定します
ちなみに data は Slack::Messages::Message というクラスのオブジェクトになっています
text フィールドにメッセージが入っているのでそれを使ってオウム返しします

これで実行してメッセージを送ってみると送ったメッセージがそのまま返ってくるようになると思います
slack_ruby_bot_rtm1.png

最後に

slack-ruby-bot を使ってイベント API を使って見ました
SlackRubyBot::Server を使うのがポイントかなと思います
他にもいろんなイベントがあるので自分がやりたいことに合わせてイベントを選択してください

0 件のコメント:

コメントを投稿