macro - login password en vba para excel
VBA WinHTTP para descargar el archivo del sitio web https protegido con contraseƱa (1)
Estoy tratando de guardar un archivo del sitio https protegido con contraseña usando WinHTTP. Aquí está el código:
Sub SaveFileFromURL()
Dim FileNum As Long
Dim FileData() As Byte
Dim WHTTP As Object
fileUrl = "https://www.website.com/dir1/dir2/file.xls"
filePath = "C:/myfile.xls"
myuser = "username"
mypass = "password"
Set WHTTP = CreateObject("WinHTTP.WinHTTPrequest.5.1")
WHTTP.Open "GET", fileUrl, False
WHTTP.SetCredentials myuser, mypass, HTTPREQUEST_SETCREDENTIALS_FOR_SERVER
WHTTP.Send
FileData = WHTTP.ResponseBody
Set WHTTP = Nothing
FileNum = FreeFile
Open filePath For Binary Access Write As #FileNum
Put #FileNum, 1, FileData
Close #FileNum
MsgBox "File has been saved!", vbInformation, "Success"
End Sub
El problema es con la autenticación. El archivo se está guardando pero cuando lo abro en Excel es solo la página de inicio de sesión de html en lugar del archivo real. Si copio el URL del archivo directo y lo pego en la barra de direcciones del navegador y no estoy conectado a la página web, el efecto es el mismo. Me presentan la página de inicio de sesión. Luego, si ingreso mi nombre de usuario y contraseña, la ventana de descarga aparecerá y podrá guardar el archivo.
Así que creo que la parte SetCredentials del código no funciona correctamente, porque si depuro.print WHTTP.ResponseBody es código html en lugar de los datos del archivo acutal.
¿Hay alguna forma de pasar el ID de usuario y la contraseña al WinHTTP para poder guardar el archivo correctamente?
Aquí está la dirección de la página:
https://sst.msde.state.md.us/
======================= EDITAR: =====================
Así que jugué un poco con eso hoy y creo que estoy avanzando. Esto es lo que obtuve. Yo modifiqué el código así:
Sub SaveFileFromURL()
Dim FileNum As Long
Dim FileData() As Byte
Dim WHTTP As Object
fileUrl = "https://www.website.com/dir1/dir2/file.xls"
filePath = "C:/myfile.xls"
myuser = "username"
mypass = "password"
strAuthenticate = "start-url=%2F&user=" & myuser & "&password=" & mypass & "&switch=Log+In"
Set WHTTP = CreateObject("WinHTTP.WinHTTPrequest.5.1")
WHTTP.Open "POST", fileUrl, False
WHTTP.SetRequestHeader "Content-Type", "application/x-www-form-urlencoded"
WHTTP.Send strAuthenticate
WHTTP.Open "GET", fileUrl, False
WHTTP.Send
Debug.Print WHTTP.GetAllResponseHeaders()
FileData = WHTTP.ResponseBody
Set WHTTP = Nothing
FileNum = FreeFile
Open filePath For Binary Access Write As #FileNum
Put #FileNum, 1, FileData
Close #FileNum
MsgBox "File has been saved!", vbInformation, "Success"
End Sub
Cuando depuro.Imprimir WHTTP.GetAllResponseHeaders () obtengo, por ejemplo:
Accept-Ranges: bytes
Content-Disposition: attachement; filename="xxx"
Content-Length: xxxxxx
Content-Type: application/octet-stream
Así que creo que la autenticación funcionó pero aún no puedo guardar el archivo. Cuando continúo con:
FileData = WHTTP.ResponseBody
Set WHTTP = Nothing
FileNum = FreeFile
Open filePath For Binary Access Write As #FileNum
Put #FileNum, 1, FileData
Close #FileNum
El contenido del archivo guardado es la página web html, pero no el archivo.
¿Hice la autenticación correcta y el problema es guardar el archivo en el disco o todavía hay un problema con la autenticación y es por eso que no puedo guardarlo? ¿Alguna pista?
Ok, lo hice. Aquí el código:
Sub SaveFileFromURL()
Dim FileNum As Long
Dim FileData() As Byte
Dim WHTTP As Object
mainUrl = "https://www.website.com/"
fileUrl = "https://www.website.com/dir1/dir2/file.xls"
filePath = "C:/myfile.xls"
myuser = "username"
mypass = "password"
''@David Zemens, I got this by examining webpage code using Chrome, thanks!
strAuthenticate = "start-url=%2F&user=" & myuser & "&password=" & mypass & "&switch=Log+In"
Set WHTTP = CreateObject("WinHTTP.WinHTTPrequest.5.1")
''I figured out that you have to POST authentication string to the main website address not to the direct file address
WHTTP.Open "POST", mainUrl, False ''WHTTP.Open "POST", fileUrl, False
WHTTP.SetRequestHeader "Content-Type", "application/x-www-form-urlencoded"
WHTTP.Send strAuthenticate
''Then you have to GET direct file url
WHTTP.Open "GET", fileUrl, False
WHTTP.Send
FileData = WHTTP.ResponseBody
Set WHTTP = Nothing
''Save the file
FileNum = FreeFile
Open filePath For Binary Access Write As #FileNum
Put #FileNum, 1, FileData
Close #FileNum
MsgBox "File has been saved!", vbInformation, "Success"
End Sub
Gracias por toda tu ayuda.
Por cierto, he encontrado que estas publicaciones son muy útiles:
http://www.mrexcel.com/forum/excel-questions/353006-download-file-excel.html
No entiendo por qué WinHTTP NO autentica cierto recurso HTTPS
Cómo analizar la respuesta WinHTTP línea por línea: ¿CSV codificado en UTF-8?