J'essaie de télécharger un fichier avec wget
et curl
et il est rejeté avec une erreur 403 (interdit).
Je peux afficher le fichier à l'aide du navigateur Web sur la même machine.
J'essaie à nouveau avec l'agent utilisateur de mon navigateur, obtenu par http://www.whatsmyuseragent.com . Je fais ça:
wget -U 'Mozilla/5.0 (X11; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0' http://...
et
curl -A 'Mozilla/5.0 (X11; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0' http://...
mais c'est toujours interdit. Quelles autres raisons peut-il y avoir pour le 403, et comment puis-je modifier les commandes wget
et curl
pour les surmonter?
(il ne s'agit pas de pouvoir obtenir le fichier - je sais que je peux simplement l'enregistrer à partir de mon navigateur; il s'agit de comprendre pourquoi les outils de ligne de commande fonctionnent différemment)
mise à jour
Merci à toutes les excellentes réponses données à cette question. Le problème spécifique que j'avais rencontré était que le serveur vérifiait le référent. En ajoutant ceci à la ligne de commande, j'ai pu obtenir le fichier en utilisant curl
et wget
.
Le serveur qui a vérifié le référent a rebondi via un 302 vers un autre emplacement qui n'a effectué aucune vérification, donc un curl
ou wget
de ce site a fonctionné correctement.
Si quelqu'un est intéressé, cela est dû au fait que je lisais this page pour en savoir plus sur le CSS intégré et essayais de regarder le CSS du site pour un exemple. L'URL réelle avec laquelle je rencontrais des problèmes était this et le curl
avec lequel je me suis retrouvé est
curl -L -H 'Referer: http://css-tricks.com/forums/topic/font-face-in-base64-is-cross-browser-compatible/' http://cloud.typography.com/610186/691184/css/fonts.css
et le wget est
wget --referer='http://css-tricks.com/forums/topic/font-face-in-base64-is-cross-browser-compatible/' http://cloud.typography.com/610186/691184/css/fonts.css
Très intéressant.
Une requête HTTP peut contenir plus d'en-têtes qui ne sont pas définis par curl ou wget. Par exemple:
key=val
, vous pouvez le définir avec le -b key=val
(ou --cookie key=val
) option pour curl
.curl
pour cela est -e URL
et --referer URL
.curl
avec le -u user:password
(ou --user user:password
).Mozilla
, ou contiennent Wget
ou curl
).Vous pouvez normalement utiliser les outils de développement de votre navigateur (Firefox et Chrome supporte cela) pour lire les en-têtes envoyés par votre navigateur. Si la connexion n'est pas cryptée (c'est-à-dire, n'utilise pas HTTPS), vous pouvez également utiliser un renifleur de paquets tel que Wireshark à cet effet.
Outre ces en-têtes, les sites Web peuvent également déclencher certaines actions en arrière-plan qui changent d'état. Par exemple, lors de l'ouverture d'une page, il est possible qu'une demande soit effectuée en arrière-plan pour préparer le lien de téléchargement. Ou une redirection se produit sur la page. Ces actions utilisent généralement Javascript, mais il peut également y avoir un cadre caché pour faciliter ces actions.
Si vous cherchez une méthode pour récupérer facilement des fichiers à partir d'un site de téléchargement, jetez un œil à labour, inclus avec plowshare .
Je veux juste ajouter aux réponses ci-dessus que vous pouvez utiliser la fonctionnalité "Copier en tant que cURL" présente dans Chrome outils de développement (depuis v26.0) et Firebug (depuis v1.12 ). Vous pouvez accéder à cette fonctionnalité en cliquant avec le bouton droit sur la ligne de demande dans l'onglet Réseau.
J'ai essayé tout ce qui précède mais pas de chance; utilisé l'outil de navigateur de développement pour obtenir la chaîne de l'agent utilisateur, une fois que j'ai ajouté ce qui suit, succès:
--user-agent="Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"
Selon ce que vous demandez, il peut s'agir d'un cookie. Avec Firefox, vous pouvez faire un clic droit lorsque vous êtes sur la page en question, "Afficher les informations sur la page". Choisissez l'icône "Sécurité", puis cliquez sur le bouton "Afficher les cookies".
Pour dérouter les cookies, le plug-in Firefox "Live HTTP Headers" est essentiel. Vous pouvez voir quels cookies sont configurés et quels cookies sont renvoyés au serveur Web.
wget
peut fonctionner avec les cookies, mais c'est totalement exaspérant, car il ne donne aucune indication qu'il n'a pas envoyé de cookies. Votre meilleur pari est de supprimer tous les cookies associés de votre navigateur et de suivre la séquence de connexion initiale ou de visualisation de page nécessaire. Regardez "Live HTTP Headers" pour les cookies et pour tous les paramètres POST ou GET. Effectuez la première étape de connexion avec wget
en utilisant "--keep-session-cookies" et Options "--save-cookies". Cela vous donnera un fichier cookie que vous pouvez consulter avec un éditeur de texte. Utilisez wget --load-cookies
avec le fichier cookie pour les étapes suivantes.
Cela peut également se produire si le site nécessite SSL. Votre navigateur transférera automatiquement de HTTP vers HTTPS, mais curl et wget ne le feront pas. Essayez donc la demande avec HTTPS au lieu de HTTP.