😇

Slack の RTM bot が実質機能しなくなることに合わせて Socket mode に移行する

commits3 min read

TL;DR

  • 2021-02-24 以降 Slack method channels.*, groups.*, im.*, mpim.* が利用できなくなり、代替として conversations.* method を利用する必要がある
  • Classic app の RTM API は引き続き機能するが、conversations.* method に必要な bot の scope である channels.manage は Update scope しないと付与できるようにならない
  • Update scope した場合、bot は RTM API を利用不能になるため、機能を維持するためには Socket mode + Events API に移行するのが綺麗にいきそう

Conversations API

https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api の通り、これまで Public channel, Private channel, DM, Group DM でそれぞれ分かれていた API が一つの Conversations API として統合されます。Deprecating 宣言されている method は、2020-06-10 以降に作られた app ではすでに利用不能で、それ以外の app でも 2021-02-24 に利用不能になるようです。

RTM bot の移行

仮に、ある RTM bot (classic) を飼っていることにしましょう。この bot は特定の発言に反応して Public channel を作る機能があり、channels.create method を使って実装されています。2021-02-24 以降、この機能が利用できなくなると困るので、conversations.create method に移行することにしました。

conversations.create method を使って bot が Public channel を作るためには、channels.manage scope が必要です。Supported token types には classic bot と bot の両方が挙げられています。しかし、classic bot では Update scope しないとそもそも channels.manage scope を付与することができません。

そこで Update scope を検討してみますが、Update scope して得られたトークンでは、RTM API を利用できなくなります。https://api.slack.com/authentication/migration#select_user では

New Slack apps may not access RTM.

と書かれていますが、Slack classic app の Update scope UI では

The RTM API is not accessible to updated Bot Tokens.

とハッキリ書かれていました。以上から、RTM API を利用する bot が Public channel を作成できるという挙動を維持するためには、結局 RTM API を捨てるしかなさそうでした。

Socket mode + Events API

RTM API は Slack が "outmoded way of connecting your application to Slack" と表現しており、移行先として Socket modeEvents API を提供しています。この 2 つを利用することで、RTM API で行えていた、WebSocket connection と Event subscription を享受できます。

RTM bot の移行 (again)

新たに classic でない Slack app を作成することにします。Socket mode と Events API の有効化はドキュメント通りにやるだけです。conversations.create scope を与えて workspace にインストールし、bot token を得ます。また、Socket mode に必要な App-level token も得ます。

先に例で挙げた bot は Go で書かれていて、https://github.com/slack-go/slack を利用していました。このライブラリは Socket mode 対応がすでに済んでおり、雛形となる例 もあるので、これを持ってくれば RTM からの移行は比較的簡単でした。

移行しない妥協案

bot token ではなく user token を使う場合、conversations.create に必要なのは channels.write scope になります。この scope は Classic app で付与可能なので、bot ではなく user が Public channel を作ることに妥協すれば、RTM API を捨てずに済むでしょう。

GitHubで編集を提案

Discussion

ログインするとコメントできます