skweez.net

Alles skweez?

1001111101100010001011110001100

Alles zu “rss”

19.12.2010

Heise News Feed Fix 0.4

von elm.

So, nach langer langer Zeit kommt mal wieder ein Update für mein Heise News Feed Fix Script. Das Script weißt jetzt jedem Artikel eine eindeutige ID zu und aktualisiert Artikel, die ein Update erhalten. Außerdem kann man mit dem Script jetzt mit dem Parameter url verschiedene Feeds der Heiseseite auswerten. Um z.B. den Feed von Heise Open mit Inhalt zu füllen, ruft man http://example.com/feed.php?url=http://www.heise.de/open/news/news-atom.xml auf. Gibt man keine URL an, wird der Hauptfeed von Heise benutzt.

Die Datumskorrektur habe ich wieder ausgebaut, da es nicht mehr so aussieht als ob Heise das Datum der Artikel ändert. Vielleicht liegt dass jetzt auch an der ID, dass das richtig erkannt wird.

Danke auch an Mark, der mich auf einen Bug hingewiesen hat.

<?php
// Heise Feed Version 0.4
header("Content-type: text/xml; charset=UTF-8");
define('CACHEFOLDER','feed');
define('FEEDINTERVAL',600);
define('MAXARTIKELS',100);
 
$feedUrl = urlencode('http://www.heise.de/newsticker/heise-atom.xml');
 
if( $_GET["url"] ) {
        $feedUrl = urlencode($_GET["url"]);
}
 
if( $_GET["do"]=="reload" ) $do_reload = true;
if( $_GET["do"]=="sync" ) $do_sync = true;
 
# Do not diplay xml errors
libxml_use_internal_errors(true);
 
function getID($url) {
        preg_match('/-([0-9]+)\.html/', $url, $id);
        return $id[1];
}
 
function getArtikel($url, $id, $date, $forceReload) {
        if(!$forceReload 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 ) {
                        if( $div->hasAttribute('class') && $div->getAttribute('class') == 'meldung_wrapper' ) {
                                $newDoc->appendChild($newDoc->importNode($div,true));
                        }
                }
                $artikelFertig = $newDoc->saveHTML();
                $artikelFertig = strip_tags($artikelFertig, '<span><a><pre><b><br><em><ul><li><hr><p><img><strong><table><tbod<><td><tr>');
                $artikelFertig = str_replace("\"/","\"http://www.heise.de/",$artikelFertig);
                $artikelFertig = htmlspecialchars($artikelFertig);
 
                if(!file_put_contents(CACHEFOLDER."/".$date."-".$id.".txt",$artikelFertig)) die();
        }
        $files = glob(CACHEFOLDER."/*.txt");
        while(count($files) > MAXARTIKELS) {
                unlink($files[2]);
                $files = glob(CACHEFOLDER."/*.txt");
        }
        return $artikelFertig;
}
 
$cacheFile = CACHEFOLDER."/".$feedUrl.".txt";
 
if($do_reload or $do_sync or !file_exists($cacheFile) or time() - filemtime($cacheFile) > FEEDINTERVAL) {
        $xml = DOMDocument::load(urldecode($feedUrl));
        $entrys = $xml->getElementsByTagName('entry');
 
        $xml->getElementsByTagName('link')->item(1)->attributes->item(1)->nodeValue="http://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;
 
                # Set unique id.
                $entry->getElementsByTagName('id')->item(0)->nodeValue = 'http://www.heise.de/'.$id;
 
                # Create content element and fill it with content
                $content = $xml->createElement('content');
                $entry->appendChild($content);
 
                $entry->getElementsByTagName('content')->item(0)->setAttribute('type','html');
 
                $forceReload = false;
                if($do_reload or preg_match("/update/i",$entry->getElementsByTagName('title')->item(0)->nodeValue)) {
                        $forceReload = true;
                }
 
                $artikelInhalt = getArtikel($url, $id, $date, $forceReload);
                $entrys->item($i)->getElementsByTagName('content')->item(0)->nodeValue = $artikelInhalt;
        }
        $feed = $xml->saveXML();
        file_put_contents($cacheFile, $feed);
        echo $feed;
} else {
        echo file_get_contents($cacheFile);
}
 
# Clear xml errors
libxml_clear_errors();
?>

13.01.2010

skweez.net bei identi.ca und twitter

von elm.

Seit heute kann man skweez.net bei identi.ca und Twitter folgen. Jeweils als @skweeznet. Dort gibts dann zu jedem neuen Artikel ein Update und vielleicht auch mal so. Natürlich kann man auch weiterhin RSS benutzen.

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 :)

08.01.2009

Heise News Feed Fix

von elm.

Ein kleines Stück Code, das den Heise RSS News Feed repariert. Die Verwendung ist verboten ;)

http://paste.ubuntuusers.de/393514/

Original Quellcode hier.