Автору статьи понадобилось получить счетчики для серии ссылок, чтобы отсортировать их по рангу популярности. Но Google не предоставляет информацию об API Google +1, и поэтому на помощь нам приходит Firebug.

Анализ кнопки будем проводить на примере сайта vote2012.fr

Чистая вкладка в Firebug’e выглядит следующим образом:

Screen-shot-2011-07-04-at-1.04.48-AM-1024x273.png

Отсортировав запросы по доменам, находим запросы на Google

Screen-shot-2011-07-04-at-1.07.57-AM.png

Видим, что есть несколько запросов к хосту plusone.google.com. Откроем запрос в новой вкладке

Screen-shot-2011-07-04-at-1.15.17-AM-300x120.png

Мы получаем страницу со счетчиком Google +1

Screen-shot-2011-07-04-at-1.18.08-AM1.png

Воспользуемся снова Firebug’ом и перезагрузим страницу. Мы еще не достигли существенного прогресса, но мы смогли изолировать вызовы, относящиеся к этой кнопке. Воспользуемся одной из возможностей Firebug’а: возможностью поиска в коде/странице связанной со вкладкой. Так что давайте найдем строку «vote2012.fr». Мы получаем:

Screen-shot-2011-07-04-at-1.21.49-AM.png

Похоже, мы нашли то, что мы искали. Если посмотрим внимательнее на вызов, то заметим, что это POST запрос на URL https://clients6.google.com/rpc?key=AIzaSyCKSbrvQasunBoV16zDH9R33D88CeLr9gQ

POST параметры выглядят следующим образом:

Screen-shot-2011-07-04-at-1.31.58-AM.png

Именно то, что нам нужно! Заметим, что в запросе используется нестандартный заголовок:

Content-Type:application/json; charset=UTF-8

вместо обычного:

Content-Type:application/x-www-form-urlencoded

Теперь, если мы посмотрим более внимательно на параметры, получим:

Screen-shot-2011-07-04-at-1.43.17-AM.png

Итак, в основе лежит JSON-RPC. Давайте попробуем повторить поиск в PHP

$url = 'http://vote2012.fr/';
$requests[] = array(
    'apiVersion' => 'v1',
    'id'      => 'p',
    'jsonrpc' => '2.0',
    'key' => 'p',
    'method'  => 'pos.plusones.get',
    'params'  => array("nolog" => "true", "id" => $url, "source" => "widget", "container" => $url, "userId" => "@viewer", "groupId" => "@self"),
);
$json_request = json_encode($requests);
$ctx = stream_context_create(array(
    'http' => array(
        'method'  => 'POST',
        'header'  => 'Content-Type: application/json\r\n',
        'content' => $json_request
    )
));
$json_response = file_get_contents('https://clients6.google.com/rpc?key=AIzaSyCKSbrvQasunBoV16zDH9R33D88CeLr9gQ', false, $ctx); 

print_r(json_decode($json_response, true));

И мы получаем:

Array
(
[0] => Array
(
[result] => Array
(
[kind] => pos#plusones
[id] => http://vote2012.fr/
[isSetByViewer] =>
[metadata] => Array
(
[type] => URL
[globalCounts] => Array
(
[count] => 0
)
)
)
[id] => p
)
)

  • Oleksa Zelenyuk

    Благодарю за хак! Очень полезную работу сделал. Все у этого гуглоплюса как-то сложно…