Edited at

SlackでHubotへの問いかけを特定のprivate channelに限定させる方法

More than 1 year has passed since last update.


概要

全社でslackの1Team利用をすることになったりして、誰でも自由に問いかけたらまずいコマンドがhubotにある場合、自チームのメンバーが入っているprivate channelに当該hubotのコマンド受け付けを限定させる方法の簡易版です。


この記事でできること


  • public/privateを問わずにチャンネルに対してhubotの問いかけ許可を与えられる

  • hubotに対して特定ユーザがダイレクトメッセージで問いかけができる(その他のユーザはできない)

  • 問いかけを全チャンネル許可へ切り替えられる


この記事でできないこと


  • チャンネル内で特定のユーザだけがhubotへ問いかけれる

  • 限定させるチャンネルをチャンネル名で指定すること

  • hubotのデフォルトコマンドへの問いかけ制限


手順

以下の修正をhubotに対して行います。


チャンネルのroom値を取得

プライベートチャンネルは普通にやるとチャンネル名が取得できない(undefinded)ので、

まずはチャンネルのroom値(おそらく9桁大文字英数字)を取得する以下のようなコマンドを、hubotに追加します。


room.coffee

# Description:

# チャンネルのroomの値を取得する。取得した値はアクセス制御に利用する。
#
# Commands:
# hubot room - チャンネルのroomの値を取得

module.exports = (robot) ->
robot.respond /room/, (msg) ->
msg.send "#{msg.envelope.room}"


このコマンドをhubotを利用したいチャンネルで実行すると、そのチャンネルのroom値が取得できます。

ダイレクトメッセージでhubotに対してこのコマンドを実行した場合もroom値が取得できるため、

この値を使って開発ユーザのダイレクトメッセージは許可させることもできます。


コマンドの実行制限処理

次に実行に対して制限をかけたいhubotコマンドに対して、以下の記述を追加します。


コマンド名.coffee

permitted_rooms = process.env.HUBOT_PERMITTED?.split(',') || []

permitted = (room) ->
room in permitted_rooms || 'ALL' in permitted_rooms

module.exports = (robot) ->
robot.respond /コマンド名 (.*)/, (msg) ->
# 許可しないチャンネルでは実行禁止
unless permitted msg.envelope.room
return

# ここからこのコマンドでやりたい処理を書く
# ...



Hubotの起動コマンド

HUBOT_PERMITTEDの変数に許可するチャンネルのroom値をカンマ連結で設定します。

制限をかけなくても良くなった場合はALLを指定して起動してください。


起動コマンド

# 問いかけ可能なチャンネル(ユーザ)を限定させる場合

HUBOT_PERMITTED=ルームID1,ルームID2,Hubotに直接DMしたときの値 HUBOT_SLACK_TOKEN=Slackのトークン ./bin/hubot --adapter slack

# 全てのチャンネルで問いかけを許可する場合
HUBOT_PERMITTED=ALL HUBOT_SLACK_TOKEN=Slackのトークン ./bin/hubot --adapter slack


※注意:HUBOT_PERMITTEDを指定してhubotを起動する前に、一度roomコマンドが有効な状態でhubotを起動させ、room値を取得する必要があります。


簡易版を脱するには?

groups.listの中にはプライベートチャンネルのチャンネル名も全て入っているので、この情報を使ってチャンネル名とIDの一覧を作れば、チャンネル名指定からIDを逆引きして、制御することが可能だと思います。

頑張りたい人は是非こちらで頑張ってみてください!(私はいいです)


参考