「Play!」でTwitterのOAuth認証

java play!
とりあえずサンプルで書いてみました。

appフォルダ

  • controllersパッケージ

Application.java

package controllers;

import java.util.List;

import org.apache.lucene.search.ReqExclScorer;

import models.*;
import play.libs.WS.HttpResponse;
import play.mvc.*;
import play.ns.com.jhlabs.image.TwirlFilter;
import play.*;
import twitter.TwitterAuth;
import twitter4j.Status;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.http.AccessToken;
import twitter4j.http.RequestToken;

public class Application extends Controller {

	private static String CONSUMER_KEY = "あなたが設定したやつ";
	private static String CONSUMER_SECRET = "あなたが設定したやつ";
	private static String callbackURL = "http://localhost:9000/callback";

	public static void login() {
		render();
	}

	public static void oauth() {
		Twitter twitter = new TwitterFactory().getInstance();
		twitter.setOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
		RequestToken requestToken;
		try {
			requestToken = twitter.getOAuthRequestToken(callbackURL);
			session.put("requestToken", requestToken.getToken());
			session.put("requestTokenSecret", requestToken.getTokenSecret());
			redirect(requestToken.getAuthenticationURL());
		} catch (TwitterException e) {
			// can not login
			e.printStackTrace();
		}

	}

	public static void callback(String oauth_verifier) {
		String token = session.get("requestToken");
		String tokenSecret = session.get("requestTokenSecret");
		if (token != null && tokenSecret != null) {
			try {
				RequestToken requestToken = new RequestToken(token, tokenSecret);
				Twitter twitter = new TwitterFactory().getInstance();
				twitter.setOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
				twitter.getOAuthAccessToken(requestToken, oauth_verifier);
				AccessToken accessToken = twitter.getOAuthAccessToken();
				session.put("token", accessToken.getToken());
				session.put("tokenSecret", accessToken.getTokenSecret());
				// twitter.updateStatus("テストかしら");
			} catch (TwitterException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		redirect("/index");
	}

	public static void index() {
		String token = session.get("token");
		String tokenSecret = session.get("tokenSecret");
		if (token != null && tokenSecret != null) {
			try {
				Twitter twitter = TwitterAuth.getInstance();
				AccessToken accessToken = new AccessToken(token, tokenSecret);
				twitter.setOAuthAccessToken(accessToken);
				List<Status> statuses;
				statuses = twitter.getFriendsTimeline();
				Status status = statuses.get(0);
				render(statuses);
			} catch (TwitterException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

}

TwitterAuth.java

package twitter;

import twitter4j.Twitter;
import twitter4j.TwitterFactory;

public class TwitterAuth {

	Twitter twitter;
	private static String CONSUMER_KEY = "取得したやつ";
	private static String CONSUMER_SECRET = "取得したやつ";
	
	public TwitterAuth() {}

	public static Twitter getInstance(){
		Twitter twitter = new TwitterFactory().getInstance();
		twitter.setOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
		return twitter;
	}
}

viewsフォルダ

  • Applicationフォルダ

callback.html

#{extends 'main.html' /}
#{set title:'callback' /}
<div>${ oauth_verifier}</div>

index.html

#{extends 'main.html' /}
#{set title:'Home' /}
<h1>メッセージ表示</h1>
#{list items:statuses, as:'status'}
	<div>${status.getText()}</div>
#{/list}

login.html

#{extends 'main.html' /}
#{set title:'Login' /}
<a href="@{Application.oauth}">ログイン</a>
  • errorsフォルダ

main.html

<!DOCTYPE html>

<html>
    <head>
        <title>#{get 'title' /}</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <link rel="stylesheet" type="text/css" media="screen" href="@{'/public/stylesheets/main.css'}">
        #{get 'moreStyles' /}
        <link rel="shortcut icon" type="image/png" href="@{'/public/images/favicon.png'}">
        <script src="@{'/public/javascripts/jquery-1.4.2.min.js'}" type="text/javascript" charset="utf-8"></script>
        #{get 'moreScripts' /}
    </head>
    <body>
        #{doLayout /}
    </body>
</html>

雑記

TwitterAuth.javaとかcallback.htmlは要らないですね。
Play!のセッションは文字列しか入れることができないようなのでRequestToken、AccessTokenオブジェクトを直接入れることができないのでそれぞれのToken、TokenSecretをセッションの中に突っ込んでいます。
HTMLとJavaファイルの関係は

controllersパッケージviewsフォルダ
Hoge.javaviewsフォルダの中のHogeフォルダ
Hoge.javaのfugeメソッドHogeフォルダの中のfuga.html
という感じみたい。
触った限りでは楽しいです。Play!熱い!