По долгу работы пришлось собирать лайки из указанных социалок для построения рейтинга. Так как соотвествующие виджеты со счетчиками подгружаются в реальном времени, построить общий рейтинг по этим данных не получиться. Для этого надо собрать их в БД, в соотвестующие поля, и сортировать по ним при выводе списка.
Товарищи с Facebook крайне обходительны, поэтому достать "лайки" определенной ссылки (пользователи сайта лайкали ссылку на страницу) можно как в разных вариация (только likes, только shares, и likes+shares), так и разными способами (api.facebook.com, graph.facebook.com). Так как на виджете отображается количество likes+количество shares, было решено в рейтинге тоже использовать его. Собственно, код:
[PHP]
$link = 'http://your-host.org/path/to/page'; /* url страницы, лайки которой, собственно достаем */
/**
* Для получения данных из системы Facebook использует FQL
* Facebook Query Language, который похож на SQL, лишь с несколькими
* ньюансами, подробнее -
http://developers.facebook.com/docs/reference/fql/ */
/* кодируем запрос на получение количества лайков+количество шейров нашей страницы */
$fql = urlencode("SELECT total_count FROM link_stat WHERE url=\"{$link}\"");
$fbLink = 'http://api.facebook.com/method/fql.query?query='; /* адрес api facebook'а */
/*
* Конкатенируем адрес api с нашим запросом и получаем результат запроса
*
http://api.facebook.com/method/fql.query?query=YOUR_FQL вернет XML с лайками,
* в то же время, как
http://graph.facebook.com/YOUR_URL вернет JSON с лайками +
* информацией, которую система собрала из ваших Open Graph мета-тэгов
* Так как мне нужны только лайки - я выбрал вариант #1
*/
$response = file_get_contents($fbLink.$fql);
$fbXML = simplexml_load_string($response); /* Из полученного xml создаем объект */
/*
* И собственно достаем количество лайков нашей страницы
* здесь использовал явное преобразование типа, так как конструкция
* $fbXML->link_stat->total_count возвращала DOMNodeList
*/
$facebook_likes = (int)$fbXML->link_stat->total_count;[/PHP]
Если с Facebook проблем ну вообще никаких, то отечественная социалка "порадовала".
Все что гуглилось, так это запросы в их систему по адресу
http://vkontakte.ru/share.php?act=count&index=1&url=YOUR_URL
На что в результате получали следующее содержимое:
VK.Share.count(1, SHARES_COUNT);
Но вот в че беда: здесь ТОЛЬКО количество shares, то есть, когла пользователь кликает по кнопке "Мне нравиться" у вас на странице, над вижджетом появляется блок, в котором он видит список своих друзей, которые уже лайкали эту страницу, и чекбокс "Рассказать друзьям".
Вот, API Вконтакте возвращает количество "рассказов" друзьям, а в виджете показывает количество лайков + "рассказов". Было решено парсить виджет.
Виджет отрисовывается на странице вашего сайта через iframe. Он (виджет) может отрисовать себя в нескольких вариантах, за это отвечает параметр type, который передается в систему. Обычная кнопка с сердечком + надпись "Мне нравиться" + счетчик справа соотвествует значению button. Этот вариант виджет светиться на странице, там он меня устраивает. Для парсинга я выбрал минимал вариант: кнопка с лого и сердечком + счетчик срава. Может не намного меньше кода передается, но все же :)
Итак, код:
[PHP]
/**
* Ссылка получения виджета, параметр app выдается системой
* при регистрации сайта/приложения в ВК, когда вы хотите прикрутить себе их виджет.
* Опять таки, адрес вашей страницы нужно перекодировать
*/
$vkLink = 'http://vk.com/widget_like.php?app=1111111&type=mini&url='.urlencode($link);
$vkDom = new DOMDocument('1.0', 'UTF-8'); /* я парсил виджет через DOMDocument */
$vkDom->loadHTMLFile($vkLink); /* грузим HTML из файла */
$vkXPath = new DOMXPath($vkDom); /* для обхода виджет использовал XPath */
/**
* Нужное количество лайков+шейров лежит по следующему пути
* div id="main" => a (счетчик является и ссылкой) =>
* div class="like_counter => span#stats_num
* Достать его можно следующим xpath-запросом
*/
$entries = $vkXPath->query(".//div[@id='main']/a/div[@class='like_counter']/span[@id='stats_num']");
/**
* В результате запроса получаем список элементов
* По скольку в виджете счетчик у нас один, значит
* значение первого элемента и достаем
*/
$nodeValue = $entries->item(0)->nodeValue;
/**
* Если страницу еще не лайкали, система возвращает значение '+1',
* в этом случае мы значение заменяем на 0, в другом - просто пишем то,
* что вернули
*/
$vk_likes = ($nodeValue == '+1') ? '0' : $nodeValue;[/PHP]
Собственно все, у меня скрипт получения статы из социалок висит в кроне на каджые 15 минут. Вдруг кому пригодиться.