2016-12-27 116 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請求。