Google App Engine/Pythonでfacebookアプリ開発

先日参加した、プログラマ勉強会in群馬にてfacebookアプリの話が出ましたので、早速チャレンジしてみました。

本当は、facebookからたどるのですが、ググるとわかるように、Python SDKは、GitHubのここからダウンロードできます。
https://github.com/facebook/python-sdk/

解凍すると、下記のようなファイルとフォルダが展開されます。察しが言い方は、お気づきの事とは思いますが、examplesの中に、appengineなんてのが有るんですわ。鼻っからGAEで開発だろjkって感じ。素晴らしい。なので、このサンプルをちょちょいといじればすぐにGAEでfacebookアプリできるやん!って思った次第です。が、そうは問屋が卸してくれませんでした。いろいろと御池があってハマったので、修正した箇所を書き記します。今回は、サンプルの中の一番簡単そうな「appengine」にチャレンジしました。

\FACEBOOK-PYTHON-SDK-322930C
│  readme.md
│  setup.py
├─examples
│  ├─appengine
│  │      app.yaml
│  │      example.html
│  │      example.py
│  ├─newsfeed
│  │  │  app.yaml
│  │  │  facebookclient.py
│  │  ├─static
│  │  │      base.css
│  │  │      favicon.ico
│  │  │      robots.txt
│  │  └─templates
│  │          base.html
│  │          home.html
│  │          index.html    
│  ├─oauth
│  │      app.yaml
│  │      facebookoauth.py
│  │      oauth.html
│  └─tornado
│          example.html
│          example.py
│          schema.sql
└─src
        facebook.py

srcにある、facebook.pyが心臓部です。今回は、GAEでの使用なので、ローカルマシンへのインストールに加えて、GAE用のフォルダにファイルごとをコピーして使用しました。適当な場所に、appengineフォルダをコピーし、そのなかにfacebook.pyをコピーします。exampleはダサイので、それぞれ、main.pyと、index.htmlに変更しました。ファイル名は変えなくてもOKです。facebook.pyはコピーするだけでそのまま使用します。

\facebookongae
│    app.yaml
│    facebook.py
│    index.html
│    main.py

これは、必須作業です。faceboook側でアプリの登録をします。その際に発行される「アプリID(アプリケーションID)」と、「アプリの秘訣(シークレットキー)」を入力します。翻訳がヘンテコなので場所によって表記が違います(^^;)内容をみれは同じなのでわかると思います。この2つを、index.py(example.py)に、入力します。

FACEBOOK_APP_ID = "your app id"
FACEBOOK_APP_SECRET = "your app secret"

htmlファイル名を変えたら、path変数も合わせて変更しておきます。

class HomeHandler(BaseHandler):
    def get(self):
        path = os.path.join(os.path.dirname(__file__), "index.html")

なぜかexampleには、getメソッドが用意されているのですが、実はfacebook側からはPOSTで呼び出されるのです。そこで、postに対する処理メソッドを用意します。ただし、まだgetメソッドが必要なのか不明なので消したりせず、以下のようにpostメソッドからgetメソッドを呼ぶ事にしました。これに気づかず、405 Method Not Allowedエラーが出てました。

class HomeHandler(BaseHandler):
    def get(self):
        path = os.path.join(os.path.dirname(__file__), "index.html")
        args = dict(current_user=self.current_user,
                    facebook_app_id=FACEBOOK_APP_ID)
        self.response.out.write(template.render(path, args))

    def post(self):
        self.get()

/以下に変なアクセスがあっても処理できるように、mainメソッドは念のためこうしました。

def main():
    util.run_wsgi_app(webapp.WSGIApplication([(r"/", HomeHandler)]))
def main():
    util.run_wsgi_app(webapp.WSGIApplication([(r"/.*", HomeHandler)]))

ここは、GAEお決まりのアレですが、app.yamlのapplicationに取得済みのGAEアプリケーション名を設定しましょう。

application: facebook-example

あとは、いつものようにデプロイすればOK。
実行結果はこんな感じになります。


とても簡単にfacebookアプリが開発できることが分かりました。GAEを使えばほぼただでGoogleのインフラ使えますからね。先日オライリーからがプログラミング Google App Engine発売になったので合わせていかがでしょうか?javaPython両対応ですよ。

プログラミング Google App Engine

プログラミング Google App Engine