Comment passer la page de connexion avec Wget?

263

J'essaie d'utiliser Wget pour télécharger une page, mais je n'arrive pas à dépasser l'écran de connexion.

Comment envoyer le nom d'utilisateur / mot de passe à l'aide des données de publication sur la page de connexion, puis télécharger la page réelle en tant qu'utilisateur authentifié?

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

Réponses:

342

Basé sur la page de manuel:

# 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

Assurez-vous que le --post-dataparamètre est correctement codé en pourcentage (en particulier les esperluettes!) Ou la demande échouera probablement. Assurez - vous également que useret passwordsont les touches correctes; vous pouvez trouver les bonnes clés en détectant le code HTML de la page de connexion (recherchez la fonction «inspecter l'élément» de votre navigateur et trouvez l' nameattribut dans les champs de nom d'utilisateur et de mot de passe).

jarnoan
la source
10
ajouter --keep-session-cookies à la première commande ou à la seconde?
Felipe Alvarez
4
Vous n'avez pas besoin de -p( --page-requisites) pour cela.
ændrük
14
Cela vaut également la peine d'être ajouté --delete-afterà la première récupération afin de ne pas finir par enregistrer la page de résultats de la connexion.
Jim Hunziker
2
Je reçois une erreur, WGET64: missing URLj'ai mis toute la commande wget sur une seule ligne et supprimé `\`
Mowgli
6
--keep-session-cookies n'est nécessaire que pour la première commande. Il indique à la première commande d'inclure les cookies de session lors de l'enregistrement des cookies dans le fichier. La deuxième commande lit simplement tous les cookies du fichier fourni.
wadim
63

Si vous en avez besoin pour une utilisation unique, vous pouvez vous connecter via le navigateur et copier les en-têtes nécessaires par la suite:

capture d'écran Utilisez "Copier en tant que cURL" dans l'onglet Réseau des outils de développement (rechargez la page après ouverture) et remplacez l'indicateur d'en-tête de curl -Het --datapar wget --headeret et --post-data.

utilisateur
la source
1
Excellente solution!
menteith
Impressionnant! M'a également indiqué l'option d'utiliser curl au lieu de wget, car il peut faire la même chose et je n'ai même pas besoin de modifier les paramètres.
janvier
solution très propre et simple, +1!
Kresimir Pendic
Cela a fonctionné pour moi, contrairement wgetau cookie correct; Je soupçonne que le service Web vérifie plusieurs en-têtes GET différents, même apparemment sans importance comme "User-Agent" ou "Cache-Control".
Arthur
@Arthur pour moi, cette solution était la seule qui fonctionnait. J'ai essayé de supprimer autant de données d'en-tête que possible de l'URL et je me suis retrouvé essentiellement avec les données des cookies. Je soupçonne donc d'avoir wgetfourni les données de manière erronée.
Florian Blume
62

J'ai directement donné des cookies d'une connexion existante à wget avec --no-cookies et l'en-tête de requête HTTP Cookie. Dans mon cas, c'était une connexion à l'université Moodle où la connexion semble plus complexe (en utilisant plusieurs demandes avec un ticket de connexion). J'ai ajouté --post-data car c'était une requête POST. Par exemple, obtenez la liste de tous les utilisateurs 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
la source
7
Astuce génial. Ceci est utile lorsque vous pouvez accéder au cookie à partir de votre propre machine, puis l'utiliser à partir d'une autre machine sans tête depuis la ligne de commande. :)
Tuxdude
3
Vous pouvez également définir plusieurs cookies en même temps, --header "Cookie: access_token = IKVYJ; XSRF-TOKEN = 5e10521d"
Phil C
29

J'ai eu le même problème. Ma solution était de faire la connexion via Chrome et de sauvegarder les données des cookies dans un fichier texte. Cela se fait facilement avec cette extension Chrome : extension d'exportation Chrome cookie.txt .

Lorsque vous obtenez les données des cookies, il existe également un exemple sur la façon de les utiliser avec wget. Une simple ligne de commande copier-coller vous est fournie.

Thor-Erik Rødland
la source
1
malheureusement pas applicable dans les scripts automatisés
Znik
1
La question ne spécifie pas de script automatisé. Cette solution permet d'automatiser 99% du travail.
Will Sheppard
1
Malheureusement, Google doit être trop intelligent pour cette astuce. Je reçois toujours une page de connexion.
Josiah Yoder
1
Bien sûr, Google utilise des reCAPTCHA secrets ... comme je l'ai vu tant d'endroits, l'utilisation d'API programmatiques standard est l'option la plus pratique dans ce cas.
Josiah Yoder
10

Je voulais un one-liner qui ne télécharge aucun fichier; voici un exemple de canalisation de la sortie du cookie dans la prochaine requête. Je n'ai testé que les éléments suivants sur Gentoo, mais cela devrait fonctionner dans la plupart des environnements * 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' (il s'agit d'une seule ligne, mais elle s'enroule probablement sur votre navigateur)

Si vous souhaitez que la sortie soit enregistrée dans un fichier, passez -O -à-O /some/file/name

Gris caleb
la source
9

Vous n'avez pas besoin de cURL pour faire des données de formulaire POSTed. --post-data 'key1=value1&key2=value2'fonctionne très bien. Remarque: vous pouvez également passer un nom de fichier à wget avec les données POST dans le fichier.

J. Piel
la source
8

S'ils utilisent l'authentification de base:

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

S'ils utilisent des données de formulaire POSTed, vous devrez utiliser quelque chose comme cURL à la place.

ceejayoz
la source
Je n'ai pas accès à changer quoi que ce soit sur le serveur, il est en lecture seule
Señor Reginold Francis
7
Alors? Rien de tout cela ne vous oblige à changer quoi que ce soit sur le serveur.
ceejayoz
5

Une solution qui utilise lynx et wget.

Remarque: Lynx doit avoir été compilé avec l' indicateur --enable-persistent-cookies pour que cela fonctionne

Lorsque vous souhaitez utiliser wget pour télécharger un fichier à partir d'un site qui nécessite une connexion, vous avez juste besoin d'un fichier cookie. Afin de générer le fichier cookie, je choisis lynx. lynx est un navigateur Web de texte. Vous avez d'abord besoin d'un fichier de configuration pour lynx pour enregistrer les cookies. Créez un fichier lynx.cfg. Écrivez ces configurations dans le fichier.

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

Ensuite, lancez lynx avec cette commande:

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

Après avoir entré le nom d'utilisateur et le mot de passe, puis sélectionnez «me conserver sur ce PC» ou quelque chose de similaire. Si vous vous connectez avec succès, vous verrez une belle page Web de texte du site. Et vous vous déconnectez. Dans le répertoire actuel, vous trouverez un fichier cookie nommé cookie.file. C'est ce dont nous avons besoin pour wget.

Ensuite, wget peut télécharger un fichier à partir du site avec cette commande.

wget --load-cookies ./cookie.file http://the.site.com/download/we-can-make-this-world-better.tar.gz
Visage impassible
la source
2
qu'en est-il si la connexion nécessite javascript? lynx ne semble pas prendre en charge javascript.
Tiberiu
1

Exemple pour télécharger avec wget sur le serveur un lien de gros fichier qui peut être obtenu dans votre navigateur.

Par exemple en utilisant Google Chrome.

Connectez-vous où vous en avez besoin et appuyez sur télécharger. Accédez au téléchargement et copiez votre lien.

entrez la description de l'image ici

Ensuite, ouvrez DevTools sur une page où vous vous connectez, accédez à la console et obtenez vos cookies, en entrantdocument.cookie

entrez la description de l'image ici

Maintenant, allez sur le serveur et téléchargez votre fichier: wget --header "Cookie: <YOUR_COOKIE_OUTPUT_FROM_CONSOLE>" <YOUR_DOWNLOAD_LINK>

entrez la description de l'image ici

Alex Ivasyuv
la source
Cette réponse ne semble pas bien adaptée à Google - où il y a deux pages de cookies!
Josiah Yoder
Bien sûr, Google utilise des reCAPTCHA secrets ... comme je l'ai vu tant d'endroits, l'utilisation d'API programmatiques standard est l'option la plus pratique dans ce cas.
Josiah Yoder