POST Packets mit anderem Content-Type

10/09/2013 20:39 Mr.Tr33#1
Moin,
ich möchte gerne Information aus einer Seite mit PHP oder AutoIt, jedenfalls per HTTP Packets, auslesen und Formulare abschicken.

So mein Problem ist aber jetzt, dass ich noch nie mit einem multipart/form-data Content-Type gearbeitet habe.
So sieht das Packet aus:

Code:
-----------------------------299053068410299\r\n
Content-Disposition: form-data; name="authenticity_token"\r\n
\r\n
jC103HtaajY1zUeHUQJcwvccWZyHvqHuQOFV6OBP0ds=\r\n
-----------------------------299053068410299\r\n
Content-Disposition: form-data; name="user[login]"\r\n
\r\n
test\r\n
-----------------------------299053068410299\r\n
Content-Disposition: form-data; name="user[name]"\r\n
\r\n
test\r\n
-----------------------------299053068410299\r\n
Content-Disposition: form-data; name="user[password]"\r\n
\r\n
test\r\n
-----------------------------299053068410299\r\n
Content-Disposition: form-data; name="user[password_confirmation]"\r\n
\r\n
test\r\n
-----------------------------299053068410299\r\n
Content-Disposition: form-data; name="user[email]"\r\n
\r\n
[Only registered and activated users can see links. Click Here To Register...]\r\n
-----------------------------299053068410299\r\n
Content-Disposition: form-data; name="user[born_at_day]"\r\n
\r\n
6\r\n
-----------------------------299053068410299\r\n
Content-Disposition: form-data; name="user[born_at_month]"\r\n
\r\n
7\r\n
-----------------------------299053068410299\r\n
Content-Disposition: form-data; name="user[born_at_year]"\r\n
\r\n
1987\r\n
-----------------------------299053068410299\r\n
Content-Disposition: form-data; name="user[gmt_offset]"\r\n
\r\n
-120\r\n
-----------------------------299053068410299\r\n
Content-Disposition: form-data; name="user[language_id]"\r\n
\r\n
14\r\n
-----------------------------299053068410299\r\n
Content-Disposition: form-data; name="captcha"\r\n
\r\n
iqrcoj\r\n
-----------------------------299053068410299\r\n
Content-Disposition: form-data; name="captcha_key"\r\n
\r\n
273551cb9ee379304ccc98a44028b6d9856b1593\r\n
-----------------------------299053068410299\r\n
Content-Disposition: form-data; name="commit"\r\n
\r\n
Registrieren\r\n
-----------------------------299053068410299--\r\n
Also mein eigenetliches Problem ist, woher diese Zahl 299053068410299 kommt. Im Header steht sie nicht und sie entsteht plötzlich beim verschicken.

Ich habe mir überlegt, was wenn man einfach beim Packet selbst sagt, dass es ein application/x-www-form-urlencoded Content-Type ist?
Dann Würde mein Packet ja so aussehen:

Code:
user[name]=test&user[password]=test&user[password_confirmation]=test&user[email]=[Only registered and activated users can see links. Click Here To Register...]&user[born_at_day]=21&user[born_at_month]=7&user[born_at_year]=1991&user[language_id]=14&captcha=tfzguh&commit=Registrieren
Kann mir da einer helfen?

Mit freundlichen Grüßen,
Mr.Tr33
10/09/2013 20:53 snow#2
Das hatte ich auch mal vor längerer Zeit bei einem Bot, am Ende habe ich es so gelöst:

Code:
	protected String generateBoundary() {
        StringBuilder buffer = new StringBuilder();
        Random rand = new Random();
        
        for (int i = 0; i < 29; ++i) {
        	buffer.append(MULTIPART_CHARS[rand.nextInt(MULTIPART_CHARS.length)]);
        }
        
        return buffer.toString();
   }
Code:
	private final static char[] MULTIPART_CHARS = "1234567890".toCharArray();
Code:
String boundaryRand = generateBoundary();
		String boundary = "-----------------------------" + boundaryRand;
Code:
connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=---------------------------" + boundaryRand);
Code:
out.writeBytes("Content-Disposition: form-data; name=\"name\"" + \r\n);
	 out.writeBytes(name + endl);
Das ganze ist wohl einfach zufällig generiert, solange alles übereingestimmt hat, hat bei mir alles geklappt.
Code ist in Java, kann man gerne direkt übernehmen oder umschreiben. :)
10/09/2013 21:26 Mr.Tr33#3
Hmm danke.
Also du hast einfach irgend ein Zahlenstring in der selben länge generiert?
Habe ich es richtig verstanden?
10/09/2013 21:35 tolio#4
der string ist random, üblich ist es afaik den aktuellen timestamp zu nehmen
10/09/2013 23:32 snow#5
Quote:
Originally Posted by Mr.Tr33 View Post
Hmm danke.
Also du hast einfach irgend ein Zahlenstring in der selben länge generiert?
Habe ich es richtig verstanden?
Korrekt, einfach die Länge, die auch von der Website verwendet wurde. :)
10/10/2013 03:57 meak1#6
Code:
Func getBoundary()
	Return StringLeft(_TimeGetStamp() * Random(10, 256, 1), 16)
EndFunc   ;==>getBoundary

Func _TimeGetStamp()
	Local $av_Time
	$av_Time = DllCall('CrtDll.dll', 'long:cdecl', 'time', 'ptr', 0)
	If @error Then
		SetError(99)
		Return False
	EndIf
	Return $av_Time[0]
EndFunc   ;==>_TimeGetStamp

$boundary = getBoundary()