1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Mentis

Beiträge von Mentis

  • parse von json ausgabe für online software-authentifizierung

    • Mentis
    • 19. Juni 2016 um 22:30

    Unglaublich aber wahr, das wars!

    [Blockierte Grafik: http://puu.sh/pyCU6/56168cb315.jpg]


    [Blockierte Grafik: http://puu.sh/pyCqz/e557f3952d.png]

    An meinen Debugging(un)künsten muss ich noch viel arbeiten.
    Wenn du wüsstest wie lange ich mir über diese "Kleinigkeit" den Kopf zerbrochen habe.

    Das du dir Gedanken über meine, offensichtlich für die meisten hier Lachhaften, Probleme gemacht hast rechne ich dir wirklich sehr sehr hoch an und bin mehr als nur endlos dankbar.
    Ich hoffe ich bekomme irgendwann mal die Chance mich zu revangieren!

  • parse von json ausgabe für online software-authentifizierung

    • Mentis
    • 19. Juni 2016 um 19:51

    Hey zusammen, wollte es zwar diesmal mit meinem neu gewonnenem wissen komplett eigenständig zusammen bringen .. nur irgendwie bin ich zu doof.

    Bin nun sogut wie fertig, nur leider auf ein Problem gestoßen von dem ich mir nicht gedacht hätte, dass es eines sein wird :(.
    Ich habe noch einen verschachtelten json string den ich verarbeiten muss :

    Code
    {"status_check":"active","status_extra":{"order_key":"wc_order_5763259bf2f37_am_nKIYjWHixLj8","instance":"axdlj3klhgjj4","product_id":"fish","activation_time":"2016-06-19 13:13:41","activation_active":1,"activation_domain":"","software_version":"","status_check":"active"},"activations_remaining":"999999999 out of 999999999 activations remaining"}

    Insgesamt 19 Werte(?)


    relevant wären die Werte active und 1
    von
    status_check=active / activation_active=1


    Insofern bin ich davon ausgegangen, dass :

    AutoIt
    Func getloginkey()
    	Local $out
    	HttpSetUserAgent($soft)
    	$xdata = InetRead($activurl & "&email=" & $mail & "&licence_key=" & $login & "&request=status" & "&product_id=" & $soft , 1)
    	$nbytesread = @extended
    	Local $sData = BinaryToString($xdata)
    	Local $aData = StringRegExp($sData, '"(\w+)":([^,\{\}]+),?', 3)
    	If IsArray($hData) or UBound($hData) <> 19 Then
    	  Return $hdata
    	ElseIf IsArray($hData) or UBound($hData) <> 4 Then
    		Return False
       EndIf
    Alles anzeigen


    funktionieren sollte und meine gewünschten werte in $aData[1] (active) und $aData[13] (1) zu finden sind. Ultimativ werde ich einen der beiden Werte überprüfen.

    Meine Funktion

    AutoIt
    Func verifylogin($loginkey)
    	Local $match
    	$match = 'active'
    	$daymessage = "Login Erfolgreich"
    	If $match == $loginkey[1] Then
    		$daymessage = "Login Erfolgreich"
    		Return 1
    	ElseIf $loginkey[1] == 1 Then
    		$daymessage = "Login Erfolgreich"
    	Else
    		$daymessage = "Login Failed"
    	EndIf
    	Return 0
    EndFunc
    Alles anzeigen

    gibt mir jedoch immer ein "Login Failed" aus.
    Meine letzte Idee wäre es ein StringLeft($sData, 24) einzubauen (mit ubound auf 2) um nur die ersten 2 Werte auszulesen, aber auch das hat mir ein Login failed ausgegeben :/ ..

  • parse von json ausgabe für online software-authentifizierung

    • Mentis
    • 18. Juni 2016 um 14:21

    Ja, man bekommt immer entweder 8(bei fail) oder 12(bei success) ausgegeben, inhalt natürlich immer gleich arrangiert.

    /e der return wird dem User in einer Messagebox ausgegeben, aus dem grund habe ich einen String gewählt.

  • parse von json ausgabe für online software-authentifizierung

    • Mentis
    • 18. Juni 2016 um 01:40

    Dank Christoph und ganz besonders Zeitriss konnte ich sehr große Schritte richtung fertigstellung des Projekts machen.

    AutoIt
    Func getauth($software, $ver, $serial, $mail)
    	HttpSetUserAgent($botname)
    	$xdata = InetRead($activurl & "&email=" & $mail & "&licence_key=" & $login & "&request=activation" & "&product_id=" & $soft , 1)
    	$nbytesread = @extended
    	Local $sData = BinaryToString($xdata)
    	Local $aData = StringRegExp($sData, '"(\w+)":([^,\{\}]+),?', 3)
    If Not IsArray($aData) or UBound($aData) <> 10 Then
    	  Return SetError(1,0,-1)
       EndIf
    	Return $aData[1]
    EndFunc
    Alles anzeigen


    Der erste Part funktioniert nun. $aData[1] kann erfolgreich gelesen und weiterverarbeitet werden :).

    Eine letztes Problem habe ich noch :


    Wie implementiere ich am besten eine ausgabe der Werte von getauth() an authkey()?
    authkey() soll

    a) den Wert von $aData[1] mit $match vergleichen
    b) den Wert von $aData[3] als $daymessage ausgeben

    Da eine function nur einen Wert haben kann müsste man meine benötigten werte als array oder byref ausgeben, richtig? Was ich habe und irgendwie nicht funktioniert :( :

    AutoIt
    Func getauth($soft, $ver, $serial, $mail)
    	HttpSetUserAgent($botname)
    	$xdata = InetRead($activurl & "&email=" & $mail & "&licence_key=" & $login & "&request=activation" & "&product_id=" & $soft , 1)
    	$nbytesread = @extended
    	Local $sData = BinaryToString($xdata)
    	Local $aData = StringRegExp($sData, '"(\w+)":([^,\{\}]+),?', 3)
    	If Not IsArray($aData) or UBound($aData) <> 12 Then
    	  Return SetError(1,0,-1)
       EndIf
    	Return $aData
    EndFunc
    Alles anzeigen
    AutoIt
    Func authkey($auth)
    	Local $match
    	$match = true
    	$daymessage = $auth[2]
    	If $match == $auth[1] Then
    		$daymessage = $auth[2]
    		Return 1
    	ElseIf $auth[1] == 1 Then
    		$daymessage = $auth[2]
    	Else
    		$daymessage = "Error 1020: An error occurred while connecting to server"
    	EndIf
    	Return 0
    EndFunc
    Alles anzeigen


    Json :
    {"activated":true,"msg":"Aktivierung Erfolgreich","instance":"E7A54398B8391F9FE19D370","activation_extra":816,"message":"999999999 out of 999999999 activations remaining","timestamp":1466205273}


    /edit so, guten morgen allerseits, ausgeschlafen arbeitet es sich doch immer gleich besser! Drübergedited


    /edit 14:00 .. entweder man ist erfahren und effizient oder alternativ unnachgiebig :p .. 6 stunden Tüftelei später und es läuft :)


    AutoIt
    Func activator($authkey)
        Local $mach
        $match = 'true'
        $daymessage = $authkey[3]
        If $match == $authkey[1] Then
            $daymessage = $authkey[3]
            Return 1
        ElseIf $authkey[1] == 1 Then
            $daymessage = $authkey[3]
        Else
            $daymessage = "Error 1020: Cannot connect to the Authserver"
        EndIf
        Return 0
    EndFunc
    Alles anzeigen
    AutoIt
    Func getauthkey()
    	Local $out
       ; Sollte dem Return von InetGet ensprechen (also der JSON im Binärformat)
    	HttpSetUserAgent($botname)
    	Local $ydata = StringToBinary('{"activated":trsue,"instance":"E7A54398B8391F0","activation_extra":816,"message":"999999999 out of 999999999 activations remaining","timestamp":1466122833}')
    	$xdata = InetRead($activurl & "&email=" & $umail & "&licence_key=" & $ulogin & "&request=activation" & "&product_id=" & $botname & "&instance=" & $clientkey, 1)
    	$nbytesread = @extended
    	Local $sData = BinaryToString($xdata)
    	Local $aData = StringRegExp($sData, '"(\w+)":([^,\{\}]+),?', 3)
       If Not IsArray($aData) or UBound($aData) <> 12 Then
    	  Return SetError(1,0,-1)
       EndIf
    
    
    	Return $aData
    EndFunc
    Alles anzeigen


    Letzte hürde : Ich bekomme als ausgabe von $data entweder ein array mit 12 werten (aktivierung success) oder ein array mit 8 werten (aktivierung fail) zurück.
    Kommt ein array mit 12 werten -> alles läuft wie erwartet.
    Kommt ein array mit 8 werten -> Scripterror mit crash - "Subscript used on non-accesible variable."


    Insofern in getauthkey folgendes eingebaut :

    If IsArray($aData) or UBound($aData) <> 12 Then
    Return $aData
    ElseIf IsArray($aData) or UBound($aData) <> 8 Then
    Return "Already activated"
    EndIf

    funktioniert. Ist die Lösung eurer wesentlich besseren Meinung nach in Ordnung?

  • parse von json ausgabe für online software-authentifizierung

    • Mentis
    • 17. Juni 2016 um 21:25

    Werde mal direkt versuchen das ganze anhand deines Beispiels umzusetzen.
    Wenn es gelingt wäre es exakt was ich versuche fürs erste zu erreichen.


    vielen dank, weiß ich extrem zu schätzen! Hänge an diesem Problem schon einige Zeit ..

  • parse von json ausgabe für online software-authentifizierung

    • Mentis
    • 17. Juni 2016 um 20:12

    Ach das ist natürlich richtig.. hatte einen bösen denkfehler drin...sehr bitter(und peinlich)
    Mir ist bewusst, dass es sicher keine schöne Lösung ist, aber denkst du sollte

    $datafinal = $aMatch[1]
    $out = BinaryToString($datafinal)

    theorethisch funktionieren?

  • parse von json ausgabe für online software-authentifizierung

    • Mentis
    • 17. Juni 2016 um 19:30

    Danke fürs gute formulieren meiner Frage ^^ -
    Wie füge ich das von Christopf54 erstellte RegEx-Pattern in meinen Code ein?

    Welche Funktion das Ganze hat : Wenn der Wert "True" in der Json-Ausgabe des Servers erkannt wird triggert sich die aktivierung meiner software.


    $out enthält nichts und wird erst durch "$out = _ArrayToString($aMatch, @TAB, 0, 0)" definiert .. falls mich jetzt nicht alles täuscht


    /edit auf dein edit :

    Exakt :
    $sdata ist der Json.
    $aMatch das ergebniss des RegEx

    Habe ich mich hier verdacht? :

    $datafinal = $aMatch[0]

    AutoIt
    Func getauth($software, $ver, $serial, $mail, $datafinal)
    Local $out
    
    
    	HttpSetUserAgent($botname)
    	$sdata = InetRead($auth & "&software=" & $sname & "&ver=" & $sver & "&serial=" & $login & "&mail=" & $lmail, 1)
    	$nbytesread = @extended
    	$out = BinaryToString($datafinal)
    	$t = StringInStr($out, ",")
    If $t => 0 Then
    		$arout = StringSplit($out, ",")
    	Else
    		Local $arout[3] = [2, $out, _stringtohex("Error 9099")]
    	EndIf
    	Return $arout
    EndFunc
    Alles anzeigen
  • parse von json ausgabe für online software-authentifizierung

    • Mentis
    • 17. Juni 2016 um 17:03

    Vielen Dank, genau dieses stripping ist mir nicht gelungen!

    Sieht eigentlich wirklich gut aus, eine (noob)Frage hätte ich noch :
    Wie passe ich denn eine variable aus dem array (in dem fall 0 für die authentifizierung, 5 für den timestamp) in eine function?


    Ich strebe eine, etwa so wie im "pseudocode" dargestellte implementierung an.
    Bin ich da komplett auf dem Holzweg?

    AutoIt
    Func getauth($software, $ver, $serial, $mail)
    Local $out
    	HttpSetUserAgent($botname)
    	$sdata = InetRead($auth & "&software=" & $sname & "&ver=" & $sver & "&serial=" & $login & "&mail=" & $lmail, 1)
    	$nbytesread = @extended
    	$out = _ArrayToString($aMatch, @TAB, 0, 0)
    	$t = StringInStr($out, ",")
    If $t => 0 Then
    		$arout = StringSplit($out, ",")
    	Else
    		Local $arout[3] = [2, $out, _stringtohex("Error 9099")]
    	EndIf
    	Return $arout
    EndFunc
    Alles anzeigen


    /edit :

    Bin ein paar Schritte weiter gekommen :
    Sollte das so klappen? Irgendwie haperts bei mir noch


    AutoIt
    #include <Array.au3>
    
    
    
    
    
    
    Local $aMatch[20]
    
    
    
    
    
    
    ; Testarray bestücken.
    
    
    For $i = 0 To UBound($aMatch) - 1
    
    
    $aMatch[$i] = Random(-20000, 20000, 1)
    
    
    Next
    
    
    
    
    
    
    _ArrayDisplay($aMatch, "$aMatch")
    Alles anzeigen


    LG Mentis

  • parse von json ausgabe für online software-authentifizierung

    • Mentis
    • 17. Juni 2016 um 14:17

    Hallo zusammen,

    ich bin gerade dabei eine verifizierung/authentifikation per https in meine Software zu implementieren.
    Als normaler get-request mit binary ausgabe funktioniert dies auch ganz gut, meine verifizierung sieht (im augenblick noch vereinfacht) gekürzt so aus :

    AutoIt
    Func getauth($software, $ver, $serial, $mail)
    Local $out
    	HttpSetUserAgent($botname)
    	$sdata = InetRead($auth & "&software=" & $sname & "&ver=" & $sver & "&serial=" & $login & "&mail=" & $lmail, 1)
    	$nbytesread = @extended
    	$out = BinaryToString($sdata)
    	$t = StringInStr($out, ",")
    If $t => 0 Then
    		$arout = StringSplit($out, ",")
    	Else
    		Local $arout[3] = [2, $out, _stringtohex("Error 9099")]
    	EndIf
    	Return $arout
    EndFunc
    Alles anzeigen


    AutoIt
    Func verifygame($software, $ver, $serial, $mail)
    	Return authkey(getauth($software, $ver, $serial, $mail)
    EndFunc
    AutoIt
    Func authkey($shieldkey)
    	Local $match
    	$match = $serial
    	$daymessage = _hextostring($shieldkey[2])
    	If $match == $shieldkey[1] Then
    		$daymessage = _hextostring($shieldkey[2])
    		Return 1
    	ElseIf $shieldkey[1] == 1 Then
    		$daymessage = _hextostring($shieldkey[2])
    	Else
    		$daymessage = "Error 1020: An error occurred while connecting to server"
    	EndIf
    	Return 0
    EndFunc
    Alles anzeigen


    Ich sende GET-request zum authserver, authserver antwortet mit $serial,hexedmessageoftheday
    Funktioniert perfekt.

    Da ich in meiner produktiven umgebung jedoch auf meinen get-request eine schön geordnete antwort im json Format bekomme :
    [Blockierte Grafik: http://puu.sh/pvVul/a03fa232a0.png]

    {"activated":true,"instance":"E7A54398B8391F996....","activation_extra":816,"message":"999999999 out of 999999999 activations remaining","timestamp":1466122833}


    zerbreche ich mir den Kopf über eine implementierung.
    Mein höchste priorität : func authkey so anpassen, dass die verifizierung der Software über json klappt.
    Sobald ich dies geschafft habe steht folgendes auf meiner to-do : func timestamp realisieren (im augenblick noch nicht kritisch).

    Lösungsansätze :


    a) Den Input mit regex strippen bis nurnoch mein gewünschter Input übrig bleibt. Ist mir leider nicht gelungen :(


    b) einsetzen eines json parsers
    Dies habe ich probiert anhand von a non strict json udf

    Download hier

    AutoIt: kläglicher versuch
    #Include "json.au3"
    Local $json = '{"activated":true,"instance":"E7A54398B8391F0","activation_extra":816,"message":"999999999 out of 999999999 activations remaining","timestamp":1466122833}"}'
    Local $jason = json_decode($json)
    json_Get_ShowResult($jason, '["true"]')
    	Func json_Get_ShowResult($Var, $Key)
        Local $Ret = json_Get($Var, $Key)
        If @Error Then
            Switch @error
                Case 1
                    ConsoleWrite("Error 1: key not exists" & @LF)
                Case 2
                    ConsoleWrite("Error 2: syntax error" & @LF)
            EndSwitch
    	    Else
            ConsoleWrite($Key & " => " & VarGetType($Ret) & ": " & $Ret & @LF)
        EndIf
    EndFunc
    	Func json_Get($Var, $Key)
        If Not $Key Then Return $Var
    	    Local $Match = StringRegExp($Key, "(^\[([^\]]+)\])", 3)
        If IsArray($Match) Then
            Local $Index = json_Decode($Match[1])
            $Key = StringTrimLeft($Key, StringLen($Match[0]))
    	        If IsString($Index) And json_IsObject($Var) And json_ObjExists($Var, $Index) Then
                Local $Ret = json1_Get(json_ObjGet($Var, $Index), $Key)
                Return SetError(@Error, 0, $Ret)
    	        ElseIf IsNumber($Index) And IsArray($Var) And $Index >= 0 And $Index < UBound($Var) Then
                Local $Ret = json1_Get($Var[$Index], $Key)
                Return SetError(@Error, 0, $Ret)
    	        Else
                Return SetError(1, 0, "")
    	        EndIf
        EndIf
    	    Return SetError(2, 0, "")
    EndFunc
    Alles anzeigen


    Hatte die Funktion aus meinem Script auf der Suche nach anderen Möglichkeiten entfernt und jetzt beim nachstellen meines Versuchs einen syntaxfehler in den json string eingebaut den ich gerade nicht sehe .. hat aber ohnedies nicht funktioniert.
    Mir ist aber leider auch zuvor kein vernünftiger output mit dem json parser gelungen


    Hat vielleicht jemand eine Idee wie ich mein Ziel realisiere?

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™