<?php
/* Heise Feed Version 0.2
*/
header("Content-type: text/xml; charset=UTF-8");
/* Ordner in dem die Artikel zwischengespeichert werden */
define('CACHEFOLDER','feed');
/* Sek. in denen der Feed nicht aktualisiert wird. Das verhindert bei mehreren
* Clients, dass der Server und Heise belastet werden.
*/
define('FEEDINTERVAL',600);
/* Anzahl Artikel, die im Cacheordner gespeichert werden sollen. */
define('MAXARTIKELS',100);
function getId($artikelUrl) {
return substr($artikelUrl,39);
}
function getArtikel($id, $date) {
$artikelUrl = "http://www.heise.de/newsticker/meldung/print/".$id;
/* Artikel aus dem Cacheordner holen, falls er existiert und nicht reload angegeben ist. */
if($_GET["do"] != "reload" and file_exists(CACHEFOLDER."/".$date."-".$id.".txt")) {
$artikelFertig = file_get_contents(CACHEFOLDER."/".$date."-".$id.".txt");
} else {
if(!$artikelRoh=file_get_contents($artikelUrl)) {
$artikelFertig = "Fehler: Artikel konnte nicht geladen werden";
} else {
$text = "/<div class=\"meldung_wrapper\">(.+)<\/div>(.+)<\/div>/si";
$reg = "/ class=\"(.{1,20})\"| /i";
if (preg_match($text, $artikelRoh, $treffer)) {
$artikelFertig = $treffer[0];
$artikelFertig = strip_tags($artikelFertig, '<pre><b><br><em><ul><li><hr><p><img><strong><table><td><tr>');
$artikelFertig = str_replace("/bilder/","http://www.heise.de/bilder/",$artikelFertig);
$artikelFertig = str_replace(" /newsticker/"," http://www.heise.de/newsticker/",$artikelFertig);
$artikelFertig = htmlspecialchars($artikelFertig);
file_put_contents(CACHEFOLDER."/".$date."-".$id.".txt",$artikelFertig);
} else {
$artikelFertig = "Es konnte kein Artikeltext extrahiert werden";
}
}
}
/* Alte Artikel im Cacheordner löschen */
$files = scandir(CACHEFOLDER);
while(count($files) > MAXARTIKELS) {
unlink(CACHEFOLDER."/".$files[2]);
$files = scandir(CACHEFOLDER);
}
return $artikelFertig;
}
/* Mit ?do=reload werden alle Artikel des Feeds neu eingelesen. Mit ?do=sync
*wird nur überprüft ob es neue Artikel gibt.
*/
if($_GET["do"]=="reload" or $_GET["do"]=="sync" or !file_exists(CACHEFOLDER."/"."feed.txt") or time() - filemtime(CACHEFOLDER."/"."feed.txt") > FEEDINTERVAL) {
$xml = DOMDocument::load("http://www.heise.de/newsticker/heise-atom.xml");
$entrys = $xml->getElementsByTagName('entry');
/* Eigene URL setzen
*/
$xml->getElementsByTagName('link')->item(1)->attributes->item(1)->nodeValue="www.YOURURLHERE.com";
for ($i=0; $i < $entrys->length; $i++) {
$entry = $entrys->item($i);
$id = getId($entry->getElementsByTagName('id')->item(0)->nodeValue);
$date = $entry->getElementsByTagName('updated')->item(0)->nodeValue;
$entry->getElementsByTagName('summary')->item(0)->setAttribute('type','html');
/* Setze das Datum zurück, falls der Artikel nicht upgedated wurde.
* Heise verändert das Datum bei der Hälfte der Artikel, ohne dass sich
* der Inhalt ändert. Darum wird nur ein Update gemacht, wenn auch
* "Update" im Title steht.
*/
if(!preg_match("/\[update\]/i",$entry->getElementsByTagName('title')->item(0)->nodeValue)) {
$files = scandir(CACHEFOLDER);
foreach($files as $file) {
if(preg_match("/.+-".$id.".txt/", $file)) {
$date = substr($file,0,25);
$entry->getElementsByTagName('updated')->item(0)->nodeValue = $date;
}
}
}
$artikelInhalt = getArtikel($id, $date);
$entrys->item($i)->getElementsByTagName('summary')->item(0)->nodeValue = $artikelInhalt;
}
$feed = $xml->saveXML();
file_put_contents(CACHEFOLDER."/"."feed.txt",$feed);
echo $feed;
} else {
echo file_get_contents(CACHEFOLDER."/"."feed.txt");
}
?>