web-dev-qa-db-ja.com

curlとwgetで403が禁止されるのはなぜですか?

wgetcurlを使用してファイルをダウンロードしようとすると、403エラーで拒否されます(禁止)。

同じマシンでWebブラウザーを使用してファイルを表示できます。

http://www.whatsmyuseragent.com で取得したブラウザのユーザーエージェントを使用して再試行します。私はこれをします:

wget -U 'Mozilla/5.0 (X11; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0' http://...

そして

curl -A 'Mozilla/5.0 (X11; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0' http://...

しかし、それはまだ禁止されています。 403には他にどのような理由があるのでしょうか。それらを克服するためにwgetおよびcurlコマンドをどのように変更できますか?

(これはファイルを取得できるということではありません-私はブラウザからファイルを保存できることを知っています。コマンドラインツールの動作が異なる理由を理解することです)

更新

この質問に与えられたすべての優れた回答に感謝します。私が遭遇した特定の問題は、サーバーがリファラーをチェックしていることでした。これをコマンドラインに追加すると、curlwgetを使用してファイルを取得できます。

リファラーをチェックしたサーバーは、302を経由してチェックをまったく実行しない別の場所にバウンスしたため、そのサイトのcurlまたはwgetは問題なく動作しました。

誰かが興味を持っているなら、これは私が組み込みCSSについて学ぶために this ページを読んでいて、例としてサイトのcssを調べようとしたために起こりました。私が問題を抱えていた実際のURLは this で、curlは最終的に

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

そして、wgetは

 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

とても興味深い。

59
starfry

HTTPリクエストには、curlまたはwgetで設定されていないヘッダーがさらに含まれている場合があります。例えば:

  • Cookie:これが、リクエストが拒否される最も可能性の高い理由です。これは、ダウンロードサイトで見られます。 Cookie key=valを指定すると、curl-b key=val(または--cookie key=val)オプションを使用してCookieを設定できます。
  • リファラー(sic):Webページのリンクをクリックすると、ほとんどのブラウザーは現在のページをリファラーとして送信する傾向があります。信頼すべきではありませんが、このヘッダーが存在しない場合、eBayでもパスワードのリセットに失敗しました。ですから、そうなるかもしれません。このためのcurlオプションは-e URLおよび--referer URLです。
  • 承認:ユーザー名/パスワードダイアログのUIが制御できないため、これは今ではあまり一般的ではありませんが、それでも可能です。 curl-u user:password(または--user user:password)オプションを使用して設定できます。
  • User-Agent:一部のリクエストは、User Agentに応じて異なる応答を生成します。これは良い方法(ミラーのリストではなく実際のダウンロードを提供する)または悪い方法(Mozillaで始まらない、またはWgetを含まないユーザーエージェントを拒否する)またはcurl)。

通常、ブラウザーの開発者ツール(FirefoxおよびChromeサポート))を使用して、ブラウザーから送信されたヘッダーを読み取ることができます。接続が暗号化されていない(つまりHTTPSを使用していない)場合は、次に、Wiresharkなどのパケットスニファをこの目的で使用できます。

これらのヘッダーに加えて、Webサイトは状態を変更する舞台裏でいくつかのアクションをトリガーする場合もあります。たとえば、ページを開くときに、ダウンロードリンクを準備するためにバックグラウンドで要求が実行される可能性があります。または、ページでリダイレクトが発生します。これらのアクションは通常Javascriptを使用しますが、これらのアクションを容易にするために非表示のフレームがある場合もあります。

ダウンロードサイトからファイルを簡単に取得する方法を探している場合は、 plowshare に含まれているプラ​​ウダウンをご覧ください。

40
Lekensteyn

Chrome開発者ツール(v26.0以降)およびFirebug(以降 v1.12 )。この機能には、[ネットワーク]タブのリクエスト行を右クリックしてアクセスできます。

13
solde9

上記のすべてを試したが運がなかった。開発者のブラウザツールを使用してユーザーエージェント文字列を取得しました。以下を追加すると、成功します。

--user-agent="Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"
10
user3707737

あなたが求めているものに応じて、それはクッキーかもしれません。 Firefoxでは、問題のページの[ページ情報を表示]で右クリックすることができます。 「セキュリティ」アイコンを選択し、「Cookieの表示」ボタンをクリックします。

クッキーを困惑させるためには、Firefoxの「ライブHTTPヘッダー」プラグインが不可欠です。どのCookieが設定され、どのCookieがWebサーバーに送り返されるかを確認できます。

wgetはCookieで動作しますが、Cookieを送信しなかったというヒントを与えないため、完全に腹立たしいです。あなたの最善の策は、ブラウザからすべての関連するCookieを削除し、それが取る最初のログインまたはページ表示シーケンスを実行することです。 CookieとPOSTまたはGETパラメータについては、「ライブHTTPヘッダー」を参照してください。「-keep-session-cookies」を使用してwgetで最初のログイン手順を実行し、 「--save-cookies」オプション。テキストエディタで確認できるCookieファイルが提供されます。wget --load-cookies次のステップで使用するCookieファイル。

5
Bruce Ediger

これが発生するもう1つの理由は、サイトでSSLが必要な場合です。ブラウザはHTTPからHTTPSに自動的に転送しますが、curlとwgetは転送しません。したがって、HTTPではなくHTTPSを使用してリクエストを試してください。

1
Richard