人生のロケハン #経験してきたあれこれ

「これってなに?これってどうやるの?」の参考になるようなブログを目指します

Heroku + RubyでSlackのBotを制御

SlackのBotRubyで制御して、それをHeroku上で動かしたい

社内にはコーヒーマシンが置いてあり、以前は紙媒体のチケットを購入して利用していたのですが、これをチケットレスで管理したいということになり、社内コミュニケーションツールとして使っていたSlackのBotで管理しようということになりました。その時の開発メモになります。

 

開発環境

MAC OS X 10.10.5

Rubyruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin14]

SlackでBotを作成

Manage AppsからAppsの管理画面を開き、ページ上部の検索フォームにBotsと入力し、Add Configurationボタンを押下します。

画面の指示に従いBotの名前を入力して進めていくとBotが作成されます。作成された際の、この画面のAPI Tokenをメモしておきます。

f:id:tshidax:20170808113250p:plain

次に任意のディレクトリを作成し、コードを書いていきます。

Gemの追加

以下のリンク先を参考にGemfileにgemを追加します。

GitHub - slack-ruby/slack-ruby-client: A Ruby and command-line client for the Slack Web and Real Time Messaging APIs.

f:id:tshidax:20170808114056p:plain

Gemfile

gem ‘slack-ruby-client’

gem ‘eventmachine’

gem ‘faye-websocket’

terminalで

bundle install

Gemfileはbundle initで作成できます。

Botを制御するプログラム 

app.rb(ファイル名は任意)にbotを動かすファイルを作成します。

require 'slack-ruby-client'

client = Slack::RealTime::Client.new(token: 'メモしておいたAPI Token')

# 接続が成功した時にterminalに`connected!`と表示される
client.on :hello do
  puts 'connected!'
end

# Botがいるチャネルに何かメッセージを投げた際に動く
client.on :message do |data|
  case data.text
  when 'bot hello' then
    client.message channel: data.channel, text: "Hello <@#{data.user}>!"
  when /^bot/ then
    client.message channel: data.channel, text: "Hello <@#{data.user}>, what do you want?"
  else
    client.message channel: data.channel, text: "Sorry I don't understand..."
  end
end

client.start!

ローカルで動作確認

terminalで、ruby app.rbで動作確認

正常にプログラムが動けばtermianlにconnected!と表示され、SlackのBotが入っているチャネルでメッセージを投げるとこのように反応してくれます。

f:id:tshidax:20170808121807p:plain

Herokuにデプロイ

ローカルで動作確認ができたのでHerokuにデプロイします。

Herokuのアカウント作成

まずはHerokuのアカウントを作成します。

Cloud Application Platform | Heroku

アカウントを作成したら、Herokuをterminalで動かせるようにToolbeltをインストールします。

Heroku CLI | Heroku Dev Center

terminalで

brew install heroku

試しにheroku loginと打ち、ログインできるか確認してみてください。

Herokuのアプリを作成

先ほど作成したプログラムをHeroku上で動かすためにHerokuのアプリケーションを作成します。

terminalで

heroku create 任意のアプリケーションの名前

Procfileを作成

Herokuにデプロイする前にProcfileを作成します。

Procfile

app: bundle exec ruby app.rb

Procfileを作成したらHerokuにデプロイします。

terminalで

git add .  

git commit -m ‘init commit’

git push heroku master

もし、commitに含めたくないファイルがあれば.gitignoreを作成して、含めないようにしましょう。

気付いたら.gitignoreはgiboで自動生成する時代になっていた - Qiita

terminalで

gibo vim Ruby >> .gitignore

Herokuで動作確認

HerokuのアプリケーションのDashboardからDynosを立ち上げてSlackで動作確認します。 f:id:tshidax:20170808125016p:plain f:id:tshidax:20170808125021p:plain

ローカルで動作確認した時のようにBotが反応してくれればOKです。

terminalで立ち上げたい場合は

heroku ps:scale app=1 –app app_name

立ち下げは

heroku ps:scale app=0 –app app_name

API Tokenを環境変数に設定する

さて、先ほどはapp.rbに直接API Tokenを書いていましたが、外から見られる可能性があり、悪用されるかもしれないので、環境変数に設定します。

herokuに環境変数を設定

terminalで

heroku config:set API_Token=BotAPI Token

ローカルで動作確認する時にはdirenvを用いて環境変数を設定

terminalで

brew install direnv

Shellにhookを追加します。

export EDITOR=vim

eval “$(direnv hook bash)”

.envrcを作成 terminalで

direnv edit .

.envrcに環境変数を設定

export bot_api_token=‘BotAPI_Token’

まとめ

今回は開発環境を整えて、簡単なBotの制御までをまとめました。コーヒーマシン利用をBotに管理させるまでには、まだ色々とあるのですが、今回はここまでにします。実装自体も去年の年末ぐらいだったので、忘れている部分も多く、思い出しながら記事にしていけたらなと思っています。(その時に、まとめておかなかったことに後悔)