Hackathon => アメーバナウのなうをCouchDBに複製する。

やってきました。Hackathon自体は参加者8人とこじんまりでしたが。まぁそれはともかく、アメーバナウのほうも"自分のデータなので”(著作権とかの規約まだ読んでないです)、我が家のCouchDBに放り込んでおきたい。

http://www.nilab.info/zurazure2/001083.html に隠しAPIについて言及されていたので、これを元に作りました。

http://www.yssk22.info/relax/_design/ameba/backup.rb

基本的はtwitterでやったときと同じなのですが、メモ。

http://now.ameba.jp/api/entryList/{amebaId} に対して limit=Nで件数が指定できて(デフォルトはN=20)、さらに offset=XX を使えばどの位置から取得するかを指定できる模様。この辺は勘です。ただ、limit > 20 となると 400 になっちゃうので、limit は必要なくて offset=0 から 20ずつ増やして取得していけばよいです。

で、XMLで帰ってくるので ActiveSupport を使って Hash.from_xml(source).to_json をしちゃう方向です。

問題は単にJSONにすればよいのではなくて、同じデータベースにtweetも入っているので typeフィールドに"ameba_now"という識別子をつけておきつつ、また、XML Schemaがないので、"0" とかその辺は自分でJSONのnumberに変換してあげること。

さいごに、now のタイムスタンプが registDateStr というフィールドに入っているのですが、これが"X分前"とかそんな感じで相対時刻で帰ってきてしまうので、あとで計算できるようにbackup_dateをTime.nowで埋め込んでおきました。タイムスタンプをちゃんと整える作業は時間がなかったのでやってません。というか相対時刻で返さないでほしい、、、んですが、そもそもこれ公式のAPIじゃないと思うのでどうしようもないですね。

ここまでがRubyの話で、あとはCouchDBのViewを使って、type="ameba_now"のものだけ引っ張り出して List機能で表示すればよいだけなので、twitterの時に使ったやつを再利用して終わり。

http://www.yssk22.info/relax/_design/ameba/_list/timeline/by_entry_id?descending=true

な具合に見えます。ただ、CouchDBからRubyのバックアップスクリプトをけるにはExternalAPIを使うのが妥当なのですが、結構面倒な作業なので、cronでこんな具合に設定しています。

DB=http://****:*****@localhost:5984/relax
TW_PASS=*******
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

# m h  dom mon dow   command
*/15 * * * * /usr/bin/curl -X GET ${DB}/_design/twitter/backup.rb | /usr/bin/ruby1.9 - -u yssk22 -p ${TW_PASS} -d ${DB} > /home/yssk22/twitter.log 2>&1
*/5 * * * * /usr/bin/curl -X GET ${DB}/_design/ameba/backup.rb | /usr/bin/ruby1.9 - -u yssk22 -d ${DB} > /home/yssk22/ameba.log 2>&1

これでなうもついーとも同じDBに入ったので一安心です。あんまりなうつかってませんが。

といったことをやっていました。