所以我在尝试使用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。但所有数据看起来都像这样:
答案 0 :(得分:0)
简短回答:
csrftoken可以获得响应标题。
所以在做POST之前,只需做一个GET,然后作为回应你会得到并拥有csrftoken,然后在POST参数中使用它......