password para macro internet descargar con archivos excel internet-explorer vba download winhttp

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?