Seite 1 von 3

http-request: post; login klappt nicht

Verfasst: 03.09.2009 23:16
von sen-me
Hallo,

ich versuche mich bei wer-kennt-wen über Purebasic einzuloggen, aber ich krieg nur den Statuscode 302 zurück anstatt der Bestätigung des logins...

Ich hab mal mit Firebug eine Auswertung gemacht und stellte fest das nach der POST-Übermittlung noch mittels GET irgendetwas gesendet wird (irgendwas mit Cookie)

Code: Alles auswählen

Host	www.wer-kennt-wen.de
User-Agent	Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2
Accept	text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language	de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding	gzip,deflate
Accept-Charset	ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive	300
Connection	keep-alive
Referer	http://www.wer-kennt-wen.de/
Cookie ...
Das ist ein teil des PB-Codes:

Code: Alles auswählen

InitNetwork()
id = OpenNetworkConnection("http://www.wer-kennt-wen.de/start.php", 80)

If id
 info.s = "loginName=email&pass=pass&logIn=1"
 header.s = "POST /start.php HTTP/1.1"+#CRLF$
 header + "Host: wer-kennt-wen.de"+#CRLF$
 header + "Content-type: application/x-www-form-urlencoded"+#CRLF$
 header + "Content-length: "+Str(Len(info))+#CRLF$
 header + "Connection: close"+#CRLF$+#CRLF$
 header + info
 SendNetworkString(id, header)
 
 Repeat : Until NetworkClientEvent(id) = 2
 
 ReceiveNetworkData(id, *buffer, MemorySize(*buffer))
 
 If CreateFile(0, "C:\buffer.htm")
  WriteData(0, *buffer, MemorySize(*buffer))
  CloseFile(0)
  RunProgram("C:\buffer.htm")
 EndIf
 
 CloseNetworkConnection(id)
EndIf
Kann mir da wer bitte weiterhelfen?

Lg sen

Edit:
Bzw. was hat es mit Anfrage-Header und Antwort-Header auf sich?
Er ruft nach der POST-Antwort (Failed to load source for: http://www.wer-kennt-wen.de/start.php) dann wer-kennt-wen.de/start auf, wenn ich diese Seite nach dem Login einfach nur aufrufe kommt eine komplett leere Seite ???

Edit2:
Bin ein stück weiter, und zwar muss ich wie schon vermutet irgendwas mit Cookies behandeln.
Jetzt ist die Frage wie ich das anstell? 1. was muss in den Cookie geschrieben werden 2. wie hantiere ich das mit PB?

Verfasst: 04.09.2009 21:18
von time2die81
Hallo,

der Server schickt dir das Cookie zusammen mit dem header :
GET /cgi/suche.py?q=cookie+aufbau HTTP/1.0

Der Server antwortet mit dem Suchergebnis und bittet den Browser mit der „Set-Cookie“-Zeile, sich den letzten Suchbegriff zu merken:

HTTP/1.0 200 OK
Set-Cookie: letzteSuche="cookie aufbau";
expires=Tue, 29-Mar-2005 19:30:42 GMT;
Max-Age=2592000;
Path=/cgi/suche.py;
Version="1"
Normalerweise stehen alle Eigenschaften des Cookies in einer einzigen Zeile. Zur besseren Lesbarkeit steht hier jedoch nur ein Attribut pro Zeile.
Das Cookie was der Browser nun zurücksendet würde so aussehn :
GET /cgi/suche.py?q=12345 HTTP/1.0
Cookie: $Version="1"; letzteSuche="cookie aufbau"; $Path=/cgi/suche.py
alles bischen komplex aber machbar .

Lies doch mal hier nach : http://de.wikipedia.org/wiki/HTTP-Cookie
Alles ausführlich und relativ einfach erklärt.

mfg

Quelle : Wikipedia

Verfasst: 05.09.2009 09:26
von sen-me
Hi,

achso, jagut aber der sendet mir doch kein Cookie zu sondern eine Umleitung (302) oder?

Edit

Ahh solangsam erkenn ich deren "Sicherheitsfunktion"...
Sobald man die Seite betritt wird schon ein Cookie gesetzt... ich habe mal rein aus neugier mal versucht, wenn ich schon auf der Seite bin, dann die Cookies lösche, und direkt einlogge, sagt der ich hätte die Cookies gesperrt... und dann logg ich mich ohne nochmal die Seite zu erneuern ein und es geht (also über den Browser)
Er speichert eine Session in ein Cookie ein inklusive Referer, welche er beim login zusätzlich verlangt...

Hast mir schonmal viel weitergeholfen!
Werd ich heut Abend direkt mal versuchen =)

Nurnoch eine Frage (sorry, mein PB ist bisschen eingerostet ^^)
Der speichert mittels Javascript in das Cookie ein Eintrag "POPUPCHECK" worin irgendetwas gespeichert wird:

Code: Alles auswählen

var szmexp = new Date();var szmnex = szmexp.getTime() + 86400000;szmexp.setTime(szmexp.getTime() + 86400000);document.cookie = "POPUPCHECK=" +szmnex + "
Sieht für mich wie eine Art Timeout aus wenn man die Seite nicht länger aktualisiert...

Kennt sich wer damit aus? Ich vermute das ist ein Timestamp, kann ich das in PB irgendwie auch unkompliziert nachmachen?

Verfasst: 05.09.2009 10:52
von time2die81
Nix leichter als das :

Code: Alles auswählen

Global szmexp.q
szmexp = Date() * 1000 +  86400000  ; Javascipt gibt das Date format in millisc. daher umrechnen
Debug szmexp
ergebnis ist gleich mit dem Javascript .
Java script läßt sich sehr einfach nach purebasic umschreiben.

zu den login check. du mußt alt alle redirects abfangen und folgen. habe das grad getestet ,funzt. bekomm am ende nurn error weil ich das mit den cookies auslesen noch ned in meiner lib übernommen habe.


aber halt mich mal auf dem laufenden wie du das mit den wechselten cookies überwindest.

mfg[/quote]

Verfasst: 05.09.2009 10:56
von sen-me
Hmm irgendwas stimmt nicht...

Zuerst bekomm ich immer als Result 0 zurück bei OpenNetworkConnection wenn ich http:// vor die Adresse schreib, dann sende ich Daten aber es kommt keine Antwort???

Code: Alles auswählen

InitNetwork()
header.s
info.s
id.l
result.s
*buffer = AllocateMemory(10000)
id = OpenNetworkConnection("www.wer-kennt-wen.de", 80)

If id
 header = "GET / HTTP/1.1"+#CRLF$
 header + "Host: www.wer-kennt-wen.de"+#CRLF$
 header + "Keep-Alive: 300"+CRLF$
 header + "Connection: keep-alive"+#CRLF$
 SendNetworkString(id, header)
 
 Repeat : Until NetworkClientEvent(id) = 2
 
 ReceiveNetworkData(id, *buffer, MemorySize(*buffer))
 result = PeekS(*buffer)
 Debug result
 ;
 ;info = "loginName=email&pass=pass&logIn=1"
 ;header = "POST /start.php HTTP/1.1"+#CRLF$
 ;header + "Host: wer-kennt-wen.de"+#CRLF$
 ;header + "Content-type: application/x-www-form-urlencoded"+#CRLF$
 ;header + "Content-length: "+Str(Len(info))+#CRLF$
 ;header + "Connection: close"+#CRLF$+#CRLF$
 ;header + info
 ;SendNetworkString(id, header)
 ;
 ;Repeat : Until NetworkClientEvent(id) = 2
 ;
 ;ReceiveNetworkData(id, *buffer, MemorySize(*buffer))
 ;
 ;If CreateFile(0, "C:\buffer.htm")
 ; WriteData(0, *buffer, MemorySize(*buffer))
 ; CloseFile(0)
 ; RunProgram("C:\buffer.htm")
 ;EndIf
 
 CloseNetworkConnection(id)
EndIf
End

Verfasst: 05.09.2009 17:19
von time2die81
Jup,

fehler im Header der Header mit GET wird mit einem #crlf abgeschlossen.

dein code überarbeitet :

Code: Alles auswählen

InitNetwork()
header.s
info.s
id.l
result.s
*Buffer = AllocateMemory(10000)
id = OpenNetworkConnection("www.wer-kennt-wen.de", 80)

If id
	header = "GET / HTTP/1.0"+#CRLF$ ;-> anfänger sollten http 1.0 verwenden da hierbei die connection nicht immer wieder geschlossen wird
	header + "Host: www.wer-kennt-wen.de"+#CRLF$
	header + #CRLF$ ;- > Get wird wir #crlf abeschlossen
	SendNetworkString(id, header)
	
	Repeat 
		Delay(10)
		Until NetworkClientEvent(id) 

	
	ReceiveNetworkData(id, *Buffer, MemorySize(*Buffer))
	result = PeekS(*Buffer)
	Debug result
	;
	;info = "loginName=email&pass=pass&logIn=1"
	;header = "POST /start.php HTTP/1.1"+#CRLF$
	;header + "Host: wer-kennt-wen.de"+#CRLF$
	;header + "Content-type: application/x-www-form-urlencoded"+#CRLF$
	;header + "Content-length: "+Str(Len(info))+#CRLF$
	;header + "Connection: close"+#CRLF$+#CRLF$
	;header + info
	;SendNetworkString(id, header)
	;
	;Repeat : Until NetworkClientEvent(id) = 2
	;
	;ReceiveNetworkData(id, *buffer, MemorySize(*buffer))
	;
	;If CreateFile(0, "C:\buffer.htm")
	; WriteData(0, *buffer, MemorySize(*buffer))
	; CloseFile(0)
	; RunProgram("C:\buffer.htm")
	;EndIf
	
	CloseNetworkConnection(id)
EndIf
End
Ich erstelle meinen Header mit folgender Prozedur evtl. kannst du davon was verwenden :

Code: Alles auswählen

Procedure HTTPCreateHeader(*Buffer,surl.s,qmethod.Q,sPostvariable.s = "",scookie.s = "",sreferee.s = "")

Protected sPath.s , sHost.s , sParameters.s,SHeader.s
Protected qheaderbufferlength.Q

 sHost = PartUrl(surl,#HTTP_HOST)
 sPath = PartUrl(surl,#HTTP_FULLPATH)
 sParameters = GetURLPart(surl,#PB_URL_Parameters)
 HTTP.ResponseHeader(0)\Host = sHost 

 
 Select qmethod
 
    Case #HTTP_METHOD_GET
      SHeader = "GET "+sPath+" HTTP/1.0" + #CRLF$
    
    Case #HTTP_METHOD_POST
      SHeader = "POST "+sPath+" HTTP/1.0" + #CRLF$
    Case #HTTP_METHOD_PUT
      Debug "NOT COMPLETE"
    Case #HTTP_METHOD_TRACE
      Debug "NOT COMPLETE"
    Case #HTTP_METHOD_OPTION
      Debug "NOT COMPLETE"
 EndSelect
 
 SHeader + "Host: "+sHost +#CRLF$
 SHeader + "User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.10) Gecko/2009042523 Ubuntu/9.04 (jaunty) Firefox/3.0.10" +#CRLF$
 SHeader + "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" +#CRLF$
 SHeader + "Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3" +#CRLF$
 SHeader + "Accept-Encoding: deflate" +#CRLF$
 SHeader + "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7" +#CRLF$
 If Len (sreferee.s)
 SHeader + "Referer: " +sreferee +#CRLF$
 EndIf
 SHeader + "Keep-Alive: 300" + #CRLF$
 SHeader + "Connection: keep-alive" +#CRLF$
 If Len(scookie)
 SHeader + "Cookie: " +scookie + #CRLF$
 EndIf
Select qmethod
 
    Case #HTTP_METHOD_GET
      SHeader + #CRLF$
    
    Case #HTTP_METHOD_POST
      SHeader + "Content-Type: application/x-www-form-urlencoded" + #CRLF$
      SHeader + "Content-Length: " + Str(Len(sPostvariable)) +#CRLF$
      SHeader + #CRLF$
      SHeader + sPostvariable + #CRLF$ +#CRLF$
 
 EndSelect
qHeadersize =  PokeS(*Buffer,SHeader)
Debug qHeadersize
ProcedureReturn 1
EndProcedure
Du wirst dich ein bischen mehr ins http Protokolll einlesen müsssen.

mfg

Verfasst: 06.09.2009 15:49
von sen-me
Hmmm irgendwas stimmt immernoch nicht

Code: Alles auswählen

Repeat
  size = ReceiveNetworkData(id, *buffer, MemorySize(*buffer))
  result + PeekS(*buffer)
 Until size < MemorySize(*buffer)
Der liest trotzdem nicht die gesamte Seite ein, result hat am Ende des Strings "[...]" gespeichert
Die Variable size enthält 7430 und durchläuft demnach nur 1x....

Was läuft da falsch?

Edit

Code: Alles auswählen

Structure cookie
 ServerID.s
 path.s
 POPUPCHECK.s
 PHPSESSID.s
EndStructure

InitNetwork()
string.s
found.q
header.s
info.s
result.s
pos.q
size.l
id.l
*buffer = AllocateMemory(20000)
NewList cookie.cookie()
AddElement(cookie())
info = "loginName=mail@yahoo.de&pass=password&logIn=1&x=19&y=19"
id = OpenNetworkConnection("www.wer-kennt-wen.de", 80)

If id
 header = "GET / HTTP/1.0"+#CRLF$
 header + "Host: www.wer-kennt-wen.de"+#CRLF$+#CRLF$
 SendNetworkString(id, header)
 
 Repeat : Delay(10) : Until NetworkClientEvent(id)
 
 Repeat
  size = ReceiveNetworkData(id, *buffer, MemorySize(*buffer))
  result + PeekS(*buffer)
 Until size < MemorySize(*buffer)
 
 pos = FindString(result, "ServerID", 1)
 cookie()\ServerID = Mid(result, pos+9, FindString(result, ";", pos)-pos-9)
 pos = FindString(result, "PHPSESSID", 1)
 cookie()\PHPSESSID = Mid(result, pos+10, FindString(result, ";", pos)-pos-10)
 pos = FindString(result, "path", pos)
 cookie()\path = Mid(result, pos+5, FindString(result, #CRLF$, pos)-pos-5)
 result = ""
 header = "POST /start.php HTTP/1.1"+#CRLF$
 header + "Host: www.wer-kennt-wen.de"+#CRLF$
 header + "Referer: http://www.wer-kennt-wen.de/"+#CRLF$
 header + "Cookie: ServerID="+cookie()\ServerID+"; PHPSESSID="+cookie()\PHPSESSID+#CRLF$
 header + "Content-type: application/x-www-form-urlencoded"+#CRLF$
 header + "Content-length: "+Str(Len(info))+#CRLF$
 header + "Connection: close"+#CRLF$+#CRLF$
 header + info+#CRLF$
 SendNetworkString(id, header)
 
 Repeat : Delay(10) : Until NetworkClientEvent(id)
 
 Repeat
  size = ReceiveNetworkData(id, *buffer, MemorySize(*buffer))
  result + PeekS(*buffer)
 Until size < MemorySize(*buffer)
 
 pos = FindString(result, "PHPSESSID", 1)
 cookie()\PHPSESSID = Mid(result, pos+10, FindString(result, ";", pos)-pos-10)
 pos = FindString(result, "path", pos)
 cookie()\path = Mid(result, pos+5, FindString(result, #CRLF$, pos)-pos-5)
 Debug cookie()\PHPSESSID
 CloseNetworkConnection(id)
EndIf
End
Das ist mal mein Code
2. Problem, wenn der POST-Teil gesendet wird kommt keine Antwort, manchmal muss ich bisschen warten und dann das Programm starten dann funktionierts 1x auf einmal... Aber die Antwort von dem ist total komisch weil kein Header gesendet wird???

Verfasst: 06.09.2009 17:51
von DarkDragon
sen-me hat geschrieben:Hmmm irgendwas stimmt immernoch nicht

Code: Alles auswählen

Repeat
  size = ReceiveNetworkData(id, *buffer, MemorySize(*buffer))
  result + PeekS(*buffer)
 Until size < MemorySize(*buffer)
Der liest trotzdem nicht die gesamte Seite ein, result hat am Ende des Strings "[...]" gespeichert
:lol: Das ist der neue Debugger. Seit PB 4.3 glaube ich gibt er nur die ersten tausend chars aus oder so und hängt [...] hinten dran.

Verfasst: 06.09.2009 19:09
von HeX0R
Aber davon abgesehen ist es völlig falsch den Rückgabewert von ReceiveNetworkData() beim "Peeken" zu vernachlässigen!

Verfasst: 07.09.2009 14:27
von sen-me
Achso :D
Ja ich bin noch 4.10 gewohnt ^^

Okay, aber bleibt immernoch mein 2. Problem übrig ^^