Hipchatに入力した内容をAPIで取得してDay Oneにワンライナーで貼付ける


最近[Day One](http://dayoneapp.com/)なるMac日記アプリを使っています。
普段は家でも外でも[Hipchat](https://www.hipchat.com/)を使ってメモ取っているのですが、これを連携できないかなと思って調べてみました。

## 環境

+ Mac Book Air
+ OS X Mavericks (10.9.1)

## やりたいこと

+ Hipchatで入力した内容を１日単位で取り出してテキストデータにする
+ 取り出したテキストデータをDay Oneに貼付ける

## Hipchatからデータを取り出す方法

[HipchatのAPI](https://www.hipchat.com/docs/api)がありました。

TOKENを取得すれば、その後は、[rooms/history](https://www.hipchat.com/docs/api/method/rooms/history) APIでいけそうです。

最終的に、{room_id},{date},{token}の変数を確定させれば、レスポンスがjson形式で返ってきます。

```hipchat_rooms/history_request
https://api.hipchat.com/v1/rooms/history?room_id={room_id}&date={date}&timezone=JST&format=json&auth_token={token}
```

```hipchat_rooms/history_response(example)
{"messages":[{"date":"2014-02-06T10:01:07+0900","from":{"name":"daxanya (-v-)","user_id":544xxx},"message":"https:\/\/github.com\/bowery\/orchestrate.js"},{"date":"2014-02-06T10:01:11+0900","from":{"name":"daxanya (-v-)","user_id":544xxx},"message":"orchestrate.js"},{"date":"2014-02-06T10:01:18+0900","from":{"name":"daxanya (-v-)","user_id":544xxx},"message":"http:\/\/www.slideshare.net\/who_you_me\/neo4j-24294061"},{"date":"2014-02-06T10:01:22+0900","from":{"name":"daxanya (-v-)","user_id":544xxx},"message":"\u30b0\u30e9\u30d5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u300cNeo4j\u300d\u306e \u5c0e\u5165\u306e\u5c0e\u5165"}]}
```

ここまではよさそうです。

## 取り出したテキストデータをDay Oneに貼付ける

Day Oneに貼付けるための、[Command Line Interface](https://dayone.zendesk.com/hc/en-us/articles/200258954-Day-One-Tools)がありますので、これを利用します。

その前に、Hipchat APIからのレスポンスはjsonフォーマットなので、整形する必要があります。

## jsonフォーマットからテキストへの整形

[jq](http://stedolan.github.io/jq/)というコマンドラインでjsonを処理するツールが便利そうでしたので使ってみます。インストールはHomebrewから行いました。

さきほどのレスポンス結果は、example.jsonという名前で保存してあるとします。

```
$ cat example.json  | jq '.messages[]'
```
とすると、

```
{
  "message": "https://github.com/bowery/orchestrate.js",
  "from": {
    "user_id": 544xxx,
    "name": "daxanya (-v-)"
  },
  "date": "2014-02-06T10:01:07+0900"
}
{
  "message": "orchestrate.js",
  "from": {
    "user_id": 544xxx,
    "name": "daxanya (-v-)"
  },
  "date": "2014-02-06T10:01:11+0900"
}
{
  "message": "http://www.slideshare.net/who_you_me/neo4j-24294061",
  "from": {
    "user_id": 544xxx,
    "name": "daxanya (-v-)"
  },
  "date": "2014-02-06T10:01:18+0900"
}
{
  "message": "グラフデータベース「Neo4j」の 導入の導入",
  "from": {
    "user_id": 544xxx,
    "name": "daxanya (-v-)"
  },
  "date": "2014-02-06T10:01:22+0900"
}
```

というように、messagesの配列の内容が構造化されて出力されます。
欲しいのは、dateとmessageなので、これらの値を抽出するように書き加えます。

```
$ cat example.json | jq '.messages[] | [.date, .message]'
```

```
[
  "2014-02-06T10:01:07+0900",
  "https://github.com/bowery/orchestrate.js"
]
[
  "2014-02-06T10:01:11+0900",
  "orchestrate.js"
]
[
  "2014-02-06T10:01:18+0900",
  "http://www.slideshare.net/who_you_me/neo4j-24294061"
]
[
  "2014-02-06T10:01:22+0900",
  "グラフデータベース「Neo4j」の 導入の導入"
]
```

これを一行にしたいですね。

```
$ cat example.json | jq '.messages[] | [.date, .message] | add'
```

```
"2014-02-06T10:01:07+0900https://github.com/bowery/orchestrate.js"
"2014-02-06T10:01:11+0900orchestrate.js"
"2014-02-06T10:01:18+0900http://www.slideshare.net/who_you_me/neo4j-24294061"
"2014-02-06T10:01:22+0900グラフデータベース「Neo4j」の 導入の導入"
```

お、やりました。と思ったけど、日付とメッセージの間にスペースが欲しいですね。配列の要素の間にスペースを入れてみましょう。

```
$ cat example.json | jq '.messages[] | [.date, ' ', .message] | add'
```

```
"2014-02-06T10:01:07+0900 https://github.com/bowery/orchestrate.js"
"2014-02-06T10:01:11+0900 orchestrate.js"
"2014-02-06T10:01:18+0900 http://www.slideshare.net/who_you_me/neo4j-24294061"
"2014-02-06T10:01:22+0900 グラフデータベース「Neo4j」の 導入の導入"
```

だいぶ整形されました。ただ、日付が冗長なフォーマットですね。一日単位で取得しているので、各行に日付は不要です。

ここから先はjqで加工の仕方がわからなかったのでsedに頼っています。

```
$ cat example.json | jq '.messages[] | [.date, " ", .message] | add' | sed -e "s/^\"[0-9-]\{10\}T//" | sed -e "s/^\([0-9:]\{8\}\)+0900/\1/" | sed s/\"$//
```

```
10:01:07 https://github.com/bowery/orchestrate.js
10:01:11 orchestrate.js
10:01:18 http://www.slideshare.net/who_you_me/neo4j-24294061
10:01:22 グラフデータベース「Neo4j」の 導入の導入
```

## タイトルつける

Day OneはMarkdown方式で記述できるのと、一行目がタイトル扱いになるので、タイトルが同時に表示できるようにします。

タイトルに日付が入れたかったので、awkの引数(-v)で日付を変数として指定します。日付は自動的に前日になるようにしましょう。

パイプによるコマンド連結の途中で、先頭行にテキストを入れる方法がわからなかったので、awk使ってみました。区切り文字をタブにしているので変な区切られ方はしないかなと。

```
$ cat example.json | jq '.messages[] | [.date, " ", .message] | add' | sed -e "s/^\"[0-9-]\{10\}T//" | sed -e "s/^\([0-9:]\{8\}\)+0900/\1/" | sed s/\"$// | awk -v p=`date -v-1d +%Y-%m-%d` -F'\t' 'BEGIN{print "# hipchat-log",p} {print}'
```

```
# hipchat-log 2014-02-07
10:01:07 https://github.com/bowery/orchestrate.js
10:01:11 orchestrate.js
10:01:18 http://www.slideshare.net/who_you_me/neo4j-24294061
10:01:22 グラフデータベース「Neo4j」の 導入の導入
```

よさそうですね。

## まとめ

APIによるデータ取得から最後まで、まとめてワンライナーするとこうなりました。{room_id}{token}は適宜入れ替えてください。

```
$ curl -s -X GET 'https://api.hipchat.com/v1/rooms/history?room_id={room_id}&date='`date -v-1d +%Y-%m-%d`'&timezone=JST&format=json&auth_token={token}' | jq '.messages[] | [.date, " ", .message] | add' | sed -e "s/^\"[0-9-]\{10\}T//" | sed -e "s/^\([0-9:]\{8\}\)+0900/\1/" | sed s/\"$// | awk -v p=`date -v-1d +%Y-%m-%d` -F'\t' 'BEGIN{print "# hipchat-log",p} {print}' | dayone new
```

最後の、dayone newの部分が、標準入力をDay Oneの新しい記事とするコマンドラインインターフェースになります。

上記コマンド一発で、Day Oneに日記が作成されます。Day One上ではこういう素敵画面になります。

![スクリーンショット 2014-02-08 13.49.15.png](https://qiita-image-store.s3.amazonaws.com/0/32778/42561f00-f43a-fa2e-e19d-485892ae72d0.png "スクリーンショット 2014-02-08 13.49.15.png")


それでは、充実したDay Oneライフを！