http-request: post; login klappt nicht

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
sen-me
Beiträge: 478
Registriert: 17.07.2005 16:02
Wohnort: Saarbrücken
Kontaktdaten:

http-request: post; login klappt nicht

Beitrag 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?
Bild
time2die81
Beiträge: 11
Registriert: 08.02.2009 20:56

Beitrag 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
Benutzeravatar
sen-me
Beiträge: 478
Registriert: 17.07.2005 16:02
Wohnort: Saarbrücken
Kontaktdaten:

Beitrag 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?
Bild
time2die81
Beiträge: 11
Registriert: 08.02.2009 20:56

Beitrag 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]
Benutzeravatar
sen-me
Beiträge: 478
Registriert: 17.07.2005 16:02
Wohnort: Saarbrücken
Kontaktdaten:

Beitrag 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
Bild
time2die81
Beiträge: 11
Registriert: 08.02.2009 20:56

Beitrag 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
Benutzeravatar
sen-me
Beiträge: 478
Registriert: 17.07.2005 16:02
Wohnort: Saarbrücken
Kontaktdaten:

Beitrag 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???
Bild
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Aber davon abgesehen ist es völlig falsch den Rückgabewert von ReceiveNetworkData() beim "Peeken" zu vernachlässigen!
Benutzeravatar
sen-me
Beiträge: 478
Registriert: 17.07.2005 16:02
Wohnort: Saarbrücken
Kontaktdaten:

Beitrag von sen-me »

Achso :D
Ja ich bin noch 4.10 gewohnt ^^

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