Direkter Download von einer HTML Seite eines Sharpkopieres die per Javascript gesichert ist.

  • Hallo Leute!

    Vorab ich habe die Forenregeln gelesen!!!
    In unserer Firma gibt es 7 Sharp Kopierer, auf denen einige Kopierkostenstellen eingerichtet sind.
    Die Kopierer loggen dann jede Kopie bzw. Druck die auf diese Kostenstellen gemacht werden mit.
    Nun möchte ich, dass jeden Tag diese Zählerstände in eine Datenbank geschrieben werden, damit ich diese dann einfach auswerten kann.
    Die Kopierer stellen diese Logfiles als CSV Datei zum download bereit.
    Das Probelm das ich habe ist, dass die Webseite bzw der Download der CSV Datei mit einem Passwort geschützt ist.(Javascript)
    Nun das Passwort habe ich, nur funktioniert die Angabe bei Inetget nicht.
    Ich habe mir ein Script erstellt, dass per Internetexplorer diese Logdateien herunter ladet.
    Dieses funktioniert zwar recht gut nur kann ich dieses nur verwenden wenn ein Benutzer am PC angemeldet ist.
    Damit wir zuverlässige Daten haben sollte es aber als Dienst funktionieren, also auch wenn kein Benutzer angemeldet ist.
    Kann mir jemand helfen diesen Javascript Passwortschutz zu umgehen, damit ich die CSV Datei direkt herunterladen kann?
    Oder hat jemand eine andere Idee wie ich an die Daten heran komme!?

    Hier der Quellcode der Seite.

    Spoiler anzeigen


    Der Code der webpage.js die in der Webseite verwendet wird.

    Spoiler anzeigen


    Mein Script das den Internetexplorer verwendet.

    Spoiler anzeigen
    [autoit]


    #include <IE.au3>
    #include <File.au3>
    #include <SQLite.au3>
    #include <SQLite.dll.au3>
    #include <Array.au3>
    Dim $var1[3][1]
    Dim $path, $delete, $fail, $var, $varalt, $regread, $array, $c, $loop, $i
    Dim $bezirke[8] = ["", "Imst", "Kitzbühel", "Kufstein", "Landeck", "Lienz", "Reutte", "Schwaz"]
    Dim $bezirke2[8][2] = [[7, ""]]
    Dim $array3[200][60]
    Dim $sPassword = "sagichnet"

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

    Sleep(20000)
    $var1 = IniReadSection(@ScriptDir & "\configbz.ini", "Einstellungen")
    If @error Then
    IniWrite(@ScriptDir & "\configbz.ini", "Einstellungen", "path", @ScriptDir)
    IniWrite(@ScriptDir & "\configbz.ini", "Einstellungen", "password", $sPassword)
    For $i = 1 To 7
    IniWrite(@ScriptDir & "\configbz.ini", "Aufstellungsort", $bezirke[$i], "10.0." & $i & ".233")
    Next
    $var1 = IniReadSection(@ScriptDir & "\configbz.ini", "Einstellungen")
    EndIf
    $bezirke = IniReadSection(@ScriptDir & "\configbz.ini", "Aufstellungsort")
    $path = $var1[1][1]
    ;~ $delete = $var1[2][1]
    $sPassword = $var1[2][1]
    $i = ""

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

    While 1
    $i += 1
    $var = RegEnumKey("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\Ranges", $i)
    If @error <> 0 Then ExitLoop
    $regread &= RegRead("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\Ranges\" & $var, ":Range") & " "
    WEnd

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

    For $i = 1 To $bezirke[0][0]
    If Not StringInStr($regread, $bezirke[$i][1]) Then
    $ii = ""
    While 1
    $ii += 1
    RegRead("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\Ranges\Range" & $ii, ":Range")
    If @error <> 0 Then
    RegWrite("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\Ranges\Range" & $ii, "*", "REG_DWORD", "1")
    RegWrite("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\Ranges\Range" & $ii, ":Range", "REG_SZ", $bezirke[$i][1])
    ExitLoop
    EndIf
    WEnd
    EndIf
    Next

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

    While $loop < $bezirke[0][0]
    $loop = 0
    For $i = 1 To $bezirke[0][0]
    Ping($bezirke[$i][1], 500)
    If Not @error Then
    For $ii = 0 To 1
    $bezirke2[$i][$ii] = $bezirke[$i][$ii]
    Next
    $loop += 1
    Else
    $fail &= $bezirke[$i][0] & @CR
    EndIf
    Next
    TrayTip("Error", $fail, 5)
    $fail = ""
    If $loop = $bezirke[0][0] Then
    For $i = 1 To $bezirke2[0][0]
    If $bezirke2[$i][0] Then
    FileMove($path & "\" & $bezirke2[$i][0] & ".csv", $path & "\Alt\" & @MDAY & "." & @MON & "." & @YEAR & "\", 9)
    EndIf
    Next
    For $i = 1 To $bezirke[0][0]
    If $bezirke2[$i][0] Then
    Ping($bezirke2[$i][1], 500)
    If Not @error Then

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

    $oIE = _IECreate($bezirke[$i][1], 0, 0)
    $oSubmit = _IEGetObjByName($oIE, "adminloginbtn")
    _IEAction($oSubmit, "click")
    _IELoadWait($oIE)
    $oform = _IEFormGetObjByName($oIE, "login")
    $opasswd = _IEFormElementGetObjByName($oform, "ggt_textbox(10006)")
    $setpasswd = _IEFormElementSetValue($opasswd, $sPassword)
    $oSubmit = _IEGetObjByName($oIE, "loginbtn")
    _IEAction($oSubmit, "click")
    _IELoadWait($oIE)
    $oIE2 = _IECreate($bezirke[$i][1] & "/account_usercountlist_save.html", 0, 0, 1, 0)
    ;~ If $delete Then
    ;~ $oSubmit = _IEGetObjByName($oIE2, "ggt_checkbox(1)")
    ;~ _IEAction($oSubmit, "click")
    ;~ EndIf
    $oSubmit = _IEGetObjByName($oIE2, "countsavebtn")
    _IEAction($oSubmit, "click")
    _IELoadWait($oIE2)
    _IEQuit($oIE)
    WinWait("Dateidownload", "")
    ;~ If Not WinActive("Dateidownload", "") Then WinActivate("Dateidownload", "")
    ;~ WinWaitActive("Dateidownload", "")
    WinActivate("Dateidownload", "")
    Sleep(1000)
    ControlClick("Dateidownload", "", "[CLASS:Button; INSTANCE:2]")
    While WinExists("Dateidownload")
    WinActivate("Dateidownload", "")
    ControlClick("Dateidownload", "", "[CLASS:Button; INSTANCE:2]")
    WEnd
    WinWait("Speichern unter", "")
    ;~ If Not WinActive("Speichern unter", "") Then WinActivate("Speichern unter", "")
    ;~ WinWaitActive("Speichern unter", "")
    ;~ Sleep(2000)
    ControlSend("Speichern unter", "", "[CLASS:Edit;INSTANCE:1]", $path & "\" & $bezirke2[$i][0] & ".csv")

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

    $text = ControlGetText("Speichern unter", "", "[CLASS:Edit;INSTANCE:1]")
    While $text <> $path & "\" & $bezirke2[$i][0] & ".csv"
    ControlClick("Speichern unter", "", "[CLASS:Edit;INSTANCE:1]", "", 2)
    ControlSend("Speichern unter", "", "[CLASS:Edit;INSTANCE:1]", $path & "\" & $bezirke2[$i][0] & ".csv")
    $text = ControlGetText("Speichern unter", "", "[CLASS:Edit;INSTANCE:1]")
    WEnd

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

    ControlClick("Speichern unter", "", "[CLASS:Button; INSTANCE:2]")
    _IEQuit($oIE2)
    WinWait("Download beendet", "")
    ;~ If Not WinActive("Download beendet", "") Then WinActivate("Download beendet", "")
    ;~ WinWaitActive("Download beendet", "")
    ControlClick("Download beendet", "", "[CLASS:Button; INSTANCE:4]")
    Else
    $fail &= $bezirke2[$i][0] & @CR
    EndIf
    EndIf
    Next
    EndIf
    If $loop = $bezirke2[0][0] Then
    _dateneinlesen()
    _sqlite($array3)
    Sleep(86400000)
    $loop = 0
    EndIf
    Sleep(600000)
    WEnd

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

    Func _dateneinlesen()
    Dim $array3[200][60]
    For $i = 1 To $bezirke[0][0]
    _FileReadToArray($path & "\" & $bezirke[$i][0] & ".csv", $array)
    If @error Then ContinueLoop
    For $ii = 2 To $array[0]
    $c += 1
    $array2 = StringSplit($array[$ii], ",")
    For $iii = 1 To $array2[0]
    $array3[$c][$iii] = $array2[$iii]
    Next
    $array3[$c][0] = $bezirke[$i][0]
    Next
    Next
    ReDim $array3[$c][$iii]
    EndFunc ;==>_dateneinlesen

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

    Func _sqlite($iarray)
    Local $aResult, $iRows, $iColumns, $iRval, $i, $zeit, $datum, $hQuery
    $zeit = @HOUR & ":" & @MIN & ":" & @SEC
    $datum = @YEAR & "-" & @MON & "-" & @MDAY
    _SQLite_Startup()
    If @error > 0 Then
    MsgBox(16, "SQLite Error", "SQLite.dll Can't be Loaded!", 5)
    Exit -1
    EndIf
    _SQLite_Open("kopierer.db")
    If @error > 0 Then
    MsgBox(16, "SQLite Error", "Can't Load Database!", 5)
    Exit -1
    EndIf

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

    If Not _SQLite_Exec(-1, 'CREATE TABLE IF NOT EXISTS Gesamtliste (NR INTEGER, Zeit TIME, Datum DATE, Bezirk TEXT, Kostenstelle TEXT, Kopie_SW INTEGER, Kopie_Farbe INTEGER, Druck_SW INTEGER, Druck_Farbe INTEGER, Scan_SW INTEGER, Scan_Farbe INTEGER);') = $SQLITE_OK Then _
    MsgBox(16, "SQLite Error", _SQLite_ErrMsg(), 5)

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

    _SQLite_QuerySingleRow(-1, "SELECT Datum FROM Gesamtliste WHERE NR = (SELECT MAX(NR) FROM Gesamtliste) LIMIT 1;", $hQuery)

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

    If $hQuery[0] = $datum Then Return
    _SQLite_QuerySingleRow(-1, "SELECT MAX(NR) FROM Gesamtliste;", $hQuery)

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

    $hQuery[0] += 1

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

    For $i = 1 To UBound($iarray, 1) - 1
    If Not _SQLite_Exec(-1, 'INSERT INTO Gesamtliste VALUES ("' & $hQuery[0] & '","' & $zeit & '","' & $datum & '","' & $iarray[$i][0] & '",' & $iarray[$i][1] & "," & $iarray[$i][2] & "," & $iarray[$i][5] & "," & $iarray[$i][14] & "," & $iarray[$i][17] & "," & $iarray[$i][38] & "," & $iarray[$i][41] & ");") = $SQLITE_OK Then _
    MsgBox(16, "SQLite Error", _SQLite_ErrMsg(), 5)
    Next
    _SQLite_Close()
    _SQLite_Shutdown()
    EndFunc ;==>_sqlite

    [/autoit]

    If not :?: then ?( else :thumbup:

    Einmal editiert, zuletzt von Concara (22. Juni 2010 um 08:41)

  • Ich denke, du solltest dich mit der WinHTTP-UDF vertraut machen. Dann musst du erst die Login-Daten senden und anschließend die Datei herunterladen.

  • Ich habe 2 oder 3 Funktionen davon geschrieben.

    Das Javascript ist egal, du musst nur die Daten richtig zusammenstellen, die nachher an das CGI-skript auf dem Server gesendet werden. Dazu loggst du am besten mit LiveHTTPHeaders den Datenaustausch mit. irgendwo in den optionen solltest du einstellen, die POST-Daten komplett mitzuschneiden. (Extras -> Live HTTP headers -> Konfiguration -> POST auf Genau)
    https://addons.mozilla.org/de/firefox/addon/3829/
    Zum Mitschneiden das Fenster offen lassen, anschließend im Tab Generator die richtigen Adressen raussuchen, da bekommst du dann über Kopieren die POST-Daten.

  • Hallo progandy!

    Danke für die Tipps!!!
    Leider bekomme ich es immer noch nicht so hin wie ich es brauche.
    Mit dieser Methode bin ich zumindest schon direkt auf die Seite gelangt wo man das Passwort eingeben muss für den Administrator.
    Nur wenn ich dann sozusagen das Passwort sende, dann erhalte ich nicht die Datei zurück die ich will bzw, die ich bekomme wenn ich das alles im Browser händisch mache.
    Hast du eine Idee was da noch schief läuft?

    Hier mein Code:

    Spoiler anzeigen
    [autoit]


    #include "WinHTTP.au3"

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

    $LocalIP = "10.80.2.233"

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

    If Not Ping($LocalIP, 500) Then Exit

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

    $hw_open = _WinHttpOpen("Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.0.3; .NET CLR 2.0.50727; ffco7) Gecko/2008092417 Firefox/3.0.3")

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

    $hw_connect = _WinHttpConnect($hw_open, $LocalIP)

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

    $h_openRequest = _WinHttpOpenRequest($hw_connect, "POST", "/login.html?/account_count_save.html?usernum=27&del=0")

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

    $data = "ggt_textbox%2810007%29=&action=adminloginbtn&ggt_hidden%2810008%29=2"

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

    _WinHttpSendRequest($h_openRequest, $WINHTTP_NO_ADDITIONAL_HEADERS, $WINHTTP_NO_REQUEST_DATA, StringLen($data), 0)

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

    _WinHttpWriteData($h_openRequest, $data)

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

    _WinHttpReceiveResponse($h_openRequest)

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

    $rData = _WinHttpReadData($h_openRequest)

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

    $hFile = FileOpen("test1.html", 2)

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

    FileWrite($hFile, $rData)

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

    FileClose($hFile)

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

    ;~ POST /login.html?/account_count_save.html?usernum=27&del=0 ggt_textbox%2810006%29=admin&action=loginbtn&ggt_hidden%2810008%29=3
    $h_openRequest2 = _WinHttpOpenRequest($hw_connect, "POST", "/login.html?/account_count_save.html?usernum=27&del=0")
    $data = "ggt_textbox%2810006%29=admin&action=loginbtn&ggt_hidden%2810008%29=3"

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

    _WinHttpSendRequest($h_openRequest2, $WINHTTP_NO_ADDITIONAL_HEADERS, $WINHTTP_NO_REQUEST_DATA, StringLen($data), 0)

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

    _WinHttpWriteData($h_openRequest2, $data)

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

    _WinHttpReceiveResponse($h_openRequest2)

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

    $rData = _WinHttpReadData($h_openRequest2, 2)

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

    $hFile = FileOpen("test2.html", 2)

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

    FileWrite($hFile, $rData)

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

    FileClose($hFile)

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

    _WinHttpCloseHandle($h_openRequest)
    _WinHttpCloseHandle($h_openRequest2)
    _WinHttpCloseHandle($hw_connect)
    _WinHttpCloseHandle($hw_open)

    [/autoit]


    Hier das was ich mit dem von dir genannten Tool mitgeloggt habe:
    Headers:

    Spoiler anzeigen


    Generator:

    Spoiler anzeigen

    If not :?: then ?( else :thumbup:

  • Die Anmeldung sieht etwas kompliziert aus. Ändern sich vielleicht die IDs der Textfelder oder so?
    Du solltest mal diese Reihenfolge versuchen:

    Spoiler anzeigen
    [autoit]

    #include "WinHTTP.au3"

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

    $LocalIP = "10.80.2.233"

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

    If Not Ping($LocalIP, 500) Then Exit

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

    $hw_open = _WinHttpOpen("Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.0.3; .NET CLR 2.0.50727; ffco7) Gecko/2008092417 Firefox/3.0.3")

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

    $hw_connect = _WinHttpConnect($hw_open, $LocalIP)

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

    $sFile1 = _WinHTTP_SimpleRequest($hw_connect, "GET", "/account_count_save.html?usernum=27&del=0")
    _FileWriteNew(@DesktopDir&'\logindata\file1.htm', $sFile1, 8)

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

    $sFile2 = _WinHTTP_SimpleRequest($hw_connect, "GET", "/login.html?/account_count_save.html?usernum=27&del=0")
    _FileWriteNew(@DesktopDir&'\logindata\file2.htm', $sFile2, 8)

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

    $sFile3 = _WinHTTP_SimpleRequest($hw_connect, "POST", "/login.html?/account_count_save.html?usernum=27&del=0", "ggt_textbox%2810007%29=&action=adminloginbtn&ggt_hidden%2810008%29=2")
    _FileWriteNew(@DesktopDir&'\logindata\file3.htm', $sFile3, 8)

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

    $sFile4 = _WinHTTP_SimpleRequest($hw_connect, "POST", "/login.html?/account_count_save.html?usernum=27&del=0", "ggt_textbox%2810006%29=admin&action=loginbtn&ggt_hidden%2810008%29=3")
    _FileWriteNew(@DesktopDir&'\logindata\file4.htm', $sFile4, 8)

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

    $sFile5 = _WinHTTP_SimpleRequest($hw_connect, "GET", "/account_count_save.html?usernum=27&del=0")
    _FileWriteNew(@DesktopDir&'\logindata\file5.htm', $sFile5, 8)

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

    _WinHttpCloseHandle($hw_connect)
    _WinHttpCloseHandle($hw_open)

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

    Func _FileWriteNew($sFile, ByRef $sData, $iFlags=0)
    ; Author: ProgAndy
    Local $hFile = FileOpen($sFile, BitOR(2, BitAND($iFlags, BitNOT(1))))
    If @error Then Return SetError(1,0,0)
    Local $r = FileWrite($hFile, $sData)
    FileClose($hFile)
    If $r Then Return 1
    Return SetError(2,0,0)
    EndFunc

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

    Func _WinHTTP_SimpleRequest($hw_connect, $sType, $sPath, $sData = $WINHTTP_NO_REQUEST_DATA, $sHeader=$WINHTTP_NO_ADDITIONAL_HEADERS, $fGetHeaders=False)
    ; Author: ProgAndy
    Local $h_openRequest = _WinHttpOpenRequest($hw_connect, $sType, $sPath)
    If Not $h_openRequest Then Return SetError(1,0,0)
    If $sType = "POST" and $sHeader=$WINHTTP_NO_ADDITIONAL_HEADERS Then $sHeader = "Content-Type: application/x-www-form-urlencoded"&@CRLF
    _WinHttpSendRequest($h_openRequest, $sHeader, $sData)
    _WinHttpReceiveResponse($h_openRequest)
    Local $aData[2] =['', '']
    If _WinHttpQueryDataAvailable($h_openRequest) Then
    Do
    $aData[1] &= _WinHttpReadData($h_openRequest)
    Until @extended=0 Or @error<>0
    EndIf
    _WinHttpCloseHandle($h_openRequest)
    If $fGetHeaders Then
    $aData[0] = _WinHttpQueryHeaders($h_openRequest)
    Return $aData
    EndIf
    Return $aData[1]
    EndFunc

    [/autoit]
  • Danke für deine Bemühungen!!!

    Also File1-2 erhaltet man das "normale" Login (Für Benutzer)
    Ab File 3 kommt man dann zum Administrator Login.
    Bei 4 und 5 kommt aber wieder anstatt dem File das ich brauche ein HTML Seite mit dem Hinweis
    "Loggen Sie sich als Benutzer ein, der die Genehmigung hat, die Seite anzuzeigen, die eine Administratorgenehmigung verlangt?"

    Kann das ganz mit Coockies zusammen hängen?
    Das beim Administratorlogin ein Coockie erzeugt wird das dann bei jedem Aufruf einer weiteren Seite abgefragt wird?
    Wird das mit dem Befehl _WinHTTP_SimpleRequest auch erstellt?

    If not :?: then ?( else :thumbup:

  • Die Cookies sollten eigentlich erzeugt werden. Vielleicht ist der Referrer nötig oder so...

    Außerdem sehe ich immer nur Benutzernamen aber nirgends wird ein Passwort gesendet. oder hast du das aus den Daten entfernt?

  • Hi!

    Was meinst du mit Referrer? Wie kann ich den mit angeben?
    Doch beim 2 POST wird das Passwort mitgegeben "ggt_textbox%2810006%29=admin&action=loginbtn&ggt_hidden%2810008%29=3"
    Kann man sich das erstellte Coockie ansehen?
    Weil dann könnte ich es vergleichen mit dem das FF erstellt.

    Ich hätte mir nicht vorgestellt, dass das so schwierig ist!
    Nochmals danke das du mir hilfst.
    Ich brauch das unbeding und muss solange weitermachen bis es klappt :(

    If not :?: then ?( else :thumbup:

    Einmal editiert, zuletzt von Concara (22. Juni 2010 um 12:00)

  • Die Cookies werden im header der Verbindung gesendet bzw. empfangen.
    Du kannst bei der SimpleRequest-Funktion die Rückgabe der HTTP-header anschalten (Parameter $fGetHeaders), dann bekommst du ein array:
    [0] sind die header
    [1] die "normalen" Daten

    Der Referrer muss bei OpenRequest angegeben werden. Hier habe ich mal einen weiteren Parameter eingefügt. Du musst aber alle Aufrufe anpassen, da ich ihn in der Mitte eingefügt habe

    Spoiler anzeigen
    [autoit]

    Func _WinHTTP_SimpleRequest($hw_connect, $sType, $sPath, $sReferrer = $WINHTTP_NO_REFERER, $sData = $WINHTTP_NO_REQUEST_DATA, $sHeader=$WINHTTP_NO_ADDITIONAL_HEADERS, $fGetHeaders=False)
    ; Author: ProgAndy
    Local $h_openRequest = _WinHttpOpenRequest($hw_connect, $sType, $sPath, "HTTP/1.1", $sReferrer)
    If Not $h_openRequest Then Return SetError(1,0,0)
    If $sType = "POST" and $sHeader=$WINHTTP_NO_ADDITIONAL_HEADERS Then $sHeader = "Content-Type: application/x-www-form-urlencoded"&@CRLF
    _WinHttpSendRequest($h_openRequest, $sHeader, $sData)
    _WinHttpReceiveResponse($h_openRequest)
    Local $aData[2] =['', '']
    If _WinHttpQueryDataAvailable($h_openRequest) Then
    Do
    $aData[1] &= _WinHttpReadData($h_openRequest)
    Until @extended=0 Or @error<>0
    EndIf
    _WinHttpCloseHandle($h_openRequest)
    If $fGetHeaders Then
    $aData[0] = _WinHttpQueryHeaders($h_openRequest)
    Return $aData
    EndIf
    Return $aData[1]
    EndFunc

    [/autoit]
  • Hi!

    Ich habe es leider immer noch nicht geschaft! :(
    progandy bei deiner Funktion ist noch ein kleiner Fehler drinnen.

    Spoiler anzeigen
    [autoit]


    Func _WinHTTP_SimpleRequest($hw_connect, $sType, $sPath, $sReferrer = $WINHTTP_NO_REFERER, $sData = $WINHTTP_NO_REQUEST_DATA, $sHeader=$WINHTTP_NO_ADDITIONAL_HEADERS, $fGetHeaders=False)
    ; Author: ProgAndy
    Local $h_openRequest = _WinHttpOpenRequest($hw_connect, $sType, $sPath, "HTTP/1.1", $sReferrer)
    If Not $h_openRequest Then Return SetError(1,0,0)
    If $sType = "POST" and $sHeader=$WINHTTP_NO_ADDITIONAL_HEADERS Then $sHeader = "Content-Type: application/x-www-form-urlencoded"&@CRLF
    _WinHttpSendRequest($h_openRequest, $sHeader, $sData)
    _WinHttpReceiveResponse($h_openRequest)
    Local $aData[2] =['', '']
    If _WinHttpQueryDataAvailable($h_openRequest) Then
    Do
    $aData[1] &= _WinHttpReadData($h_openRequest)
    Until @extended=0 Or @error<>0
    EndIf

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

    If $fGetHeaders Then
    $aData[0] = _WinHttpQueryHeaders($h_openRequest)
    _WinHttpCloseHandle($h_openRequest)
    Return $aData
    EndIf
    _WinHttpCloseHandle($h_openRequest)
    Return $aData[1]
    EndFunc

    [/autoit]


    So funktioniert auch die Abfrage der Headerdatei!
    Was mir noch aufgefallen ist, dass wenn man z.b. Gif Dateien mit deiner Funktion herunterladen werden diese nicht vollständig sind.
    Aber das ist für mein Problem irrelevant.

    Das mit dem Referrer hat nichts gebracht. Ich habe z.b http://10.80.1.233 ausprobiert oder den ganzen Pfad http://10.80.1.233/login.html?/account_count_save.html?usernum=27&del=0"

    Man kann da eingeben was man will es ändert sich nichts.
    Ich glaub das ist wirklich nur für die Statistik der Webserver interessant.
    Ich weiß einfach nicht was der Browser anders macht als wenn man es per Winhttp macht!?
    Mir ist noch aufgefallen beim Live HTTP Headers Log, dass bei der letzten Rückgabe des Servers ein 302 Moved temporarily zurück kommt.(Aber auch nicht immer)
    Kann das eventuell winhttp nicht verarbeiten?

    If not :?: then ?( else :thumbup:

    3 Mal editiert, zuletzt von Concara (22. Juni 2010 um 12:27)

  • GIF-Dateien enthalten NULL-Bytes. Dafür müsste man _WinHttpReadData als Binärfunktion aufrufen, aber das würde einen weiteren parameter erfordern. Oder die Funktion gibt immer Binärdaten zurück und du musst BinaryToString zur Umwandlung verwenden wie InetRead.

    Eigentlich sollte WinHTTP den 302-Header verarbeiten können. Ich weiß leider wirklich nicht, was nicht funktioniert.

  • Hi

    So jetzt habe ich den Download per TCP/IP erledigt.
    Mensch hab ich mich gefreut, dass es damit funktioniert hat.
    Aber leider ist da jetzt ein weiteres Problem aufgetaucht.
    Die Html Seiten und die eigentliche Datei (CSV) sind nicht ganz "sauber".
    Das heißt das wenn ich sie herunter lade werden an x Stellen Zahlen eingefügt.

    Hier die HTML Datei die erzeugt wird.

    Spoiler anzeigen


    Hier die Funktion mit der ich die HTML Datei herunter lade.

    Spoiler anzeigen
    [autoit]


    #include <string.au3>
    $ip = "10.80.1.233"
    $quellcode1 = TCPRequest($ip, $ip, 'login.html?/account_count_save.html?usernum=27&del=0', "ggt_textbox%2810007%29=&action=adminloginbtn&ggt_hidden%2810008%29=2")
    FileWrite(@ScriptDir & '\1.html',$quellcode1)

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

    Func TCPRequest($sIp, $sHost, $sSeite = "", $sPost = '', $sCookies = '', $sReferer = '', $iMaxTime = 10000)
    Local $sPacket, $iSocket, $iTimer

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

    If $sPost = '' Then
    $sPacket = 'GET /' & $sSeite & ' HTTP/1.1' & @CRLF
    Else
    $sPacket = 'POST /' & $sSeite & ' HTTP/1.1' & @CRLF
    EndIf
    $sPacket &= 'Host: ' & $sHost & @CRLF & _
    'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)' & @CRLF & _
    'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' & @CRLF & _
    'Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3' & @CRLF & _
    'Accept-Encoding: gzip,deflate' & @CRLF & _
    'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7' & @CRLF & _
    'Keep-Alive: 115' & @CRLF & _
    'Connection: keep-alive' & @CRLF
    If $sReferer <> '' Then
    $sPacket &= 'Referer: ' & $sReferer & @CRLF
    EndIf
    If $sCookies <> '' Then
    $sPacket &= 'Cookie: ' & $sCookies & @CRLF
    EndIf
    If $sPost <> '' Then
    $sPacket &= 'Content-Type: application/x-www-form-urlencoded' & @CRLF
    $sPacket &= 'Content-Length: ' & StringLen($sPost) & @CRLF
    EndIf
    $sPacket &= @CRLF
    If $sPost <> '' Then
    $sPacket &= $sPost
    EndIf

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

    TCPStartup()
    If @error Then Return SetError(1, 0, "")
    $iSocket = TCPConnect($sIp, 80)
    If @error Then Return SetError(2, 0, "")
    TCPSend($iSocket, $sPacket)
    If @error Then Return SetError(3, 0, "")
    $iTimer = TimerInit()
    Do
    $sRecv = TCPRecv($iSocket, 1024)
    If TimerDiff($iTimer) > $iMaxTime Then Return SetError(4, 0, "")
    Until $sRecv <> ""
    Do
    $sRecv &= TCPRecv($iSocket, 1024)
    Until @error Or StringInStr($sRecv, '</html>')
    TCPCloseSocket($iSocket)
    TCPShutdown()
    Return $sRecv
    EndFunc ;==>TCPRequest

    [/autoit]

    If not :?: then ?( else :thumbup: