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 :
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
Func verifygame($software, $ver, $serial, $mail)
Return authkey(getauth($software, $ver, $serial, $mail)
EndFunc
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
#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?