LoginSignup
17
17

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-07-31

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

17
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
17