Pythonmania

Script Different!

Suchen in:
Suche:
In Partnerschaft mit Amazon.de
Startseite | Schockwellenreiter | Impressum
Anzeigen


http- und ftp-User Agenten in Python

Wer einen RSS-Channel via viewRssBox() in seine Manila-Site einbindet, wird feststellen, daß dabei Seltsames passiert. Entweder werden Kürzel gar nicht ausgeführt oder - beim ScriptingNews-Format - Makros nicht. Egal wie man es dreht und wendet, der Channel sieht seltsam aus. Da ich sowieso ein How To schreiben wollte, wie man via Pythons urllib Dateien mit eigenem User Agenten aus dem Web lädt, dachte ich mir, das ist die Gelegenheit.

Also habe ich ein kleines Python-Script geschrieben, das folgendes macht:

  1. Eine xmlrss-Datei via urllib vom Server auf den Client laden.
  2. Dort Änderungen an der xmlrss-Datei vornehmen.
  3. Und diese dann auf einen Server via ftplib wieder hochladen.

Wenn ich dieses Skript nach jeder Änderung meiner Manila-Site aufrufen - und auf dem Macintosh reicht dafür ein Doppelklick - habe ich auf meinem Server immer eine aktuelle xmlrss-Datei liegen.

Voila, hier ist der Code:


import urllib
import ftplib
import robotparser
import string

# Jeder User Agent sollte die "robots.txt" abfragen: rp = robotparser.RobotFileParser() rp.set_url("http://your.domain.com/robots.txt") rp.read()

if rp.can_fetch("*", "http://your.domain.com/xml/rss.xml"): # Wir haben Glück, wir dürfen rein: myRead = urllib.urlretrieve ("http://your.domain.com/xml/rss.xml") dbFilename = "schockwellenreiter.xml" myXMLrss = open(myRead[0]).read()

# {pictureRef()} rausschmeissen: startTag = "{pictureRef" endeTag = "}"

while (string.find(myXMLrss, startTag) > -1): start = string.find(myXMLrss, startTag) ende = string.find(myXMLrss, endeTag, start) kannweg = myXMLrss[start:ende+6] myXMLrss = string.replace(myXMLrss, kannweg, "")

# Titel in bold setzen und mit "::" rechts # und links verzieren :o) myXMLrss = string.replace (myXMLrss, "<title>", "<title>&lt;b&gt;::") myXMLrss = string.replace (myXMLrss, "&lt;/title&gt;", "::&lt;/b&gt;</title>") # News Item von der Überschrift mit einem # Paragraphen absetzen: myXMLrss = string.replace (myXMLrss, "<description>", "<description>&lt;p&gt;") # Absatztrenner einfügen bei zweimal carriage return: myXMLrss = string.replace (myXMLrss, "\n\r\n\r", "\n\r&lt;p&gt;")

myFile = open(dbFilename, "w") myFile.write(myXMLrss) myFile.close()

myFile = open(dbFilename)

# Beginn ftp: ftp = ftplib.FTP ("www.domain.de", "www.domain.de", "xxxxxxxx") ftp.cwd('xml')

ftp.storlines("STOR rss.xml", myFile)

myFile.close()

# Erfolgsmeldung ausgeben :) print "I did it, Babe!"

else: # Wir müssen leider draußen bleiben: print "Der Zugang ist leider lt. 'robots.txt' verboten"

Das Skript ist erfreulich kurz, was man den umfangreichen mitgelieferten Bibliotheken verdankt. Aber es ist ein vollwertiger User Agent.

Als erstes fragt er ordnungsgemäß die Datei robots.txt ab, wie es sich für einen User Agenten gehört. Smile Wenn die robots.txt ihn reinläßt, lädt er die gesamte xmlrss-Datei in einem String runter.

Die Instanz von urllib.urlretrieve(), die wir erzeugt haben, verfügt über die gleiche read()-Methode, wie ein Dateiobjekt, also können wir die URL einfach auslesen.

Die nachfolgenden Substitutionen nehmen wir an diesem String durch. Das geht schneller, als wenn wir ihn in einer Datei zwischenspeichern.

Zuerst schmeißen wir alle {pictureRef()} raus. Dabei mutzen wir die Tatsache aus, daß die Funktion string.find() -1 zurückgibt, falls nichts mehr gefunden wurde.

Danach gibt es noch ein paar kosmetische Verschönerungen. Die Doppelpunkte (::) rechts und links von den Überschriften habe ich eigentlich nur gesetzt, damit klar ist, daß das, was Ihr unten seht, auch tatsächlich die geänderte Datei ist.

Erst danach wird eine Datei auf den Client geschrieben (schockwellenreiter.xml).

Dann erzeugen wir eine Instanz der Klasse FTP, der wir schon bei der Initialisierung Hostname, Username (bei Strato ist der Username immer gleich dem Namen der Hauptdomain) und Password (nein, das ist nicht mein echtes Password, so einfach mache ich es Euch nicht) Smile mitgeben.

Danach wechseln wir das Verzeichnis und speichern die Datei dort ab. Textdateien werden mit ftp.storlines() zeilenweise abgespeichert - so erspart man sich die bei Binaries notwendige Angabe der Blockgröße.

Zum Schluß schließen wir noch ordnungsgemäß die Datei und das war es dann schon.

Das Skript funktioniert anstandslos. Es soll aber nicht verschwiegen werden, daß es auf dem Macintosh ebenfalls gelegentlich zu dem berüchtigten socket not connected-Fehler stößt, der auch Netscape-Usern auf dem Mac das Leben mit Manila-Sites so schwer macht und zu zahlreichen Doppelpostings führt. Da wir in unserem Skript aber nicht nach Manila hochladen, genügt es einfach, das Skript erneut aufzurufen. (Irgendwie scheint der Internet Explorer eine eigene Socket-Implementierung mitzubringen, die sich geschickt an diesem Bug vorbeimogelt.)

Ja, und den Channel? Den können wir nun z.B. mit folgendem Manila-Makro einfach aufrufen:


{viewRssBox("http://www.schockwellenreiter.de/xml/rss.xml", 

boxTitle:"Der Schockwellenreiter", align:"left", width:"500", frameColor:"#000000", titleBarTextColor:"#000000", titleBarColor:"#F5F5F5", boxFillColor:"#FFFFFF", timeZone:"PST", hspace:4, vspace:4)}

Und dann erscheint der Schockwellenreiter zwar der Bilder beraubt, aber in voller Schönheit. (Allerdings werden keine Shortcuts ausgeführt. Wenn hier einer eine Lösung weiß, bin ich dankbar.)

Python Icon   Script different!


Vergleiche auch How To: ftp mit Python.






Werbung: