Seite 1 von 1

Einloggen per POST-Methode von PHP (per Qt)

Verfasst: 13. Januar 2006 15:02
von Klaue
Hallo zusammen
erstmal das problem:
mein programm sollte sich über ein php-script auf einem webserver einloggen (mit username + passwort des benutzers).
dieses php-formular ist von deviantArt (kennt hier vieleicht jemand) und sieht so aus:

Code: Alles auswählen

<form class="login main" action="http://www.deviantart.com/users/login" method="post">
	<input type="hidden" name="ref" value="http://www.deviantart.com/"/>
	<label><kbd class="shortcut" title="Keyboard shortcut: Alt+U (Win), Ctrl+U (Apple)">U</kbd>sername:
	<input class="text" type="text" name="username" value="" accesskey="u" size="10" maxlength="20"/></label>
	<label><kbd class="shortcut" title="Keyboard shortcut: Alt+P (Win), Ctrl+P (Apple)">P</kbd>assword:
	<input class="text" type="password" name="password" accesskey="p" size="10"/></label>
	<input class="button" type="submit" name="action" value="Login"/>
</form>
ich müsste also diese verte mitgeben:

Code: Alles auswählen

Variable	Wert
------------------------------
ref             http://www.deviantart.com/ (bzw. die seite, an die es danach weiterleitet, normalerweise die, von der man eingeloggt hat)
username        Benutzername
password        Passwort
action          Login
damit der user, wenn er sich per browser angemeldet hat, nicht ausgeloggt wird, muss ich noch reusetoken=1 mitliefern

soweit ich das verstanden hab, sollte ich diese parameter per
int QHttp::post ( const QString & path, QIODevice * data, QIODevice * to = 0 )
liefern können
nur.. wie schreibe ich die params da rein? QIODevice hat nix dafür.. wenigstens nicht soweit ich das seh.
könnte mir da einer weiterhelfen? besonders ein beispielprogramm (falls ihr eines kennt) wär praktisch.

und dann ist da noch ein zweites problem: das programm muss sich einloggen, um auf eine userspezifische seite zu kommen (falls da jemand dA kennt, die friendslist ist die seite, die ich brauche)
diese seite könnte ich auch als ref mitgeben, nur weiss ich nicht, ob Qt diese weiterleitung mitmacht.
ausserdem denke ich, dass ich ein cookie anlegen müsste, damit ich vom loginscript bis zu der seite, zu der ich will, nicht ausgeloggt werde. das ist nur theoretisch, da ich noch nicht weiss, ob dieses problem auftauchen wird, aber ich wollte dennoch fragen: bietet Qt eine möglichkeit, cookies anzulegen, oder müsste ich die sozusagen manuell erstellen (mit den daten aus dem HTTP-header oder so)

ich danke euch schonmal fürs lesen und hoffe auf hilfe :)

Verfasst: 16. Januar 2006 10:45
von Klaue
Bild
ich weiss, man sollte threads, auf die so offensichtlich niemand antwortet, nicht hochpushen, aber ich weiss echt nicht weiter..
für euch (oder manche von euch) muss das doch ein kinderspie sein..

Verfasst: 16. Januar 2006 23:06
von uhu01
Hy!

Ich kann dir soweit auch nicht weiterhelfen, aber Versuch mal die überladung mit dem ByteArray zu benutzen, da sollte die Verwendung klarer sein, und zu sehen, was über das Netzwerk geht wenn du die Methode aufrufst. (z.B. mit Ethereal)

Ich würde es allerdings eher mit der request-Methode versuchen.

mfg
uhu01

Verfasst: 17. Januar 2006 07:42
von macman
uhu01 hat geschrieben:Ich würde es allerdings eher mit der request-Methode versuchen.
Muß sogar. Das Ganze sieht dann etwa so aus:

Code: Alles auswählen

	QHttpRequestHeader header("POST", url.path());
	header.setValue("Host", url.host());
	header.setValue("User-Agent", "Programname" + version);
	header.setValue("Accept", "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5");
	header.setValue("Accept-Language", "de-de,de;q=0.8,en-us;q=0.5,en;q=0.3");
	header.setValue("Accept-Encoding", "gzip,deflate");
	header.setValue("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
	header.setValue("Keep-Alive", "300");
	header.setValue("Connection", "keep-alive");
	header.setValue("Referer", "Programname " + version);
	header.setValue("Authorization", "Basic SG9sem1hOmN1dDJzaXpl");
	header.setValue("Content-Type", "multipart/form-data boundary=---------------------------125282808721657");
	bytes = new QByteArray();
	bytes->append("-----------------------------125282808721657\n");	// Das hier ist ein Dummy-Feldname, damit
	bytes->append("Content-Disposition: form-data; name="upload"\n");	// das auch als POST wahr genommen wird
	bytes->append("\nUploadFile\n");
	// und jetzt kommen die einzelnen Files
	QString name, dateiName;
	file = new QFile();
	for (int l=0; l<files.count(); l++)
	{
		QFileInfo fileInfo(files[l]);
		file->setFileName(files[l]);
		dateiName = fileInfo.fileName();
		if (!file->exists())
		{
			printf("File %S doesn't exist.\n", files[l].utf16());
			delete file;
			file = 0;
			exit(-1);
		}
		if (!file->open(QIODevice::ReadOnly)) 
		{
			printf("Unable to read the file %S: %S.",dateiName.utf16(), file->errorString().utf16());
			delete file;
			file = 0;
			exit(-1);
		}

		bytes->append("-----------------------------125282808721657\n");
		bytes->append("Content-Disposition: form-data; name="datei[" + QString::number(l));
		bytes->append("]"; filename="" + dateiName + ""\n");
		bytes->append("Content-length: " + QString::number(fileInfo.size()));
		bytes->append("\nContent-Type: text/plain\n\n");
		bytes->append(file->readAll());
		file->close();
	}

	buffer = new QBuffer(bytes);
	if (resultFile=="")
		resultFile = "result.html";
	QDir d;
	if (d.exists(resultFile))
		d.remove(resultFile);
	logFile = new QFile(resultFile);
	file->open(QIODevice::ReadWrite);
	httpPostId = http->request(header, buffer, logFile);
In dem Beispiel werden ein paar Files an ein passwortgeschütztes PHP-Skript geschickt. Vielleicht hilft es ja weiter.

Verfasst: 18. Januar 2006 13:31
von Klaue
Danke vielmals!
Ich werde versuchen, das Heute oder am Wochenende (je nachdem wie es die Arbeit zulässt) an mein Projektchen anzupassen. Ich hoffe, es funktioniert ;)
Danke nochmals (natürlich an beide. Daran, dass ich mal den HTTP-Header abfangen könnte, hab ich gar nicht mehr gedacht ;))