Google App Engineでmixi Graph APIを使ってボイスを取得する
id:kyoro353がmixi 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>