Попытка входа в Google для загрузки данных Google Trends
Я пытаюсь:
- Войдите в Google
- Загрузить CSV-данные из Google Trends
Я преуспеваю в (1), но не в (2). Я получаю авторизационный токен от Google и отправляю его с последующим запросом в Trends, но, тем не менее, Google затем возвращает ошибку: "Для экспорта данных из Google Trends необходимо войти":
// http://code.google.com/apis/accounts/docs/AuthForInstalledApps.html
$data = array(
'accountType' => 'GOOGLE',
'Email' => '[email protected]',
'Passwd' => 'my.password',
'service' => 'trendspro',
'source' => 'company-application-1.0'
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://www.google.com/accounts/ClientLogin");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_HTTPAUTH, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
preg_match("/Auth=([a-z0-9_\-]+)/i", $response, $matches);
// We now have an authorization-token
$headers = array(
"Authorization: GoogleLogin auth=" . $matches[1],
"GData-Version: 3.0"
);
curl_setopt($ch, CURLOPT_URL, "http://www.google.com/trends/viz?q=MSFT&date=2011-2&geo=all&graph=all_csv&sort=0&sa=N");
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_POST, false);
$csv = curl_exec($ch);
curl_close($ch);
// Returns : "You must be signed in to export data from Google Trends"
// Expected: CSV data stream
print_r($csv);
По какой-то причине, аутентификаторы, которые я отправляю в Google Trends, не принимаются или игнорируются. Я не знаю точно, что происходит, поскольку дополнительная информация об ошибке не указана.
Кто-нибудь видит, что я делаю неправильно? Если вы можете заставить его работать, а это означает, что Google возвращает данные CSV, то щедрость ваша, и у нас обоих есть поздний рождественский подарок:-)
Итак, я понял, что проблема не имеет ничего общего с cURL. Я сделал это:
SID=DQAAAMUAAADMqt...aYPaYniC_iW
LSID=DQAAAMcAAACI5...YDTBDt_xZC9
Auth=DQAAAMgAAABm8...trXgqNv-g0H
GData-Version: 3.0
Authorization: GoogleLogin auth=DQAAAMgAAABm8...trXgqNv-g0H
заголовки:
Date: Tue, 27 Dec 2011 00:17:20 GMT
Content-Encoding: gzip
Content-Disposition: filename=trends.csv
Content-Length: 97
X-XSS-Protection: 1; mode=block
Server: Google Trends
X-Frame-Options: SAMEORIGIN
Content-Type: text/csv; charset=UTF-8
Cache-Control: private
Данные:
You must be signed in to export data from Google Trends
Другими словами, я отправляю заголовки, определенные Google, на http://code.google.com/apis/accounts/docs/AuthForInstalledApps.html, но не удастся получить правильный возврат. В нем есть информация о * no * об Interwebs. Кто знает, в чем проблема?
Ответы
Ответ 1
После проверки кода проблема заключается в том, что для Google Trends необходим ключ SID
, а не Auth
. Здесь код, который я написал для загрузки csv
<?php
header('content-type: text/plain');
// Set account login info
$data['post'] = array(
'accountType' => 'HOSTED_OR_GOOGLE', // indicates a Google account
'Email' => '', // full email address
'Passwd' => '',
'service' => 'trendspro', // Name of the Google service
'source' => 'codecri.me-example-1.0' // Application name, e.g. companyName-applicationName-versionID
);
$response = xhttp::fetch('https://www.google.com/accounts/ClientLogin', $data);
// Test if unsuccessful
if(!$response['successful']) {
echo 'response: '; print_r($response);
die();
}
// Extract SID
preg_match('/SID=(.+)/', $response['body'], $matches);
$sid = $matches[1];
// Erase POST variables used on the previous xhttp call
$data = array();
// Set the SID in cookies
$data['cookies'] = array(
'SID' => $sid
);
Это использует мой класс xhttp, cURL-обертку.
Ответ 2
Правильный инструмент для правильной работы, вы считали PhantomJS?
Это может быть даже более читаемым.
Ответ 3
Хм, я еще не работал с API Google, но хотел попасть в API Google Apps для предстоящего проекта, поэтому начал копаться. Я предполагаю, что поскольку Trends не находится в списке сервисов, реализующих Протокол данных Google, даже если вы правильно или успешно аутентифицируете (проверено в разделе Auth ответа) Google не будет соблюдать токен аутентификации для Trends (опять же это лучшее предположение!).
Моя мысль тогда заключается в том, что вам нужно будет использовать традиционный метод для входа в Google Trends и загрузки CSV, то есть действовать как браузер от вашего клиента, а не от приложения. Не уверен в этом, но я нашел более старый клиент python на github, который утверждает, что может загружать CSV из Google Trends. Там также сообщение в блоге на клиенте. Возможно, вы сможете перепроектировать его в эквивалент PHP, удачи!
Ответ 4
Похоже, Google официально не одобряет использование тенденций на основе script. Это объясняет, почему ваш аут терпит неудачу, поскольку он не принимает соединения api. Попробуйте использовать библиотеку webclient для захвата файла cookie и использовать его для сбора данных. Это было решение, используемое ранее связанным клиентом python на git.
В потенциально несвязанной ноте вы используете service trendspro, но это имя службы для google-аналитики. Попробуйте просто service = > 'тенденции'