はてなダイアリからISBNとASINを抜き出してStack Stock Booksへインポート
はてなダイアリで本などを紹介するのはいいのですが、やっぱりどこかで蔵書管理(というか既読管理)みたいなものもしたくなってて、二度手間だなあとか思ってました。
とりあえず、ISBNとかを指定すると本を登録できるWebAPIを公開している蔵書管理サービスってないかな?と思って探してみたら、あったよ、ありましたよ。
Stack Stock Books(スタック・ストック・ブックス): http://stack.nayutaya.jp/
APIだけじゃなくて、もちろんスタンダードなWebフォーム(最大50件まで一括登録可能)、ブックマークレットにも対応しています。
エントリが大変なWebシステムの弱点を補って余りある設計ですね。かなり良いです。
ちなみにこのStack Stock Books(以下ssb)は、はてなのOpenIDにも対応していて、はてなのアカウントを持っていれば、そのIDとパスワードでログインできます。素晴らしい!
さて、表題のダイアリからの抜き出し、および、このssbへインポートですが、ssbAPIのリファレンスによると、本の登録には以下の情報が必要ってことになってます。
- ISBN
- 読書状態設定日
- 読書状態
- 公開/非公開
で、面倒なので、
- 読書状態設定日=今日("2008-06-02")
- 読書状態=もう読み終えた("read")
- 公開/非公開=公開(true)
としました。
結局、ISBNだけあれば本の登録が可能ということが分かりました。
じゃあ今度ははてなダイアリからISBNをどう抜き出すかというところに戻るわけですが、
これは普通にエクスポート機能を使いました。
管理 → データの管理 → ダウンロード(はてなの日記データ形式)
で、こいつをrubyスクリプトで1行1件のISBNリストに変換。(リダイレクトでtest.txtに出力する)
open('taka_2.xml') { |f| f.each_line{ |line| if /ISBN:(\d{10}):.*/ =~ line || /\[asin:(\d{10}):.*\]/ =~ line puts Regexp.last_match(1) end } }
完全に使い捨て風味満載です(汗
で、次にAPIで登録していくわけですが、、
ruby1.8.6のnet/httpは、requestのエンティティボディを設定できないようだったので(1.9では出来る?)、Javaで作りました。
import java.io.*; import java.net.*; public class test { public static void main(String[] args) throws Exception { BufferedReader readerF = new BufferedReader(new FileReader("test.txt")); String buff; while((buff = readerF.readLine()) != null) { URL url = new URL("http://stack.nayutaya.jp/api/[利用者ID]/[APIトークン]/stocks/update.1"); HttpURLConnection urlConn = (HttpURLConnection)url.openConnection(); urlConn.setRequestMethod("POST"); urlConn.setDoOutput(true); PrintWriter writer = new PrintWriter(new OutputStreamWriter(urlConn.getOutputStream())); writer.print("request=["); writer.print(" {"); writer.print(" asin: \"" + buff + "\","); writer.print(" date: \"2008-06-02\","); writer.print(" state: \"read\","); writer.print(" public: true"); writer.print(" }"); writer.println("]"); writer.flush(); System.out.println("ResponseCode = " + urlConn.getResponseCode()); BufferedReader reader = new BufferedReader(new InputStreamReader(urlConn.getInputStream())); String buf; while((buf = reader.readLine()) != null) { System.out.println("Res: " + buf); } reader.close(); } readerF.close(); } }
というわけで、結果がこちら。
http://stack.nayutaya.jp/user/taka_2
Web2.0って感じですねえ。なんかようやく波の端っこに乗れたような気も。
まあ、相変わらず「別に自分で新たに何かを作り出すわけではない。」のですが。
一括インポートでとりあえずスタートはしたけど、今後どうやってメンテナンスしていくのかが課題だな。まあ、定期的に一括インポートしてもいいけど。