使用XML HTTP Request下载大文件

时间:2016-12-27 16:29:02

标签: vbscript xmlhttprequest

我正在尝试为可以安装和卸载mod的游戏制作一个简单的启动器,并更新它们。我对VBScript一无所知,所以我从互联网上获得了大部分下载/更新代码。我已完成大部分代码,但我遇到了问题。我正在尝试从我的谷歌硬盘上下载大约1/2 GB的大型zip文件夹。当我所拥有的只是zip文件夹中的一个简单文本文件作为测试时,它正在工作,但它所做的只是下载一个损坏的zip文件夹。 WinRar无法打开它,给出错误消息“存档处于未知格式或已损坏”。所以我的问题是我使用的代码是否对文件大小有限制?我正在尝试下载https://drive.google.com/uc?export=download&id=0BxlXlAM9nwYTZTFUdXpWQlJyN2M这是我的google驱动器文件的直接下载链接。

Dim http: Set http = createobject("Microsoft.XMLHTTP")
Dim stream: Set stream = createobject("Adodb.Stream")

http.Open "GET", "https://drive.google.com/uc?export=download&id=0BxlXlAM9nwYTZTFUdXpWQlJyN2M", False
http.Send
With stream
  .Type = 1
  .Open
  .Write http.responseBody
  .SaveToFile "c:\updates\normaldata\normal.zip", 2
End With

2 个答案:

答案 0 :(得分:1)

由于@Noodles已经指出您的原始链接被重定向到确认页面,因为该文件太大而无法扫描恶意软件。您需要从该页面中提取实际的下载链接,例如像这样:

baseUrl = "https://drive.google.com"
url     = baseUrl & "/uc?export=download&id=0BxlXlAM9nwYTZTFUdXpWQlJyN2M"

Set http = CreateObject("Microsoft.XMLHTTP")
http.Open "GET", url, False
http.Send

If http.Status <> 200 Then
  WScript.Echo http.Status & " " & http.StatusText
  WScript.Quit 1
ElseIf Left(http.getResponseHeader("Content-Type"), 9) = "text/html" Then
  Set html = CreateObject("HTMLFile")
  html.Write http.ResponseText
  Set dl = html.GetElementById("uc-download-link")
  http.Open "GET", Replace(dl.href, "about:", baseUrl), False
  http.Send
  ...
End If

但是,当我尝试按照链接时,我收到了拒绝访问错误,而下载在浏览器中运行良好。要使VBScript正常工作,您可能需要检查浏览器和Web服务器之间的对话(例如,使用Fiddler),并根据结果调整第二个HTTP请求。

答案 1 :(得分:0)

首先,该链接不是直接下载。它会将您带到一个页面,警告您拉链不能被Google扫描。

你不做的是

  1. 在记事本中打开文件并查看其内容。 Zips从PK,可执行文件和带有MZ的dll开始,你会识别HTML。您正在下载1000字节以下的网页。

  2. 您没有错误检查。请注意我的代码是80%的错误检查。

  3.   

    #define HTTP_STATUS_OK 200 //请求已完成

    它为您提供了想要给您的页面。

    下载网页并将其另存为zip。将其重命名为html并在Internet Explorer中打开。

    Set fso = CreateObject("Scripting.FileSystemObject")
    Set Outp = Wscript.Stdout
    Set wshShell = CreateObject("Wscript.Shell")
    Set ShApp = CreateObject("Shell.Application")
    On Error Resume Next
    Set File = WScript.CreateObject("Msxml2.XMLHTTP.6.0")
    File.Open "GET", "https://drive.google.com/uc?export=download&id=0BxlXlAM9nwYTZTFUdXpWQlJyN2M", False
    File.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 1.1.4322; .NET CLR 3.5.30729; .NET CLR 3.0.30618; .NET4.0C; .NET4.0E; BCD2000; BCD2000)"
    File.Send
    If err.number <> 0 then 
        wscript.echo "" 
        wscript.echo "Error getting file" 
        wscript.echo "==================" 
        wscript.echo "" 
        wscript.echo "Error " & err.number & "(0x" & hex(err.number) & ") " & err.description 
        wscript.echo "Source " & err.source 
        wscript.echo "" 
        wscript.echo "HTTP Error " & File.Status & " " & File.StatusText
        wscript.echo    File.getAllResponseHeaders
        wscript.echo    File.ResponseBody
    else
        On Error Goto 0
        wscript.echo "Server Response " & File.Status & " " & File.StatusText
        wscript.echo    File.getAllResponseHeaders
        wscript.echo    File.ResponseBody
        Set BS = CreateObject("ADODB.Stream")
        BS.type = 1
        BS.open
        BS.Write File.ResponseBody
        BS.SaveToFile ShApp.Namespace(&h10).self.path & "\file.zip", 2
    End If