venerdì 26 ottobre 2007

Gli RSS

RSS è l’acronimo di Really simple syndication, (distribuzione veramente semplice) e sta cambiando il modo di navigare sul web.
Chi ancora non ne avesse sentito parlare, forse avrà notato il rettangolino arancione con la scritta RSS o XML che appare in cima o in fondo alle pagine internet. L'RSS è un linguaggio e la definizione che più mi sembra efficace è quella data dalla wikipedia: 'l’RSS è uno standard de facto per l’esportazione di contenuti web' e, aggiungo, permette di distribuire con grande facilità i contenuti di un sito e presentarli sotto altre forme. Tuttavia, leggendo tra i tutorial che si trovano in Rete, potreste trovare altre definizioni.
Andiamo per gradi …
Il formato venne creato da Netscape nel 1999 ma fu abbandonato ben presto per essere ripreso da Dave Winer. In realtà oggi ne esistono diverse versioni (dialetti), ed è per questo che l’RSS non può essere considerato uno standard e deve quindi rispettare la sintassi e la grammatica di XML nonché la modularità (aspetto molto importante in quanto offre la possibilità di effettuare delle modifiche senza far subire grandi sconvolgimenti al progetto originale).
Chi ha adottato il formato RSS? I principali siti di informazione, i quotidiani online, i fornitori di contenuti, i blog.
Va specificato che in passato era necessario tradurre da HTML a RSS mentre con l'introduzione di news aggregator di documenti RSS oggi è consentito a chiunque di attingere direttamente alla fonte.
Un aggregatore può anche estrarre i contenuti del feed RSS per convertirli in linguaggio HTML e permettere quindi di incorporarli all'interno di pagine web.
Vediamo ora meglio la funzione di un aggregatore che è, in pratica, un lettore di feed RSS così come un browser è un lettore di pagine HTML.
Se di solito vengono inseriti tra i preferiti gli indirizzi che si controllano più spesso,installando un aggregatore, e aggiungendo l'indirizzo del feed RSS alla lista, sarà possibile seguire tutti i siti segnalati. Un segnale luminoso o sonoro ci avvertirà e verrà visualizzata una lista degli ultimi articoli pubblicati in caso di aggiornamenti offrendoci la possibilità di seguire molti siti senza passare da una pagina web all'altra.
Per aggiungere i feed all’aggregatore bisogna avere il link feed del sito che interessa. Per trovarli basta cercare l'icona XML o RSS e poi copiare e incollare (tasto destro del mouse) i link dei canali.
Inoltre, le liste di feed possono essere esportate come avviene con i preferiti e presto si potrà esportare la lista e renderla pubblica, scambiarla, o importarne una anche se si usano software diversi.
Detto questo non si può non aggiungere che Firefox possiede un aggregatore integrato e che il suo segnalibri raccoglie in automatico i feed RSS come se fossero dei link già memorizzati. L’utente potrà scegliere se salvarli o meno.
Non ci resta che chiarire cosa sia il feed RSS: altro non è che un file di testo contenente dei tags che consentono la letture feed RSS mediante l’utilizzo di un aggregatore.
Occorre ricordare che un feed RSS è in formato XML e che per essere visualizzato all’interno di una pagina web deve essere inserito in una pagina HTML attraverso l’uso di script o di linguaggi quali ASP e PHP, mentre negli casi è sufficiente un aggregatore.
Alla luce di quanto detto si può evincere quanto sia semplice l’utilizzo degli RSS considerando anche che sono estensibili e versatili e aggiornabili in tempo reale e quindi consentono ad esempio di metterne in tempi brevissimi i contenuti su un portale o su un weblog. Credo che per il responsabile di un sito (content manager) o per chi si occupa di comunicazione in Rete siano diventati indispensabili proprio per la loro praticità d’uso e i molteplici campi di applicazione.
Vediamo ora un semplice esempio di feed RSS:

<?xml version="1.0"?>

<rss version="2.0">
<channel>
<title>grolug news</title>
http://www.grolug.org
<description>Le News di grolug</description>
<item>
<title>Open source:le novità</title>
http://www.grolug.org/news/open_news.htm
<description>Crisi della Microsoft a causa di una massiccia perdita di utenti passati a Linux </description>
<dc:creator>Klizya</dc:creator>
<pubDate>2005/07/29</pubDate>
</item>
</channel>
</rss>

In dettaglio:
Abbiamo già detto che un feed RSS è in formato XML e che esistono diversi “dialetti” di RSS e lo vediamo dalle prime due righe.
Il channel fornisce le indicazioni sul canale nel senso che il link indicato potrebbe non essere quello del sito ma di una sua sezione.
In questo esempio troviamo un solo item ma a seconda delle esigenze potranno essere diversi. In pratica si tratta di scegliere cosa pubblicare e i modi per farlo. Potrà essere una news come nel nostro caso o una pagina di offerte o il post di un blog.
La description contiene la prima parte di quello che sarà il contenuto da visualizzare.

Infine si notano il nome dell’autore e la data di creazione.
Semplice no?
L'esempio proposto ci fa notare, se pensiamo ad HTML, che anche RSS è un linguaggio di markup,usa tag che definiscono il modo in cui un documento sarà interpretato. Ma mentre Il markup di HTML è fatto per essere interpretato dai browser, i tag RSS fanno intuire di cosa si parla sia all’utente che alla macchina.
Abbiamo detto che si possono creare feed RSS a partire da una pagina HTML (scraping) vediamo come:

Esempio di feed rss con PHP
Come prima cosa è utile creare una classe per creare un feed RSS inserendo i parametri obbligatori o più utilizzati. Questa è una delle tante disponibili sul web e mi è sembrata la migliore ognuno lo adatterà alle sue esigenze. Verrà salvata come rss.php e la ritroveremo nell’include del prossimo file che chiameremo output_rss.php.

rss.php

<?php
class MakeRSS{
var $Articles = array();

// Channel info
var $title = '';

var $link = '';
var $description = '';
var $optional = array();
var $image = array('url' => '', 'title' => '', 'link' => '', 'description' => '', 'w' => 0, 'h' => 0);

function MakeRSS($title, $link, $description, $optional = ''){
$this->title = $title;
$this->link = $link;
$this->description = $description;

if( is_array($optional) and count($optional) ){
$this->optional = $optional;
}
}

function AddOptional($key, $value){
$this->optional[$key] = $value;

}

function AddImage($title, $url, $link, $description = ''){
$this->image['title'] = $title;
$this->image['url'] = $url;
$this->image['link'] = $link;

$this->image['description'] = $description;

if( $tmp = @getimagesize($url) ){
$this->image['w'] = ($tmp[0] > 144) ? 144 : $tmp[0];
$this->image['h'] = ($tmp[1] > 400) ? 400 : $tmp[1];

}
}

function AddArticle($title, $link, $description, $author, $optional = ''){
$i = array_push($this->Articles, array('title' => $title, 'link' => $link, 'description' => $description, 'author' => $author));

if( is_array($optional) and count($optional) ){
--$i;
while( list($k, $v) = each($optional) ){
$this->Articles[$i][$k] = $v;
}

}
}

function Output($save = false, $path = ''){
$out = '<?xml version="1.0"?>' . "\n" .

'<rss version="2.0">' . "\n" .
'<channel>' . "\n";

$out .= "<title>$this->title</title>\n" .

"$this->link\n" .
"<description>$this->description</description>\n";

//Channel optionals

if( is_array($this->optional) and count($this->optional) ){
while( list($k, $v) = each($this->optional) ){
$out .= "<$k>$v</$k>\n";

}
}

//Image
if( $this->image['title'] and $this->image['url'] and $this->image['link'] ){
$out .= "<image>\n" .

"<title>" . $this->image['title'] . "</title>\n" .
"<url>" . $this->image['url'] . "</url>\n" .

"" . $this->image['link'] . "\n";

if( $this->image['description'] ){
$out .= "<description>" . $this->image['description'] . "</description>\n";

}

if( $this->image['w'] and $this->image['h'] ){
$out .= "<width>" . $this->image['w'] . "</width>\n" .

"<height>" . $this->image['h'] . "</height>\n";
}
$out .= "</image>\n";

}

//Articles
for( $i = 0, $c = count($this->Articles); $i < $c; $i++ ){
$out .= "<item>\n" .

"<title>" . $this->Articles[$i]['title'] . "</title>\n" .
"" . $this->Articles[$i]['link'] . "\n" .

"<description>" . $this->Articles[$i]['description'] . "</description>\n" .
"<author>" . $this->Articles[$i]['author'] . "</author>\n";

if( count($this->Articles[$i]) > 4 ){
while( list($k, $v) = each($optional) ){
if( !in_array($k, array('title', 'link', 'description', 'author')) ){
$out .= "<$k>$v</$k>\n";

}
}
}


$out .= "</item>\n";

}

$out .= "</channel>\n</rss>";


// True output
if( !$save or !$path ){

header("Content-type: application/xml");
echo $out;
return true;
}
else{

$fh = fopen($path, 'w');
if( $fh )
fwrite($fh, $out);
fclose($fh);

return true;
}

return false;
}
}
}
?>


output_rss.php


include('./rss.php'); $r = new MakeRSS('Feed RSS in php, 'http://www.grolug.org/howto', 'HOWTO’);
$r->AddArticle('Guide', 'http://www.grolug.org/howto/open_source.php?id=1', 'guida all’installazione di Samba', 'Klizya');
$r->Output();

Il feed RSS creato sarà:


<?xml version="1.0"?>

<rss version="2.0">
<channel>
<title>Feed RSS in php</title>
http://www.grolug.org/howto
<description>HOWTO</description>
<item>

<title>Guide</title>
http://www.grolug.org/howto/open_source.php?id=1
<description>guida all’installazione di Samba</description>
<author>klizya</author>
</item>
< </channel>

</rss>




Esempio di feed RSS con ASP
Adesso passiamo ad ASP e teniamo sempre come obiettivo il feed RSS creato con PHP ma supponiamo di avere un data base dove abbiamo memorizzato il nostro elenco di howto.

<%
'Stringa di connessione al nostro Data Base
StrConnessione = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & server.MapPath("/rss/ASP") & "\News.mdb"

Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open StrConnessione
'Istruzione SQL che prende i campi dal Data Base
SQL ="SELECT * FROM howto_list Order by idhowto titolo"
Set rs = Server.CreateObject("ADODB.RecordSet")
rs.CursorLocation=3

rs.Open SQL, Conn, 1,1
' Numero totale di records
totfiles = rs.recordcount
strxml = "<?xml version=""1.0"" encoding=""UTF-8""?><rss version=""0.91""><channel>

<title>La lista dei nostri howto
</title>
<description>Howto
</description>
http://www.grolug.org/howto "
'Se il Record Set non è vuoto
if totfiles <>0 then

Do while not rs.eof
strxml = strxml & "<item>"
strxml = strxml & "<title><![CDATA[" & rs("titolo") & "]]></title>"

strxml = strxml & "<description><![CDATA[" & rs("descrizione") & "]]></description>"
strxml = strxml & "<![CDATA[http www.grolug.org/howto/dbhowto.asp?id=" & rs("idhowto") & "]]></item>"

rs.movenext
Loop
End if
strxml = strxml & "</channel></rss>"
' per dare l’impostazione al tipo di file in output su XML
response.ContentType = "text/xml"
response.write xml

'chiusura della connessione
rs.close
set rs=nothing
Conn.Close
set Conn=nothing
%>

Fonti:
http://pro.html.it

http://www.kataweb.it/
http://it.wikipedia.org
per la classe:
http://freephp.html.it/articoli/print_articolo.asp?id=103
http://www.phpclasses.org/browse.html/package/559.html
Link utili:
http://www.repubblica.it/servizi/rss/guida.html per i feed RSS.
http://www.ipse.com/rssit.html per vedere qualche esempio di siti che utilizzano feed RSS

http://www.kataweb.it/spec/articolo_speciale.jsp?ids=625458&id=627029 per la scelta di un aggregatore.
http://www.risorse.net/feed/ per alcuni esempi di codice.

Nessun commento: