より簡単な方法:scribe-java版
はてなブックマークAtomAPIの使い方を紹介します。2010年末にOAuthをサポートしたので、ここでもそれを試します。言語はJava、ライブラリはoauth-signpostを使います。
アプリケーションの登録
アプリケーション登録ページでアプリケーションを登録し、Consumer keyとConsumer secretを取得します。
ライブラリの準備
signpost-core-バージョン番号.jar とcommons-codec-バージョン番号.jarを使えるようにします(このあたりの詳細については、拙著『Webアプリケーション』などを参照してください)。
Access tokenとToken secretの取得
OAuthでユーザの権利を譲り受けるためのAccess tokenとToken secretを取得します。ここで紹介するコンソール上で行う方法の他に、ブラウザ上でリダイレクトを使う方法もありますが、両者の違いはTwitterの場合などと同じなので、Twitterでの方法を見れば、リダイレクトを使う方法も実現できるでしょう。
先に取得したConsumer keyとConsumer secretを下のコードに埋め込んでください。
import java.io.*;
import oauth.signpost.*;
import oauth.signpost.basic.*;
public class HatenaTokenCreator {
public static void main(String[] args) throws Exception {
// プロキシサーバの設定
//System.setProperty("http.proxyHost", "proxy.example.net");
//System.setProperty("http.proxyPort", "3128");
//System.setProperty("https.proxyHost", "proxy.example.net");
//System.setProperty("https.proxyPort", "3128");
OAuthConsumer consumer = new DefaultOAuthConsumer(
***** Consumer key *****,
***** Consumer secret *****);
String scope = "?scope=read_public,write_public,read_private,write_private";
OAuthProvider provider = new DefaultOAuthProvider(
"https://www.hatena.com/oauth/initiate" + scope,
"https://www.hatena.com/oauth/token",
"https://www.hatena.ne.jp/oauth/authorize");
String authUrl = provider.retrieveRequestToken(consumer, OAuth.OUT_OF_BAND);
System.out.println("このURLにアクセスし、表示されるPINを入力してください。");
System.out.println(authUrl);
System.out.print("PIN:");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String pin = br.readLine();
provider.retrieveAccessToken(consumer, pin);
System.out.println("Access token: " + consumer.getToken());
System.out.println("Token secret: " + consumer.getTokenSecret());
}
}
TwitterのOAuthと違うのは、どのような権利を求めるかを「score=...」という形で書いておくところです。上のコード実行するとURLが表示されるので、そのURLにブラウザでアクセスしてください。下のようなページが表示されます。scoreの記述によって内容は変わります。この例では、公開・非公開の両方の情報への読み書き権限を要求しています。

「許可」をクリックすると下のようなページが表示されるので、表示された文字列を先のコードからのプロンプトで入力してください。Access tokenとToken secretが得られます。

ブックマーク
譲り受けた権利を使って「http://b.hatena.ne.jp/atom/post」にURLをPOSTすれば、そのURLをはてなブックマークに登録できます。例として「http://www.google.com/」を登録するコードは次のようになります。先に取得したConsumer keyとConsumer secret、Access token、Token secretを埋め込んで実行してください。
import java.io.*;
import java.net.*;
import oauth.signpost.*;
import oauth.signpost.basic.*;
public class SignpostBookmark {
public static void main(String[] args) throws Exception {
// プロキシサーバの設定
//System.setProperty("http.proxyHost", "proxy.example.net");
//System.setProperty("http.proxyPort", "3128");
// これはユーザによらない
OAuthConsumer consumer = new DefaultOAuthConsumer(
***** Consumer key *****,
***** Consumer secret *****);
// これはユーザごとに異なる
consumer.setTokenWithSecret(
***** Access token *****,
***** Token secret *****);
// ターゲット
String target = "http://www.google.com/";
String xml = String.format("<entry xmlns='http://purl.org/atom/ns#'>"
+ "<title>dummy</title>"
+ "<link rel='related' type='text/html' href='%s' />"
+ "<summary type='text/plain'></summary>"
+ "</entry>",
target);
// HTTPリクエスト
URL url = new URL("http://b.hatena.ne.jp/atom/post");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.addRequestProperty("Content-Type", "application/octed-stream");
consumer.sign(connection);
// POSTによる送信
connection.setDoOutput(true);
OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream());
writer.write(xml);
writer.flush();
writer.close();
// 結果の表示
System.out.printf("%s %s\n", connection.getResponseCode(), connection.getResponseMessage());
BufferedReader br = new BufferedReader(new InputStreamReader(
connection.getResponseCode() / 100 == 2
? connection.getInputStream()
: connection.getErrorStream(),
"UTF-8"));
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}
}
Twitterの場合との違うのは、リクエストボディにXMLを書かなければならないこと、それを送信するためにContent-Typeをapplication/octed-streamにしておくことです。
ブックマークの編集
scribe-java版で紹介した方法と同様です(手抜き)。
補足
アプリケーションに与えた許可を取り消したいときは、「Myはてな」→「ユーザ設定」→「外部アプリケーション認証」→「外部のアプリケーションから、はてなのサービスを利用する」の順にクリックしてください。「https://www.hatena.ne.jp/はてなID/config/auth/provider」にアクセスしてもいいでしょう。
ステファン・エセル『怒れ!憤れ! 』(日経BP, 2011)




