RSS-syötteen käsittelyä PHP:llä

RSS-syötteet ovat hyvä tapa pysyä ajan tasalla sivustoille päivittyvästä sisällöstä automaattisesti. Ehkä yleisin tapa hyödyntää syötteitä on hakea jokin ilmainen RSS-lukijaohjelma työpöydälle tai käyttää selaimen sisäänrakennettua lukijaa. RSS-syötteet voidaan myös helposti lisätä osaksi omaa verkkosivustoa. Tässä yksinkertainen esimerkki PHP:llä, joka toimii minkä tahansa standardin mukaisen RSS-syötteen kanssa käyttäen ydinelementtejä.
Huomaa että web-palvelimella pitää olla SimpleXML-tuki asennettuna. Voit tarkistaa tämän phpinfo-funktiolla. Tulostetta ei kuitenkaan kannata antaa koko maailman ihmeteltäväksi.
<?php phpinfo(); ?>
Tässä varsinainen syötteen lataaminen ja ladatun sisällön tulostaminen. Kannattaa katsoa syötettä ja koodia rinnakkain, jotta XML-puussa kulkeminen käy paremmin selväksi.
<?php
$doc = simplexml_load_file('http://www.m-brain.com/fi/blog/rss');
if($doc == TRUE){
foreach($doc->channel->item as $child){
print '<h1>'.$child->title.'</h1>';
print strip_tags($child->description);
print '<a href="'.$child->link.'" target="_blank">'.$child->link.'</a>';
}
}
?>
Yllä oleva koodinpätkä lataa määritellystä lähteestä syötteen. Onnistuessaan käydään kaikki item-elementit läpi ja niistä tulostetaan otsikko, sisällön kuvaus (tässä tapauksessa varsinaisesta tekstistä alkuosa) ja linkki. Kuva 1 näyttää miltä koodin tuloste näyttää selaimessa.
Vain harvoin halutaan tulostaa kaikki syötteen item-elementit, joten tulosteiden määrää pitäisi pystyä rajoittamaan. Itse olen mieltynyt tallentamaan koko syötteen etukäteen arrayhyn, jolloin voin tulostaa minkä tahansa elementin missä tahansa. Tässä esimerkin vuoksi yksinkertaisempi lähestymistapa, jossa määrä annetaan kiinteästi ja tulostetaan vain 5 ensimmäistä syötteen item-elementtiä. Counter-muuttujan arvoa kasvatetaan aina yhdellä, kunnes saavutetaan määritelty katto.
<?php
$doc = simplexml_load_file('http://www.m-brain.com/fi/blog/rss');
if($doc == TRUE){
$counter = 0;
foreach($doc->channel->item as $child){
if($counter<5){
print '<h1>'.$child->title.'</h1>';
print strip_tags($child->description);
print '<a href="'.$child->link.'" target="_blank">'.$child->link.'</a>';
}
$counter++;
}
}
?>
Tästä on helppo jatkaa lisäämällä HTML-elementit ja luomalla CSS-tyylitiedosto, jossa voi tehdä väri ja ulkoasumäärityksiä. Syötteissä voidaan ydinelementtejä jatkaa ottamalla käyttöön nimiavaruudet (namespace), joissa määritellään syötteen uniikkeja tageja. Lisäksi syötteen elementteihin voidaan sisällyttää atribuutteja kuvaamaan sisältöä. Näiden käsittely jätetään kuitenkin myöhempään.
Comments
Vilkaise vielä
Vilkaise vielä phpinfo-funktiolla, että onko "allow_url_fopen" arvo "On". Jos ei ole, niin sen asettaminen luultavimmin tepsii.
Internet on täynnä eri tietoa kyseisen arvon asettamisen tietoturvariskeistä, joten kannattaa olla huolellinen. Pieni googlailu voi selkiyttää asiaa ja auttaa muodostamaan mielipiteen.
Testausvaiheessa syötteen voi tallentaa lokaaliin kansioon ja kutsua sitä sieltä. Jos Linux/Unix terminaalin käyttö luonnistuu, niin esimerkiksi Crontabissa syötteen ajastettu Wgettaaminen tähän kansioon voisi olla yksi tapa.
Toinen tapa hakea syöte ulkopuolisesta lähteestä on cURL:n avulla. Täällä hyvä esimerkki siihen: http://ditio.net/2008/06/19/using-php-curl-to-read-rss-feed-xml/
Kellonajan lisäys
Saako tuohon mahdollisesti haettua myös kellonajan? Millä systeemillä tämän pystyisi tekemään?
pubDate sisältää päivämäärän ja kellonajan
Foreach-loopissa voidaan printata mikä tahansa item-tagien sisällä olevien tagien sisältö. Eli tässä tapauksessa lisätään alla oleva rivi esimerkiksi <h1>-otsikkorivin alapuolelle.
print $child->pubDate;
Tuloste voidaan vielä saattaa täysin haluttuun esitysmuotoon PHP:n date- ja strtotime-funktioita hyödyntämällä.
Esim.
print date("d.m.Y H:i", strtotime($child->pubDate));
Ylläolevassa otetaan syötteestä saatu päivämäärä ja muutetaan strtotime:llä Unix-timestampiksi mikä voidaan formatoida date:lla.
Tässä merkkijonon "d.m.Y H:i" selvitys:
- d - päivä (01-31)
- m - kuukausi (01-12)
- Y - vuosi (2009)
- H - tunti (00-23)
- i - minuutti (00-59)
Date-funktion manuaalissa on listattu kaikki mahdolliset kirjaimet ja niiden merkitykset.
Toivottavasti auttoi. :)
pubDate, a O K!
Oikeastaan lähinnä tuossa olisinkin kaivannut tuota pubDate muuttujan nimeä. =)
Olisin melkein voinut kysyä sen suoraan niinkin. =P
PHP kyllä on tuttua ja nuo timestamp muutokset sain tehtyä itsekin.
So all good! Suuret kiitokset nopeasta avusta!
Comments
Media
Add comment









RSS - syöte omalla verkkosivulla
"Huomaa että web-palvelimella pitää olla SimpleXML-tuki asennettuna."
Tuki on, mutta joku muukin asetus pitää olla tehty, mikähän lienee.