slack_boltを使ってSocket Modeで通信するslack botを作る(2021.7.11)

Summary

ユーザーの投稿やコマンドに反応するSlack botを作成した。
Socket Modeを使うと、外部のpublic HTTP endpointを契約することなく、slack_boltモジュールを用いて記述したPythonのAppでの通信を実現できる。

webには古い情報が多く、古いやり方では最新のslack APIでは動作しなくなっている。日本語の情報も結構あって使いやすそうに見えたslackbotモジュールは2019年12月のSlack APIの仕様変更でちゃんと動作しない。Slack APIのTutorialsのリンクにslackclientというのが紹介されていたが、実際にはそちらも開発を終了していて、現在はslack_sdkというのが後継のようだが、低レベルAPIっぽい。slack_boltというのがslackbotに近い感じ。
実際にはslack_boltはslack_sdkを呼び出すラッパーとして実装されているようだ。
ということで、bolt for pythonを用いた実装にチャレンジ!

AppとSlackサーバとの通信

2019年12月にSlackの通信仕様が変更され、現在ではSlackからHTTPSPOSTメッセージを受け取れるPublic URLを持ったサーバがBot appとの間を取り持つ必要があるようだ。このモードではサーバを契約する必要があるのと、HTTPサーバが公開されていないといけないのがやりにくい。 そのような懸念がある場合に、boltでも使えるSocket Modeというのがあるらしい。

まとめると、botの実体のクライアントAppがslackから通知を受け取るためには、Slack Events APIを使う接続方法と、Socket Modeを使う接続方法の2つが用意されている。本検討では、後者のSocket Modeでの実装を試みた。

Appの設定

slack apiのYour Appsページでslack appの新規作成を行い、必要な設定をしてtokenなどの情報を入手する必要がある。

手順は以下のとおり

  1. ボットを設置したいSlack Workspaceとそのchannelを作成する
  2. https://api.slack.com/にWorkspaceのアカウントでログイン
  3. https://api.slack.com/appsで「Create New App」
  4. tokenの生成(メモしておく)やmanifestoの設定(users.readも設定)をしておく
    (Socket Modeの許可とApp-level tokenの生成も忘れずに)
  5. Slack Workspaceを指定してAppをインストール
  6. tokenの再発行や設定の追加は「OAuth & Permissions」の「scopes」などから行う
  7. pythonからAppを起動

1. Slack Appの新規作成

https://api.slack.com/appsで「Create New App」をクリック。