2012年1月28日土曜日

mixi のGraphAPIがおいおい…な件と、オレオレJSON.stringify

ていうか、仕様書?のとおりにパースしようとしたら、
なんか undefined 出まくりで、どーなってんだよー!となった。
Windows版の Safari の 4.0 ~ 4.0.3 までは、SSLなJSONデータがJSONPじゃなくても取れるので、
それでデータを持ってきて、データを確認しようと思ったんだけど、
そういや、JSON.stringifyとか出来ないんじゃね?ってことで、
自分で オレオレ JSON.stringify 的なことが出来る関数を組んで、
データを文字列化して確認した。

オレオレJSONstringify
var jsonStringify = function(obj){
    var str = "";
        str += (obj.length) ? '[' : '{';
    for(var i in obj){
        str += (str.length == 1) ? '' : ',';
        if(typeof(obj[i]) == "object"){
            str += (obj.length ? '' : '"' + i + '":') + arguments.callee(obj[i]);
        }else{
            str += '"' + i + '":"' + obj[i].replace(/"/gi,"\\\"") + '"';
        }
    }
    str += (obj.length) ? ']\n' : '}\n';
    return str;
}

使い方は、
$.getJSON(url,function(json){
 var str = jsonStringify(json);
});
とかやってください。


ザックリ書いたので、エラーになっちゃうこともあるかもしれないけど、
一応、
http://braincast.nl/samples/jsoneditor/
http://jsonlint.com/
どっちでもVaildなJSONってなる。
複雑なJSONだと、エラー出るかも知れないので、あまりアテにしないでね。 


で、GraphAPIの仕様書みたいのだと、
published になってるのが、postedTime になってたり、
url になってるのが、 link になってたり、
id の部分が mixi のid (http://mixi.jp/show_friend.pl?id= 以降の数字部分)じゃなかったり、

{
"link":"http://mixi.jp/redirect_with_owner_id.pl?b=http%3A%2F%2Fmixi.jp%2Fview_check.pl%3Fpost_time%3D20120126054610&k=owner_id&v=cqs7s4qrou1ae",
"postedTime":"2012-01-26T05:46:10+09:00",
"object":{
"link":"http://mixi.jp/redirect_with_owner_id.pl?b=http%3A%2F%2Fmixi.jp%2Fview_check.pl%3Fpost_time%3D20120126054610&k=owner_id&v=cqs7s4qrou1ae",
"postedTime":"2012-01-26T05:46:10+09:00",
"targetUrl":"http://b.hatena.ne.jp/entry/77604833#mc?u=psychedesire",
"objectType":"bookmark"
},
"verb":"share",
"id":"http://mixi.jp/view_check.pl?post_time=20120126054610#owner_id=cqs7s4qrou1ae_1327524370",
"title":"ドラマーの動きを可視化したドラムソロ(動画) : ギズモード・ジャパンをブックマークしました。",
"actor":{
"link":"http://mixi.jp/show_friend.pl?uid=cqs7s4qrou1ae",
"objectType":"person",
"id":"http://mixi.jp/show_friend.pl?uid=cqs7s4qrou1ae",
"image":{
"width":"180",
"url":"http://profile.img.mixi.jp/photo/user/cqs7s4qrou1ae_3889300265.jpg",
"height":"174"
},
"displayName":"pdyh"
}
 

こんな感じですね。俺がはてなブックマークしたやつの、mixi チェックのデータ。
一見すると、 obj["id"] にもURLがあって、
http://mixi.jp/view_check.pl?post_time=20120126054610#owner_id=cqs7s4qrou1ae_1327524370

それを開けばいいのかなーと思うけど、 これを開いたら、エラーって言われます。
あと、mixi の説明のところで、photo photoalbum って objectType のところにあるんだけど、
activitystream のところでは、 photo photoalbum から image に変わりましたって書いてあったんで、
mixi の人は書き換えたほうがいいんじゃねーの?と思います。

あと、認証関係も厳しい(facebook とかに比べれば…)感じで、
access_token の有効期間が短くて、
15分以内にリフレッシュトークンっていうのを使って、トークンの再発行をしなきゃだめみたいです。
Facebookとか別にトークンそのままで大丈夫なんだけどなぁ。
こないだのFacebookでタイムラインだけ取れないのもこれが原因なのかな?
調べたら、1時間くらいで取得できなくなるとは書いてあるけども。

Facebookのオフラインアクセストークンを得る方法

じゃあ、なんで俺だけずっと同じトークンで取得できてるんだろ。
開発者アカウントになってるからかもしれないな。
じゃあ、投稿の時だけ、俺以外の人でも、古いトークンで動いていたのだろう… Facebook。謎。
一応書き加えておこう。
scope=offline_access ね。
mixi でも使えないのかな?この scope と思って調べてみたけど、該当無し。
無理やり scope に offline_access って入れたけど、そしたら pin が返ってきませんでしたーワハハハハ。死ね。
リフレッシュトークンも有効期限あるとか書いてあったしさぁ。まぁ、セキュリティを考えたら、それが普通なんだろうけど、はぁ。


リフレッシュトークンでアクセストークンを書き換えてから、json 取りにいくようにすればいいか。めんどくせーから。
と思って調べてみたら、


リフレッシュトークンにも有効期間があるんです


mixi のOpenGraph のサンプル書いている人だ。Gitで見た。ここに良いことが書いてあった。
しかし、OAuth 2.0において「リフレッシュトークンにも有効期間がある」ということを意識していない開発者は多いかもしれません。実際には、ユーザが認可画面で同意し た内容に影響を受けるのは、アクセストークンの有効期間ではなく、リフレッシュトークンの有効期間です。つまり、開発者はアクセストークンの有効期間切れ を意識するだけでなく、リフレッシュトークンの有効期限切れに関しても意識をする必要があるということです。
mixi Graph APIを利用する場合、ユーザの認可画面には常に同意するかどうかを指定するためのチェックボックスがあります。このチェック状態に応じて、リフレッシュトークンの有効期間が決定します。
これかっ!Facebookのトークンも、俺だけ執行しなかった理由がわかったぞい!
じゃあ、ログインしっぱなしにすれば、いちいち認証エラーにならないぞーって書いておけばいいのね。
セキュリティリスクについても書いておきつつ。
イエイイエイ。OAuth系の認証のやつは、全部それが出てくるようにしたらいいですよねー。


おっしゃー。それじゃあBeholdrで mixi 見れるようにしよう。

0 件のコメント:

コメントを投稿