VBA WinHTTP从密码保护https网站下载文件

我试图使用WinHTTP从https密码保护的网站保存文件。 代码如下:

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 

问题是validation。 该文件正在保存,但当我在Excel中打开它只是HTMLlogin页面,而不是实际的文件。 如果我复制直接文件的url,并将其粘贴到浏览器的地址栏,我没有login到网页的效果是相同的。 我被提供login页面。 然后,如果我input我的login名和密码,下载窗口将显示允许我保存文件。

所以我认为SetCredentials部分的代码不能正常工作,如果我debug.print WHTTP.ResponseBody它的HTML代码,而不是acutal文件数据。

有没有办法将用户名和密码传递给WinHTTP,所以我可以正确保存文件?

这是页面地址:

 https://sst.msde.state.md.us/ 

=======================编辑:========================

所以我今天玩了一下,我想我正在向前迈进。 这是我得到的。 我Moddfied代码是这样的:

 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 

当我Debug.Print WHTTP.GetAllResponseHeaders()我得到如:

 Accept-Ranges: bytes Content-Disposition: attachement; filename="xxx" Content-Length: xxxxxx Content-Type: application/octet-stream 

所以我认为,身份validation工作,但我仍然无法保存该文件。 当我继续:

 FileData = WHTTP.ResponseBody Set WHTTP = Nothing FileNum = FreeFile Open filePath For Binary Access Write As #FileNum Put #FileNum, 1, FileData Close #FileNum 

保存文件的内容是html网页本身,而不是文件。

我是否进行了authentication,问题在于将文件保存到磁盘上,还是存在authentication问题,这就是为什么我无法保存它? 任何线索?

好的,我做到了。 这里代码:

 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 

感谢你的帮助。

顺便说一句,我发现这个post非常有用:

http://www.mrexcel.com/forum/excel-questions/353006-download-file-excel.html

不理解为什么WinHTTP不validation某些HTTPS资源

如何逐行parsingWinHTTP响应:UTF-8编码的CSV?