Anything2MP3 - Musik downloaden

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Radinator.

    Anything2MP3 - Musik downloaden

    Hallo ihr da draußen,
    ich hab da mal eine kleine Frage. Eher gesagt ein Problem :D:

    Ich hab mir zur Aufgabe gemacht, ein kleines Programm zu erstellen, mit dem ich Lieder über die Webseite Anything2MP3 downloaden kann. Mein Problem auf das ich jetzt jedoch stoße ist das, dass der Download Button nur aus einem href Attribut besteht.
    Meine Idee hierbei war bis jetzt, dass ich eben die Seite durchsuche, nach Attributen mit href. Da kamen glaub ich 15 Ergebnisse - eins davon war mein benötigter Link. Nun dachte ich mir, da beim Download Link "/system/files/" immer enthalten ist, dass ich danach die ganzen Links filtriere. Dabei scheitert es bei mir jedoch. Ich weiß nicht wie ich das anstellen sollte.
    Das ganze ist bis jedoch nur ein Gedanke von mir, sprich ich kann keinen Quellcode bereitstellen, der hier notwendig ist.

    Ich hoffe, mir kann hier jemand helfen. Egal ob mit meiner Methode, wo ich in Gedanken durch gehe oder auch mit einer anderen Methode.
    Ich weiß echt nicht mehr weiter :thumbdown:


    Danke schon mal im Vorraus

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

    Dragonblf schrieb:

    sprich ich kann keinen Quellcode bereitstellen, der hier notwendig ist.

    Dragonblf schrieb:

    Meine Idee hierbei war bis jetzt, dass ich eben die Seite durchsuche, nach Attributen mit href. Da kamen glaub ich 15 Ergebnisse


    Die zwei Aussagen schließen sich aus. Hast du jetzt schon eine Code-Basis, die ned funzt oder hast du bisher nur auf der Seite dir den Quellcode angesehen?
    Und Btw: Ich hab mir den Code jetzt keine 2 Minuten durchgelesen und hab gesehen, dass der Konvert-Button eine eindeutige ID hat.

    Da ich ja ein freundlicher Mensch bin, der es hasst, anderen die Hilfe zu verweigern, verweise ich hier einmal auf die HtmlDocument-Klasse und die Methode GetElementById.

    Lg Radinator
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    Hab gerade nicht die Möglichkeit, eine Konvertierung zu starten.

    Also so wie ich des jetzt lese ergibt sich folgende Problem:
    Nachdem du ein Video/was auch immer konvertiert hast, erscheint eine Seite, in der du als denkender Mensch (ich gehe mal davon aus) recht zentral einen Button siehst, auf dem "Download" oder änliches steht, siehst.
    Da die Seite ein automatisiertes Downloaden verhindern will, haben die Seitenbetreiber zig (in dem Fall ~15) weiter Buttons, die die selbe ID und den Selben Inhalt haben, auf die Seite gepackt. Du hast jetzt aber die Schwierigkeit die 15 veschiedenen Buttons auseinander zu halten.

    Da ich die Seite bisher nicht kannte und wie gesagt auch im Moment keine Möglichkeit habe, das ganze zu testen, kann ich dir jetzt so aus dem Stand heraus folgendes mit auf dem Weg geben:
    Da die Methode GetElementById() als Parameter die ID eines HTML-Elements nimmt und als Rückgabewert ein Objekt des Types Html-Element zurück gibt, welches die typischen Html und CSS-Eigenschaften hat, kannst du versuchen dir einfach ein Element geben zu lassen.

    Um dir jetzt keinen Schwachsinn einzureden, muss ich eines klarstellen: In einem HTML-Dokument kann es immer nur ein Element mit einer bestimmten ID geben, deswegen ja auch ID! Was es mehrfach geben kann, ist ein class-Bezeichner.
    Daher solltest, du eher die Funktion GetElementsByTagName() verwenden, wenn du mehrer Elemente zu erwarten hast. Die Funktion gibt dir dann eine Liste von HtmlElementen (HtmlElementCollection) zurück. Diese kannst du dann mit einer Schleife durchsuchen und mittels der Style-Property, welche dir die CSS-Eigenschaften (Höhe, Breits, Farbe,...) liefert, dir deinen gesuchten Button raus suchen.

    Falls du genauere Erläuterungen brauchst, wie die Methoden einzusetzen sind, bitte Link folgen und MSDN ansurfen.

    Lg Ratinator
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    Ich persönlich hab mal meine Variante hier genutzt, ob diese so gut ist, weiß ich nicht. Ich finde jetzt den Link auf der Website, aber habe trz ein Problem. Und zwar, ich kann den Downloadlink einfach in keine Variable machen, geschweige den überhaupt zu kopieren. Weiß nicht wo gerade mein Fehler ist, ist bestimmt aber nur so ein kleiner Dummheitsfehler. Nichts desto trotz bekomm ich es einfach nicht gebacken.
    Ich hab ihr einfach mal den Code von meinem Fortschritt hier mit rein gepackt.

    Spoiler anzeigen

    Visual Basic-Quellcode

    1. Private Sub WebBrowser1_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
    2. Dim PageElements As HtmlElementCollection = WebBrowser1.Document.GetElementsByTagName("a")
    3. Dim DownLink As String = ""
    4. For Each CurElements As HtmlElement In PageElements
    5. TextBox2.Text = TextBox2.Text & CurElements.GetAttribute("href") & Environment.NewLine
    6. TextBox2.SelectionStart = 27
    7. TextBox2.SelectionLength = 13
    8. If TextBox2.SelectedText = "system/files/" Then
    9. DownLink = TextBox2.Text
    10. MsgBox(DownLink)
    11. TextBox2.Text = ""
    12. End If
    13. TextBox2.Text = ""
    14. Next
    15. End Sub
    @Dragonblf Als eersten Befehl Deiner For-Schleife hängst Du eine Zeile an TextBox2 an, als letzten Befehl Deiner For-Schleife löschst Du die TextBox2. Ist das so gewollt?
    Ansonsten musst Du nix selektieren, sondern kannst das mit .SubString(...) und ohne textBox genau so gut abfragen:

    VB.NET-Quellcode

    1. Private Sub WebBrowser1_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
    2. Dim PageElements As HtmlElementCollection = WebBrowser1.Document.GetElementsByTagName("a")
    3. Dim DownLink As String = ""
    4. For Each CurElements As HtmlElement In PageElements
    5. Dim txt = CurElements.GetAttribute("href") & Environment.NewLine
    6. If txt.Substring(27, 13) = "system/files/" Then
    7. DownLink = txt
    8. MsgBox(DownLink)
    9. End If
    10. Next
    11. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich würde an deinem Code sowie anders machen.
    Da ich wie bereits gesagt habe, es einen Unterschied gibt, zwischen ID und Class, wäre es sinnvoll (von dir) dich erst einmal genauer mit der Seite auseinander zu setzten.

    Hierzu als erstes einmal den Bezeichner des Input-Feldes für die YT URL und des Konvertiere-Buttons heruasfinden. Das Input-Feld kannst du dann über GetElementById() ansprechen. Anschließend mit .Value befüllen (bitte auf MSDN nachlesen). Auf dem Button kannst du dann ein click-Event "invoken". Wenn du dann auf der zweiten Seite gelandet bist, brauchst du nur noch die eindeutige ID des Download-Links herausfinden.
    Je nachdem ob es nur ein Button ist, der dir den Download starte oder ein direkter Link ist, kannst du ensprechend reagieren.
    Wenn es ein Button oder ein Link mit einer eindeutigen ID ist, dann einfach GetElementById auf der neuen Seite aufrufen. Sollte es sich aber um einen Button oder einen Link ohne eindeutiger ID also nur mit einem Class-Identifier handeln, wirst du wohl oder übel per GelElementsByTagName verwenden müssen und dich durch-hangeln müssen.

    Und zu deinem Code-Snippet: Wer sagt dir denn, dass das "system/files" immer an Position 13 bis 27 steht? IMHO ist es besser string.Contains("system/files") zu verwenden.

    Lg Radinator
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell