概要
Slack API の一つに Real Time Messaging (RTM) API というものがあります
これを使うとメッセージの受信や送信がリアルタイムでできるようになります
所謂ボットを作成することができます
今回は Ruby を使って実装してみました
環境
- Mac OS X 10.10.5
- Ruby 2.3.1p112
- Gem 2.5.1
- slack-api 1.2.4
API トークンの取得
まずは Slack API を使うために API をコールするためのトークンを取得します
https://api.slack.com/docs/oauth-test-tokens にアクセスし「Create token」をクリックします
Slack にログインしていないと生成できないのでログインしておきましょう
トークンを作成すると以下のように表示されると思います
そしたらそのすぐ下に API 試すリンクがあるので移動してみましょう
リンクは以下になります
https://api.slack.com/methods/auth.test/test
アクセスした「Test Method」をクリックして取得したトークンが問題ないか確認してみましょう
“ok”: true になれば問題ないです
RTM を使ってメッセージを受信する
では取得したトークンを使って RTM API をコールしてみましょう
- bundle init
- vim Gemfile
- gem “slack-api”
- vim msg_receive.rb
require 'slack'
Slack.configure {|config| config.token = "xoxp-xxxxxxxxxxx-xxxxxxxxxxx-xxxxxxxxxxx-xxxxxxxxxx" }
client = Slack.realtime
client.on :hello do
puts 'Successfully connected.'
end
client.on :message do |data|
puts data
end
client.start
実行は
- bundle install && bundle exec ruby msg_receive.rb
で OK です
成功すると
以下のような感じでコンソールに表示されると思います
Successfully connected.
{"type"=>"message", "channel"=>"C0XXXXXXX", "user"=>"U1XXXXXX", "text"=>"t", "ts"=>"1473922916.000034", "team"=>"T1XXXXXX"}
メッセージを受信できるのは API トークンを発行したユーザが所属しているチャネルのみになります
なので、所属していないチャネルのメッセージは受信できないのでメッセージを受信したいチャネルがあれば JOIN してください
メッセージを送信する
では次にメッセージを送信してみましょう
メッセージの送信は RTM API を使いません
先ほどのコードをちょっと改造しています
- vim msg_send.rb
user = "@U1XXXXXXX"
@token = "xoxp-xxxxxxxxxxx-xxxxxxxxxxx-xxxxxxxxxxx-xxxxxxxxxx"
require 'slack'
Slack.configure {|config| config.token = @token }
client = Slack.realtime
client.on :hello do
puts 'Successfully connected.'
end
def post(channel)
params = {
:token => @token,
:channel => channel,
:username => "ruby-my-bot",
:text => 'message',
:icon_url => 'http://blogs.microsoft.co.il/blogs/shayf/WindowsLiveWriter/GettingStartedWithDynamicLanguages_B665/ruby_logo_2.png'
}
Slack.chat_postMessage params
end
client.on :message do |data|
if data['text'].include?("<#{user}>")
post(data['channel'])
end
end
client.start
メッセージを受信したときに text フィールドから mention かどうかを判断して、ある user に対する mention であれば Slack に返信するスクリプトになっています
返信するための関数を「post」 として作成しています
今回はメッセージを受信したチャネルに対してそのまま送信します
実体は「Slack.chat_postMessage」で指定したチャネルに対してメッセージを送信することができます
chat_postMessage
に指定できるパラメータは他にもたくさんあるので詳しくは以下を参照してください
https://api.slack.com/methods/chat.postMessage
実行して動作確認してみましょう
これで、あるユーザの mention にだけ反応するボットが作成できました
最後に
RTM API を使ってオリジナルのボットを作成してみました
結構簡単にできてビックリしました
Hubot や ruboty も同じようなことをしていると思います
Hubot の場合、Hubot が参加しているチャネルのメッセージのみ受信することができ、Hubot をいろんなチャネルに JOIN させるのが嫌だったという理由もあって今回ボットを自作してみました
次回はこれとデバイスを使ってちょっとインタラクティブなことをしてみたいと思います
0 件のコメント:
コメントを投稿