2011-12-24 8 views
11

estoy tratando de:Tratando de iniciar sesión en Google con el fin de descargar los datos de Google Trends

  1. sesión en Google
  2. datos Descargar CSV de Google Trends

estoy teniendo éxito en (1) pero no en (2). Consigo regresar una autorización token de Google, y lo envío a la solicitud con posterioridad a las tendencias, pero sin embargo Google a continuación, devuelve un error: "Debe haber iniciado sesión para exportar los datos de 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); 

Por algún motivo, los auth-tokens que envío a Google Trends no se aceptan ni se ignoran. No sé exactamente qué sucede, ya que no se proporciona información de error adicional.

¿Alguien ve lo que estoy haciendo mal? Si se puede conseguir que funcione, lo que significa que Google está devolviendo los datos CSV, entonces la recompensa es la suya y ambos tenemos un late presente :-) Navidad


Así que pensé que el problema no tiene nada que ver con cURL. Lo que hice fue:

SID=DQAAAMUAAADMqt...aYPaYniC_iW 
LSID=DQAAAMcAAACI5...YDTBDt_xZC9 
Auth=DQAAAMgAAABm8...trXgqNv-g0H 
GData-Version: 3.0  
Authorization: GoogleLogin auth=DQAAAMgAAABm8...trXgqNv-g0H 
  • consigo devuelto:

encabezados:

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 

de datos:

You must be signed in to export data from Google Trends 

En otras palabras, estoy enviando cabeceras como se define por Google en http://code.google.com/apis/accounts/docs/AuthForInstalledApps.html pero sin suerte conseguir un rendimiento adecuado. Hay información sobre * no * en Interwebs sobre esto. ¿Quién sabe cuál es el problema aquí?

+0

Ha marcado aquí http://stackoverflow.com/questions/4986758/oauth-google-trends-download-csv-file – Pateman

+0

Gracias por la sugerencia. Su enlace me llevó a http://stackoverflow.com/questions/1656446/download-csv-from-google-insight-for-search, pero esto tampoco soluciona el problema. Estoy haciendo exactamente lo que se explicó allí pero sin suerte, y no puedo ver lo que estoy haciendo mal ... – Pr0no

+0

No estoy seguro de si esto ayuda, pero un tipo tuvo un problema al acceder a los sitios web HTTPS usando cURL y su problema fue resuelto aquí: http://stackoverflow.com/questions/316099/cant-connect-to-https-site-using-curl-returns-0-length-content-instead-what-c ​​ – Pateman

Respuesta

4

Después de verificar su código, el problema es que Google Trends necesita la clave SID y no Auth. Aquí está el código que escribí para descargar de

<?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 
); 

Esto utiliza mi xhttp class, un envoltorio de rizar el csv.

+0

Tu enlace de clase xhttp redirige a una página de anuncios aleatoria – Jones03

0

Hmm, todavía no he trabajado con las API de Google, pero quería ingresar a la API de Google Apps para un próximo proyecto, así que comencé a investigar. Supongo que, dado que Trends no se encuentra en the list of services that implement the Google Data Protocol aunque esté autenticando correctamente/con éxito (verificado por la sección de autenticación de la respuesta), Google no cumplirá con el token de autenticación de Tendencias (de nuevo, esta es una buena suposición).

Pensé entonces en que necesitaría usar un método tradicional para iniciar sesión en Google Trends y descargar el archivo CSV, es decir, actuar como un navegador de su cliente en lugar de una aplicación. No estoy seguro de eso, pero encontré an older python client on github que dice que puede descargar CSV de Google Trends. También hay a blog post on the client. ¡Puede invertir la ingeniería en un equivalente de PHP, la mejor de las suertes!

0

Parece que Google no aprueba oficialmente ningún uso de tendencias basado en secuencias de comandos. Esto explicaría por qué su autenticación está fallando ya que no está aceptando conexiones de API. Intente utilizar una biblioteca webclient para capturar una cookie y usarla para recolectar datos. Esta fue la solución utilizada por ese previamente vinculado python client on git.

En una nota potencialmente no relacionada, utiliza el servicio trendspro pero este es el nombre del servicio para google insights. Intente simplemente service => 'trends'

2

Herramienta correcta para el trabajo correcto, ¿ha considerado PhantomJS?

Podría ser aún más legible.

Cuestiones relacionadas