Webseite mit WebRequest auslesen -> Fehler 403

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von MrNicolas3003.

    Webseite mit WebRequest auslesen -> Fehler 403

    Hallo, ich möchte mittels WebRequest den Quelltext einer Internetseite (in diesem Fall Fakerscript) auslesen. Ich will so etwas wie das da machen: Apache Fake Identity Jedoch bekomme ich von dem Programm eine Fehlermeldung zurück:


    Ich benutze hierfür eine Klasse die ich wie folgt aufrufe:

    VB.NET-Quellcode

    1. With New Http
    2. Dim html As String = String.Empty
    3. html = .GetResponse("http://www.fakerscript.tk/?data=de")
    4. System.IO.File.WriteAllText("meinedatei.xml", html)
    5. End With



    Hier die Klasse:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Containa As CookieContainer = New CookieContainer
    2. Dim cookieCon As New CookieContainer
    3. Public Class Http
    4. Dim cookieCon As New CookieContainer
    5. Dim request As HttpWebRequest
    6. Dim response As HttpWebResponse
    7. Public Function GetResponse(ByVal url As String) As String
    8. request = CType(HttpWebRequest.Create(url), HttpWebRequest)
    9. request.CookieContainer = cookieCon
    10. response = CType(request.GetResponse(), HttpWebResponse)
    11. Return New StreamReader(response.GetResponseStream()).ReadToEnd()
    12. End Function
    13. Public Function GetResponse(ByVal url As String, ByVal post As String) As String
    14. request = CType(HttpWebRequest.Create(url), HttpWebRequest)
    15. request.Method = "POST"
    16. request.CookieContainer = cookieCon
    17. request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; rv:8.0) Gecko/20100101 Firefox/8.0"
    18. request.ContentType = "application/x-www-form-urlencoded"
    19. Dim byteArr() As Byte = Encoding.Default.GetBytes(post)
    20. request.ContentLength = byteArr.Length
    21. Dim dataStream As Stream = request.GetRequestStream()
    22. dataStream.Write(byteArr, 0, byteArr.Length)
    23. response = CType(request.GetResponse(), HttpWebResponse)
    24. Return New StreamReader(response.GetResponseStream()).ReadToEnd()
    25. End Function
    26. End Class




    Wisst ihr woran das liegt? Oder habt ihr eine alternative wie man das sonst noch lösen könnte? Ich habe es auch schon über ein WebBrowser-Control versucht, aus dem ich den Quelltext der aktuell geladenen Seite auslese, allerdings erhalte ich dann eine andere Fehlermeldung.

    MfG MrNicolas3003
    Wenn man eine Webseite im Browser (oder über ein Browser-Steuerelement) ansteuert, passieren ein paar mehr Dinge im Hintergrund als dass "nur" eine Verbindung zum Webserver auf Port 80 aufgebaut wird, irgendwelche Standard-http-Header wie Content-Type, UserAgent o.ä. gesendet und dann der Inhalt mit Get <xyz> angefordert werden.

    Die von dir gezeigte Fehlermeldung deutet darauf hin, dass der Webserver dir die Auslieferung des angeforderten Inhalts verweigert und stattdessen mit Statuscode 403 antwortet, wodurch das WebClient-Objekt eine Exception auslöst. Warum der Server die Auslieferung verweigert, darüber kann man nur noch spekulieren. Entweder gefällt ihm der UserAgent-Header nicht (oder er fehlt ihm), oder er erwartet einen Header, der ihm sagt, von welcher Seite du ursprünglich kommst (manche Serverbetreiber wollen damit für bestimmte Seiten verhindern, dass sie auf fremden Webservern in ein Frame entführt werden können - als Beispiel), oder der Server prüft das Vorhandensein irgendwelcher Cookies, die dein WebClient aber nicht sendet bzw. nicht senden kann.

    Wie gesagt... da kann ich nur raten und nicht wirklich helfen.
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.
    versteh zwar nich was das mit javascript zu tun haben sollte, aber versuch ma folgende header:

    Quellcode

    1. private $_headers = array(
    2. 'user-agent' => 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.3) Gecko/20121108 Firefox/15.3 PaleMoon/15.3',
    3. 'accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    4. 'accept-language' => 'en-us,en;q=0.5',
    5. 'accept-encoding' => 'gzip',
    6. 'connection' => 'Keep-Alive'
    7. );

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

    windowsfan schrieb:

    warscheinlich brauchst du javascript
    Besser keine Ratschläge als komplett falsche Ratschläge. Wenn der Server 403 zurück gibt, was soll das bitteschön mit javascript zu tun haben? Javascript läuft zu 100% auf dem client. Sprich javascript läuft, nachdem der Server dir die Seite liefert => was also soll javascript damit zu tun haben.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    hm habs selbst nochma mit webrequest/webclient versucht aber bin grad zumüde den fehler zu suchen ...
    mit tcpclient gehts jedenfalls

    VB.NET-Quellcode

    1. Dim str As String = "GET http://www.fakerscript.tk/ HTTP/1.1" & vbCrLf & _
    2. "Host : www.fakerscript.tk" & vbCrLf & _
    3. "User-Agent: Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:24.0) Gecko/20130926 Firefox/24.0 PaleMoon/24.0.2" & vbCrLf & _
    4. "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" & vbCrLf & _
    5. "Accept-Language: en-US,en;q=0.5" & vbCrLf & _
    6. "Accept-Encoding : gzip, deflate" & vbCrLf & _
    7. "Connection: keep-alive" & vbCrLf & vbCrLf
    8. Dim aaaa As New System.Net.Sockets.TcpClient("www.fakerscript.tk", 80)
    9. aaaa.Client.Send(System.Text.Encoding.UTF8.GetBytes(str))
    10. Dim buf(10000) As Byte
    11. While (aaaa.Client.Receive(buf))
    12. MsgBox(System.Text.Encoding.UTF8.GetString(buf))
    13. End While
    Okay alles klar :) vielen dank !

    Ich probiere das mit dem TCPClient im Laufe des Tages mal aus und gebe dann Rückmeldung :)

    Bis dahin
    MrNicolas3003

    EDIT:

    Also ich habe den Code mal ausprobiert. Er funktioniert... mehr oder weniger :D

    Und zwar macht er das was er soll, jedoch liefert der Server eine "Bad Request":


    Bzw. hier der zurückgelieferte Quelltext:


    Nun vermute ich, dass das dem Fehler 403 entspricht. Ist das richtig?
    Außerdem hab ich noch eine Frage zu dem TCPClient! Kan ich mir auch nur den Quelltext der Internetseite ausgeben lassen? Weil in dem Fall habe ich ja 2 MessageBoxen bekommen, allerdings möchte ich nur die 2. :D

    Solangsam habe ich das gefühl, dass es am Header liegt. Mit einer Android App (Header Inspector Lite) hat der TCPClient nämlich funktioniert und den Status 200: OK zurückgegeben. Kann das sein?

    MfG MrNicolas3003

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „MrNicolas3003“ () aus folgendem Grund: NEUIGKEITEN!

    Komisch, das hier klappt bei mir wunderbar:

    VB.NET-Quellcode

    1. Using wc As New WebClient()
    2. With wc.Headers
    3. .Add("Host", "www.fakerscript.tk")
    4. .Add("User-Agent", "Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:24.0) Gecko/20130926 Firefox/24.0 PaleMoon/24.0.2")
    5. .Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
    6. .Add("Accept-Language", "en-US,en;q=0.5")
    7. .Add("Accept-Encoding", "gzip, deflate")
    8. '.Add("Connection", "keep-alive")
    9. End With
    10. Dim str = wc.DownloadString("http://www.fakerscript.tk/")
    11. Debug.Print(str)
    12. End Using
    Lediglich den Header "Connection" musste ich auskommentieren, weil ich sonst eine Exception bekam, in der irgendwas davon stand, dass mit der Art der Verbindung keep-alive und close nicht unterstützt würden.
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.
    Jep, Stichwort "virtuelle Webserver", d.h. mehrere Web-Server unter einer IP. Dann wird mit Hilfe des Host-Headers bestimmt, welcher der unter der aufgelösten IP-Adresse verfügbaren Webserver eigentlich angesprochen werden soll. Wenn der dann fehlt, klappts natürlich nicht, und es gibt so Fehlermeldungen wie "403 Forbidden" etc.
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.
    Okay, erstmal vielen Dank an euch :) Es funktioniert soweit.

    Jetzt habe ich nur noch ein Problem, und zwar lasse ich mir das Ganze in eine XML- sowie in eine HTML-Datei speichern mit IO.File.WriteAllText.

    Allerdings erscheint bei der HTML-Datei das:


    und bei der XML-Datei soetwas:



    Ich habe daran gedacht, dass es vllt. etwas mit Encoding zu tun hat und habe dem WebClient die Encoding-Eigenschaft einmal mit UTF8 und danach einmal mit ASCII zugewiesen, beides jedoch ohne Erfolg.