現(xiàn)在早已是網(wǎng)絡(luò)時(shí)代了您机,完全單機(jī)而不需要聯(lián)網(wǎng)的軟件很少了佳簸。某些時(shí)候,用 AHK 寫(xiě)個(gè)腳本也是需要去網(wǎng)絡(luò)獲取數(shù)據(jù)的讳侨。
下載網(wǎng)絡(luò)內(nèi)容到本地文件
有些時(shí)候我們需要把一個(gè)網(wǎng)頁(yè)呵萨、圖片、音頻等文件下載到本地跨跨,再做后續(xù)處理潮峦。在其他編程語(yǔ)言可能就比較麻煩了,比如先下載網(wǎng)絡(luò)內(nèi)容到一個(gè)字符串變量勇婴,然后創(chuàng)建一個(gè)文件忱嘹,將字符串寫(xiě)入,再保存文件耕渴。而 AHK 內(nèi)置的 UrlDownloadToFile 命令就是為這個(gè)場(chǎng)景量身定做的拘悦。
UrlDownloadToFile, URL, Filename
可以看到,這個(gè)命令的用法非常簡(jiǎn)單橱脸,第一個(gè)參數(shù)是文件的網(wǎng)絡(luò)地址础米,第二個(gè)參數(shù)是文件的本地地址。如果第二個(gè)參數(shù)不是完整路徑添诉,文件會(huì)被下載到當(dāng)前腳本的工作目錄屁桑,一般情況就是腳本自身的目錄。
比如我想下載 AHK 官網(wǎng)的 Logo 圖片到 C:\test.png栏赴,就可以這樣:
UrlDownloadToFile, http://ahkscript.org/logos/ahk_logo.png, C:\test.png
是不是非常簡(jiǎn)單蘑斧。除了 HTTP,UrlDownloadToFile 還支持 HTTPS 和 FTP 協(xié)議须眷。
下載網(wǎng)絡(luò)內(nèi)容到字符串變量
但有些情況竖瘾,我們并不需要將網(wǎng)絡(luò)內(nèi)容保存到文件里,而是直接使用花颗,比如直接顯示在控件里捕传。雖然也可以先寫(xiě)到文件再讀出來(lái),但這樣做不僅多此一舉扩劝,有額外的開(kāi)銷乐横,還需要考慮共用臨時(shí)文件求橄、臨時(shí)文件沒(méi)被刪除等問(wèn)題。
AHK 并沒(méi)有命令可以直接將網(wǎng)絡(luò)內(nèi)容下載到字符串變量葡公,但可以使用 COM 對(duì)象 WinHttp.WinHttpRequest.5.1罐农,官方文檔中有一個(gè)例子,用起來(lái)倒也不是很麻煩催什。
whr := ComObjCreate("WinHttp.WinHttpRequest.5.1")
; Open() 的第三個(gè)參數(shù)代表同步或者異步涵亏,現(xiàn)在不用過(guò)多關(guān)注,true 就可以了
; 以后我們會(huì)仔細(xì)了解同步和異步
whr.Open("GET", "https://autohotkey.com/download/1.1/version.txt", true)
whr.Send()
whr.WaitForResponse()
version := whr.ResponseText
MsgBox, % version
這樣就可以用 MsgBox 將從網(wǎng)絡(luò)獲取到的一個(gè)字符串彈出來(lái)了蒲凶。但比起 UrlDownloadToFile 還是麻煩了不少气筋,如果需要經(jīng)常使用,還是很不方便的旋圆,這就需要封裝成一個(gè)函數(shù)來(lái)使用宠默,比如這樣:
UrlDownloadToVar(url)
{
static whr := ComObjCreate("WinHttp.WinHttpRequest.5.1")
whr.Open("GET", url, true)
whr.Send()
whr.WaitForResponse()
return whr.ResponseText
}
和剛才的代碼差不多,但我這里 whr 是 static 類型的灵巧,因?yàn)橹恍枰跏蓟淮尉涂梢粤瞬蠼茫{(diào)用 ComObjCreate() 是有開(kāi)銷的。
但有些時(shí)候我們并不只需要傳入一個(gè) URL刻肄,可以還包含一些 HTTP Headers瓤球,而且使用 POST 方式訪問(wèn),這就需要再改造下這個(gè)函數(shù)敏弃,比如這樣:
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
}
用起來(lái)也很方便卦羡,比如我要使用 POST 方式訪問(wèn) test.org,攜帶兩個(gè) HTTP Headers麦到,key1:value1 和 key2:value2:
result := UrlDownloadToVar("http://test.org"
, { "key1" : "value1", "key2" : "value2" })
如果需要設(shè)置更多參數(shù)绿饵,比如超時(shí)時(shí)間,就需要查下 WinHttp.WinHttpRequest.5.1 的文檔了瓶颠,基本上都可以找到自己想要的功能蝴罪。
付費(fèi)解決 Windows、Linux步清、Shell、C虏肾、C++廓啊、AHK、Python封豪、JavaScript谴轮、Lua 等領(lǐng)域相關(guān)問(wèn)題,靈活定價(jià)吹埠,歡迎咨詢第步,微信 ly50247疮装。