Come superare la pagina di accesso con Wget?


Risposte:


349

Sulla base della pagina del 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

Assicurati che il --post-dataparametro sia correttamente codificato in percentuale (specialmente e commerciale!) O la richiesta probabilmente fallirà. Assicurati anche che usere passwordsiano le chiavi corrette; puoi trovare le chiavi corrette investigando il codice HTML della pagina di login (guarda nella funzione “inspect element” del tuo browser e trova l' nameattributo nei campi username e password).


10
aggiungi --keep-session-cookies al primo comando o al secondo?
Felipe Alvarez

4
Non hai bisogno di -p( --page-requisites) per questo.
ændrük

14
Vale anche la pena aggiungerlo --delete-afteral primo recupero in modo da non finire per salvare la pagina dei risultati dall'accesso.
Jim Hunziker

2
Ricevo un errore WGET64: missing URLHo inserito l'intero comando wget in una riga e ho rimosso `\`
Mowgli

6
--keep-session-cookies è necessario solo per il primo comando. Indica al primo comando di includere i cookie di sessione durante il salvataggio dei cookie nel file. Il secondo comando legge semplicemente tutti i cookie dal file fornito.
wadim

74

Se ne hai bisogno per una volta, puoi accedere tramite browser e copiare le intestazioni necessarie in seguito:

immagine dello schermo Usa "Copia come cURL" nella scheda Rete degli Strumenti per sviluppatori (ricarica la pagina dopo l'apertura) e sostituisci il flag di intestazione di curl -He --datacon wget --headere --post-data.


1
Ottima soluzione!
menteith

Eccezionale! Mi ha anche indicato l'opzione di usare curl invece di wget, poiché può fare la stessa cosa e non ho nemmeno bisogno di modificare i parametri.
gennaio

soluzione molto pulita e semplice, +1!
Kresimir Pendic

Questo ha funzionato per me, mentre wgetcon il cookie corretto no; Sospetto che il servizio web controlli più intestazioni GET diverse, anche quelle apparentemente non importanti come "User-Agent" o "Cache-Control".
Arthur

@ Arthur per me questa soluzione è stata l'unica che ha funzionato. Ho provato a rimuovere il maggior numero possibile di dati di intestazione dall'URL e sono finito essenzialmente con i dati dei cookie. Quindi sospetto che abbia wgetfornito i dati in modo sbagliato.
Florian Blume

65

Ho fornito direttamente i cookie di una connessione esistente a wget con --no-cookies 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. Ad esempio, ottieni l'elenco di tutti gli utenti di Moodle:

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


7
Suggerimento fantastico. Questo è utile quando puoi accedere al cookie dalla tua macchina e poi usarlo da un'altra macchina headless dalla riga di comando. :)
Tuxdude

4
Puoi anche impostare più cookie contemporaneamente, --header "Cookie: access_token = IKVYJ; XSRF-TOKEN = 5e10521d"
Phil C

29

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

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


1
sfortunatamente non applicabile nello scripting automatizzato
Znik

1
La domanda non specifica lo scripting automatizzato. Questa soluzione consente di automatizzare il 99% del lavoro.
Will Sheppard

1
Sfortunatamente, Google deve essere troppo intelligente per questo trucco. Ricevo ancora una pagina di accesso.
Josiah Yoder

1
Ovviamente, Google utilizza reCAPTCHA segreti ... come ho visto in tanti posti, l'utilizzo di API programmatiche standard è l'opzione più pratica in questo caso.
Josiah Yoder,

10

Volevo un one-liner che non scaricava alcun file; ecco un esempio di piping dell'output del cookie nella richiesta successiva. Ho solo testato quanto segue su Gentoo, ma dovrebbe funzionare nella maggior parte degli 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 riga, anche se probabilmente va a capo nel tuo browser)

Se desideri che l'output venga salvato in un file, cambia -O -in-O /some/file/name


9

Non hai bisogno di cURL per eseguire i dati del modulo POST. --post-data 'key1=value1&key2=value2'funziona benissimo. Nota: puoi anche passare un nome file a wget con i dati POST nel file.


8

Se utilizzano l'autenticazione di base:

wget http://username:password@www.domain.com/page.html

Se stanno usando i dati del modulo POST, dovrai invece usare qualcosa come cURL .


Non ho accesso per modificare nulla sul server, è di sola lettura
Señor Reginold Francis

7
Così? Niente di tutto ciò richiede di modificare qualcosa sul server.
ceejayoz

6

Una soluzione che utilizza lynx e wget.

Nota: Lynx deve essere stato compilato con il flag --enable-persistent-cookies affinché funzioni

Quando si desidera utilizzare wget per scaricare un file da un sito che richiede l'accesso, è sufficiente un file cookie. Per generare il file cookie, scelgo lynx. lynx è un browser web di testo. Per prima cosa hai bisogno di un file di configurazione per lynx per salvare i cookie. Crea un file lynx.cfg. Scrivi queste configurazioni nel file.

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

Quindi avvia lynx con questo comando:

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

Dopo aver inserito il nome utente e la password e selezionare "conservami su questo PC" o qualcosa di simile. Se accedi con successo, vedrai una bellissima pagina web di testo del sito. E ti disconnetti. Nella directory corrente, troverai 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

2
cosa succede se il login richiede javascript? lynx non sembra supportare javascript.
Tiberiu

3

Esempio per scaricare con wget sul server un collegamento a file di grandi dimensioni che può essere ottenuto nel browser.

Ad esempio utilizzando Google Chrome.

Accedi dove ti serve e premi download. Vai a scaricare e copia il tuo collegamento.

inserisci qui la descrizione dell'immagine

Quindi apri DevTools su una pagina in cui accedi, vai su Console e ottieni i tuoi cookie, entrandodocument.cookie

inserisci qui la descrizione dell'immagine

Ora vai sul server e scarica il tuo file: wget --header "Cookie: <YOUR_COOKIE_OUTPUT_FROM_CONSOLE>" <YOUR_DOWNLOAD_LINK>

inserisci qui la descrizione dell'immagine


Questa risposta non sembra adattarsi bene a Google, dove ci sono due pagine di cookie!
Josiah Yoder

Ovviamente, Google utilizza reCAPTCHA segreti ... come ho visto in tanti posti, l'utilizzo di API programmatiche standard è l'opzione più pratica in questo caso.
Josiah Yoder,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.