Konifar's WIP

親方!空からどらえもんが!

特定のSlackチャネルに全メンバーを一括招待するコマンドをZapierで作る

Slackの特定のチャネルに全メンバーを一括招待する /invite_all というSlashコマンドをZapierで作ってみました。

Zapierの詳しい話は書かないので、興味がある方は調べてみてください。どんなことができるかざっくり知りたい方は下記を見てみると雰囲気がわかるかもしれません。

blog.kyash.co

使い方

全メンバーを招待したいSlackチャネルで /invite_all を打つだけです。

全メンバーが入っている特定のチャネル(Kyashだと #all-announce)に入っている全員が招待されます。

f:id:konifar:20210812215318p:plain

モチベーション

自分の所属しているKyashでは、特定のSlackチャネルに全メンバーを一括で招待したいことがあります。

たとえば、 #all- prefixのつく全員参加のチャネルや、必須のタスクを終わった順に抜ける tmp- prefixのついたチャネルを作った時などです。

Slackには『全員を招待する』というコマンドはありません。デフォルトチャネルの設定に入れれば全メンバーを強制的に入れることはできますが、権限がないと設定できません。全メンバーが入るユーザーグループを作成するやり方も追加の運用が面倒ですし、これも権限がないと編集できません。

そこで、気軽に全メンバーを招待できるSlashコマンドを作ろうと考えたわけです。

Zapierじゃなくてboltなどを使って作ってどこかで動かしてもいいんですが、こういうちょっとしたSlashコマンド動かすのにZapier便利なんですよね。デプロイとか考えずに済むので運用も楽だしZapier好きだしということでZapierでやりました。

しくみ

大まかな流れは以下です。

  1. Slack appを作ってSlashコマンドを作成
  2. Slashコマンドの Request URL にZapのWebhookトリガのurlを指定してZapを実行
  3. SlackのActionの Invite User to Channel でSlack appをチャネルに招待
  4. Code by Zapier のActionでconversations.membersconversations.inviteを使って一括招待

Slack appの作成

https://api.slack.com/apps?new_app=1 から作成します。

Display Informationなどは適当に入れましょう。自分は千手観音のアイコンにしました。

f:id:konifar:20210812215802p:plain

大事なのは OAuth & Permissions の設定です。

利用するconversations.membersconversations.inviteの2つのAPIドキュメントに明記されている Required scopes を追加しましょう。

f:id:konifar:20210812215851p:plain

ZapのWebhookトリガの作成

Webhooks by ZapierをトリガにしてZapを作成します。

f:id:konifar:20210812215920p:plain

ここで発行される Custom Webhook URL をSlashコマンドの Request URL に指定するのでコピーしておきます。

Slashコマンドの作成

先に作っておいたSlack appのSlashコマンドを作ります。Commandは /invite_all にしました。

f:id:konifar:20210812220028p:plain

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)

コードは以下のとおりです。エラー処理などはもうちょっとちゃんと書いた方がうまく動かない時に原因の切り分けをしやすいかもしれませんが、一応これで動いています。

gist.github.com

招待のActionの前にSlack appを招待するActionを作成

Slack appによる招待は、そのSlack appが該当のチャネルに参加していないと ​​not_in_channel というエラーになります。それを防ぐために、該当のチャネルにSlack appを招待するActionを追加します。

Channel ID にはトリガのWebhookから取得できる Channel ID を指定し、 Users にはSlack appを指定します。

f:id:konifar:20210812220137p:plain

Zapの全体像はこんな感じになります。最後にSlackのSend Channel Messageなどを入れて結果を通知させてもいいですね。

f:id:konifar:20210812220202p:plain

感想

思ったよりサッと作れてよかったです。地味に便利なのでうれしい。

実はもっと楽なやり方ある気もしているので、知見持ってる方いたら教えてください。

[2021/08/12 23:40追記]

ユーザーグループをメンテする方法を@omuomuginが書いてくれていました。

ユーザーグループの追加の運用が面倒だと思っていたんですが、実はユーザーグループに全メンバーを入れる部分をZapierで自動化する方が筋がいいかもしれません。

Slackにメンバーが参加したのをTriggerにして、ゲストアカウントじゃない場合のみusergroups.users.updateでグループに追加するZapを組むイメージです。このやり方の方がシンプルなので、今のSlashコマンドのやり方がうまく運用できなかったらユーザーグループ方式に変えるかもしれません。


自分の所属しているKyashでは、ソフトウェアエンジニアを募集中です。

open.talentio.com

github.com

カジュアル面談も転職の意思を問わず歓迎しますのでお気軽にお申し込みください。

docs.google.com