httpwebrequest

  • VB.NET

Es gibt 26 Antworten in diesem Thema. Der letzte Beitrag () ist von ichwars.

    httpwebrequest

    Hallo,

    also wie die Überschrift es bereits verät, habe ich fragen zu httpwebrequest.
    Vorweg möchte ich schonmal erwähnen, dass ich sämtliche Tutorials durchgelesen (hier im Forum), anderweitig das Internet bemüht und sogar bei MS über httpwebrequest nachgelesen habe (was allerdings sich am nutzlosesten erwies).


    Es geht darum, sich ohne einen Browser auf einen Server anzumelden.
    Hier mein Code:

    VB.NET-Quellcode

    1. Imports System.IO, System.Net, System.Text
    2. Public Class Form1
    3. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    4. Label2.Visible = False
    5. End Sub
    6. Private Cookies = New CookieContainer
    7. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    8. Dim Request As HttpWebRequest = _
    9. DirectCast(HttpWebRequest.Create("http://www.meineSeite.de"), HttpWebRequest)
    10. With Request
    11. .CookieContainer = Cookies
    12. .Method = "POST"
    13. .ContentType = "application/x-www-form-urlencoded"
    14. End With
    15. Dim logindata As String
    16. Dim user As String = "email@vb.de"
    17. Dim pw As String = "meinpw"
    18. logindata = "form=login&landing=true&email=" & user & "&password=" & pw & "&x=129&y=13"
    19. Dim Writer As New StreamWriter(Request.GetRequestStream())
    20. Writer.Write(logindata)
    21. Writer.Close()
    22. Request.GetResponse().Close()
    23. Request = DirectCast(WebRequest.Create("http://www.meineSeite.de/Seite2.html"), HttpWebRequest)
    24. Request.CookieContainer = Cookies
    25. Dim Reader As New StreamReader(Request.GetResponse().GetResponseStream())
    26. Dim quellcode As String
    27. quellcode = Reader.ReadToEnd()
    28. Reader.Close()
    29. TextBox1.Text = quellcode
    30. Dim Inhalt As String
    31. Dim Suchwort As String
    32. Dim index As Integer
    33. Dim Fund As String = ""
    34. Inhalt = TextBox1.Text
    35. Suchwort = user
    36. ' Nach erfolgreicher Login steht die user_id im Quelltext der Seite
    37. index = Inhalt.IndexOf(Suchwort, 1)
    38. If index <> -1 Then
    39. For i = 1 To Suchwort.Length Step 1
    40. Fund = Fund + GetChar(Inhalt, index + i)
    41. Next
    42. If user = Fund Then
    43. Label2.Visible = True
    44. Label2.Text = Fund & "Login OK"
    45. Else
    46. Label2.Visible = True
    47. Label2.Text = "Login fehlgeschlagen."
    48. End If
    49. End If
    50. End Sub
    51. End Class


    Das einloggen funktioniert soweit, dank den Tutorials. Um mich nun weiter auf andere Seiten bewegen zu können brauche ich den Cookie, der steht nicht im Quelltext. Aber wenn ich mit Mozilla und Live HTTP headers das einlogverfahren mitschneide steht dort ein Cookie.

    Brainfuck-Quellcode

    1. http://www.meineSeite.de/
    2. POST / HTTP/1.1
    3. Host: www.meineSeite.de
    4. User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8
    5. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    6. Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
    7. Accept-Encoding: gzip,deflate
    8. Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
    9. Keep-Alive: 115
    10. Connection: keep-alive
    11. Referer: http://www.meineSeite.de/
    12. Cookie: PHPSESSID=7205d08fbf11xvjnbgfjkjökhzgf: usw.......blablabla
    13. Content-Type: application/x-www-form-urlencoded
    14. Content-Length: 77
    15. form=login&landing=true&email=email@vb.de&password=meinpw&x=149&y=13
    16. HTTP/1.1 302 Found
    17. Date: Mon, 01 Nov 2010 19:24:23 GMT
    18. Server: Apache
    19. node: nd01
    20. Expires: Thu, 19 Nov 1981 08:52:00 GMT
    21. Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
    22. Pragma: no-cache
    23. Location: /Seite2.html
    24. Vary: Accept-Encoding,User-Agent
    25. Content-Encoding: gzip
    26. Content-Length: 20
    27. Connection: close
    28. Content-Type: text/html; charset=utf-8
    29. ----------------------------------------------------------
    30. http://www.meineSeite.de/Seite2.html
    31. GET /Seite2.html HTTP/1.1
    32. Host: www.meineSeite.de
    33. User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8
    34. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    35. Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
    36. Accept-Encoding: gzip,deflate
    37. Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
    38. Keep-Alive: 115
    39. Connection: keep-alive
    40. Referer: http://www.meineSeite.de/
    41. Cookie: PHPSESSID=7205d08fbf11xvjnbgfjkjökhzgf: usw.......blablabla
    42. HTTP/1.1 200 OK


    Ich kann den Cookie nicht auslesen, kann mir da vielleicht jemand einen Tip geben?
    Danke im vorraus.

    MfG

    newbie schrieb:

    Ich kann den Cookie nicht auslesen, kann mir da vielleicht jemand einen Tip geben?

    Die httpWebRequest Klasse nimmt Dir bequemerweise diese Arbeit ab, wenn Du dem Post-Request einen CookieContainer als Property mitgibst.

    VB.NET-Quellcode

    1. ' im Kopf der (Form) Klasse
    2. private CookieJar as new CookieContainer
    3. ...
    4. ' vor dem POST den aufnehmenden CookieContainer mitgeben
    5. request.CookieContainer = CookieJar
    6. ...


    Dann packt der httpWebRequest automatisch das beim response mitgeschickte Session-Cookie in den Container.

    Allen folgenden Requests musst Du dann natürlich genau diesen auch wieder mitgeben ...

    Will die Webseite solche Bots verhindern, kann sie natürlich weitere Hürden einbauen:
    -dynamische Session-Keys
    - Referer prüfen
    - durch Javascript erzeugte POST Argumente
    - dynamisches Nachladen von Daten (AJAX)
    - ...

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

    Hallo Kangaroo,

    im Prinzip habe ich das doch schon...oder? Siehe Code

    VB.NET-Quellcode

    1. Private Cookies = New CookieContainer
    2. ...
    3. ...
    4. Request = DirectCast(WebRequest.Create("http://www.meineSeite.de/Seite2.html"), HttpWebRequest)
    5. Request.CookieContainer = Cookies
    6. ...
    7. ...


    in meinem Code wird der Quelltext der Seite in eine TextBox geschrieben, das ist ja nur zur Kontrolle (würde später wegkommen) für mich ob ich mich auf der richtigen Seite befinde und ob ich eingeloggt bin.
    Mir geht es jetzt darum den Cookie auch als String darzustellen um überhaupt sehen zu können ob der mit der Headerdatei von "Live HTTP Headers" übereinstimmt.

    Also die Frage nochmal, wie kann ich die Cookies als String oder Array oder wie auch immer darstellen (in der TextBox ausgeben)?
    Dort werden vielleicht die Cookies gesetzt, aber leider nicht richtig. Wenn man sich einloggt, Cookies in dem PHP Script gesetzt werden und dann ein interner Redirect auf eine andere Seite geschieht werden die Cookies nämlich nicht gespeichert sondern nur die Cookies auf der angezeigten Seite. Aber sogut wie jeder Login funktioniert mittels internem Redirect, du musst hierzu die Cookies aus dem ResponseStream auslesen, ich hatte mal ähnliches Problem [VB 2008] HttpWebRequest und Cookies
    Vorschlag: nenne mal die richtige Webseite statt "meineSeite.de", dann können wir Dir auch besser helfen.

    Normale Sequenz eines Login:
    1. CookieContainer anlegen
    2. Startseite abrufen (mit Container)
    3. POST an Seite schicken die als Action in der Form steht (mit Container)
    4. weitere Aufrufe (mit Container)

    @Dodo: ich abe mit der Vorgehensweise eigentlich noch nie Probleme gehabt, kannst Du mir eine Beispiel URL nennen ?

    Kangaroo schrieb:

    Wie schon gesagt, nenn mal die richtige Url wo Du Dich einloggen möchtest, dann kann man Dir auch besser helfen.

    Jede Seite ist anders, und Fragen nur so allgemein zu beantworten bringt nicht viel.

    Hallo Kangaroo,

    kann ich dir das per e-mail senden, ich möchte ungerne öffentliche Seiten hier nennen wofür ich einen Bot basteln will. :whistling:

    MfG
    newbie

    newbie schrieb:

    kann ich dir das per e-mail senden, ich möchte ungerne öffentliche Seiten hier nennen wofür ich einen Bot basteln will.

    Wenn Du Dich mal im Forum umschaust haben viele mit VB angefangen, weil sie entweder einen Bot oder ein Game programmieren wollten. Mit ein bisschen Forensuche wirst Du merken dass von oGame bis Pennergame hier so ziemlich alles vertreten ist.

    Insofern würde ich an Deiner Stelle kein Problem damit haben die Seite zu nennen.
    Na gut.

    Es geht um einen Online Browsergame (desert-operations.de). Es geht darum, ich kann mich mitlerweile einloggen, aber wenn ich die nächste Seite aufrufen möchte, wirft der mich wieder auf die Startseite, das sehe ich anhand des Quelltextes der Seite. Wie ich es bereits weiter oben beschrieben hatte, habe ich eine TextBox wo ich mir den Quelltext der jeweiligen Seite ausgeben lasse (für die Übersicht, würde später natürlich wegkommen).
    Mir ist auch aufgefallen das sich der Cookie ändert. Mit "Live Http Header" habe ich mal die traffic mitgeschnitten.
    Zur Info das wäre jetzt mein erster VB.NET (VS 2010) projekt, vorher habe ich mit VB 6 gearbeitet. Ich hatte soetwas ähnliches schonmal für ein anderes Browsergame programmiert, allerdings mit WebClient. Diesmal wollte ich halt gerne komplett ohne Bilder und Text auskommen. Weil hier die Geschwindigkeit zählt. HttpWebRequest ist neuland für mich, also sry von vorne herein, falls ich mich ab und an bissl doof anstelle.

    MfG
    newbie
    So , ich hab mir eben mal den Netzwerk Traffic beim Login auf die Seite mit einem Sniffer angeschaut: denke Deine Probleme haben wohl weniger mit httpRequest Bugs zu tun, sondern dass Du Dich falsch, bzw. nicht vollkommen richtig einloggst.

    Der Ablauf ist wie folgt:
    - Start auf der seite www.desert-operations.de
    - POST mit den Login Daten ( ist noch korrekt bei Deinem Code)
    - zurück kommt als Response (nach 1.Redirection) die /game.html mit 2 Frames, wovon nur Frame1 (=World Selector Url) interessant ist
    - die Frame 1 Url enthält dynamisch erzeugte Session und Hash ID's
    - World Selector URL wird aufgerufen
    - als Response kommt der Quellcode der World Selector Page + ein neuer Cookie !

    Du wirst also selber aus dem Quellcode Deines Logins erst einmal die Url für den World Selector Screen auslesen müssen, funktioniert z.B. mit folgender Regex Pattern:

    VB.NET-Quellcode

    1. Dim m As Match = Regex.Match(DesertOperations.actTextDocument, "src=""([^""]+)""")
    2. worldSelectorUri as Uri = New Uri(m.Groups(1).Value)

    Beispiel für die URI:
    http://game.desert-operations.de/world1/extern/looki/login.php?landing=true&world=&recruiter=&email=meineEmail@gmx.net&sid=b8c0207153230018621778c3a6fc19b8&login_hash=354989c992d4de92d2d66a01724b10d0

    Mit dem neuen Cookie sollte es dann wieder normal weitergehen.
    Hallo Kangaroo,

    Kangaroo schrieb:

    Dim m As Match = Regex.Match(DesertOperations.actTextDocument, "src=""([^""]+)""")
    mit der Zeile, besonders mit der blauen Stelle habe ich probleme. Fehler: "actTextDocument" ist kein Member von "String"
    Was muss da rein?
    Wenn ich es so schreibe

    VB.NET-Quellcode

    1. Dim Reader As New StreamReader(Request.GetResponse().GetResponseStream())
    2. Dim quellcode As String
    3. quellcode = Reader.ReadToEnd()
    4. Reader.Close()
    5. Dim m As Match = Regex.Match(quellcode, "src=""([^""]+)""")
    6. Dim worldSelectorUri As Uri = New Uri(m.Groups(1).Value)
    7. TextBox1.Text = worldSelectorUri & vbCrLf & quellcode ' hier wird diese Zeile angemeckert (Der &-Operator ist für die Typen "System.Uri" und "String" nicht definiert.)

    Ich würde es halt gerne sehen, bevor ich weiter mache...


    Verständnisfrage
    "worldSelectorUri" wäre die nächste "POST" an den Server. Richtig?

    MfG
    newbie

    newbie schrieb:

    Was muss da rein?

    Der Quellcode der game.html Seite, so wie Du es auch gemacht hast.

    newbie schrieb:

    "worldSelectorUri" wäre die nächste "POST" an den Server. Richtig?

    Ja, aus dem url-Sting wurde nur eine URI gemacht.

    newbie schrieb:

    TextBox1.Text = worldSelectorUri & vbCrLf & quellcode ' hier wird diese Zeile angemeckert (Der &-Operator ist für die Typen "System.Uri" und "String" nicht definiert.)

    URI ist eine Klasse, Du kannst hier zum Beispiel WorldSelectorUri.AbsoluteUri verwenden.