====== Sgcontacts, una classe php per interagire con i contatti google ====== Autore: **//Fabio Di Matteo//** \\ Ultima revisione: **//24/12/2011//** \\ \\ Ispirato a : [[http://www.nqbao.com/2009/11/the-easy-way-to-get-gmail-contact-list|The easy way to get GMail contact list]] e [[http://code.google.com/intl/it-IT/apis/gdata/articles/using_cURL.html|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] **) get("user@gmail.com","password"); echo "Numero totale contatti: ". $mycontacts->ncontacts ."

" ; echo "Nome: ".$mycontacts->contacts[1]->title . "
" ; echo "Email: ".$mycontacts->contacts[1]->email[0]->address . "
" ; //email numero 0 echo "Indirizzo: ". $mycontacts->contacts[1]->postaladdress[0]->{'$t'} ."
"; // (*) indirizzo echo "Tel: ". $mycontacts->contacts[1]->phonenumber[0]->{'$t'} . "
"; // (*) 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 ."

" ; echo ' '; for ($i=0;$i<=$mycontacts->ncontacts ; $i++) { // per evitare di stampare record vuoti if (! isset($mycontacts->contacts[$i])) continue; echo ' '; } echo '
NomeEmailTelefonoIndirizzo
'.$mycontacts->contacts[$i]->title.' '.$mycontacts->contacts[$i]->email[0]->address.' '.$mycontacts->contacts[$i]->phonenumber[0]->{'$t'}.' '.$mycontacts->contacts[$i]->postaladdress[0]->{'$t'}.'
';
===== 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 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 ===== Codice ===== **sgcontacts.php** $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