umjammer です、
今月末で Twitter API は BASIC 認証を廃止して OAuth オンリーに移行するみたいですね。以前ソーシャルアプリ関連で OAuth を調べていたときに Twitter も試していたのでその時の成果物を公開します。ずいぶん前のことなので忘れていました。危うく旬を逃すところでした。
では、順を追って OAuth を使用した Twitter デスクトップクライアントの作り方を説明します。
Twitter クライアント用のコンシューマーキー、シークレットの取得
今回使用したその他のコードとライブラリ
- この URL で Twitter クライアントアプリ申請を行う
- 今回はデスクトップアプリなのでブラウザではない方のチェックボックスをチェックしておく
- 設定を保存すると画面が変わり、コンシューマーキー、シークレットを取得できる
- 同時にアクセストークンリクエストや認可画面URLも取得
TwitterOAuthProvider.java
で使用しています。
Twitter クライアント用のアクセストークン、シークレットの取得
さきほど取得したコンシューマーキー、シークレットを使用してアクセストークンとシークレットを取得します。Twitter の OAuth のアクセストークンとシークレットは期限が設けられていないみたいですので一回取得すれば今のところずっと使用可能です。
流れとしては、
- コンシューマーキー、シークレットを引数にして認可画面をリクエスト
- 認可画面のURLが帰ってくる
- URLの画面をブラウザ上で表示し認可を行なう
- ブラウザ画面上にベリファイアが表示される
- ベリファイアを引数にアクセストークン、シークレットをリクエスト
- アクセストークン、シークレットを取得
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() + "].");
結果です、クライアント名が今回作成したアプリケーション名になっているでしょう?
今回使用したその他のコードとライブラリ
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.*