WinHTTP.au3 schlägt fehl beim Upload von Multipart-POST-Daten

    • Offizieller Beitrag

    Hallo,

    Ich versuche gerade ein Skript zu schreiben, dass mir automatisch CSV-Dateien bei vokker.net importiert. Höchstwahrscheinlich haben die damit keine Probleme, schließlich steigert es die Zugriffe zum Lernen und damit die Werbeeinnahmen. Eine API hat der Dienst offenbar nicht, hatte sie sogar erfolglos darauf angesprochen.

    Nun aber zum Code:

    Spoiler anzeigen
    [autoit]

    #include-once

    [/autoit] [autoit][/autoit] [autoit]

    #include "WinHttp.au3"
    #include "WinHttpConstants.au3"
    #include "logging.au3"
    #include <File.au3>
    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    _vokkerUploadCSV("username", "password", @ScriptDir & "\test.csv")

    [/autoit] [autoit][/autoit] [autoit]

    Func _vokkerUploadCSV($user, $pass, $filename)
    ; unterstützt?
    If Not _WinHttpCheckPlatform() Then
    _Log("Kein WinHTTP-Support")
    Return
    EndIf
    _Log("WinHTTP-Support ok.")
    ; Initialize and get session handle
    Local $hOpen = _WinHttpOpen('Mozilla/5.0 (Windows NT 6.2; rv:10.0.2) Gecko/20120101 Firefox/10.0.2')
    ; Get connection handle
    Local $hConnect = _WinHttpConnect($hOpen, 'www.phase-6.com', $INTERNET_DEFAULT_HTTPS_PORT)
    ;~ _Log(@error)
    ;~ _Log($hConnect)
    ; Request
    Local $postData = "josso_username=" & $user & "&josso_password=" & $pass
    $hResult = _WinHttpSimpleSSLRequest($hConnect, "POST", "login/signon/login.do", "http://www.vokker.net", $postData, $WINHTTP_NO_ADDITIONAL_HEADERS, True)
    ;~ _ArrayDisplay($result)
    ;~ debugHTML($hResult[1])
    _WinHttpCloseHandle($hConnect)

    [/autoit] [autoit][/autoit] [autoit]

    $regArray = StringRegExp($hResult[0], "Set-Cookie: (.*)", 2)
    if not IsArray($regArray) Then Return False
    Local $cookie = $regArray[1]
    _Log("Cookie: " & $cookie)
    $regArray = StringRegExp($cookie, "([A-Z0-9]{20,})", 2)
    if not IsArray($regArray) Then Return False
    Local $Session_ID = $regArray[1]
    _Log("Session ID: " & $Session_ID)

    [/autoit] [autoit][/autoit] [autoit]

    ; Upload-Teil
    ; Get connection handle
    $hConnect = _WinHttpConnect($hOpen, "www.vokker.net", $INTERNET_DEFAULT_HTTPS_PORT)
    ; Request
    Local $file = FileOpen(@ScriptDir & "\importTemplate.txt", 256)
    Local $postData = FileRead($file)
    Local $file2 = FileOpen($filename, 256)
    $postData = StringReplace($postData, "$$filename$$", StringTrimLeft($filename, StringInStr($filename, "\", False, -1)))
    $postData = StringReplace($postData, "$$content$$", FileRead($file2))
    FileClose($file2)
    $postData = StringReplace($postData, "$$title$$", "Testtitel!")
    $postData = StringReplace($postData, "$$srcLang$$", "de")
    $postData = StringReplace($postData, "$$tgtLang$$", "pl")
    _Log($postData)
    $dataLength = StringLen($postData)
    MsgBox(0, "", $dataLength)
    FileClose($file)

    [/autoit] [autoit][/autoit] [autoit]

    $hResult = _WinHttpSimpleSSLRequest($hConnect, "POST", "de/export/importieren.php", "http://www.vokker.net/de/export/import.php", Binary($postData), "Content-Length: " & $dataLength & @CRLF & "Content-Type: multi-part/form-data; boundary=-----------------------------41184676334"&@CRLF, True)
    _Log("Ergebnis: " & $hResult & @CRLF & "Error: " & @error)
    _ArrayDisplay($hResult)

    [/autoit] [autoit][/autoit] [autoit]

    _WinHttpCloseHandle($hConnect)
    _WinHttpCloseHandle($hOpen)
    EndFunc ;==>_vokkerUploadCSV

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func debugHTML($string)
    Local $filename = _TempFile() & ".html"
    FileWrite($filename, $string)
    ShellExecute($filename)
    EndFunc

    [/autoit]

    Ausgabe:

    Ich komme da einfach nicht weiter :(.
    Kann jemand helfen?

    Im Anhang das komplette Projekt, bewusst mit gültigen Login-Daten.

    Vielen Dank!
    Johannes

  • Hi,
    Ich bin etwas weiter gekommen. Der Upload liefert ein OK, aber die Lektion ist nicht vorhanden?

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    #include-once

    [/autoit] [autoit][/autoit] [autoit]

    #include "WinHttp.au3"
    #include "WinHttpConstants.au3"
    #include "logging.au3"
    #include <File.au3>
    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    _vokkerUploadCSV("....", "....", @ScriptDir & "\test.csv")

    [/autoit] [autoit][/autoit] [autoit]

    Func _vokkerUploadCSV($user, $pass, $filename)
    ; unterstützt?
    If Not _WinHttpCheckPlatform() Then
    _Log("Kein WinHTTP-Support")
    Return
    EndIf
    _Log("WinHTTP-Support ok.")
    ; Initialize and get session handle
    Local $hOpen = _WinHttpOpen('Mozilla/5.0 (Windows NT 6.2; rv:10.0.2) Gecko/20120101 Firefox/10.0.2')
    ; Get connection handle
    Local $hConnect = _WinHttpConnect($hOpen, 'www.phase-6.com', $INTERNET_DEFAULT_HTTPS_PORT)
    ;~ _Log(@error)
    ;~ _Log($hConnect)
    ; Request
    _WinHttpSetOption($hConnect, $WINHTTP_OPTION_REDIRECT_POLICY, $WINHTTP_OPTION_REDIRECT_POLICY_ALWAYS)
    Local $postData = "josso_cmd=login&josso_back_to=http://www.vokker.net/de/lernen/index.php&josso_username=" & $user & "&josso_password=" & $pass
    $hResult = _WinHttpSimpleSSLRequest($hConnect, "POST", "/login/signon/login.do", "http://www.vokker.net/de/sonst/login.php?url=%2Fde%2Flernen%2Findex.php", $postData, $WINHTTP_NO_ADDITIONAL_HEADERS, True)
    ;~ _ArrayDisplay($result)
    ;~ debugHTML($hResult[1])
    _WinHttpCloseHandle($hConnect)

    [/autoit] [autoit][/autoit] [autoit]

    If Not StringInStr(StringLeft($hResult[0], 20), " 302") Then Return SetError(1, 0, 0)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; Upload-Teil
    ; Get connection handle
    $hConnect = _WinHttpConnect($hOpen, "www.vokker.net")

    [/autoit] [autoit][/autoit] [autoit]

    ; übernehme login von phase-6
    Local $url = StringRegExp($hResult[0], "(?m)^Location:\h*\w*://([^/]+)/(.*)$", 1)
    MsgBox(0, "", $url[1])
    _WinHttpSimpleRequest($hConnect, "GET", $url[1], "https://www.phase-6.com/login/signon/login.do")
    _WinHttpSimpleRequest($hConnect, "GET", "de/export/import.php")

    [/autoit] [autoit][/autoit] [autoit]

    ; Request
    Local $file = FileOpen(@ScriptDir & "\importTemplate.txt", 256)
    Local $file2 = FileOpen($filename, 256)
    Local $postData = FileRead($file)
    $postData = StringReplace($postData, "$$filename$$", StringTrimLeft($filename, StringInStr($filename, "\", False, -1)))
    $postData = StringReplace($postData, "$$content$$", FileRead($file2))
    $postData = StringReplace($postData, "$$title$$", "Testtitel!")
    $postData = StringReplace($postData, "$$srcLang$$", "de")
    $postData = StringReplace($postData, "$$tgtLang$$", "pl")
    _Log($postData)
    FileClose($file2)
    FileClose($file)

    [/autoit] [autoit][/autoit] [autoit]

    $hResult = _WinHttpSimpleRequest($hConnect, "POST", "de/export/importieren.php", "http://www.vokker.net/de/export/import.php", StringToBinary($postData, 4), "Content-Type: multipart/form-data; boundary=""-----------------------------41184676334"""&@CRLF, True)
    _Log("Ergebnis: " & $hResult & @CRLF & "Error: " & @error)
    _ArrayDisplay($hResult)
    _Log($hResult[1])

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    _WinHttpCloseHandle($hConnect)
    _WinHttpCloseHandle($hOpen)
    EndFunc ;==>_vokkerUploadCSV

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func debugHTML($string)
    Local $filename = _TempFile() & ".html"
    FileWrite($filename, $string)
    ShellExecute($filename)
    EndFunc

    [/autoit]
  • Mir fällt gerade ein, ich habe auch das Template angepasst. Ein zusätzliches Feld und eine Leerzeile am Ende, gespeichert als UTF-8

    Spoiler anzeigen
  • Kann man sich mit der WinHTTP.au3 vllt. noch den gesamten Request ausgeben lassen vor dem Abschicken, damit ich ihn mit den Firebug-Werten vergleichen kann?


    Ich bin mir nicht sicher. Du kannst ihn auf jeden Fall per Wireshark mitschneiden ;)