Slackからエクスポートしたトーク履歴などを、いい感じに整えたい #1

# はじめに
皆さんこんにちわ！なーねこ（@na2neko）です。
当記事は [OPENLOGI Advent Calendar 2019 17日目](https://qiita.com/advent-calendar/2019/openlogi)の投稿となります。

株式会社オープンロジにて、情シスと人事兼務として働いております。よろしくお願い致します :cat:

## 概要
Qiita初投稿とりますので、実現したい事を練習も兼ね、複数回で記載していこうと思います。
また、コードを書く事から結構離れているため、自分の勉強のためのアウトプットになります。

情シスとして働いている中で、あとで開発してみようと思った事のひとつに
**Slackからエクスポートしたデータ**の整理プログラムがあります。

既出を探してみたのですが、コーポレートエクスポート（DM含む）まで扱っているものが少なかったので、最終的にはそちらの扱いまで記載できたらいいなと考えています。
*（＊従業員のプライバシーを最大限に配慮して、コーポレートエクスポート機能を利用しており、利用用途は監査対応のみとなります）*

コーポレートエクスポートの申請をSlack社へ実施し、手続きが済むと次のような画面でコーポレートエクスポートが利用可能となります。
<img width="680" alt="スクリーンショット 2019-12-18 14.45.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100603/4cf7a435-bfe9-0daf-9f3c-e4d0a710d085.png">

ちなみに、**コーポレートエクスポートの申請を通す事も、ものすごい苦労した**ので、そのお話は別途。


Slackはエンジニアが不在の会社さんでも使われ始めている印象ですので、最終的にはそういった会社の方々へも役立てられる何かが作れればいいなと考えています。


### この記事のお話
- Slackのエクスポートデータの構造を理解する
- 試しに、ユーザー名とテキストを抽出して出力してみる

### 今後目指す形
- エクスポートしたトーク履歴を整形
- 非エンジニアでも集計可能なツールをつくる
    - 監査ログ用に、ログを綺麗に整形する方法を準備しておきたい
    - せっかくなら、投稿数、メンション数など分析できるよう準備したい


## エクスポートしたデータの構造
### zip圧縮でダウンロードされます
ダウンロードしたい期間を選択し、ダウンロードを実施すると
データの生成がはじまり、完了するとSlackbotさんが教えてくれます。
<img width="640" alt="スクリーンショット 2019-12-18 14.55.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100603/324ca68a-5993-0727-7329-7922f00f9ca7.png">
（親切なbotですね。ありがたい。）

### zipを解凍するとこんな形
1階層目にチャンネルやユーザーを表すJSONファイル、全チャンネル名のフォルダ。
フォルダの中にメッセージが入ったJSONファイル。
（DMもチャンネルと同じ扱いで、チャンネル名が振られた状態となります）

```terminal:各構成を表すJSONファイル
[na2neko Slack export Aug 31 2019 - Oct 01 2019]$ ls -1 *.json
channels.json
dms.json
groups.json
integration_logs.json
mpims.json
users.json
```
上記の他、チャンネル名ごとのフォルダがあります。

```terminal:generalチャンネルの例（3件のみ表示）
[na2neko Slack export Aug 31 2019 - Oct 01 2019]$ ls -1 general | head -n 3
2019-09-01.json
2019-09-02.json
2019-09-03.json
```

### 各ファイルの説明
エクスポートしたファイル内で使われている、チャンネル、又はユーザーに対するIDは、
大文字の英字と数字の組み合わせで、ユニークなものが振られています。
（今回は`**********`として表現させて頂きます）
#### channels.json
チャンネルを表したファイルです。

```json:channels.json
    {
        "id": "**********",
        "name": "general",
        "created": "1234567890",
        "creator": "**********",
        "is_archived": false,
        "is_general": true,
        "members": [
            "**********",
            "**********",
　　　　　・・・・・・（省略）
        ]
    }
```
チャンネルに対するステータスと、参加ユーザーの識別IDが並んでいます。
`id:`と同一のフォルダ内に、メッセージが日付ごとに保存されています。

#### dms.json
ユーザー同士のダイレクトメッセージ（DM）について、やりとりを保存したフォルダ名を表すファイルです。

```json:dms.json
    {
        "id": "**********",
        "created": 1234567890,
        "members": [
            "**********",
            "**********"
        ]
    }
```
チャンネルと同様に、`id:` と同一のフォルダ内に、メッセージが日付ごとに保存されています。

#### groups.json
`channels.json`と同様の形で、プライベートチャンネルの構成が記載されています。

#### integration_logs.json
Slackの外部連携がある場合、その設定リストが入っています。
（今回は割愛します）

#### mpims.json
複数人のダイレクトメッセージ（DM）の場合は、こちらに記載されています。
こちらも、`channels.json`と同じような構成で記載がされています。

#### users.json
```json:user.json
   {
        "id": "**********",
        "team_id": "**********",
        "name": "na2neko",
        "deleted": true,
        "profile": {
　　　　　　（プロフィールの項目が入ってます）
        },
        "is_bot": false,
        "is_app_user": false,
        "updated": 1234567890
    },


```
## とりあえずテキストを抽出してみる
参考URLに記載している記事をもとに、#general チャンネルの2日分くらいのデータを試しに出力してみました。（jqコマンド必須です）

```sh:テスト的にユーザーとテキストを出力してみる
#!/bin/sh

for file in `\find ./general -name \*.json | sort | head -n 2`; do
  echo "filename: ${file}"
  len=`cat $file | jq length`

  for i in $( seq 0 $(($len - 1)) ); do
      user=`cat $file | jq -r .[$i].user`
      text=`cat $file | jq -r .[$i].text`
      echo "${user}: ${text}\n"
    done
done
```
下記のような形で出力されます。
まだ、ユーザー名がマッピングされず、Slack内の`ID`表記になっているため
`users.json` とマッピングする事で、誰の発言か表す事が可能となります。
今後のツールづくりで、対応していきたいと思います。

```terminal:出力結果
**********: テキストテキストテキスト
**********: テキストテキストテキストテキストテキスト

```

## 今後の展望
- 普段はRubyを利用しているため、Rubyでテスト実装をしてみる
- スプレッドシート上で完結してみたいので、GASでも記載してみる
- 非エンジニアさんでも利用できるよう、Excel（VBA）で記載してみる
- 良いものができたら、配布したい

## 最後に
ここまで読んでいただきありがとうございます。
今後、このツールの完成を目指して頑張っていこうと思います。

自己紹介を、[note](https://note.com/na2neko/n/n49ea65953101) に記載させて頂きました。
紆余曲折あり、未経験にて情シス担当で入社しましたが、そんな自分を受け入れてくれた会社と、現場の皆さまに感謝しております。

情シス業務において分からない事を相談し会える集まりを作ろうと思い、
結果的に「コーポレートエンジニア、情シスのSlackコミュニティ」を立ち上げ、
現在800名ほどの方にご登録頂きました。

気になる方は、こちらの記事をど〜ぞ。「[情シスSlackで幸せになった話](https://note.com/ringo_o_7/n/nd72d772b83f1)」
[<img width="463" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100603/13be35e7-7aa4-d558-c726-14d69b5438dd.png">](https://note.com/ringo_o_7/n/nd72d772b83f1)

それでは、ツール開発が進みましたら、記事を更新させて頂きます　:bow:


## 参考URL
bashでjqを使ってJSONの配列をループさせる
https://qiita.com/ryo0301/items/2ac9d11f355f1cf52ea5

Slackのトーク履歴を整形する
https://qiita.com/taumu/items/0061363da1bb1c917fac

情シスSlackで幸せになった話
https://note.com/ringo_o_7/n/nd72d772b83f1