ubuntuusers.de

feed.php

Datum:
1. Januar 2009 22:12
Code:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
<?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})\"|&nbsp;/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("&nbsp;/newsticker/","&nbsp;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");
}

?>