プログラマとプロマネのあいだ

プログラマもやるし、プロマネもやるし、たまに似非アーキとか営業っぽいこともやる

はてなダイアリから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って感じですねえ。なんかようやく波の端っこに乗れたような気も。
まあ、相変わらず「別に自分で新たに何かを作り出すわけではない。」のですが。


一括インポートでとりあえずスタートはしたけど、今後どうやってメンテナンスしていくのかが課題だな。まあ、定期的に一括インポートしてもいいけど。