315 votes

Comment passer la page de connexion avec Wget ?

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

Comment puis-je envoyer le nom d'utilisateur et le mot de passe en utilisant les données post sur la page de connexion et ensuite télécharger la page actuelle en tant qu'utilisateur authentifié ?

4 votes

386voto

jarnoan Points 1490

Basé sur la page du 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-data est correctement encodé en pourcentage (surtout les esperluettes !) ou la requête échouera probablement. Assurez-vous également que user et password sont les clés correctes ; vous pouvez trouver les clés correctes en fouillant dans le code HTML de la page de connexion (utilisez la fonction "inspecter l'élément" de votre navigateur et trouvez la balise name sur les champs nom d'utilisateur et mot de passe).

10 votes

Ajouter --keep-session-cookies à la première commande, ou à la seconde ?

4 votes

Vous n'avez pas besoin -p ( --page-requisites ) pour cela.

14 votes

Il convient également d'ajouter --delete-after à la première récupération pour ne pas se retrouver à sauvegarder la page de résultat de la connexion.

77voto

baptx Points 382

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, il s'agissait d'une connexion universitaire Moodle où la connexion semble plus complexe (utilisation de plusieurs requêtes avec un ticket de connexion). J'ai ajouté --post-data parce que c'était un POST demande.

Par exemple, obtenir 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

8 votes

Une astuce géniale. C'est utile lorsque vous pouvez accéder au cookie depuis votre propre machine et ensuite l'utiliser depuis une autre machine sans tête à partir de la ligne de commande :)

4 votes

Vous pouvez également définir plusieurs cookies en même temps, --header "Cookie : access_token=IKVYJ;XSRF-TOKEN=5e10521d"

32voto

J'ai eu le même problème. Ma solution était d'effectuer 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 du cookie.txt de Chrome .

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

1 votes

Malheureusement non applicable dans les scripts automatisés

1 votes

La question ne précise pas de script automatique. Cette solution permet d'automatiser 99% du travail.

1 votes

Malheureusement, Google doit être trop intelligent pour cette astuce. J'obtiens toujours une page de connexion.

9voto

J. Piel Points 71

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

8voto

ceejayoz Points 85962

S'ils utilisent l'authentification de base :

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

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

0 votes

Je n'ai pas le droit de modifier quoi que ce soit sur le serveur, il est en lecture seule.

7 votes

Alors ? Rien de tout cela ne nécessite que vous changiez quoi que ce soit sur le serveur.

0 votes

L'Op a demandé wget et a clairement besoin d'une réponse avec des cookies.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X