Seiten einlogen / Cookies

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Cyberkey.

    Seiten einlogen / Cookies

    Nabend,

    Ich hab mich hier im Forum ein wenig über Cookies & Webseiten einlogen informiert.

    Ich kriegs irgendwie nicht hin. Ich scheiter an den Cookies.

    Der Benutzernamen & PW wird ja bereits übergeben, aber es kommt immer das falsche Ergebnis raus :(
    Sprich, ich werde bei meiner zweiten Anfrage auf die Website nicht als Eingelogt angegeben und meine letzte If Abfrage gibt mir immer ein False zurück.


    Vl. kann mir jemand hierbei helfen?

    VB.NET-Quellcode

    1. Dim username, password As String
    2. username = "UserMustermann"
    3. password = "MusterPW"
    4. 'Cookie Container erstellen um bei der nächsten Anfrage wieder eingelogt zu sein
    5. Dim Request As HttpWebRequest = CType(WebRequest.Create("http://www.relink.us/index.php"), HttpWebRequest)
    6. With Request
    7. .Method = "POST"
    8. .ContentType = "application/x-www-form-urlencoded"
    9. End With
    10. 'Benutzername und Passwort wird abgeschickt
    11. Dim Post As String = "username=" & username & "&password=" & password & "=Login"
    12. Dim byteArray() As Byte = Encoding.UTF8.GetBytes(Post)
    13. Request.ContentLength = byteArray.Length
    14. Dim DataStream As Stream = Request.GetRequestStream()
    15. DataStream.Write(byteArray, 0, byteArray.Length)
    16. DataStream.Close()
    17. 'Response vom Server erhalten - Eingelogt oder nicht
    18. Dim Response As HttpWebResponse = Request.GetResponse()
    19. DataStream = Response.GetResponseStream()
    20. Dim reader As New StreamReader(DataStream)
    21. Dim ServerResponse As String = reader.ReadToEnd()
    22. reader.Close()
    23. DataStream.Close()
    24. Response.Close()
    25. If InStr(ServerResponse, "Umfrage") Then
    26. MessageBox.Show("Login erfolgreich")
    27. Else
    28. MessageBox.Show("Login nicht erfolgreich")
    29. End If


    Habt dank

    MfG Prosoft
    Ok, dann nocheinmal zurück zu meinem Problem:

    Das Cookie wird zwar gespeichert und mir wieder ausgegeben, aber es wird bei der zweiten Abfrage dann das Cookie nicht verwendet

    VB.NET-Quellcode

    1. 'Response vom Server erhalten - Eingelogt oder nicht
    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()
    9. If InStr(ServerResponse, "Umfrage") Then
    10. MessageBox.Show("Login erfolgreich")
    11. Else
    12. MessageBox.Show("Login nicht erfolgreich")
    13. End If


    Nebenbei hab ich die Cookies im oberen Code wie folgt eingebaut:

    VB.NET-Quellcode

    1. Dim username, password As String
    2. username = "UserMustermann"
    3. password = "MusterPW"
    4. 'Cookie Container erstellen um bei der nächsten Anfrage wieder eingelogt zu sein
    5. Dim Request As HttpWebRequest = CType(WebRequest.Create("http://www.relink.us/index.php"), HttpWebRequest)
    6. Request.CookieContainer = New CookieContainer()
    7. With Request
    8. .Method = "POST"
    9. .ContentType = "application/x-www-form-urlencoded"
    10. End With
    11. 'Benutzername und Passwort wird abgeschickt
    12. Dim Post As String = "username=" & username & "&password=" & password & "=Login"
    13. Dim byteArray() As Byte = Encoding.UTF8.GetBytes(Post)
    14. Request.ContentLength = byteArray.Length
    15. Dim DataStream As Stream = Request.GetRequestStream()
    16. DataStream.Write(byteArray, 0, byteArray.Length)
    17. DataStream.Close()
    Entweder ich bau des total verkehrt, oder ich weiß nicht wo da der Fehler liegt.

    Also die Zeile

    VB.NET-Quellcode

    1. Response.Cookies = Request.CookieContainer.GetCookies(Request.RequestUri)


    habe ich bei der Statusabfrage vor dem letzten If eingebaut, das sieht jetzt so aus:

    VB.NET-Quellcode

    1. 'Response vom Server erhalten - Eingelogt oder nicht
    2. Dim Response As HttpWebResponse = Request.GetResponse()
    3. Response.Cookies = Request.CookieContainer.GetCookies(Request.RequestUri)
    4. Dim reader As StreamReader = New StreamReader(Response.GetResponseStream)
    5. Dim ServerResponse As String = reader.ReadToEnd()
    6. reader.Close()
    7. DataStream.Close()
    8. Response.Close()


    Der bleibt aber trotzdem immer auf der Loginseite stehen, so als hätt er niemals mit nem login zu tun gehabt :(
    Ich habe noch zwei Fehler gefunden ;)

    VB.NET-Quellcode

    1. Dim Request As HttpWebRequest = CType(WebRequest.Create("http://www.relink.us/index.php"), HttpWebRequest)

    Hier musst du die login.php aufurfen, wie es auch das Formular auf der Website macht.

    VB.NET-Quellcode

    1. Dim Post As String = "username=" & username & "&password=" & password & "=Login"

    Hier fehlt noch ein "&login" vor dem "=Login", also so:

    VB.NET-Quellcode

    1. Dim Post As String = "username=" & username & "&password=" & password & "&login=Login"
    Hi
    mein erster beitrag hier im board :D
    ich hoffe der hilft weiter

    Ok, dann nocheinmal zurück zu meinem Problem:

    Das Cookie wird zwar gespeichert und mir wieder ausgegeben, aber es wird bei der zweiten Abfrage dann das Cookie nicht verwendet

    Also ich denke es liegt wohl daran, das du das cookie bei deiner 2. anfrage nicht mit schickst
    Hier mal ein code beispiel wie es klappen sollte.(getestet)
    entscheidend dabei ist

    VB.NET-Quellcode

    1. .Headers.Set(HttpRequestHeader.Cookie, loginCookie)


    VB.NET-Quellcode

    1. Public Class Form2
    2. Dim loginCookie As String
    3. Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    4. Dim User, Pwd, loginUrl As String
    5. User = "Max Musterman"
    6. Pwd = "123456"
    7. loginUrl = "http://testseite.xy/login.php"
    8. Dim Post As String = "username=" & User & "&password=" & Pwd & "&submit=submit"
    9. 'in loginCookie steht dann das cookie, welches man mit der funktion SaveGetCookie holt
    10. loginCookie = SaveGetCookie(loginUrl, Post)
    11. End Sub
    12. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    13. Dim indexUrl As String = "http://testseite.xy/index.php"
    14. Dim Request As HttpWebRequest = CType(WebRequest.Create(indexUrl), HttpWebRequest)
    15. With Request
    16. .Method = "POST"
    17. .ContentType = "application/x-www-form-urlencoded"
    18. .Accept = "*/*"
    19. .Headers.Add(HttpRequestHeader.AcceptLanguage, "de")
    20. .Headers.Set(HttpRequestHeader.Cookie, loginCookie)
    21. .Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip, deflate")
    22. .UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5"
    23. .ContentType = "application/x-www-form-urlencoded"
    24. End With
    25. Dim DataStream As Stream = Request.GetRequestStream()
    26. DataStream.Close()
    27. 'Response vom Server erhalten
    28. Dim Response As HttpWebResponse = Request.GetResponse()
    29. DataStream = Response.GetResponseStream()
    30. Dim reader As New StreamReader(DataStream)
    31. Dim ServerResponse As String = reader.ReadToEnd()
    32. reader.Close()
    33. Response.Close()
    34. 'textbox2 zeigt den quelltext den nur ein eingeloggter user sehen könnte
    35. TextBox2.Text = ServerResponse
    36. End Sub
    37. Public Function SaveGetCookie(ByVal URL As String, ByVal Post As String) As String
    38. Dim data As Byte() = System.Text.Encoding.UTF8.GetBytes(Post)
    39. Dim request As HttpWebRequest = CType(WebRequest.Create(URL), HttpWebRequest)
    40. request.CookieContainer = New CookieContainer()
    41. With request
    42. .Method = "POST"
    43. .Accept = "*/*"
    44. .Headers.Add(HttpRequestHeader.AcceptLanguage, "de")
    45. .Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip, deflate")
    46. .UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5"
    47. .ContentType = "application/x-www-form-urlencoded"
    48. .ContentLength = data.Length
    49. End With
    50. Dim DataStream As Stream = request.GetRequestStream()
    51. DataStream.Write(data, 0, data.Length)
    52. DataStream.Close()
    53. Dim response As HttpWebResponse = request.GetResponse
    54. DataStream = response.GetResponseStream()
    55. If response.Cookies IsNot Nothing AndAlso response.Cookies.Count <> 0 Then
    56. For Each cookie As Cookie In response.Cookies
    57. Return cookie.ToString
    58. Next
    59. Else
    60. MessageBox.Show("Kein Cookie gesetzt!")
    61. End If
    62. Return 0
    63. End Function
    64. End Class

    optional könnte man das "loginCookie" auch in eine textdatei speichern
    und das bei einem späteren aufruf des progis wieder zu verwenden

    Aber ich denke das beispiel sollte dein eigendliches problem lösen können.

    MfG Fuxx

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

    Hallo,

    tut mir leid das ich den alten Thread nochmal ausgrabe, aber ich hätte mal noch eine Frage.

    Ich habe den Code jetzt so übernommen und die Variablen in

    VB.NET-Quellcode

    1. Dim Request As HttpWebRequest = CType(WebRequest.Create("http://www.cod4-gamers.de/checklogin.php"), HttpWebRequest)
    2. Dim Post As String = "ws_user=testacc" & "&pwd=testpw"
    3. loginCookie = SaveGetCookie("http://www.cod4-gamers.de/index.php", Post)

    geändert.

    Jetzt wird zwar auch ein Cookie gespeichert ( Prüfe ich mit MsgBox(loginCookie) ), allerdings bekomme ich als Antwort immer,
    dass kein Benutzer mit dem Namen "testacc" im System vorhanden ist.
    Weiß vielleicht jemand rat?
    img694.imageshack.us/img694/3992/leprog2.jpg
    img251.imageshack.us/img251/6062/leprog1.jpg
    Mit freundlichen Grüßen, eXpire
    Okay ich habs mal probiert, aber "Keine Daten vom Server erhalten. Eventuell bist du nicht mehr eingeloggt."
    Also ich kann zwar navigieren aber bei vielen Links kommt diese Meldung. Irgendwie glaube ich das da etwas nicht richtig übergeben wird und oder die noch ein Check machen.. Z.b. UserAgent ob der sich geändert hat usw..

    Habe mich mal mit dem Firefox eingeloggt, das Cookie in den IE importiert (Manuell) und siehe da das selbe Problem.

    Hat jemand vll. eine hilfreiche Idee?


    PS: Für alle die es Interessiert, hiermit übergebe ich ein Cookie von HTTPREQUEST an den Webbrowser.
    Anhang:

    VB.NET-Quellcode

    1. WebBrowser1.Navigate("http://")
    2. Dim str As String
    3. Dim str2 As String()
    4. Dim strValue As String
    5. Dim req As System.Net.HttpWebRequest = System.Net.HttpWebRequest.Create("http://")
    6. req.CookieContainer = Containa
    7. Dim res As System.Net.HttpWebResponse = req.GetResponse()
    8. For Each str In res.Headers
    9. str2 = res.Headers.GetValues(str)
    10. If str = "Set-Cookie" Then
    11. strValue = res.Headers.Get(str)
    12. strValue = strValue.Replace(",", "; ")
    13. Req.Headers.Add("Cookie", strValue)
    14. End If
    15. Next
    16. 'res = req.GetResponse()
    17. Dim resStream As System.IO.Stream = res.GetResponseStream()
    18. Dim sr As New System.IO.StreamReader(resStream)
    19. Dim Quelltext As String = (sr.ReadToEnd())
    20. For Each obj In req.Headers
    21. If obj = "Cookie" Then
    22. WebBrowser1.Document.Cookie = req.Headers.Get(obj)
    23. End If
    24. Next

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Cyberkey“ ()