Cloud Functions + Slack Event API を利用したBotの作成(メッセージの受信まで)

2022-04-05  /  SlackGCPPythonCloud Functions

Slack の Event API を利用した簡単な Echo Bot を作成してみようと思います。今回はメッセージの受信まで。前回は App の権限と認証周り を行いました。

メッセージ受信までを実装する

Slack は公式の PythonSDK(BOLT)があり機能も充実しているので、そちらを利用して実装を進めます。GCP の Cloud Functions で利用するサンプルがあるので参考にしました。

bolt-python/examples/google_cloud_functions at main · slackapi/bolt-python

slack_bolt が必要なのでインストールします。

$ pip install slack-bolt

コードはこんな感じです。ひとまず受信したメッセージと関連する情報をログに出力します。

import functions_framework
import json
import logging

logging.basicConfig(level=logging.DEBUG)

from slack_bolt import App
from slack_bolt.adapter.flask import SlackRequestHandler

# process_before_response must be True when running on FaaS
app = App(process_before_response=True)
handler = SlackRequestHandler(app)


@app.event("message")
def message_channel(body, say, logger):
    logger.info(body)


@functions_framework.http
def echo_bot(request):
    return handler.handle(request)

requirements.txt は以下の通りです。

functions-framework==3.0.0
slack-bolt==1.13.0

デプロイする

前回設定したトークンなどを含む .env.yaml を環境変数として指定する必要があります。またエントリポイントの関数名も変更します。コマンドは以下のように実行します。

$ gcloud functions deploy echo-bot --entry-point echo_bot \
  --trigger-http --allow-unauthenticated \
  --env-vars-file .env.yaml

デプロイが成功したら GCP のログを確認します。以下のような slack-bolt の起動時に行う認証テストのログが出力されています。

"DEBUG:slack_bolt.App:Sending a request - url: https://www.slack.com/api/auth.test, query_params: {}, body_params: {}, files: {}, json_body: None, headers: {'Content-Type': 'application/x-www-form-urlencoded', 'Authorization': '(redacted)', 'User-Agent': 'Bolt/1.13.0 Python/3.9.10 slackclient/3.15.2 Linux/4.4.0'}"

もし認証の設定がうまく行っていない場合は(おそらく main.py の読み込みに失敗するため)デプロイに失敗します。

動作確認

Slack 上でメッセージを送信して、GCP のログが出力されるか確認します。Slack から送られてきたリクエストの内容に以下のように送信したメッセージが含まれていれば、ちゃんとイベント処理ができているようです。

'type': 'message', 'text': 'テスト'