Änderungen von Dateien auf Server per timestamp überwachen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Ubuntuxer
User
Beiträge: 42
Registriert: Donnerstag 17. April 2008, 15:49

Ich möchte ohne die Dateien herunterladen zu müssen, die letzte Veränderung der Datei oder den letzten upload per ftp feststellen. Letzteres dürfte aber glaub ich ohne eigenen ftp Access schwierig sein. Die os.path Module kann ich leider nicht verwenden, da ich die Datei nicht downloaden möchte.
Hat jemand eine Idee wie man das Problem lösen könnte.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Muss es FTP sein? Bei HTTP gibt es ja den HEAD-Request, den man mit If-Modified-Since nutzen kann, um veränderte Ressourcen zu erkennen.

Stefan
Ubuntuxer
User
Beiträge: 42
Registriert: Donnerstag 17. April 2008, 15:49

Das klingt sehr interessant; eigentlich müsste http klappen. Kannst du mir einen Link zu einem Tutorial oder ein Beispiel, wie man den Head-Request nutzen kann geben?
vielen Dank :)
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Z. B. so. Du musst das Datum allerdings in dieser Version immer in UTC-Zeit haben

Code: Alles auswählen

import urllib2
import datetime
d = datetime.datetime.utcnow()
def rfc1123(utcdate):
    return utcdate.strftime("%a, %d %b %Y %H:%M:%S GMT")

req = urllib2.Request(url='http://www.google.de/intl/de_de/images/logo.gif',
                      headers={"If-Modified-Since": rfc1123(d)})
try:
    f = urllib2.urlopen(req)
    print f.read()
except urllib2.HTTPError, e:
    if e.code == 304:
        print "Nicht modifiziert"
    else:
        raise e
Ubuntuxer
User
Beiträge: 42
Registriert: Donnerstag 17. April 2008, 15:49

Kann man den head-request auch einfach anzeigen lassen? Ich möchte zwei Dateien vergleichen und die neuere herunterladen, sodass ich die beiden head-request miteinander vergleichen muss.
@ Joghurt danke für das Beispiel, es ist aber nicht ganz sinnvoll, die aktuelle Zeit an If-Modified-Since zu übergeben. :wink:
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Den Timestamp deiner alten Datei musst du schon selbst ermitteln und dann in UTC umrechnen (oder rausbekommen, wie man die Timezone richtig formatiert)

Ich wollte dir ja nicht alles verkauen ;)
Ubuntuxer
User
Beiträge: 42
Registriert: Donnerstag 17. April 2008, 15:49

Ich verstehe grad nicht genau was du meinst. Wie kann ich den Timestamp der Datei denn herauskriegen?
Ubuntuxer
User
Beiträge: 42
Registriert: Donnerstag 17. April 2008, 15:49

Ich habe das Problem lösen können, doch leider findet .info() in einigen Adressen Last-Modified nicht. Also funktioniert diese Lösung nicht immer.

Code: Alles auswählen

#!/usr/bin/env python
import urllib2
f = urllib2.urlopen('Adresse')
try:
	date=f.info()
	print date['Last-Modified']
	req = urllib2.Request(url='Adresse2',
                      headers={"If-Modified-Since": date['Last-Modified']})
	try:
		d = urllib2.urlopen(req)
		data=d.read()
		d = file("Datei", "w")
		d.write(data)
		d.close()

	except urllib2.HTTPError, e:
		if e.code == 304:
			print "Nicht modifiziert"
		else:
			raise e
except KeyError:
	pass
f.close()
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Eventuell wird ja ein ETag-Header gesendet, anhand dem man schauen kann, ob sich der Inhalt geändert hat oder aber du hast eben Pech und der Server sagt dir halt nicht, ob sich der Inhalt geändert hat.
Ubuntuxer
User
Beiträge: 42
Registriert: Donnerstag 17. April 2008, 15:49

Ich hab leider festgestellt, dass wenn kein Last-Modified vorhanden ist, auch kein ETag-Header gesendet wurde.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Ubuntuxer hat geschrieben:Kann man den head-request auch einfach anzeigen lassen?
Hier bietet sich das Kommandozeilen-Tool "curl" an:

Code: Alles auswählen

sma$ curl -I www.yahoo.com
HTTP/1.1 200 OK
Date: Sun, 22 Jun 2008 08:55:04 GMT
P3P: policyref="http://p3p.yahoo.com/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"
Cache-Control: private
Vary: User-Agent
X-XRDS-Location: http://open.login.yahooapis.com/openid20/www.yahoo.com/xrds
Last-Modified: Sun, 22 Jun 2008 08:43:36 GMT
Accept-Ranges: bytes
Content-Length: 9562
Connection: close
Content-Type: text/html; charset=utf-8
sma$
Stefan
Antworten