Einloggen in die website mit MSXML2.XMLHTTP statt InternetExplorer.Anwendung mit VBA
ersten mal,
Ich versuche, die ID "dadosDoUsuario" von einer Seite ich muss eingeloggt sein. Ich habe es funktioniert mit "den InternetExplorer.Application" - Objekt, kann aber nicht die ID-Wert, wenn Sie mit "MSXML2.XMLHTTP" - Objekt. Es scheint, als gehe nicht vorbei an der login-Seite, da bin ich in der Lage, sich zu anderen IDs von dieser Seite (Beispiel: "tituloPagina"). Könnte mir jemand einen Tipp geben, wie ich die Daten von der Seite nach der Anmeldung? Danke!
InternetExplorer.Anwendung code (der funktioniert):
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-code (dieser funktioniert nicht):
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
EDIT: ich folgte den Schritten, angeregt durch @Florent B., und fügte hinzu, eine scripcontrol, um die codierten Werte für das __VIEWSTATE, __VIEWSTATEGENERATOR und __EVENTVALIDATION. Habe es funktioniert!
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
InformationsquelleAutor Vitor Prado | 2016-03-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist möglich, aber nicht einfach.
Zuerst müssen Sie mit CreateObject("Msxml2.ServerXMLHTTP.6.0"), und nicht CreateObject("MSXML2.XMLHTTP").
Dann gehen Sie folgendermaßen vor:
Erstellung der Daten für die nächste Abfrage mit den Werten zuvor analysiert und mit Ihrer Benutzer-name/Kennwort :
Öffnen Sie einen BEITRAG zu https://www.nfp.fazenda.sp.gov.br/login.aspx
ServerXMLHTTP
ist kein muss in einem Allgemeinen Fall.XMLHTTP
hat den Vorteil, dass Sie nicht die Mühe mit dem cookies - es gelingt Ihnen, nativ: empfängt, speichert und sendet eine notwendige cookie für Sie, denn es basiert auf dem IE. Obwohl es fehlt, ist eine Möglichkeit der Umleitung und ohne cert-Fehler, so dass für diese FälleServerXMLHTTP
ist der einzige Weg. AuchServerXMLHTTP
ist hilfreich, wenn Sie senden mehrere gleichzeitig, Anfragen mit verschiedenen cookies.Helo @Florent B., vielen Dank für die Antwort, und sorry für die lange zurück zu bekommen, habe ich beschlossen zu studieren, ein bisschen besser zu verstehen, was Sie vorgeschlagen. Ich habe bearbeitet die original-Beitrag mit einem neuen code, indem Sie die Schritte, die Sie vorgeschlagen. Ich bin mir immer noch nicht die Antwort die Seite nach dem login. Was könnte falsch sein?
Sie sollten prüfen, und vergleichen Sie die Pakete zu identifizieren, was falsch ist mit Ihrem Antrag (wireshark.org).
Habe es funktioniert! Überprüft die Postdata Länge und es war nicht passend, die eigentliche Antwort von html-code. Fand heraus, ich war immer der deconded Werte für viewstate, viewstategenerator und eventvalidation. Fand diese Beitrag, die zeigen, wie man die codierten Werte mit scriptcontrol. Habe es funktioniert schließlich. Ich werde zu Bearbeiten mit den funktionierenden code. Vielen Dank!
InformationsquelleAutor Florent B.