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.
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]); ?>
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>';
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 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 code | Description |
---|---|
BadAuthentication | The login request used a username or password that is not recognized. |
NotVerified | The 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. |
TermsNotAgreed | The 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. |
CaptchaRequired | A CAPTCHA is required. (A response with this error code will also contain an image URL and a CAPTCHA token.) |
Unknown | The error is unknown or unspecified; the request contained invalid input or was malformed. |
AccountDeleted | The user account has been deleted. |
AccountDisabled | The user account has been disabled. |
ServiceDisabled | The user's access to the specified service has been disabled. (The user account may still be valid.) |
ServiceUnavailable | The 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
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
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