Navigation
Supportsider
Senest Online
HenningS16:56:54
helmuth 5 Dage
mauran 1 Uge
afoster 1 Uge
orgermer 1 Uge
iceman50 2 Uger
ejvindh 2 Uger
Henrik Bendtsen 2 Uger
Michael Mogensen 2 Uger
max_og_mule 2 Uger
Besøgende
Gæster online: 3

Brugere online: 0

Antal brugere: 168
Nyeste bruger: Michael Mogensen
Se indlæg
PHP-Fusion - Danmark » PHP-Fusion version 6 » Elementer v6
 Udskriv debat
Element: Nyheder udefra via RSS feeds
flj
Elementet henter nyheder fra RSS feeds og viser et antal ud fra de opgivne kriterier.

Der kan angives et - i princippet - ubegrænset antal RSS feeds. Fra alle de angivne feeds hentes alle nyheder. Angives med $rss_feeds.

Alle de hentede nyheder gennemgås, og kun de, der er nyere end
$max_age_hours (sat til 8 timer) tages med, og kun de, der matcher $pattern tages med. Indholdet i nyheden (description) matches med $pattern som en regular expression (se preg_match). Fx. hvis du vil matche Real Madrid - uanset case - så sæt $pattern = "/real madrid/i" - så får du KUN nyheder om Real Madrid.

Til slut sorteres alle de udvalgte nyheder og de de nyeste $max_no (sat til 10 her) tages med.

For at gøre det lettere, har jeg markeret evt. rettelser med rødt.

Koden er:



/////////////////////////////////////////////////
// RSS reader v3 2008-03-23
// by Flemming Jensen, Copyright 2008
/////////////////////////////////////////////////

// Compare function
function rss_cmp($a, $b)
{
    return $b["timestamp"] - $a["timestamp"];
}

// Function to retrieve, extract on age and pattern, limit by max_no and sort
function rss_feeds($rss_feeds, $max_age_hours, $pattern, $max_no)
{

   $max_age = $max_age_hours*3600; // in seconds
   $now = time();

   $date_format = "%a, %Y-%m-%d %T %Z"; // Format used to create date

   // Looping for every rss feed to read
   $rss = NULL;
   $n = 0;

   foreach($rss_feeds as $rss_feed)
   {
      // Load the RSS file
      $err_level = error_reporting(E_ALL ^ E_WARNING);
      $rss_file = simplexml_load_file($rss_feed);
      error_reporting($err_level);

      // Looping for every item returned
      if ($rss_file)
      {
         if ($rss_file['version'] == "2.0")
         {
            $rss_ver = 2;
            $items = $rss_file->channel;
         }
         else
         {
            $rss_ver = 1;
            $items = $rss_file;
         }

         foreach($items->item as $item)
         {
            if ($rss_ver == 1)
            {
               $dc_namespace = $item->children('http://purl.org/dc/elements/1.1/');
               $timestamp = strtotime(utf8_decode("{$dc_namespace->date}"));
            }
            else
            {
               $timestamp = strtotime(utf8_decode("{$item->pubDate}"));
            }

            // Only if not too old and matching pattern
            if ($now - $timestamp <= $max_age && preg_match($pattern, $item->description) == 1)
            {
               // Using utf8_decode(...) to get danish chars right
               $rss[$n]["link"] = utf8_decode($item->link);
               $rss[$n]["title"] = utf8_decode($item->title);
               $rss[$n]["date"] = strftime($date_format, $timestamp);
               $rss[$n]["timestamp"] = $timestamp;
               $rss[$n]["description"] = utf8_decode($item->description);
               $n++;
            }
         }
      }
   }


   if ($n>0)
   {
      // Sort all to get the newest ones first
      usort($rss, "rss_cmp");

      // Limiting the array to max_no
      while(count($rss)>$max_no)
         array_pop($rss);
   }

   return $rss;
}


// List of RSS-feeds to check
$rss_feeds = array(
   "http://ing.dk/rss/nyheder",
   "http://politiken.dk/rss/senestenyt.rss");

// Max age in hours
$max_age_hours = 8;

// Pattern to match - see preg_match(...)
$pattern = "//i"; // Matches everything

// Max no of news to return
$max_no = 10;

$rss = rss_feeds($rss_feeds, $max_age_hours, $pattern, $max_no);

if ($rss)
{
   foreach($rss as $item)
   {
      echo("".$item["title"]."
");
   }
}

?>


Dette er en beta-version - specielt bør I se på om danske bogstaver konverteres rigtigt - det drillede - om GMT tidszoner håndteres ok, om sorteringen med de nyeste er rigtig. 2008-03-17: Der er ingen rapporterede problemer. Vover det ene øje og lader den gå i "produktion" nu. 2008-03-23: Virker nu også med RSS 1.0.

Og så kunne layoutet godt peppes lidt op ;-)

NB Husk at respektere evt begrænsninger som "ejeren" af de anvendte RSS feeds sætter.

God fornøjelse - lad mig høre om det spiller...

Flemming

2008-03-15: Modificeret, så nul nyheder håndteres uden fejl
2008-03-17: Modificeret, så tomme feeds ikke giver fejl. Alle rapporterede fejl er nu håndteret
2008-03-23: Opdateret så den også kan læse feeds i RSS 1.0
flj tilknyttede følgende billede:billede:
nyheder_1.jpg

Redigeret af flj d. 23-03-2008 18:06
 
Brown
Har du et billed af det? Og eventuelt makere det, så det bliver lavet om til OB-nyheder? Smile
 
flj
Jo-jo da, jeg ku' da lave for alle holdene i superligaen ;-)
 
Brown
Det kunne være fedt, hvis det bare var til OB Wink Kan den reafarere til bold.dk istedet for BT? Jeg ved godt hvordan det rettes, men ved ikke om bold.dk de har én Rss feeds.
 
flj
Undskyld, men har du læst mit indlæg, og brugt bare 5 min på at studere koden før du spørger?
 
Brown
Ja, det har jeg. Men jeg forstår ikke hvordan du skifter til et nyt hold, da du ikke har makéret det med rødt, eller grønt.
 
flj
Jeg skrev:

Citer

Fx. hvis du vil matche Real Madrid - uanset case - så sæt $pattern = "/real madrid/i" - så får du KUN nyheder om Real Madrid.


hvis du i dette erstatter "real madrid" med "ob" så - vupti... Du kan læse mere om regular expressions i det link til php manualen, som er i indlægget.


 
jacobjensen
Godt gået FLJ (igen-igen!)

Også fint, at du lige minder folk om, at man meget let kan overse nogle ophavsrettigheder ... Teknik må aldrig overskygge etik. Jeg vil godt understege den pointe med, at man skal passe på med at rippe fra mediekoncernerne, for de kan faktisk deres jura.
----------------------------------------------------
www.effektive-evalueringer.dk
 
http://www.effektive-evalueringer.dk
Brown
Det havde jeg lige overset. Mange tak.
 
Josso
Er 100% enig med Jacob.

Kanont arbejde - igen, flj. Wink

Dejligt at have en mand, der kan det der med MySQL og andet avanceret PHP. Cool (Ikke fordi der ikke er nogen, men en ekstra mand skader ikke)

Og så kan den jo også bruges til ens egen RSS feeds. Pfft
(Hvis ikke man kan MySQL)
img186.imageshack.us/img186/7947/macuserbar1oz3.png
 
http://mymix.dk
flj
Tak for tilbagemeldingerne - det var en sjov opgave Cool

@josso: Har du dine egne RSS feeds kørende? Kunne tænke mig at se dem - havde nemlig tænkt at det var et naturligt næste skridt...

@jacob: Har checket det med ophavsret. En del sites giver faktisk lov til at man bruger dem, bare man linker direkte til dem. Men ikke alle.
 
Josso
Well,, jeg arbejder hårdt på at få dem med i v7. Wink
img186.imageshack.us/img186/7947/macuserbar1oz3.png
 
http://mymix.dk
flj
Det glæder jeg mig til. Hvis jeg kan være til nogen hjælp, må du bare sige til.
 
olelau
Jeg kan godt mærke at vi først fik sort hvid fjernsyn derhjemme da jeg var 12 år, der er jo nogen der får teknikken ind med modermælken.
Godt gået Flemming, dejligt med folk der kan skrue en kode rigtig sammen.Grin
Ole Lauritsen
 
http://festfagbogen.dk/Profil.php?ID=490
flj
Er selv fra 1961 - men sig det ikke til nogen Wink

Min første PC var en VIC-20, som jeg importerede som samlesæt fra England og selv loddede sammen. Den havde 1k RAM!
 
wepper24

// Pattern to match - see preg_match(...)
$pattern = "/real madrid/i"// Matches everything


Hvilket er forkert her?
 
www.tennisrunden.dk
wepper24
Selvom jeg retter præcis, som det står der, så dur det altså stadigvæk ikke.

Eksempel:
Jeg ændrer dette:

// List of RSS-feeds to check
$rss_feeds = array("http://ing.dk/rss/nyheder", "http://bt.dk/rss/sport.xml");


og


// Pattern to match - see preg_match(...)
$pattern = "//i"; // Matches everything


til


// List of RSS-feeds to check
$rss_feeds = array("http://ing.dk/rss/nyheder", "http://bt.dk/rss/sport.xml", http://http://tipsbladet.dk/rss.php'');


og


// Pattern to match - see preg_match(...)
$pattern = "/real madrid/i"; // Matches everything


=

Parse error: syntax error, unexpected ':', expecting ')' in /usr/home/web/web207921/side_left.php(45) : eval()'d code on line 58
Redigeret af wepper24 d. 14-03-2008 15:51
 
www.tennisrunden.dk
Josso

// List of RSS-feeds to check
$rss_feeds = array("http://ing.dk/rss/nyheder", "http://bt.dk/rss/sport.xml", http://http://tipsbladet.dk/rss.php'');

Skal se sådan ud:

// List of RSS-feeds to check
$rss_feeds = array("http://ing.dk/rss/nyheder", "http://bt.dk/rss/sport.xml", "http://http://tipsbladet.dk/rss.php");

;)

Citer

flj skrev:
Det glæder jeg mig til. Hvis jeg kan være til nogen hjælp, må du bare sige til.

Hvis du kender noget til hvordan man laver RSS feeds, er jeg da interesseret. ;)
Redigeret af Josso d. 14-03-2008 16:20
img186.imageshack.us/img186/7947/macuserbar1oz3.png
 
http://mymix.dk
wepper24
Warning: simplexml_load_file(http://http://tipsbladet.dk/rss.php) [function.simplexml-load-file]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /usr/home/web/web207921/side_left.php(45) : eval()'d code on line 24

Warning: simplexml_load_file() [function.simplexml-load-file]: I/O warning : failed to load external entity "http://http://tipsbladet.dk/rss.php" in /usr/home/web/web207921/side_left.php(45) : eval()'d code on line 24

Warning: Invalid argument supplied for foreach() in /usr/home/web/web207921/side_left.php(45) : eval()'d code on line 27

Warning: usort() [function.usort]: The argument should be an array in /usr/home/web/web207921/side_left.php(45) : eval()'d code on line 47

Warning: Invalid argument supplied for foreach() in /usr/home/web/web207921/side_left.php(45) : eval()'d code on line 70



-

Så det hjalp ikke ligefrem.

www.hala-madrid.dk
 
www.tennisrunden.dk
Josso
En ting jeg ikke havde tjekket: Om filen eksisterede. Det gør den ikke.
Adressen er http//tipsbladet.dk/rss.php, så koden ser sådan ud:

// List of RSS-feeds to check
$rss_feeds = array("http://ing.dk/rss/nyheder", "http://bt.dk/rss/sport.xml", "http://tipsbladet.dk/rss.php");

Redigeret af Josso d. 14-03-2008 16:46
img186.imageshack.us/img186/7947/macuserbar1oz3.png
 
http://mymix.dk
wepper24
Så, nu brokker den sig kun over følgende:

Warning: usort() [function.usort]: The argument should be an array in /usr/home/web/web207921/side_left.php(45) : eval()'d code on line 47

Warning: Invalid argument supplied for foreach() in /usr/home/web/web207921/side_left.php(45) : eval()'d code on line 70
 
www.tennisrunden.dk
Spring til debat: