对DGV单元格的HTML响应

时间:2017-11-30 10:30:59

标签: vb.net datagridview httpwebrequest

在我的应用中,我放置了几个HTTP网络请求,以验证我网站上用户的凭据。每个请求都被分解并发送到DataGridView表,其中包含3列= User,Pass和response。根据响应,可能需要使用新代理重试相同的凭据并更新响应。

我的问题是我如何同时放置几个HTTP请求,比如20,并在DGV上记录每个请求并监控响应,以防我需要交换代理并再次运行它。

以下是我发布和获取回复的方式。

Function Post(ByVal Data As String, ByVal Proxy As String)
    Dim responseData As String = ""
    Dim Site As String = "example.com"
    Dim request As Net.HttpWebRequest = Net.WebRequest.Create(Site)
    Dim tempCookies As New CookieContainer
    Dim encoding As New ASCIIEncoding()
    Dim byteData As Byte() = encoding.GetBytes(Data)
    Try
        request.UserAgent = "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.2 Safari/537.36"
        request.Accept = "*/*"
        request.CookieContainer = tempCookies
        request.ContentLength = byteData.Length
        request.AllowAutoRedirect = True
        request.KeepAlive = True
        request.Timeout = 60000
        request.Method = "POST"
        If request.Method = "POST" Then
            request.ContentType = "application/x-www-form-urlencoded"
            Dim postByteArray() As Byte = encoding.GetBytes(Data)
            request.ContentLength = postByteArray.Length
            Dim postStream As IO.Stream = request.GetRequestStream()
            postStream.Write(postByteArray, 0, postByteArray.Length)
            postStream.Close()
        End If
        Dim response As Net.HttpWebResponse = request.GetResponse()
        If response.StatusCode = Net.HttpStatusCode.OK Then
            Dim responseStream As IO.StreamReader = _
              New IO.StreamReader(response.GetResponseStream())
            responseData = responseStream.ReadToEnd()
        End If
        response.Close()
    Catch e As Exception
        responseData = "An error occurred: " & e.Message
    End Try
    Post = responseData
End Function

 Dim comboResp As String = (Post("Username=" & User + "&Password=" & Pass & "&submitLogin=Log+In&ReturnUrl=", rndProxy))
    Dim row As String() = New String() {User, Pass, comboResp}
    DataGridView1.Rows.Add(row)

我似乎无法得到要在单元格中显示的响应,然后根据每行的响应不知道如何调用sub。

我所追求的最近的例子是Sentry MBA。

1 个答案:

答案 0 :(得分:0)

假设您从Button.Click事件处理程序启动您的进程:

Imports System.IO
Imports System.Net
Imports System.Text

Const COR_E_INVALIDOPERATION As Long = &H80131509
'A class used to contain all requests data
Private _AuthenticationObject As AuthObject
'A List of UserIds as Passwords KeyValue pairs
Private _CredentialsList As New Dictionary(Of String, String)

Private Async Sub btnTestLogin_Click(sender As Object, e As EventArgs) Handles btnTestLogin.Click
    btnTestLogin.Enabled = False
    'Fill a list of credentials (the use of a Dictionary is just one possible method)
    _CredentialsList.Add("Username1", "Password1")
    _CredentialsList.Add("Username2", "Password2")
    _CredentialsList.Add("Username3", "Password3")

    _AuthenticationObject = New AuthObject
    _AuthenticationObject.URL = "http://somesite.com"

    _AuthenticationObject.ProxyParameters.Host = "somehostaddress"
    _AuthenticationObject.ProxyParameters.Port = 8080
    'Or simple proxy URI
    '_AuthenticationObject.ProxyParameters.Uri = New Uri("http://someproxyhost")
    _AuthenticationObject.ProxyParameters.BypassLocal = False
    _AuthenticationObject.ProxyParameters.Credentials = New String() {"proxyuserid", "proxypassword"}

    'If you don't want to use an Async starter, use this
    'And of course => For Each _item In _result.Result
    'Dim _result As Task(Of List(Of String())) = Task.Run(Function() CheckAuthentication(_AuthenticationObject, True))
    'Task.WaitAny(_result)

    Dim _result As List(Of String()) = Await CheckAuthentication(_AuthenticationObject, False)

    For Each _item In _result
        DataGridView1.Rows.Add(_item)
    Next

    btnTestLogin.Enabled = True
End Sub

这是一个用于协调顺序请求的网关函数:

Public Async Function CheckAuthentication(ByVal _AuthenticationObject As AuthObject, ByVal _useproxy As Boolean) As Task(Of List(Of String()))
    Dim _authresult As List(Of String()) = New List(Of String())

    _AuthenticationObject.UseProxy = _useproxy

    For Each _item In _CredentialsList
        _AuthenticationObject.LogInData = "Username=" & _item.Key & "&Password=" & _item.Value & "&submitLogin=Log+In&ReturnUrl="

        'This an Async version of you original function, plus some editing
        '_AuthenticationObject = Await PostAsync(_AuthenticationObject)

        'Test it first using a delay
        Await Task.Delay(1000)

        _authresult.Add(New String() {_item.Key,
                                      _item.Value,
                                      If(_AuthenticationObject.StatusCode = HttpStatusCode.OK, "OK", "Failed"),
                                      If(_AuthenticationObject.UseProxy = True, "Proxy", "No Proxy")})
    Next
    Return _authresult
End Function


这是您编辑的原始功能,以支持更复杂的身份验证对象

Private Async Function PostAsync(ByVal _PostData As AuthObject) As Task(Of AuthObject)

    Dim httpRequest As HttpWebRequest
    Dim _StatusCode As HttpStatusCode
    Dim _Payload As String = String.Empty
    Dim _postparameters As Byte() = Encoding.UTF8.GetBytes(_PostData.LogInData)

    Try
        httpRequest = WebRequest.CreateHttp(_PostData.URL)
        httpRequest.Timeout = 10000
        httpRequest.AllowAutoRedirect = False
        httpRequest.ServicePoint.Expect100Continue = False
        httpRequest.AutomaticDecompression = DecompressionMethods.GZip Or DecompressionMethods.Deflate
        httpRequest.UserAgent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0"
        httpRequest.Accept = "ext/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
        httpRequest.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip, deflate;q=0.8")

        httpRequest.Method = WebRequestMethods.Http.Post
        httpRequest.ContentType = "application/x-www-form-urlencoded"
        httpRequest.ContentLength = _postparameters.Length

        If _PostData.UseProxy Then
            If Not IsNothing(_PostData.ProxyParameters) Then
                If (_PostData.ProxyParameters.Host.Length > 0) Then
                    httpRequest.Proxy = New WebProxy(_PostData.ProxyParameters.Host, _PostData.ProxyParameters.Port)
                Else
                    httpRequest.Proxy = New WebProxy(_PostData.ProxyParameters.Uri, _PostData.ProxyParameters.BypassLocal)
                End If
                httpRequest.Proxy.Credentials = New NetworkCredential(_PostData.ProxyParameters.Credentials(0), _
                                                                                        _PostData.ProxyParameters.Credentials(1))
            Else
                httpRequest.Proxy = WebRequest.GetSystemWebProxy()
            End If
        End If

        Using _stream As Stream = Await httpRequest.GetRequestStreamAsync()
            _stream.Write(_postparameters, 0, _postparameters.Length)
        End Using

        Using httpResponse As HttpWebResponse = CType(Await httpRequest.GetResponseAsync(), HttpWebResponse)
            Dim _encoding As System.Text.Encoding

            _encoding = If(httpResponse.CharacterSet.Length > 0, 
                           Encoding.GetEncoding(httpResponse.CharacterSet), 
                           Encoding.GetEncoding("utf-8"))

            Using _stream As Stream = httpResponse.GetResponseStream()
                _stream.Position = 0
                Using _reader As StreamReader = New StreamReader(_stream, _encoding)
                    _Payload = _reader.ReadToEnd().Trim()
                End Using
            End Using
            _StatusCode = httpResponse.StatusCode
        End Using

    Catch exW As WebException
        If Not IsNothing(exW.Response) Then
            _StatusCode = CType(exW.Response, HttpWebResponse).StatusCode
        End If
        _Payload = String.Empty
    Catch exS As System.Exception
        _StatusCode = If(exS.HResult = COR_E_INVALIDOPERATION,
                         CType(WebExceptionStatus.ConnectFailure, HttpStatusCode),
                         CType(WebExceptionStatus.RequestCanceled, HttpStatusCode))
        _Payload = String.Empty
    End Try

    _PostData.StatusCode = _StatusCode
    _PostData.PayLoad = _Payload

    Return _PostData

End Function

这些是使用的类对象:

Public Class AuthObject

    Private _URL As String = String.Empty
    Private _LogInData As String = String.Empty
    Private _UseProxy As Boolean = False
    Private _ProxyParameters As ProxyParameters
    Private _PayLoad As String = String.Empty
    Private _StatusCode As HttpStatusCode

    Public Sub New()
        Me._ProxyParameters = New ProxyParameters
    End Sub

    Public Property URL() As String
        Get
            Return Me._URL
        End Get
        Set(ByVal value As String)
            Me._URL = value
        End Set
    End Property

    Public Property LogInData() As String
        Get
            Return Me._LogInData
        End Get
        Set(ByVal value As String)
            Me._LogInData = value
        End Set
    End Property

    Public Property UseProxy() As Boolean
        Get
            Return Me._UseProxy
        End Get
        Set(ByVal value As Boolean)
            Me._UseProxy = value
        End Set
    End Property

    Public Property ProxyParameters() As ProxyParameters
        Get
            Return Me._ProxyParameters
        End Get
        Set(ByVal value As ProxyParameters)
            Me._ProxyParameters = value
        End Set
    End Property

    Public Property PayLoad() As String
        Get
            Return Me._PayLoad
        End Get
        Set(ByVal value As String)
            Me._PayLoad = value
        End Set
    End Property

    Public Property StatusCode() As HttpStatusCode
        Get
            Return Me._StatusCode
        End Get
        Set(ByVal value As HttpStatusCode)
            Me._StatusCode = value
        End Set
    End Property

End Class

Public Class ProxyParameters

    Private _Uri As Uri
    Private _Host As String
    Private _Port As Integer
    Private _Credentials As String()
    Private _BypassLocal As Boolean

    Public Sub New()

    End Sub

    Public Property Uri() As Uri
        Get
            Return Me._Uri
        End Get
        Set(ByVal value As Uri)
            Me._Uri = value
        End Set
    End Property

    Public Property Host() As String
        Get
            Return Me._Host
        End Get
        Set(ByVal value As String)
            Me._Host = value
        End Set
    End Property

    Public Property Port() As Integer
        Get
            Return Me._Port
        End Get
        Set(ByVal value As Integer)
            Me._Port = value
        End Set
    End Property

    Public Property Credentials() As String()
        Get
            Return Me._Credentials
        End Get
        Set(ByVal value As String())
            Me._Credentials = value
        End Set
    End Property

    Public Property BypassLocal() As Boolean
        Get
            Return Me._BypassLocal
        End Get
        Set(ByVal value As Boolean)
            Me._BypassLocal = value
        End Set
    End Property
End Class