Сейчас, наверное, уже нет блога, на котором бы под каждым постом не было бы набора из разнообразных кнопок социальных сетей.

Делается это для того, чтобы пользователи могли легко и просто поделиться («лайкнуть») понравившимся им контентом.

Исходя из той логики, что интересный или полезный контент «лайкают» чаще, владельцы сайтов могли бы сделать подборку лучших новостей всего ресурса, или какой-то отдельной рубрики. Например, на основании количества «лайков» легко сделать топ-10 самых популярных статей блога.

Для этого нужно показатели счетчика социальных кнопок как-то получить и обработать. Единого и универсального способа сделать это — нет, но это совсем не страшно :). Просто нужно учесть особенности каждой отдельно взятой социальной сети.

Получаем значения напрямую через API

Такие социальные сети как Facebook и Twitter имеют общедоступное API, с помощью которого получение нужных нам цифр лишь дело техники.

Например, чтобы узнать количество Facebook-лайков статьи про мои рассуждения о сервисах сокращения ссылок достаточно сделать запрос вида http://graph.facebook.com/http://codinghamster.info/c-php/p-how-does-url-shortener-work/.

Ответом на такой запрос будет следующий json-обьект:

    {
        "id": "http://codinghamster.info/c-php/p-how-does-url-shortener-work/",
        "shares": 1
    }

Количество tweet-ов определяется аналогичным образом — по адресу http://urls.api.twitter.com/1/urls/count.json?url=http://codinghamster.info/c-php/p-how-does-url-shortener-work/.

    {"count":1,"url":"http:\/\/codinghamster.info\/c-php\/p-how-does-url-shortener-work\/"}

Всё что нам остаётся сделать это взять нужное свойство полученного обьекта: shares и count соответственно.

С этой целью я написал две функции на php, которые выдают требуемые значения или false в случае ошибки.

    function fb_likes($url) {
        $json = json_decode(@file_get_contents("http://graph.facebook.com/".urlencode($url)));
        return $json !== false ? intval($json->shares) : false;
    }
    
    function tweets($url) {
        $json = json_decode(@file_get_contents("http://urls.api.twitter.com/1/urls/count.json?url=".urlencode($url)));
        return $json !== false ? intval($json->count) : false;
    }

Парсим значения из кода кнопок

В некоторых случаях открытого API нет, как же быть тогда? Есть одна хитрость :).

Дело в том, что каждая кнопка это iframe. И адрес с которого он загружается у каждой социальной сети свой. Узнать его можно с помощью Firebug или аналогичной утилиты.

Полный адрес с которого загружается кнопка +1 от Google очень длинный, но весь он нам и не нужен, достаточно будет только https://plusone.google.com/_/+1/fastbutton?url=http%3A%2F%2Fcodinghamster.info%2Fc-php%2Fp-how-does-url-shortener-work%2F&count=true.

Если перейти по этому адресу, то откроется страница где будет кнопка +1 и ничего больше. Это нам и нужно ведь где-то в коде этой страницы и находится нужная нам цифра.

Теперь нужно лишь написать функцию, которая будет находить и возвращать это значение из кода страницы или false в случае ошибки.

    function plusones($url) {
        $html = @file_get_contents("https://plusone.google.com/_/+1/fastbutton?url=".urlencode($url)."&count=true");
        preg_match('#<div id="aggregateCount" class=".*">([0-9]+)</div>#', $html, $matches);
        return (count($matches) > 1) ? intval($matches[1]) : false;
    }

С помощью такого подхода можно получить значение счетчика практически любой кнопки. Но в тоже время этот метод менее надежен, как API, так как смена верстки кнопки приведет к потере работоспособности функции.

Вот еще две функции для получения данных уже из сети Вконтакте: для кнопки «Сохранить» и виджета «Мне нравится» соответсвенно.

    function vk_shares($url) {
        $str = @file_get_contents("http://vk.com/share.php?act=count&index=1&url=".urlencode($url));
        preg_match('#VK.Share.count\(1, ([0-9]+)\);#', $str, $matches);
        return (count($matches) > 1) ? intval($matches[1]) : false;
    }
    
    function vk_likes($url, $api_id) {
        $html = @file_get_contents("http://vk.com/widget_like.php?app={$api_id}&url=".urlencode($url)."&type=button");
        preg_match('#<span id="stats_num">([0-9]+)</span>#', $html, $matches);
        return (count($matches) > 1) ? intval($matches[1]) : false;
    }

Обратите внимание, что для виджета «Мне нравится» в связи с особенностью его реализации, вторым параметром нужно указать $api_id сайта, на котором размещена кнопка.

Послесловие

Скачать все функции из статьи в одном файле можно отсюда.

Хочу предупредить, что в какой-то момент времени может так получится, что эти методы перестанут работать. Изменится верстка и всё. Но, используя описанный во втором случае подход, можно без особого труда исправить работу функций, а также с легкостью написать парсеры для других социалок.

Вот и всё. Удачи и успехов :).

Рассказать друзьям: