HubotでSlackの招待フォームを実装

  • 19
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

JANOG36でスタッフをご一緒していた方から,Slackの隠しAPIの存在を教えて貰いました.
これを使うと,管理者が手動でやっていたユーザの招待を,各自が行えるようになります.
既に招待フォームを提供するWebアプリが幾つかあるのですが,今回はHubot上で実装してみました.

招待APIの概要

Slack APIには載っておらず,Inviteページのソースから発見されたようです.

curlコマンドだと,下記のように呼び出せます(URLのTEAMは無くても大丈夫でした).
また,TOKENはAdmin権限を持ったユーザが発行する必要があります.

$ curl -X POST 'https://TEAM.slack.com/api/users.admin.invite' \
--data 'email=EMAIL&token=TOKEN&set_active=true' \
--compressed

Hubot上で実装

Typetalk用に開発していたHubocoでも,同様の招待機能を実装していました.
この場合はAPIの呼び出しに,Typetalk Adapterが持つTOKENを流用していました.

typetalk_form.png

しかし,Slack Adapterが持つTOKENはAdmin権限が無いため,別途発行する必要があります.
今回はHUBOT_SLACK_ADMIN_TOKENという環境変数で設定することにしました.
実際のコードは長いので,GitHubへのリンクを示します.

Hubotの/slack/formにアクセスすると,メールアドレスの入力フォームが表示されます.
また,/api/team.infoを使ってチーム名も表示できるようにしてみました.

slack_form.png

フォームを送信すると/api/users.admin.inviteが呼び出され,結果が表示されます.
既に招待済みなど,エラーの場合はエラーページが表示されるようになっています.

slack_invite.png

inviteコマンド

フォームと同様にして,コマンドでもユーザをチームに招待できるようにしてみました.
(実装した後で/invite_peopleコマンドがあることを知りました….)

querystring = require('querystring')
request = require('request')
urler = require('url')

module.exports = (robot) ->
  robot.respond /invite\s+(\S+)$/i, (msg) ->
    email = msg.match[1]
    options = {
      url: "https://slack.com/api/users.admin.invite"
      qs:
        'token': process.env.HUBOT_SLACK_ADMIN_TOKEN
        'email': email
        'set_active': true
    }
    request.post options, (err, res, body) ->
      json = JSON.parse(body)
      unless json.ok
        return msg.reply("```\n#{json.error}\n```")
      msg.reply("#{email} を招待しました")

Kaonashi

上記のコードはKaonashiという名前のBotとして運用中です.

icon.png

Hubot×ChatOps勉強会

08/22(土)に神戸で第2回 Hubot×ChatOps勉強会を開催します!
HubotやChatOpsに興味のある方,Pluginを開発している方など,ぜひお越し下さい.
発表して頂ける方も募集中ですので,@hico_horiuchiまで気軽にお声掛け下さい.

4f4f7c00342367d0b2b51d51510dab0a.png