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?
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ä.
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?
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"; ?>
Okei, pitääpä yrittää sulatella tuota Merrin vinkkiä :D
EDIT:
Ok, kiitos esimerkistä. Jään sulattelemaan. Palaan asiaan, kun tulee kysyttävää.
Lisäsin edelliseen viestiin koodinpätkän.
Aihe on jo aika vanha, joten et voi enää vastata siihen.