Получение акций 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 )
.
Есть предложения?
3 ответа:
API RPC никогда не предназначался для публичного использования, и Google изменил аутентификацию, чтобы предотвратить злоупотребление. Таким образом, код, который вы опубликовали, больше не работает. Однако я нашел гораздо более простое решение:
Update (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 <eyecatchup@gmail.com> * @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, a резервный хост и выполняет некоторую обработку ошибок (последнюю версию можно найти здесь 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 <eyecatchup@gmail.com> * @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 недавно удалил счетчик акций (Он же +1 Count) из своих кнопок веб-обмена. (Они утверждают, что цель этого хода-сделать кнопку +1 и общий ящик загруженными больше быстро.)
Этот код не будет работать. Кроме того, нет общедоступного API, который обеспечивает этот счетчик.
Этот код использует API RPC, который приводит в действие кнопку +1. Этот API не является официально поддерживаемым API и не предназначен для использования вне внутренней реализации плагинов Google+ .
Способ 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; }