Seite 1 von 1

Änderungen von Dateien auf Server per timestamp überwachen

Verfasst: Freitag 13. Juni 2008, 23:08
von Ubuntuxer
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.

Verfasst: Samstag 14. Juni 2008, 11:03
von sma
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

Verfasst: Samstag 14. Juni 2008, 20:44
von Ubuntuxer
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 :)

Verfasst: Sonntag 15. Juni 2008, 11:07
von Joghurt
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

Verfasst: Sonntag 15. Juni 2008, 16:37
von Ubuntuxer
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:

Verfasst: Sonntag 15. Juni 2008, 16:42
von Joghurt
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 ;)

Verfasst: Sonntag 15. Juni 2008, 21:00
von Ubuntuxer
Ich verstehe grad nicht genau was du meinst. Wie kann ich den Timestamp der Datei denn herauskriegen?

Verfasst: Samstag 21. Juni 2008, 11:31
von Ubuntuxer
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()

Verfasst: Samstag 21. Juni 2008, 11:56
von Trundle
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.

Verfasst: Samstag 21. Juni 2008, 14:00
von Ubuntuxer
Ich hab leider festgestellt, dass wenn kein Last-Modified vorhanden ist, auch kein ETag-Header gesendet wurde.

Verfasst: Sonntag 22. Juni 2008, 09:59
von sma
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