Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/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
使用MSXML2.XMLHTTP而不是InternetExplorer.Application和VBA登录网站_Vba_Login_Msxml - Fatal编程技术网

使用MSXML2.XMLHTTP而不是InternetExplorer.Application和VBA登录网站

使用MSXML2.XMLHTTP而不是InternetExplorer.Application和VBA登录网站,vba,login,msxml,Vba,Login,Msxml,首次投寄 我正试图从我必须登录的网站页面上获取ID“dadosDoUsuario”。我使用“InternetExplorer.Application”对象使其正常工作,但在使用“MSXML2.XMLHTTP”对象时无法获取ID值。它似乎不会经过登录页面,因为我可以从该页面获取其他ID(例如:“Titolopagina”)。有人能给我一个提示,说明我在登录后如何从页面获取数据吗?谢谢 InternetExplorer.应用程序代码(此代码有效): MSXML2.XMLHTTP代码(此代码无效):

首次投寄

我正试图从我必须登录的网站页面上获取ID“dadosDoUsuario”。我使用“InternetExplorer.Application”对象使其正常工作,但在使用“MSXML2.XMLHTTP”对象时无法获取ID值。它似乎不会经过登录页面,因为我可以从该页面获取其他ID(例如:“Titolopagina”)。有人能给我一个提示,说明我在登录后如何从页面获取数据吗?谢谢

InternetExplorer.应用程序代码(此代码有效):

MSXML2.XMLHTTP代码(此代码无效):

编辑:我按照@Florent B建议的步骤,添加了一个scripcontrol来获取uu VIEWSTATE、u VIEWSTATEGENERATOR和u EVENTVALIDATION的编码值。开始工作了

Sub testXMLHTTP()
Dim xml As Object
Dim html As HTMLDocument
Dim dados As Object
Dim text As Object
Dim html2 As HTMLDocument
Dim xml2 As Object

Set xml = CreateObject("Msxml2.ServerXMLHTTP.6.0")
Set html = CreateObject("htmlFile")


With xml
  .Open "GET", "https://www.nfp.fazenda.sp.gov.br/Login.aspx", False
  .send
End With

strCookie = xml.getResponseHeader("Set-Cookie")

html.body.innerhtml = xml.responseText

Set objvstate = html.GetElementById("__VIEWSTATE")
Set objvstategen = html.GetElementById("__VIEWSTATEGENERATOR")
Set objeventval = html.GetElementById("__EVENTVALIDATION")

vstate = objvstate.Value
vstategen = objvstategen.Value
eventval = objeventval.Value

'URL Encode ViewState
    Dim ScriptEngine As ScriptControl
    Set ScriptEngine = New ScriptControl
    ScriptEngine.Language = "JScript"
    ScriptEngine.AddCode "function encode(vstate) {return encodeURIComponent(vstate);}"
    Dim encoded As String
    encoded = ScriptEngine.Run("encode", vstate)
    vstate = encoded
'URL Encode Event Validation
    ScriptEngine.AddCode "function encode(eventval) {return encodeURIComponent(eventval);}"
    encoded = ScriptEngine.Run("encode", eventval)
    eventval = encoded
'URL Encode ViewState Generator
    ScriptEngine.AddCode "function encode(vstategen) {return encodeURIComponent(vstategen);}"
    encoded = ScriptEngine.Run("encode", vstategen)
    vstategen = encoded

Postdata = "__EVENTTARGET=" & "&__EVENTARGUMENT=" & "&__VIEWSTATE=" & vstate & "&__VIEWSTATEGENERATOR=" & vstategen & "&__EVENTVALIDATION=" & eventval & "&ctl00$ddlTipoUsuario=#rdBtnNaoContribuinte" & "&ctl00$UserNameAcessivel=Digite+o+Usuário" & "&ctl00$PasswordAcessivel=x" & "&ctl00$ConteudoPagina$Login1$rblTipo=rdBtnNaoContribuinte" & "&ctl00$ConteudoPagina$Login1$UserName=MYUSERNAME" & "&ctl00$ConteudoPagina$Login1$Password=MYPASSWORD" & "&ctl00$ConteudoPagina$Login1$Login=Acessar" & "&ctl00$ConteudoPagina$Login1$txtCpfCnpj=Digite+o+Usuário"

Set xml2 = CreateObject("Msxml2.ServerXMLHTTP.6.0")
Set html2 = CreateObject("htmlFile")

With xml2
  .Open "POST", "https://www.nfp.fazenda.sp.gov.br/Login.aspx", False
  .setRequestHeader "Cookie", strCookie
  .setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
  .setRequestHeader "Content-Lenght", Len(Postdata)
  .send (Postdata)
End With

html2.body.innerhtml = xml2.responseText

Set objResult = html2.GetElementById("dadosDoUsuario")
GetElementById = objResult.innertext

MsgBox GetElementById


End Sub

这是可能的,但不是那么容易

首先,您需要使用CreateObject(“Msxml2.ServerXMLHTTP.6.0”),而不是CreateObject(“Msxml2.XMLHTTP”)

然后按照以下步骤操作:

  • 打开并发送一个GET to
  • 解析并存储响应头“Set cookie”中的cookie
  • 解析并存储HTML响应中的uuu VIEWSTATE、uu VIEWSTATEGENERATOR、uuu EVENTVALIDATION
  • 使用前面解析的值和用户名/密码为下一次查询生成数据:

    __EVENTTARGET:""
    __EVENTARGUMENT:""
    __VIEWSTATE:"..."
    __VIEWSTATEGENERATOR:"..."
    __EVENTVALIDATION:"..."
    ctl00$ddlTipoUsuario:"#rdBtnNaoContribuinte"
    ctl00$UserNameAcessivel:"Digite+o+Usuário"
    ctl00$PasswordAcessivel:"x"
    ctl00$ConteudoPagina$Login1$rblTipo:"rdBtnNaoContribuinte"
    ctl00$ConteudoPagina$Login1$UserName:"..."
    ctl00$ConteudoPagina$Login1$Password:"..."
    ctl00$ConteudoPagina$Login1$Login:"Acessar"
    ctl00$ConteudoPagina$Login1$txtCpfCnpj:"Digite+o+Usuário"
    
  • 投递

  • 使用第2步解析的Cookie设置标题“Cookie”
  • 设置标题内容类型:“application/x-www-form-urlencoded”
  • 使用数据的长度设置标题内容长度
  • 用步骤4中的数据发送帖子

  • 这是一个很好的行动计划。我想指出的是,在常见情况下,不一定要使用
    ServerXMLHTTP
    XMLHTTP
    的一个优点是您不必为cookie操心—它以本机方式管理cookie:为您接收、存储和发送必要的cookie,因为它基于IE。尽管它缺乏重定向和忽略证书错误的能力,但在这种情况下,
    ServerXMLHTTP
    是唯一的方法。另外,
    ServerXMLHTTP
    在需要使用不同cookies同时发送多个请求时也很有用。Helo@Florent B.,感谢您的回答,很抱歉花了很长时间才回复,我决定研究一下,以便更好地理解您的建议。我按照您建议的步骤,用新代码编辑了原始帖子。登录后,我仍然没有收到来自页面的响应。可能有什么问题?您应该检查并比较数据包,以确定您的请求()中有什么不正确。正常工作了!检查了Postdata长度,但它与html代码的实际响应不匹配。发现我正在获取viewstate、viewstategenerator和eventvalidation的非编码值。找到此,显示如何使用scriptcontrol获取编码值。毕竟它还在工作。我将使用工作代码进行编辑。谢谢!
    Sub testXMLHTTP()
    Dim xml As Object
    Dim html As HTMLDocument
    Dim dados As Object
    Dim text As Object
    Dim html2 As HTMLDocument
    Dim xml2 As Object
    
    Set xml = CreateObject("Msxml2.ServerXMLHTTP.6.0")
    Set html = CreateObject("htmlFile")
    
    
    With xml
      .Open "GET", "https://www.nfp.fazenda.sp.gov.br/Login.aspx", False
      .send
    End With
    
    strCookie = xml.getResponseHeader("Set-Cookie")
    
    html.body.innerhtml = xml.responseText
    
    Set objvstate = html.GetElementById("__VIEWSTATE")
    Set objvstategen = html.GetElementById("__VIEWSTATEGENERATOR")
    Set objeventval = html.GetElementById("__EVENTVALIDATION")
    
    vstate = objvstate.Value
    vstategen = objvstategen.Value
    eventval = objeventval.Value
    
    'URL Encode ViewState
        Dim ScriptEngine As ScriptControl
        Set ScriptEngine = New ScriptControl
        ScriptEngine.Language = "JScript"
        ScriptEngine.AddCode "function encode(vstate) {return encodeURIComponent(vstate);}"
        Dim encoded As String
        encoded = ScriptEngine.Run("encode", vstate)
        vstate = encoded
    'URL Encode Event Validation
        ScriptEngine.AddCode "function encode(eventval) {return encodeURIComponent(eventval);}"
        encoded = ScriptEngine.Run("encode", eventval)
        eventval = encoded
    'URL Encode ViewState Generator
        ScriptEngine.AddCode "function encode(vstategen) {return encodeURIComponent(vstategen);}"
        encoded = ScriptEngine.Run("encode", vstategen)
        vstategen = encoded
    
    Postdata = "__EVENTTARGET=" & "&__EVENTARGUMENT=" & "&__VIEWSTATE=" & vstate & "&__VIEWSTATEGENERATOR=" & vstategen & "&__EVENTVALIDATION=" & eventval & "&ctl00$ddlTipoUsuario=#rdBtnNaoContribuinte" & "&ctl00$UserNameAcessivel=Digite+o+Usuário" & "&ctl00$PasswordAcessivel=x" & "&ctl00$ConteudoPagina$Login1$rblTipo=rdBtnNaoContribuinte" & "&ctl00$ConteudoPagina$Login1$UserName=MYUSERNAME" & "&ctl00$ConteudoPagina$Login1$Password=MYPASSWORD" & "&ctl00$ConteudoPagina$Login1$Login=Acessar" & "&ctl00$ConteudoPagina$Login1$txtCpfCnpj=Digite+o+Usuário"
    
    Set xml2 = CreateObject("Msxml2.ServerXMLHTTP.6.0")
    Set html2 = CreateObject("htmlFile")
    
    With xml2
      .Open "POST", "https://www.nfp.fazenda.sp.gov.br/Login.aspx", False
      .setRequestHeader "Cookie", strCookie
      .setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
      .setRequestHeader "Content-Lenght", Len(Postdata)
      .send (Postdata)
    End With
    
    html2.body.innerhtml = xml2.responseText
    
    Set objResult = html2.GetElementById("dadosDoUsuario")
    GetElementById = objResult.innertext
    
    MsgBox GetElementById
    
    
    End Sub
    
    __EVENTTARGET:""
    __EVENTARGUMENT:""
    __VIEWSTATE:"..."
    __VIEWSTATEGENERATOR:"..."
    __EVENTVALIDATION:"..."
    ctl00$ddlTipoUsuario:"#rdBtnNaoContribuinte"
    ctl00$UserNameAcessivel:"Digite+o+Usuário"
    ctl00$PasswordAcessivel:"x"
    ctl00$ConteudoPagina$Login1$rblTipo:"rdBtnNaoContribuinte"
    ctl00$ConteudoPagina$Login1$UserName:"..."
    ctl00$ConteudoPagina$Login1$Password:"..."
    ctl00$ConteudoPagina$Login1$Login:"Acessar"
    ctl00$ConteudoPagina$Login1$txtCpfCnpj:"Digite+o+Usuário"