お久しぶりです。伊藤(係長)です。
ちょっと前の話ですが、Facebook(Lei Leiさん)からREST APIに関する非情なる通達が来ました。
コレ→Facebook開発者ブログ
要するに、
・REST APIは非推奨にする
・REST APIはこの先もう長くない
・2013/4/10以降に新しく作成したFacebookアプリではREST APIは使えなくした
・既存のFacebookアプリでは取り敢えず問題なく動作する
・さっさとGraph APIに移行しろ
という事のようです。
MONIPLA for Facebookでは当然のようにFacebookのAPIを利用していて、
中にはREST APIを利用している箇所もあります。
以前からFacebookの(突然の)仕様変更には悩まされて来ましたが、今回も結構なインパクトがあります。
いつ動かなくなるかまだ不明ですが、これから作成するFacebookアプリが既存のコードでは動かないとなると、
新たに開発環境を整える人(新人とか)が困ってしまいますね。
というワケで早めにREST APIをGraph API(もしくはFQL)に移行してしまおうという事になりました。
今回はいくつかのREST APIをピックアップして、それと同等の動きをするGraph API(もしくはFQL)に
置き換える方法について書きます。
※PHPのFacebook SDKを使用する前提で書きます。
※コード中の「$this->facebook」はFacebookインスタンスです。
1. pages.isfan
まずは肩慣らしに、「pages.isfan」です。
これは指定したFacebookページのファン(いいねしている)であるかどうかを返すREST APIです。
使い方は、
1 2 3 4 5 |
$isFan = $this->facebook->api( array( 'method' => 'pages.isfan', 'page_id' => [FacebookページのID], 'uid' => [FacebookユーザのID], )); |
ですね。
結果はtrueかfalseで返ってきます。
これはGraph APIの「/me/likes」に置き換える事ができます。
1 2 |
$result = $this->facebook->api('/me/likes/[FacebookページのID]'); $isFan = $result['data']; |
結果は連想配列で返ってきますので、$result[‘data’]でtrueかfalseを取得できます。
2. users.isappuser
これはあるユーザがFacebookアプリをインストールしているかどうかを判定するREST APIです。
使い方は、
1 2 3 4 |
$installed = $facebook->api(array( 'method' => 'users.isappuser', 'uid' => [FacebookユーザのID] )); |
ですね。
結果はtrueかfalseで返ってきます。
これはFQLに置き換える事ができます。
1 2 3 |
$fql = 'SELECT is_app_user FROM user WHERE uid = [FacebookユーザのID]'; $result = $this->facebook->api('/fql', 'GET', array('q' => $fql)); $installed = $result['data'][0]['is_app_user']; |
結果は連想配列で返ってきますので、$result[‘data’][0][‘is_app_user’]でtrueかfalseを取得できます。メンドイ…
3. pages.isAppAdded
これはあるFacebookページにFacebookアプリをインストールしているかどうかを判定するREST APIです。
使い方は、
1 2 3 4 |
$installed = $facebook->api(array( 'method' => 'pages.isAppAdded', 'page_id' => [FacebookページのID] )); |
ですね。
結果はtrueかfalseで返ってきます。
これはGraph APIで次のように置き換えてみます。
1 2 3 4 5 6 |
$result = $this->facebook->api( '/[FacebookページのID]/tabs/app_[FacebookアプリのID]', 'GET', array('access_token' => $accessToken) ); $installed = count($result['data']); |
結果はcount($result[‘data’])でデータが存在しているかで取得します。
4. friends.getAppUsers
最後に「friends.getAppUsers」です。
これは友達がFacebookアプリをインストールしているかどうかを判定するREST APIです。
ここだけは、JavascriptのSDKで説明します。使い方は、
1 2 3 4 5 6 7 8 9 10 |
FB.getLoginStatus(function(response) { if (response.authResponse) { FB.api( {method: 'friends.getAppUsers'}, function(response) { // 何かしらの処理 } ); } }); |
ですね。
結果はFacebookユーザIDがカンマ区切りの文字列でわらわらと返ってきます。
これはFQLで次のように置き換えてみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
FB.getLoginStatus(function(response) { if (response.authResponse) { FB.api( '/fql/', {q:"SELECT uid, name, pic_square FROM user WHERE uid IN ( SELECT uid2 FROM friend WHERE uid1 = me() LIMIT 500 )"}, function(response) { for( var i = 0; i < response.data.length; i++ ){ alert(response.data[i].name); } } ); } }); |
結果はobjectで返ってきますので、forなどでぐるぐる回して取得します。
5. ちなみに
FQLは呼び出し方が2通り(もっと?)あるようです。
■1. fql.query形式
1 2 3 4 |
$result = $this->facebook->api( array( 'method' => 'fql.query', 'query' => 'SELECT page_id, name, latitude, longitude FROM place WHERE page_id = 178993325461648', )); |
戻り値は
1 2 3 4 5 6 |
$result Array [1] 0 Array [4] page_id 178993325461648 name アライドアーキテクツ(AlliedArchitects,Inc.) latitude 35.6476357984 longitude 139.713671926 |
アクセス先は
1 |
https://api.facebook.com/restserver.php |
■2. /fql形式
1 2 3 4 5 |
$result = $this->facebook->api( '/fql', 'GET', array('q' => 'SELECT page_id, name, latitude, longitude FROM place WHERE page_id = 178993325461648'), ); |
戻り値は
1 2 3 4 5 6 7 |
$result Array [1] data Array [1] 0 Array [4] page_id 178993325461648 name アライドアーキテクツ(AlliedArchitects,Inc.) latitude 35.6476357984 longitude 139.713671926 |
アクセス先は
1 |
https://graph.facebook.com/fql |
と、このように呼び出し方が違うと戻り値の配列の階層、アクセス先が異なるようです。
これには若干注意が必要ですね。
アクセス先を見るところ、/fql形式の方が正しい(推奨)のでしょうかね?
※自分はこれにちょっとハマったので。。当然だろ!という方はゴメンナサイ。
ざっと書きましたが、FacebookのAPI周りの仕様とかって、ぐぐったら色々でてきますが
分かり易い説明(日本語で..)があんまりないんですよね。。
同じようなとこで困ってる人の参考になれば幸いです。
元Javaプログラマ。現在はScala/PlayでWeb開発と、SwiftでiOSアプリ開発をしています。 Unitテストとか書いてる時が一番楽しかったりします。