« 02.09 Facebook Graph API でいいね!取り | ココ | 02.12 カニ食べいこー »

2011年2月11日

FQLでいいね!取り  このエントリーを含むはてなブックマーク 

前回(Erbe 11.02.09)、自分の投稿に対して「いいね!」してくれている友達(とその数)の一覧を取得するコードを書いてみたけど、それぞれの投稿について「いいね!」をしているユーザーを取得するAPIを発行しているので、時間がかかってしまう。

というわけで、この「いいね!」している友達を取得する処理を全部サーバー側でやってしまおうかと。

そこで使うのがFQL。Facebookのデータベースに対してSQLっぽい文法を使ってクエリーを発行して、結果を取得することができる。そうすれば処理時間は短くなる、はず。


FQLをPHPで使うには、$facebook->api()で、array('method'=>'fql.query', 'query'=>QUERY, 'access_token'=>$access_token)を渡します。それに気づくのにどんなけかかったことか。検索すると、普通に旧版のPHPライブラリでの使用法しか出てこないし…。

上記のfql.queryメソッドでは、SQLのように結合ができない仕様になっているので、一気に関連テーブルの内容を取得したりということができないようになっています。重い処理はできるだけしないような仕組みなので仕方ないでしょう。代わりに、複数のFQLをまとめてバッチ処理のように投げることができるようになっています。fql.multiqueryメソッドを使い、$facebook->api()で、array('method'=>'fql.multiquery', 'queries'=array(QUERY-hash), 'access_token'=>$access_token)を渡します。

例えば、アクセストークンを取得した後のコードとHTMLを以下のように置き換える。

$access_token = $facebook->getAccessToken();

$result = $facebook->api(array('method'=>'fql.multiquery',
        'queries'=>array(
            'q1' => 'SELECT post_id,message FROM stream WHERE source_id = me()',
            'q2' => 'SELECT post_id,user_id FROM like WHERE post_id IN (SELECT post_id FROM #q1)',
            'q3' => 'SELECT id,name,url,pic FROM profile WHERE id IN (SELECT user_id FROM #q2)'),
        'access_token'=>$access_token));

...

  <body>
    <tt>
    <?php print str_replace(array("\r","\n","\r\n"), "<br/>",
                str_replace(" ", "&nbsp;", print_r($result, true))); ?>
    </tt>

  </body>

すると、↓のように結果が表示される。"q1"に"SELECT post_id,message FROM stream~"、"q2"に"SELECT post_id,user_id FROM like~"、"q3"に"SELECT id,name,url,pic FROM profile~"の結果が代入されて、一連のクエリーでは"#q1"などとすると副問い合わせと同じ効果を得られると。

Array
(
    [0] => Array
        (
            [name] => q1
            [fql_result_set] => Array
                (
                    [0] => Array
                        (
                            [post_id] => 100001407076553_167495089964651
                            [message] => さあ、がんばって書かねば。
                        )

                    [1] => Array
                        (
                            [post_id] => 100001407076553_181279925247277
                            [message] => \これぞ!/
                        )

                    [2] => Array
                        (
                            [post_id] => 100001407076553_188070427894601
                            [message] => きょうは控えめに。
                        )

                    [3] => Array
                        (
                            [post_id] => 100001407076553_178593435517046
                            [message] => I ♡
                        )
...

さあ、この結果をあとはJQuery mobileとかで画面に出力する…と。

By ただ at 23:32 カテゴリー ; PinMarch Samples , プログラミング単語帳 , プログラミングとか

« 02.09 Facebook Graph API でいいね!取り | 02月の記事 | 02.12 カニ食べいこー »




トラックバック

このエントリーのトラックバックURL:
http://pinmarch.sakura.ne.jp/mt/mt-tb.cgi/1716