私はMac OS 10.11.6 El Capitanを実行しています。プログラムでリンクをダウンロードしたいです。
https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.16-osx10.11-x86_64.dmg
このURLをSafariなどのブラウザに貼り付けると、ダウンロードが正常に機能します。
ただし、同じURLを使用してコマンドラインからダウンロードしようとするとcurl
機能しません。結果は空のファイルです。
$ ls -lA
$ curl -O https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.16-osx10.11-x86_64.dmg
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
$ ls -lA
total 0
-rw-r--r-- 1 myname staff 0 Nov 7 14:07 mysql-5.7.16-osx10.11-x86_64.dmg
$
もちろん、ブラウザからファイルを取得できますが、理解したいと思います。なぜ上記のコマンドはcurl
機能しません。
curl
なぜこのファイルを正しくダウンロードできないのですか?ウェブサイトに視覚的に存在し、グラフィックWebブラウザを介して正しくアクセスしてダウンロードできるのはいつですか?
答え1
Webサーバー側から次のURLにリダイレクトされますhttp://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.16-osx10.11-x86_64.dmg
。 CDNなので、正確な動作(リダイレクトかどうか)は場所によって異なります。
curl
デフォルトでは、リダイレクトはフォローしません。これを行うには、-L
パラメータを追加してください。
curl -L -O https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.16-osx10.11-x86_64.dmg
答え2
ブラウザがファイルをダウンロードできる場合は、ブラウザが何をしているのかを確認できます。 Google Chrome では、次のコマンドを使用して何が起こっているかを確認できます。
1)[表示 > 開発者 > 開発者ツール > ネットワークタブ > ヘッダタブ]
2)ダウンロードリンクをクリックしてください。
3) Developer Toolsタブにファイルリンクが表示されます。
4) ファイルを右クリックし、コピー/cURL にコピーを選択します。
これで利用可能なカールリンクができました。整理できる重複パラメータがある可能性があります。
詳細は: https://lornajane.net/posts/2013/chrome-feature-copy-as-curl
答え3
この投稿のコメントの1つを回答に変換します。
特定のヘッダーが機能する必要があるHTTP / HTTPSリンクがたくさんあります。したがって、これはWebブラウザで有効な応答を引き起こしますが、カールなどのバックエンドWebリクエストではそうではありません。
次のヘッダーがすべて必要なWebサイトを見つけました。これを指定しないと、タイムアウトが発生します。
httpget.setHeader("User-Agent", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36");
httpget.setHeader("Upgrade-Insecure-Requests", "1");
httpget.setHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8");
httpget.setHeader("Accept-Encoding", "gzip, deflate, br");
httpget.setHeader("Accept-Language", "en-US,en;q=0.9");
httpget.setHeader("Connection", "keep-alive");
httpget.setHeader("Host", "www.thehost.com");