Pack Camo

curlコマンド変換ツール

curlコマンドをfetch、axios、Python requests、Go、PHPなどのコードに変換。

処理はすべて端末内で完結し、アップロードは一切ありません。

curlコマンド

POST api.example.com

fetch

23行

// Browsers do not let scripts set Cookie; fetch ignores them.
const response = await fetch("https://api.example.com/v1/orders?expand=items", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    Authorization: "Bearer sk_test_4eC39HqLyjWDarjtT1zdp7dc",
    Cookie: "session=abc123; theme=dark",
  },
  body: JSON.stringify({
    "customer": "cus_42",
    "items": [
      {
        "sku": "TSHIRT-M",
        "qty": 2
      }
    ],
    "gift": false,
    "note": null
  }),
  signal: AbortSignal.timeout(30000),
});

console.log(response.status, await response.text());

curlコマンドを貼り付けるだけで動くコードに

このツールは、curlコマンドを同じHTTPリクエストを送るJavaScript fetch、axios、Node.js、Python requests、Go net/http、PHPのcurl拡張、Rust reqwestのコードに変換します。シェルやcurl自体と同じルールでcurlを解釈します。シングルクォートとダブルクォート、$'…'文字列、行継続、-sSLのような結合フラグ、繰り返しの-dデータ、multipartの-Fフィールドに対応しています。ヘッダー、Cookie、Basic認証とBearer認証、JSONボディ、タイムアウト、TLS設定も引き継ぎ、変換できないものはその旨を表示します。コマンドはブラウザ内で解析され、どこにも送信されないため、含まれるトークンやCookieが外部に漏れることはありません。

curlコマンドをコードに変換する手順

  1. 1リクエストをcurlとしてコピーします。Chrome、Edge、Firefoxで開発者ツールを開き、Networkタブでリクエストを右クリックしてCopy › Copy as cURLを選びます。bash版とWindowsのcmd版のどちらも使えます。
  2. 2左側のペインにコマンドを貼り付けます。\や^で継続した複数行のコマンドもそのまま使えます。
  3. 3変換先の言語を選びます:fetch、axios、Node.js、Python、Go、PHP、Rust、または解析したリクエストを確認するJSON。
  4. 4コードの下に表示される、無視されたフラグや注意が必要なフラグについての注記を確認し、コードをコピーするかファイルとしてダウンロードします。

変換される内容

メソッドとURL
-X/--request、--url、-G/--get(データをクエリ文字列に移動)、-I/--head、-T/--upload-file(PUT)。-Xがない場合はcurlと同じ方法でメソッドを決めます。ボディがあればPOST、なければGETです。
ヘッダー
-H/--header、-A/--user-agent、-e/--referer、-b/--cookie、-r/--range。重複したヘッダーは結合されます。
ボディ
-d/--data、--data-raw、--data-binary、--data-urlencode(curlと同様に&で連結)、--json、そして;type=や;filename=付きのファイルアップロードを含むmultipartの-F/--formフィールド。
認証
Basic認証の-u/--user、--digest、--oauth2-bearer、URLに書かれた認証情報。
接続オプション
-k/--insecure、-L/--location、--compressed、-m/--max-time、-x/--proxy(変換先の言語に同等の機能がある場合)。

JSONボディは本物のオブジェクトに

ボディがJSONの場合(Content-TypeがJSONを示しているか、内容が明らかにJSONの場合)、整形したうえで、言語が対応していればネイティブの値として書き出します。fetchではJSON.stringifyに渡すオブジェクト、axiosではプレーンなオブジェクト、Python requestsではjson=に渡す辞書になり、true、false、nullはTrue、False、Noneに変換されます。エスケープされた文字列よりずっと編集しやすくなります。ボディを1バイトも変えずに残したい場合はJSONボディを整形をオフにしてください。

ブラウザのfetchとNode.jsの違い

ブラウザはページが送信できる内容を制限しているため、2つのfetchターゲットは異なります。ブラウザ内のスクリプトはCookie、Referer、Host、Accept-EncodingやSec-で始まるヘッダーを設定できず、証明書の検証を省略することも、パスからファイルを読むこともできません。ブラウザ向けのターゲットでは、どのヘッダーが削除されるかを表示します。Node.js向けのターゲットではこれらすべてが可能です。ファイルはopenAsBlobとreadFileで読み込み、--insecureやプロキシはundiciのdispatcherになります。

リクエスト実行後にレスポンスのステータスの意味を確認するには、HTTPステータスコード一覧をご覧ください。エスケープが必要なクエリの値はURLエンコーダーでエンコードできます。

クォートのルールにも対応

変換エラーの多くはクォートが原因です。POSIXシェルでは、シングルクォートの中はすべて文字どおりに扱われ、ダブルクォートの中では\"や\$が処理され、$'…'は\nや\x41などのエスケープを解釈します。行末のバックスラッシュはコマンドの継続です。一方、Windowsのcmdではエスケープと継続に^を使い、「Copy as cURL (cmd)」はこの形式で出力します。トークナイザーはこれらのルールをすべて守るため、コードが送るボディはcurlが送るはずだったボディとまったく同じになります。

パイプ、セミコロン、リダイレクトより後ろの部分(| jq .など)はcurlではなくシェルのものなので、注記を付けて無視します。

よくある質問

curlコマンドはサーバーに送信されますか?
いいえ。コマンドの解析もコードの生成もブラウザ内で行われます。含まれるトークン、Cookie、パスワードがデバイスの外に出ることはありません。
ブラウザからリクエストをcurlとしてコピーするには?
開発者ツール(F12)を開いてNetworkタブを選び、リクエストを右クリックしてCopy、続いてCopy as cURLを選びます。Windowsでは、bash版とcmd版のどちらもここに貼り付けられます。
どのcurlオプションに対応していますか?
リクエストを定義するオプションです。メソッド、URL、ヘッダー、Cookie、すべての-dの種類、--json、-Fのフォーム、-uの認証、-G、-I、-T、-L、-k、--compressed、--max-time、--proxyに対応しています。-s、-o、-vなどの出力オプションはリクエストに影響しないため無視されます。
ブラウザ向けのfetchコードで一部のヘッダーが抜けるのはなぜですか?
ブラウザはスクリプトがCookie、Referer、Host、Accept-Encodingなどのヘッダーを設定することを禁止しており、fetchはそれらを黙って削除します。送信する必要がある場合はNode.jsターゲットを使ってください。
ファイルアップロードはどう変換されますか?
file=@photo.jpgのような-Fフィールドは、Node.js、Python、Go、PHP、Rustではディスクからphoto.jpgを読み込むmultipartのファイルフィールドになります。ブラウザのfetchでは、ページがパスでファイルを読めないため、<input type="file">で選んだファイルを使います。
--data-urlencodeは何をしますか?
送信前に値をパーセントエンコードします。そのためname=a b&cはname=a%20b%26cとして送信されます。変換ツールも同じエンコードを適用するので、生成されたコードは同じバイト列を送信します。
curlはリダイレクトをたどりますか?
-Lを指定しない限りたどりません。多くのHTTPライブラリはデフォルトでリダイレクトをたどるため、生成されたコードは通常どちらにしてもたどります。PHPのcurl拡張は-Lが指定されたときだけたどります。