Google Web

23 oct. 2008

GData

A petición del señor babuino, hoy les explicare como es que pelee contra GData (la API mundial del mundo de Google y sus servicios, excepto Maps y Gmail entre otros jajaja). Pues bien esta madre funciona por pseudoREST, para los ignorantes Wikipedia es amiga.

Les explicare brevemente como usarlo con PHP, para que no lloren. Lo primero es hacer login para obtener un token, el cual será válido para el servicio que usaremos en este caso es 'wise' que es spreadsheets. Para la ocasión hice una pequeña función que usaremos asi:

function doPost($url, $data)
{
$params = array('http' => array(
'method' => 'POST',
'content' => $data,
'header' =>
'Content-Length: ' . strlen($data) . '
Content-Type: application/x-www-form-urlencoded'
));

$ctx = stream_context_create($params);
$response = file_get_contents($url, false, $ctx);

return $response;
}

$data = array();
$data['accountType'] = 'GOOGLE';
$data['Email'] = 'simio@gmail.com';
$data['Passwd'] = 'simio';
$data['service'] = 'wise';
$data['source'] = 'test';

$query = http_build_query($data);
$result = doPost("https://www.google.com/accounts/ClientLogin", $query);

Esto nos debe de regresar algunos token u otros errores dependiendo el caso. Si nos regresa algunos token, usaremos el ultimo, Auth, ya tengo la función para sacarlo.

function getToken($data)
{
$tokens = split("\n", $data);

foreach ($tokens AS $current)
{
$artemp = split("=", $current);
if ($artemp[0] == 'Auth')
return $artemp[1];
}

return '';
}

$auth = getToken($result);

Ya tenemos nuestro token, ahora a hacer caos! En lo personal no logre conectarme con file_get_contents por GET. Esto porque, necesitas modificar el HTTP Header para agregar el token, pero al parecer PHP destroza este header cuando Google le regresa un Location Header, asi que en su lugar usare CURL. Teniendo una clase asi:

function doCurlGet($url, $auth)
{
$curl_handle = curl_init();

curl_setopt($curl_handle, CURLOPT_URL, $url);
curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 1);
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl_handle, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl_handle, CURLOPT_HTTPHEADER, array('Authorization: GoogleLogin auth=' . $auth));

$output = curl_exec($curl_handle);

if ($output === false)
return curl_error($curl_handle);

curl_close($curl_handle);

return trim($output);
}

Ahora ya podemos usar los servicios, por ejemplo obtener un listado de todas mis hojas de calculo sería algo asi:

$url = "http://spreadsheets.google.com/feeds/spreadsheets/private/full";
$data = doCurlGet($url, $auth);

Si queremos en lugar de recibir XML, un poco de JSON para ahorrar nuestro tiempo de coding, solo agregamos un '?alt=json' a los URL de GData para obtener content type en JSON.

Voila!!!!