2010年6月末でTwitterのBASIC認証が使えなくなるので、今後は OAuth に乗り換える必要がある。

動作確認環境

* Windows XP SP3
* JDK 1.6
* Twitter4J version 2.1.1

手順1

http://twitter.com/oauth_clients/new にて、
Twitterアプリケーションを登録し、
Consumer key と Consumer secret をメモしておく。

手順2

以下の TwitterOAuthAccessTokenGetter クラスを利用して、
認可キー(TokenとTokenSecret)を取得する。


import java.io.*;
import twitter4j.*;
import twitter4j.http.*;
 
public class TwitterOAuthAccessTokenGetter {
  
  public static void main(String[] args) throws Exception {
    
    // http://twitter.com/oauth_clients/new にてアプリケーションを登録した際の
    // Consumer key と Consumer secret を使用
    String consumerKey = ""; // Consumer key をセット
    String consumerSecret = ""; // Consumer secret をセット
    
    // 認証用URLを取得
    TwitterFactory factory = new TwitterFactory();
    Twitter twitter = factory.getOAuthAuthorizedInstance(consumerKey, consumerSecret);
    RequestToken requestToken = twitter.getOAuthRequestToken();
    String authorizationURL = requestToken.getAuthorizationURL();
    
    System.out.println(authorizationURL + " にウェブブラウザでアクセスして認証を許可してください。");
    System.out.println("認証を許可したらウェブブラウザにPINコードが表示されます。");
    System.out.println("PINコードを入力して[Enter]キーを押してください。");
    
    // 入力待ち
    BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
    String pin = r.readLine();
    
    // AccessTokenオブジェクトを生成 
    AccessToken accessToken;
    if(pin.length() > 0){
      accessToken = twitter.getOAuthAccessToken(requestToken, pin);
    }else{
      accessToken = twitter.getOAuthAccessToken();
    }
 
    // 認証情報を表示
    int userId = twitter.verifyCredentials().getId();
    String token = accessToken.getToken();
    String tokenSecret = accessToken.getTokenSecret();
    System.out.println("UserId=" + userId);
    System.out.println("Token=" + token);
    System.out.println("TokenSecret=" + tokenSecret);
  }
}

手順3

Consumer key, Consumer secret, 認可キー(TokenとTokenSecret) を使用して、
Twitter オブジェクトを生成する。

以下の TwitterOAuthSampleWithAccessToken はそのサンプルコード。


import twitter4j.*;
import twitter4j.http.*;
 
public class TwitterOAuthSampleWithAccessToken {
 
  public static void main(String[] args) throws Exception {
    
    // http://twitter.com/oauth_clients/new にてアプリケーションを登録した際の
    // Consumer key と Consumer secret を使用
    String consumerKey = ""; // Consumer key をセット
    String consumerSecret = ""; // Consumer secret をセット
    
    // TwitterOAuthAccessTokenGetter で取得した Token と TokenSecret を使用
    String token = ""; // Token をセット
    String tokenSecret = ""; // TokenSecret をセット
    
    // Twitterオブジェクトを生成
    TwitterFactory factory = new TwitterFactory();
    AccessToken accessToken = new AccessToken(token, tokenSecret);
    Twitter twitter = factory.getOAuthAuthorizedInstance(consumerKey, consumerSecret, accessToken);
 
    // ツイートを出力するサンプル
    ResponseList<Status> statusList = twitter.getUserTimeline();
    for(int i=0; i<statusList.size(); i++){
      Status s = statusList.get(i);
      String text = s.getText();
      System.out.println(text);
    }
  }
 
}

参考

OAuth 認可方式を使うとユーザーにユーザID、パスワードを提供してもらうことなくユーザのアカウントにアクセスできます。OAuth を利用するには http://twitter.com/oauth_clients/new で事前にアプリケーションを登録しておき consumer key, consumer secret を取得しておく必要があります。key と secret は Twitter#setOAuthConsumer() でセットするか、システムプロパティで VM パラメータとして以下のように指定しておきます。

-Dtwitter4j.oauth.consumerKey=[consumer key]
-Dtwitter4j.oauth.consumerSecret=[consumer secret]

Twitter4J - コード例 - 7.OAuth認可
ほぼOAuthUpdate.javaでやっていることそのままです。注意が必要なのは、4)~5)で認証ページへリダイレクトして戻ってくるまでの間、何らかの方法でRequestTokenオブジェクトを保持しておく必要があることです。RequestTokenはいわば使い捨てで、認証ページから戻ってきた後にもう一度getRequestTokenメソッドで生成してもAccessTokenは取得出来ません(冷静に考えれば当たり前ですね)。私は4)で認証ページに飛ぶ前に、WicketのSessionの仕組みを使ってRequestTokenを保存するようにしました。

Twitter4jでOAuthを試してみた – 今日の気分はバリいくつ?

tags: zlashdot Java Java OAuth Twitter Twitter4J

Posted by NI-Lab. (@nilab)