Получение акций Google Plus для заданного URL-адреса в PHP

Я хочу получить количество акций в Google Plus для заданного URL-адреса в PHP. Я нашел эту функцию для этого:

function get_shares_google_plus($url) {
  $curl = curl_init();
  curl_setopt($curl, CURLOPT_URL, "https://clients6.google.com/rpc");
  curl_setopt($curl, CURLOPT_POST, 1);
  curl_setopt($curl, CURLOPT_POSTFIELDS, '[{"method":"pos.plusones.get","id":"p","params":{"nolog":true,"id":"' . $url . '","source":"widget","userId":"@viewer","groupId":"@self"},"jsonrpc":"2.0","key":"p","apiVersion":"v1"}]');
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-type: application/json'));
  $curl_results = curl_exec ($curl);
  curl_close ($curl);
  $json = json_decode($curl_results, true);
  print_r($json);
  return intval( $json[0]['result']['metadata']['globalCounts']['count'] );
}

Однако я всегда получаю одно и то же сообщение: Notice: Undefined index: result in ....

Я делаю print_r($json) и получаю: Array ( [0] => Array ( [error] => Array ( [code] => 400 [message] => Invalid Value [data] => Array ( [0] => Array ( [domain] => global [reason] => invalid [message] => Invalid Value ) ) ) [id] => p ).

Какие-либо предложения?


person Pepe López    schedule 12.09.2012    source источник


Ответы (3)


RPC API никогда не предназначался для публичного использования, и Google изменил аутентификацию, чтобы предотвратить злоупотребления. Таким образом, код, который вы разместили, больше не работает. Однако я нашел гораздо более простое решение:

Обновление (23.01.2013): Google заблокировал этот URL в декабре 2012 года, поэтому этот метод больше не работает!
Обновление (15.05.2013): метод снова работает!

<?php
/**
 * Get the numeric, total count of +1s from Google+ users for a given URL.
 * @author          Stephan Schmitz <[email protected]>
 * @copyright       Copyright (c) 2013 Stephan Schmitz
 * @license         http://eyecatchup.mit-license.org/  MIT License
 * @link            <a href="https://gist.github.com/eyecatchup/8495140">Source</a>.
 * @param   $url    string  The URL to check the +1 count for.
 * @return  intval          The total count of +1s.
 */
function getGplusShares($url) {
    $url = sprintf('https://plusone.google.com/u/0/_/+1/fastbutton?url=%s', urlencode($url));
    preg_match_all('/{c: (.*?),/', file_get_contents($url), $match, PREG_SET_ORDER);
    return (1 === sizeof($match) && 2 === sizeof($match[0])) ? intval($match[0][1]) : 0;
}

Обновление (18.01.2014): Вот улучшенная версия, в которой используется curl, резервный хост и выполняется некоторая обработка ошибок (последнюю версию можно найти здесь https://gist.github)..com/eyecatchup/8495140).

<?php
/**
 * GetPlusOnesByURL()
 *
 * Get the numeric, total count of +1s from Google+ users for a given URL.
 *
 * Example usage:
 * <code>
 *   $url = 'http://www.facebook.com/';
 *   printf("The URL '%s' received %s +1s from Google+ users.", $url, GetPlusOnesByURL($url));
 * </code>
 *
 * @author          Stephan Schmitz <[email protected]>
 * @copyright       Copyright (c) 2014 Stephan Schmitz
 * @license         http://eyecatchup.mit-license.org/  MIT License
 * @link            <a href="https://gist.github.com/eyecatchup/8495140">Source</a>.
 * @link            <a href="http://stackoverflow.com/a/13385591/624466">Read more</a>.
 *
 * @param   $url    string  The URL to check the +1 count for.
 * @return  intval          The total count of +1s.
 */
function GetPlusOnesByURL($url) {
    !$url && die('No URL, no results. ;)');

    !filter_var($url, FILTER_VALIDATE_URL) &&
        die(sprintf('PHP said, "%s" is not a valid URL.', $url));

    foreach (array('apis', 'plusone') as $host) {
        $ch = curl_init(sprintf('https://%s.google.com/u/0/_/+1/fastbutton?url=%s',
                                      $host, urlencode($url)));
        curl_setopt_array($ch, array(
            CURLOPT_FOLLOWLOCATION => 1,
            CURLOPT_RETURNTRANSFER => 1,
            CURLOPT_SSL_VERIFYPEER => 0,
            CURLOPT_USERAGENT      => 'Mozilla/5.0 (Windows NT 6.1; WOW64) ' .
                                      'AppleWebKit/537.36 (KHTML, like Gecko) ' .
                                      'Chrome/32.0.1700.72 Safari/537.36' ));
        $response = curl_exec($ch);
        $curlinfo = curl_getinfo($ch);
        curl_close($ch);

        if (200 === $curlinfo['http_code'] && 0 < strlen($response)) { break 1; }
        $response = 0;
    }
    !$response && die("Requests to Google's server fail..?!");

    preg_match_all('/window\.__SSR\s\=\s\{c:\s(\d+?)\./', $response, $match, PREG_SET_ORDER);
    return (1 === sizeof($match) && 2 === sizeof($match[0])) ? intval($match[0][1]) : 0;
}

Обновление (02.11.2017): Счетчик +1 официально удален! Как было объявлено в этой публикации Google+ менеджера по продукту Джона Нэка, Google недавно удалил счетчик репостов ( aka +1 Count) с помощью своих кнопок веб-поделиться. (Они утверждают, что цель этого шага – ускорить загрузку кнопки +1 и окна общего доступа.)

person eyecatchUp    schedule 14.11.2012
comment
Хм, кажется, они заблокировали его. Однако, если вы используете HTTPS, он все еще работает (обновленный ответ). - person eyecatchUp; 25.11.2012
comment
Хороший обходной путь! Он также может сломаться, если Google изменит материал, но пока это не произойдет ... (действительно не понимаю, почему Google не дает легкого доступа к этому, например, к fb и twitter) - person gingerlime; 25.11.2012
comment
Ага, я тоже не понимаю. Особенно если учесть тот факт, что Google определил этот тег ‹meta name=interactionCount content=UserPlusOnes:NUMBER_THAT_I_CANT_GET › для schema.org. Так скажите мне, Google, как мы будем писать этот тег, если мы не можем запросить счет? - person eyecatchUp; 25.11.2012
comment
@PepeLópez: Да, он был заблокирован еще в декабре. Однако есть и другой способ получить счет. ;-) - person eyecatchUp; 23.01.2013
comment
Любые обновления в феврале 2014 года для этого? Я получаю 0 для любого URL. Какая боль, а! - person Ben Racicot; 06.02.2014
comment
@BenRacicot Проверьте свои сообщения об ошибках. Код все еще работает для меня - как есть: i.imgur.com/xrjFeX9.jpg - person eyecatchUp; 11.02.2014
comment
Любые обновления по этому поводу. Это действительно нужно. Заметил, что даже в консоли разработчиков нет возможности это получить. - person Adrian; 29.09.2017
comment
@Adrian Как было объявлено в этой записи Google+ менеджера по продукту Джона Нака Google недавно удалила публикацию количество (также известное как +1 количество) с их кнопок веб-поделиться. (Они утверждают, что цель этого шага – ускорить загрузку кнопки +1 и окна общего доступа.) - person eyecatchUp; 02.11.2017

Этот код не будет работать. Кроме того, нет общедоступного API, обеспечивающего этот подсчет.

Этот код использует RPC API, который приводит в действие кнопку +1. Этот API не является официально поддерживаемым API и не предназначен для использования вне внутренней реализации плагинов Google+< /а>.

person mimming    schedule 13.09.2012

Способ cURL и API, перечисленные в других сообщениях здесь, больше не работает.

Все еще есть по крайней мере 1 метод, но он уродлив, и Google его явно не поддерживает. Вы просто вырываете переменную из исходного кода JavaScript для официальной кнопки с регулярным выражением:

function shinra_gplus_get_count( $url ) {
    $contents = file_get_contents( 
        'https://plusone.google.com/_/+1/fastbutton?url=' 
        . urlencode( $url ) 
    );

    preg_match( '/window\.__SSR = {c: ([\d]+)/', $contents, $matches );

    if( isset( $matches[0] ) ) 
        return (int) str_replace( 'window.__SSR = {c: ', '', $matches[0] );
    return 0;
}
person Luke Mlsna    schedule 16.03.2013
comment
Это именно тот код, который я опубликовал пару месяцев назад. Зачем создавать дублированные ответы? - person eyecatchUp; 15.05.2013