dimarts, 28 d’octubre del 2008

Logs en Google Docs

Els formularis de Google Docs són una gran eina que destaquen per la senzillesa amb la que es poden gestionar dades.

Generalment aquestes dades s'introdueixen per persones humanes des de formularis web o formularis mail. Amb la següent tècnica també podrem omplir formularis Googe Docs des de scripts PHP executats de manera planificada.

L'exemple que veurem és un script que s'executa cada dia a les 23:00 hores i recupera diferent informació sobre una adreça URL concreta, en el nostre cas http://corretge.cat/ , com per exemple el Google PageRank, les pàgines que enllaçen a la URL, el número de pàgines indexades per Google, el darrer cop que el robot de Google va passar per la URL i el temps que es triga en carregar la plana.

En primer lloc desde Google Docs, crearem un nou document de tipus formulari i afegirem aquests cinc camps.


Un cop desem el formulari, quan l'obrim ens fixarem en el paràmetre key que te, que és el que haurem d'enviar com a paràmetre a l'script que envia informació al formulari.

La funció és aquesta:
/**
* Enviem dades a una URL com si d'un formulari es tractès.
*
* @param string $doc
* @param array $aData
* @return string
*/
function enviaGoogleForm($doc, $aData)
{
/**
* formatem la url amb el codi de document que ens envien
* i preparem les variables de servidor i port
*/
$url = "http://spreadsheets.google.com/formResponse?key=" . $doc;
$server = "spreadsheets.google.com";
$port = 80;

/**
* formatem l'array associativa que ens arriba
* per a que es pugui enviar com a POST.
*/
$content = "";
foreach ($aData as $parm => $val) {
$content .= $parm . "=" . rawurlencode($val) . "&";
}
$content .= "foo=dummy";
$content_length = strlen($content);

/**
* Preparem la capçalera que s'enviarà com si fos un submit d'un formulari des d'un navegador
*/
$headers= "POST $url HTTP/1.0\r\nContent-type: application/x-www-form-urlencoded\r\nHost: $server\r\nContent-length: $content_length\r\n\r\n";

/**
* obrim el socket i enviem capçalera i contingut POST
*/
$fp = fsockopen($server, $port, $errno, $errstr);
if (!$fp) return false;
fputs($fp, $headers);
fputs($fp, $content);
/**
* recuperem la resposta
*/
$ret = "";
while (!feof($fp)) {
$ret.= fgets($fp, 1024);
}
/**
* tanquem el socket
*/
fclose($fp);

/**
* retornem el contingut
*/
return $ret;

}


Coneixerem els noms dels camps del formulari observant el codi HTML d'aquest. En aquest cas tots eren texts simples. Prepararem una array associativa on la clau és el nom del camp i el valor el que es vol enviar al formulari:


/**
* Preparem l'array associativa amb el número
* de camps del formulari.
*/
$aData = array ('entry.0.single' => $url,
'entry.1.single' => getpagerank($url),
'entry.2.single' => google_backlink($url),
'entry.3.single' => google_indexed($url),
'entry.4.single' => googlebot_lastaccess($url),
'entry.5.single' => myPing($url)
);

/**
* enviem el resultat al formulari Google.
*/

enviaGoogleForm($codi, $aData);



El resultat el podeu veure en aquest full de proves, si tot va bé cada nit s'acutalitza automàticament: