Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

D. SC

Ler vários Feeds e organizá-los por data

Recommended Posts

Olá.

 

Estive pesquisando no Google algo parecido e encontrei ótimos resultados, porém, não era ainda o que eu queria. Eu vi alguns tutoriais ensinando algo do tipo, mas todos utilizavam apenas um Feed e eu quero fazer com que leia mais de um. Vários.

 

Tem como fazer isso com PHP? Se sim, só dá com um mesmo? Se só der um, tem outro modo de fazer isso, com outra linguagem ou algo assim?

Compartilhar este post


Link para o post
Compartilhar em outros sites

1 - recupere os feeds que você quer;

2 - armazene-os em banco de dados, com um campo de data de publicação

3 - recupere do banco, ordenando pela data de publicação.

Compartilhar este post


Link para o post
Compartilhar em outros sites

1 - recupere os feeds que você quer;

2 - armazene-os em banco de dados, com um campo de data de publicação

3 - recupere do banco, ordenando pela data de publicação.

Hm.

 

Mas todas as novas postagens vão para o banco de dados na mesma hora em que aparece no Feed, certo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso vai depender da sua implementação.

Em teoria, todos os feeds em XML tem a data da publicação.

Basta você pegar esta data do XML e gravar no banco.

 

@braços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso vai depender da sua implementação.

Em teoria, todos os feeds em XML tem a data da publicação.

Basta você pegar esta data do XML e gravar no banco.

 

@braços

Eu quis dizer:

 

- Adicionei um Feed de um blog. Legal.

O autor do blog posta algo novo e a postagem vai pro Feed.

- A postagem automaticamente vai para o banco de dados.__

_______________________________________________ |

|

\ /

\/

Não vai?

Compartilhar este post


Link para o post
Compartilhar em outros sites

D. SC,

 

Se for um feed externo, por exemplo noticias de um portal tipo G1, R7 etc, os feeds só serão gravados no momento em que a aplicação for executada, ou melhor, quando a página for acessada.

 

Se o feed for interno, ou gerado por uma aplicação sua, então vc pode gravar no banco no momento em que o feeds forem publicados.

 

Entendeu?

 

Agora, dependendo do seu serviço de hospedagem, existe a possibilidade de se agendar uma tarefa no servidor com hora marcada que pode executar um script que leia os feeds e grave no banco. Mas isso depende do serviço de hospedagem.

 

Qualquer que seja a opção escolhida, é preciso ter cuidado para não gravar feeds repetidos. Seria bom que vc também implementação uma rotina que apagasse registros muito antigos do banco, isso evita que sua tabela fique muito grande.

Compartilhar este post


Link para o post
Compartilhar em outros sites

D. SC,

 

Se for um feed externo, por exemplo noticias de um portal tipo G1, R7 etc, os feeds só serão gravados no momento em que a aplicação for executada, ou melhor, quando a página for acessada.

 

Se o feed for interno, ou gerado por uma aplicação sua, então vc pode gravar no banco no momento em que o feeds forem publicados.

 

Entendeu?

 

Agora, dependendo do seu serviço de hospedagem, existe a possibilidade de se agendar uma tarefa no servidor com hora marcada que pode executar um script que leia os feeds e grave no banco. Mas isso depende do serviço de hospedagem.

 

Qualquer que seja a opção escolhida, é preciso ter cuidado para não gravar feeds repetidos. Seria bom que vc também implementação uma rotina que apagasse registros muito antigos do banco, isso evita que sua tabela fique muito grande.

Entendi. Já utilizei um serviço de hospedagem que oferece essa função. Eu evitava escolher gravar os feeds em um banco de dados para não deixar a tabela muito grande.

 

Meu serviço de hospedagem oferece a função de agendar um script, mas não sei como o mesmo poderia ser.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A questão do número de registros ser grande não é um agravante, desde que você tome os devidos cuidados no inicio do projeto.

Se você sabe que pode ter um volume de dados alto, pode escolher o tipo de escalonamento de dados adequado (particionamento, índices, etc).

 

Em relação a como ela poderia ser, vai depender também das informações que você deseja armazenar.

 

Na sua opinião, quais são os dados mais relevantes dos feeds que deseja gravar?

 

Responda a pergunta acima e terá, praticamente, a estrutura da tabela.

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

D. SC,

 

Pelo que estou vendo, vc esta querendo ler RSS externos, certo.

 

Primeiro vc precisa saber o URL dos RSS. Depois descobir qual o formato do retorno, geralmente XML. Nesse caso, o que vc precisa fazer é usar a biblioteca SimpleXML do PHP (http://php.net/manual/pt_BR/book.simplexml.php). Vê lá que tem exemplos pra vc ver como funciona.

 

Ah! Pode ser que vc tenha que definir as diretivas do php para que ele possa acessar arquivos externos ao site. Acho que ativando só a primeira diretiva funciona, se não funcionar habilite a segunda também.

 

# Permitindo acesso a arquivos externos ao site.
ini_set("allow_url_fopen", 1); //função habilitada
#ini_set("allow_url_include", 1); //função habilitada

Compartilhar este post


Link para o post
Compartilhar em outros sites

D. SC,

 

Pelo que estou vendo, vc esta querendo ler RSS externos, certo.

 

Primeiro vc precisa saber o URL dos RSS. Depois descobir qual o formato do retorno, geralmente XML. Nesse caso, o que vc precisa fazer é usar a biblioteca SimpleXML do PHP (http://php.net/manual/pt_BR/book.simplexml.php). Vê lá que tem exemplos pra vc ver como funciona.

 

Ah! Pode ser que vc tenha que definir as diretivas do php para que ele possa acessar arquivos externos ao site. Acho que ativando só a primeira diretiva funciona, se não funcionar habilite a segunda também.

 

# Permitindo acesso a arquivos externos ao site.

ini_set("allow_url_fopen", 1); //função habilitada

#ini_set("allow_url_include", 1); //função habilitada

Já tô enchendo o saco, hein? rs.

 

Eu dei uma boa olhada na página, mas sou péssimo em inglês e entendi pouca coisa :(. Mas eu já conhecia a biblioteca SimpleXML do PHP. Eu sei mais ou menos como ler um feed (externo, sempre me esqueço de dizer) por meio do SimpleXML, mas só um.

 

Dá para ler mais de um feed externo por meio do SimpleXML? Se sim, como é pra fazer mais ou menos? NUNCA achei uma resposta. :cry:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ler um, ou vários, é a mesma coisa.

Faça uma função que recebe a URL do feed como argumento:

 

/**
 * função para carregar o conteúdo de um feed em um XML
 * 
 * @param string $url URL do feed
 * @return DOMDocument Objeto XML para poder extrair os dados
 * @author Hugo Silva
 */
function getFeed( $url ){
	$ch = curl_init( $url );
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($ch, CURLOPT_CRLF, true);
	
	$result = curl_exec($ch);
	
	$xml = new DOMDocument();
	$xml->loadXML( $result );
	
	return $xml;
}

Defina os Feeds que deseja obter

$urls = array(
	'http://imasters.com.br/feed/',
	'http://esporte.uol.com.br/ultimas/index.xml',
	'http://noticias.terra.com.br/rss/Controller?channelid=e3c54b844f65e310VgnVCM3000009acceb0aRCRD&ctName=atomo-noticia'
);

Depois leia cada um deles

foreach($urls as $url){
	$xml = getFeed( $url );
	$xpath = new DOMXPath($xml);
	$channel = $xpath->query('//channel')->item(0);
	
	$title = $xpath->query('title', $channel)->item(0)->nodeValue;
	$items = $xpath->query('item',$channel);
	
	echo '<h1>', ($title ?: $url) , '</h1>';
	
	foreach($items as $item){
		
		echo '<a target="_blank" href="', $xpath->query('link', $item)->item(0)->nodeValue, '">';
		echo htmlentities($xpath->query('title', $item)->item(0)->nodeValue, ENT_COMPAT, 'UTF-8');
		echo '</a><br>';
		
		$dataNode = $xpath->query('pubDate', $item)->item(0);
		
		if(!empty($dataNode)){
			$data = new DateTime( $dataNode->nodeValue );
			echo $data->format('d/m/Y H:i:s'), '<br><br>';
		}
	}
}

@braços

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.