前回の「まずは、絵文字でHello World!」のときに「build.xml」を実行して、コントローラクラスとJSPファイルを作成した要領で、今度はサービスクラスを作成します。
Eclipseで「build.xml」を選択し、[Run (実行)]→[Ant Build (Ant ビルド)](3番目の項目)を選択します。
ダイアログで、「gen-service」を選択し、[Run(実行)]ボタンを押下します。ダイアログに「TwitterService」と入力し、[OK]ボタンを押下します。
「com.hayato.gpstweet.service.TwitterService」クラスと「com.hayato.gpstweet.service.TwitterServiceTest」クラスが作成されます。
package com.hayato.gpstweet.service;
public class TwitterService {
public static final String consumerKey = "Twitterアプリの値を設定";
public static final String consumerSecret = "Twitterアプリの値を設定";
}
consumerKeyとconsumerSecretには、先どどメモしたTwitterアプリの設定情報の「ConsumerKey」と「ConsumerSecret」を指定します。
次に、RequestTokenを取得するコントローラクラスを作成します。「build.xml」を実行し、「gen-controller」で、ダイアログに「/twitter/requestToken」を指定します。
「com.hayato.gpstweet.controller.twitter.RequestTokenController」を以下のように、編集します。
package com.hayato.gpstweet.controller.twitter;
import org.slim3.controller.Controller;
import org.slim3.controller.Navigation;
import twitter4j.conf.Configuration;
import twitter4j.conf.ConfigurationContext;
import twitter4j.http.OAuthAuthorization;
import twitter4j.http.RequestToken;
import com.hayato.gpstweet.service.TwitterService;
public class RequestTokenController extends Controller {
@Override
public Navigation run() throws Exception {
Configuration conf = ConfigurationContext.getInstance();
OAuthAuthorization oauth = new OAuthAuthorization(conf, TwitterService.consumerKey, TwitterService.consumerSecret);
// Twitterの認証画面からの戻り先を指定します。
// AccessTokenコントローラを指定します。
String callbackURL = "http://localhost:8888/twitter/accessToken";
RequestToken requestToken = oauth.getOAuthRequestToken(callbackURL);
// RequestTokenをセッションに保存しておきます。
sessionScope("RequestToken", requestToken);
// Twitterの認証画面へリダイレクトします。
return redirect(requestToken.getAuthenticationURL());
}
}
次に、AccessTokenを取得するコントローラクラスを作成します。「build.xml」を実行し、「gen-controller」で、ダイアログに「/twitter/accessToken」を指定します。
「com.hayato.gpstweet.controller.twitter.AccessTokenController」を編集します。
package com.hayato.gpstweet.controller.twitter;
import org.slim3.controller.Controller;
import org.slim3.controller.Navigation;
import twitter4j.conf.Configuration;
import twitter4j.conf.ConfigurationContext;
import twitter4j.http.AccessToken;
import twitter4j.http.OAuthAuthorization;
import twitter4j.http.RequestToken;
import com.hayato.gpstweet.service.TwitterService;
public class AccessTokenController extends Controller {
@Override
public Navigation run() throws Exception {
Configuration conf = ConfigurationContext.getInstance();
// セッションからRequestTokenを取得します。
RequestToken requestToken = sessionScope("RequestToken");
// RequestTokenから認証前のAccessTokenを作成します。
AccessToken accessToken =
new AccessToken(requestToken.getToken(),
requestToken.getTokenSecret());
OAuthAuthorization oauth =
new OAuthAuthorization(conf,
TwitterService.consumerKey, TwitterService.consumerSecret,
accessToken);
// Twitterから送られるVerifierを使用して、認証されたAccessTokenを取得します。
String verifier = requestScope("oauth_verifier");
accessToken = oauth.getOAuthAccessToken(verifier);
requestScope("accessToken", accessToken);
return forward("accessToken.jsp");
}
}
「war/twitter/accessToken.jsp」を以下のように編集します。
<%@page pageEncoding="UTF-8" isELIgnored="false" session="false"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<%@taglib prefix="f" uri="http://www.slim3.org/functions"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>twitter AccessToken</title>
</head>
<body>
<p>AccessToken:${accessToken.token}</p>
<p>AccessTokenSecret:${accessToken.tokenSecret}</p>
</body>
</html>
${accessToken.token}と${accessToken.tokenSecret}で、取得したAccessTokenを表示します。
Webブラウザで、「http://localhost:8888/twitter/requestToken」にアクセスし、Twitter認証画面で「許可する」を選択してください。
表示されるAccessTokenをメモします。
以降、このAccessTokenを使用して、Twitterを携帯Webサイトから操作します。
それでは、先ほど取得したAccessTokenを使用して、ケータイからTwitterにつぶやく機能を実装しましょう。
「com.hayato.gpstweet.service.TwitterService」を以下のように編集します。
package com.hayato.gpstweet.service;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.http.AccessToken;
public class TwitterService {
public static final String consumerKey = "Twitterアプリの値を設定";
public static final String consumerSecret = "Twitterアプリの値を設定";
// AccessTokenのキー
private static final String tokenKey = "取得したAccessTokenのキーを設定";
// AccessTokenの値
private static final String tokenSecret = "取得したAccessTokenの値を設定";
// Twitterインスタンスの取得
private Twitter getTwitter() {
TwitterFactory factory = new TwitterFactory();
AccessToken at = new AccessToken(tokenKey, tokenSecret);
// AccessTokenによる認証
return factory.getOAuthAuthorizedInstance(consumerKey, consumerSecret, at);
}
// つぶやく
public void tweet(String tokenKey) throws TwitterException {
Twitter twitter = getTwitter();
twitter.updateStatus(message);
}
}
Twitter4Jを使用して、つぶやくためには、まずTwitterの認証を取得する必要があります。Twitterの認証に先ほど取得したAccessTokenを使用します。簡単にするため、AccessTokenをTwiterServiceに定数として保持します。
次に、TwitterFactoryクラスを作成しgetOAuthAutherizedInstance()を呼び出し、Twitterインスタンスを取得します。引数には、アプリケーションのConsumerKeyとConsumerSecretとAccessTokenが必要です。
Twitterインスタンスを取得すれば、つぶやくのは簡単です。TwitterインスタンスのupdateStatus()にメッセージを指定して呼び出すだけです。
次に、つぶやくためのコントローラクラスを作成します。「build.xml」を実行し、「gen-controller」で、ダイアログに「/twitter/tweet」を指定します。
「com.hayato.gpstweet.controller.twitter.TweetController」を以下のように編集します。
package com.hayato.gpstweet.controller.twitter;
import org.slim3.controller.Controller;
import org.slim3.controller.Navigation;
import com.hayato.gpstweet.service.TwitterService;
public class TweetController extends Controller {
private TwitterService service = new TwitterService();
@Override
public Navigation run() throws Exception {
// メッセージ
String message = requestScope("message");
// TwitterServiceのtweetを呼び出す
service.tweet(message);
requestScope("result", "つぶやきました。");
// index.jspに遷移する
return forward("index.jsp");
}
}
先ほど作成したTwitterServiceのtweet()を呼び出しています。
次ページでは引き続きつぶやく機能を実装し、タイムライン取得機能やエラーハンドリングも追加して、実際に動かしてみます。
Copyright © ITmedia, Inc. All Rights Reserved.