
facebook logo / marcopako
PHP Advent Calendar jp 2011 13日目を担当します@redsnow_です
前日は@kashiokaさんの2.6公開間近!!Ethnaを5分でインストール | Love Tokyoになります
本日はFacebook Query Language (FQL)を使ってブログの人気記事を簡単に抽出する方法をお届けします
FQLとは
The FQL object enables running FQL queries using the Graph API. Facebook Query Language, or FQL, enables you to use a SQL-style interface to query the data exposed by the Graph API. It provides for some advanced features not available in the Graph API, including batching multiple queries into a single call.
facebookが独自に作ったGraph APIをSQL風に叩くインターフェースのことです
NOT句やORDER BY、LIMITも使えないのでそこをPHPで補って使います
使い方
SELECT url, normalized_url, share_count, like_count, comment_count, total_count, commentsbox_count, comments_fbid, click_count FROM link_stat WHERE url="facebook.com"
見ての通りまんまSQLですね、違うのはAPIを使って実行する部分になります
というわけで作ってみました
<?php// googleのsitemap xmlを使ってurlを抽出する$google_xml_url = 'http://nob-log.info/sitemap.xml';$limit = 10;
// urlのリストを作成する$xml = simplexml_load_file($google_xml_url);
foreach($xml->url as $data){ $urls[] = $data->loc;}
// fqlを作成する$fql = " SELECT url, like_count FROM link_stat WHERE url IN ('". implode("','", $urls). "')";
$fql_query_url = "https://api.facebook.com/method/fql.query?format=json&query=".urlencode($fql);
$fql_query_result = file_get_contents($fql_query_url);$fql_query_obj = json_decode($fql_query_result, true);
foreach ($fql_query_obj as $key => $row) { $like_count[$key] = $row['like_count'];}
array_multisort($like_count, SORT_DESC, $fql_query_obj);
echo '<pre>';print_r(array_slice($fql_query_obj, 0, $limit));echo '</pre>';実行結果
Array ( [0] => Array ( [url] => http://nob-log.info/2011/01/25/ec-cube%e3%81%ab%e3%82%bd%e3%83%bc%e3%82%b7%e3%83%a3%e3%83%ab%e3%83%9c%e3%82%bf%e3%83%b3%e3%82%92%e7%b0%a1%e5%8d%98%e3%81%ab%e8%a8%ad%e7%bd%ae%e3%81%99%e3%82%8b%e6%96%b9%e6%b3%95/ [like_count] => 19 ) [1] => Array ( [url] => http://nob-log.info/2011/03/07/instagram-api%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e3%82%a4%e3%83%ad%e3%82%b9%e3%82%bf%e3%82%b0%e3%83%a9%e3%83%a0%e3%81%a8%e3%81%84%e3%81%86%e3%82%b5%e3%83%bc%e3%83%93%e3%82%b9%e3%82%92%e4%bd%9c/ [like_count] => 4 ) [2] => Array ( [url] => http://nob-log.info/2011/01/21/ec-cube2-11-0-beta%e3%81%8c%e3%83%aa%e3%83%aa%e3%83%bc%e3%82%b9%e3%81%95%e3%82%8c%e3%81%9f%e3%81%ae%e3%81%a7%e3%83%ac%e3%83%93%e3%83%a5%e3%83%bc%e3%81%97%e3%81%a6%e3%81%bf%e3%82%8b/ [like_count] => 2 ) [3] => Array ( [url] => http://nob-log.info/2011/01/15/%e3%83%96%e3%83%ad%e3%82%b0%e7%a7%bb%e8%bb%a2%e3%81%97%e3%81%be%e3%81%97%e3%81%9f%ef%bc%81%ef%bc%81/ [like_count] => 1 ) [4] => Array ( [url] => http://nob-log.info/2011/01/17/%e7%9f%a5%e4%ba%ba%e3%81%ae%e3%81%95%e3%81%8f%e3%82%89vps%e3%81%8c%e4%b8%8d%e6%ad%a3%e3%82%a2%e3%82%af%e3%82%bb%e3%82%b9%e3%81%95%e3%82%8c%e3%81%9f%e3%82%88%e3%81%86%e3%81%aa%e3%81%ae%e3%81%a7/ [like_count] => 1 ) [5] => Array ( [url] => http://nob-log.info/2011/01/18/%e3%81%95%e3%81%8f%e3%82%89vps%e3%81%a7%e3%83%a1%e3%83%bc%e3%83%ab%e3%81%ae%e8%a8%ad%e5%ae%9a%e3%82%92%e3%82%b5%e3%83%9c%e3%81%a3%e3%81%9f%e3%82%89gmail%e3%81%ab%e5%b1%8a%e3%81%8b%e3%81%aa%e3%81%8b/ [like_count] => 1 ) [6] => Array ( [url] => http://nob-log.info/2011/02/22/yum%e3%81%a7subversion%e3%82%92%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab/ [like_count] => 1 ) [7] => Array ( [url] => http://nob-log.info/2011/03/31/earthquake-in-japan/ [like_count] => 1 ) [8] => Array ( [url] => http://nob-log.info/2011/05/07/%e3%83%a2%e3%83%ab%e3%83%87%e3%82%a3%e3%83%96%e3%83%80%e3%82%a4%e3%83%93%e3%83%b3%e3%82%b0%e3%81%ae%e7%9b%ae%e6%ac%a1/ [like_count] => 1 ) )
- ブログの人気記事の抽出するのでgoogleのsitemap.xmlを解析してURL一覧を取得
- FQLを使ってlink_statをselect
- 結果をarray_multisortでlike順に並び替え
- array_sliceで10位までを表示する
人気の記事のURLとlike数は抽出できたので記事のタイトルと紐づけてあげれば、簡単にブログに人気記事を表示出来ちゃいます
→作ってみました、Facebook ランキング
PHPの記事になっているんだかよくわかりませんが、、、FQL便利\(^-^)/
明日は@msngさんになります、よろしくお願いします

iPhoneの連絡先にfacebookの写真を同期も簡単にできた
[PHP で凄く簡単に GET/POST 送信ができる関数を作りました]という記事を修正してみる
homebrewを使ってRictyを導入してみた
Imagickの基本的な使い方
DOCOMOのSSLで問題が起きたのでContent-Lengthを出力するようにした話
facebookで重要なアップデートのみにしたら元に戻せなくなった
「YARPP」と「Auto Post Thumbnail」を使って関連記事に画像を表示しつつ、画像がない場合はno-imageを表示してみた