Connexion à un site web en utilisant MSXML2.XMLHTTP au lieu d'internet explorer.Application avec VBA
premier temps à poster,
Je vais essayer d'obtenir l'ID "dadosDoUsuario" à partir d'une page du site que je dois être connecté. J'ai eu de travail à l'aide de "InternetExplorer.L'Application" de l'objet, mais ne peut pas obtenir la valeur de l'ID lors de l'utilisation de "MSXML2.XMLHTTP" objet. Il semble ne pas aller au-delà de la page de connexion, depuis que je suis en mesure d'obtenir d'autres Identifiants à partir de cette page (exemple: "tituloPagina"). Quelqu'un pourrait donner un indice sur comment puis-je obtenir les données de la page une fois connecté? Merci!
InternetExplorer.Le code de l'Application (ce qui fonctionne):
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 (celui-ci ne fonctionne pas):
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: j'ai suivi les étapes proposées par @Florent B., et a ajouté une scripcontrol pour obtenir les valeurs codées pour __VIEWSTATE, __VIEWSTATEGENERATOR et __ _ _ EVENTVALIDATION. Ai eu de travail!
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
Vous devez vous connecter pour publier un commentaire.
C'est possible, mais pas facile.
Vous devez d'abord utiliser la fonction CreateObject("Msxml2.ServerXMLHTTP.6.0") et de ne pas CreateObject("MSXML2.XMLHTTP").
Puis suivez ces étapes:
Générer les données pour la prochaine requête avec les valeurs analysées précédemment et avec votre nom d'utilisateur/mot de passe :
Ouvrir un POST pour https://www.nfp.fazenda.sp.gov.br/login.aspx
ServerXMLHTTP
n'est pas une nécessité dans un cas commun.XMLHTTP
a un avantage que vous n'avez pas à s'embêter avec les cookies - il les gère en natif: reçoit, stocke et envoie un nécessaire cookies pour vous, car il basé sur IE. Bien qu'il ne dispose pas d'une capacité de redirection, et en ignorant les cert erreurs, donc pour ce casServerXMLHTTP
est le seul moyen. AussiServerXMLHTTP
est utile lorsque vous avez besoin d'envoyer simultanément plusieurs demandes différentes des cookies.