2014年2月9日日曜日

[Android] twitter4jのgetOAuthRequestTokenでTwitterExceptionエラー

Androidアプリでtwitter4jを使いtwitterにログインしていたが、2014年1月から突然投稿できなくなった。
エラー内容を追って見ると、getOAuthRequestTokenでTwitterExceotionが発生。
エラーの内容は以下
403:The request is understood, but it has been refused. An accompanying error message will explain why. This code is used when requests are being denied due to update limits (https://support.twitter.com/articles/15364-about-twitter-limits-update-api-dm-and-following).
エラー内容に記載してあるサイト(https://support.twitter.com/articles/15364-about-twitter-limits-update-api-dm-and-following)にアクセスするもtwitterのリミット制限に引っかかったようなエラー内容。
調査をしているとhttpsモードじゃないとエラーとなるような制限が加わったとかいう情報を海外で発見。
twitter4jでどうやってSSLにするのかよく分からなかったが、ConfigurationBuilderオプションでSSLモードが指定できることを発見。試してみたところうまく動いた。

修正前[ツイッターログイン部分]
ConfigurationBuilder cbuilder = new ConfigurationBuilder();
cbuilder.setOAuthConsumerKey(StringUtil.TWEET_CONSUMER_KEY);
cbuilder.setOAuthConsumerSecret(StringUtil.TWEET_CONSUMER_SECRET);
Configuration conf = cbuilder.build();
mOauth = new OAuthAuthorization(conf);
mOauth.setOAuthAccessToken(null);
String authUrl = null;
try {
authUrl = mOauth.getOAuthRequestToken(StringUtil.TWEET_CALLBACK_URL).getAuthorizationURL();
} catch (Exception e) {
Logging.e(e.toString());
return;
}

修正後
ConfigurationBuilder cbuilder = new ConfigurationBuilder();
cbuilder.setUseSSL(true);//2014年よりこれが無いとエラーとなる仕様に変わった。
cbuilder.setOAuthConsumerKey(StringUtil.TWEET_CONSUMER_KEY);
cbuilder.setOAuthConsumerSecret(StringUtil.TWEET_CONSUMER_SECRET);
Configuration conf = cbuilder.build();
mOauth = new OAuthAuthorization(conf);
mOauth.setOAuthAccessToken(null); // これをやらないと下記getOAuthRequestToken()で例外が発生する
String authUrl = null;
try {
authUrl = mOauth.getOAuthRequestToken(StringUtil.TWEET_CALLBACK_URL).getAuthorizationURL();
} catch (Exception e) {
Logging.e(e.toString());
return;
}


同じく投稿時にも同様のエラーが出ていたため修正!

修正前
//メッセージを投稿
ConfigurationBuilder confbuilder = new ConfigurationBuilder();
confbuilder.setOAuthAccessToken(oauthToken).setOAuthAccessTokenSecret(oauthTokenSecret)
.setOAuthConsumerKey(StringUtil.TWEET_CONSUMER_KEY).setOAuthConsumerSecret(StringUtil.TWEET_CONSUMER_SECRET);
//メッセージの取得
Twitter twitter = new TwitterFactory(confbuilder.build()).getInstance();

修正後
//メッセージを投稿
ConfigurationBuilder confbuilder = new ConfigurationBuilder();
confbuilder.setOAuthAccessToken(oauthToken).setOAuthAccessTokenSecret(oauthTokenSecret)
.setOAuthConsumerKey(StringUtil.TWEET_CONSUMER_KEY).setOAuthConsumerSecret(StringUtil.TWEET_CONSUMER_SECRET);
confbuilder.setUseSSL(true);//2014年よりこれが無いとエラーとなる仕様に変わった。
//メッセージの取得
Twitter twitter = new TwitterFactory(confbuilder.build()).getInstance();

上記で無事にエラー無く動作することを確認。