2025年3月最新版：Slack ソケットモード(Socket Mode)のはじめかた

## 概要
現在運用しているボットが反応しなくなりました。
しかも、ボットの開発者が退職したため、管理画面にアクセスできるエンジニアが誰もおらず。
仕方なく、ボットを新規作成したのですが、その際の過程をまとめました。

## 想定読者
**アプリ側の実装方法はだいたいわかっているものの、WebSocketを使ったボットの構築方法がわからない方。**
この記事で解説するのはボットの構築部分のみです。
アプリ側の構築方法が知りたい方は別の記事を参考にしてください。

## 現状(飛ばしても問題ないです)
2年ほど前からslack apiとseleniumを使ってeKYCの自動化をしています。
やっていることはシンプルです。
1. slackで特定のパターンのメッセージを送信(ekyc xxxx OK)
2. 「実行しますか？」という実行ボタン付きで届いた返信に対して「実行」をクリック
3. [Bolt for Python](https://tools.slack.dev/bolt-python/ja-jp/getting-started/) というslackSDKでスクリプト(selenium)を実行
4. eKYCの審査をを自動で行い、完了したらslackに通知

### 問題点
`1. `の時点でアプリ側がメッセージを検知していない。
一方、`interactive messages`というボタンアクションによるレスポンスは確認できていたため、Socketの疎通はできている。
上記状況から、slack apiのボットに付与する権限が何かしら足りていないという仮説を立てました。
そのアプローチがボットの新規作成をし、適切な権限を付与するというものです。

## 手順
### slack apiにアクセス
https://api.slack.com/apps

`Create New App`を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1106470/ac5d8306-b259-47a3-aa7c-31b4fcb1a222.png)

`From a manifest`と`From scratch`はできることが同じ。
`From a manifest`がGUI操作、`From scratch`が定義ファイル(ymlかJSON)で一括設定ができる。
→`From scratch`を採用(楽だから)。

```yml
display_information:
  name: Test eKYC # slackで見える表示名(名前に当たる部分)
settings:
  org_deploy_enabled: false # エンタープライズプランにデプロイできるか
  socket_mode_enabled: true # Socket Modeだからtrueにする
  is_hosted: false # Slackによりホスティングされたアプリか（普通はfalse）
  token_rotation_enabled: false # slackのトークンを自動でローテーション（定期的に再発行）するか（普通はfalse）
```

上記設定をしたら、次に進み、プレビューが表示される。
問題なければ「Create」。
管理画面に遷移すれば無事作成されています。

### Basic Information
`App-Level Tokens`で「Generate Token and Scopes」を選択。
以下の通りToken NameとScopeを設定し、「Generate」を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1106470/2ae6f23c-f23b-4596-87b0-b63e5d68a2db.png)

生成されるとTokenが表示されるので、コピーしてください(閉じると見れなくなる)。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1106470/409ea69b-3754-4fe5-83e9-c2d66d7d70dc.png)


### Socket Mode
先ほどymlファイルで`socket_mode_enabled`を`true`にしたので、`Socket Mode`タブを開いてみると、すでに「Enable Socket Mode」が`On`になっています。
※筆者は最初のymlファイルで定義を忘れており、管理者権限がないことも相まって少々苦労しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1106470/2b2c61b6-3c6b-4ac0-8bd6-dd12bb6598b8.png)

### Event Subscriptions
slack上でメッセージを送信した時にボットが検知するための設定。
「Enable Events」を`On`にする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1106470/7f2fba81-d093-453f-a7b9-2e793fea7e8b.png)

`Subscribe to bot events`の「Add Bot User Event」を選択する。
そこで指定したいEvent Nameを検索する。
私はメッセージの検知を行いたいため、`message.channels`を選びました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1106470/c3a9e67b-312a-4fe2-bf7a-3c1185a5ddd3.png)

設定完了したら、「Sagve Changes」を選択し、「Success」とポップアップが表示されたら完了。

### OAuth & Permissions
`Scopes`セクションの`Bot Token Scopes`で「Add an OAuth Scope」を選択
選択したのは以下3つ。
多くのユースケースでは`channels:history`と`chat:write`があれば事足りることが多いと思います。
私はプライベートリポジトリでの作業も想定していたため、`groups:history`を追加しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1106470/e9140e24-3e10-4590-82e9-37c52526572b.png)

上記が完了したら、同じ画面上の上部にある`OAuth Tokens`の「Install to :ワークスペース名」を選択。
画面遷移し、「:ボット名 が :ワークスペース名 Slack ワークスペースにアクセスする権限をリクエストしています」というメッセージが表示されるので「許可する」を選択。
すると元の画面に遷移し、`Bot User OAuth Token`が発行されます。

#### ※注意点：
ここまでEvent SubscriptionsやScopesを修正してきましたが、この後削除や追加をしたら、再度「Reinstall to :ワークスペース名」から再インストールが必要（インストールしないと反映されない）

### slackでインストールしたボットを招待
招待リストにbotが表示されて参加できたら完了です。
アプリ側も作り込んで、権限が足りないとなればslack api側の権限周りの設定をこねくり回してください。