VB.net中的HttpWebRequests和Cookies

时间:2017-10-04 21:19:28

标签: vb.net cookies httpwebrequest postdata cookiecontainer

所以我在尝试使用vb.net中的httpwebrequests登录网站时遇到了一些问题。该网站并不是什么惊人的,所以它绝对可以登录。但我遇到的问题是cookie容器。我被一个人告知不要担心cookie而不包括它们,而有人告诉我只是将变量作为一个新的cookiecontainer并且它将存储来自网站的所有cookie而不必将它们放入手动。但是为了登录网站,帖子数据需要存储在cookie中的csrftoken。但是,它也可以从源代码中删除。但是我想知道在我登录之前cookie是如何从我试图登录我的cookie容器的网站获取的,所以我可以在帖子数据中使用cookie中的csrftoken,这样我就可以登录了? 这是我的代码:(注意我抓了csrftoken,因为我不知道如何从容器中获取它)

Imports System.Net
Imports System.Text
Imports System.IO
Imports HtmlAgilityPack

Public Class Form1
Dim csrftoken As String
Dim logincookie As New CookieContainer
Dim uri As Uri = New Uri("site")
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim sourceString As String = New System.Net.WebClient().DownloadString("site")
    Dim doc As New HtmlDocument
    doc.LoadHtml(sourceString)
    For Each node As HtmlAgilityPack.HtmlNode In doc.DocumentNode.SelectNodes("//*[@id=""login_inputs""]/form/input[1]")
        Dim csrftokenmixed As String = node.OuterHtml
        Dim cutat As String = "value='"
        Dim x As Integer = InStr(csrftokenmixed, cutat)
        Dim csrftoken1 As String = csrftokenmixed.Substring(x + cutat.Length - 1)
        Dim cutat2 As String = "'"
        Dim x2 As Integer = InStr(csrftoken1, cutat2)
        csrftoken = csrftoken1.Substring(0, x2 - 1)

    Next

'注意我知道这个编码很难编码,但我只是测试它,我只是复制并粘贴了一些代码以获得价值。

    Dim username As String = TextBox1.Text
    Dim password As String = TextBox2.Text

    Dim postData As String = "next=&csrfmiddlewaretoken=" & csrftoken & "&username=" & username & "&password=" & password
    Dim tempCookies As New CookieContainer
    Dim encoding As New UTF8Encoding
    Dim byteData As Byte() = encoding.GetBytes(postData)
    Dim postReq As HttpWebRequest = DirectCast(WebRequest.Create("site"), HttpWebRequest)
    postReq.Method = "POST"
    postReq.Host = "site.com"
    postReq.KeepAlive = True
    postReq.ContentLength = byteData.Length
    postReq.Headers.Add("Cache-Control", "max-age=0")
    postReq.Headers.Add("Origin", "site")
    postReq.Headers.Add("Upgrade-Insecure-Requests", "1")
    postReq.ContentType = "application/x-www-form-urlencoded"
    postReq.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"
    postReq.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8"
    postReq.Referer = "site"
    postReq.Headers.Add("Accept-Encoding", "gzip, deflate, br")
    postReq.Headers.Add("Accept-Language", "en-GB,en-US;q=0.8,en;q=0.6")
    *tempCookies*.Add(uri, New Cookie("csrftoken", csrftoken))
    postReq.CookieContainer = tempCookies

    Dim postreqstream As Stream = postReq.GetRequestStream()
    postreqstream.Write(byteData, 0, byteData.Length)
    postreqstream.Close()

    For Each tempCookie In *tempCookies*.GetCookies(uri)
        Debug.Print(tempCookie.name & " = " & tempCookie.value)
    Next

这是代码在尝试获取响应时遇到的问题 - 错误403远程服务器返回错误 - 禁止。

    Dim postresponse As HttpWebResponse
    postresponse = DirectCast(postReq.GetResponse(), HttpWebResponse)
    tempCookies.Add(postresponse.Cookies)
    logincookie = tempCookies

    Dim postreqreader As New StreamReader(postresponse.GetResponseStream())

    Dim thepage As String = postreqreader.ReadToEnd
    WebBrowser1.DocumentText = thepage
End Sub

结束班

所以是的,我忘了提到我实际上无法得到回复 - 我认为这是由于我的饼干,但我不知道?我应该去哪里寻求帮助。

此外,在任何人说要确保所有标题都相同之前 - 我有多次,并且唯一认为我无法复制的是teh cookies。

更新:刚刚意识到我使用logincookie作为cookiecontainer而不是tempCookies - 所以我基本上用我的代码的第二部分中的tempCookies替换所有的logincookies。但所有数据看起来都像这样:

Output (note this is a webbrowser)

1 个答案:

答案 0 :(得分:0)

简短回答:

csrftoken可以获得响应标题。

所以在做POST之前,只需做一个GET,然后作为回应你会得到并拥有csrftoken,然后在POST参数中使用它......