如今早已經是網絡時代了,徹底單機而不須要聯網的軟件不多了。某些時候,用 AHK 寫個腳本也是須要去網絡獲取數據的。編程
有些時候咱們須要把一個網頁、圖片、音頻等文件下載到本地,再作後續處理。在其餘編程語言可能就比較麻煩了,好比先下載網絡內容到一個字符串變量,而後建立一個文件,將字符串寫入,再保存文件。而 AHK 內置的 UrlDownloadToFile 命令就是爲這個場景量身定作的。微信
UrlDownloadToFile, URL, Filename
能夠看到,這個命令的用法很是簡單,第一個參數是文件的網絡地址,第二個參數是文件的本地地址。若是第二個參數不是完整路徑,文件會被下載到當前腳本的工做目錄,通常狀況就是腳本自身的目錄。網絡
好比我想下載 AHK 官網的 Logo 圖片到 C:test.png,就能夠這樣:異步
UrlDownloadToFile, http://ahkscript.org/logos/ahk_logo.png, C:\test.png
是否是很是簡單。除了 HTTP,UrlDownloadToFile 還支持 HTTPS 和 FTP 協議。編程語言
但有些狀況,咱們並不須要將網絡內容保存到文件裏,而是直接使用,好比直接顯示在控件裏。雖然也能夠先寫到文件再讀出來,但這樣作不只畫蛇添足,有額外的開銷,還須要考慮共用臨時文件、臨時文件沒被刪除等問題。函數
AHK 並無命令能夠直接將網絡內容下載到字符串變量,但能夠使用 COM 對象 WinHttp.WinHttpRequest.5.1,官方文檔中有一個例子,用起來倒也不是很麻煩。url
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.ResponseText MsgBox, % version
這樣就能夠用 MsgBox 將從網絡獲取到的一個字符串彈出來了。但比起 UrlDownloadToFile 仍是麻煩了很多,若是須要常常使用,仍是很不方便的,這就須要封裝成一個函數來使用,好比這樣:code
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。