この記事について
RailsでSlackAPIを使用した開発をする機会があったのでやり方のメモとして残しておきます。
画像が多めなため内容を細かく分割しています。ご了承ください。
なおこの記事は 2022/02 時点での設定方法、画面情報です。
Slackの画面に変更がある場合は随時対応が必要になるのでご注意ください。
動作環境
動作環境は以下になります。
gem slack-ruby-client
は最新のバージョンではないので注意が必要です。
- OS: MacOS(11.6.2, BigSur)
- Ruby: 2.6.6
- Rails: 6.0.3.6
- slack-ruby-client: 0.16.0
- ActiveJob: 6.0.3.6
- rails-dotenv
また事前に以下の準備が必要になります。
- Slackでワークスペースを追加する
- 追加したワークスペースにチャンネルを追加
この記事で取り上げないこと
- Slack APIを使用するための登録方法
- エラー対応
この記事でできること
SlackAPIを使用してRailsアプリで以下をできるようにすることが目的です。
- Slackに登録されているユーザーを探す
- ユーザーが見つかったら自動的に該当するSlackワークスペース
- ユーザー用ののチャンネルを作成する
- 作成したチャンネルに追加(招待)する
- Slackワークスペースに登録されている既存のチャンネルにユーザーを追加(招待)する
Railsアプリの準備
下記リポジトリに、今回使うRailsアプリを用意しましたのでcloneしてください。
README.md の手順にしたがって、環境構築を行ってください。
SlackAPIでアプリを作成する(Bot用のAPIキーを作成する)
一般的にAPIキーを作成する場合はサイト上でAPIキーを発行するだけですが、
SlackAPIではアプリを作るという行為が必要になります。
アプリを作成するとAPIキーが発行されます。
SlackAPI登録画面へ
まずは以下にアクセスします。
Slack API: Applications | Slack
Slackアプリ作成画面移動する
アクセスしたページに Create New App
のボタンがあるのでクリックします。
クリックすると以下のダイアログが表示されるので From scratch
を選択します。
以下のダイアログが表示で App Name
, Pick a workspace to develop your app in
が表示されるので、
-
App Name(必須)
: 好きな名前(今回はtest2
) -
Pick a workspace to develop your app in
: 今回開発で使用するworkspace を選択
といった形で入力欄を埋めてCreate App
をクリックします。
Create App
を実行すると以下の画面が表示されます。
Bots
という項目があるので選択します。
Review Scopes to Add
を選択
選択すると以下の画面が表示されます。
Review Scopes to Add
を選択します。
Add an OAuth Scope
をクリック
少し下にスクロールするとScopes
という項目があるのでAdd an OAuth Scope
をクリックします。
クリックすると以下の選択項目が表示されます。
(文字入力で検索することも可能です)
必要なScopeを追加する画面の概要
ここで悩むのがどのScopeを追加すればよいかです。
以下の画面のAPI methods
のリンクにとべば確認できます(Web API methods | Slack)。
すると以下のようにWeb API methods
一覧と説明が表示されています。
その中のひとつを選択すると以下のような画面が表示されRequired scopes
の項目の黄色で表示されている内容が必要なScopeになります。
これを前述したページで一つずつ追加していく必要があります。
ちなみにLegacy bot tokens
のScopeは2020/05/05
以降は使えなくなっているので使用できません。
量が多すぎますね...
しかもここでは説明文での検索ができません(メソッド名での検索しかできない)。
膨大なドキュメントから該当する項目を見つけて実際に動作するか確認するのは試行錯誤になる可能性があります。
今回使用するMethod, Scope一覧
探すのは大変なのでサクっと使用するMethod, Scopeを列挙します。
列挙したScopeを前述した画面で追加してきます。
- Slackに登録されているユーザーを検索
- Method: users.lookupByEmail method | Slack
- Scope
- users:read.email
- users:read
- ワークスペースにチャンネルを作成する
- Method: conversations.create method | Slack
- Scope
- channels:manage
- groups:write
- im:write
- mpim:write
- ユーザーをチャンネルに追加する(招待する)
- Method: conversations.invite method | Slack
- Scope
- channels:manage
- groups:write
- im:write
- mpim:write
- Slackワークスペースに登録されている既存のチャンネルにユーザーを追加(招待)する
- Method: conversations.invite method | Slack
- Scope
- channels:manage
- groups:write
- im:write
- mpim:write
ワークスペースにアプリを追加
Scopeの追加が完了したら以下の画面のように今まで押せなかったInstall to Workspace
ボタンが選択できるようになっているので選択します。
選択すると以下のような画面が表示されます。
内容が同じであればOKです。
許可する
を選択します。
APIキー発行完了
以下の画面にページ遷移してxoxb
からはじまるトークンが表示されていればAPIキーが作成できた形になります。
ワークスペースのチャンネルにアプリを招待(追加)する
以下の手順をそのまま実行してください。
Slack APIを使ってみよう!【Slack + Rails】 - Qiita
Railsアプリにコードを追加
ActiveJobを使用してバックグラウンドでSlackAPIを使用してユーザーをチャンネルに追加します。
前置き
普通はrails-dotenv
を使用してAPIキーを管理します。
ただ今回はわかりやすさのためにあえて直書きします。
必要な場合は適宜置き換えてください。
APIキーを登録する
以下はgem slack-ruby-client
のGitHubリンクです。
以下に従ってSlackのAPIを使用できるようにします。
slack-ruby/slack-ruby-client: A Ruby and command-line client for the Slack Web, Real Time Messaging and Event APIs.
config/initializers/slack_ruby_client.rb
を追加して以下を追記します(Using the Legacy API Token)。
Slack.configure do |config|
config.token = 'xoxb-xxxxxxxxxxxxxxxx'
# config.token = ENV['BOT_USER_ACCESS_TOKEN']
end
ActiveJobを使用してバックグラウンドで処理させるためのコードを追加する
app/controllers/users_controller.rb
に以下のコードを追記します。
# POST /users or /users.json
def create
@user = User.new(user_params)
respond_to do |format|
if @user.save
# 追記開始
SlackJob.perform_later(user.email, user.channel_name)
# 追記終了
format.html { redirect_to user_url(@user), notice: "User was successfully created." }
format.json { render :show, status: :created, location: @user }
else
format.html { render :new, status: :unprocessable_entity }
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
end
slack-ruby-client
で使用できるメソッドを探す
ここはとても重要です。
理由としては以下が挙げられます。
- SlackAPIでアプリの登録ができても
slack-ruby-client
で該当するメソッドを見つけられなければ意味がない -
slack-ruby-client
のgemが最新ではない(最新は1.0.0、プロジェクトのgemのバージョンは0.16.0
)
全てに該当するわけではないですが今回は以下のリンクからメソッドを見つけてきました。
File: README — Documentation for slack-ruby-client (0.16.0)
注意したいのはgemのバージョンがあっているかどうか
です。
プロジェクトによって使用しているgemのバージョンは違いますし、それによってメソッドの有無、挙動も変わってくる可能性があるからです。
該当するメソッドはググっても該当する内容が一発で見つかりませんでした。
RubyDocで該当するgemを見つけても該当するメソッドを見つけるのが大変でした。
今回は以下の手順で見つかりました。
-
slack-ruby-client 0.16.0
で検索(該当するバージョンのgemのRubyDocのページへ入る) -
search
フォームの上のメソッドをクリック - クリックしてメソッドが一覧表示されるので一番上のメソッドをクリック
- SlackAPIのページで同じ名前のメソッドがあるか検索(あるはずです)
- RubyDocとSlackAPIの同じメソッドを比較
- 該当するメソッドを見つける(slackAPIでの
.
がslack-ruby-clientのメソッド名の_
に該当する)
見つけるのにとても時間がかかりました。全文検索入れて欲しい...
ActiveJobのコードを追加
app/jobs/slack_job.rb
を作成して以下のコードを追記します。
# frozen_string_literal: true
class SlackJob < ApplicationJob
queue_as :default
def perform(email, channel_name)
# https://github.com/slack-ruby/slack-ruby-client#web-client
client = Slack::Web::Client.new
client.auth_test
# ユーザーを検索
# https://www.rubydoc.info/gems/slack-ruby-client/0.16.0/Slack/Web/Api/Endpoints/Users#users_lookupByEmail-instance_method
user = client.users_lookupByEmail(email: email)
# Slackのユーザーidを取得
user_id = user.channel.id
# ユーザー用のチャンネルを該当のワークスペースに追加
# https://www.rubydoc.info/gems/slack-ruby-client/0.16.0/Slack/Web/Api/Endpoints/Conversations#conversations_create-instance_method
client.conversations_create(name: channel_name)
# ユーザーを招待したいチャンネルのidを定義
slack_should_be_invited_channel_id = 'SLACK_CHANNEL_ID_1'
# slack_shouldable_channel = ENV['SLACK_CHANNEL_ID_1']
# 複数の場合は以下のように設定すれば良い
# slack_shouldable_channel_ids = ['SLACK_CHANNEL_ID_1', 'SLACK_CHANNEL_ID_2']
# https://www.rubydoc.info/gems/slack-ruby-client/0.16.0/Slack/Web/Api/Endpoints/Conversations#conversations_invite-instance_method
client.conversations_invite(channel: slack_should_be_invited_channel_id, users: user_id)
# 複数のチャンネルに登録する場合
# slack_shouldable_channel_ids.each do |slack_shouldable_channel_id|
# client.conversations_invite(channel: slack_shouldable_channel_id, users: user_id)
# end
end
end
(補足)ActiveJobでのバックグラウンドの動作確認について
ActiveJobなどのバックグラウンドの処理はterminal上には表示されません。
確認するにはlog/development
ファイルを開いて確認することができます。
参考にしたサイト
Slack APIを使ってみよう!【Slack + Rails】 - Qiita
RailsプロジェクトでSlack通知を実装する | もふもふ技術部
環境変数で配列もハッシュも扱いたい - Qiita