Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 如何捕获发送到重定向URL的post数据(VB 2010)_Vb.net - Fatal编程技术网

Vb.net 如何捕获发送到重定向URL的post数据(VB 2010)

Vb.net 如何捕获发送到重定向URL的post数据(VB 2010),vb.net,Vb.net,我正试图通过我的Windows窗体应用程序(VB2010)登录到一个网页,并得到一些响应,但我不知道怎么做 此处描述了服务器服务: 一开始,我试图将WebBrowser控件插入到表单中,但我也读了很多文章,在这里,使用BeforeNavigate2事件是一种旧方法 我想这样做: 向Web服务器发送HTTP请求,包括用户名和密码 捕获发送到重定向URL的post数据 读取POST请求正文和get loginStatus和productToken(SSOID) 这是我的代码: Private Su

我正试图通过我的Windows窗体应用程序(VB2010)登录到一个网页,并得到一些响应,但我不知道怎么做

此处描述了服务器服务:

一开始,我试图将WebBrowser控件插入到表单中,但我也读了很多文章,在这里,使用BeforeNavigate2事件是一种旧方法

我想这样做:

  • 向Web服务器发送HTTP请求,包括用户名和密码
  • 捕获发送到重定向URL的post数据
  • 读取POST请求正文和get loginStatus和productToken(SSOID)
  • 这是我的代码:

    Private Sub getPOST()
        ' Create a request for the URL
        Dim request As WebRequest = _
            WebRequest.Create("https://identitysso.betfair.com/view/login?product=82&url=https://www.betfair.com&username=abc&password=abc")
        request.Method = "POST"
        ' Get the response
        Dim response As HttpWebResponse = CType(request.GetResponse(), HttpWebResponse)
        ' Get the stream containing content returned by the server.
        Dim dataStream As Stream = response.GetResponseStream()
        ' Open the stream using a StreamReader for easy access.
        Dim reader As New StreamReader(dataStream)
        ' Read the content.
        Dim responseFromServer As String = reader.ReadToEnd()
        ' Display the content.
        RichTextBox1.Text = responseFromServer
        ' Cleanup the streams and the response.
        reader.Close()
        dataStream.Close()
        response.Close()
    End Sub
    

    但此代码返回的页面HTML代码不是loginStatus和SSOID。

    我检查了此页面,发现您的代码存在一些问题: 首先,您发布到错误的URL,因为www.betfair.com/view/login表单具有action=“/api/login”,而不是“/view/login”。其次,您在QueryString中传递用户名/密码,而不是在POSTDATA中传递。。。此表单使用method=post。第三,您没有传递所有必填字段。此代码段应解决上述问题,并回答有关获取重定向URL的问题:

    Sub TestWebClient()
    
        ' Create a request for the URL
        ' You were using the wrong URL & passing the values improperly
        ' I also changed this to HttpWebRequest, used to be WebRequest.
        Dim request As HttpWebRequest = WebRequest.Create("https://identitysso.betfair.com/api/login") '
        request.Method = "POST"
    
        ' New code added
        request.ContentType = "application/x-www-form-urlencoded"
    
        ' New code added, this prevents the following of the 302 redirect in the Location header
        request.AllowAutoRedirect = False
    
        ' New code added, this sends the values as POSTDATA, which is contained inside the HTTP POST request rather than in the URL
        Using writer As New StreamWriter(request.GetRequestStream)
            writer.Write("username=abc")
            writer.Write("&password=abc")
            writer.Write("&login=true")
            writer.Write("&redirectMethod=POST")
            writer.Write("&product=82")
            writer.Write("&url=https://www.betfair.com/")
            writer.Write("&ioBlackBox=")
        End Using
    
        ' Get the response
        ' This will print the Location header (aka "Redirect URL") on the screen for you
        ' Make decisions as needed.
        Dim response As HttpWebResponse = request.GetResponse()
        Console.WriteLine("HTTP RESPONSE HEADERS:")
        For Each item In response.Headers
            Console.WriteLine(item & "=" & response.Headers(item))
        Next
        Console.ReadLine()
    
    End Sub
    

    您有两个(主要)选项:要么模仿用户的行为,要么依赖给定站点的功能(例如API);在第二种情况下,您必须遵循站点的说明。在选择第一个选项的情况下,您必须确保正确考虑给定站点的安全性,避免使用某些方法(至少在其默认配置中)。根据您的描述,我并不完全清楚您为什么决定不使用Webbrowser;原则上,它似乎是最简单/对程序员友好的选择。。。。。。只需在完全加载的文档中创建一个导航到登录页面的webbrowser,查找字段(例如,“用户名”和“密码”)和按钮(“登录”),只需执行给定的命令(更改值并单击按钮),并查看浏览器如何导航到给定的登录页面(以防一切正常)。您可以查看大量的webbrowser代码,记住这是一个相当大的站点,您甚至可以找到处理此特定问题的实现。关于你所做的事情没有太多经验,但似乎不太正确。我阅读了这个主题的答案,我还尝试使用.NET WebBrowser获取帖子数据,或者以这种方式找到一些现有的解决方案,但没有成功。这篇帖子没有遇到我提出的问题。正如我所说,有很多代码在做这件事。快速搜索后的示例:首先,您必须构建浏览器并获取文档(非常简单;也需要大量资源)。依赖POST基本上就是将web相关概念(PHP概念)应用到.NET,这通常是一种糟糕的方法。在.NET中使用默认对象(通过WebBrowser浏览)要比模拟其他地方的操作要好得多(.NET能够以多种不同的方式完成许多事情)。我相信,通过WebBrowser Componet解决这个问题更好。我试试看。谢谢。你的代码看起来很好,但我从服务器()得到了答案,我应该得到无效的\u用户名\u或\u密码。也许,我们需要对你的代码做一些小的修改。谢谢。我不能正式测试这个,因为我没有登录这个网站,但我可以在本地复制大部分行为。我改变了答案。。。在发送多个POST值时,您似乎需要包含一个符号和(&)。我使用符号和从服务器获得正确答案,无效的用户名或密码,但在输入正确的用户名和密码时也会收到此消息。不管怎样,我现在离找到解决办法更近了。非常感谢。您能使用相同的用户名和密码手动登录网站吗?是的,我可以手动登录。我认为,您的代码是可以的,但问题是请求的时间可能很短。我读了一些关于异步请求的文章,但这有点复杂。也许这就是路。但我也想尝试WebBrowser组件,并在那里发布帖子。现在我不确定哪条路更好。