Aus einem geschützten Bereich (.htaccess) herunterladen
@jerch: Na, mir wird ja ständig unterstellt, das ich wild, und ohne nachzudenken herumrate, und das mir nur durch Zufall einige Python-Befehle auf dem Bildschirm landen. Ich möchte ja nur aufzeigen, dass ich durchaus nachdenke beim Schreiben, und nicht Löcher in die Decke blicke, und einfach wahllos irgendwas tippe 

@jens: Du gabs mit die Stichwörter Session und Cookies. Ich benutze gegenwärtig die Version 2.7.0, also die neuste Version. Werden die Cookies nicht mit der Session dauerhaft erzeugt? Sprich, ich muss also nicht mehr künstlich ein Cookie hinzufügen, oder?
@Sophus: Du hast die Funktionsweise einer Authentifizierung nicht verstanden. Da hilft es auch nicht, dass Du versuchst, Python-Code zu schreiben, der für Dich sinnvoll erscheint. Du mußt Dich halt an die Regeln des HTTP-Protokolls halten. Cookies spielen dabei übrigens gar keine Rolle. Hier steht übrigens, wie Du Dein Problem mit Sessions lösen kannst. del braucht man so gut wie nie, hier ist es völlig überflüssig. close solltest Du auch aufrufen, damit es einen Effekt hat. response schließt Du im Übrigen auch nicht.
@Sirius3: Ich habe deine Anmerkungen zu den Cookies angenommen und es gleich umgesetzt, auch habe ich den Quelltext optisch etwas aufgebesser:
Zum Link, den du mir gegeben hast. Ich habe diesen Link mehrmals durchgelesen, denn es war einer der ersten Seite, den ich mir für dieses Thema ausgesucht habe. Jedoch fand ich keine Stelle, wo die Problematik mit der Authentifizierung angesprochen wird. Es wird nur das Konstrukt (HTTPBasicAuth) der Authentifizierung aufgezeigt, den ich ja auch übernommen habe. Wahrscheinlich sehe ich den Wald vor lauter Bäumen nicht und habe mich gedanklich mächtig festgefahren. Ich weiß, zu viele Print-Anweisungen, aber die verschwinden ja am Ende sowieso. Ist nur für den Testzweck.
Code: Alles auswählen
def get_logged_in_session(user, pwd):
url = 'http://xarphus.de/protect_folder'
auth = HTTPBasicAuth(user, pwd)
s = requests.session()
resp = s.get(url=url, auth=auth)
print "Status: ", resp.status_code
content_txt_file = resp.text
print "Cookies: ", s.cookies
print "Content of txt file: ", content_txt_file
print "init the download"
response = s.get(content_txt_file, stream=True)
print "start downloading"
with open('test_rar.rar', 'wb') as out_file:
shutil.copyfileobj(response.raw, out_file)
print "Closing response"
response.close
print "response is closed"
print "Closing resp"
resp.close
print "resp is closed"
@jens: Im Header steht folgende Information, die ausgegeben wird:
Das Ergebnis bei der Anmeldung sieht wie folgt aus:

(Anklicken, Bild vergrößert sich)
Nachdem ich den Link bekomme, kopiere ich den Link, füge es in die Adresszeile, und das Herunterladen beginnt. In der letzten Zeile sieht man es. In der Spalte "Empfangen" steht dann 39M.

(Anklicken, Bild vergrößert sich)
Daneben habe ich mir dann HttpFox 0.8.14.1 heruntergeladen, installiert und angewendet.{'content-length': '64', 'via': '1.1 varnish', 'content-encoding': 'gzip', 'accept-ranges': 'bytes, bytes', 'vary': 'Accept-Encoding', 'server': 'Apache', 'last-modified': 'Thu, 23 Jul 2015 00:07:09 GMT', 'connection': 'keep-alive', 'x-varnish': '336783642', 'etag': '"e627fa31-2e-51b7fab299961"', 'date': 'Thu, 23 Jul 2015 20:59:42 GMT', 'content-type': 'text/plain', 'age': '0'}
Das Ergebnis bei der Anmeldung sieht wie folgt aus:

(Anklicken, Bild vergrößert sich)
Nachdem ich den Link bekomme, kopiere ich den Link, füge es in die Adresszeile, und das Herunterladen beginnt. In der letzten Zeile sieht man es. In der Spalte "Empfangen" steht dann 39M.

(Anklicken, Bild vergrößert sich)
Nachdem ich meinen Quelltext mehrmals rauf und runter interpretiert und viele Dokumentationen im Internet darüber angesehen habe, bin ich dann so langsam über eine Stelle gestolpert.
Ich bin über die Zeile 16 gestolpert. Ich greife hier zwar auf die content_txt_file -Variable zu, in der der Link zu der herunterzuladende Datei gespeichert ist. Jedoch greife ich hier ohne Authentifizierung zu. Sirius3 und jens haben mich mehrmals darauf aufmerksam gemacht, nur ist es mir immer wieder entgangen.
Ich habe in Zeile 16 diese Zeile
in diese Zeile
umgewandelt.
Die URl ist weiterhin content_txt_file geblieben, denn dort ist ja der Link zu der Datei gespeichert, nur habe ich auth=auth hinzugefügt. Hier wird also beim Herunterladen nochmal authentifiziert.
Code: Alles auswählen
def get_logged_in_session(user, pwd):
url = 'http://xarphus.de/protect_folder'
auth = HTTPBasicAuth(user, pwd)
s = requests.session()
resp = s.get(url=url, auth=auth)
print "Look cookie", resp.text
print "Status: ", resp.status_code
content_txt_file = resp.text
print "Cookies: ", s.cookies
print "Content of txt file: ", content_txt_file
print "init the download"
response = s.get(content_txt_file, stream=True)
print "start downloading"
with open('test_rar.rar', 'wb') as out_file:
shutil.copyfileobj(response.raw, out_file)
print "Closing response"
response.close
print "response is closed"
print "Closing resp"
resp.close
print "resp is closed"
Ich habe in Zeile 16 diese Zeile
Code: Alles auswählen
response = s.get(content_txt_file, stream=True)
Code: Alles auswählen
response = s.get(url=content_txt_file, auth=auth, stream=True)
umgewandelt.
Die URl ist weiterhin content_txt_file geblieben, denn dort ist ja der Link zu der Datei gespeichert, nur habe ich auth=auth hinzugefügt. Hier wird also beim Herunterladen nochmal authentifiziert.
@Sophus: Deine Funktion hat einen seltsamen Namen, für das, was sie macht. Sie benutzt irgendwelche globalen Variablen und referenziert Methoden, die sie dann nicht aufruft. Und in dem Link, den ich geschickt hatte, war gleich im ersten Abschnitt ein Beispiel, man die Authetifizierungsinformation nur einmal in einer Session angeben muß.
@Sirius3: Welche globalen Variablen meinst du? Die Variablen, die in der Funktion ohne eine self-Referenz stehen gelten doch nicht global? Ich bin mir sicher, dass ich dich falsch verstehe.Sirius3 hat geschrieben:Sie benutzt irgendwelche globalen Variablen und referenziert Methoden, die sie dann nicht aufruft.