人気エントリーの取得
それではまず,
リスト1 Bookmark.
public class Bookmark {
public String url; // ブックマーク対象のURL
public String title; // ブックマークタイトル
}
次に,
リスト2 HatenaBookmarkAPI.
public class HatenaBookmarkAPI {
public List<Bookmark> getHotEntries() {
List<Bookmark> bookmarks = new ArrayList<Bookmark>();
FeedFetcher fetcher = new HttpURLFeedFetcher();
SyndFeed feed;
try {
// 人気エントリーのRSSフィードを読み込む
feed = fetcher.retrieveFeed(new URL(
"http://b.hatena.ne.jp/hotentry?mode=rss"));
} catch (Exception e) {
return bookmarks;
}
// 各エントリーの情報を取得
for (Object e : feed.getEntries()) {
SyndEntry entry = (SyndEntry) e;
Bookmark bookmark = new Bookmark();
bookmark.url = entry.getLink();
bookmark.title = entry.getTitle();
bookmarks.add(bookmark);
}
return bookmarks;
}
}
コードを簡単にするため,
エントリーの詳細情報の取得
人気エントリーのRSSフィードは,
リスト3 BookmarkDetail.
public class BookmarkDetail {
public int bookmarkCount; // ブックマーク数
public List<String> tags; // ブックマークに付与されたタグの一覧
}
そして,
リスト4 HatenaBookmarkAPI.
public BookmarkDetail getDetail(String url) {
String encodedUrl;
try {
// URLをUTF-8でエンコードする
encodedUrl = URLEncoder.encode(url, "UTF-8");
} catch (UnsupportedEncodingException e) {
throw new InternalError();
}
// エントリー情報取得APIのURL
String apiUrl = "http://b.hatena.ne.jp/entry/json/?url=" + encodedUrl;
InputStream in = null;
String data;
try {
// URLを開き,データを読み込む
in = new URL(apiUrl).openStream();
data = IOUtils.toString(in);
} catch (Exception e) {
return null;
} finally {
IOUtils.closeQuietly(in);
}
// 戻り値が()で囲まれている場合,JSON-libで読み込めないので取り除く
if (data.startsWith("(") && data.endsWith(")")) {
data = data.substring(1, data.length() - 1);
}
// データをJSONとして読み込む
JSONObject json = JSONObject.fromObject(data);
// 詳細情報を作成
BookmarkDetail detail = new BookmarkDetail();
detail.bookmarkCount = (int) json.getLong("count");
detail.tags = new ArrayList<String>();
// bookmarks配列を読み込む
JSONArray bookmarks = json.getJSONArray("bookmarks");
for (int i = 0; i < bookmarks.size(); i++) {
JSONObject item = bookmarks.getJSONObject(i);
// tags配列を読み込む
JSONArray tags = item.getJSONArray("tags");
for (int j = 0; j < tags.size(); j++) {
detail.tags.add(tags.getString(j));
}
}
return detail;
}