2009年8月26日水曜日

Google App Engineを利用してmixiアプリを作成する

このブログ記事をはてなブックマークに追加

最近、mixiアプリの正式版がリリースされたらしい。以前、オープンベータが始まったときにちょっと興味を抱いたのだが、そのまま忘れてしまっていた。しかし、この正式版リリースでまた興味が湧き、Google App Engine (GAE)と絡めてちょっといじってみたので、GAEを利用したmixiアプリの作成方法を説明してみようと思う。

まず、GAEを初めて利用する場合は、Google App Engine - Google Codeでアカウントを取得する。SDK一式を落としてきて使えるようにしておくこと。次に、mixiアプリを申請できるように、デベロッパー登録をしておこう。

さて、ここから本格的にmixiアプリを作成するわけだが、誰でも(自分を含めて)簡単に理解できるように「はじめてのmixiアプリ」の「Hello, world!」アプリケーションを元に作成することにした。

ところで、GAEを単なるファイル置き場として使うだけであれば、次のように設定すればいい。まず、作業ディレクトリにgadgetsディレクトリを作成して、そこにGadget XMLファイル(ここではhello.xmlとする)を置き、app.yamlのhandlersに以下の設定を追加する。

- url: /(.*\.xml) static_files: gadgets/\1 upload: gadgets/(.*\.xml)

これを、そのまま以下のコマンドでアップロードする。そして、mixiアプリ登録で、Gadget XMLファイルのURLを、http://アプリケーション名.appspot.com/hello.xmlのように指定するだけだ。

appcfg.py update アプリケーション名

しかし、ファイル置き場にするだけならば、GAEである必要はないわけで、ここではちゃんとGAEを利用した使い方を説明する。

Google App Engineを利用したmixiアプリ「Hello, world!」

GAEを利用するということで、「Hello, world!」アプリケーションの表示を「Hello, ユーザ名!」から、時間に応じた挨拶に変更してみる。朝なら「おはよう, ユーザ名!」、昼なら「こんにちは, ユーザ名!」、夜なら「こんばんは, ユーザ名!」という具合に。

まず、時間による挨拶の取得をGAEのPythonで以下のように実装する。

mixi_apps.py

#!/usr/bin/env python # -*- coding: utf-8 -*- import datetime import wsgiref.handlers from google.appengine.ext import webapp class Hello(webapp.RequestHandler): def get(self): greeting = u"こんにちは" H = (datetime.datetime.utcnow() + datetime.timedelta(hours=9)).hour if H >= 3 and H < 9: greeting = u"おはよう" elif H >= 9 and H < 18: greeting = u"こんにちは" elif H >= 18 or H < 3: greeting = u"こんばんは" self.response.headers["Content-Type"] = "text/plain; charset=utf-8" self.response.out.write(greeting) def main(): application = webapp.WSGIApplication([("/apps/hello", Hello)], debug=False) wsgiref.handlers.CGIHandler().run(application) if __name__ == "__main__": main()

このスクリプトをmixi_apps.pyという名前でGAEの作業ディレクトリに置く。そして、app.yamlのhandlersに以下を指定しておく。

- url: /apps/.* script: mixi_apps.py

アップロード後、http://アプリケーション名.appspot.com/apps/helloにアクセスし、「こんにちは」や「こんばんは」などのように表示されれば、正常に動作している。

次に上記で作成したプログラムを呼び出すように元のGadget XMLを修正する。外部サーバを呼び出すには、gadgets.io.makeRequest関数を利用する。使い方は実際に修正したファイルを見て貰った方が早いだろう。赤字で示している部分が元のファイルから修正したコードだ。

hello.xml

<?xml version="1.0" encoding="UTF-8"?> <Module> <ModulePrefs title="Hello, world!"> <Require feature="opensocial-0.8" /> </ModulePrefs> <Content type="html"><![CDATA[ <div><span id="greeting"></span>, <span id="target"></span>!</div> <script type="text/javascript"> function init() { var url = "http://アプリケーション名.appspot.com/apps/hello"; var params = {}; params[gadgets.io.RequestParameters.METHOD] = gadgets.io.MethodType.GET; params[gadgets.io.RequestParameters.CONTENT_TYPE] = gadgets.io.ContentType.TEXT; params[gadgets.io.RequestParameters.AUTHORIZATION] = gadgets.io.AuthorizationType.NONE; gadgets.io.makeRequest(url, function(response) { document.getElementById("greeting").innerHTML = response.data; }, params); var req = opensocial.newDataRequest(); req.add(req.newFetchPersonRequest(opensocial.IdSpec.PersonId.VIEWER), "viewer"); req.send(function(data) { var viewer = data.get("viewer").getData(); var name = viewer.getDisplayName(); document.getElementById("target").innerHTML = name; }); } gadgets.util.registerOnLoadHandler(init); </script> ]]></Content> </Module>

gadgets.io.makeRequest関数については、「外部サーバを呼び出してみよう」に詳しく出ているので詳細を知りたい方はこちらを参照して欲しい。

このように、Google App Engineを利用したmixiアプリは簡単に作ることができる。今回作成したアプリはGAEを使う必要がないような非常に単純なものだが、これを応用してもっと複雑で多種多様なアプリを作成することはそれほど難しいことではないと思う。

0 コメント: