使用HtppWebRequest发布的表单数据无效

阿德南·亚辛(Adnan Yaseen)

我碰到了一个看起来很简单的网站,以至于我很有信心可以使用HttpWebRequest读取其数据,并且能够执行GET和POST请求。GET请求工作正常。POST请求也不会产生任何错误,但是发布的表单数据仍然对返回的结果没有影响。发布的表单数据具有用于按日期过滤数据的字段,但是无论是否发布了所有必需数据,都不会过滤返回的数据。我添加了每个标头,表单数据,并在请求中添加了cookie。

该网页的网址为http://www.bseindia.com/corporates/Insider_Trading_new.aspx?expandable=0

这似乎是一个非常普通的网站,但由于它是一个aspx页面,并且涉及ViewState和Event Validation,因此,这并非易事。

我的第一步是使用Fiddler分析站点的GET和POST,这让我感到惊讶,因为Fiddler并未捕获此URL的任何流量。我已经尝试过Charles,但是它本身并未捕获此URL。除此以外,Url Fiddler和Charles都在捕获其他所有内容。我还想提到,当我使用HttpWebRequest从控制台应用程序调用Url时,Fiddler和Charles都捕获了它,但是他们没有从Chrome,FireFox和Internet Explorer 11捕获它。

因此,我使用FireFox中的Developer工具分析了网络活动,所有可见的内容都包括(标题,参数和Cookies)。在Chrome中,不存在Cookie。当我通过创建HttpWebRequest检查cookie并获得响应时,没有cookie存在。因此,使用此网站确实有些奇怪。

我已经设法创建了一个简单的函数来创建请求并获得响应。我正在做的是先创建一个GET请求并获取网站字符串,然后从中提取Viewstate,EventValidation等。我使用此信息在第二个HttpWebRequest中使用它。现在一切正常,我得到了回应,但没有达到预期。我想要两个给定日期之间的记录,并且已经在表单数据中指定了这些日期,但是POST请求仍未返回过滤后的数据。我已经在下面提到了我创建的函数,并且我将非常感谢有关为什么发生这种情况以及如何处理此问题的任何建议。理解这已经成为我的挑战,因为我无法理解为什么这个简单的网站没有出现在Fiddler中。(这使用Javascript回发)

该代码看起来很长而且很吓人,但它非常简单直接。

Try

        ' First GET Request to obtain Viewstate, Eventvalidation etc
        Dim objRequest2 As Net.HttpWebRequest = DirectCast(HttpWebRequest.Create("http://www.bseindia.com/corporates/Insider_Trading_new.aspx?expandable=0"), HttpWebRequest)
        objRequest2.Method = "GET"
        objRequest2.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"
        objRequest2.Headers.Add("Accept-Encoding", "gzip, deflate")
        objRequest2.Headers.Add("Accept-Language", "en-GB,en-US;q=0.8,en;q=0.6,ur;q=0.4")
        objRequest2.KeepAlive = True
        objRequest2.ContentType = "application/x-www-form-urlencoded"
        objRequest2.Host = "www.bseindia.com"
        objRequest2.UserAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36"

        objRequest2.AutomaticDecompression = DecompressionMethods.Deflate Or DecompressionMethods.GZip

        Dim LoginRes2 As Net.HttpWebResponse
        Dim sr2 As IO.StreamReader
        LoginRes2 = objRequest2.GetResponse()

        sr2 = New IO.StreamReader(LoginRes2.GetResponseStream)
        Dim getString As String = sr2.ReadToEnd()
        Dim getCookieCollection = objRequest2.CookieContainer

        ' get the page ViewState                
        Dim viewStateFlag As String = "id=""__VIEWSTATE"" value="""
        Dim i As Integer = getString.IndexOf(viewStateFlag) + viewStateFlag.Length
        Dim j As Integer = getString.IndexOf("""", i)
        Dim viewState As String = getString.Substring(i, j - i)

        ' get page EventValidation                
        Dim eventValidationFlag As String = "id=""__EVENTVALIDATION"" value="""
        i = getString.IndexOf(eventValidationFlag) + eventValidationFlag.Length
        j = getString.IndexOf("""", i)
        Dim eventValidation As String = getString.Substring(i, j - i)

        ' get page EventValidation                
        Dim viewstateGeneratorFlag As String = "id=""__VIEWSTATEGENERATOR"" value="""
        i = getString.IndexOf(viewstateGeneratorFlag) + viewstateGeneratorFlag.Length
        j = getString.IndexOf("""", i)
        Dim viewStateGenerator As String = getString.Substring(i, j - i)

        viewState = System.Web.HttpUtility.UrlEncode(viewState)
        eventValidation = System.Web.HttpUtility.UrlEncode(eventValidation)

        Dim LoginRes As Net.HttpWebResponse
        Dim sr As IO.StreamReader
        Dim objRequest As Net.HttpWebRequest

        ' Second POST request to post the form data along with cookies
        objRequest = DirectCast(HttpWebRequest.Create("http://www.bseindia.com/corporates/Insider_Trading_new.aspx?expandable=0"), HttpWebRequest)

        Dim formDataCollection As New NameValueCollection

        formDataCollection.Add("__EVENTTARGET", "")
        formDataCollection.Add("__EVENTARGUMENT", "")
        formDataCollection.Add("__VIEWSTATE", viewState)
        formDataCollection.Add("__VIEWSTATEGENERATOR", viewStateGenerator)
        formDataCollection.Add("__EVENTVALIDATION", eventValidation)
        formDataCollection.Add("fmdate", "20160104")
        formDataCollection.Add("eddate", "20160204")
        formDataCollection.Add("hidCurrentDate", "2016/02/04")
        formDataCollection.Add("ctl00_ContentPlaceHolder1_hdnCode", "")
        formDataCollection.Add("txtDate", "04/01/2016")
        formDataCollection.Add("ddlCalMonthDiv3", "1")
        formDataCollection.Add("ddlCalYearDiv3", "2016")
        formDataCollection.Add("txtTodate", "04/02/2016")
        formDataCollection.Add("ddlCalMonthDiv4", "2")
        formDataCollection.Add("ddlCalYearDiv4", "2016")
        formDataCollection.Add("Hidden1", "")
        formDataCollection.Add("ctl00_ContentPlaceHolder1_GetQuote1_smartSearch", "Enter Security Name / Code / ID")
        formDataCollection.Add("btnSubmit.x", "44")
        formDataCollection.Add("btnSubmit.y", "2")

        Dim strFormdata As String = formDataCollection.ToString()
        Dim encoding As New ASCIIEncoding
        Dim postBytes As Byte() = encoding.GetBytes(strFormdata)

        objRequest.Method = "POST"
        objRequest.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"
        objRequest.Headers.Add("Accept-Encoding", "gzip, deflate")
        objRequest.Headers.Add("Accept-Language", "en-GB,en-US;q=0.8,en;q=0.6,ur;q=0.4")
        objRequest.Headers.Add("Cache-Control", "private, max-age=60")
        objRequest.KeepAlive = True
        objRequest.ContentType = "application/x-www-form-urlencoded"
        objRequest.Host = "www.bseindia.com"
        objRequest.Headers.Add("Origin", "http://www.bseindia.com")
        objRequest.Referer = "http://www.bseindia.com/corporates/Insider_Trading_new.aspx?expandable=0"
        objRequest.Headers.Add("Upgrade-Insecure-Requests", "1")
        objRequest.UserAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36"

        objRequest.ContentType = "text/html; charset=utf-8"
        objRequest.Date = "Thu, 04 Feb 2016 13:42:04 GMT"
        objRequest.Headers.Add("Server", "Microsoft-IIS/8.0")
        objRequest.Headers.Add("Vary", "Accept-Encoding")
        objRequest.Headers.Add("X-AspNet-Version", "2.0.50727")
        objRequest.Headers.Add("ASP.NET", "ASP.NET")

        objRequest.AutomaticDecompression = DecompressionMethods.Deflate Or DecompressionMethods.GZip

        Dim gaCookies As New CookieContainer()

        Dim cookie1 As New Cookie("__asc", "f673f0d5152a823bc335f575d34")
        cookie1.Domain = ".bseindia.com"
        cookie1.Path = "/"
        gaCookies.Add(cookie1)

        Dim cookie2 As New Cookie("__auc", "f673f0d5152a823bc335f575d34")
        cookie2.Domain = ".bseindia.com"
        cookie2.Path = "/"
        gaCookies.Add(cookie2)

        Dim cookie3 As New Cookie("__utma", "253454874.280640365.1454519857.1454519865.1454519865.1")
        cookie3.Domain = ".bseindia.com"
        cookie3.Path = "/"
        gaCookies.Add(cookie3)

        Dim cookie4 As New Cookie("__utmb", "253454874.1.10.1454519865")
        cookie4.Domain = ".bseindia.com"
        cookie4.Path = "/"
        gaCookies.Add(cookie4)

        Dim cookie5 As New Cookie("__utmc", "253454874")
        cookie5.Domain = ".bseindia.com"
        cookie5.Path = "/"
        gaCookies.Add(cookie5)

        Dim cookie6 As New Cookie("__utmt", "1")
        cookie6.Domain = ".bseindia.com"
        cookie6.Path = "/"
        gaCookies.Add(cookie6)

        Dim cookie7 As New Cookie("__utmz", "253454874.1454519865.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)")
        cookie7.Domain = ".bseindia.com"
        cookie7.Path = "/"
        gaCookies.Add(cookie7)

        Dim cookie8 As New Cookie("_ga", "GA1.2.280640365.1454519857")
        cookie8.Domain = ".bseindia.com"
        cookie8.Path = "/"
        gaCookies.Add(cookie8)

        Dim cookie9 As New Cookie("_gat", "1")
        cookie9.Domain = ".bseindia.com"
        cookie9.Path = "/"
        gaCookies.Add(cookie9)

        Dim postStream As Stream = objRequest.GetRequestStream()
        postStream.Write(postBytes, 0, postBytes.Length)
        postStream.Flush()
        postStream.Close()

        LoginRes = objRequest.GetResponse()
        sr = New IO.StreamReader(LoginRes.GetResponseStream)

        ReadWebsite = sr.ReadToEnd()

        sr.Close()
        sr = Nothing
        LoginRes.Close()
        LoginRes = Nothing
        objRequest = Nothing
        Exit Function

    Catch ex As Exception
        ReadWebsite = Nothing
    End Try

注意:(未包含viewstate和eventvalidation的日期的原始表单数据)

fmdate:20160130 eddate:20160205 hidCurrentDate:2016/02/05 ctl00_ContentPlaceHolder1_hdnCode:txtDate:04/01/2016 ddlCalMonthDiv3:1 ddlCalYearDiv3:2016 txtTodate:04/02/2016 ddlCalMonthDiv4_Hi1_Get1_Quent_Get1_QuidH_Den4_Hid_Cent_1_D1C4D1:HidCurrent_Date4:2 ddlCal1Enter / ID btnSubmit.x:55 btnSubmit.y:13

埃德

您可以考虑在浏览器中运行站点,并使用工具控制浏览器,而不是直接发出GET / POST请求。与您当前的方法相比,这可能更容易并且更健壮。

例如Selenium Web驱动程序http://www.seleniumhq.org/projects/webdriver/

您将加载页面,设置表单字段的值(使用css样式选择器查找适当的字段),然后单击按钮。您可以自动执行所有操作并获取页面源代码(不幸的是,在运行javascript之后,我不认为您可以在当前状态下获取完整的html,但可能可以使用api获取所需的元素)。

api文档:http : //seleniumhq.github.io/selenium/docs/api/dotnet/

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用$ resource发布表单数据

来自分类Dev

使用JQuery Ajax发布表单数据时无效的参数错误

来自分类Dev

如何使用Power Query的Web发布内容/表单数据

来自分类常见问题

如何使用提取API发布表单数据?

来自分类Dev

尝试使用JQuery将表单数据发布到servlet

来自分类Dev

使用URL重写时不发布表单数据

来自分类Dev

如何使用多部分/表单数据发布Facebook照片

来自分类Dev

在Delphi中使用idHTTP发布表单数据

来自分类Dev

无法使用Fetch TYPESCRIPT发布多部分/表单数据

来自分类Dev

如何使用HttpClient发布表单数据IFormFile?

来自分类Dev

使用Apache Bench发布多部分/表单数据(ab)

来自分类Dev

如何使用多部分/表单数据发布Facebook照片

来自分类Dev

使用JavaWS在表单数据中发布文件

来自分类Dev

使用ajax发布序列化表单数据

来自分类Dev

如何使用列表列表发布表单数据?

来自分类Dev

请求:发布多部分/表单数据

来自分类Dev

发布表单数据的MEAN堆栈问题

来自分类Dev

访问JavaScript中发布的表单数据

来自分类Dev

发布表单数据并查询mysql

来自分类Dev

请求:发布多部分/表单数据

来自分类Dev

用jQuery发布表单数据

来自分类Dev

如何在不使用jQuery提交表单的情况下发布表单数据?

来自分类Dev

如何使用发布多部分/表单数据的请求来排列数据和文件的顺序?

来自分类Dev

使用Angular / Nodejs将表单数据发布到MongoDB数据库

来自分类Dev

在Axios vue.js中使用多部分/表单数据发布请求发送阵列数据

来自分类Dev

Angular9使用HttpClient通过表单数据将数据发布到API

来自分类Dev

如何使用 MULTER、Nodejs 和 MySQL 发布表单数据(图像和数据)

来自分类Dev

使用thymeleaf将表单数据发布到使用@ModelAttribute的Controller(复杂对象)

来自分类Dev

不使用表单发送表单数据

Related 相关文章

  1. 1

    使用$ resource发布表单数据

  2. 2

    使用JQuery Ajax发布表单数据时无效的参数错误

  3. 3

    如何使用Power Query的Web发布内容/表单数据

  4. 4

    如何使用提取API发布表单数据?

  5. 5

    尝试使用JQuery将表单数据发布到servlet

  6. 6

    使用URL重写时不发布表单数据

  7. 7

    如何使用多部分/表单数据发布Facebook照片

  8. 8

    在Delphi中使用idHTTP发布表单数据

  9. 9

    无法使用Fetch TYPESCRIPT发布多部分/表单数据

  10. 10

    如何使用HttpClient发布表单数据IFormFile?

  11. 11

    使用Apache Bench发布多部分/表单数据(ab)

  12. 12

    如何使用多部分/表单数据发布Facebook照片

  13. 13

    使用JavaWS在表单数据中发布文件

  14. 14

    使用ajax发布序列化表单数据

  15. 15

    如何使用列表列表发布表单数据?

  16. 16

    请求:发布多部分/表单数据

  17. 17

    发布表单数据的MEAN堆栈问题

  18. 18

    访问JavaScript中发布的表单数据

  19. 19

    发布表单数据并查询mysql

  20. 20

    请求:发布多部分/表单数据

  21. 21

    用jQuery发布表单数据

  22. 22

    如何在不使用jQuery提交表单的情况下发布表单数据?

  23. 23

    如何使用发布多部分/表单数据的请求来排列数据和文件的顺序?

  24. 24

    使用Angular / Nodejs将表单数据发布到MongoDB数据库

  25. 25

    在Axios vue.js中使用多部分/表单数据发布请求发送阵列数据

  26. 26

    Angular9使用HttpClient通过表单数据将数据发布到API

  27. 27

    如何使用 MULTER、Nodejs 和 MySQL 发布表单数据(图像和数据)

  28. 28

    使用thymeleaf将表单数据发布到使用@ModelAttribute的Controller(复杂对象)

  29. 29

    不使用表单发送表单数据

热门标签

归档