[gelöst] QHttp Download mit Anmeldung am Server

Alles rund um die Programmierung mit Qt
Antworten
FaS
Beiträge: 184
Registriert: 25. Mai 2006 19:48
Kontaktdaten:

[gelöst] QHttp Download mit Anmeldung am Server

Beitrag von FaS »

Hallo!

Ich will mit einem Programm Dateien vom Filehoster rapidshare.com über meinen Account herunterladen.
Direct downloads sind aktiviert, aber nur wenn ich eingeloggt bin, ansonsten wird nur die Downloadseite angezeigt.

In Download Managern funktioniert das über die Funktion "Anmeldung am Server" ganz normal.

Mit Qt funktioniert das irgendwie noch nicht:

Code: Alles auswählen

  // m_http: QHttp* member variable
  // url: QUrl-Instanz mit dem herunterzuladenen Link
  // Einige Fehler-, Status- usw. -Slots sind verbunden..
  m_http->setHost( url.host(), url.port() != -1 ? url.port() : 80 );
  m_http->setUser( m_user, m_pass );
  m_httpGetId = m_http->get( url.path(), m_file );
Mit obigem Code wird nur die Download-HTML-Seite heruntergeladen.
Im Log des Downloadmanagers FlashGet, hab ich das gefunden:
"Authorization: Basic [ein Base64-codierter String]"
Ich hab versucht dieses Header-Element manuell zu setzen, aber leider mit dem selben Ergebnis. Ich hab aber auch eigentlich keine Ahnung davon:

Code: Alles auswählen

  // m_http: QHttp* member variable
  // url: QUrl-Instanz mit dem herunterzuladenen Link
  // Einige Fehler-, Status- usw. -Slots sind verbunden..
  m_http->setHost( url.host(), url.port() != -1 ? url.port() : 80 );  
  QByteArray text;
  text.append( m_user + ":" + m_pass );
  text = text.toBase64();
  text.insert( 0, "BASIC " );
  QHttpRequestHeader header( "GET", url.path() );
  //header.setValue( "Host", "rapidshare.com" );
  header.setValue( "Authorization", text.data() );
  header.setValue( "Pragma", "no-cache" );
  header.setValue( "Cache-Control", "no-cache" );
  header.setValue( "P3P", "CP=\"ALL DSP COR CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa CONa TELa OUR STP UNI NAV STA PRE\"" ); // Keine Ahnung was das ist, hab ich auch im FlashGet Log gefunden
  m_httpGetId = m_http->request( header, 0, m_file );
Also, ich bin grad ratlos. V.A. weil das mit Downloadmanagern so problemlos klappt, sowas muss doch mit Qt zu implementieren sein...
Bin dankbar für jeden Ratschlag,
FaS
Zuletzt geändert von FaS am 5. Juli 2007 15:11, insgesamt 1-mal geändert.
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Firefox mit 'Live HTTP headers'. Damit kannst Du ausreichend genau protokollieren was raus geht und rein kommt.
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
FaS
Beiträge: 184
Registriert: 25. Mai 2006 19:48
Kontaktdaten:

Beitrag von FaS »

OK, danke, damit konnte ich zumindest feststellen wie der dem Server den Cookie überträgt, wenn ich mich zuvor mit Firefox angemeldet habe.

Allerdings ist das nur ein schlechtes work-around, wenn ich anhand der Anmeldedaten ein (in diesem Fall noch einfach zu entschlüsselndes) Cookie simuliere. Downloadmanager haben ja logischerweise auch keine Cookie-Informationen.
Gibt es da vielleicht einen Manager, bei dem man die HTML-Header ebenso leicht ausspionieren kann? Das würde mir vielleicht reichen, wenn das sonst keiner weiß.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Früher hieß es ethereal, den aktuellen Namen kenn ich nicht...
NoobSaibot
Beiträge: 99
Registriert: 27. Januar 2005 15:55

Beitrag von NoobSaibot »

wireshark heißt es jetzt glaube ich
bst
Beiträge: 56
Registriert: 7. November 2006 13:16
Wohnort: Ilsfeld

Beitrag von bst »

wireshark heißt es jetzt glaube ich
Stimmt. http://de.wikipedia.org/wiki/Wireshark

cu, Bernd
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Re: QHttp Download mit Anmeldung am Server

Beitrag von macman »

FaS hat geschrieben:

Code: Alles auswählen

  header.setValue( "Authorization", text.data() );
Was steht denn in text.data()? Die komplette Zeile muss in etwa so aussehen:

Code: Alles auswählen

	header.setValue("Authorization", "Basic SG9sem1hOmN1dDJzaXpl");
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
FaS
Beiträge: 184
Registriert: 25. Mai 2006 19:48
Kontaktdaten:

Beitrag von FaS »

Ja so in etwa sah die Zeile aus.. mit einem Unterschied: Da ich das im Netz mehrmals so gesehen habe, hatte ich "Basic" groß geschrieben: BASIC. Ich hätte nicht gedacht, dass er da Unterschiede macht.
Eigentlich hatte ich es schon irgendwann mal richtig geschrieben (mir ist so als hätte ich mal den Original-Text aus FlashGet benutzt anfangs), allerdings hatte ich da die Url-Umleitung (wenn responseHeader.statusCode() == 302) noch nicht implementiert, vielleicht gings deswegen nicht..

Falls jemand etwas ähnliches versuchen will, fasse ich hier mal einige aufgetretende Probleme zusammen, hauptsächlich bzgl. Umleitung:
1. Auf Groß-/Kleinschreibung achten!
2. Nach der Umleitung bzw. am besten immer sollte man vor dem Setzen des neuen Hosts mit setHost(), wenn man das selbe QHttp-Objekt verwendet,

Code: Alles auswählen

m_http->setHost( "localhost" );
davor setzen, keine Ahnung warum, hab den Vorschlag in einem anderen Forum zu einem ähnlichen Problem gesehen. Wenn man das nicht macht antwortet der Server ständig mit einer neuen Umleitungs-Url, als würde sie sich garnicht ändern bei der Anfrage.
3. Wenn man z.B. in seinem QHttp::requestFinished()-Slot die Umleitung sartet, also mehr oder weniger unmittelbar nach einen der letzen Signale des QHttp-Objektes, sollte man ihm etwas Zeit lassen (weiß nicht was der noch alles erledigen will, jedenfalls ignoriert der sonst die neue Anfrage). Also man sollte seine Download-Funktion in einen Slot umwandeln und ihn folgendermaßen aufrufen, dann werden erst alle anstehenden Ereignisse abgearbeitet:

Code: Alles auswählen

QTimer::singleShot( 0, this, SLOT(downloadFile()) );
4. hmm... glaube das war sogar schon alles..

Also danke nochmal an alle beteiligten!
MfG,
FaS
Antworten