Download einer Datei wobei der Link dynamisch erzeugt wurde

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Prive.

    Download einer Datei wobei der Link dynamisch erzeugt wurde

    Hallo Gemeinde

    Besser wusste ich die Überschrift nicht zu formulieren.
    Ich habe eine Webseite vor mir von der ich Dateien downloaden möchte. Das Problem stellt sich für mich das ich keinen Downloadlink zur verfügung habe. Die Seite selbst lade ich ganz normal per Webrequest und zerlege was ich brauche mit RegEx.
    Ich habe praktisch keine Ahnung von Webseitenprogrammierung daher hänge ich etwas in der Luft wie hier die interaktion mit dem php abläuft.

    erstmal der Code des Downloadbuttons der Webseite:

    VB.NET-Quellcode

    1. <form action="downloads.php?view=load&amp;df_id=42&amp;modcp=0&amp;cat_id=6" method="post" name="download">
    2. <table width="100%" cellspacing="0" cellpadding="0" border="0">
    3. <tr>
    4. <td align="center">
    5. <input type="submit" value="Download" class="mainoption" />
    6. <input type="hidden" name="hotlink_id" value="2a9f56b3f65f8f0be37b4d217b1d1825" />
    7. </td>
    8. </tr>
    9. </table>
    10. </form>


    Die Webseite selbst: ahnenblattportal.de/downloads.php?view=detail&df_id=42

    Der Value Wert (value="2a9f56b3f6....) dürfte wohl wichtig sein da die Seite mit DownloadKontingenten arbeitet. Wenn auch grad nicht aktiviert und free User dürfen auch laden (glaub ich)

    Eigenen VB Code habe ich noch gar keinen bis auf den hier:
    http://msdn.microsoft.com/de-de/library/456dfw4f.aspx

    Es muss ein Click auf den Button ausgelöst werden und der (darauf gesendete?) Stream sollte als Datei gespeichert werden.

    Wie gesagt weiss ich das Problem nicht so richtig in Worte zu fassen bzw wonach ich hier eigendlich googlen könnte.
    Die meisten Bsp gehen leider von einer bekannten url aus.

    Danke und Gruß
    Du willst den Butten drücken


    VB.NET-Quellcode

    1. Private Sub Button12_Click(sender As Object, e As EventArgs) Handles Button12.Click
    2. Dim All_Elements As HtmlElementCollection = WebBrowser1.Document.All
    3. For Each Element As HtmlElement In All_Elements
    4. If Element.GetAttribute("value") = "Download" Then
    5. Element.InvokeMember("click")'oder submit
    6. End If
    7. Next
    Jain

    Ich benutze kein Webbrowser Steuerelement. Gut ich könnte eins unsichtbar hintenrum benutzen (Kann man clicks auf unsichtbare Elemente auslösen?).
    Allerdings kommt dann der "Downloaddialog" wo ich die Datei speichern möchte usw.

    Es sollte aber "vollautomatisch" ablaufen.
    Daher denke ich per Request ist das ne saubere Sache. Nur wie?
    @TVX
    Ist ja merkwürdig. Habs auf der Seite gerade als unregistrierter Probiert zu laden und es geht.

    @LaMiy
    Danke. Hab ich schon alle durch. Nur gehen diese auch von einer bekannten Download URL aus. Mein Grundproblem ist hier das ich nur die URL von den DownloadSeiten habe und erst beim Klick auf "Download" der Server die dynamisch erzeugte URL der Datei schickt.
    so habe jetzt hier mal reingeschaut:
    [VB.NET] HttpWebRequest Tutorial (Für anfänger)

    und den http header mitgeschnitten. ist im screenshoot.

    Aufgrund dessen habe ich dann mal was zusammengebaut:

    VB.NET-Quellcode

    1. Friend Sub download(ByVal url As String, ByVal pfad As String)
    2. 'hotlink id wert auslesen. eigene funktionen welche per regex die daten liefern
    3. Dim inhalt As String = read_Seite(url, System.Text.Encoding.UTF8)
    4. Dim hotlink_id As String = readFirstMatch(inhalt, "hotlink_id"" value=""(.*?)"" />")
    5. Dim request As HttpWebRequest = HttpWebRequest.Create(url)
    6. request.Method = "POST"
    7. Dim postData As String = "hotlink_id=" & hotlink_id
    8. Dim byteArray As Byte() = Encoding.UTF8.GetBytes(postData)
    9. request.ContentType = "application/x-www-form-urlencoded"
    10. request.ContentLength = byteArray.Length
    11. request.AllowAutoRedirect = True
    12. 'get request stream.
    13. Dim dataStream As Stream = request.GetRequestStream()
    14. dataStream.Write(byteArray, 0, byteArray.Length) ' Write the data to the request stream.
    15. dataStream.Close()
    16. ' Get the response.
    17. Dim response As WebResponse = request.GetResponse()
    18. ' Get the stream containing content returned by the server.
    19. dataStream = response.GetResponseStream()
    20. 'schreiben
    21. Dim fs As New FileStream(pfad, FileMode.Create)
    22. Dim read As Byte() = New Byte(255) {}
    23. Dim count As Integer = dataStream.Read(read, 0, read.Length)
    24. While count > 0
    25. fs.Write(read, 0, count)
    26. count = dataStream.Read(read, 0, read.Length)
    27. End While
    28. dataStream.Close()
    29. response.Close()
    30. End Sub


    geht ja auch fast.
    Allerdings speichert mir das Konstrukt nur die Webseite selbst ab und nicht den Download
    Bilder
    • webr.PNG

      30,15 kB, 697×612, 204 mal angesehen
    habe jetzt noch ein anderes Bsp in C# gefunden

    techcoil.com/blog/downloading-…p-post-and-http-get-in-c/


    Der HTTP Post abschnitt entspricht genau das was ich auch mache. Die Id (hotlink_id) in der Post Data übertragen und als Response wird die Datei erwartet.
    Es ist im Prinzip das gleiche was ich jetzt schon habe. Habe es getestet und funktioniert leider auch nicht. Ich habe im Response immer die Webseite statt der Datei drin.
    Also WebRequest selbst hab ich noch einige mühe an meinem letzten für jou tube bastelte ich recht lange ...
    Das normale zugreifen und steuern von Webseiten wiederum komm ich gut klar damit weil ich mich da schon durchgekämpft hab

    Ich hab mir jetzt mal alles geladen was ne gute Erklärung dazu bringt um den Vorgang in sich besser zu verstehen !

    Ich grab mich mal weiter durch ....

    LG Andre.
    Habe einen Fehler in meiner herangehensweise gefunden mein ich.
    Die "hotlink_id" ändert sich bei jedem Seitenaufruf.
    Und ich benutze 2 Webrequest!
    Beim erste lese ich die Seite aus und regexe die id. (unter der Methode "read_seite". zeile 3)
    Beim zweiten sende ich das ganze mit den POST.
    In dem zweiten Request hat sich die ID aber wieder geändert und daher denke ich die Seite akzepiert die erste ID nicht mehr. Oder jedenfalls nicht in der "Session".

    Bin grad am grübeln wie ich das ganze mit einem Request löse.
    Wenn ich aber die Seite abgefragt habe kann ich die POST Daten wie
    ContentLength und ContentType nicht mehr ändern.
    Also das Senden nachdem ich schon abgefragt habe macht mir gerade Probleme

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Prive“ ()