curlとは?
Mac OS Xには、「 curl 」という「 HTTPやFTPでのダウンロードやアップロードする 」ための様々な機能を持ったコマンドが標準装備されています。まず、ターミナルアプリケーションを起動して、
curl http://www.google.com/
と入力してみましょう。GoogleのサイトのHTMLがターミナルのウィンドウ内に表示されたはずです。つまり、「 http://www.google.com/ にアクセスし、コンテンツのHTMLをダウンロードし、標準出力へ出力 」という処理を行ったわけです。Webブラウザで実行すると面倒だったりすることの自動化とか、Cocoaアプリから呼び出したりなどの応用が可能です。 以下では、よく使用する機能についてチュートリアル形式で解説していきます。
ファイルへの保存 ( -O, --remote-name ) (HTTP/HTTPS/FTP)
表示するのではなくてファイルに保存するには「 -O 」オプションを付けます ( アルファベットのオーです )。
curl -O http://img.yahoo.co.jp/images/tv/yjtv.gif
こうすると、「 yjtv.gif 」というファイルができます。既に、同名のファイルがあると上書きされてしまいますので注意が必要です。また、「 http://www.google.com/ 」のようにファイル名が無いURLの場合は、ファイルが作成されません。
「 --remote-name 」オプションをでも同じです。ハイフンが2つのオプションは、長いですが憶えやすい名前になっています。こちらでも同じ結果になります。
curl --remote-name http://img.yahoo.co.jp/images/tv/yjtv.gif
複数ファイル指定 ( [start-end], {one,two,three} ) (HTTP/HTTPS/FTP)
続いて、複数個のファイルを一気にダウンロードする方法です。まず、連番ファイルのダウンロードの方法です。
curl -O "http://www.hoge.com/[1-5].jpg"
[1-5] という部分が連番の範囲指定になり、以下の5つを実行したのと同じ結果が得られます。URL全体をダブルクオートで囲まないとエラーになりますので注意。
curl -O "http://www.hoge.com/1.jpg"
curl -O "http://www.hoge.com/2.jpg"
curl -O "http://www.hoge.com/3.jpg"
curl -O "http://www.hoge.com/4.jpg"
curl -O "http://www.hoge.com/5.jpg"
数字の先頭にゼロを付ける記述もできます。以下のように書くと「 01, 02, ... , 09, 10 」に展開されます。
curl -O "http://www.hoge.com/[01-10].jpg"
数字でなく文字での指定も可能です。[a-c] と書くと「 a, b, c 」に展開されます。[a-Z] とか [aa-bb] のような記述はできないようで、展開されず、そのままのURLとして指定されます。範囲指定ではなく、複数指定という方法もあります。
curl -O "http://www.hoge.com/{1,3,5}.jpg"
{1,3,5} という部分が範囲指定になり、以下の3つを実行したのと同じ結果が得られます。
curl -O "http://www.hoge.com/1.jpg"
curl -O "http://www.hoge.com/3.jpg"
curl -O "http://www.hoge.com/5.jpg"
文字列も指定できます。
curl -O "http://www.hoge.com/image{,_big,_small}.jpg"
以下の3つに展開されます。最初の文字列が空になっていますが、こういう指定も可能です。
curl -O "http://www.hoge.com/image.jpg"
curl -O "http://www.hoge.com/image_big.jpg"
curl -O "http://www.hoge.com/image_small.jpg"
さらに複雑な指定も可能です。
curl -O "http://www.hoge.com/{a,b}{1,2}.jpg"
これは、「 a1, a2, b1, b2 」と展開されます。
出力ファイル指定 ( -o , --output ) (HTTP/HTTPS/FTP)
-Oオプションでは、URLからファイル名が決まっていましたが、自由にファイル名を付けることも可能です。「 -o 」オプションを使用します(アルファベットのオーです)。
curl -o google.html http://www.google.com/
こうすることで「 google.html 」というファイルへ出力されます。複数ファイルのダウンロードを指定している場合は、それぞれで別のファイル名にならないと困りますが、その指定法もあります。
curl -o image_#1.jpg "http://www.hoge.com/[001-003].jpg"
これは、以下のように展開されます。
curl -o image_001.jpg "http://www.hoge.com/001.jpg"
curl -o image_002.jpg "http://www.hoge.com/002.jpg"
curl -o image_003.jpg "http://www.hoge.com/003.jpg"
つまり、出力先のファイル名のところの「 #1 」が [1-3] を展開した内容と置き換わるわけです。以下のように、複数指定が複数ある場合もあるので「 # 」の後に数字が必要です。「 #1 」が [001-002] に対応し、「 #2 」 が {big,small} に対応します。
curl -o image_#1#2.jpg "http://www.hoge.com/[001-002]{big,small}.jpg"
このように展開されます。
curl -o image_001big.jpg "http://www.hoge.com/001big.jpg"
curl -o image_001small.jpg "http://www.hoge.com/001small.jpg"
curl -o image_002big.jpg "http://www.hoge.com/002big.jpg"
curl -o image_002small.jpg "http://www.hoge.com/002small.jpg"
タイムスタンプの保持 ( -R, --remote-time ) (HTTP/HTTPS/FTP)
サーバからファイルをダウンロードした際に、サーバ上でのファイルのタイムスタンプ(更新日時)が取得できた場合、ダウンロードしたファイルのタイムスタ ンプも同じ値をセットするように指定します。指定しなかった場合や、サーバからタイムスタンプが取得できなかった場合、ダウンロードしたときの日時がタイ ムスタンプになります。
curl -R http://www.hoge.com/photo.jpg
URLのリダイレクト対応 ( -L ) (HTTP/HTTPS)
curlでGoogle ( http://www.google.com/ ) にアクセスすると分かりますが、別のページに飛ばされます。HTTPには、別のページへ飛ばすためのいくつかの方法がありますが、その指定に従って飛んで いくには、「 -L 」を書いておきます。特別なことが無い限りは、常に書いておいた方がよいでしょう。
curl -L http://www.google.com/
URLの最大リダイレクト対応回数制限 ( -Z , --max-redirs )
リダイレクトは、複数回行われることがあります。不具合か悪意のあるサイトでは、リダイレクトを永久に繰り返してしまう可能性がありますので、最大回数を指定することができます。
curl -Z 2 -L http://www.google.com/
分割ダウンロード ( -r , --range ) (HTTP/HTTPS/FTP) )
ダウンロードするときに、ファイルの一部を指定してダウンロードすることができます。大きなファイルを分割してダウンロードするなどのときに使用します。
curl -r 0-9 http://www.hoge.com/mymovie.mpg
ファイルの先頭位置を0として、どの範囲をダウンロードするかをバイト単位で指定します。この例では、ファイルの先頭の10byteをダウンロードしま す。別の範囲を同じファイルにダウンロードしても、ファイルは連結されずに上書きされますので注意。また、これは、部分指定のダウンロードをサーバ側でサ ポートしている必要があります。HTTP 1.1のサーバならば対応しています。
ダウンロードの再開 ( -C , ---continue-at ) (HTTP/HTTPS/FTP)
ダウンロード途中でサーバとの接続が切れてしまったときなどに、切れたところから後の部分をダウンロードを再開することもできます。このオプションの場合 は、ダウンロード済みのファイルに追加で書き込まれます。ファイルの先頭を0として、ダウンロードを再開する位置をバイト単位で指定します。
curl -C 11 http://www.hoge.com/mymovie.mpg
認証付きのページ ( -u , -user )
会員制のページなどで認証ダイアログが表示されるサイトでは、ユーザIDとパスワードの指定をする必要があります。「 -u 」オプションで、ユーザIDとパスワードをコロンで繋げて書きます。通信に流すときは、BASE64というデータにエンコードを行いますが、このエンコー ド処理はcurl側で行います。ユーザIDとパスワードはそのまま書くだけでよいです。
curl -u userid:password http://www.hoge.com/member/
パスワードを省略すると、ターミナル上でcurlからパスワード入力を求められます。
curl -u userid http://www.hoge.com/member/
受信クッキーの保存 ( -c , --cookie-jar )
クッキーを送信してくるサイトの場合、次回のアクセスでそのクッキーを必要とするところもあります。そのクッキーを保存するためには「 -c 」オプションを使います。「 -c cookie.txt 」のように保存先のファイル名を書いておきます。
curl -c cookie.txt http://www.hoge.com/
保存クッキーの送信 ( -b , --cookie )
ファイルへ保存したクッキーを送信する場合は、「 -b 」オプションを使用します。後ろにクッキーが保存されているファイルを指定します。
curl -b cookie.txt http://www.hoge.com/
リファラー指定 ( -e , --referer )
Webブラウザでサイトにアクセスする際には、ジャンプ元のURLであるリファラーを一般に知らせます。curlは、Webブラウザではないので、ジャンプ元そのものが存在しないので、オプションで指定することになります。
curl -e http://www.foo.com/ http://www.hoge.com/
ユーザエージェントの変更 ( -A , --user-agent ) (HTTP/HTTPS)
Webサーバにアクセスする際、クライアントの名前や情報 (ユーザエージェント) を送信します。curlの場合は以下のような文字列を送っています。
curl/7.10.2 (powerpc-apple-darwin7.0) libcurl/7.10.2 OpenSSL/0.9.7b zlib/1.1.4 19
これを自由に変更することができます。「 -A 」オプションを使います。curlを使ったダウンローダソフトとかの場合は、適切な名前に変更するとよいでしょう。
curl -A downloaderWithCurl http://www.hoge.com/
HTTPのヘッダーの変更 ( -H , --head ) (HTTP/HTTPS)
HTTPのリクエストヘッダーに特殊なフィールドを追加したり、curlの送信しているフィールドの中身を変更したり、削除することができます。追加する場合は以下のようにします。
curl -H "MemberID: xxx" http://www.hoge.com/
変更する場合は、以下のようにします。
curl -H "Host: www.hoge.com" http://www.hoge.com/
削除する場合は、以下のように値のところを空にします。
curl -H "Host:" http://www.hoge.com/
ただし、curlが出力しているフィールドを変更する場合は、その意味をよく理解した上で行ってください。
フォームの送信 ( -d , --data ) (HTTP/HTTPS)
Webページ上のフォームからフォームの送信を行うことと同様のことを行うことができます。「 -d 」オプションを使います。「 -d name=value 」のようにフォームの名前と値をイコールで繋いで指定します。このオプションは複数個指定できます。
curl -d ID=userid -d PW=password http://www.hoge.com/login.cgi
このオプションを使うと、POSTコマンドが送信されます。
フォームでのファイルアップロード ( -F , --form )
Webページ上のフォームからファイルのアップロードを行う場合は、このオプションを使用します。「 -F 」オプションの後ろに、ファイルアップロード用のフォームのIDを書いて「 =@ 」の後ろのファイルパスを書きます。
curl -F FILE=@photo.jpg http://www.hoge.com/upload.cgi
このオプションを使うと、POSTコマンドが送信されます。
ファイルのアップロード ( -T , --upload-file ) (HTTP/HTTPS/FTP)
サーバへファイルのアップロードする機能もあります。これは、FTPとWebDAVのサーバで使用できます。.macもWebDAVですので利用可能で す。「 -T 」オプションで後ろにアップロードしたいファイルのパスを書きます。URLには、アップロード先のパスを書いておきます。また、一般的には、アップロード 時には、ユーザIDとパスワードを要求されますので、それも合わせて書くことになるでしょう。
curl -T photo.jpg -u userid:password ftp://ftp.hoge.com/
最大転送時間制限 ( -m , --max-time )
サーバからの転送が遅くて時間がかかりすぎる場合など、特定の時間を過ぎたら転送を中止させることができます。秒で指定します。
curl -m 600 http://www.hoge.com/hoge.mpg
最大接続時間制限 ( --connect-timeout )
サーバへの接続に時間がかかる場合に、特定の時間を過ぎたら接続を中止させることができます。秒で指定します。
curl --connect-timeout 600 http://www.hoge.com/hoge.mpg
低速ダウンロード制限制限 ( -Y , --speed-limit , -y