Yahoo! JAPAN ブックマークからブックマーク数を取得する

Yahoo! JAPAN は Yahoo!ブックマークに関する明確な API を公開していない.
一方,以下のサイトにヒントが示されていたから,これを実装した.
http://blog.katsuma.tv/2008/03/yahoo_bookmark_api.html

// Yahoo! JAPAN は明確な API を公開していない.
// 一方,以下のサイトにヒントが示されており,これを実装する.
// http://blog.katsuma.tv/2008/03/yahoo_bookmark_api.html
//
// [改訂履歴]
// 16-Sep-2009 : とりあえず動くバージョンを作った.しかし,仕事の割に重たいコード.
//
// [環境] Xerces 1.4.4 を利用

import org.apache.xerces.parsers.DOMParser;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Attr;
import org.apache.xerces.dom.DeepNodeListImpl;
import java.io.*;
import java.net.*;
import java.util.*;

public class YahooBookmarkCount {

    int count;	//ブックマーク数

    public YahooBookmarkCount(){
	; // NOP
    }

    public int getCount(String query){

	// query を URLエンコードする
	String encodedQuery = "";
	try {
	    encodedQuery = URLEncoder.encode(query, "UTF-8");
	} catch(UnsupportedEncodingException e){
	    System.err.println("UnsupportedEncodingException : " + e);
	    return -1;
	}

	// GETリクエストの URL を生成
	String requestURL;
	requestURL = "http://num.bookmarks.yahoo.co.jp/yjnostb.php";
	requestURL = requestURL + "?urls=" + encodedQuery;

	try{
	    // DOMパーサーインスタンスを生成
	    DOMParser parser = new DOMParser();

	    //System.out.println(requestURL);	//デバッグ用

	    // 引数でXMLファイルまたは URL を指定し、Parseメソッドで
	    // 妥当性を検証
	    parser.parse(requestURL);
		
	    // getDocumentメソッドでドキュメントオブジェクトを生成
	    Document xdoc = (Document)parser.getDocument();

	    // ルート・エレメント(ルートノード)の取得
	    Element root = xdoc.getDocumentElement();
	    
	    // ブックマーク数を取得
	    NodeList nl;
	    nl = root.getElementsByTagName("SAVE_COUNT");
	    Element e = (Element)nl.item(0);
	    
	    if(e.hasAttribute("ct") == true){
		String s = e.getAttribute("ct");
		count = Integer.parseInt(s);
	    } else {
		System.err.println("Hmm, wrong XML document");
		System.exit(1);
	    }

	    // パーサのリセット
	    parser.reset();

	} catch(Exception e){
	    System.err.println(e + ":例外発生");
	    return -1;
	}

	return count;
    }

    // 動作確認用の main メソッド
    public static void main(String[] args){
	String query = "http://www.yahoo.co.jp/";

	YahooBookmarkCount yb = new YahooBookmarkCount();

	int ret = yb.getCount(query);

	System.out.println("Number of Bookmarks : " + ret);
    }
}