2016年9月15日木曜日

Slack の Real Time Messaging API を使って Bot 作成

概要

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 にログインしていないと生成できないのでログインしておきましょう
トークンを作成すると以下のように表示されると思います
slack_api_tested_api.png

そしたらそのすぐ下に API 試すリンクがあるので移動してみましょう
リンクは以下になります
https://api.slack.com/methods/auth.test/test
アクセスした「Test Method」をクリックして取得したトークンが問題ないか確認してみましょう
slack_api_created_token.png

“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

実行して動作確認してみましょう
slack_api_send_ret.png

これで、あるユーザの mention にだけ反応するボットが作成できました

最後に

RTM API を使ってオリジナルのボットを作成してみました
結構簡単にできてビックリしました

Hubot や ruboty も同じようなことをしていると思います
Hubot の場合、Hubot が参加しているチャネルのメッセージのみ受信することができ、Hubot をいろんなチャネルに JOIN させるのが嫌だったという理由もあって今回ボットを自作してみました

次回はこれとデバイスを使ってちょっとインタラクティブなことをしてみたいと思います

参考サイト

0 件のコメント:

コメントを投稿