なか日記

一度きりの人生、楽しく生きよう。

Twitter4JでxAuthを使ってログインするサンプル(自家用)

xAuthを使うための手続き - なか日記でxAuthを使うための準備が出来たら、後はプログラムを書くだけですね。というわけで、JavaでTwitter4Jを使ったサンプルを晒します。サンプルはxAuthを使ったログインの部分のみです。ログインしたら、後は今まで通りですしおすし。
俺々クラスなので、変なこと書いてたら、遠慮なくツッコミお願いしますw

テストコード

コメントは実際にアプリ作る時にここでこんなことするよねー的なメモです。

import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.junit.Assert.assertThat;
import junit.framework.Assert;

import org.junit.Test;

import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.http.AccessToken;

public class TwitterUtilTest {
    // 不正な値
    private static final String invalid_userId = "xxxx";
    private static final String invalid_password = "xxxx";
    private static final String invalid_token = "xxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
    private static final String invalid_token_secret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

    // 正しい値
    private static final String valid_userId = "userid";
    private static final String valid_password = "password";
    private static final String valid_token = "wwwwwwwww-wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww";
    private static final String valid_token_secret = "wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww";

    @Test
    public void 初回ログイン失敗() throws TwitterException {
        // 何らかの方法でユーザIDとパスワードを入力してもらう

        Twitter twitter = TwitterUtil.getInstance(invalid_userId, invalid_password);

        assertThat(twitter, nullValue());
    }

    @Test
    public void 初回ログイン成功() throws TwitterException {
        // 何らかの方法でユーザIDとパスワードを入力してもらう

        Twitter twitter = TwitterUtil.getInstance(valid_userId, valid_password);

        AccessToken accessToken = twitter.getOAuthAccessToken();

        System.out.println(accessToken.getToken());
        System.out.println(accessToken.getTokenSecret());

        assertThat(accessToken.getToken(), is(valid_token));
        assertThat(accessToken.getTokenSecret(), is(valid_token_secret));

        // ここで、トークンとトークンシークレットを保存しておく
    }

    @Test
    public void 二回目以降ログイン失敗() throws TwitterException {
        // 初回ログイン時に保存したトークンとトークンシークレットを読み込んでおく

        Twitter twitter = TwitterUtil.getOAuthAuthorizedInstance(invalid_token, invalid_token_secret);

        assertThat(twitter, nullValue());
    }

    @Test
    public void 二回目以降ログイン成功() throws TwitterException {
        // 初回ログイン時に保存したトークンとトークンシークレットを読み込んでおく

        Twitter twitter = TwitterUtil.getOAuthAuthorizedInstance(valid_token, valid_token_secret);

        Assert.assertNotNull(twitter);
        assertThat(twitter.getId(), is(not(0)));
    }
}
  • valid_userId/valid_password
    実行する際にはTwitterにログインできるアカウント情報を設定しておきます。
  • valid_token/valid_token_secre
    初回ログインが成功した際に発行されるトークンとトークンシークレットになります。「初回ログイン成功」テストでコンソールに表示される値で書き換えて下さい。

実装コード

Twitterオブジェクトを返してくれるユーティリティ的にラッピングしてみました。

import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.conf.Configuration;
import twitter4j.conf.ConfigurationBuilder;
import twitter4j.http.AccessToken;

public class TwitterUtil {
    private static final String CONSUMER_KEY = "zzzzzzzzzzzzzzzzzzzzzz";
    private static final String CONSUMER_SECRET = "qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq";

    /***
     * ユーザIDとパスワードで認証する。
     * 
     * @param userId
     *            ユーザID
     * @param password
     *            パスワード
     * @return Twitterクラスのインスタンス<BR>
     *         認証に失敗した場合はnull
     */
    public static Twitter getInstance(String userId, String password) {
        Configuration conf = getConfiguration();

        TwitterFactory twitterfactory = new TwitterFactory(conf);
        Twitter twitter = twitterfactory.getInstance(userId, password);

        try {
            twitter.getOAuthAccessToken();
        } catch (TwitterException e) {
            return null;
        }

        return twitter;
    }

    /***
     * アクセストークンを使って認証する
     *
     * @param accessToken
     *            アクセストークン
     * @return Twitterクラスのインスタンス<BR>
     *         認証に失敗した場合はnull
     */
    public synchronized static Twitter getOAuthAuthorizedInstance(String token, String token_secret) {
        Configuration conf = getConfiguration();
        TwitterFactory twitterfactory = new TwitterFactory(conf);
        Twitter twitter = twitterfactory.getOAuthAuthorizedInstance(new AccessToken(token, token_secret));

        try {
            twitter.getId();
        } catch (TwitterException e) {
            return null;
        }

        return twitter;
    }

    /***
     * Configurationを生成する
     * 
     * @return
     */
    private static Configuration getConfiguration() {
        ConfigurationBuilder confbuilder = new ConfigurationBuilder();
        confbuilder.setOAuthConsumerKey(CONSUMER_KEY);
        confbuilder.setOAuthConsumerSecret(CONSUMER_SECRET);
        return confbuilder.build();
    }
}

認証に失敗ていても、Twitterオブジェクトは作成されるのでその後にgetOAuthAccessToken()やら、getId()してTwitterExceptionが発生すれば認証失敗ってことにしてます。
本来なら、TwitterExceptionの中にHTTPステータスに関する情報も含まれてた気がするので、その辺ちゃんと解析するべきなのかなぁ。


というわけで、以上。