Slackで全チャンネルの全発言を取得する方法

  • 34
    いいね
  • 0
    コメント

はじめに
 2016年12月現在、SlackAPIでは公式に全チャンネルの全発言をリアルタイムに取得する方法が用意されていません。

つまりこれはSlackが我々に叩きつけた挑戦状ではないでしょうか?(?)

全能感を味わうツールを作りたかった私は試行錯誤の上、検索APIを利用する方法で全チャンネルの全発言を取得することができたので、今回作ったツールを含め紹介します。

slackの検索APIについて

https://api.slack.com/methods/search.all を使用します。

実は中身は…

 この検索APIのバックエンド実はsolrなんです!様々なクエリを投げていろいろ実験してるときに白状しました!

{
    "total":   0,
    "matches": [],
    "error":   "solr_failed"
}

ということは…

 solrと言う事は日時指定だけのクエリで全件取れるし、ほぼリアルタイムにインデックスが更新されてくれるはず!(偏見)

と言う事でさっそく次のようなリクエストを投げてみます…

curl https://slack.com/api/search.all?token=[トークン]&query=after%3Ayesterday&sort=timestamp

このリクエストは
- 昨日以降の発言
- タイムスタンプでソート
とだけ指定してSlackの検索APIを殴っています。

なんとこれだけで、10秒くらいの遅延はあるもののほぼリアルタイムで 全チャンネルの全発言を取得できました!!

タイトルは回収したので以降は作ったアプリの機能紹介になります。

Stalck

https://github.com/alfa-jpn/Stalck
全チャンネルで起きていることを大体把握できるツールです。

top.PNG

機能概要

  • 全チャンネルをリアルタイムに監視
  • 個別チャンネルや個別ユーザーを追跡
  • チャンネルにジョインしないで発言

リアルタイム

 リアルタイム機能を使うことで、全チャンネルの全発言をリアルタイムにモニタリングすることができます!
realtime.PNG

リアルタイムにスラ友の @ru_shalm がいるので早速 ストーカ モニタリングしてみます!

ユーザ追跡

 ユーザ名をクリックするとこのようにチャンネルを横断して特定ユーザの発言をモニタリングすることができます。
ru_shalm.PNG
#times_ru_shalm が気になるので覗いてみます

チャンネル閲覧

 slackのプレビュー機能とは違いこちらもリアルタイムに発言が反映されます。
#times_ru_shalm.PNG

また、名前欄の右端の返信マークから

times_ru_shalm.PNG

チャンネルにジョインせずに書き込むこともでき

reply.PNG

ウェッブモネーを簡単に手にすることができました。
(※slackのOAuthが必要になるのでなりすましはできません。)

stalckのポイント

割と少しだけセキュアな感じ(?)に人間のトークンを扱える設計になっています。

 前述の検索API、実は人間トークンから殴る必要があります。環境変数と言えどあまり永続化したくなかったのでアプリケーション起動時にドナーを求め、アプリケーションが終了すると消えるような作りになっています。

 また、人間のトークンを使って検索APIを殴ると、その人のDMやプライベートチャンネルの発言が含まれてしまうので、人間のトークンとは別のBOTユーザのトークンを使用し、そのBOTトークンから見れないチャンネルの発言は除外する安心設計になっています。

微妙な完成度

 時間がなかったのでテストしっかりかけてません。手元では動きました!!!!()
:bow_tone1::bow_tone1::bow_tone1::bow_tone1::bow_tone1:

将来的には an another platform of slack とか言えたらいいなとか妄想かましてます!!!!

PR :pray: :pray: :pray: :pray: :pray:

この投稿は Slack Advent Calendar 201616日目の記事です。