Element: Nyheder udefra via RSS feeds
|
flj |
Lagt på d. 13-03-2008 22:29
|

Antal indlæg: 1721
Tilmeldt: 01/16/2008
|
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:
Redigeret af flj d. 23-03-2008 18:06
|
|
|
|
Brown |
Lagt på d. 13-03-2008 22:41
|

Antal indlæg: 77
Tilmeldt: 10/19/2007
|
Har du et billed af det? Og eventuelt makere det, så det bliver lavet om til OB-nyheder? |
|
|
|
flj |
Lagt på d. 13-03-2008 22:58
|

Antal indlæg: 1721
Tilmeldt: 01/16/2008
|
Jo-jo da, jeg ku' da lave for alle holdene i superligaen ;-)
|
|
|
|
Brown |
Lagt på d. 13-03-2008 23:05
|

Antal indlæg: 77
Tilmeldt: 10/19/2007
|
Det kunne være fedt, hvis det bare var til OB 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 |
Lagt på d. 13-03-2008 23:10
|

Antal indlæg: 1721
Tilmeldt: 01/16/2008
|
Undskyld, men har du læst mit indlæg, og brugt bare 5 min på at studere koden før du spørger?
|
|
|
|
Brown |
Lagt på d. 13-03-2008 23:15
|

Antal indlæg: 77
Tilmeldt: 10/19/2007
|
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 |
Lagt på d. 13-03-2008 23:22
|

Antal indlæg: 1721
Tilmeldt: 01/16/2008
|
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 |
Lagt på d. 14-03-2008 00:11
|

Antal indlæg: 426
Tilmeldt: 12/31/2005
|
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.
|
|
|
|
Brown |
Lagt på d. 14-03-2008 08:24
|

Antal indlæg: 77
Tilmeldt: 10/19/2007
|
Det havde jeg lige overset. Mange tak. |
|
|
|
Josso |
Lagt på d. 14-03-2008 08:39
|

Antal indlæg: 495
Tilmeldt: 08/05/2006
|
Er 100% enig med Jacob.
Kanont arbejde - igen, flj. 
Dejligt at have en mand, der kan det der med MySQL og andet avanceret PHP. (Ikke fordi der ikke er nogen, men en ekstra mand skader ikke)
Og så kan den jo også bruges til ens egen RSS feeds. 
(Hvis ikke man kan MySQL)
|
|
|
|
flj |
Lagt på d. 14-03-2008 11:57
|

Antal indlæg: 1721
Tilmeldt: 01/16/2008
|
Tak for tilbagemeldingerne - det var en sjov opgave 
@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 |
Lagt på d. 14-03-2008 12:17
|

Antal indlæg: 495
Tilmeldt: 08/05/2006
|
Well,, jeg arbejder hårdt på at få dem med i v7.
|
|
|
|
flj |
Lagt på d. 14-03-2008 12:19
|

Antal indlæg: 1721
Tilmeldt: 01/16/2008
|
Det glæder jeg mig til. Hvis jeg kan være til nogen hjælp, må du bare sige til.
|
|
|
|
olelau |
Lagt på d. 14-03-2008 14:28
|

Antal indlæg: 323
Tilmeldt: 02/07/2006
|
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.
Ole Lauritsen
|
|
|
|
flj |
Lagt på d. 14-03-2008 15:30
|

Antal indlæg: 1721
Tilmeldt: 01/16/2008
|
Er selv fra 1961 - men sig det ikke til nogen 
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 |
Lagt på d. 14-03-2008 15:33
|

Antal indlæg: 25
Tilmeldt: 08/05/2007
|
// Pattern to match - see preg_match(...)
$pattern = "/real madrid/i"// Matches everything
Hvilket er forkert her? |
|
|
|
wepper24 |
Lagt på d. 14-03-2008 15:49
|

Antal indlæg: 25
Tilmeldt: 08/05/2007
|
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
|
|
|
|
Josso |
Lagt på d. 14-03-2008 16:18
|

Antal indlæg: 495
Tilmeldt: 08/05/2006
|
// 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
|
|
|
|
wepper24 |
Lagt på d. 14-03-2008 16:43
|

Antal indlæg: 25
Tilmeldt: 08/05/2007
|
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 |
|
|
|
Josso |
Lagt på d. 14-03-2008 16:46
|

Antal indlæg: 495
Tilmeldt: 08/05/2006
|
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
|
|
|
|
wepper24 |
Lagt på d. 14-03-2008 16:51
|

Antal indlæg: 25
Tilmeldt: 08/05/2007
|
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 |
|
|