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。
"token"は本質的な処理には必要ないのですが、あえてつけています。というのは、一式の処理がそれなりに重い処理(手元のマシンで数秒程度)だったので、余計なクローラにアクセスされないようにtokenで認証しているためです。認証処理はフィルタで。
処理内容の補足
mixi Graph API
処理フローなどは、下記リンクを参照してください。
- mixi Graph API << mixi Developer Center (ミクシィ デベロッパーセンター)
- mixi Graph APIが一般開発者に解放されたというので、早速試してみた! - r-weblife
で、まず最初に思ったことが「これブラウザ起動が前提?」ということ。一般的なWebアプリならいいのですが、LDRのクローラはもちろんこのフローに載せることはできません。OAuth 2.0の仕様書のクライアントプロファイルあたりがそうだと思うのですが、まだウェブサーバー以外のプロファイルが用意されていないということですかね?OAuth 2.0も今回初めて見たので、詳細は不明なんですが。
そうはいってもないものは仕方ないので、この辺を自動(ブラウザレス)でやってみました。
あー、そうそう。アクセストークンの取得でmixi公式ドキュメントに書いてあるリクエストのサンプルですが、"redirect_uri"が抜けています。省略したらしっかり怒られたので、これも指定する必要がありますので注意!
HtmlUnit
最初GAE/J(の無料枠)に載せたくてHttpUrlConnection使おうかなと思ってたのですが、あえなく断念。HttpUrlConnectionやHttpClientはページ単独でスクレイピングするのにはいいのですが、今回のようにステートフルなページ遷移をやろうとするとかなり面倒なんですよね。
ということで、もうちょっと上位のコンポーネントで解決できないかなと考えて、HtmlUnitを使ってみました。HtmlUnitは「HtmlUnit is a "GUI-Less browser for Java programs"」とあるように、GUIを立ち上げないブラウザです。これで、実際にブラウザからぽちぽちする動作をエミュレートしたってわけですね。
HtmlUnitを使った処理の中身は、↑であげたMixiFeedChecker.javaで。