Tutorial: Como fazer feeds RSS de outros sites/Usando PHP

De Projeto RSSficado 2

Este artigo pertence à seção

RSS Avançado
do
Projeto RSSficado 2

Sub-seções...

Broadcatching
Como fazer feeds RSS de outros sites
Divulgue seus sites RSSficados

Outras seções...

Feeds RSS para Iniciantes
Podcasting para iniciantes
Blogueiros e webmasters
Avançado
Desenvolvedores

Se procura informações para criar um feed RSS usando algum serviço online sem saber uma linguagem de programação acesse: Como fazer feeds RSS de outros sites

Neste momento usaremos PHP e Expressões Regulares, algo que vai nos trazer uma grande flexibilidade, pois boa parte dos sites que não possuem feeds RSS utilizam um código não validado e/ou semântico. O padrão escolhido foi o RSS 2.0, você pode também usar o Atom, com algumas modificações. O site de exemplo é o mesmo, o Teste RSSficar.


Índice de conteúdo

[editar] Requisitos

  • Uma página do site escolhido que aglomere as últimas notícias enviadas. Algumas vezes será a página principal, outras será uma seção como "Notícias" ou "Arquivo";
  • Conhecimento básico de PHP e uma hospedagem de sites (Pode ser gratuita) que suporte allow_url_fopen ou pelo menos cURL;
  • Conhecimento intermediário de Expressões Regulares. Para ajudar recomendamos o Guia de Consulta Rápida de Expressões Regulares feito por Aurélio Marinho Jargas e o programa RegexBuddy.


[editar] O que será feito

  • Pegar o código fonte do site escolhido e organizá-lo
  • Analizar o código fonte do site e criar expressões regulares que extraiam o título além do link/permalink (essenciais), conteúdo ou trechos dele, data de publicação, autor etc (Opcionais).
  • Formatar estes conteúdos e exibir um feed válido.


[editar] Extraindo o conteúdo do site

Neste ponto temos duas opções: Usar allow_url_fopen (file_get_contents() ou file()) ou cURL. Verifique com a sua hospedagem a disponibilidade de ambos para fazer sua escolha, ou verifique com um arquivo phpinfo(). Em ambos os casos terminaremos com a string $content com todo o conteúdo do site para parsearmos depois.

1. Usando allow_url_fopen:

$url = "http://z001.ig.com.br/ig/16/28/1025052/blig/rssficar/";
$content = file_get_contents($url);

2. Caso tenha escolhido cURL, criaremos uma pequena função para cuidar da extração do codigo fonte do site:

Para obter o código fonte acesse: Tutorial: Como fazer feeds RSS de outros sites/Usando PHP/Função_open_url

Como usá-la:

$url = "http://z001.ig.com.br/ig/16/28/1025052/blig/rssficar/";
  $content = open_url($url);

[editar] Organizar o conteúdo do site

  • Para evitar problemas de codificação de caracteres acentuados vamos transformar todo o conteúdo já em UTF-8, caso não já esteja. Nota: Lembre-se de salvar o arquivo final também em UTF-8, por isso evite usar o Bloco de Notas do Windows para criar os arquivos .php
$content = utf8_encode($content); //Use caso o site esteja em latin1 (ISO-8859-1) (A grande maioria dos sites)
$content = iconv('windows-1252', 'UTF-8', $content); //Use caso o site esteja em windows-1252 (Muito raro)
  • Em alguns casos pode se fazer necessário remover as quebras de linha, para isso use:
$linebreaks = array("\r", "\n");
$content = str_replace($linebreaks, "", $content);

[editar] Análise do código e expressões regulares

Este é o momento crítico da criação do feed RSS. Teremos que analisar o conteúdo do site e criar padrões consistentes para as expressões regulares extraírem os trechos que nos interessam. Há algumas maneiras de extrair todos os conteúdos interessantes sem correr o risco de acabar pegando mais coisas do que é necessário, uma delas são as expressões regulares apresentadas a seguir. Cada site é um caso diferente e cabe a você criar uma abordagem que seja eficiente para realizar a tarefa.

Veja este trecho que corresponde no código fonte a um post completo.

<a name='post_19020528'><span class='data_hora'>08/12/2007 12:44</span></a><br>
<br><b>4o post - Texto puro</b><br><br>
 
Este é um post com texto puro...<br>
 
<span class='nick'>enviada por pedro</span><br><script language='JavaScript'>exibeComentario(19020528,
'rssficar','2007_12.html#post_19020528');</script><br><br>

Neste caso podemos ver que dentro dos <span class='data_hora'>(Data)</span> temos a data do post, entre os <br><br><b>(Titulo)</b><br><br> temos o título, depois de </b><br><br> há o conteúdo do post, que termina antes de <br><span class='nick'>. Sabendo isso podemos criar nossa expressão regular.

A expressão regular abaixo é a responsável por extrair as datas, títulos e conteúdos, onde no array $dates_titles_summaries temos o índice 0 com a string completa, 1 com as datas, 2 com os títulos e 3 com o conteúdo do post. É possível extrair outros itens quanto você quiser, mas vamos nos atrelar aos mais importantes (Título, link, data, conteúdo).

preg_match_all("/<span class=\'data_hora\'>(.+?)<\/span><\/a><br><br><b>(.*?)<\/b><br><br>(.*?)<br>/", $content, $dates_titles_summaries);

Vamos extrair as datas do trecho abaixo, onde 2007_12.html#post_******** é a parte interessante.

<script language='JavaScript'>exibeComentario(19020528, 'rssficar','2007_12.html#post_19020528</b>');</script><br><br>

Expressão regular:

preg_match_all("/exibeComentario\\([0-9]+, \'.*?\',\'(.+?)\'\\);/", $content, $links);

[editar] Montando o script e resultado final

Terminada a fase das expressões regulares falta apenas criar o esqueleto do feed RSS e o loop que será responsável pela exibição dos conteúdos do feed. Neste link é possível ver o script em funcionamento: Testerssficar.php, já validado de acordo com o Feed Validaror O código fonte do script final é:

Para obter o código fonte acesse: Tutorial: Como fazer feeds RSS de outros sites/Usando PHP/Código fonte final

[editar] Opcionais

Algumas vezes você se deparará com problemas chatos de resolver, ou quer otimizar seu script, para isso fornecemos algumas funções interessantes para a tarefa:

  • do_cache.php - Sistema de Cache para os geradores de feeds, requer uma pasta cache com permissão de escrita para armazenar cópias dos sites com feeds gerados. Atualiza-se automaticamente a cada 20 minutos, possui funcionalidade de purgar o cache. Trabalha em conjunto com o cURL, podendo ser facilmente modificado para trabalhar com file_get_contents(). Uso: substitua open_url($url) por do_cache($url); no script.
  • acentuacao.php - Conjunto de funções para captalização ou descaptalização de palavras acentuadas em hosts que não fornecem "locales" em pt_BR.
Ferramentas pessoais