No Programming, No Life

プログラミング関連の話題や雑記

HatenaHaiku4J

HatenaHaiku4JというはてなハイクAPIのラッパーを書いてます。

Pure Javaで作っておくことでGroovyやらJRubyやらJythonやらScala?やらから利用ができてとても便利そうだなぁと思ったのが開発開始の動機です。よろしくどうぞ。
※なお、動作バージョンは JDK5.0以降です。

ダウンロード

最新版
以前のバージョン

(もっと以前のバージョンはこちら)

インストール

ダウンロードしたzipを適当なフォルダに解凍すると、以下が作成されます。

src … ソースファイル
jar … HatenaHaiku4Jライブラリ本体
doc … Javadoc
build.xml … Antコンパイル用定義ファイル
changelog.txt … 変更点など

jarの中に入っている「hatenahaiku4j-x.x.x.jar」をクラスパスの通った場所へコピーしてご利用ください。

Tips(IDについて)

はてなハイクAPIで利用されるIDには「ユーザID」と「ステータスID」の二つがあります。
はてなハイクAPI中では、場所によりユーザIDやステータスIDのことを「id」と言ってみたりしている部分があり、分かりづらかったため、HatenaHaiku4J内ではすべて「userId」「statusId」で統一しました。

ユーザID(userId)

はてなユーザのユニークなID。はてな記法(id:xxxxxx)のxxxxxx部分。

ステータスID(statusId)

一つのエントリについてのユニークなID。
たとえばこのエントリのstatusIdは「9234072049829931940」となり、このIDを指定することで、APIからそのエントリに対して操作を行うことができます。

Tips(主なクラス)

hatenahaiku4j.LoginUser

ログインユーザ情報を表現するクラスです。ユーザIDと投稿用パスワードを指定するものと、さらにクライアント名を指定するものがあります。
クライアント名を指定しなかった場合、デフォルトで"HatenaHaiku4J"となります。

// ユーザID, 投稿用パスワードを指定して作成
LoginUser loginUser = new LoginUser("fumokmm", "secretsecret");
// ユーザID, 投稿用パスワード, クライアント名(from欄)を指定して作成
LoginUser loginUser = new LoginUser("fumokmm", "secretsecret", "ClientName");

なお、投稿用パスワードについてはAPIのヘルプなどをご覧下さい。

hatenahaiku4j.HatenaHaikuAPILight

認証なしで使えるAPIラッパークラスです。投稿したりスターをつけたり、ユーザをフォローする必要がなければこちらを利用すると手軽です。

hatenahaiku4j.HatenaHaikuAPI

認証ありで使えるAPIラッパークラスです。コンストラクタにログインユーザ(LoginUser)を指定します。
このクラスはhatenahaiku4j. HatenaHaikuAPILightを継承しているため、認証なしで呼び出せるAPIはすべて呼び出すことが可能です。

hatenahaiku4j.Status

ステータス情報(エントリ情報)を表現するクラスです。タイムラインを取得した際などはこのクラスのリストが取得されます。
POJO(JavaBeans)いるので、プロパティは #getXxx() にて取得して下さい。

※v0.2.0からstatus#api(StatusAPI)にて、ステータス情報インスタンスに対して直接apiが利用できるようになりました。

hatenahaiku4j.Keyword

キーワード情報を表現するクラスです。hatenahaiku4j.HatenaHaikuAPIWithoutAuth#getHotKeywordList()などでキーワード情報を取得した際などはこのクラスのリストが取得されます。
POJO(JavaBeans)になっているので、プロパティは #getXxx() にて取得して下さい。

※v0.2.0からkeyword#api(KeywordAPI)にて、キーワード情報インスタンスに対して直接apiが利用できるようになりました。

hatenahaiku4j.User

ユーザ情報を表現するクラスです。hatenahaiku4j.HatenaHaikuAPIWithoutAuth#getFollowersList(String)などでユーザ情報を取得した際などはこのクラスのリストが取得されます。
POJO(JavaBeans)になっているので、プロパティは #getXxx() にて取得して下さい。

※v0.2.0からuser#api(UserAPI)にて、ユーザ情報インスタンスに対して直接apiが利用できるようになりました。


※その他メソッドについては、詳しくはjavadocをご覧下さい。

使用例

パブリックタイムラインを取得し、「ユーザ名/発言内容」の形式で標準出力に表示
HatenaHaikuAPILight apiLight = new HatenaHaikuAPILight();
// パブリックタイムラインを取得
List<Status> publicTimeline = apiLight.getPublicTimeline();
for (Status status : publicTimeline) {
    System.out.println(status.getUserId() + "/" + status.getText());
}
"Hello, HatenaHaiku4J" とidページに投稿する
HatenaHaikuAPI apiAuth = new HatenaHaikuAPI(new LoginUser("fumokmm", "secretsecret"));
// パブリックタイムラインを取得
Status entryResult = apiAuth.entry("Hello, HatenaHaiku4J");
System.out.println("投稿結果");
System.out.println(entryResult.getUserId() + "/" + entryResult.getText());
Keywordを取得してきて、そのキーワードに投稿する (v0.2.1以降)
HatenaHaikuAPI apiAuth = new HatenaHaikuAPI(new LoginUser("fumokmm", "secretsecret"));
// キーワードを取得
Keyword hitorigoto = apiAuth.getKeyword("ひとりごと");
hitorigoto.api.entry("ひとりごとに投稿!");
ローカルにある画像をfotolifeにアップしつつ投稿する (v1.0.0以降)
HatenaHaikuAPI apiAuth = new HatenaHaikuAPI(new LoginUser("fumokmm", "secretsecret"));
String text = "ローカル画像アップテスト(jpg)";
File file = new File("c:/temp/test.jpg");
Status result = apiAuth.entry(text, file);

※エラー処理は省いています。

TODO

  • ASIN記法の取得形式がAPI版とHTML版で異なる。
  • [URL:title=〜〜]記法の取得形式がAPI版とHTML版で異なる。API版ではURLが取得されるが、HTML版ではリンク文字列が取得される。
  • タイムライン系取得補助コンパニオンクラスを追加(v1.3.0)
  • HaikuQLの実装(v1.4.0)
  • 引用スター機能。スター情報。(v1.5.0?)
  • 現状の動きでは存在しない(まだない or 削除されちゃった)ステータスを取得しようとしたり、replyしようとするとHatenaHaikuExceptionにラップされたIOExceptionがthrowされるけど、なんだかこの挙動が嫌。
  • GAE/Jで使うと「警告: Cookie rejected:…」が出る。
  • HatenaHaikuHTML(HTMLスクレイピング)(v1.2.0)
  • はてなユーザ名取得機能。 (v1.1.0?) →v1.0.3で対応した。
  • GAEで使うとSAXExceptionが発生するため今のところ使えない。 →単なる私の勘違い。エンコーディングの指定がまずかっただけでした。
  • Fileを指定して画像をフォトライフにアップしつつ投稿するAPIを使えるように出来るようにする。(v1.0.0で対応予定)
  • ソート順(人気順)の実装。?sort=hot でも ?mode=hot でもどちらでも動くようだ。 (v1.1.0で対応予定) →v1.0.0で対応した。

その他

※フィードバックをお待ちしております。コメント欄かはてブコメント欄などにお願いします。
※ちなみに名前はTwitter4Jにインスパイアされました。
※最新版ソースはCodeReposにあります。

*1:2010-05-27追記