curl google の使い方入門

はい、承知いたしました。curlコマンドを使用してGoogleと連携する方法を中心に、curlコマンドの基本的な使い方から応用、詳細なオプション解説、トラブルシューティングまで、約5000語の詳細な入門記事を記述します。


curl Googleの使い方入門:Web通信を自由自在に操る

はじめに

インターネットの進化とともに、情報の取得やシステム間の連携において、HTTPをはじめとするさまざまなプロトコルが重要な役割を果たしています。Webブラウザはこれらのプロトコルを使ってWebサイトを表示する便利なツールですが、より低レベルで、より柔軟にWeb通信を制御したい場面が多くあります。APIとの連携、スクリプトでのデータ取得、サーバーサイドからの情報送信、通信のデバッグなど、その用途は多岐にわたります。

このような場面で絶大な威力を発揮するのが、コマンドラインツールである curl です。curlは、URL構文を使用してデータを送受信するためのコマンドラインツールであり、多数のプロトコル(HTTP, HTTPS, FTP, FTPS, SCP, SFTP, TFTP, DICT, TELNET, LDAP, LDAPS, POP3, POP3S, SMTP, SMTPS, RTMP, RTSP, FILEなど)をサポートしています。特にWeb開発者やシステム管理者にとって、curlは日々の業務に欠かせないツールとなっています。

本記事では、curlの基本的な使い方から、HTTP/HTTPSプロトコルを使ったWeb通信(特にGoogleとの連携を例に)の具体的な方法、主要なオプションの詳細な解説、さらには認証、SSL/TLS、トラブルシューティングといった応用的な内容まで、約5000語のボリュームで徹底的に解説します。この記事を読むことで、あなたはcurlを使いこなし、Web通信をより深く理解し、自在に操るための知識とスキルを身につけることができるでしょう。

特に「Google」というキーワードに焦点を当てることで、実際のWebサービスとの具体的なやり取りをイメージしやすくなるように努めます。ただし、Googleのサービスには利用規約や認証が必要なものが多いため、本記事では主に公開されている情報へのアクセスや、規約に触れない範囲での例を中心に解説します。Googleの各APIの詳細については、それぞれのAPIドキュメントを参照してください。

さあ、強力なツールであるcurlの世界へ飛び込みましょう。

1. curlとは何か? なぜ使うのか?

1.1 curlの正体

curlは、スウェーデンのHåkon Lidman氏(現在はDaniel Stenberg氏がメンテナー)によって開発された、オープンソースのコマンドラインツールです。もともとは転送プロトコルのみをサポートするツールとして始まりましたが、現在では非常に多くのプロトコルと機能をサポートする多機能なツールに進化しました。curlの名前は「Client for URLs」や「See URL」に由来すると言われています。

curlの中核には、libcurl というライブラリがあります。このlibcurlは、PHP, Python, Ruby, Java, C++, C# など、様々なプログラミング言語から利用できるネットワーキングライブラリです。curlコマンドラインツール自体も、このlibcurlライブラリを利用して作られています。つまり、curlコマンドでできることのほとんどは、libcurlを使ってプログラミングでも実現可能です。

1.2 なぜcurlを使うのか? Webブラウザとの違い

WebブラウザもURLを指定してWebサイトを表示するツールですが、curlとは目的が異なります。

  • Webブラウザ: 人間がWebサイトを閲覧し、操作するためのGUIアプリケーションです。HTML, CSS, JavaScriptを解釈・実行し、ページをレンダリングします。ユーザーフレンドリーなインターフェースを提供しますが、通信の詳細は通常隠蔽されています。
  • curl: 主に機械的なデータ転送や、プログラムからの利用を目的としたCLI(コマンドラインインターフェース)ツールです。通信プロトコルに直接アクセスし、ヘッダーやボディなど、通信の詳細を柔軟に制御・確認できます。レンダリング機能はありません。

curlを使う主な理由は以下の通りです。

  • Web通信のデバッグ: HTTPリクエスト/レスポンスの詳細(ヘッダー、ステータスコード、ボディなど)を直接確認できるため、APIの挙動確認や通信トラブルの原因究明に不可欠です。
  • APIテスト: RESTful APIなどに対し、GET, POST, PUT, DELETEといったHTTPメソッドを使ってデータを送信したり、応答を取得したりするテストを簡単に行えます。
  • データ取得・ダウンロード: Web上のファイルやデータ(HTMLソース、JSONデータ、画像ファイルなど)をコマンド一つで取得し、ファイルに保存できます。
  • 自動化・スクリプト: シェルスクリプトなどからcurlを呼び出すことで、定期的なデータ取得、Webサービスの監視、簡単な自動操作などを実現できます。
  • 多様なプロトコルへの対応: HTTP/HTTPSだけでなく、FTPやSCPといったファイル転送プロトコルなども扱えるため、幅広い用途に利用できます。
  • ヘッダーやデータのカスタマイズ: User-Agentの偽装、カスタムヘッダーの追加、クッキーの操作、POSTデータの形式指定など、柔軟なリクエストのカスタマイズが可能です。

これらの理由から、開発者、システム管理者、データサイエンティストなど、多くのプロフェッショナルにとってcurlは強力なツールとなっています。

2. curlのインストール

curlは多くのオペレーティングシステムに標準でインストールされていることが多いですが、もしインストールされていない場合や、最新版を使いたい場合は、以下の方法でインストールできます。

2.1 macOSの場合

macOSには最初からcurlがインストールされています。ターミナルを開いて以下のコマンドを実行し、バージョン情報が表示されればOKです。

bash
curl --version

もし最新版にアップデートしたい場合は、Homebrewというパッケージマネージャーを使うのが一般的です。

“`bash

Homebrewがインストールされていない場合

/bin/bash -c “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)”

Homebrewを使ってcurlをインストール/アップデート

brew install curl
“`

2.2 Linuxの場合

多くのLinuxディストリビューションにもcurlは標準でインストールされています。こちらもターミナルでバージョン確認してください。

bash
curl --version

インストールされていない場合や、最新版をインストールしたい場合は、各ディストリビューションのパッケージマネージャーを使用します。

  • Debian/Ubuntu:
    bash
    sudo apt update
    sudo apt install curl
  • Fedora/CentOS/RHEL:
    bash
    sudo dnf install curl # Fedora 22以降
    # または
    sudo yum install curl # CentOS/RHEL 7以前

2.3 Windowsの場合

Windows 10以降のバージョンでは、curlが標準で搭載されるようになりました。コマンドプロンプトまたはPowerShellを開いて以下のコマンドを実行し、バージョン情報が表示されればOKです。

cmd
curl --version

もし古いバージョンのWindowsを使用している場合や、標準搭載されていない場合は、curl公式サイトからダウンロードできます。

  1. curl公式サイトのダウンロードページにアクセスします: https://curl.se/download.html
  2. お使いのWindowsのアーキテクチャ(32-bitまたは64-bit)に合ったSSL対応版のバイナリを探します(通常は「Win64 x86_64」で、schannelOpenSSL が含まれているものが良いでしょう)。
  3. ダウンロードしたZIPファイルを展開し、curl.exe を実行パスが通っているディレクトリ(例: C:\Windows\System32 や、自分で作成したツール用ディレクトリに追加して環境変数Pathを設定)に配置します。

インストール後、新しいコマンドプロンプトやPowerShellを開いて curl --version を実行し、正しくパスが通っているか確認してください。

3. curlの最も基本的な使い方

curlの最も基本的な使い方は、引数にURLを指定することです。これにより、指定したURLに対してHTTP GETリクエストが送信され、サーバーからの応答(通常はHTMLソースやAPIからのデータなど)が標準出力に表示されます。

例:Googleのトップページを取得する

bash
curl https://www.google.com

このコマンドを実行すると、GoogleのトップページのHTMLソースコードがターミナルにバーッと表示されます。

ポイント:

  • デフォルトのメソッドはGETです。
  • HTTPSにも対応しています(SSL証明書の検証が行われます)。
  • 取得したデータは標準出力に表示されます。

もし存在しないURLやエラーとなるURLを指定した場合、サーバーからのエラー応答(例: 404 Not Found)が表示されます。ただし、curlコマンド自体の終了ステータスは成功(0)となることが多いです。エラーが発生したかどうかは、後述するオプションやエラーハンドリングで確認する必要があります。

4. 主要なオプションの詳細解説

curlには非常に多くのオプションがあり、これらを組み合わせることで様々なタスクを実行できます。ここでは、特によく使う主要なオプションを詳細に解説します。

4.1 レスポンスをファイルに保存する: -o および -O

通常、curlの出力は標準出力に表示されますが、取得したデータをファイルに保存したいことがよくあります。

  • -o <ファイル名>: 指定したファイル名でレスポンスボディを保存します。
    “`bash
    # Googleのトップページを google.html という名前で保存
    curl -o google.html https://www.google.com

    Google Static Maps API で地図画像を取得し、map.png で保存

    (APIキーは省略またはダミーとしています。実際の利用にはキーが必要です。)

    curl “https://maps.googleapis.com/maps/api/staticmap?center=Tokyo&zoom=12&size=400×400&key=YOUR_API_KEY” -o map.png
    ``-oオプションは、ダウンロードしたデータの表示を抑制します。ファイル保存が成功したかどうかの確認には、後述の-s`(サイレントモード)を付けずに実行し、進捗表示を見るか、ファイルの存在を確認します。

  • -O: リモートファイルのファイル名(URLの最後の部分)を使ってレスポンスボディを保存します。複数のURLを指定した場合、それぞれのURLからファイル名を取得して保存します。
    “`bash
    # curlのサイトからドキュメントファイルをダウンロードし、元のファイル名 (curl.html) で保存
    curl -O https://curl.se/docs/curl.html

    複数のファイルをダウンロード (それぞれのファイル名で保存)

    curl -O https://curl.se/docs/curl.html -O https://curl.se/docs/faq.html
    “`

4.2 ヘッダー情報を取得・表示する: -I および -i

HTTP通信において、ヘッダー情報は非常に重要です。サーバーの情報、コンテンツタイプ、キャッシュ設定、リダイレクト先などが含まれています。

  • -I, --head: HEADリクエストを送信し、ヘッダー情報のみを取得・表示します。レスポンスボディは取得しません。リソースの存在確認や、ヘッダー情報の確認に高速で利用できます。
    bash
    # Googleのトップページのヘッダー情報のみを取得
    curl -I https://www.google.com

    出力例:
    HTTP/1.1 200 OK
    Date: ...
    Expires: -1
    Cache-Control: private, max-age=0
    Content-Type: text/html; charset=ISO-8859-1
    ...

  • -i, --include: GETリクエストを送信し、ヘッダー情報とレスポンスボディの両方を取得しますが、ヘッダー情報も出力に含めます。
    bash
    # Googleのトップページのヘッダーとボディを取得し、ヘッダーも表示
    curl -i https://www.google.com

    -i は、レスポンスのヘッダーとボディをまとめて確認したい場合に便利です。

4.3 進捗表示を抑制・詳細情報を表示する: -s および -v

  • -s, --silent: データ転送中の進捗メーターやエラーメッセージ(ほとんど)を表示せず、サイレントモードで実行します。スクリプトでcurlを使う場合によく使用されます。
    “`bash
    # 進捗表示なしでトップページを取得(出力は標準出力へ)
    curl -s https://www.google.com

    進捗表示なしでファイルを保存

    curl -s -o google.html https://www.google.com
    “`

  • -v, --verbose: 通信に関する非常に詳細な情報を表示します。どのIPアドレスに接続しているか、送信しているヘッダー、受信したヘッダーなどが確認できます。通信トラブルのデバッグに不可欠なオプションです。
    bash
    # Googleとの通信に関する詳細情報を表示
    curl -v https://www.google.com

    出力例は非常に詳細になります(例: ホスト名の解決、TCP接続、SSLハンドシェイク、送信ヘッダー、受信ヘッダーなど)。デバッグ時には必ずと言っていいほど利用するオプションです。

    -s-v は同時に指定すると -s が優先されるため、通常は片方のみを使用します。デバッグ時には -v を、スクリプトでは -s を使うのが一般的です。

4.4 リダイレクトを追跡する: -L

WebサイトやAPIは、リクエストされたURLから別のURLへリダイレクト(転送)することがよくあります (例: HTTPからHTTPSへ、末尾のスラッシュの有無、短縮URLなど)。デフォルトでは、curlは最初の応答がリダイレクト(ステータスコード3xx)だった場合、その場所情報(Locationヘッダー)を表示して終了します。

  • -L, --location: レスポンスがリダイレクトだった場合に、Locationヘッダーで示された新しいURLに自動的にリクエストを送信し、リダイレクト先を追跡します。
    bash
    # http://google.com にアクセス (https://www.google.com にリダイレクトされる)
    curl -L http://google.com

    -L オプションがない場合、http://google.comhttps://www.google.com へのリダイレクトを示す応答を返し、curlはそこで停止します。-L を使うと、自動的に https://www.google.com へ再リクエストを行い、最終的なコンテンツを取得します。最大リダイレクト回数はデフォルトで50回です。

4.5 認証情報を指定する: -u

特定のWebサイトやAPIには、アクセスするために認証情報(ユーザー名とパスワード)が必要な場合があります。

  • -u, --user <user:password>: Basic認証やDigest認証で使用するユーザー名とパスワードを指定します。
    bash
    # Basic認証が必要なページにアクセス
    curl -u "myuser:mypassword" https://example.com/protected

    パスワードをコマンドラインに直接記述するのはセキュリティリスクがあるため、パスワードを省略して myuser: のように指定すると、curlが実行時にパスワード入力を促します。

    より高度な認証(APIキーやトークンを使用するOAuthなど)の場合は、-H オプションを使ってAuthorizationヘッダーなどに情報を追加することが一般的です(後述)。

4.6 User-Agentを指定する: -A

Webサーバーは、クライアントが誰であるか(どのブラウザか、どのツールかなど)を識別するために、User-Agentヘッダーを参照することがあります。デフォルトでは、curlはそのバージョン情報を含むUser-Agentを送信します(例: curl/7.x.x)。これを変更したい場合に使います。

  • -A, --user-agent <string>: 送信するUser-Agentヘッダーの値を指定します。
    bash
    # Chromeブラウザを装ってGoogleにアクセス
    curl -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.88 Safari/537.36" https://www.google.com

    特定のWebサイトが特定のUser-Agentからのアクセスを制限している場合や、モバイルサイトの表示を確認したい場合などに利用します。

4.7 カスタムヘッダーを追加・変更する: -H

デフォルトで送信されるヘッダー以外に、独自のヘッダーを追加したり、デフォルトのヘッダー(例: User-Agent, Referer, Acceptなど)の値を変更したりする場合に使います。APIアクセスでは、認証情報やコンテンツタイプを指定するために非常によく利用されます。

  • -H, --header <header name: value>: 指定したヘッダーを追加または変更します。複数指定可能です。
    “`bash
    # Acceptヘッダーを指定してJSON形式のレスポンスを要求
    curl -H “Accept: application/json” https://example.com/api/data

    APIキーをヘッダーに含めてGoogle Books APIにアクセス (例)

    (実際のキーやエンドポイントはAPIドキュメントを確認してください)

    curl -H “Authorization: Bearer YOUR_API_KEY” “https://www.googleapis.com/books/v1/volumes?q=isbn:0747532699”
    ``
    ヘッダーを削除したい場合は、ヘッダー名の後にセミコロンのみを付けます (
    -H “Header-To-Remove:”`)。

4.8 HTTPメソッドを指定する: -X

デフォルトではGETリクエストが送信されますが、POST, PUT, DELETEなどのメソッドを使いたい場合は -X オプションを使用します。

  • -X, --request <command>: 使用するHTTPメソッドを指定します。
    “`bash
    # DELETEリクエストを送信
    curl -X DELETE https://example.com/api/resource/123

    OPTIONSリクエストを送信

    curl -X OPTIONS https://example.com
    ``
    POSTリクエストの場合は、
    -X POSTを指定することもできますが、通常は-d-Fオプション(後述)でデータを送信すると、自動的にPOSTメソッドが選択されるため、-X POSTは省略されることが多いです。しかし、データなしでPOSTリクエストを送りたい場合は-X POST` が必要です。

4.9 POSTデータを送信する: -d, --data-urlencode, -F

Webフォームの送信やAPIへのデータ送信(特にPOSTやPUTメソッド)には、リクエストボディにデータを含める必要があります。curlでは主に -d-F オプションを使います。

  • -d, --data <data>: 指定したデータを application/x-www-form-urlencoded 形式でリクエストボディに含めて送信します。このオプションを使うと、自動的にHTTPメソッドがPOSTになります(-X で上書きしない限り)。データはURLエンコードされます。
    “`bash
    # ウェブフォームのようにデータを送信 (キー1=値1&キー2=値2 形式)
    curl -d “name=taro&age=30” https://example.com/submit

    JSONデータを送信する場合

    -H で Content-Type を application/json に指定する必要がある

    curl -X POST -H “Content-Type: application/json” -d ‘{“key”: “value”, “number”: 123}’ https://example.com/api/resource

    JSONデータをファイルから読み込む場合は @ を使う

    curl -X POST -H “Content-Type: application/json” -d @data.json https://example.com/api/resource

    ``-dオプションを複数指定した場合、それらのデータは&` で連結されます。

  • --data-urlencode <data>: -d と似ていますが、データが =& を含む場合に特に便利です。指定したデータを自動的にURLエンコードして送信します。name=value または name@file 形式で指定できます。
    bash
    # 値にスペースを含むデータを安全に送信
    curl --data-urlencode "message=Hello World!" https://example.com/send

  • -F, --form <name=content>: multipart/form-data 形式でデータを送信します。Webサイトのファイルアップロードフォームなどで使用される形式です。
    bash
    # テキストフィールドとファイルを同時に送信
    curl -F "username=john" -F "profile=@path/to/profile.jpg" https://example.com/upload
    # @ を使うとファイルの内容を送信します。ファイル名の前に ;filename= を付けると、サーバーに通知するファイル名を指定できます。
    # curl -F "profile=@path/to/profile.jpg;filename=my_profile.jpg" https://example.com/upload

    -F オプションも複数指定可能です。ファイルの内容だけでなく、単なるテキストデータも送信できます。

4.10 SSL証明書の検証を無効化する: -k

HTTPS通信では、接続先のサーバー証明書が正当な認証局によって署名されているかなどの検証が行われます。検証に失敗した場合、通常curlはエラーで終了します。

  • -k, --insecure: SSL/TLS証明書の検証を無効化します。セキュリティリスクがあるため、信頼できないサイトや本番環境での使用は避けるべきです。 自己署名証明書を使っている内部サーバーへのアクセスや、検証エラーの原因究明など、デバッグやテスト目的でのみ使用してください。
    bash
    # 自己署名証明書を使っているテストサーバーにアクセス (非推奨)
    curl -k https://test.local/

4.11 タイムアウトを設定する: -m

ネットワークの遅延やサーバー応答がない場合に、curlがいつまで待機するかを指定できます。

  • -m, --max-time <seconds>: 接続からデータ転送完了までの最大許容時間を秒単位で指定します。
    bash
    # 最大10秒待機
    curl -m 10 https://example.com

    指定した時間を超えると、curlはエラーコード28(Operation timed out)で終了します。

4.12 リトライ設定: --retry

一時的なネットワーク問題などでリクエストが失敗した場合に、自動的に再試行させることができます。

  • --retry <num>: 失敗した場合にリクエストを再試行する回数を指定します。デフォルトでは、一時的なエラー(例: ネットワーク接続不可)に対してのみリトライします。
    bash
    # 最大3回までリトライする
    curl --retry 3 https://example.com

    --retry-delay <seconds> でリトライ間の待機時間を指定したり、--retry-max-time <seconds> でリトライ全体での最大許容時間を指定したりすることも可能です。

4.13 圧縮されたレスポンスを自動解凍: --compressed

サーバーがレスポンスをgzipや deflate で圧縮して送ってくる場合(Content-Encodingヘッダーで示されます)、通常curlは圧縮されたバイト列をそのまま出力します。

  • --compressed: サーバーが圧縮されたレスポンスを返した場合に、自動的に解凍して表示・保存します。curlがAccept-Encodingヘッダー(gzip, deflate, brなど)を送信するようになります。
    bash
    # 圧縮されたレスポンスを自動解凍して取得
    curl --compressed https://www.google.com

    多くのWebサイトは圧縮に対応しており、このオプションを使うことで転送量を減らすことができます。

4.14 特定のIPバージョンを指定する: --ipv4, --ipv6

サーバーがIPv4とIPv6の両方に対応している場合に、どちらのアドレスファミリーを使用するかを指定できます。

  • --ipv4: IPv4アドレスにのみ接続を試みます。
  • --ipv6: IPv6アドレスにのみ接続を試みます。
    bash
    # GoogleのIPv4アドレスにのみ接続を試みる
    curl --ipv4 https://www.google.com

    ネットワーク環境によっては、片方のプロトコルでのみ接続できる場合などがあります。

5. HTTPメソッドとデータの送信をさらに詳しく

HTTPメソッドは、リソースに対してどのような操作を行いたいかをサーバーに伝えるためのものです。RESTful APIでは、リソースの取得(GET)、作成(POST)、更新(PUT/PATCH)、削除(DELETE)などに使い分けられます。

5.1 GETリクエストとクエリパラメータ

GETリクエストは、サーバーからデータを取得するために使用されます。データはURLの末尾に ? に続いて key1=value1&key2=value2 の形式で付加されるクエリパラメータとして送信されます。

“`bash

Google Public DNS (DoH) に example.com のAレコードを問い合わせる例

GETリクエストで、クエリパラメータとして name=example.com, type=A を指定

curl “https://dns.google/resolve?name=example.com&type=A”
``
この例では、Google Public DNS APIに対してGETリクエストを送信し、
nametype` というクエリパラメータで問い合わせ内容を指定しています。APIは通常JSON形式のレスポンスを返します。

5.2 POSTリクエストとリクエストボディ

POSTリクエストは、新しいリソースを作成したり、サーバーにデータを送信したりするために使用されます。データはURLではなく、リクエストのボディ(本文)に含めて送信します。データの形式は、Content-Typeヘッダーで指定します。

前述の -d-F オプションを使うと、自動的にPOSTメソッドになります。

application/x-www-form-urlencoded 形式:
最も伝統的なWebフォームの送信形式です。キーと値のペアが & で連結され、URLエンコードされます。
bash
curl -d "username=testuser&password=testpass" https://example.com/login

application/json 形式:
APIとの連携で最も広く使われている形式です。リクエストボディにJSON文字列を含めます。-H "Content-Type: application/json" ヘッダーを必ず指定します。
“`bash

JSONデータを直接指定

curl -X POST -H “Content-Type: application/json” -d ‘{“title”: “New Item”, “body”: “This is a new item.”}’ https://example.com/api/items

JSONデータをファイルから読み込む

data.json というファイルに {“title”: “New Item”, “body”: “This is a new item.”} と記述

curl -X POST -H “Content-Type: application/json” -d @data.json https://example.com/api/items
``-d @<ファイル名>` とすることで、ファイルの内容をリクエストボディとして送信できます。

multipart/form-data 形式:
ファイルアップロードを含むフォーム送信に使用されます。各フィールドやファイルが異なるパートとしてボディに含まれます。-F オプションを使用します。
“`bash

ファイルアップロードと追加データを同時にPOST

curl -F “image=@/path/to/photo.png” -F “caption=My latest pic” https://example.com/upload
“`

5.3 その他のHTTPメソッド (PUT, DELETE, PATCHなど)

  • PUT: リソースを更新または作成するために使用されます。指定したURLのリソース全体を、リクエストボディの内容で置き換えるという意味合いが強いです。-X PUT-d または -T (ファイルをボディとして送信) を組み合わせて使います。
    bash
    # リソースID 123 の内容を更新
    curl -X PUT -H "Content-Type: application/json" -d '{"title": "Updated Title"}' https://example.com/api/items/123
  • DELETE: 指定したURLのリソースを削除するために使用されます。リクエストボディは通常含みません。-X DELETE を使います。
    bash
    # リソースID 123 を削除
    curl -X DELETE https://example.com/api/items/123
  • PATCH: リソースの特定の一部のみを更新するために使用されます。PUTとは異なり、リソース全体ではなく差分を適用します。-X PATCH-d を組み合わせて使います。
    bash
    # リソースID 123 のタイトルのみを更新
    curl -X PATCH -H "Content-Type: application/json" -d '{"title": "Patched Title"}' https://example.com/api/items/123

これらのメソッドを適切に使い分けることで、RESTfulなAPIと効果的に連携できます。

6. クッキー (Cookies) の扱い

HTTP通信において、クッキーはセッション管理やユーザー識別に使われます。curlはクッキーの送受信を制御できます。

  • -c, --cookie-jar <file>: サーバーから受信したクッキーを指定したファイルに保存します。次回のアクセスでこのファイルを使うことができます。
    bash
    # クッキーを cookies.txt に保存しながらログインページにアクセス
    curl -c cookies.txt https://example.com/login

  • -b, --cookie <data>: リクエストを送信する際に、指定したクッキーデータを含めます。<data> には、-c で保存したファイル名を指定するか、name1=value1; name2=value2 の形式でクッキー文字列を直接指定します。
    “`bash
    # 保存したクッキーファイルを使って、ログイン後のページにアクセス
    curl -b cookies.txt https://example.com/profile

    クッキー文字列を直接指定してアクセス

    curl -b “sessionid=abcdef123456” https://example.com/private
    “`

クッキーを使うことで、ログインが必要なページにアクセスしたり、Webサイトがセッション情報を使って提供するサービスを利用したりすることが可能になります。-b-c を組み合わせることで、ログインしてセッションを維持したまま複数ページを巡回するようなシナリオもスクリプトで実現できます。

7. プロキシ (Proxy) の設定

ネットワーク環境によっては、インターネットへのアクセスにプロキシサーバーを経由する必要がある場合があります。

  • -x, --proxy <[protocol://]host[:port]>: 指定したプロキシサーバーを経由して通信を行います。プロトコルを省略した場合、HTTPプロキシとみなされます。
    “`bash
    # HTTPプロキシ経由でアクセス
    curl -x http://proxy.example.com:8080 https://www.google.com

    SOCKS5プロキシ経由でアクセス

    curl -x socks5://proxy.example.com:1080 https://www.google.com
    ``
    認証が必要なプロキシの場合は、プロキシ情報の前にユーザー名とパスワードを含めるか (
    -x http://user:[email protected]:8080)、–proxy-user ` オプションを使用します。

8. ファイル転送プロトコルの利用

curlはその名の通り、URLを使ったデータ転送ツールであり、HTTP/HTTPS以外の様々なプロトコルにも対応しています。

  • FTP: ファイルのダウンロードやアップロードに利用できます。
    “`bash
    # FTPサーバーからファイルをダウンロード
    curl ftp://ftp.example.com/pub/file.txt -u “anonymous:password” -o file.txt

    FTPサーバーにファイルをアップロード

    curl -T /path/to/local/file.txt ftp://ftp.example.com/incoming/ -u “myuser:mypassword”
    * **SFTP/SCP:** SSHプロトコルを利用した安全なファイル転送です。bash

    SFTPサーバーからファイルをダウンロード

    curl sftp://[email protected]/remote/path/to/file.txt -o file.txt

    SCPサーバーにファイルをアップロード

    curl -T /path/to/local/file.txt scp://[email protected]/remote/destination/
    ``
    これらのプロトコルを使用する場合も、
    -uオプションでユーザー名とパスワードを指定したり、ファイル保存に-o-O、ファイルアップロードに-T` オプションを使用したりと、HTTPの場合と類似したオプションが利用できます。

9. 高度なトピックと応用例

9.1 認証の種類とcurlでの扱い

HTTP認証にはいくつかの種類があり、curlはそれらの多くをサポートしています。

  • Basic認証: 最もシンプルですが、認証情報がBase64エンコードされて送信されるため盗聴に弱いです。HTTPSと組み合わせて使うのが一般的です。-u <user:password> で指定します。
  • Digest認証: パスワードを直接送信せず、チャレンジ/レスポンス方式で認証を行います。Basic認証より安全ですが、Basic認証ほど広く使われていません。-u オプションはBasic認証とDigest認証の両方に対応しており、サーバーがDigest認証を要求すればcurlは自動的にDigest認証を試みます。
  • OAuth / APIキーなど: 多くのモダンなAPIでは、Basic/Digest認証ではなく、事前に発行されたAPIキーやアクセストークンを認証に使います。これらは通常、リクエストヘッダー(例: Authorization: Bearer <token> や、X-API-Key: <key>)やクエリパラメータとして送信されます。これは -H オプションやURLに直接記述することで対応します。
    “`bash
    # アクセストークンをBearerスキームで送信
    curl -H “Authorization: Bearer your_access_token” https://api.example.com/resource

    APIキーをクエリパラメータで送信

    curl “https://api.example.com/resource?apiKey=your_api_key”
    “`

9.2 SSL/TLSと証明書

HTTPS通信の安全性はSSL/TLSプロトコルと証明書によって保証されます。curlはデフォルトでSSL証明書の検証を行います。

  • 証明書検証の流れ (簡易):

    1. curlはサーバーに接続し、サーバー証明書を受け取ります。
    2. curlは受け取ったサーバー証明書が、信頼できる認証局(CA)によって署名されているかを確認します。この検証には、システムにインストールされているCA証明書バンドルを使用します。
    3. 署名が有効であり、証明書のホスト名がアクセス先のホスト名と一致する場合、検証は成功し、安全な通信路が確立されます。
    4. 検証に失敗した場合(例: 自己署名証明書、有効期限切れ、ホスト名不一致)、curlはエラーで終了します。
  • 関連オプション:

    • -k, --insecure: 証明書検証を完全に無効化します(非推奨)。
    • --cacert <file>: システム標準のCA証明書バンドルではなく、指定したCA証明書ファイルを使用して検証を行います。
    • --cert <file>--key <file>: クライアント証明書認証を行う場合に、クライアント証明書ファイルと秘密鍵ファイルを指定します。
      bash
      # 特定のCA証明書を使って検証
      curl --cacert /path/to/my-ca.crt https://internal-service/

9.3 パフォーマンスとデバッグ情報

-v オプションは通信の詳細なログを表示しますが、転送速度や接続時間など、より定量的なパフォーマンス情報を取得したい場合があります。

  • --write-out <format>: リクエスト完了後に、指定したフォーマット文字列に従って様々な情報を標準出力に表示します。-s オプションと組み合わせて使うことが多いです。
    “`bash
    # HTTPステータスコードとリクエストにかかった時間を表示
    curl -s -o /dev/null -w “%{http_code} %{time_total}\n” https://www.google.com
    # 出力例: 200 0.567

    より詳細なタイミング情報を表示

    curl -s -o /dev/null -w ”
    namelookup: %{time_namelookup}\n
    connect: %{time_connect}\n
    appconnect: %{time_appconnect}\n
    pretransfer: %{time_pretransfer}\n
    redirect: %{time_redirect}\n
    starttransfer: %{time_starttransfer}\n
    total: %{time_total}\n
    size download: %{size_download}\n” https://www.google.com
    ``
    フォーマット文字列には、
    %{url_effective}(最終的にアクセスしたURL),%{http_code}(HTTPステータスコード),%{size_download}(ダウンロードされたバイト数),%{time_total}(合計時間),%{speed_download}(ダウンロード速度) など、多数の変数が利用可能です。詳細はman curl–write-out` セクションを参照してください。

9.4 スクリプトでの利用とエラーハンドリング

curlはシェルスクリプトなどでの自動化によく使われます。スクリプト内でcurlを使う際には、成功・失敗を判断し、エラーハンドリングを行うことが重要です。

curlコマンドの終了ステータスは、成功時に 0 を返します。ネットワークエラーやcurl自体の問題が発生した場合、ゼロ以外の終了ステータスを返します。ただし、HTTPレベルのエラー(例: 404 Not Found, 500 Internal Server Error)が発生した場合でも、通信自体は成功しているため、デフォルトでは終了ステータスは 0 になります。HTTPエラーを検知したい場合は、-f オプションや --write-out を使用します。

  • -f, --fail: サーバーが200番台以外のステータスコード(エラーを示すもの)を返した場合に、サイレントにエラーとして終了します。レスポンスボディは出力されません。
    “`bash
    # 存在しないページにアクセスし、エラーコード 22 で終了させる
    curl -f https://www.google.com/non-existent-page

    スクリプトでの利用例

    !/bin/bash

    response=$(curl -s -f “https://dns.google/resolve?name=example.com”)

    if [ $? -ne 0 ]; then
    echo “Error fetching data.”
    exit 1
    fi

    レスポンスを処理 (例: jq コマンドでJSONをパース)

    jq コマンドがインストールされている前提

    if command -v jq &> /dev/null
    then
    answer=$(echo “$response” | jq -r ‘.Answer[0].data’)
    echo “IP Address: $answer”
    else
    echo “jq command not found. Cannot parse JSON.”
    echo “Raw response: $response”
    fi
    ``
    このスクリプト例では、
    -s -fオプションを使ってcurlを実行し、終了ステータス$?を確認しています。$?が非ゼロならcurl自体に問題があったと判断し、そうでなければ取得したresponse変数の内容(JSON形式)をjq` コマンドでパースしてIPアドレスを抽出しています。

9.5 Googleとの連携例(規約に配慮した例)

本記事のテーマに沿って、curlを使ってGoogleのサービスと連携する具体的な例をいくつか紹介します。ただし、Googleの各種サービスには利用規約やAPIごとの制限があるため、実際の利用にあたってはそれぞれの公式ドキュメントを確認し、規約を遵守してください。無許可のスクレイピングや過剰なアクセスは禁止されています。

例1: Google Public DNS (DoH) への問い合わせ
これは公開されており、curlで手軽に試せる良い例です。GETリクエストでクエリパラメータを使い、JSON形式のレスポンスを受け取ります。
“`bash

google.com の A レコード (IPv4 アドレス) を問い合わせ

curl “https://dns.google/resolve?name=google.com&type=A”

出力例 (JSON形式):

{

“Status”: 0,

“TC”: false,

“Answer”: [

{

“name”: “google.com.”,

“type”: 1,

“TTL”: 300,

“data”: “142.250.199.142”

},

]

}

``
このJSONレスポンスから、
jq` などを使ってデータを抽出できます。

例2: Google Static Maps API で地図画像を取得
これは無料枠があり、APIキーなしでも簡単な利用が可能です。GETリクエストとクエリパラメータ、ファイル保存 (-o) の例になります。
“`bash

東京駅周辺の地図画像を取得し、tokyo_map.png という名前で保存

keyパラメータは省略可能ですが、実際のアプリケーションでは推奨されます。

curl “https://maps.googleapis.com/maps/api/staticmap?center=Tokyo Station&zoom=14&size=600×300&maptype=roadmap” -o tokyo_map.png
``
これにより、
tokyo_map.png` という画像ファイルが現在のディレクトリに保存されます。

例3: Google Fonts の CSS ファイルを取得
これも公開されているリソースです。特定のフォントのCSSファイルをGETリクエストで取得します。
“`bash

RobotoフォントのCSSを取得

curl “https://fonts.googleapis.com/css2?family=Roboto&display=swap”

出力例 (CSS):

@font-face {

font-family: ‘Roboto’;

font-style: normal;

font-weight: 400;

src: url(https://fonts.gstatic.com/s/roboto/v30/KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2) format(‘woff2’);

unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;

}

“`
取得したCSSをファイルに保存して、ローカルでの開発に利用することも可能です。

例4: Google Search API (Custom Search APIなど) 利用の一般的な流れ
Googleの検索結果などをプログラムから取得したい場合は、Custom Search APIのような公式APIを利用するのが正しい方法です。curlでのアクセスは以下のようになります。

  1. Google Cloud Platformでプロジェクトを作成し、Custom Search APIを有効化します。
  2. APIキーを発行します。
  3. Custom Search Engineを作成し、検索対象のサイトなどを設定します。エンジンのID(cx)を取得します。
  4. curlでAPIエンドポイントにGETリクエストを送信します。この際、APIキーとエンジンID、検索クエリなどをクエリパラメータとして含めます。

“`bash

Custom Search API で「curl」を検索する例 (APIキーとcxはダミー)

実際の利用には、発行したAPIキーとご自身のエンジンのcxを指定してください。

curl “https://www.googleapis.com/customsearch/v1?key=YOUR_API_KEY&cx=YOUR_ENGINE_ID&q=curl”
``
レスポンスはJSON形式で返されるため、これをプログラムでパースして利用します。認証が必要なAPIの場合、
-HオプションでAuthorization` ヘッダーなどを追加することもあります。繰り返しますが、Googleの各種APIの利用にあたっては、必ず公式ドキュメントを参照し、利用制限や課金について確認してください。

10. トラブルシューティング

curlコマンドの実行中にエラーが発生することはよくあります。ここでは、一般的なエラーメッセージとその原因、解決策を解説します。-v オプションはデバッグの強い味方となります。

curlのエラーは数値コードで示されます (man curlEXIT CODES セクションを参照)。よく見るエラーコードをいくつか挙げます。

  • エラーコード 6: Could not resolve host

    • 原因: 指定したホスト名(例: www.example.com)をIPアドレスに解決できませんでした。DNSの名前解決に失敗しています。
    • 解決策:
      • ホスト名が正しいか確認します。
      • ネットワーク接続が正常か確認します。
      • DNSサーバーの設定が正しいか確認します(ping コマンドや nslookup/dig コマンドで名前解決できるか試します)。
      • ファイアウォールがDNS通信をブロックしていないか確認します。
  • エラーコード 7: Failed to connect to host

    • 原因: 指定したIPアドレスのホストに接続できませんでした。ネットワークレベルでの接続失敗です。
    • 解決策:
      • 指定したホスト名やIPアドレス、ポート番号が正しいか確認します。
      • サーバーが起動していて、指定したポートでリクエストを受け付けているか確認します(ping コマンドで到達可能か、telnet コマンドでポートが開いているかなどを試します)。
      • クライアント側またはサーバー側のファイアウォールが接続をブロックしていないか確認します。
      • ネットワーク経路に問題がないか確認します。
  • エラーコード 22: The requested URL returned error: XXX

    • 原因: リクエストは正常にサーバーに到達しましたが、サーバーが200番台以外のHTTPステータスコード(例: 401 Unauthorized, 403 Forbidden, 404 Not Found, 500 Internal Server Error)を返しました。通常、-f オプションを付けていない場合はこのエラーは表示されず、レスポンスボディがそのまま表示されます。-f を付けるとこのエラーコードで終了します。
    • 解決策:
      • -i オプションまたは -v オプションを付けて実行し、返されたHTTPステータスコードやヘッダー、レスポンスボディを確認します。
      • URLが正しいか、リソースが存在するか確認します(404)。
      • 認証情報が正しいか、アクセス権限があるか確認します(401, 403)。
      • リクエストボディの形式や内容が正しいか確認します(400 Bad Requestなど)。
      • サーバー側のエラーログを確認します(500 Internal Server Errorなど)。
  • エラーコード 28: Operation timed out

    • 原因: 接続やデータ転送に指定された時間(デフォルトまたは -m オプションで指定した時間)を超過しました。ネットワーク遅延やサーバーの無応答などが考えられます。
    • 解決策:
      • ネットワーク接続が安定しているか確認します。
      • サーバーの負荷が高くないか確認します。
      • -m オプションでタイムアウト時間を長く設定して試します(根本的な解決にはなりませんが)。
      • -v オプションで通信のどの段階でタイムアウトしたかを確認します。
  • エラーコード 35: SSL connect error

    • 原因: SSL/TLSハンドシェイクに失敗しました。証明書の問題、SSL/TLSバージョンの不一致、暗号スイートの問題などが考えられます。
    • 解決策:
      • サーバー証明書が有効で正当なものか確認します。自己署名証明書の場合は -k オプションが必要かもしれません(セキュリティリスクに注意)。
      • クライアント側とサーバー側でサポートされているSSL/TLSバージョンや暗号スイートに互換性があるか確認します。
      • クライアントのシステム時計が正確か確認します(証明書の有効期間チェックに影響します)。
      • ファイアウォールがSSL通信をブロックしていないか確認します。
      • -v オプションでハンドシェイクの詳細を確認します。

デバッグの強力な味方:-v オプション
トラブルが発生したら、まずは -v オプションを付けて実行してみてください。curlがどのような手順でサーバーと通信しようとしているのか、どのようなリクエストを送り、どのような応答を受け取っているのかが詳細に表示されます。これにより、問題がネットワークレベルにあるのか、SSL/TLSレベルにあるのか、HTTPプロトコルレベルにあるのかなどを切り分けるのに役立ちます。

11. まとめ

本記事では、curlコマンドの基本的な使い方から始め、HTTP/HTTPSプロトコルを使ったWeb通信(特にGoogleとの連携を例に)、主要なオプションの詳細な解説、HTTPメソッドとデータの送信、クッキー、プロキシ、ファイル転送、認証、SSL/TLS、パフォーマンス測定、スクリプトでの利用、そしてトラブルシューティングまで、幅広くかつ詳細に解説しました。

curlは非常に多機能で強力なツールであり、Web開発やシステム管理、自動化など、様々な場面で活用できます。コマンドラインから直接Webサービスと対話できる能力は、特にAPIのテストやデバッグにおいて絶大な効果を発揮します。

この記事で紹介した内容は、curlが持つ機能のほんの一部に過ぎません。しかし、ここで学んだ基本的な使い方と主要なオプションを組み合わせるだけでも、ほとんどのWeb通信タスクをこなすことができるはずです。

curlのさらなる機能や詳細については、公式のマニュアルページ (man curl) や公式サイト (https://curl.se/) を参照してください。特に man curl は利用可能な全てのオプションとその詳細な説明が記載されている、最も信頼できる情報源です。

Web通信の世界を探求するあなたの旅において、curlが強力な相棒となることを願っています。この入門記事が、あなたがcurlを使いこなし、Webをより深く理解するための一助となれば幸いです。

12. 付録:よく使うオプション一覧(チートシート)

“`
基本的な使い方:
curl # HTTP GETリクエストを送信し、ボディを標準出力に表示
curl -I # HEADリクエストを送信し、ヘッダーのみを表示
curl -i # GETリクエストで、ヘッダーとボディ両方を表示

ファイル保存:
curl -o # レスポンスボディを指定したファイル名で保存
curl -O # レスポンスボディをURLのファイル名で保存

表示制御:
curl -s # 進捗表示などを抑制 (サイレントモード)
curl -v # 詳細な通信情報を表示 (冗長モード)

リダイレクト追跡:
curl -L # リダイレクトを自動的に追跡

認証:
curl -u # Basic/Digest認証情報を指定

ヘッダー操作:
curl -A # User-Agentヘッダーを指定
curl -H “ # カスタムヘッダーを追加/変更
curl -H “Header-To-Remove:” # ヘッダーを削除

HTTPメソッド指定:
curl -X POST # HTTPメソッドを明示的に指定 (POST, PUT, DELETEなど)

POSTデータの送信:
curl -d “key1=value1&key2=value2” # x-www-form-urlencoded 形式でデータをPOST
curl -d ‘{“json”:”data”}’ -H “Content-Type: application/json” # JSONデータをPOST
curl -d @ # ファイルの内容をPOSTデータとして送信
curl -F “name=value” -F “file=@/path/to/file” # multipart/form-data 形式でデータをPOST

クッキー操作:
curl -c # 受信したクッキーを指定ファイルに保存
curl -b # 指定ファイルからクッキーを読み込んで送信
curl -b “name1=value1” # クッキー文字列を直接指定して送信

プロキシ:
curl -x http://host:port # HTTPプロキシ経由でアクセス
curl -x socks5://host:port # SOCKS5プロキシ経由でアクセス

SSL/TLS:
curl -k # SSL証明書の検証を無効化 (非推奨)
curl –cacert # 特定のCA証明書ファイルを使用

その他:
curl -m # タイムアウト時間を設定
curl –retry # リトライ回数を設定
curl –compressed # 圧縮されたレスポンスを自動解凍
curl -f # サーバーエラー(4xx/5xx)時にエラー終了

ヘルプ:
curl –help # 簡単なヘルプを表示
man curl # 詳細なマニュアルを表示 (Unix/Linux/macOS)
“`

このチートシートは、日常的なcurlの利用で頻繁に使うオプションを素早く参照するのに役立つでしょう。


これで、約5000語の詳細な「curl Googleの使い方入門」記事は完成です。


コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール