umjammer です、 今月末で Twitter API は BASIC 認証を廃止して OAuth オンリーに移行するみたいですね。以前ソーシャルアプリ関連で OAuth を調べていたときに Twitter も試していたのでその時の成果物を公開します。ずいぶん前のことなので忘れていました。危うく旬を逃すところでした。 では、順を追って OAuth を使用した Twitter デスクトップクライアントの作り方を説明します。 Twitter クライアント用のコンシューマーキー、シークレットの取得
  1. この URL で Twitter クライアントアプリ申請を行う
  2. 今回はデスクトップアプリなのでブラウザではない方のチェックボックスをチェックしておく
    twi1


  3. 設定を保存すると画面が変わり、コンシューマーキー、シークレットを取得できる
  4. 同時にアクセストークンリクエストや認可画面URLも取得
    twi2


アクセストークンリクエストや認可画面URLは後述の TwitterOAuthProvider.java で使用しています。 Twitter クライアント用のアクセストークン、シークレットの取得 さきほど取得したコンシューマーキー、シークレットを使用してアクセストークンとシークレットを取得します。Twitter の OAuth のアクセストークンとシークレットは期限が設けられていないみたいですので一回取得すれば今のところずっと使用可能です。 流れとしては、
  1. コンシューマーキー、シークレットを引数にして認可画面をリクエスト
  2. 認可画面のURLが帰ってくる
    tw3


  3. URLの画面をブラウザ上で表示し認可を行なう
  4. ブラウザ画面上にベリファイアが表示される
    tw4


  5. ベリファイアを引数にアクセストークン、シークレットをリクエスト
  6. アクセストークン、シークレットを取得
な感じになります。コードにすると以下になります。

        String consumerKey = "xxxxxxxxxxxxxxxxxxxx";
        String consumerSecret = "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy";
        
        // コンシューマーを生成
        OAuthUtil oauth = new OAuthUtil(new OAuthConsumer("oob", consumerKey, consumerSecret, new TwitterOAuthProvider()));
        // リクエストトークンを取得
        oauth.doGettingRequestToken();

        // 認可のURLを取得
        System.out.println("以下のURLをブラウザで開いてください。");
        System.out.println(oauth.getAuthorizationURL());

        // アクセストークンを取得
        System.out.print("ベリファイアを入力: ");
        oauth.doGettingAccessToken(oauth.readLineFromStdin());

        // 
        System.out.println("accessToken: " + oauth.getAccessToken());
        System.out.println("tokenSecret: " + oauth.getAccessTokenSecret());

Twitter クライアントの作成 アクセストークン、シークレットを取得したところでようやくクライアント作成にかかれます。今回は便利なライブラリ twitter4j を使用しました。今まで取得したキーを引数に API を呼んでやるとサクっと投稿アプリが作れます。あとは GUI 頑張るだけです。


        String consumerKey = "xxxxxxxxxxxxxxxxxxxxx";
        String consumerSecret = "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy";

        String accessTokenString = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
        String tokenSecretString = "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb";

        TwitterFactory factory = new TwitterFactory();
        Twitter twitter = factory.getInstance();
        twitter.setOAuthConsumer(consumerKey, consumerSecret);
        AccessToken accessToken = new AccessToken(accessTokenString, tokenSecretString);
        twitter.setOAuthAccessToken(accessToken);

        Status status = twitter.updateStatus(statusString);
        System.out.println("Successfully updated the status to [" + status.getText() + "].");

結果です、クライアント名が今回作成したアプリケーション名になっているでしょう?
tw5


今回使用したその他のコードとライブラリ OAuthUtil.java
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URISyntaxException; import java.util.HashMap; import java.util.Map; import net.oauth.OAuth; import net.oauth.OAuthAccessor; import net.oauth.OAuthConsumer; import net.oauth.OAuthException; import net.oauth.OAuthMessage; import net.oauth.client.OAuthClient; import net.oauth.client.httpclient4.HttpClient4; /** * OAuthUtil. */ public class OAuthUtil { /** */ protected OAuthConsumer consumer; /** */ protected OAuthClient client; /** */ public OAuthUtil(OAuthConsumer consumer) { this.consumer = consumer; this.client = new OAuthClient(new HttpClient4()); } /** * リクエストトークンを取得する。 */ public void doGettingRequestToken() throws IOException, OAuthException, URISyntaxException { doGettingRequestToken(null); } /** * @before {@link #doGettingRequestToken(Map)} */ private OAuthAccessor requestAccessor; /** * リクエストトークンを取得する。 * * http://.../oauth/request_token */ public void doGettingRequestToken(Map
TwitterOAuthProvider.java
import net.oauth.OAuthServiceProvider; /** * TwitterOAuthProvider. */ public class TwitterOAuthProvider extends OAuthServiceProvider { public TwitterOAuthProvider() { super("http://twitter.com/oauth/request_token", "http://twitter.com/oauth/authorize", "http://twitter.com/oauth/access_token"); } }
その他のライブラリ
  • net.oauth.core/oauth-20090617
  • net.oauth.core/oauth-consumer-20090617
  • net.oauth.core/oauth-httpclient4-20090617
  • net.homeip.yusuke/twitter4j-core-2.1.*
まとめ OAuth や Twitter API にはライブラリが揃っていますので簡単に OAuth アプリが作れました。 ただ OAuth を使用したデスクトップクライアントソフトにはここに書かれているような問題があります。悪用すればクライアントなりすましも可能でしょう。 以前紹介した OpenFeint API も OAuth を使用しています。iPhone や iPad のアプリは .ipa ファイルとして iTunes ライブラリに保存されていますが、単なる .zip ファイルなので解凍して中を覗くことができます。皆さん暗号化とかされてるみたいですのでまだシークレットキーを発見したことはないのですが、リバースエンジニアリングされればもしかすると発見できるかもしれません。そうなるとハイスコア改ざんやトロフィーコンプリートなども簡単にできちゃいます。 私もいろいろ考えたのですがいい回避策が思いつきません。皆さんなにか良い知恵があればお教えください。あとは OAuth WRAP に期待ですか。 訂正 2010-06-18 一枚目の画像が説明と異なっていたので差し替えました。