「Play!」でTwitterのOAuth認証
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(); } } } }
- twitterパッケージ
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.java | viewsフォルダの中のHogeフォルダ |
Hoge.javaのfugeメソッド | Hogeフォルダの中のfuga.html |
触った限りでは楽しいです。Play!熱い!