Importare con Feeds e Feeds JSONPath Parser

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'.

html internazionale

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.

json internazionale

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.