Problem beim Dateidownload mit "InetGet" ( ANFÄNGER )

  • Werte Profis,

    ich möchte eine Datei (Avast-Offline-Installer = "https://www.avast.com/de-de/download-thank-you.php?product=FAV-AVAST&locale=de-de") herunterladen,
    leider kriege ich das mit meinem begrenzten Verständnis nicht hin. Ich benutze normalerweise die Standard "InetGet" Funktion wie in der Hilfefunktion, damit

    schaffe ich es z.B. neue Virendefintionen bei Avast herunterzuladen.

    Meine Vermutung: Der o.a. Link benötigt beim "manuellen" Aufruf außerhalb von AutoIt noch die Bestätigung: "Möchten Sie diese Datei speichern?"

    Gibt es eine Möglichkeit Dateien herunterzuladen, die noch auf "Bestätigung" warten. Ziel dabei ist es, dies Mittels "InetGet" o.ä. Funktion zu bewerkstelligen,

    statt den Link über den Browser aufzurufen und dann AutoIt auf "Datei speichern" klicken zu lassen - so mache ich es bisher ... :(

    Danke im Vorraus! - Gruß Kilo

  • Abgerufen wird die Datei mit diesem Link:
    bits.avcdn.net/productfamily_ANTIVIRUS/insttype_FREE/platform_WIN/installertype_FULL/build_RELEASE/cookie_mmm_ava_998_999_000_m

    Habe mal "https://" entfernt, um den Link zu entschärfen.

    Es gibt drei Wahrheiten: deine Wahrheit, meine Wahrheit und die Wahrheit

    Einmal editiert, zuletzt von oh-ha (18. September 2021 um 15:59)

  • oh-ha: Vielen Dank für die Antwort. Wenn ich den Download mit der Standardfunktion von InetGet starte, wird jedoch nichts heruntergeladen.

    Was mache ich falsch?

    Gruß Kilo

    Spoiler anzeigen

    #include <InetConstants.au3>

    #include <MsgBoxConstants.au3>

    #include <WinAPIFiles.au3>

    ; Download einer Datei im Hintergrund.

    ; Wartet bis der Download vollständig ist.

    Example()

    Func Example()

    ; Speichert die heruntergeladene Datei in den temporären Ordner.

    Local $sFilePath = _WinAPI_GetTempFileName(@TempDir)

    ; Lädt die Datei im Hintergrund mit den ausgewählten Optionen von 'Erzwingt ein erneutes Laden von der Remote-Seite' herunter.

    Local $hDownload = InetGet("bits.avcdn.net/productfamily_ANTIVIRUS/insttype_FREE/platform_WIN/installertype_FULL/build_RELEASE/cookie_mmm_ava_998_999_000_m", $sFilePath, $INET_FORCERELOAD, $INET_DOWNLOADBACKGROUND)

    ; Wartet bis der Download komplett ist. Dabei wird solange gewartet, bis der zweite Wert von InetGetInfo True zurückgibt.

    Do

    Sleep(250)

    Until InetGetInfo($hDownload, $INET_DOWNLOADCOMPLETE)

    ; Ermittelt die übertragenen Bytes und die Dateigröße.

    Local $iBytesSize = InetGetInfo($hDownload, $INET_DOWNLOADREAD)

    Local $iFileSize = FileGetSize($sFilePath)

    ; Schließt das durch InetGet zurückgegebene Handle.

    InetClose($hDownload)

    ; Zeigt Details über die gelesenen Bytes und die Dateigröße.

    MsgBox($MB_SYSTEMMODAL, "", "heruntergeladene Bytes: " & $iBytesSize & @CRLF & _

    "gesamte Dateigröße: " & $iFileSize)

    EndFunc ;==>Exampl

  • Kann es sein das du am Ende des Beispiels das "FileDelete($sFilePath)" nicht gelöscht hast oder aber nicht auskommentiert hast?

    Sollte so aussehen:

    Die Datei noch umbenennen und gut ist.

    Es gibt drei Wahrheiten: deine Wahrheit, meine Wahrheit und die Wahrheit

  • @kilo :

    Vorab : Das Skript von oh-ha funktioniert !

    Bei größeren Dateien kann es aber ggf. nützlich sein, wenn man den Download angezeigt bekommt.

    Hierzu hat Oscar (GDI+ Variante der Progressbar von UEZ ) eine überaus gelungene UDF zum Download mit Fortschrittsanzeige erstellt.

    Da der Name der Setupdatei anscheinend immer avast_free_antivirus_setup_offline.exe (also ohne Versionsnummer) lautet, habe ich ihn direkt so besetzt.

    Beispiel (in Dein Skriptverzeichnis kopieren) :

    AutoIt
    ; Originalthread : https://autoit.de/thread/45697-downloadwithprogress/
    
    #include '_DownloadWithProgress.au3'
    Global $sDownloadDir = @ScriptDir
    Global $sDownloadURL = 'https://bits.avcdn.net/productfamily_ANTIVIRUS/insttype_FREE/platform_WIN/installertype_FULL/build_RELEASE/cookie_mmm_ava_998_999_000_m/avast_free_antivirus_setup_offline.exe'
    _DownloadWithProgress($sDownloadURL, $sDownloadDir, 1031, 'Download', -1, -1, 0, 1)

    Die Datei _DownloadWithProgress.au3 (siehe Anhang) bitte herunterladen und auch in das Skriptverzeichnis kopieren.

  • Musashi

    Bekomme diese Fehlermeldung:

    Code
    >"C:\Program Files (x86)\AutoIt3\SciTE\..\autoit3.exe" /ErrorStdOut "C:\Users\mein\Desktop\Neuer Ordner\555555.au3"
    "C:\Users\mein\Desktop\Neuer Ordner\_DownloadWithProgress.au3" (258) : ==> Variable used without being declared.:
    $hLineBrush = DllCall($__g_hGDIPDll, 'uint', 'GdipCreateLineBrush', 'struct*', $tPoint1, 'struct*', $tPoint2, 'uint', 0xB0FFFFFF, 'uint', 0x00FFFFFF, 'int', 0, 'int*', 0)
    $hLineBrush = DllCall(^ ERROR
    >Exit code: 1    Time: 0.478

    Wenn ich die Variable im Skript als Global deklariere, kommt das:

    Code
    "C:\Program Files (x86)\AutoIt3\SciTE\..\autoit3.exe" /ErrorStdOut "C:\Users\mein\Desktop\Neuer Ordner\Example.au3"
    "C:\Users\mein\Desktop\Neuer Ordner\_DownloadWithProgress.au3" (259) : ==> Subscript used on non-accessible variable.:
    $hLineBrush = $hLineBrush[6]
    $hLineBrush = $hLineBrush^ ERROR
    >Exit code: 1    Time: 0.477

    Ändere ich die Zeile

    $hLineBrush = $hLineBrush[6] in $hLineBrush = $hLineBrush in der UDF

    Dann ist da wohl ein Wert zu viel in deinem Skript

    _DownloadWithProgress($sDownloadURL, $sDownloadDir, 1031, 'Download', -1, -1, 0, 1) zu _DownloadWithProgress($sDownloadURL, $sDownloadDir, 1031, 'Download', -1, -1, 0)

    Keine Ahnung, ob es nur bei mir so ist.

    Das Skript oben in Post 4 ist nicht von mir, ist das Beispiel aus der Hilfe, da kilo in Post 1 geschrieben hat, --> "Ich benutze normalerweise die Standard "InetGet" Funktion wie in der Hilfefunktion" <-- hatte ich auch das Beispiel Skript genommen.

    Ist bei mir aber auch nicht die erste wahl für den download ^^

    Es gibt drei Wahrheiten: deine Wahrheit, meine Wahrheit und die Wahrheit

    2 Mal editiert, zuletzt von oh-ha (19. September 2021 um 03:53)

  • Musashi

    Bekomme diese Fehlermeldung:

    Code
    >"C:\Program Files (x86)\AutoIt3\SciTE\..\autoit3.exe" /ErrorStdOut "C:\Users\mein\Desktop\Neuer Ordner\555555.au3"
    "C:\Users\mein\Desktop\Neuer Ordner\_DownloadWithProgress.au3" (258) : ==> Variable used without being declared.:
    $hLineBrush = DllCall($__g_hGDIPDll, 'uint', 'GdipCreateLineBrush', 'struct*', $tPoint1, 'struct*', $tPoint2, 'uint', 0xB0FFFFFF, 'uint', 0x00FFFFFF, 'int', 0, 'int*', 0)
    $hLineBrush = DllCall(^ ERROR
    >Exit code: 1    Time: 0.478

    Du benutzt eine veraltete Version von AutoIt.

    Ich weiß nicht genau, ab welcher Version die GDI+ Variable geändert wurde, aber aktuell ist jedenfalls: $__g_hGDIPDll.

  • Danke dir Oscar

    Habe die neueste Version von Autoit. Den Include Ordner aber noch von einer älteren Version.

    Wusste doch das mich das mal einholen wird dieses hin und her switchen.

    Es gibt drei Wahrheiten: deine Wahrheit, meine Wahrheit und die Wahrheit

  • Bekomme diese Fehlermeldung:

    [...]

    Keine Ahnung, ob es nur bei mir so ist.

    Ich verwende AutoIt 3.3.14.0 mit Win 7 SP1 64-Bit und bei mir funktioniert es.

    Dann ist da wohl ein Wert zu viel in deinem Skript

    _DownloadWithProgress($sDownloadURL, $sDownloadDir, 1031, 'Download', -1, -1, 0, 1) zu _DownloadWithProgress($sDownloadURL, $sDownloadDir, 1031, 'Download', -1, -1, 0)

    Der 8. und letzte Parameter ... -1, -1, 0, 1) (also... , 1) ist optional, nicht zuviel ;) ->

    Spoiler anzeigen

    $iShowButtonMode (Default = 0)

    0 = Keine Buttons angezeigen

    1 = Button [Download abbrechen] wird angezeigt

    2 = Button [Fenster schließen] wird angezeigt

    3 = Button [Download abbrechen] und [Fenster schließen] angezeigen

    Ansonsten habe ich nur zwei minimale Veränderungen vorgenommen :

    1. Anzeige des Dateinamens -> kleinere Schriftart 9 statt 12 :

    AutoIt
    [...]
    ; Original -> falls der Dateiname zu lang ist, dann wird er nicht angezeigt :
    ;~     GUICtrlCreateGroup('', 10, 5, 380, 165)
    ;~     GUICtrlCreateLabel(StringFormat('%s "%s"', $aLanguage[0], StringRegExpReplace($sURL, '.+\/(.+)', '$1')), 25, 22, 350, 20)
    ;~     GUICtrlSetFont(-1, 12, 400, 0, 'Arial', 5)
    ; *** modfiziert : Anzeige des Dateinamens in kleiner Schrift :
        GUICtrlCreateGroup('', 10, 5, 380, 165)
        GUICtrlCreateLabel(StringFormat('%s "%s"', $aLanguage[0], StringRegExpReplace($sURL, '.+\/(.+)', '$1')), 25, 22, 350, 20)
        GUICtrlSetFont(-1, 9, 400, 0, 'Arial', 5)

    2. Alternative Farben für die Progressbar :

    Diese Änderungen sollten keine Probleme machen.

    oh-ha :

    Versuche es sonst mal mit der Originalversion von Oscar : _DownloadWithProgress

    EDIT : oh-ha

    Zwischenzeitlich hat Oscar bereits darauf hingewiesen, dass Du eine veraltete Version von AutoIt verwendest.

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Ganz herzlichen Dank für die vielen Antworten!

    Die Fortschrittsanzeige ist natürlich mega ... ! Werde mich am Wochenende ganz in Ruhe der Sache widmen.

    Gruß Kilo

  • Hallo Zusammen,

    Im Prinzip geht das ja einfach so.

    Code
    #include <InetConstants.au3>
    
    
    $DownloadURL = "https://bits.avcdn.net/productfamily_ANTIVIRUS/insttype_FREE/platform_WIN/installertype_FULL/build_RELEASE/cookie_mmm_ava_998_999_000_m/"
    
    InetGet($DownloadURL, @UserProfileDir & "\Downloads\avast_free_antivirus_setup_offline.exe")

    Gruß gmmg

  • Liebe Profis, leider ist mein Problemchen doch noch nicht ganz gelöst.

    Bei mir läuft die Funktion mit dem Fortschrittsbalken leider nicht. Bei der von Musashi verlinkten Version (#6) ist das Script (ohne Fehlermeldung)

    nach max. 2 Sekunden "fertig" - wobei es wie "abgebrochen" aussieht. (Bild 1 & 2) Die heruntergeladene Datei ist dann allerdings mal gerade 4-12

    MB statt etwa 690 MB groß. Teste ich genau dieses Script mit meinen Virusdefinitionen ("https://install.avcdn.net/vpsnitro/vpsupd.exe"), dann
    funktioniert es perfekt!

    Daraufhin habe ich die "InetGet Variante" von oh-ha (#4) getestet - und die läuft auch perfekt! Somit kann es eigentlich auch nicht am Link
    ("https://bits.avcdn.net/productfamily_ANTIVIRUS/insttype_FREE/platform_WIN/installertype_FULL/build_RELEASE/cookie_mmm_ava_998_999_000_m")

    liegen. Den Link habe ich in beiden Varinaten genau gleich verwendet.

    Letztendlich habe ich die erste Version (22. Sep 2014) von Oskar getestet, da ist das "Ergebnis" ähnlich - heruntergeladene Datei nur 4-12 MB groß,

    allerdings bekomme ich diesmal ein "Abschlussfenster" mit ... "Download abgeschlossen" (Bild 3) ???

    Wo liegt mein Fehler?

  • Wo liegt mein Fehler?

    Seltsam !

    1. Die Variante von gmmg (Beitrag #11) funktioniert anscheinend :

    Dateigröße = 691 MB (725.062.648 Bytes)

    Der MD5-Hash ist aber anders.

    MD5-Hash = b97bf36db337d5806256e3964d447d3f

    2. Die Variante von oh-ha (Beitrag #4) funktioniert auch :

    Nach Umbenennen des .tmp Dateinamens in avast_free_antivirus_setup_offline.exe

    Dateigröße = 691 MB (725.062.648 Bytes)

    MD5-Hash = 8149b035b9a322be07b99fc515b8fc5b

    3. _DownloadWithProgress.au3 :

    (damit wir nicht durcheinander geraten, verwende ich zuerst die aktualisierte Version von Oscar vom 19.09.2021 (siehe : https://autoit.de/thread/45697-downloadwithprogress )

    Dazu habe ich den Link in seine Example.au3 eingetragen, d.h.

    AutoIt
    [...]
    Global $sDownloadDir = @ScriptDir
    Global $aDownloadsURL = StringSplit( _
            'https://bits.avcdn.net/productfamily_ANTIVIRUS/insttype_FREE/platform_WIN/installertype_FULL/build_RELEASE/cookie_mmm_ava_998_999_000_m/avast_free_antivirus_setup_offline.exe' & ',' & _
            'https://www.autoitscript.com/cgi-bin/getfile.pl?autoit3/autoit-v3-setup.exe' & ',' & _
            'https://www.autoitscript.com/cgi-bin/getfile.pl?../autoit3/scite/download/SciTE4AutoIt3.zip' & ',' & _
    
    [...]

    Test 1 : Oscar's Version von DownloadWithProgress.au3 :

    Dateigröße = 691 MB (725.062.648 Bytes)

    MD5-Hash = 8149b035b9a322be07b99fc515b8fc5b (also wie bei oh-ha )


    Test 2 : Meine (optisch, nicht funktional) leicht modifizierte DownloadWithProgress.au3 aus Beitrag #5 :

    Dateigröße = 691 MB (725.062.648 Bytes)

    MD5-Hash = 8149b035b9a322be07b99fc515b8fc5b (also wie bei oh-ha und Oscar )


    Offenbar funktioniert alles.

    @kilo :

    Als ich die Downloads mit Progressbar (egal welche Variante) vor gut einer Stunde mehrfach hintereinander zu Testzwecken wiederholt habe, kam es einige Male allerdings auch zu den von Dir beschriebenen "Problemen", d.h. die Datei wurde nur teilweise oder gar nicht heruntergeladen. Momentan kann ich das aber nicht mehr reproduzieren.

    Ich habe mit Oscar's UDF nie Probleme gehabt. Möglicherweise zickt die Avast-Site bei hoher Belastung herum :/ . Mehr kann ich dazu leider auch nicht sagen.

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Hallo Musashi,

    vielen Dank für Deine Mühen! Also ich habe es jetzt unzählige Male mit beiden Versionen der "Progress-Bar" -

    bei mir wurde die Datei nicht ein einziges Mal komplett heruntergeladen - 158 MB waren das Maximum.

    Jetzt geht meine Welt davon nicht unter, ich brauche das nur 1-2 mal im Monat und die etwas "weniger
    schicken" Funktionen klappen ja zum Glück.

    Allerdings gibt es eine Sache, die man an der Progess-Bar-Funktion ggf. verbessern könnte: Wenn der Down-

    load nicht der erwarteten Größe entspricht, wäre es toll, wenn die Funktion etwas wie "Download gescheitert"

    o.ä. ausgibt - und nicht Download abgeschlossen und eine Progressbar mit 100%. Bitte nicht falsch verstehen,

    wäre nur so eine Idee.

    Ich find's immer prima, wie mir hier geholfen wird, egal wie "stümperhaft" das eine oder andere für Euch Profis
    wohl aussehen mag ! :thumbup:

    Dickes Dankeschön!

  • [...] Wenn der Download nicht der erwarteten Größe entspricht, wäre es toll, wenn die Funktion etwas wie "Download gescheitert" o.ä. ausgibt

    Eigentlich prüft Oscar bereits mittels InetGetInfo :

    Do ... Until $aDownloadData[$INET_DOWNLOADCOMPLETE]

    ob der Download vollständig abgeschlossen wurde.

    Ob ein abschließender Vergleich von InetGetSize mit der lokalen Dateigröße sinnvoll wäre muss Oscar entscheiden.

    @kilo :

    Warum bei Dir keiner der Downloadversuche erfolgreich ist -> ???

    Haben andere das mal probiert ?

    Selbst wenn man nur den Direktlink der Avast-Seite, also ohne Anfügen eines Dateinamens, verwendet, erhält man eine Datei mit korrekter Größe und Hash. Sie muss dann allerdings von cookie_mmm_ava_998_999_000_m zu avast_free_antivirus_setup_offline.exe umbenannt werden.

    Bitnugger hat in dem Thread RE: InetGet lädt keine große Dateien mal was zu Timeouts geschrieben. Ob das im vorliegenden Fall eine Rolle spielen könnte -> ???.

    Oscar (nur am Rande) :

    In der Version von 2014 gab es noch den (achten) optionalen Parameter :

    AutoIt
    ; [...]
    ;                    $iShowButtonMode (Default = 0)
    ;                       0 = Keine Buttons angezeigen
    ;                       1 = Button [Download abbrechen] wird angezeigt
    ;                       2 = Button [Fenster schließen] wird angezeigt
    ;                       3 = Button [Download abbrechen] und [Fenster schließen] angezeigen

    Gibt es einen Grund, warum Du den aus der aktuellen Version entfernt hast ?

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Ob ein abschließender Vergleich von InetGetSize mit der lokalen Dateigröße sinnvoll wäre muss Oscar entscheiden.

    Wenn InetGetSize vom Server eine falsche Dateigröße geliefert bekommt, macht ein anschließender Vergleich keinen Sinn, weil der dann eine Übereinstimmung ergibt und die Datei mit der falschen Größe trotzdem nicht gelöscht wird.

    In der Version von 2014 gab es noch den (achten) optionalen Parameter :

    Gibt es einen Grund, warum Du den aus der aktuellen Version entfernt hast ?

    Gute Frage...

    Ich befinde mich derzeit im Urlaub (Helgoland) und habe nur den "kleinen" Rechner hier. Ich weiß gar nicht mehr, warum ich den entfernt hatte.

    Vielleicht hielt ich das für überflüssig. Findest Du den Parameter wichtig?

  • Gute Frage...

    Ich befinde mich derzeit im Urlaub (Helgoland) und habe nur den "kleinen" Rechner hier.

    Dann genieße erst mal den Urlaub - das ist viel wichtiger 8) .

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."