Rafael Clares


RSS – Inserindo notícias em seu site
Outubro 14, 2008, 12:33 am
Arquivado em: PHP, XML | Tags: , , , ,

 Pessoal tenho visto pela web muitas formas de inserir notícias em uma página utilizando RSS/XML, muitas dessas formas funcionam bem em qualquer situação e outras não. Resolvi postar aqui uma das que funcianam bem, claro, além de ser de simples alteração.

O arquivo abaixo retorna apenas os links das notícias, então o que vocês precisam fazer nada mais é que mudar o valor da var $feed inserindo a URL que desejar, a váriavel $qtdelinks informa a quantidade de links de notícias que retornarão ao fim das instruções, você pode mudar seu valor também. 

Escolha um local em seu site e use include(‘feeds.php’);  para incluir os links no site!

Salve-o como feeds.php

<?php
# Iniciando as variaveis

# Url do RSS / Feed
$feed = ‘http://feeds.folha.uol.com.br/folha/mundo/rss091.xml;
# Quantidade de links que serão exibidos
$qtdelinks=5;
# Variavel que aramazena os links
$html = ”;
# Variavel utilizada no laço x quantidade de links (set)
$i=0;
# Variavel que recebe os dados do url
$xml = ”;
# Abrindo o arquivo remoto
$fp = fopen($feed, ‘r‘);
while (!feof($fp))
{
    # Armazenando o conteudo do arquivo na variavel XML
    $xml .= fread($fp, 128);
}
# Fechando o arquivo
fclose($fp);

# Função que captura o conteudo das Tags
function untag2($string, $tag)
{
    $tmp = array();
    # Informando as tags passadas no parametro para obter o conteudo
    $preg = “|<$tag>(.*?)</$tag>|s”;
    # Obtendo o conteudo das tags passadas no param e adicionando em tags
    preg_match_all($preg, $string, $tags);
    # Para cada tag contida em no array tags
    foreach ($tags[1] as $tmptag)
    {
       # Adicionando no array tmp o conteudo das tags
        $tmp[] = $tmptag;
    }
    # Retornando um array com conteudo de cada tag 
    return $tmp;
}

# Retornando  o conteudo de todas as tags item  do RSS / XML
$items = untag2($xml, ‘item‘);

# Retornando cada tag item do array items
foreach ($items as $item)
{
   if ($i < $qtdelinks)
   {
      # Recuperando o conteudo da tag title
      $title = untag2($item, ‘title‘);
      # Recuperando o conteudo da tag href / link
      $link  = untag2($item, ‘link‘);
      # Armazenando o link na var html / utf8_decode trata os acentos no titulo
      $html .= ‘<a href=”‘.$link[0].‘” target=”_blank”>’.utf8_decode($title[0]).”</a><br>\n“;
      $i++;
   } 
}
# Exibindo o HTML gerado
echo $html;
?>

Utilize o CSS do seu site para formatar os links, não precisa alterar nada na variável($html) que concatena os links. Se preciso adicione apenas o atributo Class (se seu css já não estiver tratando todas as tags A href).

É isso aí, apenas.

O exemplo funcionando aqui.   Download do exemplo funcionando aqui.

Obrigado,

Rafael Clares


36 Comentários até o momento
Deixe um comentário

Ótimo tutorial, simples e preciso. Porém, ainda tenho uma dúvida: quando clico na notícia, não consigo acessar a página com a notícia. Em vez disso, o navegador tenta abrir a página como se ela estivesse hospedada no meu próprio site. Tem como resolver isso?

Comentário por Heloisa

Oi Heloisa, poderia colocar o código aqui para vermos juntos. Importante também ver de onde você está recebendo as noticias. Aguardo seu comentário com o código. Até logo,

Comentário por Rafael Clares

Se atraplhei pedindo o e-mail me desculpe so achei que seria mais simples do que ficar trocando comentario pelo blog.

Bom, gostaria de saber passo a passo como implementar isso e usar o serviço de php, nao entendo muito sobre esse tipo de linguagem.

Um passo-a-passo seria bem bacana ainda mais para um leigo.
Obrigado

Comentário por André

Olá André, obrigado pelo comentário. Amigo a intenção do blog é justamente trocar comentários. Imagine 50 pessoas com a mesma dúvida que você e eu tendo que escrever 50 emails, viu só, assim sua dúvida irá ajudar outras pessoas. Mas tem uma coisa, não tem como ficar mais explicado que isso o exemplo se pensarmos em leigos como você mencionou.
Uma dica que dou à todos é: façam o upload do arquivo para seu site e testem on-line, testar localmente pode ser bem demorado ou ainda travar, então quando estiver desenvolvendo comente a linha que inicia a leitura do RSS (se for um include por ex). O exemplo acima está funcionando como podem ver no link, mas se eu testar localmente vai demorar ou travar.
Obrigado

Comentário por Rafael Clares

Muito legal este codigo, vou implementar nos meus sites

Comentário por Messias Anjos

Olá Rafael! Gostei do post, más eu queria algo mais.
Veja bem, eu quero colocar esse feed no meu site mas não quero que abra a página inteira do endereço colocado, e sim que a noticia abra em uma popup.será que atraves de algum script isso é possível?

Comentário por carlos

Olá, em primeiro ligar quero agradecer pela ajuda que seu blog traz a nós, programadores.
Criei meu site 100%, desde o layout e logotipo até todo o código-fonte usando PHP, gostaria que desse uma olhada em meu site e desse sua opinião, ele é muito recente e eu ainda estou tentando melhorá-lo, existem algumas ferramentas no painel de administração que eu criei que ainda estão em desenvolvimento, mas todo o site é dinâmico e utiliza banco de dados MySQL e seu conteúdo é adicionado pelo próprio navegador.
Agradeço pela atenção e parabéns pelo blog e sua competência.

http://www.TheNets.org :: Os Melhores Programas

Comentário por Luiz Felipe

Olá Luiz, obrigado pelo comentário. Vi seu site tá muito bom, achei bem profissional e com conteúdo bem distribuído, bacana mesmo cara parabéns.
obs: um dia eu chego lá!!!
abraços

Comentário por Rafael Clares

publiquei este artigo no site de um cliente e os acentos não aparecem, o que tenho que adicionar ou modificar. o site esta hospedado em um servidor linux do terra. grato.

Comentário por Weliton Eloilson

Olá Weliton, você precisa mudar o encoding da sua página que está lendo o XML, você pode adicionar inicio do seu arquivo PHP o que segue:
@header(‘Content-Type: text/html; charset=iso-8859-1′);
Dentro das tags PHP, claro. Outra tentativa que pode fazer caso essa não funcione é retirar o trecho do código que converte o conteudo com utf8_decode
que está na 5 linha de baixo para cima no arquivo feeds.php, retire o utf8_decode($title[0]) e deixe somente o $title[0], mas isso depois de testar com o cabeçalho PHP que eu disse acima, somente se ele não funcionar. Qualquer coisa me diga..

Comentário por Rafael Clares

Certo Rafael, mas onde eu tenho que inserir @header(’Content-Type: text/html; charset=iso-8859-1′); pois a segunda opção tb não deu certo, ficarei grato se conseguir colocar no site sem esse problema. o site é http://www.vecaadvogados.com obrigado!

Comentário por Weliton Eloilson

Obrigado Rafael esta fuincionando…muito obrigado.

Comentário por weliton

Olá Rafael parabéns pelo trabalho eu estou com um probleminha aqui segue os erros…

Warning: feof(): supplied argument is not a valid stream resource in /home/eduardodafo/public_html/homo/wp-content/themes/probama/feeds.php on line 18

Warning: fread(): supplied argument is not a valid stream resource in /home/eduardodafo/public_html/homo/wp-content/themes/probama/feeds.php on line 21

Comentário por Wanderson

Olá Wanderson, obrigado pelo comentário!
Olha só, para eu te ajudar preciso saber o que tem na linha que aponta o erro…
Você modificou algo no código, certo ? Pode colocar o trecho do código que está dando erro?
até logo,

Comentário por Rafael Clares

Rafael o seguite código estava comentado “ini_set(‘allow_url_fopen’, true);” quando eu retirei o comentário funcionou tranquilo. Outra coisa sem querer abusar muito, mas você sabe como eu faço pra exibir a data e hora da notícia?

Comentário por Wanderson

Wanderson, é fácil, basta você adicionar a tag que possui tal informação no foreach, nesse trecho do código por ex:
$link = untag2($item, ‘link’);
estamos atribuindo link da notícia à variável link, certo ?
Podemos adicionar qualquer TAG contida no XML/RSS, por exemplo…
No RSS do jornal Estadão a data/hora está na TAG “pubDate”, logo, temos:
$data = untag2($item, ‘pubDate’); // recuperada data da tag pubDate
$html .= “Data de publicação: $data[0]“;

Espero ter ajudado ou dado uma direção ao menos.
abraços,

Comentário por Rafael Clares

Rafael,

Desculpe fica te enchendo, mas o que eu posso te errado, segue o código abaixo, porém na index só retorna “Array”…

# Retornando cada tag item do array items
foreach ($items as $item) {
if ($i < $qtdelinks)
{
# Recuperando o conteudo da tag title
$title = untag2($item, ‘title’);
# Recuperando o conteudo da tag href / link
$link = untag2($item, ‘link’);
# recuperada data da tag pubDate
$data = untag2($item, ‘pubDate’);
# Armazenando o link na var html
$html .= ‘» ‘.$title[0].”\n”. $data;
$i++;
}
}

Comentário por Wanderson

Wanderson, não está errado mas acontece que vc não informou o indice no vetor $data que incrementa o link.
$data[0];
Tá certinho, veja:
http://clareslab.com.br/learn/feeds/feeds2.php

Abraços,

Comentário por Rafael Clares

Karaca, que lerdo eu sou… Valeu….

Comentário por Wanderson

olha o erro que ta dando o seu script no meu site, me ajuda a resolver isto.. obrigado pela atenção

Comentário por Allan

Allan, como diz a mensagem exibida em sua página, a função fopen está desabilitada em seu servidor. Solicite ao host para habilita-la. abraços

Comentário por Rafael Clares

Otima funcão! Funcionou legal aqui!
Obrigado!

Comentário por Victor Lelis

Ae velho gostei do teu php cara!Mas olha só no meu localhost abre legal…mas no servidor não,ja tinha tentado até outro escript rss/xml e aconteceu a mesma coisa.
O servidor é da via-rs.net,o problema é la isso é certo!
tem alguma idea do que pósa ser?

agradeço se puder me ajudar

Comentário por Lucas

Olá Lucas, o problema pode estar relacionado as permissões ao uso da função fopen, certifique-se com seu host quanto a permissão de uso do comando, isso é estranho mas já fiz uso de um host que não me deixava usar a função, o motivo não sei. Pow mas se os caras não lhe derem uma solução aproveita e muda para meu host ha-ha.

abraços,

Comentário por Rafael Clares

Eles não disponibilizam função fopen do php!!
Vo ter que usar a função curl!!!

agradeço a atenção!!

Comentário por Lucas

Gostaria de saber se a partir desse código é possível filtrar posts por TAGS específicas. Acrescentar algo nesse arquivos feeds.php que fizesse aparecer apenas os posts do blog que interessasse.

Comentário por Olá!

Olá Priscila,
tem sim, na verdade você pode colocar apenas os canaisl RSS que lhe interessem.
Na váriável $feed do código está contido o endereço do jornal A Folha mas você pode
trocar esse endereço pelo endereço do canal de um blog.

Quaisquer dúvidas, fique à vontade para perguntar.

Comentário por Rafael Clares

Sim eu sei que é possível setar canais, mas gostaria de dentro de um RSS de um blog eu pudesse filtrar algumas TAGS somente. Por exemplo, gostaria que de todos os post do site X, apenas os que se referem a “gripe suína” aparecessem nessa lista que estou publicando em meu site. É possível?

Comentário por Priscilla

Tem como diminuir o espaçamento entre as notícias? Coloquei em meu site o teu código mas tão muito longe as notícias, dá uma olhada ae, http://www.portalpitimbu.com.br desde já agraceço.

Comentário por Pedro

Ola Rafael, bem legal este seu post, mas como citaram acima, meu servidor bloqueia a função Fopen, dizem q fica vulnerave a ataques, mas tem como usar outra (Curl), vc conhece ela? poderia disponibilizar ela para mim e para a galera q sofre com isso. abraço

Comentário por Estevão

Estevão,

$url = “blablablabla.xml”;

if (!defined(“ch”))
{
function setupch()
{
$ch = curl_init();
$c = curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
return($ch);
}
define(“ch”, setupch());
function curl_get_contents($url)
{
$c = curl_setopt(ch, CURLOPT_URL, $url);
return(curl_exec(ch));
}
}

Comentário por Rafael Clares

Ola muito obrigado pela dica, graças a pessoas como vc q a net vale a pena. mas estou com uma duvida, preciso add mais algum codigo a este ai acima? ou posso só copiar em um arq. novo e fazer um include? fiz isso e n’ao apareceu nada na area da noticia. grato pela ajuda.!!

Comentário por Estevao

Ola Rafael muito obrigado pelo codigo, me ajudou bastante, mas tem um problema q não aparece nada qdo eu coloco este codigo, ele precisa ter mais algum codigo para funcionar ou eu posso criar um arq. novo com este q vc me passou e chama-lo com um include? se puder mandar ai… estou pegar os rss de informatica do terra. obrigado pela atenção!!

Comentário por Estevão

Dá sim Priscila, mas assim…. você vai precisar fazer uma busca no titulo da notícia, então acredito que usando expressões regulares para fazer essa busca na tag title você consiga o que quer, claro que não será 100% por que pode ser que hava uma matéria sobre tal assunto mas que o título não faça referência direta, mas acredito que conseguirá 99% das notícias que procura.
Dê uma buscada no google sobre Expressões regulares (preg_match_all) no PHP e aplique na linha
$title = untag2($item, ‘title‘);

Boa sorte!

Comentário por Rafael Clares

Perfeito!! Muito obrigada Rafael! =)

Comentário por Priscilla

Estevão, pode fazer include sim!

Comentário por Rafael Clares




Deixe um comentário
Linhas e parágrafos quebram automaticamente, endereços de email não serão mostrados, HTML permitido: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <pre> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>