愛と勇気と缶ビール

ふしぎとぼくらはなにをしたらよいか

Google App Engine + JRuby + Sinatra + Ruby Twitter Gem でTwitter APIを利用したWebアプリを作る

前回はGAE上でSinatraを動かす方法を紹介したんだけど、アレを試してみた理由はGAE上でTwitter APIを利用したWebアプリを出来るだけ手軽に作ってみたかったからなんだよねえ。

てなわけで、今回はGAE+SinatraTwitter APIを利用したアプリを作る方法。


TwitterAPIには、ユーザ認証が必要なもの(ユーザ個人のタイムラインの取得とか、Tweetの投稿とか)と、そうでないもの(パブリックなタイムラインの取得とか)があるんだけど、やっぱアプリを作るからにはTwitterに間接的にログインして、投稿もできなきゃ話にならん。

DB用意してユーザ登録して・・・とか面倒くさい(っていうかGAE上では普通のDBが使えない)し、今回はTwitter APIを利用することでもあるので、その辺はTwitterに一任します。要はWebアプリのユーザ認証を、TwitterのID・Passを使ってやっちゃおうってことです。


でまあ、今回はTwitterへの認証にOAuthを使います。OAuthってなんのこっちゃ?と思う人も多いかと思うけど、FriendFeedとかのTwitterを利用したサービスで「Twitterアカウントでログイン」みたいなボタンを押すと「あるアプリケーションがあなたのアカウントに接続しようとしています」みたいな画面が出てくるヤツ。アレです。多分、良心的な(?)Twitter API利用サイトでは軒並み利用されていると思う。


単に認証を行うだけなら、アプリのTOP画面でTwitterのIDとPassを入力させてそれをBasic認証Twitterに投げるだけでもいいんだけど、そういう方法と比べてOAuthがいいのは「Twitter APIを利用した第三者サイトにIDやPasswordを知られることなくTwitterの認証が可能」である点ね。普通に考えて、IDやPassをどこぞの得体の知れないサイトに渡すのは怖い。その辺をOAuthはまるっと収めてくれます。Twitterの場合は、そのアプリを通じて投稿した際に「○○から」って表示されるオマケ付き。



ちょっと能書きが長くなってしまったけど、以下手順。



1、Twitterにアプリケーションを登録する。

Twitterにログインして右上→設定→このユーザに対する操作→右の方にある"Developers"のとこのリンクをクリッコ

http://twitter.com/apps

ここで自分の作るアプリの名前やURIなどを登録する。はっきり言って場所がわかりにくい。

今回はブラウザから利用するアプリを作るので、"Application Type"はBrowserに。あと投稿とかもしたいので"Default Access Type"はR&Wに。"CallBack URL"のとこには意味ありげなことが書いてあるけど、現在のOAuthの仕様ではここはコールバックに関係なくなってる。

登録したらConsumer KeyとかConsumer Secretが書いてあるページに飛ぶと思うので、その2つの文字列をメモ。後でOAuthに使います。


2、アプリのOAuth周りを作る。

OAuth周りはここを参考に作る。

http://www.machu.jp/diary/20090818.html

ソースの
KEY = "twitter_consumer_key"
SECRET = "twitter_consumer_secret"
のとこにさっきのConsumer KeyとConsumer Secretを入れます。直接書きたくない人はファイルから読み込むなり、適当に。

えーと、上の記事に書いてあるセッション周りの設定(use Rack::うんぬんのとこ)は何故か通りませんでした。追って調査中。ちゃんとセキュアにクッキーを使いたい場合は、何らかの対策が必要なもようです。


3、アプリのTwitter周りを固める。

GAE+JRubyTwitter APIを使った(というかhttp通信を行う)アプリを作る上で最大の難点は、GAEの制限によりRuby標準のnet/httpライブラリが使えなくなってしまうことです。なので、エラい人が作ったもので通信をバイパスします。

http://github.com/lstoll/rb-gae-support/tree/master

これを使う。バージョンナンバーが0.0.2とか「これは開発段階」って書いてあるとか胡散臭い感じがプンプンするけども、net/httpをちゃんと通してくれるのでとりあえず問題無し。ちなみにgemでもインストール出来ます。前回の記事にも書いたように、gemはアプリに同梱すること。

こいつを require "rb-gae-support" しておけば、net/httpが普通に使えるようになる(はず)。そんでもって、直接TwitterAPIを叩くのは面倒なのでライブラリを使う。

OAuthの参照記事にも書いてあるやつだけど、今回使うのはコレ

http://twitter.rubyforge.org/

こいつを使えば簡単にTwitterのタイムラインの取得やTweetのポストが可能になります。Ruby用のTwitter APIラッパライブラリは色々あって全部試すわけにもいかないんだけども、とりあえずTwitter4Rはなぜか動かなかった。上のやつはちゃんと動く。


4、アプリ本体を作る

以上でTwitterへのOAuthを使ったログイン + Ruby Twitter Gemの利用が可能になったので、後はアイデア次第でどんどんTwitterの肩に乗っかったWebアプリを作りましょう。そしてGAEにアップロードしましょう。TwitterWBSでも紹介されたけど、流行ってるうちに踊らにゃソンソン。



今回想定してるアプリはDBを使わない簡易なものだけど、やっぱりDB的なものが必要なWebアプリを作りたいという需要もあると思う。

Google App Engine上でDBに近いModelを実現するやつもあるみたいなんで、そのうちそれについても書くかも。




*追記

この方法でTwitter APIを利用したアプリを作る場合「Twitterでログイン」とかそういうリンクをサイトのどこかに設置することになるんですが、自分でリンク用の画像を作るのが面倒な人は以下のリンク下部からTwitter公式のやつがDLできます。

http://apiwiki.twitter.com/Sign-in-with-Twitter