Slackの特定のチャネルに全メンバーを一括招待する /invite_all
というSlashコマンドをZapierで作ってみました。
Zapierの詳しい話は書かないので、興味がある方は調べてみてください。どんなことができるかざっくり知りたい方は下記を見てみると雰囲気がわかるかもしれません。
使い方
全メンバーを招待したいSlackチャネルで /invite_all
を打つだけです。
全メンバーが入っている特定のチャネル(Kyashだと #all-announce)に入っている全員が招待されます。
モチベーション
自分の所属しているKyashでは、特定のSlackチャネルに全メンバーを一括で招待したいことがあります。
たとえば、 #all-
prefixのつく全員参加のチャネルや、必須のタスクを終わった順に抜ける tmp-
prefixのついたチャネルを作った時などです。
Slackには『全員を招待する』というコマンドはありません。デフォルトチャネルの設定に入れれば全メンバーを強制的に入れることはできますが、権限がないと設定できません。全メンバーが入るユーザーグループを作成するやり方も追加の運用が面倒ですし、これも権限がないと編集できません。
そこで、気軽に全メンバーを招待できるSlashコマンドを作ろうと考えたわけです。
Zapierじゃなくてboltなどを使って作ってどこかで動かしてもいいんですが、こういうちょっとしたSlashコマンド動かすのにZapier便利なんですよね。デプロイとか考えずに済むので運用も楽だしZapier好きだしということでZapierでやりました。
しくみ
大まかな流れは以下です。
- Slack appを作ってSlashコマンドを作成
- Slashコマンドの
Request URL
にZapのWebhookトリガのurlを指定してZapを実行 - SlackのActionの
Invite User to Channel
でSlack appをチャネルに招待 Code by Zapier
のActionでconversations.membersとconversations.inviteを使って一括招待
Slack appの作成
https://api.slack.com/apps?new_app=1 から作成します。
Display Informationなどは適当に入れましょう。自分は千手観音のアイコンにしました。
大事なのは OAuth & Permissions
の設定です。
利用するconversations.membersとconversations.inviteの2つのAPIドキュメントに明記されている Required scopes
を追加しましょう。
ZapのWebhookトリガの作成
Webhooks by ZapierをトリガにしてZapを作成します。
ここで発行される Custom Webhook URL
をSlashコマンドの Request URL
に指定するのでコピーしておきます。
Slashコマンドの作成
先に作っておいたSlack appのSlashコマンドを作ります。Commandは /invite_all
にしました。
Slack appのインストール
これでひととおりSlack appの設定は完了なので、Slackにインストールします。
https://api.slack.com/apps から作成したAppの詳細に行き、Install Appメニューからインストールできます。
xoxb-
から始まる Bot User OAuth Token
は使うのでコピーしておきましょう。
Zapの全メンバー招待のActionを作成
Slashコマンドを受け取った時に走らせるZapのActionを作成します。
Code by Zapier
でガリガリコードを書きます。Zapierでコードを書くと負けた気持ちになりますが、今回のようなちょっと複雑な処理の場合は仕方ありません。
Input Dataには次の値を指定して、Pythonのコードを書きました。
key | value |
---|---|
token | xoxb-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
channel_id | C027xxxxxxx(トリガのWebhookから取得できるChannel ID) |
コードは以下のとおりです。エラー処理などはもうちょっとちゃんと書いた方がうまく動かない時に原因の切り分けをしやすいかもしれませんが、一応これで動いています。
招待のActionの前にSlack appを招待するActionを作成
Slack appによる招待は、そのSlack appが該当のチャネルに参加していないと not_in_channel
というエラーになります。それを防ぐために、該当のチャネルにSlack appを招待するActionを追加します。
Channel ID
にはトリガのWebhookから取得できる Channel ID
を指定し、 Users
にはSlack appを指定します。
Zapの全体像はこんな感じになります。最後にSlackのSend Channel Messageなどを入れて結果を通知させてもいいですね。
感想
思ったよりサッと作れてよかったです。地味に便利なのでうれしい。
実はもっと楽なやり方ある気もしているので、知見持ってる方いたら教えてください。
[2021/08/12 23:40追記]
ユーザーグループをメンテする方法を@omuomuginが書いてくれていました。
デフォルトチャンネルを設定するとユーザーグループに追加するたびに全チャンネルに自動的に入るし、ユーザーグループを特定のチャンネルにinviteするのもできる気がする。
— omuomugin (@omuomugin) 2021年8月12日
ユーザーグループの追加の運用が面倒だと思っていたんですが、実はユーザーグループに全メンバーを入れる部分をZapierで自動化する方が筋がいいかもしれません。
Slackにメンバーが参加したのをTriggerにして、ゲストアカウントじゃない場合のみusergroups.users.updateでグループに追加するZapを組むイメージです。このやり方の方がシンプルなので、今のSlashコマンドのやり方がうまく運用できなかったらユーザーグループ方式に変えるかもしれません。
自分の所属しているKyashでは、ソフトウェアエンジニアを募集中です。
カジュアル面談も転職の意思を問わず歓迎しますのでお気軽にお申し込みください。