2011-12-24 2 views
11

Я пытаюсь:Попытка войти в Google, чтобы загрузить Google Trends данные

  1. Войти в Google
  2. Скачать CSV данные из Google Trends

Я преуспевая в (1), но не в (2). Я получаю возвратила авторизации-токен от Google, и я посылаю его с последующим запросом к тенденциям, но тем не менее, 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. Кто знает, в чем проблема?

+0

Вы проверили здесь http://stackoverflow.com/questions/4986758/oauth-google-trends-download-csv-file – Pateman

+0

Спасибо за отзыв. Ваша ссылка привела меня к http://stackoverflow.com/questions/1656446/download-csv-from-google-insight-for-search, но это также не устраняет проблему. Я делаю точно так, как объяснил, но не повезло, и я не вижу, что я делаю неправильно ... – Pr0no

+0

Не уверен, что это помогает, но у одного парня возникла проблема с доступом к веб-сайтам HTTPS с использованием cURL и его проблем был решен здесь: http://stackoverflow.com/questions/316099/cant-connect-to-https-site-using-curl-returns-0-length-content-instead-what-c ​​ – Pateman

ответ

4

После проверки кода проблема заключается в том, что для 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 class, завиток обертку.

+0

Ваша ссылка класса xhttp перенаправляется на случайную страницу объявлений – Jones03

0

Хм, я еще не работал с API Google, но хотел попасть в API Google Apps для предстоящего проекта, поэтому начал копаться. Я предполагаю, что, поскольку Trends не находится в the list of services that implement the Google Data Protocol, хотя вы правильно или успешно проверяете подлинность (проверено в разделе Auth ответа) Google не будет соблюдать токен аутентификации для Trends (опять же это лучшее предположение!).

Моя мысль заключается в том, что вам нужно будет использовать традиционный метод для входа в Google Trends и загрузки CSV, то есть действовать как браузер от вашего клиента, а не от приложения. Не уверен в этом, но я нашел an older python client on github, который утверждает, что может загружать CSV-файлы из Google Trends. Также есть a blog post on the client. Возможно, вы сможете перепроектировать его в эквивалент PHP, удачи!

0

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

В потенциально несвязанной ноте вы используете сервисные тенденцииpro, но это имя службы для google-аналитики. Попробуйте просто service => 'trend'

2

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

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