Über Console Webseiten inhalt auslesen und abfrage senden

  • VB.NET

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von Fakiz.

    Über Console Webseiten inhalt auslesen und abfrage senden

    Hallo,

    ich möchte gerne anhand console webseiten inhalt auslesen und in .txt abspeichern
    Zudem möchte ich in das Formularfeld (Webseite) Textfeld - Post senden
    Ist das übr console möglich ? Wenn ja wie?

    mfg
    Hallo,

    VB.NET-Quellcode

    1. Dim HtmlQuellText As String = ""
    2. Dim Web As WebRequest = WebRequest.Create("http://...")
    3. Dim Webr As WebResponse = Web.GetResponse()
    4. Dim WebStream As StreamReader = New StreamReader(Webr.GetResponseStream(), Encoding.ASCII)
    5. HtmlQuellText = WebStream.ReadToEnd
    6. Webr.Close()
    7. WebStream.Close()


    Nun würde ich gerne Formular ausfüllen

    HTML-Quellcode

    1. <input style="width: 255px;" autocomplete="off" id="txtEingabe" placeholder="Eingabe" name="q" class="has-default-text yui-ac-input defaulted">


    Dann soll Submit Button auf der Seite geklickt werden.

    VB.NET-Quellcode

    1. WebBrowser1.Document.GetElementById("Submit").InvokeMember("click")

    Da ich kein Webbrowser anwenden möchte, wüsste ich jetzt nicht wie ich das machen soll.

    Ich bitte um Hilfe

    mfg

    Ich muss ehrlich gestehen, dass ich damit garnicht klar komme.


    Ok. Vielleicht beschreibst du mal näher, womit du nicht klar kommst bzw. was du nicht verstehst?
    Ich vermute dir fehlen die Grundlagen zum Verständnis, wie HTTP funktioniert?

    VB.NET-Quellcode

    1. Dim request As WebRequest = WebRequest.Create("http://www.contoso.com/PostAccepter.aspx ")
    2. ' Set the Method property of the request to POST.
    3. request.Method = "POST"
    4. ' Create POST data and convert it to a byte array.
    5. Dim postData As String = "This is a test that posts this string to a Web server."
    6. Dim byteArray As Byte() = Encoding.UTF8.GetBytes(postData)


    Das ist im Grunde der entscheidende Teil. Es ist eigentlich alles schon gemacht. Das Einzige was dir jetzt wahrscheinlich nicht klar ist, was soll postData sein. Was kommt da rein???
    Nun. Bei jeder Form die du (wie du es normalerweise kennst über den Browser) an einen Webserver schickst, werden die von dir eingebenen Daten ja irgendwie an den Webserver übermittelt. Es gibt da 2 Methoden.
    POST und GET.
    Bei GET werden die Daten einfach an die URL gehangen. Also zum Beispiel eine Textbox mit dem Namen Search wird dann angehangen als /ieineseite.php?Search=Wiegehtdas
    Bei POST werden die Daten allerdings im HTTP Body mitgesendet. Daher müssen Sie als Byte an den Request Stream angehängt werden.

    VB.NET-Quellcode

    1. ' Set the ContentType property of the WebRequest.
    2. request.ContentType = "application/x-www-form-urlencoded"
    3. ' Set the ContentLength property of the WebRequest.
    4. request.ContentLength = byteArray.Length
    5. ' Get the request stream.
    6. Dim dataStream As Stream = request.GetRequestStream()
    7. ' Write the data to the request stream.
    8. dataStream.Write(byteArray, 0, byteArray.Length)
    9. ' Close the Stream object.
    10. dataStream.Close()
    11. ' Get the response.

    Auf den ContentType bzw ContentLength geh ich mal nicht näher ein (Length ist denk ich eh klar). Aber er ist erforderlich um festzulegen, welchen MIME Type der Body für den POST Request hat. ContentType und Length sind HTTP Header. Übernimm es einfach, und wenn du mehr darüber wissen willst, dann belies dich. An der Stelle ist der Request fertig und du kannst diesen als Streamobjekt lesen um den Content, also im Beispiel "search=Wiegehtdas" an den Request anzuhängen. Danach wird der komplette Request an den Webserver gesendet:

    VB.NET-Quellcode

    1. ' Get the response.
    2. Dim response As WebResponse = request.GetResponse()


    Dieser weiß dann anhand des Contenttypes, des Requesttypes und der Contentlength, wie er die Daten zu interpretieren hat und im PHP Script oder wie auch immer das Serverseitig verarbeitet wird, kann der Webserver mit den Daten arbeiten und entsprechend eine neue Webseite zurücksenden. Diese kannst du nun in der Console anzeigen, auch wenn diese nicht wirklich dafür geeignet ist, da Sie ja keine HTML oder JavaScript Engine hat, um die Webseite Userfriendly darzustellen. Du siehst halt den kompletten Response.

    VB.NET-Quellcode

    1. ' Get the stream containing content returned by the server.
    2. dataStream = response.GetResponseStream()
    3. ' Open the stream using a StreamReader for easy access.
    4. Dim reader As New StreamReader(dataStream)
    5. ' Read the content.
    6. Dim responseFromServer As String = reader.ReadToEnd()
    7. ' Display the content.
    8. Console.WriteLine(responseFromServer)


    LG
    Das ist meine Signatur und sie wird wunderbar sein!

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Mono“ ()

    Hi,

    Super erklärung. Einfach klasse. Es hat geklappt.

    Nun hätte ich eine frage zum filtern:

    VB.NET-Quellcode

    1. Dim result As New Regex("<h2>(?<string>(.*?))</h2>")
    2. Dim output As String = result.Match(ServerResponse).Groups("string").ToString()


    Es wird zwar ausgelesen und angezeigt ... nun möchte ich gerne den Inhalt
    Result + output

    HTML-Quellcode

    1. <pre></pre>


    Wie kann ich das am besten machen ?


    mfg
    Nun möchte ich gerne genau den Inhalt wieder ausgeben
    Die wird dann bei der Abfrage mitgeteilt.

    kurz gesagt, möchte ich den Output html wieder ausgeben
    die beginnt mit <h2>Log</h2> <pre>text... etc ...

    mfg

    Ich muss mich kurz korrigieren. Wie kann ich denn alle html tags rausschneiden?

    Push nach 4 Stunden? Dafür gibt es die "Bearbeiten"-Funktion.
    => Beiträge zusammengefügt // ~Trade

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

    hi,

    habe in listbox einträge die dann in schleife prüft ...

    Quellcode

    1. Additional information: Der Remoteserver hat einen Fehler zurückgegeben: (403) Unzulässig.


    VB.NET-Quellcode

    1. Dim Response As HttpWebResponse = Request.GetResponse()


    sollte ich

    VB.NET-Quellcode

    1. try
    2. catch
    3. end try

    dafür verwenden?

    livius91 schrieb:

    VB.NET-Quellcode

    1. try
    2. catch
    3. end try
    verwendest Du nur dann, wenn Du explizit bekannte Exceptions abfangen musst, nicht jedoch für alle (anderen) Exceptions pauschal, schließlich willst Du ja Fehler beheben und nicht verschleiern.
    Du musst dann genau diese Exception abfangen.
    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!

    livius91 schrieb:

    wenn wirklich ein fehler auftaucht
    Dann musst Du das so machen.
    Allerdings ist das kein Grund, pauschal alle Exceptions abzufangen.
    Z.B. ist es sinnvoll, Access-Exceptions abzufangen, wenn Du alle Dateien der Festplatte auflisten willst, denn in bestimmten Verzeichnissen hast Du keine Zugriffsrechte.
    Überleg Dir, ob die farbliche Codierung ggf. eine Fehlinformation darstellt, an meinem Beispiel wäre das z.B. der Unterschied zwischen "Ich habe auf dieses Verzeichnis keinen Zugriff" und "Die von mir gesuchte Datei ist nicht vorhanden".
    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!
    Richtig, du musst die System.Net.WebException abfangen. Anschliessend kannst du dessen Status abfragen und darauf reagieren.

    PS: Du kannst natürlich auch den ExceptionStatus in ein (HttpWebResponse) Casten um so an den HttpStatusCode zu kommen, damit hättest du dann z.B. '403' bei Forbidden.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Fakiz“ ()

    hi,

    ich weiss nicht was ich da gemacht habe ..nun will schleife nicht richtig funktionieren

    VB.NET-Quellcode

    1. Dim Request As HttpWebRequest = CType(WebRequest.Create(Item.Text), HttpWebRequest)
    2. Request.Method = "POST"
    3. Request.ContentType = "application/x-www-form-urlencoded"
    4. Dim Post As String = "textbox=" & Me.txtbox.Text
    5. Dim byteArray() As Byte = Encoding.UTF8.GetBytes(Post)
    6. Request.ContentLength = byteArray.Length
    7. Dim DataStream As Stream = Request.GetRequestStream()
    8. DataStream.Write(byteArray, 0, byteArray.Length)
    9. DataStream.Close()
    10. Dim Response As HttpWebResponse = Request.GetResponse()
    11. DataStream = Response.GetResponseStream()
    12. Dim reader As New StreamReader(DataStream)
    13. Dim ServerResponse As String = reader.ReadToEnd()
    14. reader.Close()
    15. DataStream.Close()
    16. Response.Close()
    17. Next


    Es soll in der Listview bzw. Listbox in schleife alles prüfen
    Nun geht es nicht mehr
    Aber wenn ich msgbox
    nach

    VB.NET-Quellcode

    1. For Each Item As ListViewItem In lstItems.Items
    einfüge, dann gehts.

    mfg
    Ich kann im moment nur erahnen was du meinst, die schleife läuft nur wenn du gleich danach eine MessageBox einbaust? Ich dachte du willst das ganze über Konsole ausgeben :huh: Bist du nun in winforms?

    Spoiler anzeigen

    Benutzung der unten stehenden Methode SendWebRequest(string url)

    VB.NET-Quellcode

    1. 'Die Liste repräsentiert deine Listbox oder was auch immer...
    2. Dim targetUrls As New List(Of String)()
    3. targetUrls.Add("http://www.google.de")
    4. targetUrls.Add("http://www.wieistmeineip.de/")
    5. targetUrls.Add("http://get-ip.de/de/faq/what-is-my-user-agent")
    6. For Each s As String In targetUrls
    7. If SendWebRequest(s) Then
    8. ' alles ok...
    9. Else
    10. ' fehler...
    11. End If
    12. Next



    Methode fürt den Webrequest aus und gibt True zurück wenn erfolgreich, false wenn fehlgeschlagen,
    ich habe keine wie String.Format bei vb aussieht aber geben müßte es das entzwischen.

    VB.NET-Quellcode

    1. Private Function SendWebRequest(url As String) As Boolean
    2. ' Post daten erstellen
    3. Dim bPostData As Byte() = Encoding.UTF8.GetBytes("page=index")
    4. ' Webrequest erstellen
    5. Dim request As WebRequest = HttpWebRequest.Create(url)
    6. request.ContentType = "application/x-www-form-urlencode"
    7. request.Method = WebRequestMethods.Http.Post
    8. request.ContentLength = bPostData.Length
    9. ' PostDaten schreiben
    10. Using stream As Stream = request.GetRequestStream()
    11. stream.Write(bPostData, 0, bPostData.Length)
    12. End Using
    13. Try
    14. ' Request senden
    15. Using response As WebResponse = request.GetResponse()
    16. Using sr As New StreamReader(response.GetResponseStream())
    17. ' Server hat geantwortet...
    18. Console.WriteLine("[ + ] Server antwort von: {0}" & vbLf & "{1}" & vbLf, url, sr.ReadToEnd())
    19. End Using
    20. End Using
    21. Catch ex As WebException
    22. ' Server antwortet nicht, msg ausgeben...
    23. If ex.Status = WebExceptionStatus.ConnectFailure Then
    24. Console.Write("[")
    25. Console.ForegroundColor = ConsoleColor.Red
    26. Console.Write("!")
    27. Console.ForegroundColor = ConsoleColor.Gray
    28. Console.Write("]")
    29. Console.WriteLine(" Der Server unter {0} antwortet nicht!" & vbLf & "Status Code: {1}", url, CInt(ex.Status))
    30. End If
    31. Return False
    32. End Try
    33. Return True
    34. End Function