2016-12-27 41 views
-1

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

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 
+3

“但它不起作用”告诉我们什么都没有。解释它是如何工作的。 – Sorceri

+1

['http.Status'](https://msdn.microsoft.com/en-us/library/ms767681.aspx)的值是什么? –

+0

对不起,我应该澄清。它下载一个压缩文件,但我无法打开它,在WinRar中给出“压缩文件未知格式或损坏”的响应。 http.Status的值是200. –

回答

0

首先,该链接不是直接下载。它会带您进入一个页面,警告您Google无法扫描病毒邮件。

什么,你不这样做是

  1. 打开该文件在记事本中,看到它说什么。拉链以PK,可执行文件和DLL与MZ开始,你会认出HTML。您正在下载1000字节以下的网页。

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

的#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 
+0

为什么不直接在响应中检查“Content-Type”头部? – Lankymart

+0

让我们[在聊天中继续讨论](http://chat.stackoverflow.com/rooms/131688/discussion-between-lankymart-and-noodles)。 – Lankymart

+0

我试过使用这个,但我只是得到一个错误消息800A0BBC“写入文件失败”。每当我尝试使用这种方法下载任何文件时都会发生这种情况,我不知道为什么。我听说它可能与权限有关,但我不知道该从哪里去。 –

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正常工作,您可能需要检查浏览器与网络服务器之间的对话(例如,使用Fiddler),并根据结果调整第二个HTTP请求。