Cocoaはやっぱり!
インターネットにアクセスしよう
番外編 : curlの使い方
今回のテーマ

今回は、番外編としてMac OS Xに標準で装備されているコマンド「 curl 」の使い方について解説します。直接Cocoaとは関係ありませんが、インターネットにアクセスする様々な機能がついているので、知っていると便利です。蛇足ですが、拙作「 Now Playing 」では、FTPや.macへのアップロードでcurlを使っています。

推奨環境 この解説は、以下の環境を前提に作成し、動作確認等を行っています。ご確認ください。

改版履歴

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
データの転送があまりも遅い場合は、あきらめて別のサーバのダウンロードを行いたいというような場合は、このオプションを使用します。指定速度以下の状態が指定時間以上継続した場合に、あきらめます。
「 -Y 」で速度の最小値の値を指定します。単位はbyte/sec。「 -y 」で継続時間を指定します。単位は秒です。
高速ダウンロード速度制限 ( --limit-rate )
転送経路などに負荷をかけないように、ゆっくりデータ転送を行いたいという場合は、このオプションを使います。指定した速度以上ではダウンロードしなくなります。指定は「 byte/sec 」ですが、「 K, M, G 」を末尾に付けることも可能です。
curl --limit-rate 1K http://www.hoge.com/data.zip
HTTPプロキシサーバの利用 ( -x , --proxy )
HTTPプロキシサーバ経由でサーバにアクセスする場合は、「 -x 」オプションを使います。プロキシのIPと必要ならポート番号をコロンで区切って書きます。ポート番号は省略すると1080になります。
curl -x 192.168.1.10:8080 http://www.hoge.com/
設定ファイルの使用 ( -K, --config )
ダウンロードするURLをコマンドラインから入力するのではなく、ファイルに書き込んでおいてそれを指定することもできます。例えば、「 config.txt 」というファイルに
url = "http://www.hoge.com/"
url = "http://www.foo.co.jp/"
と書いておいて、以下のようにすると、config.txtファイルを読み込んで実行を行います。
curl -K config.txt
プログレスバーの表示 ( -#, --progress-bar )
コンテンツのダウンロード中は細かい情報が表示されますが、これをプログレスバーのみにすることができます。
curl -# -O http://www.hoge.com/image.jpg
「 ##### 100.0% 」のようなプログレスバーが表示されます。
ヘッダー取得 ( -I, --head )
HTTPサーバのコンテンツにアクセスしたときのHTTPヘッダーを見るには「 -I 」オプションを使います。
curl -I http://www.hoge.com/
結果は、コンテンツによって異なりますが、例えばこんな感じの情報がターミナル画面に表示されます。
HTTP/1.1 200 OK
Date: Sat, 03 Jan 2004 10:29:18 GMT
Server: Apache/1.3.26 (Unix) PHP/4.3.0
Last-Modified: Fri, 12 Dec 2003 12:33:56 GMT
Connection: close
Content-Type: text/html
サーバとのやり取りの表示 ( -v, --verbose )
curlがサーバにどういうリクエストを送信して、サーバからどういうレスポンスが返ってきているかを見たいことがあります。この場合、「 -v 」オプションを付けておくと、このやり取りを表示することができます。
curl -v http://www.hoge.com/