scala on slim3 on GAE with twitter4j で OAuth認証してタイムラインがとれたので、ソースをメモっておく。
まずは、Twitterアプリケーション画面 で twitterにアプリケーション追加
注意すべきなのは、「アプリケーションの種類」の設定。一度、アプリケーション登録したあと、編集するとこれが選択できるようになっているので、「ブラウザアプリケーション 」を選択しておく。「コールバックURL」は適当でヨシ。
Scala on Slim3 プロジェクトの準備
Slim3をScalaで動かすためのいろいろ - ゆるよろ・オブ・ザ・( ;゚皿゚)ノシΣ フィンギィィーーッ!!! 日記 を参照。
IndexControllerを作成
ant gen-scala-controller
を実行。pathを求められるので、「/」と入れてやる。
これで、
が出来上がる。
/war/index.jsp には手をつけず、IndexController.scala を以下のようにコード。
package package.projectName.controller
import twitter4j.Twitter
import twitter4j.TwitterException
import twitter4j.TwitterFactory
import twitter4j.User
import twitter4j.ResponseList
import twitter4j.http.{AccessToken, RequestToken}
import org.slim3.controller.{Navigation, Controller}
class IndexController extends Controller {
override def run():Navigation = {
return redirect(getAuthenticationURL())
}
def getAuthenticationURL():String = {
var twitter:Twitter = new TwitterFactory().getInstance()
twitter.setOAuthConsumer("Twitter登録時に表示されたConsumer key", "Twitter登録時に表示されたConsumer secret")
sessionScope("twitter", twitter) //セッションに保持
// ■リクエストトークンの作成
var requestToken:RequestToken = twitter.getOAuthRequestToken(callbackUrl())
sessionScope("requestToken", requestToken) //セッションに保持
println("AuthenticationURL : " + requestToken.getAuthenticationURL())
return requestToken.getAuthenticationURL()
}
def callbackUrl():String = {
var url:StringBuffer = request.getRequestURL()
println("requestUrl : " + url.toString())
url.append("callback")
println("callbackUrl : " + url.toString())
return url.toString()
}
}
CallbackControllerを作成
ant gen-scala-controller
を実行。pathを求められるので、「/callback」と入れてやる。
これで、
が出来上がる。
/war/callback.jsp には手をつけず、CallbackController.scala を以下のようにコード。
package package.projectName.controller
import org.slim3.controller.Controller
import org.slim3.controller.Navigation
import twitter4j.{Twitter, TwitterException}
import twitter4j.http.RequestToken
class CallbackController extends Controller {
override def run():Navigation = {
try {
validateTwitter()
} catch {
case e:TwitterException => var message = "Failed to get timeline: " + e.getMessage()
requestScope("message", message)
}
return redirect("menu"); //次画面へリダイレクト
}
def validateTwitter():Twitter = {
var twitter:Twitter = sessionScope("twitter") //セッションから取得
var requestToken:RequestToken = sessionScope("requestToken") //セッションから取得
var verifier:String = asString("oauth_verifier") //リクエストから取得
twitter.getOAuthAccessToken(requestToken, verifier) //認証の確認
request.getSession().removeAttribute("requestToken") //セッションから削除
return twitter
}
}
MenuControllerを作成
ant gen-scala-controller
を実行。pathを求められるので、「/menu」と入れてやる。
これで、
が出来上がる。
MenuController.scala を以下のようにコード。
package package.projectName.controller
import org.slim3.controller.Controller
import org.slim3.controller.Navigation
import java.util.List
import twitter4j.{Status, Twitter}
import scala.collection.jcl.Conversions.convertList
class MenuController extends Controller {
override def run() = {
var twitter:Twitter = sessionScope("twitter")
var statuses = twitter.getHomeTimeline()
requestScope("statuses", statuses)
forward("menu.jsp")
}
}
menu.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>Menu</title> </head> <body> <p>Hello Menu !!!</p> <c:forEach var="e" items="${statuses}" varStatus="s"> <c:out value="${s.count}" /> ${f:h(e.text)} <hr /> </c:forEach> </body> </html>
これで、http://localhost:8080 にアクセスすれば、Oauth認証を認可されて、タイムラインが取得可能!
一番参考にしたサイト:Slim3 Twitter4Jメモ(Hishidama's GAE Slim3 Twitter4J Memo)
こちらも参考:Young risk taker.: [Scala Tips] Java型からScalaのラッパー型への明示的変換を仲介してくれるライブラリ
尚、開発環境は、@kmizu さんに教えてもらって、IntelliJ IDEA を使用。結構安定したScalaエディターを使えます。Eclipseプロジェクトと互換性があるので、Eclipseでプロジェクトを作るところまでやって、IntelliJ IDEAに取り込みました。ただ、GAEのプラグインはIntelliJ IDEAの有償版でしか使うことができません。なので、IntelliJ IDEAでコーディングして、あとはコマンドプロンプトでant を実行して、compileしたり、{project}\lib\appengine-java-sdk-1.3.1\bin\dev_appserver.cmd を叩いたりしていました。また、何故か、java.util や java.lang 系のクラスが、エディタ上エラーに見えてしまいます。しかし、Scalaにはこれらのクラスは普通に使えるので、コンパイルは通ります。開発環境はまだまだ微妙っすね。