PT-CODE

Scripters do Metaverso

RSS

128px-Feed-icon_svg

 

1.O que é o RSS?

RSS (“Rich Site Summary” ou “Really Simple Syndication”) é uma forma de organizar a informação de um Web site  em documentos chamados “feeds”, de forma a notificar todos os interessados em ler e acompanhar novos conteúdos.

Jornais e revistas online, blogs e outros editores, unem-se para publicar em consórcio os conteúdoas das suas páginas web,  num formato padrão organizada em “Feeds RSS”, para fácil leitura e acompanhamento por parte dos subscritores.

2.Porquê o RSS?

O RSS veio solucionar o problema de todos os utilizadores da web, mantendo-os sempre informados sobre as novidades no conteúdo dos web sites sem necessidade de estarem permanentemente a visitar as páginas para saberem o que mudou.

Por outro lado a privacidade dos utilizadores é protegida, por não haver necessidade de subscrever “newsletters” ou “mailing lists”, para se manterem informados.

O número de sites que usam RSS, cresce diariamente e praticamente todos os sites noticiosos e  blogs já usam RSS.

3.O que é necessário para usar RSS?

 

Para ter acesso e poder utilizar os “feeds RSS” é necessário um software ou sistema chamado “Feed Reader” ou “News Aggregator”. Existem softwares deste tipo para todos os sistemas e plataformas e alguns são baseados na web.

Entre os mais populares encontramos o  Amphetadesk (Windows, Linux, Mac), FeedReader (Windows),  e o  NewsGator (Windows – Outlook).  Na web, os mais conhecidos são  My Yahoo, Bloglines, e Google Reader .

Depois de escolher um “Feed Reader”, poderão ser adicionados  sites com o seu conteúdo em feeds  RSS. A maioria dos sites mostrará um Icon 16px-Feed-icon_svg que indica a existência de conteúdos em RSS, XML, or RDF.

4.Como funciona o RSS?

  • Existem algumas páginas web, que interessa aos donos, sejam vistas noutros websites. Esse conjunto de páginas deverá ser incluído nos Feeds RSS.
  • É criado um ficheiro XML que define o feed de RSS. Esse ficheiro contém o URL, título e o sumário de cada uma das páginas.
  • A pessoa que pretende ler o feed, no seu computador usa um Leitor de RSS ou o browser e adiciona o feed com o comando respectivo do seu software.
  • Pode ainda ser outro Website que pretende mostrar o feed. Nesse caso terá de carregar o feed a partir da fonte, e fazer a extracção das páginas para mostrar os títulos e sumários das páginas. Isso pode ser feito por exemplo por um script em PHP.
  • Quando alguem visita o website do recebedor, o script faz uma chamada ao ficheiro RSS do fornecedor e mostra a lista de artigos/notícias extraidas.
  • Qaundo o leitor clicar numa linha da lista de RSS o total do conteúdo do fornecedor irá ser mostrado.

5.Qual é a estrutura de um ficheiro RSS?

  • É um ficheiro XML e o container global é a tag “RSS” para o formato 2.0, ou outro.
  • O ficheiro contém pelo menos um canal que é o website fornecedor da informação.
  • O canal fornece artigos ou dados que são páginas web do mesmo site ou de outros sites.

6.Como posso publicar notícias ou outro conteúdo num feed RSS?

Há diversas formas de gerar feeds RSS.

  • Usando uma biblioteca de PHP. O script  PHP irá construir o ficheiro XML com base  dos títulos e descrições das páginas a partir da página principal de conteúdos.
  • Usando uma ferramenta específica para retirar os dados a partir de uma webpage.

Para dar acesso ao ficheiro XML , terá de ser fornecido um link  16px-Feed-icon_svg

<a type=”application/rss+xml” href=”http://www.pt-code.com/rss.xml”> feed RSS para este site</a>

Para feeds no formato “Atom”  usa-se  “application/atom+xml” .

7.Como sabem os browsers da existência de um fedd RSS no website?

Depois de criar o ficheiro com o feed RSS e colocá-lo no directório de raiz do website, temos de indicar aos browsers a existência dele e respectiva localização.Para activar o RSS, basta colocar  a seguinte linha, no código da página, na secção <head> </head> :

<link rel="alternate" type="application/rss+xml"
href="http://www.o_seu_site.xx/rss.xml" title="O seu título" >

8.Estrutura do ficheiro RSS

O fixeiro RSS, é um ficheiro XML na versão 1.0 constituído por duas tags principais:

rss. container global.
channel. O canal de distribuição. Poderá ter diversas tags descritivas e diversos items.

Exemplo:

<rss version=”2.0″>
<channel>

</channel>
</rss>

Para um canal(channel), existem as seguintes tags obrigatórias:

  • title. O título do canal.Normalmente, o nome..
  • link. URL do website que fornece o canal.
  • description. Um sumário de quem é o fornecedor.
  • pelo menos uma tag  item para o conteúdo.

Exemplo:

<rss version=”2.0″>
<channel>
<title>PT-Code</title>
<link>http://www.pt-code.com/</link>
<description></description>
<item>
</item>
</channel>
</rss>

Para um canal(channel), existem as seguintes tags opcionais:

  • language. A linguagem humana do canal.
  • docs. Onde encontrar a especificação do formato do ficheiro, como por exemplo Harvard.
  • webMaster. E-mail do webmaster.
  • pubDate. Data de publicação.
  • etc. Existem outras tags opcionas que podem ser usadas(ver especificação detalhada).

Um canal pode conter diversos items. A tag  item  deverá conter as seguintes tags:

  • title. Título do artigo.
  • link. O URL da página ou website.
  • description. O sumário do artigo.

Exemplo:

<item>
<title>Notícias PT-Code</title>
<link>http://www.pt-code.com/</link>
<description>… texto descritivo… </description>
</item>

Existem ainda diversas tags opcionais que podem ser usadas no item:

  • pubDate. Data de publicação
  • guid. AUma chave única que identifique este item.
  • category. A categoria do artigo.
  • etc.

9.Construção de um feed RSS (passo-a-passo)

Pode ser usado um simples editor de texto, embora seja mais fácil, com um editor de XML.

Pode-se criar por exemplo um ficheiro de texto com o nome “rss.xml”.

A estrutura de base do ficheiro deverá ser a seguinte:

<?xml version=”1.0″ ?>
<rss version=”2.0″>
<channel>

</channel>
</rss>

a) Definir a fonte de informação, através da tag “channel”

O  canal será sempre o mesmo para todos os feeds RSS.

Colocar as tags obrigatórias na estrutura de base:

<channel>
<title>Titulo do canal aqui</title>
<link>http://www.url_do_site.xx</link>
<description>Descrição do canal</description>
</channel>

b) Adicionar uma imagem

A imagem é sempre opcional.Desenhe uma pequena imagem (por exemplo com dimensão 80×40), num formato web (gif, jpg, png), e coloque-a no mesmo directório do ficheiro RSS.
A tag  ”image” é um sub-elemento da tag “channel”.
- url é o endereço da própria imagem.
- link link é o endereço da página que vai ser mostrada ao clicar na imagem.

<channel>
<title> </title>
<link> </link>
<image>
<url>http://www.url_da_imagem.xx/imagem.gif</url>
<link>http://www.url_do_destino.xx/index.html</link>
</image>
</channel>

c) Adicionar uma notícia

Terá de ser adicionada uma webpage para mostrar a informação. Essa informação é anunciada no feed RSS com a tag ”item” , um sub-elemento da tag ”channel”.”Item” é obrigatório:
- title: o título da notícia.
- link: oURL da página.
- description: um sumário da notícia com cerca de 200 caracteres.

<item>
<title>Notícia do dia</title>
<link>http://www.url_da_noticia.xx/ndd.html</link>
<description>…aqui coloca-se um breve sumário da notícia …</description>
</item>

Podem depois ser adicionados mais “Items” ao canal.

d) Terminar
  • Colocar o ficheiro “rss.xml”. no site junto com as outras páginas
  • Validar o ficheiro, usando um Validadaor de Feeds RSS.
  • Disponibilizar o feed colocando um link 16px-Feed-icon_svg nos locais pretendidos <a href=”http://www.pt-code.com/rss.xml”> <img src=”rss.gif”> </a>
e) Actualizar o feed

Para actualizar o feed com novas notícias, basta adicionar mais “Items” ao ficheiro com a estrutura descrita.

f)Exemplo completo

<?xml version=”1.0″ ?>
<rss version=”2.0″>

<channel>
<title>Titulo do canal aqui</title>
<link>http://www.url_do_site.xx</link>
<description>Descrição do canal</description>

<image>
<url>http://www.url_da_imagem.xx/imagem.gif</url>
<link>http://www.url_do_destino.xx/index.html</link>
</image>

<item>
<title>Notícia1 do dia</title>
<link>http://www.url1_da_noticia.xx/ndd.html</link>
<description>…aqui coloca-se um breve sumário da notícia 1…</description>
</item>

<item>
<title>Notícia2 do dia</title>
<link>http://www.url2_da_noticia.xx/ndd.html</link>
<description>…aqui coloca-se um breve sumário da notícia 2 …</description>
</item>
</channel>

</rss>

10.Construção de um Leitor de  feeds RSS (em PHP)

(Para compreender na totalidade a seguinte parte deste Tutorial, é necessário que o leitor tenha os conhecimentos básicos de programação e funcionamento de PHP)

Agora que já é conhecida a estrutura de um documento RSS, vamos brevemente explicar como construir um “parser” em PHP, para ler e mostrar o conteúdo.

Variáveis Globais

A primeira função que vamos analisar precisam de algumas variáveis globais acessíveis em todo o “scope”.

$_item = array();
$_depth = array();
$_tags = array("dummy");
/* "dummy" previne subtracções desnecessárias nos indices $_depth */

Função initArray()

Esta função inicializa o arry $_item assegurando que todas as chaves são configuradas e que todas apontam para “strings” vazias.

Esta função será chamada, cada vez que é encontrada uma tag de abertura dos tipos  image, item, ou channel.Será também usada após ser fechada cada uma dessas tags e em todas as atribuições na  rotina de “parsing”.

Function initArray()
{
 global $_item;
 $_item = array ("TITLE"=>"", "LINK"=>"","DESCRIPTION"=>"", "URL"=>"");
}

Função startElement()

Para trabalhar com XML em PHP , é necessário especificar uma função a ser chamada cada vez que é encontrada uma tag de abertura. Esta função serve para isso mesmo.

Conforme se pode verificar examinando a função, se uma tag de abertura de item, channel, ou image é encontrada, é chamada a função initArray. Então quer seja ou não encontrada uma dessas tags de abertura , o array  $_depth é incrementado e o  nome da tag de abertura é puchado para o array $_tags.

 

function startElement($parser, $name, $attrs)
{
 global $_depth, $_tags, $_item;
 if (($name==”ITEM”) || ($name==”CHANNEL”)|| ($name==”IMAGE”)) {
  initArray();
 }
 $_depth[$parser]++;
 array_push($_tags, $name);
}
 
 

 

Função endElement()

Da mesma forma que temos que chamar uma função para as tags de abertura, temos também de chamar uma sempre que é encontrada uma tag de fecho. A função endElement manipula aquilo que é mostrado no estado actual do “parsing”. À medida que as tags de fecho vão sendo encontradas, esta função mostra a informação correspondente a essa tag. Promeiro é mostrado o elemento de topo no arry $_tags, e depois são decrementados os elementos do array $_depth. Como já foi dito, é também chamada a função initArray após ser mostrada a informação.


 
function endElement($parser, $name)
{
 global $_depth, $_tags, $_item;
 array_pop($_tags);
 $_depth[$parser]–;
 switch ($name) {
 case “ITEM”:
  echo “<p><a href={$_item['LINK']}>” .”{$_item['TITLE']}</a></p>\n”;
  initArray();
  break;
 case “IMAGE”:
  echo “<a href={$_item['LINK']}>” .”<DEFANGED_IMG src={$_item['URL']} ” .”alt={$_item['TITLE']}; border=0></a>\n<br />\n”;
  initArray();  
  break;
 case “CHANNEL”:
  echo “<h3>{$_item['TITLE']}</h3>\n”;
  initArray();
  break;
 }
}

 

 

Função parseData()

Ésta função é onde a informação é armazenada no array $_item . Sempre que aparecem dados que necessitam “parsing”, esta função é invocada. Os dados relevantes, são constituidos por tada a informação não pertencente à tag elementar.
A primeira coisa que esta função faz, é determinar se se trata apenas de um espaço em branco, ignorando-o. Se o conteúdo for útil, então é registado em $_item .
 
 

function parseData($parser, $text)
{
 global $_depth, $_tags, $_item;
 $crap = preg_replace (“/\s/”, “”, $text);
 /* os dados são apenas um espaço em branco? Se sim, então ignorar */
 if ($crap) {
  $text = preg_replace (“/^\s+/”, “”, $text);
  /* remover os espaços em branco iniciais */
  if ($_item[$_tags[$_depth[$parser]]]) {
   $_item[$_tags[$_depth[$parser]]] .= $text;
  } else {

   $_item[$_tags[$_depth[$parser]]] = $text;
  }
 }
}

 
  

Função parseRDF()

Esta função é um “Gestor de chamadas”  para todas as outras.  Ao usar esta função não teremos de ter qualquer preocupação em chamar qualquer uma das outras.

começa com a criação do “parser” e depois chama a função initArray. As funçãos de manipolação de abertura e fecho de tags e de dados, são registadas em seguida. Logo a seguir, a função prosegue abrindo o ficheiro indicado e fazendo o “parsing” do mesmo, verificando que se trata de um documento RSs válido. O ficheiro é posteriormente fechado e libertada a memória do “parser”. 

 

function  parseRDF($file)
{
 global $_depth, $_tags, $_item;
 $xml_parser = xml_parser_create();
 initArray();
 /* Configurar a manipulação de eventos */
 xml_set_element_handler($xml_parser, “startElement”, “endElement”);
 xml_set_character_data_handler($xml_parser, “parseData”);
 /* Abrir o ficheiro */
 $fp = fopen ($file, “r”) or die (“Não é possivel abrir $file para leitura”);
 while ($data = fread ($fp, 4096)) {
  if (!xml_parse($xml_parser, $data, feof($fp))) {
   die (sprintf(“Erro XML: %s na linha %d”,
   xml_error_string(xml_get_error_code ($xml_parser)),
   xml_get_current_line_number($xml_parser)));
  }
 }
 fclose($fp);
 xml_parser_free($xml_parser);
}

Exemplo de Uso

<?php
parseRDF("
http://www.pt-code.com/?feed=rss2");
?>

Agradecimento

Obrigado a  “uncleozzy” pela sua contribuição em  “Code Gallery”,  e também a “xul.fr”

Até breve ,  e bom “Scripting”!!

Partilha este artigo com outros:
  • Digg
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • Sphinn
  • LinkedIn
  • Twitter
  • Technorati
  • Mixx
  • MySpace
  • PDF
  • RSS
  • Wikio
  • Yahoo! Bookmarks