
Já faz algum tempo coloquei no ar um planeta reunindo atualizações nos meus blogs. Isso, quem quiser ver o que é atualizado nos meus blogs é só visitar http://bardo.cyaneus.net/planeta.
Para isso, utilizei o software moonmoon. Trata-se de um planeta em PHP muito fácil de instalar, apesar de apresentar poucas opções configuração. Não usa banco de dados nem nada e mantém o histórico de publicações. Estou satisfeito com ele e segue como dica pra quem precisar instalar um planetinha simples.
Você já sabe o que é RSS? É uma tecnologia muito simples e sensacional, que nos ajuda a acompanhar diversos sites de maneira otimizada. Infelizmente nem todo site oferece o arquivinho mágico do RSS...
Se o site for mesmo interessante para nós, podemos fazer nosso RSSficado (este termo foi muito usado no passado, mas hoje, com quase todo site oferecendo RSS, acho que ninguém nem se lembra mais dele). E este é mais um artigo técnico... Desta vez envolvendo PHP.
A forma simples de gerar um RSS é partindo de um molde. Você pode preferir usar uma biblioteca para fazer isso, o que é mais elegante, mas neste exemplo veremos via molde. Se quiser uma biblioteca, uma de que gosto bastante é a LastRSS.
Vamos usar como modelo o RSS deste site mesmo (Bardo). Veja que ele é um arquivo XML, que apresenta um cabeçalho fixo. Cada notícia é representada por um conjunto de tags próprio.
Abaixo segue a parte fixa já modificada. Todos os valores já foram substituídos por variáveis (que você vai ter que criar, mas veremos isso depois). Coloque todo esse código como resultado de um comando de impressão PHP, no final do arquivo:
<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0" xml:base="$a_site">
<channel>
<title>$a_titulo</title>
<link>$a_site</link>
<description>$a_descricao</description>
<language>pt</language>
$a_noticias
</channel>
</rss>
Cada notícia é definida com o seguinte código:
<item>
<title>$n_titulo</title>
<link>$n_link</link>
<description>$n_descricao</description>
</item>
Dá pra entender qual o roteiro, né? Devemos extrair todas as notícias e montar uma string com o código acima para cada uma delas (substituídas as variáveis). Essa string se chamará $a_noticias e será usada depois pelo código externo (mostrado lá em cima).
Para fazer um script que gere um RSS para uma página, você precisa de uma página que não gere automaticamente um RSS. Claro que você pode usar uma que já ofereça um RSS, mas aí não tem graça, né?
Vamos usar como exemplo o site da Editora Daemon.
Precisamos ver o código-fonte HTML. A idéia da extração é encontrar pontos de quebra. Ou seja, mamos transformar a página em picadinhos e catar os pedaços que nos interessem.
Pra começar, vamos preencher os campos gerais, pois isso nos poupa algum trabalho:
$a_titulo = "Editora Daemon";
$a_site = "http://www.daemon.com.br";
$a_descricao = "Site da editora brasileira de livros de RPG.";
Agora precisamos filtrar as notícias. Vejamos o código-fonte da página:

Para o PHP, ver o código-fonte do site da Daemon significa precisamente (lembre-se que definimos $a_site lá em cima):
$a_vetor = file($a_site);
Como queremos uma string e não um vetor de linhas, faça mais isso:
$a_texto = implode(" ", $a_vetor);
Felizmente, no nosso caso, o código é organizado o suficiente para utilizar uma classe CSS para o título de cada notícia. Isso facilitará muito o trabalho.
Mas calma! Nem tudo são flores! Temos um ponto de quebra excelente para o início de cada notícia, mas e quando a última termina? Como o leiaute do site utiliza tabela, vamos usar como ponto de quebra o </td>. Melhor ainda! Vamos quebrar em td>, pois assim eliminamos também o início da célula de conteúdo! ;-)
O que isso quer dizer?
$a_td = split("td>", $a_texto);
Pronto, agora temos que achar a posição do vetor onde estão as desejadas notícias. Como fazer isso? Tentativa e erro! Testei aqui e concluí que estão na posição 2 de $a_td.
Agora sim, usaremos como ponto de quebra a referência à classe CSS. Veja como:
$a_central = $a_td2;
$a_class = split("class=\"noticia_titulo\">", $a_central);
Pronto! Temos um vetor com as notícias! Todos seus componentes, do segundo (o primeiro é o início da tag (<div), ao último têm notícias. Claro, de forma bruta ainda, mas já são as notícias. Faremos então um laço de repetição nesse vetor para tratar cada notícia.
O que separa o título do corpo da notícia é a string </div><div class="noticia">. Neste caso, claro! Assim, para cada notícia façamos outra quebra. O título será a primeira posição do vetor resultante. A segunda será o corpo da notícia, mas falta lapidar.
$n_principal = split("</div><div class=\"noticia\">", $n_cada);
$n_titulo = $n_principal0;
$n_bruto = $n_principal1;
Para limpar o final do corpo da notícia, tiraremos o </div>. Depois disso precisamos converter alguns caracteres para entidades HTML. Assim,
$n_div = split("</div>", $n_bruto);
$n_ecom = preg_replace("/\&/", "&", $n_div0);
$n_quase = preg_replace("/\</", "<", $n_ecom);
$n_descricao = preg_replace("/\>/", ">", $n_quase);
Infelizmente a Editora Daemon não utiliza links para cada notícia, assim teremos que atribuir sempre o link para a página inteira. Truque? Claro! Colocamos um valor inútil no final só pra marcarmos o link como lido! ;-)
$n_link = $a_site . "?" . urlencode($n_titulo);
Pronto! É só isso! É só colocar as strings do Molde, juntando com esse código mínimo extrator e temos um RSSficado! Veja como fica o código completo!
<?php
$a_titulo = "Editora Daemon";
$a_site = "http://www.daemon.com.br";
$a_descricao = "Site da editora brasileira de livros de <span class="caps">RPG.</span>";
$a_vetor = file($a_site);
$a_texto = utf8_encode(implode(" ", $a_vetor));
$a_td = split("td>", $a_texto);
$a_central = $a_td<sup class="footnote"><a href="#fn2">2</a></sup>;
$a_class = split("class=\"noticia_titulo\">", $a_central);
$a_noticias = "";
for ($i = 1; $i < sizeof($a_class); $i++) {
$n_cada = $a_class[$i];
$n_principal = split("</div><div class=\"noticia\">", $n_cada);
$n_titulo = $n_principal<sup class="footnote"><a href="#fn0">0</a></sup>;
$n_bruto = $n_principal<sup class="footnote"><a href="#fn1">1</a></sup>;
$n_div = split("</div>", $n_bruto);
$n_ecom = preg_replace("/\&/", "&", $n_div<sup class="footnote"><a href="#fn0">0</a></sup>);
$n_quase = preg_replace("/\</", "<", $n_ecom);
$n_descricao = preg_replace("/\>/", ">", $n_quase);
$n_link = $a_site . "?" . urlencode($n_titulo);
$a_noticias .= "\t<item>
<title>$n_titulo</title>
<link>$n_link</link>
<description>$n_descricao</description>
</item>";
}
header("Content-Type: text/xml; charset=utf-8");
print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<rss xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:creativeCommons=\"http://backend.userland.com/creativeCommonsRssModule\" xmlns:feedburner=\"http://rssnamespace.org/feedburner/ext/1.0\" version=\"2.0\" xml:base=\"$a_site\">
<channel>
<title>$a_titulo</title>
<link>$a_site</link>
<description>$a_descricao</description>
<language>pt</language>
$a_noticias
</channel>
</rss>";
?>
Note as duas linhas de cabeçalhos HTTP para fechar o trabalho de RSSficado.
E veja como foi possível fazer um RSS em 40 linhas! E olhe que nem usamos bibliotecas (só o PHP mesmo), e ainda criamos um monte de variáveis desnecessárias, só pra ficar mais didático). Dava pra fazer em bem menos que isso!
É isso. Quando precisar de um RSS pra um site que não oferece esse recurso, é só seguir esses passos. E quando terminar, tente ver se ele passa na validação.
Claro que essa versão é bem primitiva. Se quiser divulgar a URL de um RSS seu feito desse modo, implemente Cash (ou use o Feedburner).
-- Cárlisson Galdino
Comentários recentes
19 semanas 4 dias atrás
34 semanas 19 horas atrás
34 semanas 5 dias atrás
35 semanas 3 dias atrás
43 semanas 5 dias atrás
48 semanas 6 dias atrás
51 semanas 3 dias atrás
51 semanas 5 dias atrás
51 semanas 5 dias atrás
1 ano 4 semanas atrás