2009-08-24 15 views
194

Sto cercando di utilizzare Wget per scaricare una pagina, ma non riesco a superare la schermata di accesso.Come superare la pagina di accesso con Wget?

Come si invia il nome utente/password utilizzando i dati del post nella pagina di accesso e quindi si scarica la pagina effettiva come utente autenticato?

+2

Per ricciolo: http://stackoverflow.com/questions/12399087/curl-to-access-a-page-that-requires-a-login-from-a-different-page –

risposta

276

Sulla base della pagina di manuale:

# 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 

Assicurarsi che il parametro --post-data sia correttamente percent-encoded (soprattutto ampersands!) O la richiesta sarà probabilmente fallirà. Assicurati inoltre che user e password siano le chiavi corrette; puoi trovare le chiavi corrette denunciando l'HTML della pagina di accesso (controlla la funzione "inspect element" del tuo browser e trova l'attributo name nei campi username e password).

+9

aggiungi --keep-session-cookies al primo comando, o il secondo? –

+4

Per questo non è necessario '-p' (' --page-requisites'). –

+12

Vale anche la pena aggiungere '--delete-after' al primo recupero in modo da non salvare la pagina dei risultati dall'accesso. –

7

Se si sta utilizzando l'autenticazione di base:

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

Se si sta utilizzando i dati del modulo inviato, è necessario usare qualcosa come cURL invece.

+0

I dont have accesso a cambiare nulla sul server, è di sola lettura –

+7

Quindi? Niente di tutto ciò richiede di cambiare nulla sul server. – ceejayoz

8

Non è necessario che cURL esegua i dati del modulo POST. --post-data 'key1=value1&key2=value2' funziona bene. Nota: è anche possibile passare un nome file a wget con i dati POST nel file.

21

Ho avuto lo stesso problema. La mia soluzione era di fare il login tramite Chrome e salvare i dati dei cookie in un file di testo. Questo è facilmente fatto con questa estensione di Chrome: Chrome cookie.txt export extension.

Quando si ricevono i dati dei cookie, c'è anche un esempio su come usarli con wget. Viene fornita una semplice riga di comando di copia-incolla.

+1

sfortunatamente non è applicabile negli script automatici – Znik

40

Ho fornito direttamente i cookie di una connessione esistente a wget con --no-cookie e l'intestazione della richiesta HTTP del cookie. Nel mio caso si trattava di un login universitario Moodle in cui l'accesso sembra più complesso (utilizzando più richieste con un ticket di accesso). Ho aggiunto --post-data perché era una richiesta POST. Per esempio, ottenere tutte Moodle lista degli utenti:

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

Suggerimento eccezionale. Questo è utile quando puoi accedere al cookie dalla tua macchina e poi usarlo da un'altra macchina senza testa dalla riga di comando. :) – Tuxdude

20

Se ne avete bisogno per un uso di volta, è possibile accedere tramite browser e copiare le intestazioni necessari in seguito:

screenshot Usa "Copia come cURL "nella scheda Rete di Strumenti per sviluppatori (ricarica la pagina dopo l'apertura) e sostituire il flag di intestazione di arricciatura -H con wget --header.

7

Volevo un one-liner che non ha scaricato alcun file; ecco un esempio di piping dell'output dei cookie nella prossima richiesta. Ho provato solo le seguenti su Gentoo, ma dovrebbe funzionare nella maggior parte dei * ambienti 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' (questa è una linea, anche se probabilmente avvolge sul vostro browser)

Se si desidera che l'uscita salvati in un file, modifica -O - a -O /some/file/name

0

Ho usato una soluzione che utilizzava lynx e wget. Quando si desidera utilizzare wget per scaricare alcuni file da un sito che richiede l'accesso, è sufficiente un file cookie. Per generare il file cookie, scelgo lynx. lynx è un browser di testo. Per prima cosa è necessario un file di configurazione per Lynx per salvare i cookie. Creare un file lynx.cfg. Scrivi queste configurazioni nel file.

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

Quindi avviare lynx con questo comando:

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

Dopo aver inserito il nome utente e la password, e selezionare 'mi conserva su questo pc' o qualcosa di simile. Se accedi correttamente, vedrai una bella pagina web di testo del sito. E tu esci. Nella directory corrente, troverete un file cookie denominato cookie.file. Questo è ciò di cui abbiamo bisogno per wget.

Quindi wget può scaricare il file dal sito con questo comando.

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