Попытка входа в 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 = > 'тенденции'