LoginSignup
0
0

More than 1 year has passed since last update.

RailsでSlackAPIを使用してワークスペースにユーザーを作成、作成したユーザーを既存のチャンネルに招待する

Posted at

この記事について

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アプリで以下をできるようにすることが目的です。

  1. Slackに登録されているユーザーを探す
  2. ユーザーが見つかったら自動的に該当するSlackワークスペース
    1. ユーザー用ののチャンネルを作成する
    2. 作成したチャンネルに追加(招待)する
  3. Slackワークスペースに登録されている既存のチャンネルにユーザーを追加(招待)する

Railsアプリの準備

下記リポジトリに、今回使うRailsアプリを用意しましたのでcloneしてください。

README.md の手順にしたがって、環境構築を行ってください。

SlackAPIでアプリを作成する(Bot用のAPIキーを作成する)

一般的にAPIキーを作成する場合はサイト上でAPIキーを発行するだけですが、
SlackAPIではアプリを作るという行為が必要になります。

アプリを作成するとAPIキーが発行されます。

SlackAPI登録画面へ

まずは以下にアクセスします。
Slack API: Applications | Slack

Slackアプリ作成画面移動する

アクセスしたページに Create New Appのボタンがあるのでクリックします。
Image from Gyazo

クリックすると以下のダイアログが表示されるので From scratch を選択します。
Image from Gyazo

以下のダイアログが表示で App Name, Pick a workspace to develop your app inが表示されるので、
1. App Name(必須): 好きな名前(今回はtest2)
2. Pick a workspace to develop your app in: 今回開発で使用するworkspace を選択
といった形で入力欄を埋めてCreate Appをクリックします。
Image from Gyazo

Create Appを実行すると以下の画面が表示されます。
Botsという項目があるので選択します。
Image from Gyazo

Review Scopes to Addを選択

選択すると以下の画面が表示されます。
Review Scopes to Addを選択します。
Image from Gyazo

Add an OAuth Scopeをクリック

クリックしたら以下の画面が表示されます。
Image from Gyazo

少し下にスクロールするとScopesという項目があるのでAdd an OAuth Scopeをクリックします。
Image from Gyazo

クリックすると以下の選択項目が表示されます。
(文字入力で検索することも可能です)
Image from Gyazo

必要なScopeを追加する画面の概要

ここで悩むのがどのScopeを追加すればよいかです。
以下の画面のAPI methodsのリンクにとべば確認できます(Web API methods | Slack)。
Image from Gyazo

すると以下のようにWeb API methods一覧と説明が表示されています。
Image from Gyazo

その中のひとつを選択すると以下のような画面が表示されRequired scopesの項目の黄色で表示されている内容が必要なScopeになります。
これを前述したページで一つずつ追加していく必要があります。
Image from Gyazo
ちなみにLegacy bot tokensのScopeは2020/05/05以降は使えなくなっているので使用できません。

量が多すぎますね...
しかもここでは説明文での検索ができません(メソッド名での検索しかできない)
膨大なドキュメントから該当する項目を見つけて実際に動作するか確認するのは試行錯誤になる可能性があります。

今回使用するMethod, Scope一覧

探すのは大変なのでサクっと使用するMethod, Scopeを列挙します。
列挙したScopeを前述した画面で追加してきます。

ワークスペースにアプリを追加

Scopeの追加が完了したら以下の画面のように今まで押せなかったInstall to Workspaceボタンが選択できるようになっているので選択します。
Image from Gyazo

選択すると以下のような画面が表示されます。
内容が同じであればOKです。
許可するを選択します。
Image from Gyazo

APIキー発行完了

以下の画面にページ遷移してxoxbからはじまるトークンが表示されていればAPIキーが作成できた形になります。
Image from Gyazo

ワークスペースのチャンネルにアプリを招待(追加)する

以下の手順をそのまま実行してください。
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)。

config/initializers/slack_ruby_client.rb
Slack.configure do |config|
  config.token = 'xoxb-xxxxxxxxxxxxxxxx'
  # config.token = ENV['BOT_USER_ACCESS_TOKEN']
end

ActiveJobを使用してバックグラウンドで処理させるためのコードを追加する

app/controllers/users_controller.rbに以下のコードを追記します。

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を作成して以下のコードを追記します。

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0