「
TwitterでOAuth認証。前編:デベロッパーページでアプリケーションを登録する。」の続き。
Twitter APIへのライブラリとして、
Twitter4Jを使わせていただいた。まずは、Twitter4Jの環境を設定する。
3.Twitter4Jの環境設定
Twitter4J - A Java library for the Twitter API
2011年2月14日段階で最新のバイナリは2.1.11。圧縮ファイルをダウンロードして展開する。展開後、libフォルダ内にある以下2つのjarを、Webアプリケーションのライブラリパスに設定する。
- twitter4j-core-2.1.11.jar
- twitter4j-media-support-2.1.11.jar
Twitter4Jでは設定ファイルを作成することが出来る。クラスパスが通っている場所へ、Twitter4Jの設定ファイル「
twitter4j.properties」を作成。中身には、Twitterへのアプリケーション登録後に発行された、
- Consumer key
- Consumer secret
を設定する(
※)。
※ twitter4j.propertiesには、TwitpicのAPI Keyも設定可能なようだが、自分の場合は、設定しても有効にならなかった(・・;。
4.TwitterでOAuth認証
はじめに、TwitterのOAuth認証の流れを軽くおさえておくとよい。以下のTwitterのページでは、比較的分かりやすくOAuth認証の流れが説明されている。オススメ。
Overview of "Sign in with Twitter" | dev.twitter.com
4.1 Authentication URLへリダイレクト
OAuth認証の第一段階。
<ポイント>
1. 認証リクエスト時には毎回ユニークな
Request Tokenを作成し、TwitterのAuthentication URLへ認証のリクエストを発行する。
以下、サンプルコード。
StringBuffer callbackURL = request.getRequestURL();
int index = callbackURL.lastIndexOf("/");
callbackURL.replace(index, callbackURL.length(), "").append("/twitterCallback.jsp");
twitter4j.Twitter twitter = new twitter4j.TwitterFactory().getInstance();
twitter4j.http.RequestToken requestToken = twitter.getOAuthRequestToken(callbackURL.toString());
request.getSession().setAttribute("twitter", twitter);
request.getSession().setAttribute("requestToken", requestToken);
response.sendRedirect(requestToken.getAuthenticationURL());
ここから先はTwitter側の処理となる。
4.2 ユーザーによるログイン&接続許可
ユーザーがログインしていなければ、まずはログインが要求される。
続いて、自分のアプリケーションからTwitterアカウントへ、ユーザーが初めて接続する場合は、接続を許可するかどうか確認する画面が表示される。ユーザーが「許可する」をクリックすると、Callback URLとして指定したページへ、Twitter側からレスポンスが返ってくる。
ログインをキャンセルしたり、アプリケーションの接続を拒否したら、アクセスを許否したメッセージがユーザーへ表示される。
4.3 Callback処理
TwitterからCallback URLへレスポンスが返ってくる時には、「
oauth_verifier」というパラメーターが含まれている。このVerifierをTwitterオブジェクトに与えて、認証情報を設定する。
<ポイント>
1. Authentication URLへ渡した
Request TokenとVerifierを引数に、twitter4j.TwitterクラスのgetOAuthAccessTokenメソッドを実行する。
2.
Request Tokenは今後必要なくなるので、削除する。
以下、サンプルコード。
twitter4j.Twitter twitter = (twitter4j.Twitter) session.getAttribute("twitter");
twitter4j.http.RequestToken requestToken = (twitter4j.http.RequestToken) session.getAttribute("requestToken");
String verifier = request.getParameter("oauth_verifier");
if(verifier == null){
//エラー処理
}else{
twitter.getOAuthAccessToken(requestToken, verifier);
session.removeAttribute("requestToken");
response.sendRedirect(request.getContextPath()+ "/twitter.jsp");
}
4.4 Twitpicへ画像をアップロード
いよいよTwitpicへ画像をアップロードする。
なお、Twitterユーザーが、Twitpicを連携アプリとして許可する必要はない。
また、画像のバイト数によってはアップロードに時間がかかる場合があるため、アップロード処理は非同期処理で実装したほうがいい。
<ポイント>
1.
Access Token及びAccess Token Secretをコンフィグへ含める。
2. 画像のアップロードサイトとしてTwitpicを指定し、Twitpicの
API Keyをコンフィグへ含める。
以下、サンプルコード。
twitter4j.Twitter twitter = (twitter4j.Twitter) session.getAttribute("twitter");
twitter4j.http.AccessToken accessToken = null;
try{
accessToken = twitter.getOAuthAccessToken();
twitter4j.conf.ConfigurationBuilder cb = new twitter4j.conf.ConfigurationBuilder();
cb.setOAuthAccessToken(accessToken.getToken());
cb.setOAuthAccessTokenSecret(accessToken.getTokenSecret());
cb.setMediaProvider("TWITPIC");
cb.setMediaProviderAPIKey("TwitpicのAPI Key");
twitter4j.conf.Configuration conf = cb.build();
twitter4j.media.ImageUpload upload = new twitter4j.media.ImageUploaderFactory(conf).getInstance();
url = upload.upload(画像のjava.io.Fileオブジェクト);
}catch(twitter4j.TwitterException te){
//エラー処理
}
アップロードに成功すれば、uploadメソッドの戻り値として、画像のURLが返ってくる。
さらに、ユーザーが画像URLを含んだツイートを出来るようにするには、ツイート文字列を引数にして、twitter4j.TwitterクラスのupdateStatusメソッドを実行すればよい。
twitter4j.Twitter twitter = (twitter4j.Twitter) session.getAttribute("twitter");
twitter4j.Status status = twitter.updateStatus(text);