最近自分の中で話題のサービスFaaStRuby
を使ってSlack Botを作成します
FaaStRubyって何?って方はこちらをどうぞ
環境
faastruby : 0.2.1
slack側の設定
webhookの登録
今回はOutgoing Webhooksを使ってbotを作成するので、その設定を行う
https://teamname.slack.com/apps/manage/custom-integrations
ここからoutgoing webhooksのintegrationを作成する
outgoing webhooksが登録されていない場合は、https://teamname.slack.com/apps の検索窓から
「outgoing webhooks」で検索し作成する
作成したらIntegration SettingsのchannelとURLに、それぞれBotを入れたいチャンネルとfaastrubyで作ったエンドポイントを入力する
※ エンドポイントについては後述
FaaStRuby側の設定
こちら側ではbotの中身を作っていく
今回は簡単にユーザー名とユーザーが入力した言葉を返すbotを作る
Gemのインストール
$ gem install faastruby
ワークスペースの作成
今回はslackbot
という名前でワークスペースを作成した
恐らく重複しなければ好きな名前のものが作成できる
$ faastruby create-workspace slackbot
Functionの作成
こちらもslackbot
で作成している
$ faastruby new slackbot
上のコマンドを実行すると、以下のファイルが自動生成される
workspace(slackbot)
├─ function(slackbot)
├─ Gemfile
├─ handler.rb
├─ faastruby.yml
└─ spec
├─ handler_spec.rb
├─ spec_helper.rb
└─ helper
└─ faastruby.rb
この中のhandler.rb
がfunctionの中身
botの実装はこんな感じ
require 'json'
def handler event
data = event.body ? JSON.parse(event.body) : {}
response = {}
if data['user_name'] != 'slackbot'
response['text'] = "#{data['user_name']} : #{data['text']}"
end
respond_with response
end
eventはリクエスト情報を持つもので、event.bodyにリクエストの中身がstringで入っている
outgoing webhookのbotでは、以下のようなデータが渡されてくる
token=*********************
team_id=T0001
team_domain=example
channel_id=C2147483705
channel_name=test
timestamp=1355517523.000005
user_id=U2147483697
user_name=Steve
text=googlebot: What is the air-speed velocity of an unladen swallow?
trigger_word=googlebot:
respond_with response
でレスポンスを返す
以下のJSONを返すと、botがチャンネルの中でtextの中身をつぶやいてくれる
{
"text": "African or European?"
}
デプロイ
最後にFaaStRubyのサーバーにデプロイをするが、その前にfaastruby.yml
を少し書き換えておく
---
name: slackbot # function名
test_command: rspec # テストコマンド
abort_build_when_tests_fail: false # テストが失敗したときにビルドをやめるか
abort_deploy_when_tests_fail: false # テストが失敗したときにデプロイをやめるか
そのままだと、後半2つの設定をfalseにしておかないとテストで落ちてデプロイできない
spec/handler_spec.rb
のテストを、今回用に書き直せばtrueでもデプロイできる
デプロイコマンド
$ cd slackbot
$ faastruby deploy-to slackbot
デプロイが終わると以下のようなエンドポイントが作成される
https://api.faastruby.io/slackbot/slackbot
workspaceとfunctionの名前同じにしたの失敗した...
どっちがどっちかわからない
エンドポイントはこういう形になる
https://api.faastruby.io/workspace-name/function-name
このエンドポイントを、上のSlack Webhooksの設定に入れることでbotを動かすことができる
デモ

問題なく動いた
結論
FaaStRubyはいいぞ