<目次>
SlackのBoltフレームワークとは?使い方をご紹介(ハンズオン形式)
SlackのBoltフレームワークの概要
STEP0:作成するサンプルアプリの概要
STEP1:Slackアプリの新規作成&権限付与
STEP2~5:Python/ngrok/flask導入とSlack設定
STEP6:Pythonコードの作成(最終版)
STEP7:疎通テスト
SlackのBoltフレームワークとは?使い方をご紹介(ハンズオン形式)
SlackのBoltフレームワークの概要
まずはBoltの概要説明です。
BoltはSlackアプリ構築のためのフレームワークです。Boltのホームページ(https://api.slack.com/bolt)で紹介されている特徴(The Basics of Bolt)について、直感的に分かる補足をしてみます。
●①Effortless OAuthの一例
例として、Bolt側で認証をしやすくしてくれています。自力で実装する場合、認証情報(トークン等)をHTTPリクエストのヘッダーにセットする必要がありますが、Boltではそうした部分を簡素化するクラス・関数が多数用意されています。
(図111)例えば、トークンなどはインスタンス生成の引数に指定すればOK。

●②Instant interactivityの一例
・例えば、”hello slack”という投稿をトリガーに関数を実行したい場合は、関数の頭に下記デコレーション(@~)を付与するだけでOK。
@bolt_app.message("hello slack")
・例えば、「何かしらの投稿」を検知したのをトリガーに関数を実行したい場合は、関数の頭に下記デコレーション(@~)を付与するだけでOK。
@slack_event_adapter.on('message')
●③Simple Socket Modeの一例
「ソケットモード」はパブリックなHTTPリクエスト先を公開せずに、Slackの「Events API」や対話的な部品を使用できる機能です。
(図112)

ソケットモードについては、下記記事でもう少し詳細に紹介しています。
⇒Slackのソケットモードとは?概要からHello Worldの手順までご紹介
STEP0:作成するサンプルアプリの概要
今回はサーバを立てずに、ローカルPCをサーバに見立ててPythonアプリ(Boltフレームワーク使用)を動かします。そのためにngrokというローカルホストツールを用いて、グローバルIPとローカルIPを相互に変換して、外部(Slack)とのhttps通信を行います。
(図121)

STEP1:Slackアプリの新規作成&権限付与
STEP2~5:Python/ngrok/flask導入とSlack設定
各工程の手順リンクを以下にまとめます。
STEP2:Python⇒Slackへのメッセージ投稿の疎通
⇒(手順) SlackのAPIでメッセージを投稿する方法
STEP3:ngrokのインストール
STEP4:Python環境にflaskをインストール
STEP5:Slackでイベント発行&受取りの準備
⇒(手順) Slackで自動返信の投稿をするボットをPythonで作る手順
STEP6:Pythonコードの作成(最終版)
(サンプル)最終形のコードは以下の通りです。
from flask import Flask, request
from slack_sdk import WebClient
from slack_bolt import App, Say
from slack_bolt.adapter.flask import SlackRequestHandler
SLACK_SIGNING_SECRET = 'xxxxxxxxxxx'
SLACK_BOT_TOKEN = 'xoxb-xxxxxxxxxxx'
app = Flask(__name__)
# トークンを指定してWebClientのインスタンスを生成
client = WebClient(token=SLACK_BOT_TOKEN)
bolt_app = App(token=SLACK_BOT_TOKEN, signing_secret=SLACK_SIGNING_SECRET)
# (参考)アダプター(SlackRequestHandler)の役割とは?
# Slackから流入するリクエストを受けて、Bolt用リクエストに変換すること。
# 更にそれをBoltのアプリにディスパッチすること。
# https://slack.dev/bolt-python/concepts
# SlackRequestHandlerのインスタンス生成
# ・Boltフレームワークで提供するFlask用アダプター
# ・WSGIリクエスト⇒BoltのIF(Boltのリクエスト)に変換する
# ・逆にBoltのレスポンス⇒WSGIレスポンスに変換する
handler = SlackRequestHandler(bolt_app)
# エンドポイントの登録
# Flaskアプリに、SlackがリクエストをPOSTする先のエンドポイントを登録
@app.route("/slack/events", methods=["POST"])
def slack_events():
# ハンドラは、Slackリクエストを受けて、BoltRequestに変換し
# 更にはディスパッチ処理を担います。
# Flask,AWS Lambda,djangoなど様々なアダプタに対応したSlackRequestHandlerがある
return handler.handle(request)
# Boltのデコレーター
# message("xxx")特定のメッセージリスナー(待ち受け)を追加
@bolt_app.message("hello slack")
# 第1引数:payloadはSlack⇒Flaskに送る、投稿内容に関する各種データ(例:投稿者、投稿内容)
def greetings(payload: dict, say: Say):
# 投稿者のIDを取得
user = payload.get("user")
# say関数はメッセージリスナーの中でメッセージ投稿する場合に利用可能
# メッセージリスナーの外で投稿する場合はclient.chat_postMessage()を使う
say(f"Hi <@{user}>")
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000, debug=True)
(図131)

(補足)SlackRequestHandlerについて
SlackRequestHandlerについて「Flask, AWS Lambda, djangoなど様々なアダプタに対応した~」と記載していますが、具体的には下記のようなアダプタの種類が用意されています。
https://github.com/slackapi/bolt-python/tree/main/slack_bolt/adapter
(図132)

STEP7:疎通テスト
試しに、ボットを入れたどこかのチャンネルで投稿をすると、ボットが反応してくれる事を確認します。
(動画141)
(図142)
