概要
過去に 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 を使ってイベント API を使って見ました
SlackRubyBot::Server
を使うのがポイントかなと思います
他にもいろんなイベントがあるので自分がやりたいことに合わせてイベントを選択してください
0 件のコメント:
コメントを投稿