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

时间:2016-03-10 02:36:55

标签: vba login msxml

第一次发帖,

我正在尝试从我必须登录的网站页面获取ID“dadosDoUsuario”。我使用“InternetExplorer.Application”对象使用它,但在使用“MSXML2时无法获取ID值。 XMLHTTP“对象。它似乎不会超过登录页面,因为我可以从此页面获取其他ID(例如:“tituloPagina”)。有人可以提示我在登录后如何从页面获取数据吗?谢谢!

InternetExplorer.Application代码(这个有效):

Sub testIE()
Dim texto As String

Set ie = CreateObject("InternetExplorer.Application")
my_url = "https://www.nfp.fazenda.sp.gov.br/login.aspx"
With ie
    .Visible = False
    .Navigate my_url

Do Until Not ie.Busy And ie.readyState = 4
    DoEvents
Loop

End With

ie.Document.getelementbyid("userName").Value = "MYUSERNAME"
ie.Document.getelementbyid("Password").Value = "MYPASSWORD"
ie.Document.getelementbyid("Login").Click

Do Until Not ie.Busy And ie.readyState = 4
    DoEvents
Loop

ie.Document.getelementbyid("btnConsultarNFSemestre").Click

Do Until Not ie.Busy And ie.readyState = 4
    DoEvents
Loop

texto = ie.Document.getelementbyid("dadosDoUsuario").innerText
MsgBox texto

ie.Quit

End Sub

MSXML2.XMLHTTP代码(此代码不起作用):

Sub testXMLHTTP()
Dim xml As Object
Dim html As Object
Dim dados As Object
Dim text As Object

Set xml = CreateObject("MSXML2.XMLHTTP")

Set html = CreateObject("htmlFile")

With xml
  .Open "POST", "https://www.nfp.fazenda.sp.gov.br/Login.aspx", False
  .setRequestHeader "Content-Type", "text/xml"
  .send "userName=MYUSERNAME&password=MYPASSWORD"
  .Open "GET", "https://www.nfp.fazenda.sp.gov.br/Inicio.aspx", False
  .setRequestHeader "Content-Type", "text/xml"
  .send
End With

html.body.innerhtml = xml.responseText

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

MsgBox GetElementById

End Sub
编辑:我按照@Florent B建议的步骤进行操作,并添加了一个脚本控件来获取__VIEWSTATE,__ STARTSTATEGENERATOR和__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

1 个答案:

答案 0 :(得分:2)

这可能但不是那么容易。

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

然后按照以下步骤操作:

  1. 打开并向https://www.nfp.fazenda.sp.gov.br/login.aspx
  2. 发送GET
  3. 从响应标题“Set-Cookie”
  4. 解析并存储cookie
  5. 从HTML响应中解析并存储__VIEWSTATE,__ CopyrightSTATEGENERATOR,__ EVENTVALIDATION
  6. 使用之前解析的值和您的用户名/密码构建下一个查询的数据:

    __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"
    
  7. 打开https://www.nfp.fazenda.sp.gov.br/login.aspx

  8. 的POST
  9. 使用在步骤2解析的cookie设置标题“Cookie”
  10. 设置标题Content-Type:“application / x-www-form-urlencoded”
  11. 使用数据长度设置标题Content-Length
  12. 使用步骤4中的数据发送POST
相关问题