Non sono un fanatico dell'oroscopo, ma da quando ho iniziato a leggere quello scritto da Rob Brezsny su Internazionale, diciamo che mi ci sono appassionato.
Appasionato si, ma non così tanto da ricordarmi ogni giovedì di andarlo a leggere! Così ho cercato un modo per far sì che fosse l'oroscopo a venire a me e non il contrario.
Il sistema elaborato non è dei più semplici... Questo sito fatto con Drupal importa i testi dell'oroscopo e li mette in un feed RSS, IFTTT invia una email se ci sono nuovi feed.
In questa pagina illustro come ho importato l'oroscopo utilizzando Drupal con i moduli Feeds e Feeds JSONPath Parser.
La prima cosa che ho fatto è stata analizzare la pagina dell'oroscopo di Internazionale.
La prima cosa che ho fatto è stata analizzare la pagina dell'oroscopo di Internazionale.
I testi dell'oroscopo vengono caricati via javascript, ho cercato quindi la fonte dei dati che risulta rispondere all'indirizzo
http://data.internazionale.it/stream_data/stream_data_json.php?type=oroscopo&stream_id=X&stream_datetime=0
dove X è la variabile che identifica l'intero oroscopo di una determinata settimana.
Questa variabile la trovo come attributo di un div con classe 'hentryfeed__container'.
Per recuperare il JSON corretto ho creato un piccolo script php che legge lo stream_id dalla pagina dell'oroscopo, invia la richiesta e restituisce il JSON.
<?php
ini_set('display_errors', '1');
error_reporting(1);
$url = "http://www.internazionale.it/oroscopo/";
$html = new DOMDocument();
$html->loadHtmlFile($url);
$xp = new domxpath($html);
$oro_url = 'http://data.internazionale.it/stream_data/stream_data_json.php';
$result_id = $xp->query("//div[@class='hentryfeed__container']/@data-stream-id");
$oro_id = $result_id->item(0)->firstChild->nodeValue;
$import_url = $oro_url . '?type=oroscopo&stream_id='.$oro_id.'&stream_datetime=0';
// http://data.internazionale.it/stream_data/stream_data_json.php?type=oroscopo&stream_id=5111&stream_datetime=0
$useragent= "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)";
$ch = curl_init();
curl_setopt($ch, CURLOPT_USERAGENT, $useragent); //set our user agent
curl_setopt($ch, CURLOPT_URL,$import_url); //set the url we want to use
$result_culr = curl_exec ($ch); //execute and get the results
curl_close ($ch);
print $result_curl; //display the reuslt
?>
Il risultato è un JSON come quello in questa immagine.
A questo punto utilizzando Feeds e Feeds JSONPath Parser ho creato un importer mappato in questo modo.
Nome | Nome ad uso interno | Valore |
---|---|---|
Contesto | $.items.* | |
Data | date_start | 30 |
Titolo | title | title |
Body | body | content.data.*.data.text |
ID | external_id | id |
Con Feeds Tamper ho riscritto l'output di alcuni dati come il titolo, che altro non è che il segno zodiacale.