14
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

SlackからエクスポートしたデータをMarkdownに変換する

Last updated at Posted at 2016-12-14

Fujitsu extended Advent Calendar 2016の14日目の記事です。プランAで書きたかったのですが、各種申請が間に合わなかったのでプランBでの内容となります。

はじめに

Slack、便利ですね。しかし過去のメッセージを目グレップで探すときはややスクロールがもたついたり、無料プランでただ乗りをしていると1万件までのメッセージしか参照できなかったり、コマンドラインのgrepで検索をかけたかったりと、ローカルにデータがあれば楽だと思うことがたまにあります。

Slackにはデータのエクスポート機能があり、チャネル内のメッセージを日付ごとに個別のJSONファイルにしZIPで固めたファイルをダウンロードできるようになっています。

しかしJSONファイルのままでは利用しにくいため、JSONをMarkdownに変換するツールを作ってみました。Markdownになっていれば人間が目で見ても読めますし、MarkdownをHTMLに変換してウェブサーバに上げておけば簡易アーカイブにもなります。

ソース

https://github.com/ohtake/slack2md に置いてあります。Goだけで書かれているのでGoが動く環境ならどこでも動くはずです。初めて書いたGoなので、突っ込みどころがあったら突っ込みを入れてくれると助かります。

テスト用のデータをMarkdownに変換してGitHubにそのまま置いたサンプル出力が https://github.com/ohtake/slack2md/blob/example/output/index.md にあります。ユーザAliceのアイコンが表示されないのは意図通りです。

実装する際に参考にしたのはSlack APIドキュメントのBasic message formattingです。ここにJSON内の形式が説明されているので、それに従ってパーズするだけです。Slackのメッセージをパーズするライブラリが見つからなかったので、練習がてら自分で書いてしまいました。既存のライブラリがあれば乗り換えたいところ。

簡易運用例

変換プログラムがあってもそれだけだと履歴が取れません。ちゃんと履歴を取る運用をすればいいのですが、Gitリポジトリだけを使って簡易的に履歴を取る運用を現在行っています。

具体的には、プログラムのソースコードがあるGitリポジトリのmasterブランチからデータ保存用のdataブランチを作り、そのブランチではSlackからエクスポートしたJSONを保存し続けていきます。dataブランチからmdブランチを作りJSONをMarkdownに変換して保存します。dataブランチが伸びたら、mdブランチでdataブランチをマージして変換しなおしてコミットします。Gitのコミットグラフで図示すると以下のようになります。

 * [md] Convert 2016-12-02
 * Merge branch 'data' into md
/|
*| [data] Export 2016-12-02
|* Convert 2016-12-01
|/
* Export 2016-12-01
* [master] Foo

こうするとJSONで何が変わったのかがわかりやすいです。

React版

Goで作った変換プログラムと同時期にReact版のプログラムも別に作っていました。これはエクスポートされたJSONそのままでクライアント側でReactノードに変換して表示させます。Reactで任意のHTML要素を作れるためMarkdownに変換するGo版よりも見た目は良くはありますが、Markdownに一括変換されていたほうが使い勝手が良いので、React版はチャネル内の発言数をGitHubの草みたいに表示させたい時にしか使っていません。

API Terms of Serviceについて

Slack API Terms of Serviceの "6. Storage of Data" には以下のことが書かれておりデータの保存を禁止しています。

6.5 No Other Storing. You may not copy or store any Data or capture or store any information expressed by the Data (such as hashed or transferred data), except to the extent permitted by this API TOS.

しかしこれは "6.3 Delete at User Request" のようにOAuthで他人のデータを使う場合の話だという認識で、データのエクスポートには関係がないと判断しています。

14
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?