WebRequests mit CookieContainer, trotzdem nicht eingeloggt

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von singu.

    WebRequests mit CookieContainer, trotzdem nicht eingeloggt

    Hallo VB-Paradise Community,
    und zwar würde ich mich gerne via WebRequests auf einer Seite einloggen und mit einem 2. Request auf der Unterseite einen Wert via Regex abrufen, allerdings sehe ich in der Source von beiden Requests das ich nicht eingeloggt bin.

    Bei unzähligen anderen Seiten funktioniert es jedoch auf diese Weise und ich habe keine Ansatz woran es in diesem Fall liegen könnte.

    ###

    Ich möchte mich auf tubeload.to einloggen und dann auf tubeload.to/manager die Hitszahl aus folgendem String auslesen: "0 Hits @ 0 Files" - Also im Endeffekt möchte ich die 0 ;)

    Login: vbparadise
    Passwort: vbparadise

    Mit folgendem Code versuche ich das Ganze durchzuführen: (Mir ist klar das der Reguläre Ausdruck nicht zutrifft ;) Den passe ich an sobald der Login einwandfrei klappt.

    VB.NET-Quellcode

    1. Dim login_tubeload As String = Req("http://www.tubeload.to/login", "sUsername=vbparadise&sPassword=vbparadise&login_submit=", "POST", "tubeload.to")
    2. Dim source_tubeload As String = Req("http://www.tubeload.to/manager", "", "POST", "tubeload.to")
    3. Dim guthaben_tubeload As String = get_tubeloadmoney(source_tubeload)
    4. lbl_tubeloadmoney.Text = guthaben_tubeload
    5. Private Function get_tubeloadmoney(ByVal c As String) As String
    6. Dim guthaben As String = ""
    7. Dim rx As New Regex("((.*?))")
    8. Dim matches As MatchCollection = rx.Matches(c)
    9. If matches.Count <> 0 Then
    10. For Each Match As Match In matches
    11. guthaben = Match.Groups(5).Value
    12. Next
    13. Else
    14. guthaben = "n/a"
    15. End If
    16. Return guthaben
    17. End Function
    18. Private Function Req(ByVal Site As String, ByVal P As String, ByVal Method As String, ByVal Host As String) As String
    19. Dim CookieCount As Double = 0
    20. Dim R As HttpWebRequest = HttpWebRequest.Create(Site)
    21. R.Method = Method
    22. R.ServicePoint.Expect100Continue = False
    23. R.CookieContainer = Cookies
    24. R.Host = Host
    25. R.MaximumAutomaticRedirections = 20
    26. R.AllowAutoRedirect = False
    27. R.Referer = ""
    28. R.Headers("useragent") = "Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8"
    29. R.ContentType = "application/x-www-form-urlencoded"
    30. Dim Post As String = P
    31. R.ContentLength = Post.Length
    32. Dim writer As New IO.StreamWriter(R.GetRequestStream(), System.Text.Encoding.ASCII)
    33. writer.Write(Post)
    34. writer.Close()
    35. Dim reader As New IO.StreamReader(R.GetResponse.GetResponseStream())
    36. Dim Response As String = reader.ReadToEnd
    37. reader.Close()
    38. Return Response
    39. End Function


    Ich höffe ihr könnt mir weiterhelfen :) Vielen Dank im voraus!

    MfG,
    mewcrazy
    Also habe die Deklarierung vergessen zu posten:

    VB.NET-Quellcode

    1. Private Cookies As System.Net.CookieContainer = New CookieContainer


    Und genutzt werden die Cookies doch mit folgender Zeile:

    VB.NET-Quellcode

    1. R.CookieContainer = Cookies



    Ok verstehe, der Request.Cookiecontainer fehlt, nunja aber bei allen anderen Seiten funktioniert es so ja auch. Das heisst die Cookies müssen ja trotzdem funktionieren, da alle anderen Seiten auch einen Login benötigen via POST. Und egal ob 1. Request oder 2. Request, bei beiden ist kein erfolgreicher Login zu vermelden.

    VB.NET-Quellcode

    1. R.CookieContainer = Cookies


    Da wird dem Request ein CookieContainer zugeordnet, aber nirgends im Code sehe ich wo die Cookies des Response dem Cookecontainer zuordnest, es wird hierbei ja kein Pointer übergeben und automatisch der Container befüllt.

    Schau die das Beispiel an was ich dir gepostet habe, bzw. das hier is das richtige [VB 2008] HttpWebRequest und Cookies
    So?

    VB.NET-Quellcode

    1. Private Function Req(ByVal Site As String, ByVal P As String, ByVal Method As String, ByVal Host As String) As String
    2. Dim CookieCount As Double = 0
    3. Dim R As HttpWebRequest = HttpWebRequest.Create(Site)
    4. R.Method = Method
    5. R.ServicePoint.Expect100Continue = False
    6. R.CookieContainer = Cookies
    7. R.Host = Host
    8. R.MaximumAutomaticRedirections = 20
    9. R.AllowAutoRedirect = True
    10. R.Referer = ""
    11. R.Headers("useragent") = "Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8"
    12. R.ContentType = "application/x-www-form-urlencoded"
    13. Dim Post As String = P
    14. R.ContentLength = Post.Length
    15. Dim writer As New IO.StreamWriter(R.GetRequestStream(), System.Text.Encoding.ASCII)
    16. writer.Write(Post)
    17. writer.Close()
    18. Dim Response As HttpWebResponse = R.GetResponse
    19. Response.Cookies = R.CookieContainer.GetCookies(R.RequestUri)
    20. Dim Reader As IO.StreamReader = New IO.StreamReader(Response.GetResponseStream)
    21. Debug.Print(Reader.ReadToEnd())
    22. Reader.Close()
    23. For Each SetCookie As Cookie In Response.Cookies
    24. Debug.Print(SetCookie.Name)
    25. Next
    26. Return Response
    27. End Function


    Kriege nun allerdings eine Fehlermeldung das HttpWebResponse nicht in String konvertiert ewrden kann, da ich ja die Response variable als Rückgabewert nutze.
    Fehler kommt bei:

    VB.NET-Quellcode

    1. Return Response



    Den möchte ich zurückgegeben habe, da ich danach ja mit Regex in der Source schauen möchte.


    Fehler ist immer noch:

    Quellcode

    1. Fehler 1 Der Wert vom Typ "System.Net.HttpWebResponse" kann nicht in "String" konvertiert werden. MainForm.vb 1165 20
    Natürlich sind Teile der Request Copy&Paste, wenn du den Thread aufmerksam verfolgt hast, wirst du merken das ich Teile aus dem erwähnten Beispiel von Dodo hinzugefügt habe.

    Könnte mir denn jetzt einer erklären wie ich zur Lösung komme? In einem Beispiel von Smoove wird der Response auch als String deklariert und da er mir bei der Sache geholfen hat bzw. einen Code zur Verfügung gestellt hat, habe ich dies auch vorher so gemacht. Und da hat ein einfaches Return Response, was später als String weiterverwendet werden kann, gereicht.

    mewcrazy schrieb:

    Und da hat ein einfaches Return Response, was später als String weiterverwendet werden kann, gereicht.

    Reicht auch, nur hast Du Deine Function mit

    VB.NET-Quellcode

    1. Function Req(...) As String
    2. ...
    3. Return response

    definiert, also passen Rückgabewert und Deklaration nicht zusammen. Also entweder response.text zurückgeben oder den Functions-Rückgabewert als response deklarieren. Du hast die Wahl ...
    Also wenn ich den Datentyp der Funktion auf HttpWebResponse setze, bringt mir das im Endeffekt auch nichts, da ich damit letztenendes auch nicht weiterarbeiten kann, da ich ja einen String bräuchte.

    Und die Klasse Response.Text gibt es nicht, mit .ToString erhalte ich auch nur den Objektnamen.
    Danke, habe ich gemacht. Ausgabe bleibt allerdings leer.

    So sieht der Code mittlerweile aus:

    VB.NET-Quellcode

    1. Private Cookies As System.Net.CookieContainer = New CookieContainer
    2. Private Function Req(ByVal Site As String, ByVal P As String, ByVal Method As String, ByVal Host As String) As String
    3. Dim CookieCount As Double = 0
    4. Dim R As HttpWebRequest = HttpWebRequest.Create(Site)
    5. R.Method = Method
    6. R.ServicePoint.Expect100Continue = False
    7. R.CookieContainer = Cookies
    8. R.Host = Host
    9. R.MaximumAutomaticRedirections = 20
    10. R.AllowAutoRedirect = True
    11. R.Referer = ""
    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 = P
    15. R.ContentLength = Post.Length
    16. Dim writer As New IO.StreamWriter(R.GetRequestStream(), System.Text.Encoding.ASCII)
    17. writer.Write(Post)
    18. writer.Close()
    19. Dim Response As HttpWebResponse = DirectCast(R.GetResponse, HttpWebResponse)
    20. Response.Cookies = R.CookieContainer.GetCookies(R.RequestUri)
    21. Dim Reader As IO.StreamReader = New IO.StreamReader(Response.GetResponseStream)
    22. Debug.Print(Reader.ReadToEnd())
    23. Dim SourceCode As String = Reader.ReadToEnd
    24. Reader.Close()
    25. For Each SetCookie As Cookie In Response.Cookies
    26. Debug.Print(SetCookie.Name)
    27. Next
    28. Return SourceCode
    29. End Function