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


最近Day OneなるMac日記アプリを使っています。
普段は家でも外でもHipchatを使ってメモ取っているのですが、これを連携できないかなと思って調べてみました。

環境

  • Mac Book Air
  • OS X Mavericks (10.9.1)

やりたいこと

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

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

HipchatのAPIがありました。

TOKENを取得すれば、その後は、rooms/history APIでいけそうです。

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

https://api.hipchat.com/v1/rooms/history?room_id={room_id}&date={date}&timezone=JST&format=json&auth_token={token}
{"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がありますので、これを利用します。

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

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

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上ではこういう素敵画面になります。

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