Como detectar se uma página é um feed RSS ou ATOM
-
19-09-2019 - |
Pergunta
Atualmente estou construindo um novo leitor de feeds on-line em PHP. Uma das características que eu estou trabalhando é alimentar auto-descoberta. Se um usuário insere uma URL do site, o script irá detectar que a sua não um feed e olhar para o URL do feed verdadeira analisando o código HTML para a tag apropriada.
O problema é, a maneira im atualmente detectar se o URL é um feed ou um site só funciona parte do tempo, e eu sei que não pode ser a melhor solução. Agora im levando a resposta CURL e executá-lo através simplexml_load_string, se ele não pode analisá-lo eu tratá-lo como um site. Aqui está o código.
$xml = @simplexml_load_string( $site_found['content'] );
if( !$xml ) // this is a website, not a feed
{
// handle website
}
else
{
// parse feed
}
Obviamente, isso não é o ideal. Além disso, quando ele é executado em um site HTML que pode analisar, ele acha que é um feed.
Todas as sugestões sobre uma boa maneira de detectar a diferença entre um feed ou não-alimentar em PHP?
Obrigado,
Pimenta http://feedingo.com
Solução
Eu farejar para os vários identificadores exclusivos esses formatos têm:
Atom: Fonte
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
RSS 0.90: Fonte
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://my.netscape.com/rdf/simple/0.9/">
Netscape RSS 0.91
<rss version="0.91">
etc. etc. (Veja o link da fonte 2 para uma visão geral completa).
Tanto quanto eu posso ver, separando Atom e RSS deve ser muito fácil, procurando por <feed>
e <rss>
marcas, respectivamente. Além disso, você não vai encontrar aqueles em um documento HTML válido.
Você poderia fazer uma verificação inicial para dizer HTML e alimentações de distância, procurando por <html>
e <body>
elementos primeiros. Para evitar problemas com uma entrada inválida, este pode ser um caso em que o uso de expressões regulares (mais de um analisador) é finalmente justificada por uma vez :)
Se ele não coincidir com o teste HTML, execute os testes Atom / RSS sobre ele. Se ele não é reconhecido como um animal, ou as bobinas parser XML em uma entrada inválida, cair de volta para HTML novamente.
o que parece em estado selvagem - se os prestadores de alimentação sempre estar de acordo com essas regras -. É uma questão diferente, mas você já deve ser capaz de reconhecer um monte desta forma
Outras dicas
Eu acho que a melhor opção é obter o cabeçalho Content-Type
como eu assumir que é a maneira como o Firefox (ou qualquer outro browser) faz isso. Além disso, se você pensar sobre isso, o Content-Type
é realmente o caminho servidor informa os agentes do usuário como processar o conteúdo da resposta. Quase qualquer servidor HTTP decente envia um cabeçalho Content-Type
correta.
No entanto, você pode tentar identificar RSS / Atom no conteúdo como uma segunda opção se o primeiro "não" (este critério é até você).
Um benefício adicional é que você só precisa solicitar o cabeçalho em vez de todo o documento, poupando-lhe largura de banda, tempo, etc. Você pode fazer isso com a onda como esta:
<?php
$ch = curl_init("http://sample.com/feed");
curl_setopt($ch, CURLOPT_NOBODY, true); // this set the HTTP Request Method to HEAD instead GET(default) and the server only sends HTTP Header(no content).
curl_exec($ch);
$conType = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
if (is_rss($conType)){ // You need to implement is_rss($conType) function
// TODO
}elseif(is_html($conType)) { // You need to implement is_html($conType) function
// Search a rss in html
}else{
// Error : Page has no rss/atom feed
}
?>
Por que não tentar analisar seus dados com um componente construído especificamente para analisar RSS / Atom Feed, como Zend_Feed_Reader
?
Com isso, se a análise for bem-sucedido, você vai ter certeza de que a URL que você usou é de fato um feed RSS / ATOM válido.
E devo acrescentar que você poderia usar um tal componente de alimentação de análise, a fim de extrair suas informações, também: não há necessidade de re-inventar a roda, a análise do XML " à mão ", e lidar com casos especiais você mesmo.
Pepper,
Use o Content-Type cabeçalho de resposta HTTP para envio para o manipulador de direito.
Jan