Попытка войти в Google для загрузки данных Google Trends - PullRequest
11 голосов
/ 24 декабря 2011

Я пытаюсь:

  1. Войти в Google
  2. Загрузить CSV-данные из Google Trends

У меня получилось (1), но нетв (2).Мне возвращают авторизационный токен от Google, и я отправляю его с последующим запросом в Trends, но, тем не менее, Google возвращает ошибку: «Вы должны войти в систему, чтобы экспортировать данные из Google Trends»:

// http://code.google.com/apis/accounts/docs/AuthForInstalledApps.html
$data = array(
  'accountType' => 'GOOGLE',
  'Email'       => 'my.email@gmail.com',
  '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, но не получаю правильного возврата.По поводу этого нет никакой информации о паутинах.Кто знает в чем тут проблема?

Ответы [ 4 ]

4 голосов
/ 01 января 2012

После проверки вашего кода проблема в том, что для 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's 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 голосов
/ 04 апреля 2012

Правильный инструмент для правильной работы , рассматривали ли вы PhantomJS ?

Это может быть даже более читабельным.

0 голосов
/ 29 декабря 2011

Похоже, что Google официально не оправдывает использование трендов на основе сценариев.Это объясняет, почему ваша авторизация не работает, так как она не принимает соединения API.Попробуйте использовать библиотеку веб-клиентов, чтобы захватить файл cookie и использовать его для сбора данных.Это решение использовалось ранее связанным Python-клиентом на git .

. В потенциально не связанной заметке вы используете службу trendpro, но это имя службы для Google Insights.Попробуйте просто обслужить => 'тренды'

0 голосов
/ 29 декабря 2011

Хм, я еще не работал с API Google, но хотел попасть в API Служб Google для предстоящего проекта, поэтому начал копаться.Я предполагаю, что, поскольку Trends не входит в список служб, которые реализуют протокол данных Google , даже если вы правильно / успешно аутентифицируетесь (проверено в разделе Auth ответа), Google не будет соблюдатьаутентификационный токен для Trends (опять же, это лучшая догадка!).

Я подумал, что вам нужно будет использовать традиционный метод для входа в Google Trends и загрузки CSV, то есть, действоватькак браузер от вашего клиента, а не приложение.Не уверен в этом, но я нашел старый клиент Python на github , который утверждает, что может загружать CSV из Google Trends.Есть также сообщение в блоге на клиенте .Вы можете преобразовать его в эквивалент PHP, удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...