Главная / PHP программирование
PHP программирование


Считаем число лайков в соцсетях PDF Печать E-mail
Статьи - PHP программирование

Социальные сети растут и крепчают на опухших глазах веб-разработчиков, прыщавых школьников и гламурных блондинок. Наши глаза пухнут все сильнее и потихоньку выезжают из орбит от все большего числа технологий и постоянно меняющихся api. Поэтому, когда какой-то вопрос (с виду замороченный) удается решить за час-другой, нашему ликованию нет предела. Это именно такой пример.

В последнее время заказчик все чаще хочет иметь не хилую интеграцию соцсетей в свой проект. Вот и моему работодателю пришла в голову мысль строить рейтинг страниц на основании не только внутренних комментариев системы (хотя они, конечно, важней в его глазах, о чем можно поспорить), но и с учетом всех лайков в соцсетях. Ну, думаю, возиться не перевозиться теперь с api для каждой. Ан нет! Разработчики не стали требовать от нашего брата регистрации сайтов и авторизации по qauth2. Стоит просто спросить у сервисов о количестве лайков и они с радостью и на свой лад расскажут нам об этом.

Я написал серверный вариант, который расскажет нам про число лайков для отдельно взятой страницы. Недостатком, пожалуй, можно считать неумение работать с кириллическими урлами. Но этот недостаток Вы, уверен, легко устраните, если подобная необходимость возникнет. Скрипт использует curl и работает на большинстве хостингов (уж curl-то есть везде).

Да еще... Адреса с www и без такового являются различными, что тоже легко поправить, если считать лайки для обоих вариантов. И последнее... Урл в адресную строку нужно вводить польностью (http://урл).

Приведенный ниже скрипт умеет считать количество нажатий на кнопки like для семи социальных сетей:

  1. Вконтакте
  2. Facebook
  3. Twitter
  4. Одноклассники
  5. Мой Мир от Mail.ru
  6. Я.ру
  7. 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;
}
 
<< Начало < Предыдущая 1 2 3 4 5 6 7 8 9 Следующая > Последняя >>

Страница 1 из 9