Criando Feeder RSS usando PHP

Outro dia precisei fazer alguns feeders RSS para o Guia Entrada Franca, daí dei uma zapeada pela net e não tive maiores problemas em achar material de qualidade para me informar sobre como fazer meu próprio feeder. Porém, achei que as informações estavam muito espalhadas, então resolvi fazer esse mini-tutorial com o mínimo necessário para você ter um feeder RSS funcionando sem dores de cabeça. É um tutorial que realmente tem o mínimo necessário, então não reclamem pela falta de profundidade (você deve saber o mínimo de PHP e seu uso com MySQL) :P Ao final do post, vou colocar umas referências sobre RSS, além de colocar umas durante a explicação, quando for pertinente.

Uma pincelada sobre formato do XML do RSS

Vamos lá. O formato RSS é um XML que segue umas regrinhas especiais. Um Exemplo de RSS olá mundo seria:

``` {#line9} <?xml version="1.0"?> Meu Primeiro RSS http://rss.meuprimeirorss.com.br Este é o meu primeiro alimentador RSS pt-br Título do meu primeiro item Esta é a descrição do meu primeiro post http://www.meuprimeirorss.com.br/topico.php?id=3400

Para testar, coloque salve esse arquivo com o nome de **rss.xml** \(o
nome não é importante, é apenas uma sugestão\), e coloque em algum lugar
visível pelo seu navegador. Vale ressaltar que esse tal lugar visível
deve ser dentro de um servidor *http* \(como o *Apache*\), não funcionando
se for aberto com o comando ***abrir arquivo*** do navegador. No meu
caso, eu o coloquei pra rodar no meu *Apache*, então no *Firefox* \(no
meu caso, versão 3.0.6)\, fiquei com o seguinte resultado no navegador:

\[caption id="" align="aligncenter" width="495"\]![Resultado no Firefox
3.0.6](http://imagens.sahb.com.br/RSS_TESTE.JPG){width="495"
height="430"} Resultado no Firefox 3.0.6\[/caption\]

Vamos por partes agora \(sem referências ao "Jack, o Estripador" :P \). Na
primeira linha, nós temos um início padrão pra arquivos XML, nada fora
do comum ou que você tenha que se preocupar \(considerando que você só
está interessado em fazer um feeder RSS)\. Bom, acho que posso dizer a
mesma coisa sobre a segunda linha. Então eu quase poderia dizer idem pra
terceira, mas gostaria só de falar que ela abre o *channel*, e pediria
pra vocês notarem que ela termina no final do RSS. Agora vamos às linhas
mais interessantes. O título vai em *&lt;title&gt;&lt;/title&gt;*, acho
tranquilo \(sem a trema :P\) mapear o título no XML e no *Firefox*. A
descrição do canal vai em *&lt;description&gt;&lt;/description&gt;*,
idem na facilidade de mapeamento. O endereço do próprio *feeder* vai
entre as tags *&lt;link&gt;&lt;/link&gt;*, e no caso da figura acima,
deveria ser *http://localhost/rss.xml*, mas deixei
*http://rss.meuprimeirorss.com.br* para ficar mais claro, não sei se foi
a opção mais didática, mas, enfim, está explicada a tag link. A tag
*&lt;language&gt;* denota a linguagem em que o RSS está escrito \(não,
não é linguagem de programação se você pensou nisso :P\). Bom, creio que
você não irá usar outra que não seja **pt-br** \(Português do Brasil\).
Uma lista dos códigos das linguagens que pode ser encontrada
[aqui](http://www.rssboard.org/rss-language-codes) \(está em inglês\). É
interessante notar que para definir o canal \(*channel*\), são
obrigatórias as tags *title*, *description* e *link* apenas. Para ver
todas as opções para o canal e para o item, que vai ser discutido agora,
dê uma olhada [aqui](http://www.rssboard.org/rss-specification) \(em
inglês também, mas gosto de pegar a referência mais oficial, e no meu
ver, essa é a mais oficial e completa\).

Vamos agora ao tal *item* mencionado anteriormente. O *item* é meio que
o item do RSS mesmo, sendo uma notícia, um evento, um post ou qualquer
coisa que seja listada no *feed*. O item não possui campos obrigatórios,
porém a especificação do RSS 2.0 apenas recomenda que existam pelo menos
os 3 campos que eu listei no exemplo, *title*, *description* e *link*.
Mais uma vez, acho que não preciso explicar o que eles são, apenas falar
que o título vira um link para o endereço listado pela tag com esse
nome. Mas como pôde ser visto na referência, existem inúmeros outros
campos que podem aparecer no item. O *feed* pode ter tantos itens quanto
você deseje, então creio que dito isso, você sabe o mínimo necessário
para ter um *feeder* RSS "na mão". Vamos agora ao mínimo necessário para
você fazer um feeder em PHP, para facilitar sua vida.

##### Fazendo um Feeder RSS em PHP {#fazendo-um-feeder-rss-em-php style="text-align: left;"}

Se você opta por fazer um RSS em PHP, provavelmente você já tem um banco
de dados com as notícias ou o que seja que você irá listar, e
provavelmente sabe se conectar ao banco usando PHP. Se você não sabe,
nem tem nada disso, um tutorial mais completo nesse sentido pode ser
encontrado
[aqui](http://www.webreference.com/authoring/languages/xml/rss/custom_feeds/index.html)
\(em inglês\). Vamos então a um esqueleto de um *feeder* RSS em PHP.
<? 
ob_start();
header("Content-Type: application/xml; charset=UTF-8");
//conexao ao banco, query, etc vem aqui

//aqui, como os delimitadores do php podem ser confundidos com
// o delimitador do XML, coloquei essa primeira linha dentro de
// 'echo' como forma mais simples, a meu ver, de resolver isso. 
echo "<?xml version=\"1.0\"?>";
?>
<rss version="2.0">
 <channel>
    <title>Meu Primeiro RSS</title>
    <link>http://rss.meuprimeirorss.com.br</link>
    <description>Este é o meu primeiro alimentador RSS</description>
    <language>pt-br</language>
<?
// aqui sao feitas as atribuicoes aos campos retornados pelo banco
// suponha que o banco tenha as colunas id, titulo e descricao
while($linha = mysql_fetch_array($resultado_da_query)) {
   echo"      <item>\n";
   $id = $linha['id'];
   $descricao = $linha['descricao'];
   $titulo = $linha['titulo'];
   echo "          <title>$titulo</title>\n";
   echo "          <description>$descricao</description>\n";
   echo "          <link>http://www.meusite.com.br/noticia.php?id_noticia=$id</link>\n";
   echo "      </item>\n";
}
?>
   </channel>
</rss>
<? ob_end_flush(); ?>
Você pode estar se perguntando, só isso? É... só isso... Como você deve
saber programar em PHP, deve ter notado que usei
[***ob\_start()***](http://php.net/ob_start) e
[***ob\_end\_flush()***](http://php.net/ob_end_flush). Por que? Se sua
requisição ao banco demorar algum tempo, ou o carregamento do conteúdo
do PHP demorar, o Firefox pode não interpretar o conteúdo como um RSS e
mostrar um XML sem muito sentido para o usuário. Então o servidor só
manda o conteúdo inteiro, depois de tudo processado. Talvez hajam
maneiras mais elegantes de se resolver isso, mas essa foi a que adotei,
por achar mais simples \(a boa e velha [Navalha de
Occam](http://pt.wikipedia.org/wiki/Navalha_de_Occam), ou, Occam's
Razor). Sugestões nos comentários serão bem-vindas sempre :\)

Note também o que o cabeçalho da página  *\(header*\) foi forçado a ter
codificação ***UTF-8*** \(caso tenha problemas com codificação, recomendo
dar uma lida nisso
[aqui](http://local.joelonsoftware.com/wiki/O_M%C3%ADnimo_Absoluto_Que_Todos_os_Programadores_de_Software_Precisam,_Absolutamente,_Positivamente_de_Saber_Sobre_Unicode_e_Conjuntos_de_Caracteres_(Sem_Desculpas!)\),
o título é bem elucidativo :P\), e foi avisado que era um XML, para que
não hajam sobressaltos nem problemas na interpretação do seu feed pelos
leitores. Funciona sem, mas recomendo deixar aí por via das dúvidas :\)

##### Dica para tornar seu feeder mais bacaninha :\)

Você já deve ter visto vários sites que têm aquele simbolozinho do RSS
na barra de endereços do *Firefox* para você se inscrever no Feed
daquela página. Como fazer isso? Simples, é só adicionar o seguinte
código ao cabeçalho \(header, ou seja dentro das tags
*&lt;head&gt;&lt;/head&gt;*\):
<link rel="alternate" type="application/rss+xml"
    title="Meu RSS 1" href="http://www.meusite.com.br/rss/">

<link rel="alternate" type="application/rss+xml"
    title="Meu RSS 2" href="http://www.meusite.com.br/rss2/">

<link rel="alternate" type="application/rss+xml"
    title="Meu RSS 3" href="http://www.meusite.com.br/rss3/">

``` Você pode colocar só um, mas coloquei 3 só pra mostrar que podem haver vários.

Por onde começar a se aprofundar

Especificação do RSS

Tópico na Wikipedia em português sobre RSS

Tópico na Wikipedia em inglês sobre RSS

Bom, é isso... Talvez tenha sido muito superficial, mas... era só o mínimo necessário mesmo. Espero que seja útil. Comentários, dúvidas, sugestões, comentários off-topic e qualquer outra coisa serão bem-vindos :) (menos spam...\ddaasd)

[]'s

Sahb,.