Aus einem geschützten Bereich (.htaccess) herunterladen

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.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Wow Dir ist echt langweilig. Glaubst Du ernsthaft, dass das jemand liest?
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@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 :)
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@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?
Sirius3
User
Beiträge: 18264
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@Sirius3: Ich habe deine Anmerkungen zu den Cookies angenommen und es gleich umgesetzt, auch habe ich den Quelltext optisch etwas aufgebesser:

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"
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.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Lass dir mal die header vom Server ausgeben.

Bzw nimm einfach Firefox und schau dir an was so hin und her über tragen wird...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@jens: Im Header steht folgende Information, die ausgegeben wird:
{'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'}
Daneben habe ich mir dann HttpFox 0.8.14.1 heruntergeladen, installiert und angewendet.

Das Ergebnis bei der Anmeldung sieht wie folgt aus:
Bild
(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.
Bild
(Anklicken, Bild vergrößert sich)
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

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.

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

Code: Alles auswählen

response = s.get(content_txt_file, stream=True)
in diese Zeile

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.
Sirius3
User
Beiträge: 18264
Registriert: Sonntag 21. Oktober 2012, 17:20

@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ß.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Sirius3 hat geschrieben:Sie benutzt irgendwelche globalen Variablen und referenziert Methoden, die sie dann nicht aufruft.
@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
User
Beiträge: 18264
Registriert: Sonntag 21. Oktober 2012, 17:20

@Sophus: in der Funktion Deines letzten Posts gibt es kein self.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@Sirius3: Stimmt. Keine Ahnung wieso ich das geschrieben habe. Aber dennoch verstehe ich deine Anmerkung nicht, wenn du von globalen Variablen schreibst.
Antworten