2011年2月14日月曜日

TwitterでOAuth認証。後編:OAuth認証を経由してTwitpicへ画像をアップロードする。

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);