標籤:

[基礎] 如何在 AHK 下載網路內容到文件或變數

現在早已是網路時代了,完全單機而不需要聯網的軟體很少了。某些時候,用 AHK 寫個腳本也是需要去網路獲取數據的。

下載網路內容到本地文件

有些時候我們需要把一個網頁、圖片、音頻等文件下載到本地,再做後續處理。在其他編程語言可能就比較麻煩了,比如先下載網路內容到一個字元串變數,

然後創建一個文件,將字元串寫入,再保存文件。而 AHK 內置的 UrlDownloadToFile 命令就是為這個場景量身定做的。

UrlDownloadToFile, URL, Filename

可以看到,這個命令的用法非常簡單,第一個參數是文件的網路地址,第二個參數是文件的本地地址。如果第二個參數不是完整路徑,文件會被下載到當前腳本的工作目錄,一般情況就是腳本自身的目錄。

比如我想下載 AHK 官網的 Logo 圖片到 C: est.png,就可以這樣:

UrlDownloadToFile, http://ahkscript.org/logos/ahk_logo.png, C:test.png

是不是非常簡單。除了 HTTP,UrlDownloadToFile 還支持 HTTPS 和 FTP 協議。

下載網路內容到字元串變數

但有些情況,我們並不需要將網路內容保存到文件里,而是直接使用,比如直接顯示在控制項里。雖然也可以先寫到文件再讀出來,但這樣做不僅多此一舉,有額外的開銷,還需要考慮共用臨時文件、臨時文件沒被刪除等問題。

AHK 並沒有命令可以直接將網路內容下載到字元串變數,但可以使用 COM 對象 WinHttp.WinHttpRequest.5.1,官方文檔中有一個例子,用起來倒也不是很麻煩。

whr := ComObjCreate("WinHttp.WinHttpRequest.5.1"); Open() 的第三個參數代表同步或者非同步,現在不用過多關注,true 就可以了; 以後我們會仔細了解同步和非同步whr.Open("GET", "https://autohotkey.com/download/1.1/version.txt", true)whr.Send()whr.WaitForResponse()version := whr.ResponseTextMsgBox, % version

這樣就可以用 MsgBox 將從網路獲取到的一個字元串彈出來了。但比起 UrlDownloadToFile 還是麻煩了不少,如果需要經常使用,還是很不方便的,這就需要封裝成一個函數來使用,比如這樣:

UrlDownloadToVar(url){ static whr := ComObjCreate("WinHttp.WinHttpRequest.5.1") whr.Open("GET", url, true) whr.Send() whr.WaitForResponse() return whr.ResponseText}

和剛才的代碼差不多,但我這裡 whr 是 static 類型的,因為只需要初始化一次就可以了,調用 ComObjCreate() 是有開銷的。

但有些時候我們並不只需要傳入一個 URL,可以還包含一些 HTTP Headers,而且使用 POST 方式訪問,這就需要再改造下這個函數,比如這樣:

UrlDownloadToVar(url, headers = ""){ static whr := ComObjCreate("WinHttp.WinHttpRequest.5.1") whr.Open("POST", url, true) if (headers != "") { for key, value in headers { whr.SetRequestHeader(key, value) } } whr.Send() whr.WaitForResponse() return whr.ResponseText}

用起來也很方便,比如我要使用 POST 方式訪問 test.org,攜帶兩個 HTTP Headers,key1:value1 和 key2:value2:

result := UrlDownloadToVar("http://test.org" , { "key1" : "value1", "key2" : "value2" })

如果需要設置更多參數,比如超時時間,就需要查下 WinHttp.WinHttpRequest.5.1 的文檔了,基本上都可以找到自己想要的功能。

付費解決 Windows、Linux、Shell、C、C++、AHK、Python、JavaScript、Lua 等領域相關問題,靈活定價,歡迎諮詢,微信 ly50247。

推薦閱讀:

[基礎] AHK 中關聯數組、列表、棧和隊列的用法
【實用】通過API群發簡訊
【高級】AutoHotkey_H新特性
用AutoHotkey(AHK) 使用滑鼠手勢在win10下快速切換虛擬桌面?

TAG:AutoHotkey |