skweez.net

Alles skweez?

10.10.2009

Heise News Feed Fix 0.3

von elm.

Die Version 0.4 gibt es hier.

Nach dem Heise am 3.10.2009 seinen Onlineauftritt aktualisiert hat, hat mein kleines Heise News Feed Script nicht mehr funktioniert. Hier ist eine neue Version, die erstmal wieder tut, was sie soll.

Ab jetzt wir auch nicht mehr die Druckversion der Artikel verwendet, sondern der richtige Artikel. So sind auch alle Links richtig anklickbar.

Bugs:
Der Artikelinhalt von aktualisierten Artikeln wird nicht aktualisiert. Dises Problem werde ich beheben, sobald ich wieder einen Rechner zur Verfügung habe. Also nächste Woche vermutlich.14.09.10: Ist immer noch nix geworden. Viel zu tun und so.

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
<?php
// Heise Feed Version 0.3
header("Content-type: text/xml; charset=UTF-8");
define('CACHEFOLDER','feed');
define('FEEDINTERVAL',600);
define('MAXARTIKELS',100);
 
function getID($url) {
 $id = substr($url, -11, 6);
 return $id;
}
 
function getArtikel($url, $id, $date) {
 if($_GET["do"] != "reload" and file_exists(CACHEFOLDER."/".$date."-".$id.".txt")) {
 $artikelFertig = file_get_contents(CACHEFOLDER."/".$date."-".$id.".txt");
 } else {
 $doc = new DOMDocument();
 $artikel = mb_convert_encoding(file_get_contents($url), 'HTML-ENTITIES', "UTF-8");
 $doc->loadHTML($artikel);
 $divs = $doc->getElementsByTagName('div');
 
 $artikelFertig = 'Konnte Artikelinhalt nicht finden.';
 
 $newDoc = new DOMDocument();
 
 foreach ( $divs as $div ) {
 #$artikelFertig = $artikelFertig.$div->nodeValue.'\n\n';
 if( $div->hasAttribute('class') &amp;&amp; $div->getAttribute('class') == 'meldung_wrapper' ) {
 $newDoc->appendChild($newDoc->importNode($div,true));
 }
 }
 $artikelFertig = $newDoc->saveHTML();
 $artikelFertig = strip_tags($artikelFertig, '<a><pre><b><br /><em><ul><li><hr /><p><img><strong><table><td><tr>');
 $artikelFertig = str_replace("\"/","\"http://www.heise.de/",$artikelFertig);
 $artikelFertig = htmlspecialchars($artikelFertig);
 
 if(!file_put_contents(CACHEFOLDER."/".$date."-".$id.".txt",$artikelFertig)) die();
 }
 $files = scandir(CACHEFOLDER);
 while(count($files) > MAXARTIKELS) {
 unlink(CACHEFOLDER."/".$files[2]);
 $files = scandir(CACHEFOLDER);
 }
 return $artikelFertig;
}
 
if($_GET["do"]=="reload" or $_GET["do"]=="sync" or $_GET["do"]=="test" 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');
 
 $xml->getElementsByTagName('link')->item(1)->attributes->item(1)->nodeValue="http://www.example.com/feed.php";
 
 for ($i=0; $i < $entrys->length; $i++) {
 $entry = $entrys->item($i);
 $url = str_replace('/from/atom10', '', $entry->getElementsByTagName('id')->item(0)->nodeValue);
 $id = getID($url);
 $date = $entry->getElementsByTagName('updated')->item(0)->nodeValue;
 
 $summary = $xml->createElement('summary');
 $entry->appendChild($summary);
 
 $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.
 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($url, $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");
}
?>

Und hier noch auf Pastebin, damits nicht verloren geht :)

flattr this!

Stichworte:

13 Kommentare:

15.10.2009
18:46

Antworten

a7p

erstmal vielen Dank – wirklich sehr angenehm – Heise ist mir ja sowas von auf den Geist gegangen – ich habe viele News schon gar nicht mehr angeklickt – immer diese informationsarmen Titel, bei denen man nicht weiß, ob sich nicht vielleicht doch eine richtige Nachricht dahinter verbirgt – der Feed war ziemlich wertlos … aber das ist ja jetzt vorbei ;).

Vielleicht solltest du noch erwähnen, dass man ./feed/ anlegen muss.

Weiter ist mir aufgefallen, dass die Pastbin-Version als 0.2, die hier allerdings als 0.3 gekennzeichnet ist.

Das war’s dann aber auch – ich bin jetzt mal den Rest des Abends zufrieden.

16.10.2009
11:29

Antworten

MatzeMuc86

Hallo,

also ich gehe davon aus, dass es ein cooles Script ist, würde es denn bei mir funktionieren!
Ich bekomme immer die Fehlermeldung:

XML-Verarbeitungsfehler: “Junk” nach Dokument-Element
Adresse: http://127.0.0.1/rss/feed.php
Zeile Nr. 2, Spalte 1:Fatal error: Call to undefined method domdocument::load() in C:\xampp\htdocs\xampp\rss\feed.php on line 48
^

Das Script heißt feed.php und es gibt im gleichen Ordner den Unterordner “feed”???

DANKE

26.10.2009
18:15

Antworten

elm

Erstell mal ein php Datei in der nur folgendes steht:

< ?php
phpinfo();
?>

und lad sie auf den Server. Da kann man dann schön die Version und alle Einstellungen von PHP sehen.

20.06.2010
13:29

Antworten

Dolph

Super! Danke für dieses kleine und praktische Skript!

Heise News ohne Inhalte als RSS hat einfach genervt!

Hast Du schon eine Version für aktualisierte Artikel?

14.09.2010
14:36

Antworten

Der J

Servus Elm,

geht das ding bei dir noch? bei mir tut sich weder im feed ordner was noch wird eine datei zurückgegeben…
die datei heisst bei mir rss.php, im gleichen verzeichnis existiert ein der Ordner feed und ich setze Php 5.29 ein… sonst noch was zu beachten? any ideas?

14.09.2010
14:38

Antworten

elm

Also bei mir geht es noch. Ging es schon mal und jetzt auf einmal nicht mehr, oder ging es noch nie?

14.09.2010
17:35

Antworten

Der J

Ging noch nie, vllt bin ich ja nur zu unwissend…
oder mein hoster verbietet wieder irgendwas :(

14.09.2010
17:45

Antworten

elm

Also dann brauchen wir als erstes mal Fehlermeldungen. Dazu schreibst du an den Anfang von dem Script:

error_reporting(E_ALL);
ini_set('display_errors', '1');

Dann kommt hoffentlich der Fehler. Wenn nicht müssen wir uns was neues überlegen :)

19.12.2010
20:57

Antworten

Lukas

Bei mir ist das Skript vor ein paar Tagen geplatzt, weil es in getArtikel() mit dem unlink() im MAXARTIKELS-Löschteil aus Versehen eines der zwei Verzeichnisse “.” oder “..” gegriffen hat. Ersetzt man in Zeilen 39 und 42
$files = scandir(CACHEFOLDER);
gegen
$files = glob(CACHEFOLDER.”/*.txt”);
sowie in Zeile 41
unlink(CACHEFOLDER.”/”.$files[2]);
gegen
unlink($files[2]);
haut es wieder hin. glob() greift nämlich nur Dateien, die auf das Pattern passen.

19.12.2010
23:13

Antworten

elm

Danke für den Hinweiß. Hab das eingebaut in meine neue Version, die ich vor ein paar Tagen gebaut hab.

Etwas dazu sagen: