Un feed per l’offerta lampo Kindle

Feed dell'offerta lampo kindle

Se usi questo feed, per favore lascia un commento 🙂

[NOTA BENE: questo script è stato aggiornato, quindi i dettagli tecnici presenti in questo articolo potrebbero non rispecchiare il codice attuale.]

Come parlato nell’ultimo articolo, i web feed sono un modo molto comodo per rimanere aggiornati sulle novità di un sito senza essere obbligati ad aprirlo costantemente. Purtroppo, nonostante siano ormai molto diffusi, alcuni siti ancora non ne fanno uso. Nel particolare oggi voglio parlare dell’offerta lampo Kindle.

Ogni giorno Amazon mette in vendita un ebook ad un prezzo fortemente scontato. L’offerta si può consultare quotidianamente a questo indirizzo e, come recita la pagina:

L’Offerta lampo Kindle è la promozione che ti permette di acquistare ogni giorno un titolo diverso scontato a un prezzo eccezionale per 24 ore soltanto. Assicurati di controllare tutti i giorni della settimana la pagina dell’offerta lampo per non perdere nemmeno un titolo in promozione.

Il problema è questo: io non voglio controllare ogni giorno una pagina, perché banalmente mi dimentico di farlo! Ma effettivamente vale la pena di seguire le offerte: un libro a meno di 2€ fa sempre gola. Purtroppo per questa pagina non è disponibile un feed RSS né un feed Atom, ed a quanto pare le lamentele degli utenti non bastano per convincere Amazon ad attivarne uno.

Ma come diceva Bigweld 1, “Se vedi un bisogno, soddisfalo!”. Quindi mi sono messo a fare un feed per la daily offer di Amazon!

Dato che il lavoro potrebbe essere utile ad altri, lo rendo pubblico a questo indirizzo. Il programma di conversione non è esente da bachi noti (l’ora di aggiornamento non è corretta) ed è fortemente dipendente dalla grafica di Amazon, il che vuol dire che potrebbe smettere di funzionare al primo aggiornamento che faranno. Comunque farò il possibile per tenerlo aggiornato e funzionante.

Breve nota dell’autore

Anche se effettivamente mi piace programmare, questo è pur sempre un lavoro che in qualche modo ti sto regalando, sarei molto felice e gratificato di leggere un commento qua sotto se utilizzi il feed e lo trovi comodo. Tanto lasciare un commento è gratis e non richiede nemmeno la registrazione!
In questo modo se dovessi vedere che il feed è molto utilizzato potrei pensare di ottimizzarlo: lo spazio web su cui vive questo sito è gratuito e la banda passante non è illimitata. Una ottimizzazione potrebbe essere necessaria per evitare di trovare tutto improvvisamente off-line per avere superato i limiti di utilizzo.

Dettagli tecnici

Il codice che genera il feed lo rilascio sotto licenza GPL, questo vuol dire che sei libero di usarlo, libero di modificarlo a tuo piacere e libero di ridistribuirlo ad unico patto di lasciare intatte queste libertà a chi lo userà dopo di te.
Il codice sorgente è scritto in PHP ed è liberamente scaricabile. Genera un feed Atom valido secondo gli standard w3c.

Come funziona

Vediamo ora il funzionamento delle parti di codice più interessanti.

if ($_GET['download']){
	header('Content-Type: text/plain; charset=utf-8');
	die(file_get_contents($_SERVER['SCRIPT_FILENAME'], 'r'));
}

Queste righe sono quelle che permettono di scaricare il codice sorgente: il file .php di fatti viene processato dal web server. Quello che viene trasmesso al browser di conseguenza è l’output che genera, non il file stesso. Nella prima riga viene controllato se è presente nella url il parametro download settato ad un valore vero dal punto di vista logico. In tal caso (riga 2) invia al browser l’informazione che il contenuto trasmesso sarà del testo semplice, questo serve a fare in modo che venga visualizzato il testo senza cercare di interpretarlo come HTML.
La riga successiva invece apre il file dello script corrente, ne legge il contenuto e termina l’esecuzione inviando il contenuto stesso al browser. Nel caso volessi usare questo codice sul tuo sito queste righe sono cancellabili perché non interferiscono con normale funzionamento del feed. Ricorda però che da licenza sei obbligato a rilasciare anche il codice sorgente, quindi dovrai in qualche modo permettere all’utente di scaricarlo.

$dom = new DOMDocument();
@$dom->loadHTML($offer);
$xpath = new DOMXPath($dom);
$xpathBoxOffer = '/html/body/table[2]/tr/td/table/tr/td[1]/table/tr/td/div';
$offerBox = $xpath->evaluate($xpathBoxOffer)->item(0);

Per individuare le parti della pagina che mi interessano uso il linguaggio XPath, un particolare linguaggio che permette di selezionare solo alcuni nodi di un albero XML.
La prima riga istanzia un oggetto che rappresenta la struttura ad albero della pagina HTML, mentre la seconda riga carica l’HTML della pagina e fa le dovute correzioni per trasformarlo in un documento valido. La chiocciola davanti al comando serve a disabilitare i messaggi di errore: di fatti in questo caso ne vengono generati parecchi, uno per ogni correzione fatta. Ma siccome questi errori riguardano i problemi della pagina di Amazon non li posso correggere, quindi tanto vale ignorarli.
La terza riga crea un oggetto che serve per applicare query XPath alla pagina. La quarta riga contiene la query XPath che seleziona solo il riquadro dell’offerta, mentre la successiva la valuta e restituisce il risultato.

Il resto dello script applica altre query per ottenere le varie parti di interesse (titolo, prezzo, descrizione…) ed infine invia l’output formattato secondo lo standard Atom.

Una cosa da notare è che secondo lo standard Atom, ogni feed deve avere un codice identificativo univoco a livello globale. Nel mio caso è

<id>urn:uuid:bac285f0-096a-11e2-892e-0800200c9a66</id>

se volessi quindi prendere il codice e modificarne il funzionamento devi modificare anche questo identificativo.

Mentre all’interno del feed anche ogni articolo ha un suo identificativo. Solitamente si usa l’url dell’articolo stesso, purtroppo (non so per quale motivo) Amazon cambia l’url dell’offerta durante la giornata anche se il contenuto della pagina rimane lo stesso. L’id del contenuto viene calcolato quindi applicando l’hash crittografico sha1 alla concatenazione del titolo e del giorno dell’offerta, il che pare essere abbastanza univoco per non creare problemi.

Possibili modifiche

Lo script, per come funziona ora, ad ogni richiesta scarica la pagina da Amazon, la parsa e genera il feed. Questo è uno spreco di banda visto che si sa che la pagina cambia solo una volta al giorno e sempre a mezzanotte. Una ottimizzazione consisterebbe quindi nel salvare il risultato in modo da poterlo restituire al volo fino alla scadenza dell’offerta.

Accetto consigli e suggerimenti per altre modifiche. Se invece preferissi farle te, come detto prima, lascia un commento, anche fosse solo per linkare il tuo mirror 🙂

Un pensiero su “Un feed per l’offerta lampo Kindle

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

*