0

所以我在尝试使用 vb.net 中的 httpwebrequests 登录网站时遇到了一些问题。该站点没什么了不起的,因此绝对可以登录。但是我遇到的问题是cookie容器。有人告诉我不要担心 cookie,也不要包含它们,而其他人告诉我只需将变量作为新的 cookie 容器,它将存储站点中的所有 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

结束类

所以是的,我忘了提到我实际上无法得到回复 - 我认为这是由于我的 cookie 但我不知道?感谢您对我应该去的地方提供任何帮助。

同样在任何人说确保所有标题都相同之前 - 我有多次,唯一认为我无法复制的是 cookie。

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

输出(注意这是一个网络浏览器)

4

1 回答 1

0

简而言之:

csrftoken 可以在响应头中获取。

所以在进行 POST 之前,只需执行 GET,然后作为响应,您将获得并拥有 csrftoken ,然后在 POST 参数中使用它...

于 2018-05-31T03:41:52.043 回答