Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: RSS-syötteiden tulostaminen nettisivulle

Antti80 [02.02.2008 18:37:41]

#

Haluaisin tulostaa n. 10 eri blogin (eli rss-syötteen) uusimmat otsikot omalle saitilleni. Tällaiseen tarvitaan siis jonkinlainen "parseri".
Tämä on yksinkertaisin php-parseri minkä olen löytänyt:
http://magpierss.sourceforge.net/

Toimii erinomaisesti ja helposti yhden blogin kohdalla ja voin määritellä otsikkojen määränkin. Mutta kun kyseessä on 10 (tulevaisuudessa voi lisääntyä) blogia niin en saanut tuota taipumaan mitenkään, että hakisi monesta eri blogista tuoreimmat otsikot. Googletin laihoin tuloksin. Osaako joku tuon kanssa auttaa vai onko jollain parempia parsereita tai ihan eri ideoita miten asia hoituisi?

pistemies [02.02.2008 19:05:13]

#

En ole lähemmin aiheeseen tutustunut, mutta arvelen, että kun noita eri syötteitä käydään läpi, niille tulisi määritellä kullekkin oma id-numero, jolloin kaikki syötteet olisi samassa arrayssa omassa "lokerossaan". Sitten vaan tulostaa ne sieltä.

Antti80 [02.02.2008 19:08:24]

#

Jotain sinnepäin varmaankin.

Tuossahan tulostaminen tapahtuu näin helposti:

<?php

			// lataa Magpie
			require('rss/rss_fetch.inc');

			// lataa RSS-tiedosto ja luo Magpie-objekti
			$uutiset = file_get_contents('http://feeds.feedburner.com/jokusivusto?format=xml');
			$uutiset = new MagpieRSS($uutiset);

			// leikkaa viisi viimeistä uutista
			$uutiset = array_slice($uutiset->items, 0, '5');

			// käy uutiset läpi yksi kerrallaan ja luo linkki
			foreach ($uutiset as $uutinen) {?>
			<a href="<?=$uutinen[link]; ?>"><?=$uutinen[title]; ?></a><br />
			<?php } ?>

Copypastesin tuon ja muutin linkin ja kaikki noi muuttujat muutin, mutta ei sentään niin helposti toiminut =) Tiedä sit pitäiskö ton parserin muita tiedostoja vielä jotenkin muuttaa vai riittääkö tuon koodipätkän muuttaminen?

Merri [02.02.2008 19:08:27]

#

Kyllähän tuo taipuu, joudut vain hakemaan kunkin blogin erikseen ja lopuksi yhdistämään tuloksia yhteen.

Itselläni tuo on yhdellä sivustolla niin, että se tallentaa tietokannan tauluun uudet linkit mitkä se huomaa, jolloin kannasta saa kätevästi kutsuttua useamman. Luonnollisesti RSS:n haku on asetettu toimimaan cronin kautta säännöllisin väliajoin, ja pakottaen magpien oman cachen pois.

<?php

// tarpeelliset tiedostot
require_once('magpierss/rss_fetch.inc');

header('content-type: text/plain; charset=utf-8');

// hae RSS-valikot tietokannasta
$lause = 'SELECT rss, charset, valikko_id, valikko
	FROM acms_valikot
	WHERE LENGTH(rss) > 0';
$tulos = $db->sql_query($lause);

$rivit = $db->sql_fetchrowset($tulos);

foreach($rivit as $rivi) {
	list($url, $charset, $valikko_id, $valikko) = $rivi;
	echo "Haetaan $valikko RSS...\n";

	// hae RSS
	$rss = fetch_rss($url);

	// tarvitseeko muuntaa UTF-8:ksi?
	$items = array();
	if( strtolower($charset) != 'utf-8' ) {
		for($i = 0, $maxi = count($rss->items); $i < $maxi; $i++) {
			$items[] = array(
				'title' => mb_convert_encoding($rss->items[$i]['title'], 'utf-8', $charset),
				'link' => mb_convert_encoding($rss->items[$i]['link'], 'utf-8', $charset),
				'description' => mb_convert_encoding($rss->items[$i]['description'], 'utf-8', $charset)
			);
		}
	} else {
		for($i = 0, $maxi = count($rss->items); $i < $maxi; $i++) {
			$items[] = array(
				'title' => $rss->items[$i]['title'],
				'link' => $rss->items[$i]['link'],
				'description' => $rss->items[$i]['description']
			);
		}
	}

	// hae kannassa olevat linkit
	$lause = 'SELECT linkki
		FROM acms_linkit
		WHERE valikko_id = '.$valikko_id.'
		ORDER BY linkki_id DESC
		LIMIT '.count($items);
	$tulos = $db->sql_query($lause);
	$linkit = array();
	while( $rivi = $db->sql_fetchrow($tulos) ) {
		$linkit[ $rivi[0] ] = true;
	}

	$lause_insert = array();
	for($i = count($items) - 1; $i >= 0; $i--) {
		// onko linkki tietokannassa?
		if(!$linkit[ htmlspecialchars($items[$i]['link']) ]) {
			$title = mysql_real_escape_string($items[$i]['title']);
			$link = mysql_real_escape_string(htmlspecialchars($items[$i]['link']));
			$description = mysql_real_escape_string($items[$i]['description']);

			$lause_insert[] = "('$link', '$title', '$description', $valikko_id)";
		}
	}

	// tietokantaan jos tarve on
	if( count($lause_insert) ) {
		$lause = 'INSERT INTO acms_linkit (linkki, nimi, kuvaus, valikko_id) VALUES ';
		$lause .= implode(',', $lause_insert);
		$tulos = $db->sql_query($lause);
		echo count($lause_insert)." uutta linkkiä!\n\n";
	} else {
		echo "Ei uusia linkkejä.\n\n";
	}
}

echo "Valmis.\n\n";

?>

Antti80 [02.02.2008 19:10:07]

#

Okei, pitääpä yrittää sulatella tuota Merrin vinkkiä :D


EDIT:
Ok, kiitos esimerkistä. Jään sulattelemaan. Palaan asiaan, kun tulee kysyttävää.

Merri [02.02.2008 19:11:29]

#

Lisäsin edelliseen viestiin koodinpätkän.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta