はじめに
この記事では、Slackへメッセージを送るRailsアプリを作成してみます。
動作としてはこんな感じです。
- http://localhost:3000/hello にアクセスする
- Slackに「こんにちは」とメッセージが送られる
Slack APIとは何か?
Slack用のアプリケーション開発のためにSlackから公開されているAPIです。
事前準備
- Slackのワークスペースを作成する
下記ページを参考に、Slackのワークスペースを作成しておきましょう。
※注意
アプリケーション開発用のワークスペースをすでに作成済みであれば、
新たに作成する必要はありません。
実際の業務などで使用しているワークスペースを流用しないようにしてください。
Slackアプリを作ってみよう
まずは、Slack側でアプリを作ってみます。
アプリの新規作成
- 下記ページにアクセス
- 「Create New App」ボタンを押してモーダルを開きます。
-
App Name
は 「テストBot」(名前はなんでも良い)、
Develoment Slack Workspace
には作成した開発用のワークスペースを指定します。 - 右下の「Create App」ボタンを押すと、アプリが作成されます。
アプリのPermission(権限)の設定
- 権限設定画面を開く
アプリ新規作成後、下記のようなアプリの基本情報画面に遷移します。
Install your app to your workspace
というメニューを開くと、
「最低1つ以上のfeature
か、permission scope
を設定する必要がある」と書いてあります。
このpermission scope
というリンクを押すと、権限設定画面に移動します。
- 必要なスコープの設定
権限設定画面で、必要な権限を設定します。
今回は、 メッセージの送信をできるようにしたい ので、
chat:write
というスコープを設定します。
これで、Botとして参加しているチャンネル内でメッセージの送信を行えるようになります。
スコープにはいろいろな種類があり、
それぞれのアプリに最低限必要なもののみを設定することで、
セキュリティを保つことができます。
これで権限設定は完了です。
Botを設定する
- Botの名前を設定
左サイドメニューからApp Home
を選択して、アプリケーションのホーム画面を開きます。
赤枠で囲んだ部分の「Edit」ボタンを押して、アプリの名前を設定します。
今回は下記のように設定しましたが、好きな名前で設定して問題ないです。
これでワークスペースにアプリをインストールできるようになりました。
ワークスペースにアプリをインストールする
- インストール画面を開く
左サイドメニューからInstall App
を選択して、
ワークスペースへのアプリインストール画面を開きます。
- インストールの確認画面
「Install App To Workspace」ボタンを押すと、下記のような画面が開きます。
(画像では、ワークスペース名などを隠しています。)
「実行出来る内容」の部分が期待通りであることを確認して、「許可する」ボタンを押しましょう。
- トークンが発行される
「許可する」ボタン押下後、下記の画面に遷移します。
この時に表示されるトークンが、
Slack APIを利用したメッセージの送信時に必要なので、メモしておいてください。
(このトークンを公開してはいけません。
トークンを知った人であれば誰でも、先ほど作成したBotとしてワークスペースへメッセージを送ることができるようになってしまいます。)
ワークスペースのチャンネルにアプリを招待する
任意のチャンネルに、作成したアプリを招待します。
アプリを招待したいチャンネルを開いて、
/invite @アプリのワークスペースでの表示名
を送信します。
(今回は #テスト用チャンネル
という名前のチャンネルです。
任意のチャンネルで問題ないです。)
これで、 #テスト用チャンネル
内で作成したアプリがメッセージを送信できるようになりました。
以上で、Slack側の準備は完了です。
RailsアプリからSlackへメッセージを送ってみよう
Railsアプリの準備
下記リポジトリに、今回使うRailsアプリを用意しているのでcloneしてください。
README.md
の手順にしたがって、環境構築を行ってください。
今回使うgemの説明
下記2つのgemを Gemfile
に追加しています。
1. dotenv-rails
開発環境で、
アプリケーションのルートディレクトリに配置した .env
ファイル内から
ENV に変数を読み込むためのgemです。
今回は、ワークスペースにアクセスするためのトークンの管理に使用します。
2. slack-ruby-client
RubyでSlackのAPIを利用するためのgemです。
今回は、Slackへメッセージを送信するために使います。
トークンを設定する
Railsアプリケーションに、作成したSlackアプリのトークンを設定します。
(ここで説明するのはレガシーな方法なですが、
今回はいったん手っ取り早くできるこちらの方法を利用します。)
.env
ファイルを作成する
アプリケーションのルートディレクトリに、 .env
というファイルを作成しましょう。
ファイルの中身は下記です。
BOT_USER_ACCESS_TOKEN=Botのアクセストークン
Botのアクセストークン
の部分は、
こちらで作成したトークンに置き換えてください。
トークンの設定
次に、下記のファイルを作成してください。
これで、gem slack-ruby-client
を利用したAPIの実行時、
認証用のトークンがパラメータとして送信されるようになります。
Slack.configure do |config|
config.token = ENV['BOT_USER_ACCESS_TOKEN']
end
hello
アクションを作成してみよう
では、slack-ruby-client
を利用してSlackAPIを実行するように、
コントローラーのアクションを作ってみます。
ルーティングの追加
config/routes.rb
にルーティングを追加します。
「 /hello
というパスにはapplicationコントローラー
の hello
アクション が対応する」
というルーティングです。
Rails.application.routes.draw do
# For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
+ get "hello", to: 'application#hello'
end
アクションを作成する
hello
アクションを作成します。
class ApplicationController < ActionController::API
def hello
client = Slack::Web::Client.new
client.chat_postMessage(
channel: '#テスト用チャンネル',
text: 'こんにちは'
)
end
end
上記のソースについて簡単に説明します。
-
client = Slack::Web::Client.new
slack-ruby-client
では、基本的にこのオブジェクトをレシーバとして、
様々なSlackAPIに対応したメソッドを呼び出します。 -
client.chat_postMessage
これは、 chat.postMessage methodというAPIに対応するslack-ruby-client
のメソッドです。
見ただけでわかると思うのですが、
メソッドの引数で「メッセージを送信するチャンネル」と「テキスト」を指定しています。
メッセージを送る
では、実際にメッセージを送信してみましょう。
bin/rails
でサーバーを起動し、
ブラウザで http://localhost:3000/hello にアクセスします。
Slackを確認すると、下記のようにメッセージが送信されていると思います。
今回作りたかったアプリケーションはこれで完成です。
今回は一つのAPIしか利用していませんが、
いろいろなAPIを複合的に利用することで目的のアプリを作成できるようになると思います。
- 用意されているAPIの一覧
Block Kit Builderを使ってメッセージのフォーマットを整えてみよう
実際にアプリを作成した場合、もう少しいい感じにテキストを表示したいと思います。
(箇条書き、文字サイズ、文字色の指定など)
そんな場合は、下記のBlock Kit Builderを使ってみましょう。
これを使うと、簡単にボタンやテキストを配置のプロトタイプを作成することができます。
画面の右側に作成したリッチテキストから生成されたコードが表示されるので、
これをコピーすればすぐにアプリケーションに組み込むことができます。
作成したコード
{
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "今日も暑いね:watermelon: 無理せずがんばろう:smile:"
}
},
{
"type": "header",
"text": {
"type": "plain_text",
"text": "何をチェックする?",
"emoji": true
}
},
{
"type": "actions",
"elements": [
{
"type": "button",
"text": {
"type": "plain_text",
"emoji": true,
"text": "天気"
},
"style": "primary",
"url": "https://www.jma.go.jp/jp/yoho/"
},
{
"type": "button",
"text": {
"type": "plain_text",
"emoji": true,
"text": "カレンダー"
},
"style": "danger",
"url": "https://calendar.google.com/"
},
{
"type": "button",
"text": {
"type": "plain_text",
"emoji": true,
"text": "ニュース"
},
"url": "https://news.google.co.jp/"
}
]
}
]
}
hello
アクションを更新してみよう
試しに、先ほど作成した hello
アクションを更新して、
作成したブロックをメッセージとして送信できるようにしてみましょう。
chat_postMessage
の引数に、 blocks
を追加しています。
(ソースコードが長いので折りたたんでいます。)
`hello` アクションを更新
def hello
client = Slack::Web::Client.new
client.chat_postMessage(
channel: '#テスト用チャンネル',
text: 'こんにちは',
blocks: [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "今日も暑いね:watermelon: 無理せずがんばろう:smile:"
}
},
{
"type": "header",
"text": {
"type": "plain_text",
"text": "何をチェックする?",
"emoji": true
}
},
{
"type": "actions",
"elements": [
{
"type": "button",
"text": {
"type": "plain_text",
"emoji": true,
"text": "天気"
},
"style": "primary",
"url": "https://www.jma.go.jp/jp/yoho/" # 気象庁HP
},
{
"type": "button",
"text": {
"type": "plain_text",
"emoji": true,
"text": "カレンダー"
},
"style": "danger",
"url": "https://calendar.google.com/" # Googleカレンダー
},
{
"type": "button",
"text": {
"type": "plain_text",
"emoji": true,
"text": "ニュース"
},
"url": "https://news.google.co.jp/" # Googleニュース
}
]
}
]
)
end
Railsアプリを起動し、 再度 http://localhost:3000/hello にアクセスします。
すると、Slackには下記のような通知がくると思います。
Block Kit Builderの紹介は以上です。
Block Kit のチュートリアルについては、こちらも参照してください。
あとがき
実際にRailsアプリをHerokuなどにデプロイすることで、
Slack上でコマンドを実行するとそれに応じてメッセージを返すBotを作成することもできます。
記事ボリュームの都合上入れられなかったので、それについてはまた次回書きます。
Slack APIについてはいくつか日本語翻訳されているページもあるので、
こちら をベースにいろいろ学習できると思います。