Google App Engineでmixi Graph APIを使ってボイスを取得する

id:kyoro353mixi graph APIを使った写真投稿を書いていたので、
Pythonでmixiの新しいAPIを使うプログラムを書いてみたよ
便乗して表示系を。

mixiが先日からGraph APIを一般ユーザーにも公開を始めました。
mixi Developer Center - Graph API
このAPIを使うと、外部のアプリからmixi内部のデータにアクセスすることが出来るようになります。
最近、自分もこのAPIを使って色々遊んでいます。
上のid:kyoro353の例は写真の投稿ですが、writeしたらreadもしたい。
自分の場合、Google App Engineを使って簡単なプログラムを書き、色々なデータを表示して遊んでいます。
下の例では、リダイレクトURLをlocal環境にしておいて、ローカルでGoogle App Engineを使ったmixi Graph API遊び環境を作っています。
ポート8080で動かして、localhost:8080にアクセスすると、認証画面に飛ばされます。
認証をすると、localhost:8080/redirectにリダイレクトされ、ボイスを取ってきて画面に表示します。
たったこれだけのコードで、mixi ボイスの情報をとって来ることができました。
(この例では、tokenのリフレッシュが行われません。)

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from google.appengine.ext import webapp
from google.appengine.ext.webapp import util
import os
from google.appengine.ext.webapp import template
from google.appengine.api import users
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.api import urlfetch
import urllib
import logging
from django.utils import simplejson

class AuthParam():
    """OAuthに必要なパラメータを入れておく"""
    def __init__(self):
        pass
    @classmethod
    def CONSUMER_KEY(cls):
        return "xxxxxxxxxxxxxx" #Consumer Keyを入れてね
    @classmethod
    def CONSUMER_SECRET(cls):
        return "yyyyyyyyyyyyyy" #Consumer Secretを入れてね
    @classmethod
    def REDIRECT_URL(cls):
        return "http://localhost:8080/redirect" #リダイレクトURLを入れてね
        
class MainHandler(webapp.RequestHandler):
    """認証ページへ飛ぶ"""
    def get(self):
        query = {
                "client_id":AuthParam.CONSUMER_KEY(),
                "response_type":"code",
                "scope":"r_profile r_voice",
                }
        url = "https://mixi.jp/connect_authorize.pl?" + urllib.urlencode(query)
        self.redirect(url)  #認証ページへリダイレクト

class RedirectHandler(webapp.RequestHandler):
    """認証後にリダイレクトされてくるページ"""

    def get_access_token(self,auth_code):
        """access tokenを入手する"""
        form_fields = {
                "grant_type":"authorization_code",
                "client_id":AuthParam.CONSUMER_KEY(),
                "client_secret":AuthParam.CONSUMER_SECRET(),
                "code":auth_code,
                "redirect_uri":AuthParam.REDIRECT_URL(),
                }
        form_data = urllib.urlencode(form_fields)
        result = urlfetch.fetch(url="https://secure.mixi-platform.com/2/token",
                        payload=form_data,
                        method=urlfetch.POST,
                        headers={'Content-Type':'application/x-www-form-urlencoded'})

        json = simplejson.loads(result.content)
        return json['access_token']

    def get_friends_voice(self,access_token):
        """友人のボイスを取得する"""
        result = urlfetch.fetch(url="http://api.mixi-platform.com/2/voice/statuses/friends_timeline/",
                        method=urlfetch.GET,
                        headers={'Authorization':'OAuth %s'%access_token})
        return simplejson.loads(result.content)

    def get(self):
        auth_code = self.request.get("code")
        access_token = self.get_access_token(auth_code)

        #ここになにか書く
        #例えば、友人のボイス一覧取得
        voices = self.get_friends_voice(access_token) 
        template_values = {'voices': voices,}           
        path = os.path.join(os.path.dirname(__file__), 'index.html')
        self.response.out.write(template.render(path, template_values))

def main():
    application = webapp.WSGIApplication([('/', MainHandler),
                                        ('/redirect', RedirectHandler)],
                                         debug=True)
    util.run_wsgi_app(application)


if __name__ == '__main__':
    main()

index.html

<html>
    <body>
        {% for voice in voices %}
        {{voice.user.screen_name}}  {{voice.text}}<br />
        {% endfor %}
    </body>
</html>