所以我在尝试使用 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 下面在我的代码的第二部分。但是所有的数据看起来都是这样的: