Социальные сети растут и крепчают на опухших глазах веб-разработчиков, прыщавых школьников и гламурных блондинок. Наши глаза пухнут все сильнее и потихоньку выезжают из орбит от все большего числа технологий и постоянно меняющихся api. Поэтому, когда какой-то вопрос (с виду замороченный) удается решить за час-другой, нашему ликованию нет предела. Это именно такой пример.
В последнее время заказчик все чаще хочет иметь не хилую интеграцию соцсетей в свой проект. Вот и моему работодателю пришла в голову мысль строить рейтинг страниц на основании не только внутренних комментариев системы (хотя они, конечно, важней в его глазах, о чем можно поспорить), но и с учетом всех лайков в соцсетях. Ну, думаю, возиться не перевозиться теперь с api для каждой. Ан нет! Разработчики не стали требовать от нашего брата регистрации сайтов и авторизации по qauth2. Стоит просто спросить у сервисов о количестве лайков и они с радостью и на свой лад расскажут нам об этом.
Я написал серверный вариант, который расскажет нам про число лайков для отдельно взятой страницы. Недостатком, пожалуй, можно считать неумение работать с кириллическими урлами. Но этот недостаток Вы, уверен, легко устраните, если подобная необходимость возникнет. Скрипт использует curl и работает на большинстве хостингов (уж curl-то есть везде).
Да еще... Адреса с www и без такового являются различными, что тоже легко поправить, если считать лайки для обоих вариантов. И последнее... Урл в адресную строку нужно вводить польностью (http://урл).
Приведенный ниже скрипт умеет считать количество нажатий на кнопки like для семи социальных сетей:
- Вконтакте
- Facebook
- Twitter
- Одноклассники
- Мой Мир от Mail.ru
- Я.ру
- Pinterest
На момент публикации статьи (май 2012) нашел не слишком изящный способ подсчитать число нажатий для кнопки google+1. Если кто знает, как это сделать лучше, напишите пожалуйста в комментах.
<?php //ini_set('display_errors', 1);
$url = !empty($_REQUEST['url']) ? $_REQUEST['url'] : 'http://google.ru'; //$url = urlencode($url);
$ch = curl_init(); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
//vkontakte $vk_query = 'http://vk.com/share.php?act=count&index=1&url='.$url; //facebook $fb_query = 'http://graph.facebook.com/?ids='.$url; //twitter $tw_query = 'http://urls.api.twitter.com/1/urls/count.json?callback=twttr.receiveCount&url='.$url; //Одноклассники $od_query = 'http://www.odnoklassniki.ru/dk?st.cmd=extLike&uid=odklcnt0&ref='.$url; //Мой Мир от Mail.ru $mm_query = 'http://connect.mail.ru/share_count?callback=1&func=YOUR_CALLBACK&url_list='.$url; //Я.ру $ya_query = 'http://wow.ya.ru/ajax/share-counter.xml?url='.$url; //Pinterest $pi_query = 'http://api.pinterest.com/v1/urls/count.json?callback=YOUR_CALLBACK&url='.$url;
curl_setopt($ch, CURLOPT_URL, $vk_query); $vk = curl_exec ($ch);
curl_setopt($ch, CURLOPT_URL, $fb_query); $fb = curl_exec ($ch);
curl_setopt($ch, CURLOPT_URL, $tw_query); $tw = curl_exec ($ch);
curl_setopt($ch, CURLOPT_URL, $od_query); $od = curl_exec ($ch);
curl_setopt($ch, CURLOPT_URL, $mm_query); $mm = curl_exec ($ch);
curl_setopt($ch, CURLOPT_URL, $ya_query); $ya = curl_exec ($ch);
curl_setopt($ch, CURLOPT_URL, $pi_query); $pi = curl_exec ($ch);
function vk_parse($vk){ $vk = str_replace('VK.Share.count(1, ', '', $vk); $vk = str_replace(');', '', $vk); return (int)$vk; }
function fb_parse($fb){ //string(73) "{"http:\/\/www.starhit.ru":{"id":"http:\/\/www.starhit.ru","shares":300}}" global $url; $fb = json_decode($fb); settype($fb, 'array'); $fb = $fb[$url]; settype($fb, 'array'); return !empty($fb['shares']) ? (int)$fb['shares'] : 0; }
function tw_parse($tw){ //string(63) "twttr.receiveCount({"count":27,"url":"http://www.starhit.ru/"})" preg_match ( "/twttr.receiveCount\({\"count\":([\d]+).*/i", $tw, $mathes ); return (int)$mathes[1]; }
function od_parse($od){ //string(35) "ODKL.updateCount('odklcnt0','458');" $od = str_replace("ODKL.updateCount('odklcnt0','", "", $od); $od = str_replace("');", "", $od); return (int)$od; }
function mm_parse($mm){ //"YOUR_CALLBACK( { "http://www.starhit.ru":{"shares":3,"clicks":2} }); $m = preg_match ( "/\"shares\":([\d]+),\"clicks\":([\d]+)/i", $mm, $mathes ); return $m ? array( 'shares'=>(int)$mathes[1], 'clicks'=>(int)$mathes[2] ) : array( 'shares'=>0, 'clicks'=>0 ); }
function ya_parse($ya){ //string(69) "if (window.Ya && window.Ya.Share ) { Ya.Share.showCounter( 15 ) }" $ya = str_replace('if (window.Ya && window.Ya.Share ) { Ya.Share.showCounter(', '', $ya); $ya = str_replace(') }', '', $ya); return (int)$ya; }
function pi_parse($pi){ //string(54) "YOUR_CALLBACK({"count": 0, "url": "http://google.ru"})" $m = preg_match ( "/\"count\":[ ]+([\d]+)/i", $pi, $mathes ); return $m ? (int)$mathes[1] : 0; }
echo '<b>'.$url.'</b><hr/>'; echo '<b>VK: </b>';var_dump(vk_parse($vk));echo '<hr/>'; echo '<b>FB: </b>';var_dump(fb_parse($fb));echo '<hr/>'; echo '<b>TWITTER: </b>';var_dump(tw_parse($tw));echo '<hr/>'; echo '<b>ODNKL: </b>';var_dump(od_parse($od));echo '<hr/>'; echo '<b>MOY MIR: </b>';var_dump(mm_parse($mm));echo '<hr/>'; echo '<b>YA.RU: </b>';var_dump(ya_parse($ya));echo '<hr/>'; echo '<b>PINTEREST: </b>';var_dump(pi_parse($pi));echo '<hr/>';
З.Ы. Вконтакте отображает неточные цифры, которые не совпадают с цифрами на кнопках. С чем это связано, я по ка не понял. Могу только догадываться. Вероятно с тем, что пересчет значений осуществляется редко в целях экономии ресурсов.
Для Вконтакте можете использовать запрос с авторизацией, который возвращает точные данные:
function vk_likes_with_auth(){ global $url; $app_id = *******; $app_secret = '********************'; require 'admin/classes/vkapi.class.php'; //нужно скачать с http://vkontakte.ru/source/APIServerPHPClass.zip
$VK = new vkapi($app_id, $app_secret);
$resp = $resp = $VK->api('likes.getList', array('type'=>'sitepage', 'owner_id'=>$app_id, 'page_url'=>$url)); return empty($resp['error']) ? (int)$resp['response']['count'] : $resp['error']['error_msg']; }
З.Ы.2 Черезжопный способ подсчета лайков google+
//черезжопный способ подсчета google+1 function google_plus(){ global $url, $ch; curl_setopt($ch, CURLOPT_URL, "https://plusone.google.com/_/+1/fastbutton?url=$url"); $curl_results = curl_exec ($ch); preg_match ( "/window.__SSR = {c:\s?([^.]+)/i", $curl_results, $mathes ); return !empty($mathes[1]) ? (int)$mathes[1] : 0; }
|