ngrokを使用したローカル環境でのSlack bolt(Python)の開発

今回はngrokを使用し、ローカルでSlack boltの開発環境を構築してみました。自分のメモ用に記事を投稿します。
## ngrokのセットアップ（MacOS）　
ngrokユーザ登録し、[ngrok dashboard](https://dashboard.ngrok.com/get-started/setup/macos)を開きます。

Setup & Installationの手順に従って、ngrokをインストール、ngrok.ymlファイルにauthtokenを追加します。
```
brew install ngrok/ngrok/ngrok
ngrok config add-authtoken xxxxxxxxxxxx
```
ターミナルを開き、実行可能かを確認してみます。
```
ngrok http 8080
```
下記が出力されことを確認できます。ForwardingにあるURLは外部に公開されますが、実行する度にURLが変わり毎回Slack boltの設定を変更しないといけません。
![ngrok.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799689/a4a5a3dc-6f63-67cc-4da2-9c955ee369e1.png)

そのため、今回は固定のURLを利用しようと思います。ngrok dashboard左サイドバーのCloud EdgeにあるDomainsページを開き、「New Domain」で固定のURLを作成します。
![ngrok2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799689/1b3633e3-b9d4-b300-5831-85f71d59e29a.png)

Ctrl＋Cで止めて、固定のURLを指定し、ngrokを立ち上げてみます。
```
 ngrok http --domain=[Your URL] [port]
```
![ngrok3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799689/9532e3b4-a6b4-b113-7e63-3d2328b761bf.png)

## Slack Appの作成
[Slackアプリを作成](https://api.slack.com/apps?new_app=1)し、[Your Apps画面](https://api.slack.com/apps/)から詳細設定を開きます。（後ほど使用）

![スクリーンショット 2024-06-03 15.07.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799689/5b1e85c0-602e-083a-7e44-a3e936f719d8.png)

## Slack boltのPythonプログラムの用意

Python環境にslack_boltパッケージをインストールします。
```
pip install slack_bolt
```
app.pyという名前の新しいファイルを作成し、以下のコードを追加します。
```
import os
from slack_bolt import App
from dotenv import load_dotenv
import re
load_dotenv()

SLACK_BOT_TOKEN = os.getenv('SLACK_BOT_TOKEN')
SLACK_SIGNING_SECRET = os.getenv('SLACK_SIGNING_SECRET')

# Initializes your app with your bot token and signing secret
app = App(
    token=SLACK_BOT_TOKEN,
    signing_secret=SLACK_SIGNING_SECRET
)


@app.message(re.compile(".*"))
def message_repeat(message, say):
    # say() sends a message to the channel where the event was triggered
    text_contents = ''
    for block in message['blocks']:
        for element in block['elements']:
            for elem in element['elements']:
                text_contents += elem['text'] + '\n'
    text = f"Hello <@{message['user']}>! A message from you has arrived as follows. \n {text_contents}"
    say(
        blocks=[
            {
                "type": "section",
                "text": {"type": "mrkdwn", "text": text},
            }
        ],
        text=text,
    )


# Start your app
if __name__ == "__main__":
    app.start(port=int(os.environ.get("PORT", 8080)))
```

次に[Your Apps画面](https://api.slack.com/apps/)の設定からslack_boltのApp変数初期化に使用したSLACK_BOT_TOKENとSLACK_SIGNING_SECRETの環境変数中身を取得してきます。

app.pyと同じフォルダに.envファイルを新規作成します。
```
touch .env
```

Basic Information画面を下にスクロールし、Signing Secret表示、コピーします。
![SlackApp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799689/7418aea9-9078-e637-a57d-62cdbdd3ab79.png)

.envファイルに以下の内容を追記します。
```
SLACK_SIGNING_SECRET＝[Your Signing Secret]
```
画面左側のOAuth & Permissionsをクリックし、xoxbから始まるBot User OAuth Tokenをコピーします。
![SlackApp2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799689/11cf1661-99ad-cfb2-4157-be7ada1ce271.png)

.envファイルに以下の内容を追記します。
```
SLACK_BOT_TOKEN＝[Your Bot Token]
```
app.pyを実行してみます。
```
python app.py
```

![app.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799689/1c076c27-bebe-ec34-55a2-6713ed570880.png)

# Slack Appの設定
左のサイドバーのEvent Subscriptionsを開きます。Request URLにngrokの指定URLを入力し、後ろに「/slacks/events」を追記します。「Verified」との文言が出てきたらOKです。

![SlackApp3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799689/53bead70-f3e4-b047-a77d-e61b51a1a42a.png)

画面を下にスクロールし、Subscribe to bot eventsでSlack Appにどのイベントを購読するかを追加設定し、設定を保存します。

![スクリーンショット 2024-06-03 16.08.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799689/dcfdc75c-d27e-8a22-3534-c8f04520a995.png)

各イベントの解説は以下になります。
```
　message.channels アプリが参加しているパブリックチャンネルのメッセージをリッスン
　message.groups アプリが参加しているプライベートチャンネルのメッセージをリッスン
　message.im あなたのアプリとユーザーのダイレクトメッセージをリッスン
　message.mpim あなたのアプリが追加されているグループ DM をリッスン
 ```

 最後に、簡単なテストします。ユーザに送られてきたメッセージを受け取って内容を追加し、返信することを確認できます。
![SlackApp4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799689/92d12aad-bf3a-8704-fccf-2b0df55c5111.png)