Slack の RTM bot が実質機能しなくなることに合わせて Socket mode に移行する
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 mode と Events 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 を捨てずに済むでしょう。
Discussion