更新日:
【Rails】 Slack APIを使って通知機能を実装しよう!
この記事ではSlack API
を使ってRuby on Railsで作成したアプリでSlackへの通知機能を実装する方法を学びます。
Slack APIとは
Slack APIとは、Slackというチャットアプリケーションの機能をプログラムから利用するためのツールです。APIを使うことで、Slackのチャンネルやユーザーにメッセージを送信したりすることができます。
Slackのワークスペースを作成しよう
まずは通知したいSlackのワークスペースを作成します。
※既存のワークスペースに通知する場合は、このステップをスキップして「incoming-webhookを追加しよう」の章へ進んでください。
最初にこちらからSlackにログインします。
ログイン後の画面で、「別のワークスペースを作成する」をクリックします。
すると以下の画面へ遷移するので「ワークスペースを作成する」をクリックします。
チーム名(ワークスペース名)を決める画面になるので、チーム名を入力し、「次へ」をクリックします。
名前を決める画面になるので、名前を入力し、「次へ」をクリックします。
他のメンバーを招待する画面になりますが、今回は「この手順をスキップする」で先へ進みます。
チームで取り組んでいることを入力する画面になるので、何かしらの文字を入力し、「次へ」をクリックします。
最後にプランの選択をします。今回は「フリープランで始める」を選択します。
これで新しいワークスペースが作成できました。
incoming-webhookを追加しよう
次にSlackにメッセージを送信するためincoming-webhook
という機能を追加します。
こちらからincoming-webhook
を通知したいチャンネルに追加します。
右上のワークスペース名が合っているか確認し、通知をしたいチャンネルを選択して「incoming-webhookインテグレーションの追加」をクリックします。
すると、以下のように選択したワークスペースのチャンネルに「このチャンネルに次のインテグレーションを追加しました:incoming-webhook」というメッセージが投稿されます。
先ほどのページには以下のようにWebhook URL
が表示されています。
こちらのURLは後ほど使用するのでコピーして保存しておきましょう。また、URLは他人に知られないように注意してください。
Railsプロジェクトを作成しよう
次にSlackと連携させるRailsのアプリを作成します。
まずはrails new
コマンドでアプリを作成しましょう。今回は例としてslack_app
という名前で作成します。
※アプリ名やオプションは自由に設定してください。
1
rails new slack_app
必要なgemを用意しよう
次にSlackと連携させるためのgemをGemfile
に追加します。今回は以下の2つのgemを使用します。
- slack-notifier:Slackに通知を送るためのgem
- dotenv-rails:環境変数を管理するためのgem
この2つのgemをGemfile
に追加し、bundle install
コマンドでインストールしましょう。
1
2
gem "slack-notifier"
gem "dotenv-rails"
環境変数を定義しよう
先ほど取得したWebhook URL
は人に知られてはいけない情報なので、環境変数として定義します。今回はdotenv-rails
を使って環境変数を定義します。定義するには.env
というファイルが必要です。カレントディレクトリがアプリのルートディレクトリになっていることを確認し、以下のコマンドを実行してルートディレクトリ直下に.env
ファイルを作成しましょう。
1
touch .env
このファイルが公開されないように、gitの管理対象外にします。
ルートディレクトリにある.gitignore
ファイルの末尾に、以下のコードを追加しましょう。
1
/.env
作成した.env
ファイルに以下のように環境変数を定義します。
1
WEBHOOK_URL=取得したWebhook URL
例えば、取得したWebhook URLが「https://hooks.slack.com/services/XXXXXXXXXXX/xxxxxxxxxxxxxxxx
」であれば、下記のように記述します。先ほどコピーしたURLを貼り付けましょう。
1
WEBHOOK_URL=https://hooks.slack.com/services/XXXXXXXXXXX/xxxxxxxxxxxxxxxx
.env
ファイルに定義した環境変数は、下記の様にENV['環境変数名']
で使うことができます。rails cコマンドでコンソールを立ち上げ、確認してみましょう。
1
2
ENV['WEBHOOK_URL']
=> "https://hooks.slack.com/services/XXXXXXXXXXX/xxxxxxxxxxxxxxxx"
scaffoldを使いシンプルなCDUDアプリを作ろう
今回のアプリは練習用アプリとして作成するので、Scaffolding機能を使い、シンプルなCRUDアプリを作成します。
以下のコマンドを順番に実行してください。
1
2
rails g scaffold User name:string age:integer
rails db:migrate
このコマンドによってname
カラムとage
カラムを持つusers
テーブルが作成されました。
サーバーを立ち上げhttp://localhost:3000/users
を開き、以下の画面が表示されていれば正常に実行されています。
通知機能を実装しよう
slack-notifier
のデフォルトの通知設定は、通知を実行するコントローラのアクション内で以下のように定義します。
1
2
3
4
5
6
notifier = Slack::Notifier.new "通知するSlackのWEBHOOK_URL" do
defaults channel: "#通知するチャンネル名",
username: "通知時に表示されるユーザー名"
end
notifier.ping "通知するメッセージ"
今回は新規ユーザーが登録された際に、Slackに「新しいユーザーが登録されました。」というメッセージを送信します。登録時に通知を行いたいので、users
コントローラのcreate
アクション内に先ほどのコードを以下のように追加します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 略〜
def create
@user = User.new(user_params)
respond_to do |format|
if @user.save
format.html { redirect_to user_url(@user), notice: "User was successfully created." }
format.json { render :show, status: :created, location: @user }
notifier = Slack::Notifier.new ENV['WEBHOOK_URL'] do
defaults channel: "#slack-api",
username: "通知BOT"
end
notifier.ping "新しいユーザーが登録されました。"
else
format.html { render :new, status: :unprocessable_entity }
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
# 略〜
この例ではslack-api
チャンネルに「通知BOT」というユーザー名で「新しいユーザーが登録されました。」というメッセージが投稿されます。slack-api
の部分は投稿したいチャンネル名に変更してください。
実際にユーザー登録をし、Slackに通知されれば完成です!
@channel
をつけて全体に通知を知らせるには、以下のようにメッセージ内に<!channel>
を記述します。
1
2
3
4
5
6
notifier = Slack::Notifier.new "通知するSlackのWEBHOOK_URL" do
defaults channel: "#通知するチャンネル名",
username: "通知時に表示されるユーザー名"
end
notifier.ping "<!channel>\n通知するメッセージ"
この例では\n
をつけることで改行をしています。
このコードでは以下のように@channel
がついて通知されます。
同様に@here
としたければ<!here>
を記述します。
特定のユーザーにメンションをつける場合はSlackのユーザーIDが必要になります。ユーザーIDはプロフィール画面右上の三点リーダーをクリックすると表示されるメニューの「メンバーIDをコピー」をクリックすることで取得できます。
ユーザーIDがABCDEFGHI
であれば<@ABCDEFGHI>
のように、ユーザーIDの前に@
を付けることで、特定のユーザーにメンションを付けることができます。
投稿された内容も表示したければ、下記のようにメッセージの中に入れることもできます。
マークダウンを使うこともでき、「新しいユーザーが登録されました。」の部分を太字にしたりすることができます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 略〜
def create
@user = User.new(user_params)
respond_to do |format|
if @user.save
format.html { redirect_to user_url(@user), notice: "User was successfully created." }
format.json { render :show, status: :created, location: @user }
message = <<~EOS
*新しいユーザーが登録されました。*
<@ABCDEFGHI>
名前: #{@user.name}
年齢: #{@user.age}
EOS
notifier = Slack::Notifier.new ENV['WEBHOOK_URL'] do
defaults channel: "#slack-api",
username: "通知BOT"
end
notifier.ping message
else
format.html { render :new, status: :unprocessable_entity }
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
# 略〜
このコードの場合、以下のように通知されます。
この記事のまとめ
- Slack APIを使うとSlackにメッセージを送信できます
- Webhook URLは人に知られないよう環境変数として定義しましょう
slack-notifier
というgemを使うと簡単に通知機能を実装できます