Mit HttpWebRequest Post versenden

  • VB.NET

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von vico255.

    Mit HttpWebRequest Post versenden

    Nabend,
    ich versuche mich die ganze Zeit mit HttpWebrequest und es will nicht funktionieren.

    VB.NET-Quellcode

    1. Dim User = "xxx", Pwd = "xxx"
    2. Dim Request As HttpWebRequest = CType(WebRequest.Create("https://www.xxx.de/administrator/index.php"), HttpWebRequest)
    3. Request.Method = "POST"
    4. Request.Host = "www.xxx.de"
    5. Request.UserAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0"
    6. Request.ContentType = "application/x-www-form-urlencoded"
    7. Dim Post As String = "username=" & User & "&passwd=" & Pwd & "&lang=&option=com_login&task=login&return=aW5kZXgucGhw&7854d1ff8d4007d7060a5d94da756540=1"
    8. Dim byteArray() As Byte = Encoding.UTF8.GetBytes(Post)
    9. Request.ContentLength = byteArray.Length
    10. Dim DataStream As Stream = Request.GetRequestStream()
    11. DataStream.Write(byteArray, 0, byteArray.Length)
    12. DataStream.Close()
    13. Dim Response As HttpWebResponse = CType(Request.GetResponse(), HttpWebResponse)
    14. DataStream = Response.GetResponseStream()
    15. Dim reader As New StreamReader(DataStream)
    16. Dim ServerResponse As String = reader.ReadToEnd()
    17. reader.Close()
    18. DataStream.Close()
    19. Response.Close()
    20. MsgBox(ServerResponse)
    21. If CBool(InStr(ServerResponse, "Hilfe")) Then
    22. MessageBox.Show("Login OK")
    23. Else
    24. MessageBox.Show("Login nicht OK")
    25. End If


    Das der Post von FF Entwicklungsumgebung :

    Quellcode

    1. username=xxx&passwd=xxx&lang=&option=com_login&task=login&return=aW5kZXgucGhw&e5d568fac7cb9d52a75c7c93d3f4b2fd=1

    Kann mir wer sagen wo das Problem liegt ?
    Danke

    Edit // Komme immer wieder auf Login Seite, was ich anhand des HTML sehe.
    Edit 2 // Ich habe ein

    Quellcode

    1. 303
    2. See Other
    3. Die Antwort auf die durchgeführte Anfrage lässt sich unter der im
    4. „Location“-Header-Feld angegebenen Adresse beziehen. Der Browser soll
    5. mit einem GET folgen, auch wenn der ursprüngliche Request ein POST war.


    Wie kann ich da ein Get hinterher schieben?

    *Topic verschoben*
    Bilder
    • Unbenannt.PNG

      36,89 kB, 512×476, 182 mal angesehen
    In Arbeit...

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Verwende einen CookieContainer und häng ihn beim Post mit dran.
    Dann nach dem Post setze einen neuen GET Request mit dem selben Cookie Container an die angegebene Location.
    Damit sollte es im Normalfall funktionieren.

    LG
    Das ist meine Signatur und sie wird wunderbar sein!
    Du machst einen neuen WebRequest und setzt neuerRequest.CookieContainer = Response.Cookies. Die Location, also die URL, die du in deinem GET-Request setzen musst, kriegst du mittels Response.GetResponseHeader("Location").

    vico255 schrieb:

    Wird der Containa so gefüllt? Weil iwie kommt es mir so vor als wäre der immer leer ?!

    Der sollte in der Response gefüllt wieder ankommen.
    Twitch Viewer Display Chat-, Zuschauer- und Statistiktool für Streamer
    Also so:

    VB.NET-Quellcode

    1. Dim Request2 As HttpWebRequest = CType(WebRequest.Create("https://www.xxx.de/administrator/index.php"), HttpWebRequest)
    2. Request2.CookieContainer = Containa
    3. Response.GetResponseHeader("https://www.xxx.de/administrator/index.php?option=com_login&")


    Muss ich bei requesat2 auch Host und so weiter angeben? Ich habe bei dem Get auch eine Übergabe namens "option=com_login". Wie bau ich die ein?
    Oder stehen in Containa die Verbindungsdaten vom ersten Post mit drin?

    mfg
    In Arbeit...
    Ne, so:

    VB.NET-Quellcode

    1. Dim Request2 As HttpWebRequest = CType(WebRequest.Create(Response.GetResponseHeader("Location")), HttpWebRequest)
    2. Request2.CookieContainer = Response.Cookies


    vico255 schrieb:

    Muss ich bei requesat2 auch Host und so weiter angeben?

    Kannst es mal so versuchen, sollte eigentlich auch ohne gehen.

    vico255 schrieb:

    Ich habe bei dem Get auch eine Übergabe namens "option=com_login". Wie bau ich die ein?
    Oder stehen in Containa die Verbindungsdaten vom ersten Post mit drin?

    Keine Ahnung, was diese Option genau macht, aber ich würde sie mal weglassen, weil du bist ja dann schon eingeloggt. Deine Session sollte dann in den Cookies sein, und die schickst du ja im neuen Request mit.
    Twitch Viewer Display Chat-, Zuschauer- und Statistiktool für Streamer

    VB.NET-Quellcode

    1. Dim Request2 As HttpWebRequest = CType(WebRequest.Create(Response.GetResponseHeader("https://www.xxx.de/administrator/index.php?option=com_login&")), HttpWebRequest)
    2. Request2.CookieContainer = Containa


    Bekomm ich den Fehler: Ungültiger URI: Der URI ist leer.

    Wie kann ich mir die Antwort vom request2 geben lassen? Bei FF bekomm ich ein 200 zurück.
    In Arbeit...
    Ach so aber mit Response.GetResponseHeader("Location") bekomm ich den selben Fehler.

    edit // Response.GetResponseHeader("Location") ist leer.

    So sieht es jetzt aus.

    VB.NET-Quellcode

    1. Private Containa As CookieContainer = New CookieContainer
    2. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    3. Dim User = "xxx", Pwd = "xxx"
    4. Dim Request As HttpWebRequest = CType(WebRequest.Create("https://www.xxx.de/administrator/index.php"), HttpWebRequest)
    5. Request.Method = "POST"
    6. Request.Host = "www.xxx.de"
    7. Request.UserAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0"
    8. Request.ContentType = "application/x-www-form-urlencoded"
    9. Request.CookieContainer = Containa
    10. Dim Post As String = "username=" & User & "&passwd=" & Pwd & "&lang=&option=com_login&task=login&return=aW5kZXgucGhw&7854d1ff8d4007d7060a5d94da756540=1"
    11. Dim byteArray() As Byte = Encoding.UTF8.GetBytes(Post)
    12. Request.ContentLength = byteArray.Length
    13. Dim DataStream As Stream = Request.GetRequestStream()
    14. DataStream.Write(byteArray, 0, byteArray.Length)
    15. DataStream.Close()
    16. Dim Response As HttpWebResponse = CType(Request.GetResponse(), HttpWebResponse)
    17. DataStream = Response.GetResponseStream()
    18. Dim reader As New StreamReader(DataStream)
    19. Dim ServerResponse As String = reader.ReadToEnd()
    20. reader.Close()
    21. DataStream.Close()
    22. Response.Close()
    23. Dim Request2 As HttpWebRequest = CType(WebRequest.Create(Response.GetResponseHeader("Location")), HttpWebRequest)
    24. Request2.CookieContainer = Containa
    In Arbeit...

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

    Hmm ok, dann machstes so wie du es geschrieben hast: Dim Request2 As HttpWebRequest = CType(WebRequest.Create("https://www.xxx.de/administrator/index.php"), HttpWebRequest). Ist halt nicht ganz so elegant, aber sollte zumindest funktionieren.

    Dann machstes wie oben schon:

    VB.NET-Quellcode

    1. Dim Response2 As HttpWebResponse = CType(Request2.GetResponse(), HttpWebResponse)
    2. Dim DataStream2 As Stream = Response2.GetResponseStream()
    3. Dim reader2 As New StreamReader(DataStream2)
    4. Dim ServerResponse As String = reader2.ReadToEnd()
    5. reader2.Close()
    6. Response2.Close()
    Twitch Viewer Display Chat-, Zuschauer- und Statistiktool für Streamer
    Kann es nicht sein das Cointaina leer ist? Ich hab so das Gefühl. Bzw. das der nicht gefüllt wird? Da müsste ja selbst was drin stehen auch wenn das PW oder der Benutzername falsche wäre oder?
    Wie füllt der sich und wie könnte ich das prüfen?

    VB.NET-Quellcode

    1. Private Containa As CookieContainer = New CookieContainer
    2. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    3. Dim User = "xxx", Pwd = "xxx"
    4. Dim Request As HttpWebRequest = CType(WebRequest.Create("https://www.xxx.de/administrator/index.php"), HttpWebRequest)
    5. Request.Method = "POST"
    6. Request.Host = "www.xxx.de"
    7. Request.UserAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0"
    8. Request.ContentType = "application/x-www-form-urlencoded"
    9. Request.CookieContainer = Containa
    10. Dim Post As String = "username=" & User & "&passwd=" & Pwd & "&lang=&option=com_login&task=login&return=aW5kZXgucGhw&7854d1ff8d4007d7060a5d94da756540=1"
    11. Dim byteArray() As Byte = Encoding.UTF8.GetBytes(Post)
    12. Request.ContentLength = byteArray.Length
    13. Dim DataStream As Stream = Request.GetRequestStream()
    14. DataStream.Write(byteArray, 0, byteArray.Length)
    15. DataStream.Close()
    16. Dim Response As HttpWebResponse = CType(Request.GetResponse(), HttpWebResponse)
    17. DataStream = Response.GetResponseStream()
    18. Dim reader As New StreamReader(DataStream)
    19. Dim ServerResponse As String = reader.ReadToEnd()
    20. reader.Close()
    21. DataStream.Close()
    22. Response.Close()
    23. Dim Request2 As HttpWebRequest = CType(WebRequest.Create("https://www.xxx.de/administrator/index.php"), HttpWebRequest)
    24. Request2.CookieContainer = Containa
    25. Dim Response2 As HttpWebResponse = CType(Request2.GetResponse(), HttpWebResponse)
    26. Dim DataStream2 As Stream = Response2.GetResponseStream()
    27. Dim reader2 As New StreamReader(DataStream2)
    28. Dim ServerResponse2 As String = reader2.ReadToEnd()
    29. reader2.Close()
    30. Response2.Close()
    31. 'MsgBox(ServerResponse2)
    32. If ServerResponse2 Like "*Abmelden*" Then
    33. MessageBox.Show("Login OK")
    34. Else
    35. MessageBox.Show("Login nicht OK")
    36. End If


    So ist doch nicht falsch am Code ?! Ich lande immernoch auf der Anmeldeseite.
    In Arbeit...
    Kann auch sein, dass die Webseite das nicht über Cookies macht oder so. Da müssten dir dann diejenigen hier weiterhelfen, die sich mit Webentwicklung besser auskennen. Was in dem Cookie-Container drin ist kannst du überprüfen, indem du in dieser Zeile Dim Response As HttpWebResponse = CType(Request.GetResponse(), HttpWebResponse) einen Breakpoint setzt und mit der Maus über die Response-Variable hoverst. Dann kannst du den CookieContainer anschauen (heißt in der HttpWebResponse-Klasse einfach nur Cookies und ist eine Property).

    Dazu ein allgemein sehr gutes Video, aber speziell zu Breakpoints ab ca. 1:45 -> Visual Studio richtig nutzen
    Twitch Viewer Display Chat-, Zuschauer- und Statistiktool für Streamer
    Bist du dir sicher das der Post jedesmal gleich ist?

    Mir scheint es das:
    &return=aW5kZXgucGhw&7854d1ff8d4007d7060a5d94da756540=1"

    jedes mal neu generiert wird. Das heißt du müsstest vermutlich erstmal einen GET auf die Seite durchführen. Dabei am besten gleich die Cookies mitnehmen und die Werte auslesen und entsprechend im POST dann setzen.

    LG
    Das ist meine Signatur und sie wird wunderbar sein!
    Moin

    Hab das gerade mir 2 mal angeschaut. Er ändert return=aW5kZXgucGhw&7854d1ff8d4007d7060a5d94da756540=1 immer nach dem &, also 7854d1ff8d4007d7060a5d94da756540.

    Im FF Entwicklerwerkzeug[F12] sagt er: Erst der Post und dann das Get. MIt dem Get kommt auch das Server 200. Hatte gestern den ganzen Tag geschaut aber keine Lösung bisher hinbekommen.
    Im Response der Post Cookie steht ledigt "www.xxx.de"

    Was ich mich frage... Woher bekommt FF die Cookie schon vor dem Post? Weil die Cookie werden doch im Request Headers mitgesendet odet ?
    In Arbeit...
    Ich würde mal sagen, den return-Wert bekommst du mit einem vorangestellten GET
    1) GET auf die Login-Seite
    2) return-Wert aus der GET-Response ziehen
    3) POST absetzen mit den entsprechenden Parametern
    4) POST-Response auswerten auf "Hilfe"
    Letztendlich ziemlich genau das, was @Mono in Post #13 schon vorgeschlagen hat.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Es gibt vorher einen GET. Du öffnest ja zuerst die Seite mit der Form. Das ist normalerweise der Ablauf:

    - GET Request auf "Startseite" oder LoginSeite. Dort erhältst du ggf. schon Cookies und vor allem alle Form Felder für den Post und ggf schon deren Values
    - POST Request inkl. Cookies + Form Values
    - GET Request inkl. Cookies zur neuen Location als eingeloggter User
    Das ist meine Signatur und sie wird wunderbar sein!
    Kann 7854d1ff8d4007d7060a5d94da756540 zufällig sein? Weil der Wert ändert sich nach jeder Anfrage und ich weiß nicht wo der herkommt.
    Bekomme den Wert vorher nicht.

    Könnte mir das einer mal mit dem Get - Post - Get grob nachbauen ? Steig da langsam nicht mehr durch :(

    LG

    edit // Das der GET-Response auf die Loginseite
    Bilder
    • Unbenannt.PNG

      15,02 kB, 458×295, 162 mal angesehen
    In Arbeit...

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

    Im GET Response HEader siehst schonmal einen Cookie.
    Die Form Werte
    return=aW5kZXgucGhw

    7854d1ff8d4007d7060a5d94da756540=1

    Wirst du iwo in der Form direkt im HTML finden. Zum Beispiel als Hidden Field oder dergleichen
    Das ist meine Signatur und sie wird wunderbar sein!
    Ja du hast recht.

    HTML-Quellcode

    1. <input type="hidden" name="option" value="com_login"/>
    2. <input type="hidden" name="task" value="login"/>
    3. <input type="hidden" name="return" value="aW5kZXgucGhw"/>
    4. <input type="hidden" name="2aec2f7c07b7d811c21eb01ea217c95d" value="1" /> </fieldset>


    Ich stehe trotzdem noch vor dem Porblem wie ich das jetzt mit dem Get-Post-Get mache. Egal wie ich es mache und tue. Er zeigt mir immer die Loginseite an.
    In Arbeit...
    Schau dir mal an wie ich es hier mache:
    Login auf Forum mittels Anwendung

    Das ist der semi automatische Weg. Du solltest natürlich die input type Felder via Code raussuchen.
    Das ist meine Signatur und sie wird wunderbar sein!