Contare i lettori di Feed con PHP + MySQL

v0.2

Molti lettori leggono le news utilizzando i Feed Reader. Attraverso questa tecnica, relativamente nuova, risulta un po piu' complesso riuscire a capire quante persone accedono alle nostre informazioni senza pero' mai aprire il nostro sito. Durante CenaSicura 2007 ho chiesto ai partecipanti come pensavano potessi risolvere questo problema che mi gira per la testa da quando ho appreso che neanche punto-informatico riesce a tener traccia di questi utenti. La risposta pronta che ho ricevuto da tutti è: ma usa feedburner.com. Questo credo stia diventando un grosso problema. Moltissimi ricorrono alle applicazioni web 2.0 per ogni cosa e credo sia un approccio sbagliato. A volte è bello anche staccare la spina dalla rete e rendersi autonomi. Ho pensato un po a delle soluzioni, e la migliore che sono riuscito a realizzare ora ve la spiego e se avete dei suggerimenti non esitate, mandate una email. Ah, credo che la mia soluzione sia meglio di FeedBurner, poi vi spiego i motivi. In sostanza si tratta di creare un codice identificativo per ogni feed letto.

1) Funzione per generare un possibile identificativo per un utente: function feed_id(){ //Se non ha un id_feed, generalo while(!$_SESSION['id_feed_news']){ $tmp = rand(0,9999999999); $res = db("SELECT 'id' FROM `feed_news` WHERE id = '".$tmp."';"); $value = mysql_fetch_array($res); if ($tmp != $value['id']) $_SESSION['id_feed_news'] = $tmp; } }

2) Modifichiamo il tag HTML relativo al feed: <link rel="alternate" type="application/rss+xml" title="GeekPlace.org - News" href="http://geekplace.org/moduli/rss/rss_news.php?cod=<?php echo $_SESSION['id_feed_news']; ?>" />

3) Per avvertire i nostri cari utenti iscritti al feed “vecchio stile” che ci sono stati degli aggiornamenti, inseriamo nel rss_news.php (file che crea l'xml) il seguente codice: //__________// Se non usa il codice di identificazione lo blocco e lo avverto.

if (!$_GET['cod']) { header("Content-Type: text/xml; charset=ISO-8859-1"); $result = '<?xml version="1.0" encoding="ISO-8859-1"?> <rss version="2.0"> <channel> <title>GeekPlace - News</title> <link>http://www.geekplace.org</link> <description>News da Geek</description> <language>it</language> <copyright>Copyleft 2006 geekplace</copyright> <item> <title>ATTENZIONE! DEVI AGGIORNARE IL FEED DI GeekPlace!</title> <link>http://geekplace.org/</link> <description>A causa di alcuni cambiamenti tecnici, sei invitato ad aggiornare il feed. Questo risulta disabilitato!</description> </item> </channel> </rss>'; echo $result; return; }

4) A questo punto entra in gioco il log “morbido”, cioè senza essere troppo invasivi, memorizziamo dal file rss_news.php (file che crea l'xml) al nostro database (rigorosamente libero come ad esempio MySQL) nel seguente modo: //__________//Conto con gli identificativi i feed reader $req = "SELECT id FROM `feed_news` where id = ".$cod.";"; $res = db($req); $value = mysql_fetch_array($res); if ($value['id']) { $req = "UPDATE feed_news SET data_ultimo_utilizzo = '".$ya.$ma.$da."' WHERE id = ".$value['id'].";"; db($req); } else { $req = "INSERT INTO `feed_news` (`id`, `data_ultimo_utilizzo`) VALUES ('".$cod."', '".$ya.$ma.$da."');"; db($req); }

Update 1 Un modo per essere piu' fiscali sul conteggio dei lettori dei feed è calcolare questi ultimi solo dopo che hanno effettuato un tot di richieste. La base dati dunque avra' la seguente struttura: Lettori_Feed(Codice,Richieste,Data_ultimo_utilizzo) FINE Ora vorrei fare alcune considerazioni. Innanzitutto con questo metodo, se un utente usa un servizio web per leggere i propri feed o se si trova dietro una nat, e comunque in molti altri casi di presunto anonimato, noi siamo in grado di riconoscere il singolo utente in modo estremamente preciso. Le percentuali di collisione sono minime e personalizzabili e variano a seconda della quantita' di utenti presenti nello stesso momento nel sito. Inoltre questa tecnica non appesantisce il DBMS salvando il prima possibile nella SESSIONE un identificativo valido. Ad ogni richiesta di lettura del feed, il nostro “generatore di feed” controlla se l'identificativo è gia' conosciuto, ed in caso contrario lo crea ed inizia ad aggiornare la data di ultimo utilizzo. Con questa informazione possiamo capire quando un identificativo è stato abbandonato e quindi rimuoverlo dalla nostra base di dati riducendo cosi a dati piu' reali le statistiche dei nostri lettori di feed. Do per scontato che facciate dei controlli di SQL INJECTION sul parametro cod ad esempio, e altre piccole precauzioni del genere :) Ricordo infine che questo “articoletto” è a puro fine divulgativo, non vuole essere ne una guida, ne un tutorial, bensi' uno spunto di riflessione scritto in una notte eccessivamente lunga. A presto, NeCoSi RINGRAZIAMENTI Jek ed Insomnia_