Help us understand the problem. What is going on with this article?

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

More than 3 years have 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を逆引きして、制御することが可能だと思います。
頑張りたい人は是非こちらで頑張ってみてください!(私はいいです)

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away