Post  |  Commenti

Post Meta

7th
MAR

Script per i bookmarks di google

1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading ... Loading ...

Posted by RedSend | Filed under Programming

Dopo qualche giorno di travaglio lo script è stato terminato, infatti potete notare che nella barra del menu compare una nuova sezione “Bookmarks”. L’unico inconveniente è il suo contenuto, in pratica è ancora vuota, quindi risulta molto poco utile.
Come avevo detto nel post precedente avevo intenzione di scrivere un breve tutorial su come ho gestito la sezione, ovvero su come mi sono autenticato con google, come ho recuperato i bookmarks, come ho fatto il parsing del file, etc… Pensandoci bene la cosa più interessante è stata l’autenticazione con google in quanto non sono riuscito immediatamente ad implementarla ma ho dovuto perderci un pò di tempo. Per quanto riguarda le altre cose, scrivere un tutorial risulta alquanto inutile dato l’enorme quantitativo di documentazione che si trova sul sito http://www.php.net dove sono presenti anche molti esempi e suggerimenti.

Prima di passare al codice, volevo fare un breve introduzione. Per effettuare una connessione http in php bisogna utilizzare le librerie CURL. Queste librerie permettono di costruire un pacchetto http (anche ftp e altro) e di instaurare una connessione (anche con https, utile quando si scambiano dati sensibili, come nel nostro caso). Per effettuare il login in Google bisogna utilizzare queste librerie per comunicare con i servizi offerti da quest’ultimo. Le pagine con cui si instaura una connessione sono costruite ad-hoc per agevolare la comunicazione con applicazioni che non siano un browser. Questa caratteristica quindi agevola molto la vita, in quanto un normale pacchetto http inviato da un server web conterrebbe nel corpo un’intera pagina html con tante informazioni che ad un applicazione non servirebbero. Per questo motivo la risposta che otteniamo da uno di quei servizi sarà composta da semplice testo, quindi si potranno utilizzare le classiche funzioni su stringhe presenti nel php per elaborarla.

Di seguito viene mostrata la funzione utilizzata per autenticarsi con google

$urlLogin = “https://www.google.com/accounts/ClientLogin”;

function loginGoogleAccount() {

global $urlLogin, $username, $password;

$postData = array();
$postData["accountType"] = “HOSTED_OR_GOOGLE”;
$postData["Email"] = $username;
$postData["Passwd"] = $password;
$postData["service"] = “bookmarks”;
$postData["source"] = “test-application-prova”;

$o=”";
foreach($postData as $k=>$v){
$o.= “$k=”.utf8_encode($v).”&”;
}
$postData=substr($o,0,-1);

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $urlLogin);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
$result = curl_exec($ch);

$explode = explode(”LSID=”, $result);
curl_close($ch);

return $explode[0];
}

Nella parte iniziale della funzione vengono inseriti nell’array postData i dati necessari per l’autenticazione, dopodiche questo array viene serializzato e formattato per essere inserito all’interno del pacchetto http come i dati di una richiesta POST. Utilizziamo la funzione utf8_encode() per trasformare tutti i caratteri nella codifica utf8. Successivamente cominciamo con iniziallizzare le librerie CURL con la funzione curl_init() che restituirà un handler della sessione aperta, da utilizzare nelle successive chiamate a funzioni, in particolare andremo ad invocare la funzione curl_setopt per costrutire man mano il pacchetto http e impostare alcune proprità della sessione aperta. La prima setopt inserisce l’indirizzo del servizio su cui effettuare la richiesta POST (seconda chiamata), la terza invocazione serve per ottenere il contenuto della risposta come valore di ritorno dell’invocazione della funzione curl_exex() e non nella pagina in cui si sta eseguendo lo script, la quarta invocazione di setopt inserisce la stringa precedentemente creata contenente i campi del POST all’interno del pacchetto. La risposta al pacchetto inviato con la exec è una stringa come questa

SID=DQAAAGkAAADx0SYsey62wDww3gyn2ubK3b-oEnRl-xb5CeBEl0xaa2QzbPC5eCcbI9O LSID=DQAAAG0AAAAabKjb8V9eSxEDwZVE5T7apUOuodP6ot8_waHS-G_qiQfdFQ-oG_CZbYlFl_2iUpW6cQ2t9IOlJlv Auth=DQAAAGwAAAAabKjb8V9eSxEDwZVE5T7apUOuodP6ot8_waHS-G_qiQfdFQ-oG_CZbYlFl

in particolare a noi interessa il campo SID, che contiene l’id della sessione appena instaurata. ID che andrà inserito come cookie all’interno dei prossimi pacchetti che si andranno ad inviare, in questo modo google sarà in grado di riconoscere la nostra applicazione e autorizzare l’accesso alle zone riservate.
Dopo ottenute queste informazioni possiamo procedere al recupero dei bookmarks

function getBookmarks($sid) {

global $itemsFeedURL, $bookmarksXML;

$fp = fopen( $bookmarksXML, “w”);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $itemsFeedURL . “?output=rss”);
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_COOKIE, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
“Content-Type: application/atom+xml”,
“Cookie: ” . $sid
));
curl_exec($ch);
curl_close($ch);
fclose($fp);
}

in questa funzione utilizziamo setopt per abilitare i cookie, per seguire una locazione in caso di un redirect ad un’altro sito e di inserire il contenuto della risposta all’interno di un file precedentemente aperto. Nell’ultima invocazione di setopt andiamo ad inserire a mano alcuni valori presenti nell’header, in particolare impostiamo il campo Cookie con il valore ottenuto dalla precedente funzione (SID=DQAAAGkAAADx0SYsey62wDww3gyn2ub…).
Quest’ultima operazione è stata la cosa che mi ha fatto più penare perchè a quanto sembra è l’unico modo da utilizzare per usufruire di quei servizi che google non offre un API.

Nella sezione Download è presente lo script con le due funzioni prima descritta e altre istruzioni per il parsing del file in cui vengono utilizzati due oggetti per contenere tutte le informazioni, all’interno di questi due è presente il metodo getHTML() che si può modificare a piacimento per formattare diversamente i link e le categorie. Gli oggetti vengono inseriti in un array che successivamente è possibile scorrere per recuperare gli oggetti e invocare il metodo getHTML() per stampare l’intera categoria, oppure recuperare solo il nome.

Sono ben accetti suggerimenti, correzioni e nuove idee. Se in qualche punto non sono stato chiaro (sicuramente) basta lasciare un commento e cercherò di spiegarmi meglio.

Tags:

Leave a Reply

Il contenuto di questo Blog è rilasciato sotto Licenza Creative Commons (Leggi)