IE Login Problem Java

08/09/2013 02:32 emil#1
Hallo,
ich komme nicht mehr weiter und bin bald am verzweifeln. Ich hab nen kleinen Log In Bot gemacht für ein Browsergame [Only registered and activated users can see links. Click Here To Register...].
Mittlerweile trägt er im Script die anmelde Daten richtig ein, nur ich bekomme es nicht hin, das er das ganze auch absendet.
Ich hab es mit _IEFormSubmit($oForm) versucht, nur da resetet er den Log in.
Und mit $oButton=_IEGetObjById($oIE,"") funkioniert auch nicht auch wenn ich am Anfang den Einlog Batten eine ID zuweise da er keine hat. :mad:

Code:
<div id="popup"><form id="login" class="popup" action=""><h3> … </h3><fieldset class="box"><label for="email"> … </label><input id="email" type="text" name="email"></input><label for="password"> … </label><input id="password" type="password" name="password"></input><a class="note" rel="requestPassword" href=""> … </a><a class="note" target="_blank" href="http://agbserver.gameforge.com/deDE-AGB-Battle-of-Crowns.html"> … </a><input type="submit" value="Einloggen"></input></fieldset><div class="subnote"> … </div><span
My Script

Code:
#include <IE.au3>

$oIE = _IECreate("http://battleofcrowns.com/de/index.html?popup=login")
$oForm = _IEFormGetObjByName ($oIE, "login")
$oQuery1 = _IEFormElementGetObjByName ($oForm, "email")
$oQuery2 = _IEFormElementGetObjByName ($oForm, "password")
$uname="[Only registered and activated users can see links. Click Here To Register...]"
$pwd="12345678"
_IEFormElementSetValue ($oQuery1,$uname)
_IEFormElementSetValue ($oQuery2,$pwd)
$oButton=_IEGetObjById($oIE,"")
_IEAction ($oButton, "click")
_IELoadWait($oIE,0)
Wäre Super wenn jemand bitte Helfen könnt. :handsdown:
08/09/2013 22:31 c0w#2
ich kenn das problem zu gut, im autoit.de forum hab ich mal paar lösungswege gesehen, ABER ich rate dir, was auch mir von großartigen autoitcodern geraten wurde, geh weg von der ie.au3 und lern dir direkt winhttp. schneller und einfacher.
08/10/2013 12:23 emil#3
Danke Dir : :confused::confused: Mit Winttp hab ich auch schon versucht, aber da komm ich auch net recht weiter, naja ist nicht für mich, is für mein klein Bruder der das spielt. Wir fahren jetzt 14 Tage in Urlaub und die löschen alle Inaktiven acc. außerdem gibt es für jeden Tag einloggen ne Münze extra. Ich dachte ich schreibe ihm da nen kleines Script was sich am Tag mal einlogt.

So mustte die daten umschreiben soweit klaps erstmal :-)

$POST = {"""&"email"""&":"""&$email&""","""&"password"""&" :"""&$password&"""}"

Mann jetzt hänge ich schon wieder :rtfm:
Er logt sich zwar ein mit WinHTTP aber irgendwie will er nicht auf die nächte Seite nach dem Einloggen.

Live HTTP:

Bot mehr schlecht als recht :confused:

HTML Code:
#include <WinHTTP.au3>
#Include <String.au3>
#include <INet.au3> 
#include <Array.au3>

$email="[Only registered and activated users can see links. Click Here To Register...]"
$password="12345678"


Global $HTTP_Host = "battleofcrowns.com"
Global $HTTP_Agent = _WinHttpOpen("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:22.0) Gecko/20100101 Firefox/22.0")
Global $HTTP_Connect = _WinHttpConnect($HTTP_Agent, $HTTP_Host)
; So vermeiden wir, das für jeden Klick erneut einfügen zu müssen! Allerdings KANN nach z.B. einer Weltauswahl der Host wechseln! (Vorsicht!)


While 1 ; Die "normale" Hauptschleife
; Wir führen nacheinander die Funktionen aus
    _Funktion_0()
    ClipPut(_Funktion_1($email,$password)) ; Das Ergebnis ist ja der HTML-Code, den packen wir uns zum Testen immer in den Zwischenspeicher, fügen ihn in eine Text-Datei ein und schauen ihn uns an (finde ich besser als FileWrite!)
    Exit
WEnd


_WinHttpCloseHandle($HTTP_Connect)
_WinHttpCloseHandle($HTTP_Agent) 


Func _Funktion_1($email,$password) ;  Das wäre also die LogIn-Funktion! Aber Vorsicht! Welchen Referer haben wir jetzt?! Genau... Noch weiss niemand, dass wir da sind! Wir müssen erst auf die Hauptseite und dann auf die LogIn-Seite!
    $POST = "{"""&"email"""&":"""&$email& ""","""&"password"""&":"""&$password&"""}"
MsgBox(0, "POST-Daten", $POST)
	$HTTP_Request = _WinHttpOpenRequest($HTTP_Connect, "POST", "/public/api/login", "HTTP/1.1", $HTTP_Host)
    _WinHttpSendRequest($HTTP_Request, "Content-Type: application/json; charset=UTF-8" & @CRLF, $POST)
    _WinHttpReceiveResponse($HTTP_Request)
	
	$sHeader = _WinHttpQueryHeaders($HTTP_Request) ; ...get full header
MsgBox (0, "Header", $sHeader)
If _WinHttpQueryDataAvailable($HTTP_Request) Then
    Local $data = ""
	Local $HTML = ""
	Do
	   $data&=_WinHttpReadData($HTTP_Request)
	   
    Until @error<>0
    MsgBox (0, "Body", $data)
		
 EndIf
 
 EndFunc 

  
Func _Funktion_0() ; Wir gehen auf die LogIn-Seite
    $HTTP_Request = _WinHttpOpenRequest($HTTP_Connect, "GET", "/de/?popup=login", "HTTP/1.1", $HTTP_Host) ; Der Host sagt ja, wo wir hin wollen, "/" bedeutet einfach "Hauptseite"
    _WinHttpSendRequest($HTTP_Request)
    _WinHttpReceiveResponse($HTTP_Request)
    $HTML = ""
    Do
        $HTML&=_WinHttpReadData($HTTP_Request)
   Until @error
	     _WinHttpCloseHandle($HTTP_Request)
    Return $HTML

 EndFunc   

Func _Funktion_2() ; Wir gehen auf Server-Seite
    $HTTP_Request = _WinHttpSimpleRequest ($HTTP_Connect, "GET", "/de/index.html?page=serverList/")
FileWrite("ServerSeite.html", $HTML)
EndFunc


Func _Perlen()
   $aArray = StringRegExp($sString,'<span id="currentPearls" \d+ ',3) ; Lese dis aus
   _arraydisplay($aArray)
  
  msgbox(0,"Anzahl Einträge:", Ubound($aArray))
  
For $i = 0 to Ubound($aArray) -1 ;durchlaufe die Array, ubound  gibt die Anzahl der Einträge in einer Array wieder
msgbox(0,"Id Nr:l",$aArray[$i]) ; $i ist hier der Array Index
Next
;und hier geht es weiter
   
   
EndFunc
mit WinHTTP hab ich leider nicht so viel am Hut gehabt bis jetzt :facepalm:
vieleicht findet sich ja jemand Nettes der mir weiter Helfen kann, der Bot soll erstmal nichts weiter können aus Einloggen bis zur Spielseite und vielleicht noch was auslesen. Ich hab leider nur noch eine Woche Zeit, da wir dann in Urlaub fahren. Und mein kleiner Bruder wenn er eine Woche nicht einloggt sein ACC. verliert.

mfg
08/11/2013 13:51 c0w#4
Bah das lässt sich über tapatalk alles Ultra blöd lesen, mach aber die rquests mit winhttpsimplerequest vielleicht komm ich nachher mal an nen PC dann bastel ich was
08/12/2013 14:56 alpines#5
Ich würde nicht WinHttp verwenden, weil die Geschwindigkeit davon in den meisten Fällen einfach nur zu wünschen übrig lässt. Wenn es einfache Sachen wie hier sind dann arbeitet lieber mit TCPSend/Recv-Packets.
08/12/2013 23:59 emil#6
So mitlerweile hab ich auch den Token rausgefildert bekommen, kennt sich jemand aus wie ich den jetzt bei jeden $GET & $Post mitsenden kann ?

So das die: Authorization: Bearer e09e98b8-e132-40ac-a780-21925deff20c
Akzeptiert wird ?

ich hab da irgendwo was gelesen von:
_WinHttpSetCredentials($WinHTTP_Request, $WINHTTP_AUTH_TARGET_SERVER, $WINHTTP_AUTH_SCHEME_BASIC, "admin", "admin")
weis nicht ob das geht und wie, vielleicht hat ja jemand Rat :rolleyes:


so schauts bis jetzt aus:

HTML Code:
#include <WinHTTP.au3>

Global $HTML = ""
Global $WinHTTP_Host = "battleofcrowns.com"
Global $WinHTTP_Client = _WinHttpOpen("Opera/9.80 (Windows NT 6.1; WOW64; Edition DriverPack) Presto/2.12.388 Version/12.14") ;Mozilla/5.0 (Windows NT 6.1; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0
Global $WinHTTP_Connect = _WinHttpConnect($WinHTTP_Client, $WinHTTP_Host)
_Login()

Func _Login()
    $HTML = Win_GET_To("battleofcrowns.com", "/de/") ;STARTSEITE
    $HTML = Win_GET_To("battleofcrowns.com", "/de/?popup=login") ;POPUP
    $HTML = Win_POST_To("battleofcrowns.com", "/public/api/login",'{"email":"[Only registered and activated users can see links. Click Here To Register...]","password":"12345678"}' & "&useCookies=1&url=" ) ; LogIn Daten senden & gibt Token aus 
    $tokenabfrage =  StringRegExp($HTML , '"token":"(.+?)"', 3) ; Token wird ausgelesen
    MsgBox(0, "Token-Ausgabe", $tokenabfrage[0]) ; nur zum Testen
	
	
	
    	
	$sHTML = Win_GET_To("battleofcrowns.com", "/public/api/player/8020/premium?_=0000000000000001" & "&useCookies=1&url=") ; Fehler: zahl erhöht sich immer um eins und fehlt bestimmt Token zum weiterverbinden
	MsgBox(0, "POST-Login", $sHTML) ; nur zum Testen
        FileWrite("Login.html", $shtml) ; nur zum Testen
    
EndFunc

Func Win_GET_To($sHost, $sSite)
    If Not ($sHost = $WinHTTP_Host) Then
        $WinHTTP_Host = $sHost
        $WinHTTP_Connect = _WinHttpConnect($WinHTTP_Client, $WinHTTP_Host)
	 EndIf
    $WinHTTP_Request = _WinHttpOpenRequest($WinHTTP_Connect, "GET", $sSite, "HTTP/1.1", $sHost)
    _WinHttpSetCredentials($WinHTTP_Request, $WINHTTP_AUTH_TARGET_SERVER, $WINHTTP_AUTH_SCHEME_BASIC, "admin", "admin") ; ? weis nicht ob das geht
    _WinHttpSendRequest($WinHTTP_Request)
    _WinHttpReceiveResponse($WinHTTP_Request)
   Local $sHT[LEFT]ML = ""
    Do
        $sHTML &= _WinHttpReadData($WinHTTP_Request)
    Until @error
    Return $sHTML
EndFunc   ;==>Win_GET_To1

Func Win_POST_To($sHost, $sSite, $sPost)
    If Not ($sHost = $WinHTTP_Host) Then
        $WinHTTP_Host = $sHost ; Neuen Host bestimmen
        $WinHTTP_Connect = _WinHttpConnect($WinHTTP_Client, $WinHTTP_Host)
    EndIf
    $WinHTTP_Request = _WinHttpOpenRequest($WinHTTP_Connect, "POST", $sSite, "HTTP/1.1", $sHost)
    _WinHttpSetCredentials($WinHTTP_Request, $WINHTTP_AUTH_TARGET_SERVER, $WINHTTP_AUTH_SCHEME_BASIC, "admin", "admin") ; ? weis nicht ob das geht
	_WinHttpSendRequest($WinHTTP_Request, "Content-Type: application/json; charset=UTF-8" & @CRLF, $sPost)
    _WinHttpReceiveResponse($WinHTTP_Request)
	Local $sHTML = "[/LEFT]"
	Do
	   $sHTML &= _WinHttpReadData($WinHTTP_Request)
		
    Until @error
    Return $sHTML
EndFunc   ;==>Win_POST_To
09/12/2013 14:55 emil#7
Kann geschlossen werden habe es mit IE hinbekommen :pimp:

Vielleicht nicht das Beste Script aber es klapt und ich muss mir nichtmal die Mühe machen die Werte auszulesen gegen über Winhttp :D

Hier mein Script, noch nicht fertig aber man kann damit weiter arbeiten:

Code:
#include <IE.au3>
#include <Array.au3>
#include <Inet.au3>
#include <String.au3>


Global $email = "[Only registered and activated users can see links. Click Here To Register...]"
Global $Passwort = "12345678"
Global $Serv = ""

_Login_IE()

Func _Login_IE()
$oIE = _IECreate("http://battleofcrowns.com/de/index.html?popup=login")
WinMove("[CLASS:IEFrame]", "", 0, 0, 1200, 900)
Do
    Sleep(100)
    $oFrame = _IEGetObjById($oIE, "login")
    $width = _IEPropertyGet($oFrame, "width")
Until $width > 0 

$input1 = _IEGetObjById($oIE, "email")
_IEFormElementSetValue($input1, $email)
$input2 = _IEGetObjById($oIE, "password")
_IEFormElementSetValue($input2, $Passwort)
_IELoadWait($oIE, 1500)

For $oInput In $input2.form.getElementsByTagName("input")
    If $oInput.type = "submit" Then _IEAction($oInput, "click")
	Next
    Do
        Sleep(100)
    Until $oIE.document.body.innerHTML & '<a id="belize3.de.battleofcrowns.com" class="playButton" href=''></a>'
$oIE.document.getElementById("belize3.de.battleofcrowns.com").click
        Sleep(10000)
Local $oIE = _IEAttach('Battle of Crowns (BETA)', "embedded")
    MsgBox(0, "Spielseite:", _IEPropertyGet($oIE, "locationurl"))
$HTML = _IEDocReadHTML($oIE)
        Sleep(100)
FileDelete(@ScriptDir & '\Quelltext-IE.html')
FileWrite(@ScriptDir & '\Quelltext-IE.html', $HTML)
EndFunc