辻村浩『 Twitter API プログラミング』(ワークスコーポレーション, 2010)を読みました。形式について言うと、ソースコードが頻繁に折り返していて読みにくい(というかほとんど読めない)のがちょっと残念でした。内容について言うと、OAuth認証を利用する方法をもう少し具体的に書いた方がいいんじゃないかと思いました。OAuth認証は最初の関門なので、すべてのメジャーなプログラミング言語について、具体的な実装を載せておいてくれるととても便利だったはずです。
というわけで、OAuth認証を利用するクライアントの作り方を書いておきましょう。
まず、http://dev.twitter.com/appsでアプリケーションを登録し、Concumer keyとConsumer secretを取得します。登録とは言っても、この時点ではアプリケーションの実体はなくてもかまいません。
アプリケーションを利用するユーザごとに、以下の作業を行います。
- アプリケーションが認証用のURLを生成し、ユーザに提示する
- ユーザは、提示されたURLにアクセスする
- (ユーザは)そこで取得するPINをアプリケーションに送信(あるいは入力)する
- PINを受け取ったアプリケーションは、それを使ってAccess tokenとToken secretを作成し、記録する
1と3、4は自動化できますが(3にはコールバックを使う)、手動で行う場合は次のようになります(Commons Codecのcommons-codec-バージョン番号.jarとoauth-signpostのsignpost-core-バージョン番号.jarを利用可能にしておく必要があります)。
import java.io.*;
import oauth.signpost.*;
import oauth.signpost.basic.*;
public class TokenCreator {
public static void main(String[] args) throws Exception {
OAuthConsumer consumer = new DefaultOAuthConsumer(
"***** Concumer key *****",
"***** Consumer secret *****");
OAuthProvider provider = new DefaultOAuthProvider(
"http://twitter.com/oauth/request_token",
"http://twitter.com/oauth/access_token",
"http://twitter.com/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());
}
}
以上で準備は完了です。つぎのようなコードでつぶやけます。
import java.io.*;
import java.net.*;
import javax.xml.xpath.*;
import org.w3c.dom.Node;
import org.xml.sax.InputSource;
import oauth.signpost.*;
import oauth.signpost.basic.*;
public class StatusUpdate {
public static void main(String[] args) throws Exception {
// これはユーザによらない
OAuthConsumer consumer = new DefaultOAuthConsumer(
"***** Concumer key *****",
"***** Consumer secret *****");
// これはユーザごとに異なる
consumer.setTokenWithSecret(
"***** Access token *****",
"***** Token secret *****");
// HTTPリクエスト
URL url = new URL("http://api.twitter.com/1/statuses/update.xml?status="
+ URLEncoder.encode("こんにちは", "UTF-8"));
HttpURLConnection request = (HttpURLConnection) url.openConnection();
request.setRequestMethod("POST"); // HTTPメソッドはPOST
consumer.sign(request); // リクエストに署名
// レスポンスコード
System.out.println(request.getResponseCode() + " " + request.getResponseMessage());
// 成功ならレスポンスボディをそのまま表示する
if (request.getResponseCode() == HttpURLConnection.HTTP_OK) {
BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream()));
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}
// 失敗ならエラーメッセージだけを表示する
else {
InputSource is = new InputSource(new BufferedReader(new InputStreamReader(request
.getErrorStream())));
XPath xpath = XPathFactory.newInstance().newXPath();
Node error = (Node) xpath.evaluate("//error", is, XPathConstants.NODE);
System.out.println(error.getTextContent());
}
}
}
Related posts:

JavaでOAuthを使え!
Twitterの普及とともに、サード・パーティのウェブサイトやアプリケーションから、Twitterに…