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(); } }
- CONSUMER_KEY/CONSUMER_SECRET
「xAuthを使うための手続き - なか日記」で登録した際に発行されるコンシューマキーとコンシューマシークレットに書き換えます。
認証に失敗ていても、Twitterオブジェクトは作成されるのでその後にgetOAuthAccessToken()やら、getId()してTwitterExceptionが発生すれば認証失敗ってことにしてます。
本来なら、TwitterExceptionの中にHTTPステータスに関する情報も含まれてた気がするので、その辺ちゃんと解析するべきなのかなぁ。
というわけで、以上。