LoginSignup
9
9

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-02-08

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

スクリーンショット 2014-02-08 13.49.15.png

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

9
9
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
9
9