HttpWebRequest Tutorial für Anfänger+Fortgeschrittene

    • VB.NET

    Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Mantrayana.

      HttpWebRequest Tutorial für Anfänger+Fortgeschrittene

      Hallo ,

      Daher immer wieder Leute Probleme mit HttpWebRequest haben , möchte ich es den Anfängern und Fortgeschrittenen nochmal näherbringen.
      Mir ist bewusst das es bereits ein Tutorial gibt.

      In diesem Beispiel werde ich euch zeigen , wie Ihr euch auf der Seite SchülerVz einloggt.

      Was ihr natürlich braucht:
      Live HTTP Headers (Download):
      addons.mozilla.org/de/firefox/addon/3829

      Ihr geht erstmal auf die Seite schülervz.net und gebt eure Benutzerdaten ein.

      Ihr öffnet LiveHttpHeaders und guckt , ob sich ein Häckchen bei Mitschneiden befindet.



      Ihr lasst LiveHttpHeaders offen , und klickt auf den SchülerVz Login Button.

      Jetzt solltet ihr das hier in LiveHttpHeaders finden:




      Das rote ist die Website die ihr für den HttpWebRequest braucht.

      Das blau umrandete , das sind die Informationen für den Request.

      Wichtig für den Request ist:


      -Ein Cookiecontainer
      -Allowautoredirect = true
      -Die Methode ( ihr seht POST /Login HTTP/1.1) also ist die Methode POST
      -Der Host: secure.schuelervz.net ' Ihr müsst darauf achten , nicht jede Seite braucht den Host d.h. es kann ggf. zu Fehlern führen.
      -Der Useragent: Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8
      -Der Content-Type : application/x-www-form-urlencoded
      -Die Content-Length : Post.length ' sprich genauso lang wie der Post


      Natürlich der Post :

      HTML-Quellcode

      1. email=Username%40hotmail.de&password=PASSWORT&ipRestriction=1&login=Einloggen&jsEnabled=true&formkey=bd0c34ba948f40117e0511788e5dfe982951501380a5e463e14616942f9edd59aa1ec4c9a859440312b442b06ee09f4b78856dc0b6be9c83582b8867d4b9ce23b4c6b93da582bd2787025bf3dc4a9ac78f5f1c103349d10fc186595bf9efdf83&iv=d6ae3ad6521c0da45bc0551e75e43040


      In diesem Fall hat man diesen typischen Formkey & einen Iv Key.

      Diese 2 Werte, findet ihr indem ihr auf der Seite Strg+U drückt ( um in den Quelltext zu gelangen ) , dann Strg+F und unten links in der Suchleiste Formkey eingibt.



      Jetzt gehts mit dem Code los.

      Ihr importiert:

      VB.NET-Quellcode

      1. System.Net , System.IO , System.Text.RegularExpressions


      Jetzt deklariert ihr zuerst einmal unter Public Class Form1 ( sprich global ) den Cookiecontainer.

      Euer code sollte jetzt so aussehen:

      VB.NET-Quellcode

      1. Imports System.Net, System.IO, System.Text.RegularExpressions
      2. Public Class Form1
      3. Private Containa = New Cookiecontainer


      Jetzt braucht ihr einen Webclient, der euch den Quelltext runterlädt , dann muss man den Formkey & Iv rausfischen.Das geht per Regex.

      VB.NET-Quellcode

      1. Dim Source As String = New WebClient().DownloadString("https://secure.schuelervz.net/Login") ' Downloadet den Quelltext der Seite.
      2. Dim FormKey As String = Regex.Match(Source, "formkey"" value=""([^""]+)""").Groups(1).Value ' Regex für den Formkey
      3. Dim Iv As String = Regex.Match(Source, "iv"" value=""([^""]+)""").Groups(1).Value ' Regex für die IV


      Dann erstellt ihr einen Request und gebt ihm die Informationen aus LiveHttpHeaders.

      VB.NET-Quellcode

      1. Dim R As HttpWebRequest = HttpWebRequest.Create("https://secure.schuelervz.net/Login") ' Request erstellen
      2. R.Method = "POST" ' Ihr gebt die Methode an
      3. R.CookieContainer = Containa ' Hier gebt ihr den Cookiecontainer an
      4. R.Host = "secure.schuelervz.net" ' Ihr gebt bei dieser Seite den Host an
      5. R.Headers("useragent") = "Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8" ' Hier gebt ihr den Useragent an.Nicht nur dieser funktioniert es gibt sehr viele die Ihr angeben könnt.
      6. R.ContentType = "application/x-www-form-urlencoded" ' Der ContentType , sehr wichtig.
      7. Dim Post As String = "email=EUREEMAIL%40hotmail.de&password=EUERPASSWORT&ipRestriction=1&login=Einloggen&jsEnabled=true&formkey=" &
      8. FormKey & "&iv=" & Iv ' Das ist euer Post. Den Formkey & Iv müsst ihr natürlich durch den geregexten ersetzen.
      9. R.ContentLength = Post.Length ' Die Content Length könnt ihr natürlich erst nach der Post Variable angeben.


      Das Posten & auslesen:

      VB.NET-Quellcode

      1. Dim Writer As New StreamWriter(R.GetRequestStream(), System.Text.Encoding.ASCII) ' Erstellt einen Streamwriter der in den Stream schreibt, mit dem Textencoding Ascii.
      2. Writer.Write(Post) ' Hiermit wird euer Post in den Stream geschrieben.
      3. Writer.Close() ' Streamwriter schließen , damit er nicht unendlich weiterschreibt.
      4. Dim Reader As New StreamReader(R.GetResponse.GetResponseStream()) ' Erstellt einen Streamreader der euren Stream ausliest.
      5. Dim Response As String = Reader.ReadToEnd ' Der Streamreader soll den Stream bis zum Ende auslesen und zwar in die String Variable Response.
      6. Reader.Close() ' Streamreader wieder schließen , damit er nicht unendlich weiterliest.
      7. If Response.Contains("Meine Startseite") Then
      8. MessageBox.Show("Erfolgreich eingeloggt!")
      9. Else
      10. MessageBox.Show("Login fehlgeschlagen!")
      11. End If


      'Jetzt könnt ihr zum Test die Response in eine RichTextBox einfügen.
      RichTextBox1.Text = Response
      ' Ihr solltet jetzt schon eingeloggt sein ^^

      Nochmal zum Kontrollieren , euer Code sollte am Ende so aussehen:

      VB.NET-Quellcode

      1. Imports System.Net, System.IO, System.Text.RegularExpressions
      2. Public Class Form1
      3. Private Containa = New Cookiecontainer
      4. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      5. Dim Source As String = New WebClient().DownloadString("https://secure.schuelervz.net/Login")
      6. Dim FormKey As String = Regex.Match(Source, "formkey"" value=""([^""]+)""").Groups(1).Value
      7. Dim Iv As String = Regex.Match(Source, "iv"" value=""([^""]+)""").Groups(1).Value
      8. Dim R As HttpWebRequest = HttpWebRequest.Create("https://secure.schuelervz.net/Login")
      9. R.Method = "POST"
      10. R.CookieContainer = Containa
      11. R.Host = "secure.schuelervz.net"
      12. R.Headers("useragent") = "Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8"
      13. R.ContentType = "application/x-www-form-urlencoded"
      14. Dim Post As String = "email=EUREEMAIL%40hotmail.de&password=EUERPASSWORT&ipRestriction=1&login=Einloggen&jsEnabled=true&formkey=" &
      15. FormKey & "&iv=" & Iv
      16. R.ContentLength = Post.Length
      17. Dim Writer As New StreamWriter(R.GetRequestStream(), System.Text.Encoding.ASCII)
      18. Writer.Write(Post)
      19. Writer.Close()
      20. Dim Reader As New StreamReader(R.GetResponse.GetResponseStream())
      21. Dim Response As String = Reader.ReadToEnd
      22. Reader.Close()
      23. If Response.Contains("Meine Startseite") Then
      24. MessageBox.Show("Erfolgreich eingeloggt!")
      25. Else
      26. MessageBox.Show("Login fehlgeschlagen!")
      27. End If
      28. End Sub
      29. End Class



      Falls ihr bei einem Request den Fehler 417 erhaltet , sollte das hier helfen:

      VB.NET-Quellcode

      1. R.ServicePoint.Expect100Continue = False



      Ich hoffe das hilft euch.


      Kritik / Fragen ? bitte Posten.


      Mfg Kevin.

      Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „Smoove“ ()

      Guten Tag lieber "Gutelaunetyp",
      erstmal Danke für dein ausgesprochen gutes Tutorial, allerdings habe ich folgendes Problem:
      Ich denke mein Code sollte den POST-Befehl erfolgreich versenden, aber wenn ich versuche den Response zu überprüfen bekomme ich diesen Fehler,

      Quellcode

      1. Der Remoteserver hat einen Fehler zurückgegeben: (417) Expectation Failed.


      Auch dein Tipp hat nicht weitergeholfen! Der Code sieht aber auch etwas anders aus:

      VB.NET-Quellcode

      1. Request.ServicePoint.Expect100Continue = False
      2. Dim Response As HttpWebResponse = Request.GetResponse()
      3. DataStream = Response.GetResponseStream()
      4. Dim reader As New StreamReader(DataStream)
      5. Dim ServerResponse As String = reader.ReadToEnd()
      6. reader.Close()
      7. DataStream.Close()
      8. Response.Close()


      Mfg

      ~Pinkywesen