mixi Graph APIを使って、(ブラウザレスで)マイミク更新情報取得

すっかりmixiをのぞかない日が続いていました。これを機会にmixiもちゃんとのぞいて、少しでもリア獣に近づきたいと思っている所存です。


背景

昔々、MyRemixという和風Yahoo! Pipesとも言うべきサービスがあったのをご存知でしょうか?これの特徴の一つとして、mixiの更新情報フィードを扱えるというものがあったんですよね。更新系の情報は全てLDRに集約している私としては、これは非常にありがたいものでした。

ただ、いつの間にかMyRemixがサイトごと落ちてました。それに伴い、めっきりmixiにアクセスすることが少なくなっちゃいました。

でしばらく放置していたのですが、つい1ヶ月ほど前に

本日より、個人の方でもクレジットカード登録をすることでmixi Graph APIをご利用いただくことが可能になりました。

個人の方もmixi Graph APIがご利用可能になりました << mixi Developer Center (ミクシィ デベロッパーセンター)

このようなニュースが流れていました*1。これ使えば、フィード取れるんじゃね?と思って試してみたというわけです。

目的

最終的にやりたいのは、マイミク更新情報をフィード出力してLDRに喰わせるということ。

動かし方

ソース一式は、いつもどおりGithubに置いています。Maven前提なんで。

mixi Graph APIの単独実行

一式はWebアプリ(サーブレット)になっていますが、mixi Graph APIを処理するコードは↓なので、これだけ見ればやりたいことは何となく見えるでしょう。対となるテストコードもあるので、これ単独で走らせることもできますし。

動かす場合は、事前にサービス管理 << mixi Developer Center (ミクシィ デベロッパーセンター)をもとに、mixiでサービスを作っておいてください。

で、サービスを作ったら、次はmixi-graph-api.propertiesを修正します。EMAIL/PASSWORDはmixiにログインするためのもので、その他は作成されたサービスの情報です。

# User Settings
EMAIL=XXXXXXXX
PASSWORD=XXXXXXXX

# Service Settings
CONSUMER_KEY=XXXXXXXXXXXXXXXX
CONSUMER_SECRET=XXXXXXXXXXXXXXXXXXXXXXXX
REDIRECT_URL=XXXXXXXXXXXXXXXXXXXXXXXX
アプリ一式の実行

"mvn jetty:run"でアプリを起動させた後に、↓のようなURLをたたいてみてください。"token"はfilter.propertiesに記載されている値を指定します。

http://localhost:8080/mixi-feed-checker/?token=1234567890qwertyuiopasdfghjklzxcvbnm

また、上記のURLを例えばThunderbirdに喰わせると、こんな感じになります*2

f:id:ikikko:20110124025734p:image

"token"は本質的な処理には必要ないのですが、あえてつけています。というのは、一式の処理がそれなりに重い処理(手元のマシンで数秒程度)だったので、余計なクローラにアクセスされないようにtokenで認証しているためです。認証処理はフィルタで。

処理内容の補足

mixi Graph API

処理フローなどは、下記リンクを参照してください。

で、まず最初に思ったことが「これブラウザ起動が前提?」ということ。一般的なWebアプリならいいのですが、LDRのクローラはもちろんこのフローに載せることはできません。OAuth 2.0の仕様書のクライアントプロファイルあたりがそうだと思うのですが、まだウェブサーバー以外のプロファイルが用意されていないということですかね?OAuth 2.0も今回初めて見たので、詳細は不明なんですが。

そうはいってもないものは仕方ないので、この辺を自動(ブラウザレス)でやってみました。

  1. ユーザ認証
  2. mixi Graph APIを用いた)サービスの認可
  3. サービスへのアクセストークン発行・取得
  4. mixi Graph API発行

あー、そうそう。アクセストークンの取得でmixi公式ドキュメントに書いてあるリクエストのサンプルですが、"redirect_uri"が抜けています。省略したらしっかり怒られたので、これも指定する必要がありますので注意!

HtmlUnit

最初GAE/J(の無料枠)に載せたくてHttpUrlConnection使おうかなと思ってたのですが、あえなく断念。HttpUrlConnectionやHttpClientはページ単独でスクレイピングするのにはいいのですが、今回のようにステートフルなページ遷移をやろうとするとかなり面倒なんですよね。

ということで、もうちょっと上位のコンポーネントで解決できないかなと考えて、HtmlUnitを使ってみました。HtmlUnitは「HtmlUnit is a "GUI-Less browser for Java programs"」とあるように、GUIを立ち上げないブラウザです。これで、実際にブラウザからぽちぽちする動作をエミュレートしたってわけですね。

HtmlUnitを使った処理の中身は、↑であげたMixiFeedChecker.javaで。


今回学んだもの

  • mixi Graph APIの扱い方
  • OAuth 2.0の認可のやり方
  • HtmlUnitでのブラウザエミュレートの方法
  • gsonの初歩的な使い方
  • jetty-maven-pluginの設定方法*3

*1:実は、調べていくうちについ先日!?みたいに知ったのですがw

*2:実は、まだLDRには喰わせていません。というのは、Webアプリを公開できる環境を自分が持っていないので・・・orz はやいとこ、AWSでも契約せんといけんですね

*3:[http://d.hatena.ne.jp/jyukutyo/20101216/1292511146:title=ここ]とか見る限り、Version 7でちょこちょこ変わってるみたいですね。初めて使ったので、細かいことしりませんが。