2008年9月21日

Google App Engineで始めるFacebookアプリケーション(準備)

Facebookアプリは外部でホスティングしないといけない。
だが、僕らにはGoogle App Engineがあるじゃないか!
ということで、Google App Engine上でFacebookアプリを作るための準備。

Google App Engineの準備

Google App Engineのページに行って、ユーザー登録する。
携帯のメアドが必要です。
今のところ1アカウントで10個までアプリケーションを登録できる。
これから作るアプリを登録しよう。
ちなみにこの記事内では、アプリの名前はwrkngということにします。

Python
Pythonをまだインストールしていなければ、Python Language Websiteから、2.5の最新版をダウンロードして、インストールしよう。
SDK
SDKには、ローカルで動作する開発サーバーや、デプロイツールが含まれている。
Google Codeからダウンロードして、インストールだ。

最初のアプリ

Windowsの場合は、デフォルトのままインストールすれば、C:\Program Files\Google\google_appengine\new_project_templateにアプリケーションのテンプレートがある。
適当なところにコピーしよう。
コピーしたら、app.yamlを修正する。
修正するのはアプリケーション名のところだ。
一行目の

application: new-project-template



application: wrkng

というように修正する。(アプリケーション名は自分が登録したものに読み替えてほしい)

Macの場合は、ランチャーアプリ内から新しいアプリケーションを作成できる。

ローカルで動作確認
アプリケーションを展開したディレクトリで、dev_appserver.py . を実行する。
http://localhost:8080 にアクセスすれば、Hello, worldと表示されるはずだ。
アップロード
アプリケーションのディレクトリで、appcfg.py update . を実行する。
appengineを登録したアカウントで、アプリケーションがアップロードされる。
アップロードが終わったら、実際にアクセスして実行されているのを確認できる。
アプリケーションのURLは、http://wrkng.appspot.com のようになる。


Facebookの準備

Facebookにログインして、開発者アプリケーションを追加する。
開発者アプリケーション内で、新規のアプリケーションを登録する。
コールバックURLに、さきほど作成したgoogle app engineのURL(http://wrkng.appspot.com/)を登録する。

キャンバスページにアクセスすると、405エラーとなるはず。
これは、Facebookからのアクセスが常にPOSTでくるためだ。
アプリケーションのmain.pyを修正する。
MainHandlerクラスのgetメソッドをpostメソッドに変更しよう。
修正したら、またアップロードする。
キャンバスページでも、Hello, worldが表示されるのを確認しよう。


FBMLのAPIを使う

Facebook APIから様々な情報を取得できる。
ラッパライブラリのPyFacebookを使えば、APIを手軽に利用できる。
リリースされているコードはないので、SVNのリポジトリから取得してこよう。
http://pyfacebook.googlecode.com/svn/trunk/
facebookディレクトリを、アプリケーションのディレクトリにコピーする。

以下のコードは、アクセスしたFacebookユーザーのフレンドをリスト表示する例だ。
apikeyや、secretは開発者アプリケーションで確認できる。

<code>


import wsgiref.handlers

import facebook.wsgi as facebook
from google.appengine.ext import webapp


class MainHandler(webapp.RequestHandler):

def post(self):
fb = self.request.environ['pyfacebook.facebook']
if fb.check_session(self.request):
uid = fb.uid
self.response.out.write('<fb:name uid="%s" useYou="false" />\'s friends:'
% uid)
friends = fb.friends.get()
self.response.out.write('<ul>')
for friend in friends:
self.response.out.write('<li><fb:name uid="%s" /></li>'
% friend)
self.response.out.write('</ul>')

else:
url = fb.get_add_url()
self.redirect(url)

def main():
application = webapp.WSGIApplication([('/', MainHandler),
('/send', SendHandler)],
debug=True)
config = {"pyfacebook.apikey":"********************************",
"pyfacebook.secret":"********************************"}

application = facebook.FacebookWSGIMiddleware(application,
config)
wsgiref.handlers.CGIHandler().run(application)


if __name__ == '__main__':
main()


</code>