使用VBA从Web服务器下载日志文件

时间:2013-11-19 19:11:35

标签: excel vba

设置

服务器生成位于https://myserver.com/logs/的日志文件。 /logs目录受.htaccess文件密码保护。尝试访问https://myserver.com/logs/将提示用户输入用户名和密码,以便查看目录列表。

我正在尝试做什么:

我正在MS Excel中编写VBA脚本以从我的服务器下载日志文件。日志文件server.log位于/logs目录中。我想将文件下载到C:\Downloads\server.log的本地驱动器。最后我想编写一个for循环来下载多个文件,但我只想现在只下载一个。

我遇到的问题:

我收到<h1>Access Denied</h1>作为回复邮件。我没有看到任何文件下载。奇怪的是,虽然...昨天它会下载文件,但只有在我访问它并通过IE打开它之后。然后每个后续下载工作正常。但是今天这不再适用了。

我下载文件的功能:

Private Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, _
    ByVal szFileName As String, _
    ByVal dwReserved As Long, _
    ByVal lpfnCB As Long) As Long


Function downloadLog()
        Dim URL As String
        Dim DestFile As String
        Dim Res As Long

        URL = "https://myserver.com/logs/server.log"
        DestFile = "C:\Downloads\server.log"

        Res = URLDownloadToFile(0&, URL, DestFile, 0&, 0&)

        If Res = 0 Then
            MsgBox "Success"
        Else
            MsgBox "Failure"
        End If
    End Function

请帮助......我完全没有想法。

3 个答案:

答案 0 :(得分:2)

我在其他地方找到了答案。我在这里发布它,以便遇到同样问题的其他人可以使用下面相同的功能来完成同样的事情。

首次尝试时,系统会提示您输入用户名和密码,但其他所有尝试都是无缝的。就像我想要的那样工作。

Function FetchFile(sURL As String, sPath)
    Dim oXHTTP As Object
    Dim oStream As Object


    Set oXHTTP = CreateObject("MSXML2.XMLHTTP")
    Set oStream = CreateObject("ADODB.Stream")
    'Application.StatusBar = "Fetching " & sURL & " as " & sPath
    oXHTTP.Open "GET", sURL, False
    oXHTTP.send

    If (oXHTTP.Status = 200) Then
        With oStream
            .Type = 1 'adTypeBinary
            .Open
            .Write oXHTTP.ResponseBody
            .SaveToFile sPath, 2 'adSaveCreateOverWrite
            .Close
        End With
        FetchFile = True
    Else
        FetchFile = False
    End If

    Set oXHTTP = Nothing
    Set oStream = Nothing
    'Application.StatusBar = False
End Function

答案 1 :(得分:1)

之前我遇到过类似的问题,这是解决方案:

使用ADODB.Stream对象

Set oXHTTP = CreateObject("MSXML2.XMLHTTP")
Set oStream = CreateObject("ADODB.Stream")

答案 2 :(得分:0)

我没有可以测试代码的类似网站,但这里有些值得尝试的东西。 Microsoft提供了一个解决方案,用this siteInternetOpen上的标题为“由调用WinInet或Urlmon函数的对象打开的URL”部分进行身份验证。他们建议使用WinINet库。

首先,调用InternetConnect获取HINTERNET句柄。 接下来,使用WinINet选项致电HttpOpenRequest,提供INTERNET_DEFAULT_HTTPS_PORTlpszUsername

使用HttpSendRequestInternetReadFile发出文件网址请求。

如果一切按计划进行,您可以拨打Here来获取数据。

{{3}}是使用WinINet进行身份验证的示例,不确定哪种符合您的需求。