[Mac] 使用 wget 送出 cookie,登入網站後下載檔案
有時候在瀏覽器裡面,點選了按鈕就開始一個下載作業,
但可能要下載的檔案很大,這時就很容易失敗…
這時候我就會想要用 wget,因為它有續傳的功能,
但是如果這個下載是需要 cookie 才能運作的話,wget 預設狀況是無法下載的…
舉例來說,我現在有一個在 SafeSync 網路磁碟上的超大檔案,
它可以用 https://dc2.safesync.com/test.ova?dl=1 這個連結下載,
但是如果直接用 wget 去抓這個網址,
就會出現 HTTP 403 Forbidden 的錯誤:
testuser@localhost ~ $ wget "https://dc2.safesync.com/test.ova?dl=1" --2017-04-28 10:40:31-- https://dc2.safesync.com/test.ova?dl=1 Resolving dc2.safesync.com (dc2.safesync.com)... 52.59.96.149, 52.57.6.127 Connecting to dc2.safesync.com (dc2.safesync.com)|52.59.96.149|:443... connected. HTTP request sent, awaiting response... 403 Forbidden 2017-04-28 10:40:32 ERROR 403: Forbidden.
解決方法是什麼呢?
其實很簡單,只要把瀏覽器上的 HTTP cookie 存下來給 wget 用就行了,
因為這個 SafeSync 網站會根據 HTTP cookie 的內容,
來知道使用者有沒有登入,沒登入的人就不能下載。
因此我們得把已經登入後的 HTTP cookie 給 wget 用,
這樣 SafeSync 網站才會允許 wget 來下載檔案~
1. 觀察 HTTP cookie 的內容
打開 Chrome 上的開發者工具,觀察一下 Request Headers 中的 Cookie 欄位,
可以看到這個網站的 cookie 有 lang, tz, fmprm, auth 幾個,
把這邊的資訊複製下來:
2. 準備 HTTP cookie 檔案
用 Sublime Text, vim, 或是任何文字編輯器,
建立一個新的文字檔,內容就是 cookie 的內容,
格式是 domain flag path secure expires name value ,
(每個欄位中間要用 Tab 分開,不能是普通的空白)~
所以像下面例子中,tz_offset 的這一行代表的是:
- cookie 是屬於 dc2.safesync.com
- 所有在 dc2.safesync.com 這個網域上的網址,都會使用這個 cookie (flag=TRUE)
- 路徑是 / 的時候,可以使用這個 cookie
- HTTP/HTTPS 的網頁都能使用這個 cookie (secure=FALSE)
- cookie 的名稱是 tz_offset,值是 -480
# HTTP cookie file. # Generated by Wget on 2017-04-28 10:46:33. # Edit at your own risk. dc2.safesync.com TRUE / FALSE 0 tz_offset -480 dc2.safesync.com TRUE / FALSE 0 fmprm si dc2.safesync.com TRUE / FALSE 0 auth encryptedAuthValue
3. 使用 wget 送出 cookies
wget 加上 –load-cookies 參數,就能讀進一個 cookie 檔案,
我們另外加上了 -d 選項 (debug),來觀察 wget 的詳細動作。
可以看到 wget 從 cookie 檔中讀出了 cookie 的資訊,
接著在送出的 Request header 中,把 cookie 組成一個 Cookie: 的欄位:
testuser@localhost ~ $ wget -d --load-cookies=cookies "https://dc2.safesync.com/test.ova?dl=1" Setting --load-cookies (loadcookies) to cookies DEBUG output created by Wget 1.14 on linux-gnu. Stored cookie dc2.safesync.com -1 (ANY) / [expiry none] tz_offset -480 Stored cookie dc2.safesync.com -1 (ANY) / [expiry none] fmprm si Stored cookie dc2.safesync.com -1 (ANY) / [expiry none] auth encryptedAuthValue Resolving dc2.safesync.com (dc2.safesync.com)... 52.59.96.149, 52.57.6.127 Caching dc2.safesync.com => 52.59.96.149 52.57.6.127 Connecting to dc2.safesync.com (dc2.safesync.com)|52.59.96.149|:443... connected. ---request begin--- GET /test.ova?dl=1 HTTP/1.1 User-Agent: Wget/1.14 (linux-gnu) Accept: */* Host: dc2.safesync.com Connection: Keep-Alive Cookie: auth=encryptedAuthValue; fmprm=si; tz_offset=-480 ---request end--- HTTP request sent, awaiting response... ...... Length: 5090715136 (4.7G) [application/octet-stream] Saving to: 'test.ova?dl=1'
由於有 cookie 的資訊,SafeSync 網站認為我們是有登入的狀態,
因此就可以成功下載檔案了~
這個技巧可以運作在所有的網頁上面喔 ^^/