2009-08-24 66 views
194

我試圖使用Wget下載一個頁面,但我無法越過登錄屏幕。如何通過Wget瀏覽登錄頁面?

如何使用登錄頁面上的發佈數據發送用戶名/密碼,然後將實際頁面下載爲已通過身份驗證的用戶?

+2

對於捲曲:http://stackoverflow.com/questions/12399087/curl-to-access-a-page-that-requires-a-login-from-a-different-page – 2015-05-07 09:04:15

回答

276

根據手冊頁:

# Log in to the server. This only needs to be done once. 
wget --save-cookies cookies.txt \ 
    --keep-session-cookies \ 
    --post-data 'user=foo&password=bar' \ 
    --delete-after \ 
    http://server.com/auth.php 

# Now grab the page or pages we care about. 
wget --load-cookies cookies.txt \ 
    http://server.com/interesting/article.php 

確保--post-data參數是正確percent-encoded(尤其是&符號!),或者請求可能會失敗。還要確保userpassword是正確的密鑰;您可以通過檢查登錄頁面的HTML來找到正確的鍵(查看瀏覽器的「檢查元素」功能並在用戶名和密碼字段中找到name屬性)。

+9

添加--keep-session-cookies到第一個命令,或第二個? – 2011-11-09 02:56:13

+4

你不需要'-p'('--page-requisites')。 – 2012-01-06 17:24:31

+12

在第一次檢索時加上'--delete-after'也是值得的,所以你最終不會保存結果頁面登錄。 – 2013-01-02 15:41:52

7

如果他們正在使用基本身份驗證:

wget http://username:[email protected]/page.html 

如果他們使用提交的表單數據,你需要使用像cURL代替。

+0

我沒有訪問改變服務器上的任何東西,它是隻讀的 – 2009-08-24 20:13:07

+7

那麼?這些都不需要你改變服務器上的任何東西。 – ceejayoz 2009-08-24 20:15:33

8

您不需要cURL來執行發佈的表單數據。 --post-data 'key1=value1&key2=value2'工作得很好。注意:您也可以將文件名稱傳遞給wget,以獲取文件中的POST數據。

21

我有同樣的問題。我的解決方案是通過Chrome進行登錄並將Cookie數據保存到文本文件。使用此Chrome擴展程序可輕鬆完成此操作:Chrome cookie.txt export extension

當您獲取cookies數據時,還有一個關於如何將它們與wget一起使用的示例。提供了一個簡單的複製粘貼命令行。

+1

不幸的是不適用於自動腳本 – Znik 2015-08-21 13:49:15

40

我直接給現有連接的cookie提供了--no-cookies和Cookie HTTP請求頭。在我的情況下,這是一個Moodle大學登錄,登錄看起來更復雜(使用多個請求和登錄憑證)。我添加了--post-data,因爲它是一個POST請求。 例如,讓所有的M​​oodle用戶列表:

wget --no-cookies --header "Cookie: <name>=<value>" --post-data 'tab=search&name=+&personsubmit=Rechercher&keywords=&keywordsoption=allmine' https://moodle.unistra.fr/message/index.php

+2

真棒技巧。當您可以從自己的機器訪問cookie,然後從命令行使用另一臺無頭機器時,這很有用。 :) – Tuxdude 2016-07-27 18:29:05

20

如果你需要它的一次性使用,您可以通過瀏覽器登錄,之後複製所需的標題:

screenshot 使用「複製爲CURL「(開發者工具的Network選項卡中的」cURL「(打開後重新加載頁面)並將curl的標題標誌-H替換爲wget的--header

7

我想要一個沒有下載任何文件的單線程;這裏是一個將cookie輸出傳送到下一個請求的例子。我只測試了Gentoo的下面,但它應該在大多數* nix環境下工作:

wget -q -O /dev/null --save-cookies /dev/stdout --post-data 'u=user&p=pass' 'http://example.com/login' | wget -q -O - --load-cookies /dev/stdin 'http://example.com/private/page' (這是一條線,但在你的瀏覽器,它有可能套)

如果你想輸出保存到文件,將-O -更改爲-O /some/file/name

0

我使用了一個使用lynx和wget的解決方案。 當您想要使用wget從需要登錄的站點下載某個文件時,您只需要一個cookie文件。 爲了生成cookie文件,我選擇了lynx。 lynx是一個文字網頁瀏覽器。 首先你需要一個用於保存cookie的lynx配置文件。 創建一個文件lynx.cfg。將這些配置寫入文件。

SET_COOKIES:TRUE 
ACCEPT_ALL_COOKIES:TRUE 
PERSISTENT_COOKIES:TRUE 
COOKIE_FILE:cookie.file 

然後使用此命令啓動山貓:

lynx -cfg=lynx.cfg http://the.site.com/login 

你輸入用戶名和密碼,並選擇後「保存我的這臺電腦」或類似的東西。如果登錄成功,您將看到該網站的美麗文本網頁。你註銷。 在當前目錄中,您將找到一個名爲cookie.file的cookie文件。這是我們需要的wget。

然後wget可以使用此命令從站點下載文件。

wget --load-cookies ./cookie.file http://the.site.com/download/we-can-make-this-world-better.tar.gz