2014-01-18 16 views
0

我試圖從Flash程序中檢索每次載入它時發送的JSON。從IE中的Flash程序中檢索JSON嵌入到Autoit中

使用Charles我能夠獲得JSON數據 - application/json; charset = utf8 POST方法 - 但是我希望Autoit捕獲JSON數據並將其粘貼到桌面上的文本文件中。

基本上,每當我按下Flash程序上的一個按鈕,我想Autoit解析JSON數據。

+0

嘿,歡迎來到StackOverflow。你真正的技術問題在哪裏?你試過什麼了?你在哪裏掙扎?你可以在這裏得到具體的幫助,但不要期待一個願望箱...... ;-) – Samoth

回答

1

另一種方式是製作proxy in pure Autoit

#Region ;**** Directives created by AutoIt3Wrapper_GUI **** 
#AutoIt3Wrapper_outfile=proxy.exe 
#AutoIt3Wrapper_Compression=4 
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** 
TCPStartup() 
#include <GUIConstantsEx.au3> 
#include <EditConstants.au3> 
#include <GUIEdit.au3> 
#Include <Array.au3> 
#Include <File.au3> 
#include <WindowsConstants.au3> 

Opt("GUIOnEventMode" , 1) 
Opt("TrayAutoPause",0) 
Opt("TrayMenuMode",3) 
Opt("TrayOnEventMode",1) 

Global $ini = @ScriptDir & "\config.ini" 
Global $mainarray[30][10] 
Global $proxysocket , $proxysocketssl 
Global $GUISHOW = 1 

$mainarray[0][0] = "Hostport" 
$mainarray[0][1] = "Clientsocket" 
$mainarray[0][2] = "Hostsocket" 
$mainarray[0][3] = "Request" 
$mainarray[0][4] = "Hostname" 
$mainarray[0][5] = "Timerhandle connection" 
$mainarray[0][6] = "Blocked" 
$mainarray[0][7] = "State" 
$mainarray[0][8] = "connection type" 
$mainarray[0][9] = "req count" 



Global $gui = GUICreate("ProxyServer v0.2",700,700) 
$DEBUG=GUICtrlCreateEdit("" , 5 , 30 , 500 ,670,BitOr($GUI_SS_DEFAULT_EDIT,$ES_READONLY)) 
GUICtrlSetLimit(-1 , 2000000000000000) 
Global $button_debug_clear = GUICtrlCreateButton("Clear",5,5,90,20) 
GUICtrlSetOnEvent($button_debug_clear,"_debug_clear") 
GUICtrlCreateLabel("Listening IP:",515,40,70,20) 
GUICtrlCreateLabel("Port HTTP:",515,60,70,20) 
GUICtrlCreateLabel("Port HTTPS:",515,80,70,20) 
Global $input_proxyip = GUICtrlCreateInput("",590, 40,100,20) 
Global $input_proxyport = GUICtrlCreateInput("",590,60,60,20) 
Global $input_proxyportssl = GUICtrlCreateInput("",590,80,60,20) 
Global $button_proxy_save = GUICtrlCreateButton("Save and Restart",515,140,180,20) 
GUICtrlSetOnEvent($button_proxy_save,"_mainsocket_save") 

Global $checkbox_debug = GUICtrlCreateCheckbox("Debugmode", 515 , 240, 120, 20) 
Global $checkbox_debug_save = GUICtrlCreateCheckbox("Save Debug to file", 515 , 260, 120, 20) 
Global $checkbox_debug_content = GUICtrlCreateCheckbox("Show traffic content", 515 , 280, 120, 20) 
Global $button_debug_content = GUICtrlCreateButton("Binary to String",515,320,120,19) 
GUICtrlSetOnEvent($button_debug_content,"_debug_binary") 
Global $button_debug_array = GUICtrlCreateButton("show mainarray",515,340,120,19) 
GUICtrlSetOnEvent(-1,"_show_array") 


Global $tray_showgui = TrayCreateItem("Show gui") 
TrayItemSetOnEvent($tray_showgui,"_gui_show") 

GUISetOnEvent($GUI_EVENT_CLOSE,"_quit") 
GUISetState(@SW_SHOW,$gui) 

_mainsocket_create() 

While 1 
    $newclientsock = TCPAccept($proxysocket) 
    If $newclientsock <> -1 Then 
     _save("] new HTTP clientconnection :" &_SocketToIP($newclientsock) &@CRLF) 
     _clientconnection_to_mainarray($newclientsock,80,"HTTP") 
    EndIf 
    $newclientsockssl = TCPAccept($proxysocketssl) 
    If $newclientsockssl <> -1 Then 
     _save("] new HTTPS clientconnection :" &_SocketToIP($newclientsockssl) &@CRLF) 
     _clientconnection_to_mainarray($newclientsockssl,443,"HTTPS","start") 
    EndIf 
    ;--Recieving Req from Client 
    For $i = 1 To UBound($mainarray) -1 
     If $mainarray[$i][1] <> "" Then 
      $request = TCPRecv($mainarray[$i][1],100000) 
      If @error Then 

       _save("] Client " & $i & " closed connection after " & Floor(TimerDiff($mainarray[$i][5])) & " ms" & @CRLF) 
       _mainarray_deleteclient($i) 
      EndIf 

      If $request <> "" Then 
       _save("] Client " & $i & " requested" & @CRLF & @CRLF & $request & @CRLF) 
       $mainarray[$i][9] += 1 
       $mainarray[$i][3] = $request 
       If GUICtrlRead($checkbox_debug_content) = 1 Then _save($request & @CRLF) 
      EndIf 
     EndIf 
    Next 

    ;--connecting and sending Req to Host 
    For $i = 1 To UBound($mainarray) -1 
     If $mainarray[$i][3] <> "" Then 
      If $mainarray[$i][2] = "" Then 
       $forward = _Get_Address($mainarray[$i][3]) 
       _save("]" & $i &" Got Host Address : " & $forward & @CRLF)   
       $mainarray[$i][6] = 0 
       $mainarray[$i][4] = $forward 
       If $forward = "0" Then 
        _Send_Response($mainarray[$i][1],400) 
        _save("]" & $i &" Host is 0 , Error 400" & @CRLF) 
       Else 
         $serverip = TCPNameToIP($forward) 
         $serversock = TCPConnect($serverip,$mainarray[$i][0]) 
         If $serversock <> -1 Then 
          _save("]" & $i &" Connected to Host: " & $forward & @CRLF) 
          $mainarray[$i][2] = $serversock 

         Else 
          _save("]" & $i &" Not Connected to Host: " & $forward & @CRLF) 
          _Send_Response($mainarray[$i][1],400) 
          _mainarray_deleteclient($i) 
         EndIf 
       EndIf 
      Else 
       $forward = _Get_Address($mainarray[$i][3]) 
       If $forward <> $mainarray[$i][4] Then 
        _save("]" & $i &" Host Address changed from: " & $mainarray[$i][4] & " to: " & $forward & @CRLF) 
        $mainarray[$i][4] = $forward 
        TCPCloseSocket($mainarray[$i][2]) 
        $mainarray[$i][2] = "" 
       EndIf 
      EndIf 
      If $mainarray[$i][2] <> "" Then 
       $prevlen = StringLen($mainarray[$i][3]) 
       $mainarray[$i][3] = _request_modify($mainarray[$i][3],$mainarray[$i][4]) 
       If $mainarray[$i][7] = "" Then 
        ;$mainarray[$i][3] = _request_modify($mainarray[$i][3],$mainarray[$i][4]) 
        TCPSend($mainarray[$i][2] , $mainarray[$i][3]) 
         If Not @error Then 
          _save("]" & $i &" Sending HTTP to Host " & $mainarray[$i][4] & " successfull prevlen:" & $prevlen & " now:" & StringLen($mainarray[$i][3]) & @CRLF) 
          $mainarray[$i][3] = "" 
         Else 
          _save("]" & $i &" Error Sending HTTP to Host " & @CRLF) 
         EndIf 
       EndIf 
      EndIf 
     EndIf 
    Next 
    ;--Waiting for Response from Host and Sending to client 
    For $i = 1 To UBound($mainarray) -1 
     If $mainarray[$i][2] <> "" Then 
      $serverresponse  = TCPRecv($mainarray[$i][2],400000,1) 
      If @error Then 
       _mainarray_hostkillclient($i) 
      EndIf 
      If $serverresponse <> Binary("") Then 
       If $mainarray[$i][6] = 0 Then 
        _save("]" & $i &" Got Host response" & @CRLF) 
        If $mainarray[$i][1] <> "" And $mainarray[$i][7] = "" Then 
         TCPSend($mainarray[$i][1],$serverresponse) 
         If Not @error Then 
          _save("]" & $i &" Sent data to Client " & @CRLF) 

          If GUICtrlRead($checkbox_debug_content) = 1 Then _save(BinaryToString($serverresponse) & @CRLF) 
         EndIf  
        EndIf 
       ElseIf $mainarray[$i][6] = 1 Then 
        TCPSend($mainarray[$i][1],"HTTP/1.1 " & "403") 
        _mainarray_hostkillclient($i) 
       EndIf 
      EndIf 
     EndIf 
    Next  
    ;---only for HTTPS 
    For $i = 1 To UBound($mainarray) -1 
     If $mainarray[$i][1] <> "" And $mainarray[$i][3] <> "" And $mainarray[$i][8] = "HTTPS" And $mainarray[$i][7] = "start" Then 
      _Send_Response($mainarray[$i][1],200) ;,$data="") 
      $mainarray[$i][3] = "" 
      $mainarray[$i][7] = "" 
     EndIf 
    Next 

WEnd  

Func _show_array() 
    _ArrayDisplay($mainarray) 
EndFunc 

Func _mainsocket_save() 
    IniWrite($ini,"SYSTEM","PROXYPORT",GUICtrlRead($input_proxyport)) 
    IniWrite($ini,"SYSTEM","PROXYIP",GUICtrlRead($input_proxyip)) 
    IniWrite($ini,"SYSTEM","PROXYPORTSSL",GUICtrlRead($input_proxyportssl)) 
    _mainsocket_create() 
EndFunc 

Func _mainsocket_create() 
    TCPShutdown() 
    TCPStartup() 
    $IP = IniRead($ini,"SYSTEM","PROXYIP","127.0.0.1") 
    $PORT = IniRead($ini,"SYSTEM","PROXYPORT","8080") 
    $PORTSSL = IniRead($ini,"SYSTEM","PROXYPORTSSL","8043") 
    GUICtrlSetData($input_proxyip, $IP) 
    GUICtrlSetData($input_proxyport,$PORT) 
    GUICtrlSetData($input_proxyportssl,$PORTSSL) 
    $proxysocket  = TCPListen($IP,$PORT) 
    If @error Then 
     _GUICtrlEdit_AppendText($DEBUG , "] Error HTTP Proxy couldn't bind socket on IP :" & $IP & " Port :" & $PORT & @CRLF) 
    Else 
     _GUICtrlEdit_AppendText($DEBUG , "] HTTP Proxy listening on IP :" & $IP & " Port :" & $PORT & @CRLF) 
    EndIf 
    $proxysocketssl  = TCPListen($IP,$PORTSSL) 
    If @error Then 
     _GUICtrlEdit_AppendText($DEBUG , "] Error HTTPS Proxy couldn't bind socket on IP :" & $IP & " Port :" & $PORTSSL & @CRLF) 
    Else 
     _GUICtrlEdit_AppendText($DEBUG , "] HTTPS Proxy listening on IP :" & $IP & " Port :" & $PORTSSL & @CRLF) 
    EndIf  
EndFunc 


Func _Get_Address($text) 
    If IsBinary($text) Then 
     $text = BinaryToString($text) 
    EndIf 
     $serversock=StringSplit($text , @CRLF,1) 
     For $i=1 To $serversock[0] 
      If StringLeft($serversock[$i],6)="Host: " Then 
       Return StringTrimLeft($serversock[$i],6) 
      EndIf 
     Next 
    Return 0   
EndFunc 

Func _clientconnection_to_mainarray($sock,$port = 80,$type = "HTTP",$state = "") 
    For $i = 1 To UBound($mainarray) -1 
     If $mainarray[$i][1] = "" And $mainarray[$i][2] = "" Then 
      $mainarray[$i][1] = $sock 
      $mainarray[$i][0] = $port 
      $mainarray[$i][5] = TimerInit() 
      $mainarray[$i][7] = $state 
      $mainarray[$i][8] = $type 
      _save("] Added new client to mainarray , pos: " & $i & @CRLF) 
      If $i + 5 > UBound($mainarray) Then ReDim $mainarray[UBound($mainarray)+5][10] 
      Return 
     EndIf 
    Next 
EndFunc 

Func _mainarray_deleteclient($line) 
    TCPCloseSocket($mainarray[$line][1]) 
    $mainarray[$line][0] = "" 
    $mainarray[$line][1] = "" 
    $mainarray[$line][3] = "" 
    $mainarray[$line][4] = "" 
    $mainarray[$line][5] = "" 
    $mainarray[$line][6] = "" 
    $mainarray[$line][7] = "" 
    $mainarray[$line][8] = "" 
    $mainarray[$line][9] = "" 
    If $mainarray[$line][2]<> "" Then 
     TCPCloseSocket($mainarray[$line][2]) 
     $mainarray[$line][2] = "" 
    EndIf 
EndFunc 

Func _mainarray_hostkillclient($line) 
    _save("]" & $line &" Connection Closed by Host after " & Floor(TimerDiff($mainarray[$line][5])) & " ms" & @CRLF) 
    $mainarray[$line][2] = "" 
    $mainarray[$line][4] = "" 
    $mainarray[$line][5] = "" 
    If $mainarray[$line][1]<> "" Then 
     TCPCloseSocket($mainarray[$line][1]) 
     _mainarray_deleteclient($line) 
    EndIf 
EndFunc 

Func _Send_Response($browsersock,$code,$data="") 
    If $data="" Then 
     [email protected] & @CRLF 
    Else 
     [email protected] & $data & @CRLF & @CRLF 
    EndIf 
    TCPSend($browsersock , "HTTP/1.0 " & $code & " Message" & $data) 
EndFunc 


Func _quit() 
    TCPShutdown() 
    Exit 
EndFunc 

Func _gui_show() 
    If $GUISHOW = 0 Then 
     Local $pw = InputBox("Enter Password","Enter Password","","*",150,130) 
     If Not @error Then 
      If $pw = "1234" Then 
       GUISetState(@SW_SHOW) 
       $GUISHOW = 1 
       Return 
      EndIf 
     EndIf 
    ElseIf $GUISHOW = 1 Then 
     GUISetState(@SW_HIDE) 
     $GUISHOW = 0 
     Return  
    EndIf 
EndFunc 

Func _save($text) 
    If GUICtrlRead($checkbox_debug_save) = 1 Then 
     $file = FileOpen(@ScriptDir & "\log\" & @Year & @MON & @MDAY & "-log.txt",9) 
     FileWrite ($file,$text) 
     FileClose($file) 
    Endif 
    If GUICtrlRead($checkbox_debug) = 1 Then _GUICtrlEdit_AppendText($DEBUG , $text) 
Endfunc 

Func _SocketToIP($SHOCKET) 
    Local $sockaddr, $aRet 
    $sockaddr = DllStructCreate("short;ushort;uint;char[8]") 
    $aRet = DllCall("Ws2_32.dll", "int", "getpeername", "int", $SHOCKET, _ 
      "ptr", DllStructGetPtr($sockaddr), "int*", DllStructGetSize($sockaddr)) 
    If Not @error And $aRet[0] = 0 Then 
     $aRet = DllCall("Ws2_32.dll", "str", "inet_ntoa", "int", DllStructGetData($sockaddr, 3)) 
     If Not @error Then $aRet = $aRet[0] 
    Else 
     $aRet = 0 
    EndIf 
    $sockaddr = 0 
    Return $aRet 
EndFunc ;==>SocketToIP 

Func _debug_binary() 
    Local $aSel = _GUICtrlEdit_GetSel($DEBUG) 
    Local $text = StringMid(GUICtrlRead($DEBUG),$aSel[0]+1,$aSel[1]-$aSel[0]) 
    If $text <> "" Then 

    Else  
     $text = InputBox("Binary to String","Enter Binary Data") 

    EndIf 
    If StringLower(StringLeft($text,2)) <> "0x" Then $text = "0x" & $text 
    $tempfile = FileOpen(@ScriptDir & "\temp.txt",2) 
    FileWrite($tempfile,BinaryToString($text)) 
    FileClose($tempfile) 
    ShellExecute(@ScriptDir & "\temp.txt") 
EndFunc 

Func _debug_clear() 
    GUICtrlSetData($DEBUG,"") 
EndFunc 

Func _request_modify($req,$host) 
Local $encoding = "Accept-Encoding: identity" ;deflate, gzip, compress, 
Local $reqsplit 
Local $modified_method = 0 , $modified_connection = 0 , $modified_encoding = 0 
    If $req <> "" And Not IsBinary($req) Then 
     $reqsplit = StringSplit($req,@CRLF,1)  
     If IsArray($reqsplit) Then 
      For $i = 1 to $reqsplit[0] - 1 
       _save("] modifying :" & $i & " " & $reqsplit[$i]) 
       If StringLeft($reqsplit[$i],3) = "GET" Or StringLeft($reqsplit[$i],4) = "POST" Or StringLeft($reqsplit[$i],7) = "CONNECT" And $modified_method = 0 Then 
         $reqsplit[$i] = StringReplace($reqsplit[$i],$host,"") 
         $reqsplit[$i] = StringReplace($reqsplit[$i],"http://","") 
         $reqsplit[$i] = StringReplace($reqsplit[$i],":443","") 
         $modified_method = 1 
       EndIf 
       If StringInStr(Stringlower($reqsplit[$i]),"proxy-connection: keep-alive") And $modified_connection = 0 Then 
        $reqsplit[$i] = "Connection: keep-alive" 
        $modified_connection = 1 
       EndIf 
       If StringInStr(Stringlower($reqsplit[$i]),"accept-encoding") And $modified_encoding = 0 Then 
        $reqsplit[$i] = $encoding 
        $modified_encoding = 1 
       EndIf 
       _save(" -> to :" & $reqsplit[$i] & @CRLF) 
      Next  
      $req = _ArrayToString($reqsplit, @CRLF , 1 , Ubound($reqsplit)-1) 
     EndIf 
     If GUICtrlRead($checkbox_debug_content) = 1 Then 
      _save("] Request modified to:" & @CRLF) 
      _save($req &@CRLF) 
     EndIf 
    EndIf 
    Return $req 
EndFunc