Indice

Sgcontacts, una classe php per interagire con i contatti google

Autore: Fabio Di Matteo
Ultima revisione: 24/12/2011

Ispirato a : The easy way to get GMail contact list e Using cURL to interact with Google Data services

Grazie alle API di google è possibile interagire anche con i propri contatti della rubrica di gmail. Di seguito una classe php che grazie a libCURL riesce a ricevere un token di autorizzazione da google e a prelevare la lista contatti che viene restituita sottoforma di array.

Utilizzo

In questo esempio preleveremo il contatto numero 1 della nostra lista ( $mycontacts→contacts[1] )

<?php
//Esempio di utilizzo della classe della classe
include("sgcontacts.php");
$mycontacts = new sGCONTACS();
$mycontacts->get("user@gmail.com","password");
 
 
echo "Numero totale contatti: ". $mycontacts->ncontacts ."<br><br>" ;
 
echo "Nome: ".$mycontacts->contacts[1]->title .                          "<br>" ;
echo "Email: ".$mycontacts->contacts[1]->email[0]->address .             "<br>" ; //email numero 0
echo "Indirizzo: ". $mycontacts->contacts[1]->postaladdress[0]->{'$t'}  ."<br>"; // (*) indirizzo 
echo "Tel: ". $mycontacts->contacts[1]->phonenumber[0]->{'$t'} .         "<br>"; // (*) tel numero 0 
 
//(*) dato che il nome dell'elemento comincia con $ si usa la sintassi {'$t'}
 
// E'possibile sbirciare nell'array stampandolo per intero.
//var_dump($mycontacts->contacts[1]);
 
?>

Mostrare per intero la lista dei contatti

include("sgcontacts.php");
$mycontacts = new sGCONTACS();
$mycontacts->get("user@gmail.com","password");
 
echo "Numero totale contatti: ". $mycontacts->ncontacts ."<br><br>" ;
 
echo '
<table border="1"><tr><td><b>Nome</b></td><td><b>Email</b></td><td><b>Telefono</b></td><td><b>Indirizzo</b></td></tr>';
 
 
for ($i=0;$i<=$mycontacts->ncontacts ; $i++)
{
	// per evitare di stampare record vuoti
        if (! isset($mycontacts->contacts[$i])) continue;
 
	echo '
	<tr>
	<td>'.$mycontacts->contacts[$i]->title.'</td>
	<td>'.$mycontacts->contacts[$i]->email[0]->address.'</td>
	<td>'.$mycontacts->contacts[$i]->phonenumber[0]->{'$t'}.'</td>
	<td>'.$mycontacts->contacts[$i]->postaladdress[0]->{'$t'}.'</td>
	</tr>';
 
}
 
 
echo '</table>';

Principi di funzionamento

Per poter utilizzare le API di google bisogna prima di tutto ricevere un token di autorizzazione, ovvero un identificativo di sessione aperta correttamente con i servizi di google. ( http://code.google.com/intl/it-IT/apis/accounts/docs/AuthForInstalledApps.html ) .
In pratica se il login va a buon fine ottengo una risposta (header) http del genere:

SID=DQA...oUE  
LSID=DQA...bbo  
Auth=DQA...Sxq //a noi interessa il valore di questo campo per l'autenticazione

una volta ottenuto il valore invieremo un altro pacchetto http contenente un header del genere:

  'Authorization: GoogleLogin auth=DQA...Sxq' 

e l'url con i campi adatti alla nostra richiesta, ad esempio:

http://www.google.com/m8/feeds/contacts/user@gmail.com/full?alt=json&max-results=250"

Se non siamo riusciti ad autenticarci

Se non siamo riusciti ad autenticarci otterremo come risposta un header del genere:

HTTP/1.0 403 Access Forbidden
Server: GFE/1.3
Content-Type: text/plain

Url=http://www.google.com/login/captcha
Error=BadAuthentication

Error puo' assumente i seguenti valori:

Error codeDescription
BadAuthenticationThe login request used a username or password that is not recognized.
NotVerifiedThe account email address has not been verified. The user will need to access their Google account directly to resolve the issue before logging in using a non-Google application.
TermsNotAgreedThe user has not agreed to terms. The user will need to access their Google account directly to resolve the issue before logging in using a non-Google application.
CaptchaRequiredA CAPTCHA is required. (A response with this error code will also contain an image URL and a CAPTCHA token.)
UnknownThe error is unknown or unspecified; the request contained invalid input or was malformed.
AccountDeletedThe user account has been deleted.
AccountDisabledThe user account has been disabled.
ServiceDisabledThe user's access to the specified service has been disabled. (The user account may still be valid.)
ServiceUnavailableThe service is not available; try again later.


Per una lista dettagliata e aggiornata consultare: http://code.google.com/intl/it-IT/apis/accounts/docs/AuthForInstalledApps.html#Response

Codice

sgcontacts.php

<?php
class sGCONTACS
{
 
	var $contacts = array() ; // variabile che conterra' l'oggetto in cui verra messa la lista
	var $max="250"; // massimo numero dei contatti
        var $ncontacts; //numero totale contatti
 
function get($user, $password)
{
 
	// per prima cosa ci occuperemo di fare il login su google 
	// tramite la tecnologia Clientlogin 
	$login_url = "https://www.google.com/accounts/ClientLogin";
 
	//array con i campi POST che verranno inviati a Google
	$fields = array( 
		'Email' => $user,
		'Passwd' => $password,
		'service' => 'cp', // <== codice per ottenere la lista contatti
		'source' => 'test',
		'accountType' => 'GOOGLE',
	);
 
	//Inizializzo la libreria CURL e setto le opzioni
	$curl = curl_init();
	curl_setopt($curl, CURLOPT_URL,$login_url);
	curl_setopt($curl, CURLOPT_POST, 1);
	curl_setopt($curl, CURLOPT_POSTFIELDS,$fields); //invio campi POST
	curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
 
	// Invio i dati tramite CURL e ricevo la risposta(con i dati per l'autenticazione)
	// nella variabile $result
	$result = curl_exec($curl);
 
 
	// Elaboro la risposta rsult contenente i dati di autenticazione nella forma
	// 	SID=DQA...oUE  
        // 	LSID=DQA...bbo  
	// 	Auth=DQA...Sxq
	//      e creo un array  $returns['Auth'] con i nomi dei campi della risposta ovvero:
	//	$returns['SID'], $returns['LSID'], $returns['Auth']. A noi interessera' solo $returns['Auth']
 
	$returns = array();
	foreach (explode("\n",$result) as $line)
	{
		$line = trim($line);
		if (!$line) continue;
		list($k,$v) = explode("=",$line,2);
 
		$returns[$k] = $v;
	}
 
	// chiudo la sessione curl che ci ha permesso di prelevare il token per l'autozzazione $returns['Auth'] . 
	curl_close($curl);
 
	// Adesso scarichiamo finalmente la lista dei contatti, e per prima cosa quindi creiamo l'header http
	// da inviare per tale scopo.
	$feed_url = "http://www.google.com/m8/feeds/contacts/$user/full?alt=json&max-results=".$this->max;
 
	$header = array(
		'Authorization: GoogleLogin auth=' . $returns['Auth'],
	);
 
	$curl = curl_init();
	curl_setopt($curl, CURLOPT_URL, $feed_url);
	curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
	curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
 
	//Riceviamo la lista dei contatti nella variabile $result
	$result = curl_exec($curl);
	curl_close($curl);
 
	// Convertiamo l' ogetto json in una varibile php 
	$data = json_decode($result);
 
	// Estraiamo di dati dalla variabile $data e li travasiamo in un array ($this->contacts[]).
	// A questo punto possiamo accedere all'arary per prelevare i contatti. 
	foreach ($data->feed->entry as $entry)
	{
		// Possiamo includere altri campi della lista contatti nella struttura. Vedere:
		// http://code.google.com/intl/it-IT/apis/gdata/docs/2.0/elements.html#gdEmail
 
		$contact = new stdClass();
 
		$contact->title = $entry->title->{'$t'};
		$contact->email = $entry->{'gd$email'};
		$contact->phonenumber = $entry->{'gd$phoneNumber'};
		$contact->postaladdress = $entry->{'gd$postalAddress'};
 
		$this->contacts[] = $contact;
 
                //incremento il numero totale di contatti
		$this->ncontacts++;
	}
 
 
} //end get()
 
 
}//end class

Includere altri campi nella classe

Attualmente la classe include solo alcuni dei numerosi campi che google mette a disposizione. Ma includerne altri non e' affatto un'impresa difficile. Basta infatti aggiungere i campi nella seguente parte di codice:

...
foreach ($data->feed->entry as $entry)
	{
 
		$contact = new stdClass();
 
		$contact->title = $entry->title->{'$t'};
		$contact->email = $entry->{'gd$email'};
		$contact->phonenumber = $entry->{'gd$phoneNumber'};
		$contact->postaladdress = $entry->{'gd$postalAddress'};
		/*Aggiungere qui altri campi*/
 
		$this->contacts[] = $contact;
	}
...

Per una lista dei campi consultare: http://code.google.com/intl/it-IT/apis/gdata/docs/2.0/elements.html