pythonを使ってリアクティブなWebアプリを作りたい【開発編5】Slack boltの組み込み

こちらの続きです。引き続きパワーアップしていきます。

[pythonを使ってリアクティブなWebアプリを作りたい【開発編4】パスワードの暗号化](https://qiita.com/geeorgey/items/85905a4772903b180fad)

今回はここでもやったSlack bot用のSDKを組み込んでいきます。
[Vue.js / FlaskアプリにSlack for boltを組み込むには](https://qiita.com/geeorgey/items/7844dee644524dacac41)

## まずはパッケージのインストールから
$ pipenv install slack-bolt
これで色々入ります。

$ pipenv lock -r > requirements.txt
requirements.txtも作っておきましょう。

```text:requirements.txt
slack-bolt==1.7.0
slack-sdk==3.8.0; python_version >= '3.6'
```

この2行が追加されているはずです。

boltの組み込みについてはこちらも参照
[続：Slack Bolt for Pythonを使ってのbot構築 アプリ配信に向けた対応](https://qiita.com/geeorgey/items/f117ee14a85c07ef8ea9)

## backend/bolt.py を作る
ソースはこちら
[backend/bolt.py](https://github.com/geeorgey/vue_flask_template/blob/main/backend/bolt.py)

ベーシックなテンプレートにしてありますのでここから加工していきます。加工自体はまた後日。


## backend/__init__.py を微修正
ソースはこちら
[backend/__init__.py](https://github.com/geeorgey/vue_flask_template/blob/421c0283abfda4d8a9f1e935ba2cf641b27b0dce/backend/__init__.py#L37)

```python:backend/__init__.py
from .bolt import bolt as bolt_blueprint
app.register_blueprint(bolt_blueprint)
```
下部に2行追加

## ngrok にアカウントを作ります
ローカル環境とトンネルしてくれるアプリです。Slackbot開発には欠かせません。
https://ngrok.com
登録したら
![Setup_-_ngrok.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/25576a15-8c40-1b35-95fa-3d5024b919b9.png)

こちらからファイルをDL。zipファイルを解凍したら、適当な場所に置きましょう。
僕はルートフォルダに置いてます。

ダウンロードしたあとに、ファイルを解凍したあとに

$ mv ~/Downloads/ngrok ~/

として移動してます。
その後に、認証コマンドを通しておきましょう。画面に書いてあります。

![Setup_-_ngrok.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/03e74573-1198-51d9-3fc9-d9e248314c90.png)

ファイルを動かしちゃってるので実際は

$ ~/ngrok authtoken ここにトークン
という形です。
これができれば設定完了。あとはngrokを起動するとローカル環境がインターネットにさらされます。

今回のFlaskアプリは5000番ポートで動いていますので
$ ~/ngrok http 5000

とすると、5000番ポートに対応するエンドポイントがngrokに生成されます。
![_env_—_QA.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/a96e69b1-d5a5-2c80-b2a2-9158da393b6a.png)

こんな形ですね。
Slack bot側から開発環境にアクセスするURLを設定するのですが、このhttps側のURLを使うことになります。

## Slackにアプリを追加
https://api.slack.com/apps/
右上のボタンから作成します

![Slack_API__Applications___Slack.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/79a15269-e868-190e-5f7e-7168999b89d4.png)

### Scopeを追加する
一つ以上ついてないと何もできないので、まずは追加です。
OAuth & Permissions
から
chat:write をつけましょう。

![Slack_API__Applications___Leave_a_Nest_Co__ltd__Slack.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/437ba80b-24c3-7c2b-a7a1-83a8544f2eb4.png)

### Install App to Your Team
Install App to Your Team
から、ひとまず自分のワークスペースにインストールします

![Slack_API__Applications___Leave_a_Nest_Co__ltd__Slack.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/54ff0859-784c-48d1-e764-83f903976a74.png)

### Basic Information
Basic Informationページにいくつかのパラメータがあるのでそれを使います
![Slack_API__Applications___Leave_a_Nest_Co__ltd__Slack.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/edce39cc-177d-c378-d769-520d18ce5f79.png)

.envに以下の行が追加されてますので、上の画像に入ってる変数をそこに入れます

```.env
export SLACK_CLIENT_ID=
export SLACK_CLIENT_SECRET=
export SLACK_SIGNING_SECRET=
export SLACK_SCOPES=chat:write
```

SLACK_SCOPESはそのままでOKですが、追加した場合はカンマ区切りで記載してください

```
export SLACK_SCOPES=chat:write,users:read,users:read.email,channels:history,groups:history,im:history,mpim:history,channels:join,groups:write,im:write,mpim:write,channels:read
```

## ローカルで実行してみましょう

$ cd backend
$ flask run

でFlaskを実行します。これでアプリが待機状態になります。

### Event Subscriptionsを設定する
[チュートリアルにも書いてあるようにスコープの設定をして](https://slack.dev/bolt-python/ja-jp/tutorial/getting-started#%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B)イベントをリッスンしてみましょう。
この４つを入れます。
![Slack_API__Applications___Leave_a_Nest_Co__ltd__Slack.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/db75b50d-e912-94e4-425f-0ebec6e18c19.png)

次に、このページの上部にある、Request URLにURLを入れて保存します。
ngrokで生成したURL＋ /slack/events
がSlack Boltのエンドポイントになってますのでそれを入れてください。

![Slack_API__Applications___Leave_a_Nest_Co__ltd__Slack.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/dcaf554d-6ad6-1b5c-ee38-1f91fa000132.png)

## Botをアプリ上からインストールしてみる
先程、Slackの設定ページからインストールしましたがこれは、内部アプリにのみ有効な方法です。複数のワークスペースにインストールする場合はこの方法では動きません。そのため、Slack Boltでインストールページを生成し、そこからインストールを行います。

まずはOAuth&PermissionsページからリダイレクトURLを設定してください。
![Slack_API__Applications___Leave_a_Nest_Co__ltd__Slack.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/b845430a-71a7-c992-d173-20edd2e3fbd0.png)

これを行うことで、あなたのアプリのインストールページ→Slackの認証画面→戻ってくるURLが定義されます。

### アプリの配信設定をする
![Slack___Slack_API__Applications___Leave_a_Nest_Co__ltd_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/b70cabdd-fbcd-33a4-005e-e4997a61449c.png)

Manage Distributionページより、公開してください。
変数をハードコードしてませんか？というチェックがあるのでそこにチェックを入れてボタンを押します。

### いよいよインストールを試みる
ngrokで生成したURL＋ /slack/install
がインストールページのURLです。アクセスして以下のような画面が出るか確認をしましょう。

![https___d7028e10172b_ngrok_io_slack_install.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/c7490ee7-beb1-2cb4-53d9-6e80438709d7.png)

Add to Slackボタンを押すとこんな画面になります。

![bolt_test_is_requesting_permission_to_access_the_Leave_a_Nest_Co__ltd__Slack_workspace___Leave_a_Nest_Co__ltd__Slack.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/302fd12b-5d05-afdc-0cd6-58dafbc9b89f.png)


Allowボタンを押してみます。
するとこんな画面になりました。

![Slack_を開きますか？_と_https___d7028e10172b_ngrok_io_slack_oauth_redirect_code_11458516338_2398677128277_42ab0ff6098d2c5429fa10b7240b0280e0437e6c3079da8a5c2addb464e4bb86_state_085908e0-99a0-4438-926a-30740e6a7ae5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/22d9dda6-529d-2de2-92ea-e1fdd8ec6a39.png)

これでインストールが完了です。

### DBにデータが保存されているかを確認する

インストールが完了すると、slack_botsテーブル及びslack_installationsテーブルにデータが保存されます。確認してみてください。
ちなみにこちらの確認は、[Postico](https://eggerapps.at/postico/)というアプリを使っています。シェアウェアですが、小さい規模で使う分にはフル機能使えますのでどうぞ。

![slack_bots_–_qa4u_–_qa4u.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/8d61f4de-d7df-2e21-8036-077fd051c68b.png)

### botに話しかけてみる
このままだと話しかけてもなんにもならないので、スコープを追加します。

```
export SLACK_SCOPES=chat:write,channels:history,groups:history,im:history,mpim:history
```

これでイベントの待機ができるようになりました。
flask runしているターミナルをctrl + cでキャンセルしたらもう一度flask runで立ち上げ直してください。
これで.env の設定が再読込されます。

そうしたら、インストール画面に行き、もう一度Add to Slackボタンをおしましょう。
すると、少し画面が変わっていることが分かります。URLを調べてみると、&scope=の部分が変化していることに気付くはずです。

![bolt_test_is_requesting_permission_to_access_the_Leave_a_Nest_Co__ltd__Slack_workspace___Leave_a_Nest_Co__ltd__Slack.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/7cd946b6-d71b-55b0-f462-0cef4b8de68d.png)

postされた内容を読み取ることができますよ、というものです。Allowを押してから、PosticoでDBを覗いてみましょう。

![slack_bots_–_qa4u_–_qa4u_と_user_–_d4fjjg4eaklg0n_–_vue_flask_template_heroku.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/3f56187b-a6fd-6521-c235-dff7b15500ee.png)

bot_scopesが加わっていることが分かります。
これでチャットの閲覧権限を持ったbotの生成が完了しました。

### チャンネルにinviteしてsay Hello
![Slack___05-george___Leave_a_Nest_Co__ltd_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/c21da683-b527-4d4d-1e6e-831ddbb7afc3.png)

適当なチャンネルにbotを招待してからHelloといってみましょう。What's up？とレスが来るはずです。
処理は
[backend/bolt.py](https://github.com/geeorgey/vue_flask_template/blob/421c0283abfda4d8a9f1e935ba2cf641b27b0dce/backend/bolt.py#L69)に書いてあります

流れとしては、まず slack/events でイベントを受け取ります

```python:backend/bolt.py
@bolt.route("/slack/events", methods=["POST"])
def slack_events():
    print('■□■□■□■□■□/slack/events')
    print(vars(request))
    return handler.handle(request)
```
ログを見ると■□■□■□■□■□/slack/eventsが流れてくるのがわかると思います。flask runしたページのログをみましょう。
ここを通ったデータが、[backend/bolt.pyのここ](https://github.com/geeorgey/vue_flask_template/blob/421c0283abfda4d8a9f1e935ba2cf641b27b0dce/backend/bolt.py#L69)でキャッチされて処理されます。


ということで、無事にできたので、Herokuにデプロイしてみてください。
GithubにpushしたらHerokuに自動デプロイされるようになっているはずです。なっていない場合は、Heroku管理画面から手動でDeployしましょう。

$ git add .
$ git commit -m 'Slack Bolt for Pythonの追加'
$ git push -u origin main

次に、HerokuのConfig varsを編集します。

![vueflasktestgeeorgey_·_Settings___Heroku.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/259794f9-eddc-0c42-3a5b-ba64af16964f.png)

### SlackアプリのURL設定を変更する
まずはEvent Subscriptionsから設定しましょう。
![Slack_API__Applications___Leave_a_Nest_Co__ltd__Slack.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/aa944824-9bfb-eab5-834d-c0ba17f07e3e.png)

New Request URLがVerifiedになれば、無事に本番環境も動いています。
当テストアプリは
https://vueflasktestgeeorgey.herokuapp.com/
で動いていますので
https://vueflasktestgeeorgey.herokuapp.com/slack/events
がエンドポイントです。

次に、リダイレクトURLを変えていきます。
![Slack_API__Applications___Leave_a_Nest_Co__ltd__Slack.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/4d32e327-cc34-3cda-dd17-27e4a4ee7b15.png)
ここは複数登録できますが、本番環境URLを登録したらngrokのURLは削除してください。
削除しないとリダイレクトに失敗します。

インストールできるか試しましょう
https://vueflasktestgeeorgey.herokuapp.com/slack/install

![Slack_を開きますか？_と_https___vueflasktestgeeorgey_herokuapp_com_slack_oauth_redirect_code_11458516338_2407998319332_05bf921088d7dd57a219374d4308be311065c48a33b18cbe20b93231f9f56c75_state_a194870c-ff76-4bbe-9cad-5e7aee7207ce.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/c1693cba-e9d3-f503-bc92-431cf154d15d.png)


無事にできました。

先ほどと同様にチャンネル内でHelloと入れて返信があるかどうかを確認します。
Herokuのログを見たい場合は、ターミナルから

$ heroku logs -t --app アプリ名

とコマンドすることでログを見ることができます。

長くなりましたが、以上です。
これでSlackアプリの構築もできますね！


## 関連リンク
- [pythonを使ってリアクティブなWebアプリをお手軽に1分で作りたい](https://qiita.com/geeorgey/items/ace37bd92841c9d1a378)
- [pythonを使ってリアクティブなWebアプリを作りたい【基礎編】](https://qiita.com/geeorgey/items/3f86b207cd412680b835)
- [pythonを使ってリアクティブなWebアプリを作りたい【開発編】](https://qiita.com/geeorgey/items/ea60afe0c44a5f9db483)
- [pythonを使ってリアクティブなWebアプリを作りたい【開発編2】](https://qiita.com/geeorgey/items/961c1d1092ec60bb06bd)
- [pythonを使ってリアクティブなWebアプリを作りたい【開発編3】](https://qiita.com/geeorgey/items/1f5544b12e7d26a1216c)
- [pythonを使ってリアクティブなWebアプリを作りたい【開発編3-2】](https://qiita.com/geeorgey/items/54b4fb22351a3e941cf6)
- [pythonを使ってリアクティブなWebアプリを作りたい【開発編4】パスワードの暗号化](https://qiita.com/geeorgey/items/85905a4772903b180fad)
- [pythonを使ってリアクティブなWebアプリを作りたい【開発編5】Herokuの開発環境と本番環境](https://qiita.com/geeorgey/items/b080617f5332ab7255c4)
- [pythonを使ってリアクティブなWebアプリを作りたい【開発編5】Slack boltの組み込み](https://qiita.com/geeorgey/items/ca2942ff054e30587c78)←イマココ
- [pythonを使ってリアクティブなWebアプリを作りたい【開発編6】Slack bolt アンインストール時対応
](https://qiita.com/geeorgey/items/0614ea9f64072a33c985)