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を流用していました.
しかし,Slack Adapterが持つTOKENはAdmin権限が無いため,別途発行する必要があります.
今回はHUBOT_SLACK_ADMIN_TOKEN
という環境変数で設定することにしました.
実際のコードは長いので,GitHubへのリンクを示します.
Hubotの/slack/form
にアクセスすると,メールアドレスの入力フォームが表示されます.
また,/api/team.info
を使ってチーム名も表示できるようにしてみました.
フォームを送信すると/api/users.admin.invite
が呼び出され,結果が表示されます.
既に招待済みなど,エラーの場合はエラーページが表示されるようになっています.
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として運用中です.
Hubot×ChatOps勉強会
08/22(土)に神戸で第2回 Hubot×ChatOps勉強会を開催します!
HubotやChatOpsに興味のある方,Pluginを開発している方など,ぜひお越し下さい.
発表して頂ける方も募集中ですので,@hico_horiuchiまで気軽にお声掛け下さい.