この記事は 『Slack Advent Calendar 2016』 4日目の記事です。
昨日は kaneshin さんの 「golang で始める Slack bot 開発」 でした。
この記事では、下記画像のようにslackユーザのinvite履歴をツリー状に可視化できるツールを紹介します。
ツリー描画にD3.jsを利用しており、ユーザアイコンをドラッグしてグリグリ動かせます。また、アイコンにカーソルを重ねるとフルネームとプロフィールが表示されます。
ライブデモはこちら (ライブデモのユーザデータはダミーです)
開発の動機
slackを使っていて、ユーザが誰から招待されたのか、誰を招待しているのか気になったことはありませんか?
slackチームのユーザ数が数百名規模になってくると、誰なのかよく分からない人(特にプロフィールが未設定だったりすると)が、誰の紹介で参加したのか気になるということがありました。
そこで、自分が参加している約400名規模のslackチームのinvite履歴を可視化してチーム内に共有したところ、意外と評判が良かったため、作成手順を自動化してツールとして公開しました。
ソースコードはこちらです knjcode/slack-inviteviz
ツール利用上の注意
slackユーザのinvite履歴情報の取得のために、ツール実行時に管理者権限を持ったslackアカウントが必要になります。
また、本ツールは管理者権限でしか知り得ない情報を可視化するため、利用結果の共有は慎重に行ってください。
ツールの使い方
管理者権限をもったslackアカウントとRubyの実行環境が必要です。
ソースコードのクローン
1 2 |
$ git clone https://github.com/knjcode/slack-inviteviz |
ツールで利用するライブラリのセットアップ
1 2 3 4 |
$ cd slack-inviteviz $ gem install bundler $ bundle install --path vendor/bundle |
invite履歴の抽出
自動でinvite履歴を抽出するコマンドを実行します。
コマンド実行後にslackのチーム名(URLのサブドメイン部分を指定)やアカウント情報を入力してください。
1 2 3 4 5 6 7 |
$ bundle exec rake export Your slack team name(subdomain): xxxxxx Login email: xxxx@xxxx.xxx Login password(hidden): xxxxxxxxxx Your two factor authentication code: xxxxxx Saved! |
※ コマンド実行後、カレンドディレクトリに accepted_invites.json
と team_name.json
というファイルが保存されます。このファイルは管理者権限でしか取得できない情報を含むためファイルの取扱いに注意してください。
ブラウザで確認
ローカルサーバを起動して、自動的にブラウザを開きます。
1 2 |
$ bundle exec rake server |
画面が表示されない場合はブラウザのリロードをしてみてください。
また、ツリーが画面内に収まらない場合はブラウザ画面をズームアウトしてみてください。
FAQ
なぜslackのアカウント情報を入力する必要があるの?
現状、slackユーザのinvite履歴をAPIで取得する方法がありません。そのため、管理者アカウントでslackのwebページにログイン後に承認済みinvite一覧のページをスクレイプして情報を取得しています。
ツリーが1つにまとまらずに分離するんだけど?
以下の理由でinvite情報が無い(または取得できない)ためにツリーが分離する場合があります。
- ドメイン指定されたメールアドレスを使ってinviteされることなくにteamにjoinしたユーザがいる場合
- Disabledのユーザがいる場合 (slack公式サポートに確認したところ、現状、Disabledになったユーザをinviteしたユーザを取得する方法は無いとの回答あり)
invite履歴を取得する export.rb
の reduce_user_info
メソッドは何をやってるの?
承認済みinvite一覧ページからスクレイプして取得したデータは各ユーザの詳細なプロフィール情報を含んでいるため、安全のために、ローカル環境にファイルとして保存する際に、ユーザIDとフルネームとプロフィールのみの情報に削っています。
slackinを使って参加したユーザは誰がinviteしたことになる?
slackin等が利用しているslackの非公開APIである users.admin.invite を利用して招待したユーザは招待用のtokenを発行したユーザがinviteしたことになります。
謝辞
invite情報の抽出スクリプト export.rb は slack-reaction-decomoji の import.rb を参考にして作成しました。
ライブデモのダミーデータは RANDOM USER GENERATOR を利用して生成しています。