¿Cómo pasar la página de inicio de sesión con Wget?

263

Estoy tratando de usar Wget para descargar una página, pero no puedo pasar de la pantalla de inicio de sesión.

¿Cómo envío el nombre de usuario / contraseña utilizando los datos de publicación en la página de inicio de sesión y luego descargo la página real como usuario autenticado?

Señor Reginold Francis
fuente
3
Para curl: stackoverflow.com/questions/12399087/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Respuestas:

342

Basado en la página del manual:

# 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

Asegúrate de que el --post-dataparámetro esté correctamente codificado en porcentaje (¡especialmente los símbolos!) O la solicitud probablemente fallará. También asegúrese de que usery passwordson las claves correctas; puede encontrar las claves correctas buscando el HTML de la página de inicio de sesión (busque en la función "inspeccionar elemento" de su navegador y encuentre el nameatributo en los campos de nombre de usuario y contraseña).

jarnoan
fuente
10
agregue --keep-session-cookies al primer comando, o al segundo?
Felipe Alvarez el
44
No necesitas -p( --page-requisites) para esto.
ændrük
14
También vale la pena agregarlo --delete-aftera la primera recuperación para que no termines guardando la página de resultados del inicio de sesión.
Jim Hunziker
2
Recibo un error WGET64: missing URL, puse todo el comando wget en una línea y eliminé `\`
Mowgli
66
--keep-session-cookies es necesario solo para el primer comando. Le dice al primer comando que incluya cookies de sesión al guardar cookies en el archivo. El segundo comando simplemente lee todas las cookies del archivo proporcionado.
wadim
63

Si lo necesita para un solo uso, puede iniciar sesión a través del navegador y luego copiar los encabezados necesarios:

captura de pantalla Use "Copiar como cURL" en la pestaña Red de Herramientas para desarrolladores (vuelva a cargar la página después de abrir) y reemplace el indicador de encabezado de curl -Hy --datacon wget --headery --post-data.

usuario
fuente
1
Gran solución!
menteith
¡Increíble! También me señaló la opción de usar curl en lugar de wget, ya que puede hacer lo mismo y ni siquiera necesito cambiar los parámetros.
Ene
solución muy limpia y simple, +1!
Kresimir Pendic
Esto funcionó para mí, mientras que wgetcon la cookie correcta no lo hizo; Sospecho que el servicio web busca múltiples encabezados GET diferentes, incluso aparentemente sin importancia como "User-Agent" o "Cache-Control".
Arthur
@Arthur para mí, esta solución fue la única que funcionó. Traté de eliminar la mayor cantidad posible de datos de encabezado de la URL y terminé esencialmente con los datos de las cookies. Así que sospecho que wgetproporcionó los datos de manera incorrecta.
Florian Blume
62

Le di directamente cookies de una conexión existente a wget con --no-cookies y el encabezado de solicitud HTTP Cookie. En mi caso, fue un inicio de sesión en la universidad de Moodle donde el inicio de sesión parece más complejo (utilizando múltiples solicitudes con un ticket de inicio de sesión). Agregué --post-data porque era una solicitud POST. Por ejemplo, obtenga la lista de todos los usuarios de 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

Baptx
fuente
77
Consejo impresionante Esto es útil cuando puede acceder a la cookie desde su propia máquina y luego usarla desde otra máquina sin cabeza desde la línea de comandos. :)
Tuxdude
3
También puede configurar varias cookies al mismo tiempo, - encabezado "Cookie: access_token = IKVYJ; XSRF-TOKEN = 5e10521d"
Phil C
29

Yo tuve el mismo problema. Mi solución fue iniciar sesión a través de Chrome y guardar los datos de las cookies en un archivo de texto. Esto se hace fácilmente con esta extensión de Chrome : extensión de exportación Chrome cookie.txt .

Cuando obtiene los datos de las cookies, también hay un ejemplo sobre cómo usarlos con wget. Se le proporciona una línea de comando simple de copiar y pegar.

Thor-Erik Rødland
fuente
1
desafortunadamente no es aplicable en secuencias de comandos automatizadas
Znik
1
La pregunta no especifica secuencias de comandos automatizadas. Esta solución permite automatizar el 99% del trabajo.
Will Sheppard
1
Desafortunadamente, Google debe ser demasiado inteligente para este truco. Todavía recibo una página de inicio de sesión.
Josiah Yoder
1
Por supuesto, Google usa reCAPTCHA secretos ... como he visto en muchos lugares, el uso de API programáticas estándar es la opción más práctica en este caso.
Josiah Yoder
10

Quería una línea que no descargara ningún archivo; Aquí hay un ejemplo de canalizar la salida de la cookie en la siguiente solicitud. Solo probé lo siguiente en Gentoo, pero debería funcionar en la mayoría de los entornos * 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' (esta es una línea, aunque probablemente se envuelve en su navegador)

Si desea que la salida se guarde en un archivo, cambie -O -a-O /some/file/name

Caleb Gray
fuente
9

No necesita cURL para hacer datos de formulario PUBLICADOS. --post-data 'key1=value1&key2=value2'funciona bien Nota: también puede pasar un nombre de archivo para wget con los datos POST en el archivo.

J. Piel
fuente
8

Si están utilizando autenticación básica:

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

Si están usando datos de formulario POSTed, necesitarás usar algo como cURL en su lugar.

ceejayoz
fuente
No tengo acceso para cambiar nada en el servidor, es de solo lectura
Señor Reginold Francis
77
¿Entonces? Nada de esto requiere que cambie nada en el servidor.
ceejayoz
5

Una solución que usa lynx y wget.

Nota: Lynx debe haber sido compilado con el indicador --enable-persistent-cookies para que esto funcione

Cuando desee usar wget para descargar algún archivo de un sitio que requiere inicio de sesión, solo necesita un archivo cookie. Para generar el archivo cookie, elijo lynx. Lynx es un navegador web de texto. Primero necesita un archivo de configuración para Lynx para guardar la cookie. Cree un archivo lynx.cfg. Escriba estas configuraciones en el archivo.

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

Luego inicie lynx con este comando:

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

Después de ingresar el nombre de usuario y la contraseña, y seleccione 'preservarme en esta PC' o algo similar. Si inicia sesión correctamente, verá una hermosa página web de texto del sitio. Y te desconectas. En el directorio actual, encontrará un archivo de cookie denominado cookie.file. Esto es lo que necesitamos para wget.

Entonces wget puede descargar el archivo del sitio con este comando.

wget --load-cookies ./cookie.file http://the.site.com/download/we-can-make-this-world-better.tar.gz
Cara de póquer
fuente
2
¿Qué pasa si el inicio de sesión requiere JavaScript? lynx no parece admitir javascript.
Tiberiu
1

Ejemplo para descargar con wget en el servidor un enlace de archivo grande que se puede obtener en su navegador.

Por ejemplo, usando Google Chrome.

Inicie sesión donde lo necesite y presione descargar. Vaya a descargar y copie su enlace.

ingrese la descripción de la imagen aquí

Luego, abra DevTools en una página donde inicie sesión, vaya a la Consola y obtenga sus cookies, ingresandodocument.cookie

ingrese la descripción de la imagen aquí

Ahora, vaya al servidor y descargue su archivo: wget --header "Cookie: <YOUR_COOKIE_OUTPUT_FROM_CONSOLE>" <YOUR_DOWNLOAD_LINK>

ingrese la descripción de la imagen aquí

Alex Ivasyuv
fuente
Esta respuesta no parece ajustarse bien a Google, ¡donde hay dos páginas de cookies!
Josiah Yoder
Por supuesto, Google usa reCAPTCHA secretos ... como he visto en muchos lugares, el uso de API programáticas estándar es la opción más práctica en este caso.
Josiah Yoder