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

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

はてなダイアリからISBNとASINを抜き出してStack Stock Booksへインポート

バグと仕様の不備がありました。
バグは、ISBNを単なる数値として正規表現で引っ掛けていたのですが、
http://ja.wikipedia.org/wiki/ISBN
によると、チェックディジットはXもありうるということ。
なので、正規表現を調整しました。


あと、仕様の不備ってのは、Stack Stock Booksには、読書タイムラインっていう機能があって、いつどの本を読んだかみたいなのを時系列に並べてくれるのですが、昨日一律2008-06-02で登録してしまったものだから、イマイチーな感じになってしまいました。
ので、とりあえずISBNと日付をセットにして取得するように変更しました。


ソースはこんな感じ。
はてなダイアリーエクスポートファイルから、日付とISBNのセットを取得

open('taka_2.xml') { |f|

	currentDate = ""
	f.each_line{ |line|
		if /<day date=\"(\d\d\d\d-\d\d-\d\d)\"/ =~ line
			currentDate = Regexp.last_match(1)
		end

		if /ISBN:(\d{9}[\dX]):.*/ =~ line || /\[asin:(\d{9}[\dX]):.*\]/ =~ line
			print currentDate, ",", Regexp.last_match(1) + "\n"
		end
	}
}

○日付とISBNのセットを記述したファイルから、Stack Stock Books WebAPIを使って本を登録

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)
		{
			int commaIndex = buff.indexOf(",");
			String date = buff.substring(0, commaIndex);
			String asin = buff.substring(commaIndex + 1, buff.length());

			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: \"" + asin + "\",");
			writer.print("    date: \"" + date + "\",");
			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();
	}
}

よくみたら、Rubyでのやり方がヘルプに載ってました。
POSTできないなんて、そんな不便なことはないですもんね。


どうでもいいが、再登録しても日付は上書きされない仕様らしい。これはちょっとイマイチだなー。
チェックディジットXのやつだけ正しい日付になってしまった。。
全部消してやり直せばいいのでしょうけど、消すのは1件1件やらないとダメらしい。これもちょっとイマイチだなー。
削除API作ってくれればなんとかなるかも。


この辺なんとかなりませんかね?>Stack Stock Booksの管理人の方。
って、こんなブログ読んでるわけもないか。。