Gå til innhold

Blande rss-feeder med PHP


Anbefalte innlegg

Lagde en lignende tråd for noen månedere siden, men skal prøve å formulere meg på en litt bedre måte.

 

Si jeg har f.eks. 15 rss-feeder. Disse vil jeg blande sammen, for deretter å skrive de ut, sortert om hverandre etter når de er skrevet. Jeg fant en løsning for dette som var skrevet i Python (http://www.planetplanet.org/), men vil helst ha noe i PHP, slik at jeg kan få modifisert det slik jeg vil.

 

:)

 

 

Edit: Ikke misforstå tittelen, jeg skal ikke blande feeder MED php, men bruke php for å blande feeder. Men det skjønte dere.

Endret av madompa
Lenke til kommentar
Videoannonse
Annonse

Noe slikt som dette feks. Har ikke testa det, er bare en miks av to script jeg hadde liggende. Metoden er ikke helt god, siden den bruker timestamp som array-index, noe som ikke blir bra hvis flere nyheter er publisert samme sekund, noe som kan skje hvis de er forhåndssatt til å publiseres ved midnatt feks. Men du kan evt legge dem til med løpende array-index, og sortere på en annen måte manuelt.

 

function getRSS($url, $antall) {
global $rssitems;

// Lag et SimleXML-objekt fra RSS-fila
$xml = @simplexml_load_file($url);

// Sjekk at vi fikk parset fila
if (!$xml) {
	echo 'Feil under lesing av ekstern RSS-feed.';
	return false;
}


// Hent ønsket antall nyheter, og lagre dem
$i = 0;
foreach ($xml->channel->item as $item) {
	if ($i++ == $antall) { break; }
	$rssitems[strtotime($item->pubDate)] = $item;
}

// Melding hvis feeden er tom
if ($i == 0) {
	echo 'Ingen nyheter i den eksterne feeden.';
	return false;
}
}

header('Content-type: application/rss+xml');

echo '<?xml version="1.0" encoding="utf-8"?'.">\n";

echo '<rss version="2.0">'."\n";
echo "<channel>\n";
echo "  <title>Min side</title>\n";
echo "  <link>http:://www.minside.com</link>\n";
echo "  <description>Nyheter fra Min side</description>\n";
echo "  <language>no-bok</language>\n";
echo '  <pubDate>'.date('r')."</pubDate>\n";
echo '  <lastBuildDate>'.date('r')."</lastBuildDate>\n";
echo "  <ttl>120</ttl>\n";
echo "  <docs>http://blogs.law.harvard.edu/tech/rss</docs>\n";
echo "  <generator>rss.php</generator>\n";
echo "  <managingEditor>[email protected]</managingEditor>\n";
echo "  <webMaster>[email protected]</webMaster>\n";

$rssitems = array();
getRSS('http://test.no/rss/', 10);
getRSS('htto://test2.no/rss/', 10);

sort($rssitems);
foreach ($rssitems as $item) {
echo "  <item>\n";
echo "	<pubDate>".$item->pubDate."</pubDate>\n";
echo "	<author>".$title->author."</author>\n";
echo "	<title>".$item->title."</title>\n";
if (isset($item->link)) echo "	<link>".$item->link."</link>\n";
if (isset($item->guid)) echo "	<guid>".$item->guid."</guid>\n";
echo "	<description><![CDATA[".$item->description."]]></description>\n";
echo "  </item>\n\n";
}

echo "</channel>\n";
echo "</rss>\n";

Lenke til kommentar

Takk, den funket som smurt :D

 

Hva vil forresten skje hvis noen innlegg er publisert i samme sekund?

 

 

Edit: Ved en nærmere titt så funket den ikke helt, innleggene kommer ikke i kronologisk rekkefølge etter tid. Virker som om de kommer i en helt tilfeldig rekkefølge i grunn.

Endret av madompa
Lenke til kommentar
Gjest Slettet+142

Bruk ksort() for å sorterre $rssitems istedenfor ;)

 

function getRSS($url, $antall) {
global $rssitems;

// Lag et SimleXML-objekt fra RSS-fila
$xml = @simplexml_load_file($url);

// Sjekk at vi fikk parset fila
if (!$xml) {
	echo 'Feil under lesing av ekstern RSS-feed.';
	return false;
}


// Hent ønsket antall nyheter, og lagre dem
$i = 0;
foreach ($xml->channel->item as $item) {
	if ($i++ == $antall) { break; }
	$rssitems[strtotime($item->pubDate)] = $item;
}

// Melding hvis feeden er tom
if ($i == 0) {
	echo 'Ingen nyheter i den eksterne feeden.';
	return false;
}
}

header('Content-type: application/rss+xml');

echo '<?xml version="1.0" encoding="utf-8"?'.">\n";

echo '<rss version="2.0">'."\n";
echo "<channel>\n";
echo "  <title>Min side</title>\n";
echo "  <link>http:://www.minside.com</link>\n";
echo "  <description>Nyheter fra Min side</description>\n";
echo "  <language>no-bok</language>\n";
echo '  <pubDate>'.date('r')."</pubDate>\n";
echo '  <lastBuildDate>'.date('r')."</lastBuildDate>\n";
echo "  <ttl>120</ttl>\n";
echo "  <docs>http://blogs.law.harvard.edu/tech/rss</docs>\n";
echo "  <generator>rss.php</generator>\n";
echo "  <managingEditor>[email protected]</managingEditor>\n";
echo "  <webMaster>[email protected]</webMaster>\n";

$rssitems = array();
getRSS('http://test.no/rss/', 10);
getRSS('htto://test2.no/rss/', 10);

ksort($rssitems);
foreach ($rssitems as $item) {
echo "  <item>\n";
echo "	<pubDate>".$item->pubDate."</pubDate>\n";
echo "	<author>".$title->author."</author>\n";
echo "	<title>".$item->title."</title>\n";
if (isset($item->link)) echo "	<link>".$item->link."</link>\n";
if (isset($item->guid)) echo "	<guid>".$item->guid."</guid>\n";
echo "	<description><![CDATA[".$item->description."]]></description>\n";
echo "  </item>\n\n";
}

echo "</channel>\n";
echo "</rss>\n";

Lenke til kommentar

Husk en ting, for hver feed man henter ut, vil siden bli tregere ettersom bla hvor treg resusj-serveren er. Det vil si at om en eller fler av feedene er trege fra tid til annen, vil siden din ta veldig lang tid å laste. Hadde litt problemer med dette da jeg hentet ut nyheter fra flere aviser, og siden min tok opp mot ett minutt å laste :s

 

(Er ikke sikkert dette er relevant for in sak, men kanskje for andre som leser samme post å blir inspirert)

 

Løsningen jeg valgte for dette, er å laste inn innholdet med ajax, slik at brukeren får opp resten av siden, men en liten "Laster ned nyheter" melding mens dette pågår.

Lenke til kommentar
Løsningen jeg valgte for dette, er å laste inn innholdet med ajax, slik at brukeren får opp resten av siden, men en liten "Laster ned nyheter" melding mens dette pågår.

 

Du har ikke en mulighet til og poste den ajax biten?, jeg er helt noob på ajax, så en forklaring ville vært bra også.

 

-Fredrik

Lenke til kommentar
Du har ikke en mulighet til og poste den ajax biten?, jeg er helt noob på ajax, så en forklaring ville vært bra også.

<div id="content"></div>
<script type="text/javascript">
dynConObj = new DHTMLSuite.dynamicContent();
dynConObj.loadContent(\'content\',\'/ajax/news.php\');
</script>

Men den krever noen filer, og er litt tung. Disse finner du hos http://dhtmlgoodies.com/ (DHTML Suite'en - http://www.dhtmlgoodies.com/packages/dhtml...ns-ver-1-9.zip).

 

Ser også ut som det har kommet ett alternativ til: http://www.dhtmlgoodies.com/index.html?whi...dynamic-content

Lenke til kommentar
Løsningen jeg valgte for dette, er å laste inn innholdet med ajax, slik at brukeren får opp resten av siden, men en liten "Laster ned nyheter" melding mens dette pågår.

Ikke dumt. Men når siden i grunn bare skal inneholde rss-listen, så er vel ikke det nødvendig? (i mitt tilfelle altså)

Hvor mange feeder snakker vi om i forhold til hvor tregt det vil bli?

Lenke til kommentar
Bruk ksort() for å sorterre $rssitems istedenfor ;)

 

function getRSS($url, $antall) {
(..)
echo "</rss>\n";

Hm, jeg fikk heller ikke denne til å fungere. Innleggene kommer fortsatt i en ganske unaturlig rekkefølge. Det er litt rart, det virker som om de kommer i riktig rekkefølge noen ganger, mens noen innlegg plasserer seg helt ulogisk. :S

 

Neida, det funket visst helt fint. Problemet er bare at alt vises "baklengs". Prøvde å legge inn desc (ikke at jeg egentlig har peiling på hva jeg gjør) i ksort(), jeg fikk de i riktig rekkefølge men de delte seg, slik at jeg først fikk alle fra den ene feeden, og neste og neste. Hjelp :)

 

Edit: krsort() gjorde susen :) Se ikke bort i fra at jeg kommer tilbake med flere spørsmål ;)

Endret av madompa
Lenke til kommentar
  • 1 måned senere...

Et lite oppfølger-spørsmål; er det mulig å hente ut kanal-infoen fra hver enkelt feed, for hvert enkelt element? Om dere skjønner.

Slik at f.eks. sammen med hvert element som kommer fra VG-feeden i den ferdige feeden, følger med at kanal-tittelen er "VG Nett - siste nyheter"?

 

<channel rdf:about="http://www.vg.no/export/Alle/rdf.hbs">
 <title>VG Nett - siste nyheter</title>
<link>http://www.vg.no/</link>
<description>VG Nett</description>

Lenke til kommentar

bruk krsort() for å reversere sorteringen i stedet for ksort().

 

Driver å leker litt med koden selv, men får ikke importert enkelte RSS-feeder. hardware.no/feeds/general.xml virker som det skal, mens ba.no/rss/index.xml for eksempel ikke virker. Dersom jeg lagrer RSS-filen til ba.no lokalt på serveren og imorterer denne virker det som det skal. Noen kloke hoder som vet hva som gjør dette?

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...