テックブログ

エルカミーの技術ブログです

🤖 社内文書に関するSlack ChatBot 1/4回 (Slack API 編)

はじめに


この記事では、社内のルールに関して質問をすると答えてくれるSlack ChatBotを開発していきます。Slack APIの取得から、GCPを用いた実装まで説明していきますが、1つの記事に纏めるのは難しいので、記事を何回かに分けたいと思います。

開発の流れは以下のようになります。

💡
開発の流れ
  1. Slack APIの取得と設定
  2. Cloud Functionsの実装①
  3. Pub/Subの設定
  4. Cloud Functionsの実装②

今回は1. Slack APIの取得と設定について説明していきます。Slack APIを取得し、Botの作成や設定、チャンネルの追加まで解説します。

ChatBotの構造


今回開発するChatBotは以下のような構造となります。

image block

Slack APIの取得と設定


Slack APIの取得と設定方法は以下のようになります。

💡
Slack APIの取得と設定の方法
  1. Appの作成
  2. ChatBotに必要な権限の設定
  3. ChatBotの設定
  4. Event Subscriptionの設定
1. Appの作成

まず以下のサイトにアクセスします。

そして、Create New Appをクリックします。

image block

次にFrom scratchをクリックします。

image block

最後に、App Nameを入力し、workspaceを選択します。そして、Creat Appをクリックします。

image block

以上でAppを作成することができます!

2. ChatBotに必要な権限の設定

OAuth & permissionsに移動し、下にスクロールすると、Scopesという項目があります。この項目内にBot Token Scopesという項目があるので、ここでChatBotに必要な権限を追加します。

以下のように権限を追加しました。

image block
3. ChatBotの設定

Basic Informationに移動し、下にスクロールすると、Display Informationという項目があります。この項目で、ChatBotの説明やアイコンを設定します。

image block

ChatBotの設定が完了したら、ChatBotをWorkspaceにインストールします。OAuth & permissionsに移動し、下にスクロールして、Install to Workspaceをクリックします。

image block

4. Event Subscriptionの設定

Event Subscriptionを設定することにより、ユーザがメッセージを送信したり、リアクションをした場合など、様々なSlack内のイベントを受け取ることができます。今回のChatBotでは、ユーザからメッセージを受け取り、それに対して回答するようにしたいため、設定する必要があります。

Event Subscriptionに移動し、Enable EventsをOnにすると、以下のように、Slack内のイベントを受け取るURLが必要となります。

image block

URLの準備

Slackの公式ドキュメントページのRequest URL Configuration & Verificationを見ると、Slackからのイベントを受け取れるようにするには、初回のVerificationのリクエストに応答する必要があります。初回のリクエストは以下のようになります。

{
    "token": "Jhj5dZrVaK7ZwHHjRyZWjbDl",
    "challenge": "3eZbrw1aBm2rZgRNFdxV2595E9CY3gmdALWMmHkvFXO7tYXAYM8P",
    "type": "url_verification"
}

この初回リクエストを受け取ったとき、HTTP 200と"challenge"の内容をそのまま返すことで、Verificationが完了します。

今回はSlackからのイベントをGoogle Cloud Functionsで受け取るようにしたいため、Functionを作成します。そして、Verificationが完了するためのコードを書いていきます。

Google Cloud Functionsを開き、CREATE FUNCTIONをクリックすると以下のページが表示されます。

image block

次に、Functionの設定をしていきます。このFunctionは後々、SlackからのメッセージをPub/Subにパブリッシュする役割をするので、Function nameはslack-chatbot-pubとしておきます。また、Regionはasia-northeast1(Tokyo)にし、AuthenticationAllow unauthenticated invocationsを選択します。

📌
Authenticationについての注意

AuthenticationはデフォルトではRequire authenticationとなっています。ここを変えずにデプロイしてしまうと、Slackからのリクエストが受け取れず、Verificationを完了することができません。

私は、ここを変えるのを忘れていて、Verificationの部分で躓きました。なので、Allow unauthenticated invocationsに変えるのを忘れないようにしましょう。

設定が完了したらNEXTをクリックし、コードを書いていきます。今回はPython3.10を使用してコードを書いていきます。初回リクエストを受け取ったとき、HTTP 200と"challenge"の内容をそのまま返すようにすればよいので、以下のようにmain.pyを書きます。

import functions_framework
import json
 

@functions_framework.http
def verify(param):
  if param.get_json().get('type') == 'url_verification':
    body = json.dumps({'challenge': param.get_json()['challenge']})
    headers = {'Content-Type': 'application/json'}
    return (body, 200, headers)

そして、Entry pointは今回使用する関数である、verifyにします。requirement.txtは特に変更する必要はありません。すべて完了したら、DEPLOYをクリックします。

image block

デプロイが完了すると、URLが得られるので、コピーします。

そしてこのURLをSlackのEvent SubscriptionRequest URLに貼り付けます。Verificationが完了すると、Verifiedという文字が表示されます。

image block

最後に、ChatBotが受け取れるイベントの権限を設定します。下にスクロールすると、Subscribe to bot eventsという項目があります。ここで以下のように権限を設定します。

image block

これで、Event Subscriptionの設定は完了です。

まとめ


今回は1. Slack APIの取得と設定について説明していきました。Slack APIを取得し、Botの作成や設定、Event Subscriptionの設定を行いました。今回はChatBot実装の準備でしたが、次回からChatBotの実装に移っていきます。

参考