アプリのレビューを HipChat で自動通知する

# 概要
この記事は Google Play に公開されている自分のアプリのレビューを定期的に取得し、前回からの更新分を通知する仕組みの作り方について説明しています。本稿では、HipChat に投稿するやり方を説明しますが、多少手を加えることで Slack やメールなど、お好みの方法で通知が可能です。

# アプリのレビューの取得
まず、Google Play からレビューを自動で取得しなければなりません。レビューは CSV 形式で提供されており、ダウンロードのやり方は[アプリの評価とレビューを確認する - Android デベロッパー ヘルプ](https://support.google.com/googleplay/android-developer/answer/138230#export_ratings_and_reviews)に解説してあります。

## gsutil のインストール
https://cloud.google.com/storage/docs/gsutil の手順に従って gsutil をインストールし、設定しましょう。pip がすでにインストールされていれば、以下のコマンドでインストールされます。

```bash
$sudo pip install gsutil
```

## gsutil の設定
`gsutil config`を実行すると、以下のように表示され、`https://accounts.google.com`で始まるURLへのアクセスが求められるのでブラウザで開きます。

```bash
% gsutil config
This command will create a boto config file at /home/hiroshi/.boto
containing your credentials, based on your responses to the following
questions.
Please navigate your browser to the following URL:
https://accounts.google.com/o/oauth2/auth?scope=...
```

そうすると、以下のようなコードが表示されますので、それをコピーして、コンソールの authorization code を要求している箇所に貼り付けます。
![Selection_002.png](https://qiita-image-store.s3.amazonaws.com/0/36306/b5e2ea1b-98b4-bd79-6f12-000522f4776c.png)

次にプロジェクトIDを聞かれますので、https://cloud.google.com/console#/project をブラウザで開き、自分の適当なプロジェクトを開いて左上の Overview をクリックします。すると、プロジェクトIDが表示されますので、それをコピーして貼り付けます。

![Selection_003.png](https://qiita-image-store.s3.amazonaws.com/0/36306/60698900-d2ba-da7e-5db8-e7ebdbb771a3.png)

これで gsutil が使えるようになりました。試しに、以下のコマンドを実行してみましょう。

```bash
% gsutil ls gs://<report bucket ID>/reviews/
```

なお、`<report bucket ID>`は自分のアプリの「評価とレビューのページ」に行き、一番下にスクロールすると書いてありますので、その値で置き換えてください。
![Selection_006.png](https://qiita-image-store.s3.amazonaws.com/0/36306/d3b6de2e-0c67-fe1c-01c1-b7d5334202f4.png)

上記のコマンドを実行すると、（レビューがあれば）月ごとのレビューが CSV ファイル形式で保存されたファイル一覧が表示されるはずです。ファイルを実際にダウンロードするには、以下のコマンドを用います。ここで、`<package name>`は、自分のアプリのパッケージ名で置き換えてください。

```bash
% gsutil cp -r "gs://<report bucket ID>/reviews/reviews_<package name>*" /path/to/your/local/dir
```

*注* 本来であれば、リモートとローカルの差分だけ取得したいところです。実際、gsutil には `rsync` コマンドが用意されているのですが、なぜか `gsutil rsync -d -r "gs://<report bucket ID>/reviews/" /path/to/your/local/dir` を実行しても、すべてのファイルをダウンロードしてしまいました。

# CSV ファイルの差分の出力と通知
さて、レビューのダウンロード方法は分かりましたが、実際に運用する際には、定期的に更新を調べ、その差分をどこかに通知したいところです。

ここでは、Unix コマンドの `comm` コマンドを用いて、以前のファイルと新しいファイルを比較して差分を出力します。注意点として、

1. レビューの CSV ファイルの先頭には BOM (Byte Order Mark) が含まれているので、予め除去してやる必要がある
2. 以前のレビューはどこかに取っておく必要がある
3. 以前のレビューが消されたり更新されている場合がある

が挙げられます。1 については `nkf` コマンドで、2 については、ディレクトリを1つ作ってそこにいま存在する CSV ファイルを移動させてからダウンロードすることにしました。また、3 については消されたものは無視して更新されたものは再び投稿する、という挙動にしました。

また、今回は社内で使っているチャットシステムの HipChat に通知するために、出力を `awk` で整形し、 `jq` で JSON 形式にエンコーディングしてから `curl` コマンドで投稿しています。

## 自動化スクリプト
以上をスクリプトにしたものを Gist に公開しておきます。
https://gist.github.com/hkurokawa/1b8c2f4321397b9b26cd

このスクリプトの使い方を簡単に説明しておきます。

1. `printNewReviews.sh` と `postNewReviewsHipchat.sh` をパスが通っているところに保存します
2. コンソール上で以下の環境変数をセットします
    - `GOOGLE_BUCKET_ID` 上で述べた report bucket ID です
    - `APP_PACKAGE` レビューを取得したい Android アプリのパッケージ名です
    - `HIPCHAT_TOKEN` HipChat の API を実行するために使用するトークンです
    - `ROOM_ID` HipChat のルーム ID です
3. 適当なディレクトリに移動します
    ある程度、ディスクの空き容量が必要です。50MB 程度は確保しておきましょう。

4. `postNewReviewsHipchat.sh` を実行します
    CSV ファイルがダウンロードされ、通知が順次 HipChat に投稿されます

# 定期実行
自動化は、どこかのサーバーで `cron` などで定期的に実行するのが一番お手軽でしょう。あるいは、ボットがいるなら、そこで動かしても良いかもしれません。予め `gsutil` などのツールのインストールや設定を忘れないようにしましょう。