すでにメンバーの場合は

無料会員登録

GitHubアカウントで登録 Pikawakaが許可なくTwitterやFacebookに投稿することはありません。

登録がまだの方はこちらから

Pikawakaにログイン

GitHubアカウントでログイン Pikawakaが許可なくTwitterやFacebookに投稿することはありません。

Rails

更新日:

【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の追加

すると、以下のように選択したワークスペースのチャンネルに「このチャンネルに次のインテグレーションを追加しました:incoming-webhook」というメッセージが投稿されます。

Slackの画面

先ほどのページには以下のようにWebhook URLが表示されています。

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コマンドでインストールしましょう。

Gemfile
1
2
gem "slack-notifier"
gem "dotenv-rails"

環境変数を定義しよう

先ほど取得したWebhook URLは人に知られてはいけない情報なので、環境変数として定義します。今回はdotenv-railsを使って環境変数を定義します。定義するには.envというファイルが必要です。カレントディレクトリがアプリのルートディレクトリになっていることを確認し、以下のコマンドを実行してルートディレクトリ直下に.envファイルを作成しましょう。

コンソール
1
touch .env

このファイルが公開されないように、gitの管理対象外にします。
ルートディレクトリにある.gitignoreファイルの末尾に、以下のコードを追加しましょう。

.gitignore
1
/.env

作成した.envファイルに以下のように環境変数を定義します。

.env
1
WEBHOOK_URL=取得したWebhook URL

例えば、取得したWebhook URLが「https://hooks.slack.com/services/XXXXXXXXXXX/xxxxxxxxxxxxxxxx」であれば、下記のように記述します。先ほどコピーしたURLを貼り付けましょう。

.env
1
WEBHOOK_URL=https://hooks.slack.com/services/XXXXXXXXXXX/xxxxxxxxxxxxxxxx

.envファイルに定義した環境変数は、下記の様にENV['環境変数名']で使うことができます。rails cコマンドでコンソールを立ち上げ、確認してみましょう。

コンソール | .envに定義した環境変数を使う
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アクション内に先ほどのコードを以下のように追加します。

users_controller.rb
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>を記述します。

@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がついて通知されます。

@channel

同様に@hereとしたければ<!here>を記述します。

特定のユーザーにメンションをつける場合はSlackのユーザーIDが必要になります。ユーザー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を使うと簡単に通知機能を実装できます