開発していると、ネットワークを一時的に少し変えたくなる瞬間がどうしてもあります。バックエンドAPIがまだできていないので、まず仮データでフロントエンドを動かしたい。あるリクエストに別のパラメータを付けたらどうなるか試したい。あるいは統計や埋め込み計測のリクエストをそのまま止めたい。これまでは、コードを変更してスイッチを追加するか、mock serverを立てるか、パケットキャプチャ用のプロキシを挟むか(しかもCA証明書のインストールが必要)でした。どれも極端に重いわけではありませんが、どれも追加の準備が必要です。
chrome-useの network route は、この作業をブラウザ本体の中に収めます。あなたが操作しているそのChrome上で、マッチしたリクエストを直接インターセプトし、レスポンスをmockする、送信されるリクエストを変更する、またはそのままブロックできます。プロキシも証明書も、検証対象コードの変更も不要です。

4つの使い方
1つの network route コマンドが、渡したパラメータに応じて動作を決めます。
# 1) Mockレスポンス: リクエストは外へ送られず、指定した仮データを直接返す
chrome-use network route "*/api/me" --body '{"vip":true}' --status 200 --content-type application/json
# 2) リクエスト変更: リクエストは送るが、メソッド/ヘッダー/ボディ/URLを変更し、実レスポンスは通常どおり返る
chrome-use network route "*/api/save" --method POST --set-header Authorization="Bearer test"
chrome-use network route "*/v1/*" --rewrite-url https://staging.example.com/v1/thing
# 3) 実レスポンス変更: リクエストは送信し、実レスポンス取得後にステータス/ヘッダー/ボディを変更する
chrome-use network route "*/api/me" --edit-status 503 --edit-header X-Env=test --replace 'prod=>staging'
# 4) ブロック: 直接止める(埋め込み計測の遮断、オフラインテスト)
chrome-use network route "*/analytics" --abort
区別はとても簡単です。mock用フィールド(--body / --status / --header / --content-type)があればレスポンスを偽造し、リクエストは短絡されて外へ出ません。リクエスト用フィールド(--method / --set-body / --set-header / --rewrite-url)があれば、変更してから通過させ、実際のレスポンスを受け取ります。編集用フィールド(--edit-status / --edit-header / --replace 'from=>to')があれば、まず通過させ、実レスポンスが戻ってきてからそれを変更します。mockと「実レスポンス変更」の違いはここにあります。前者はまったく外へ出ず、データを自分で作ります。後者は実レスポンスが返ってくる必要があり、その一部だけを変更します。これらのヘッダー関連パラメータはいずれも複数回指定でき、既存ヘッダーにマージして上書きします。
名前は意図的にPlaywrightの route / fulfill / continue / abort に合わせています。使ったことがある人なら学び直す必要はありません。
原理: すでに話しているプロトコル
この仕組みの内部はChrome DevTools ProtocolのFetchドメインです。Fetch.enable でマッチルールを設定し、ヒットしたリクエストは Fetch.requestPaused で停止します。その後、状況に応じて fulfillRequest(仮レスポンスを返す)、continueRequest(上書きパラメータつきで通過させる)、または failRequest(ブロック)を呼びます。これは新しく作った仕組みではありません。DevToolsの「Local Overrides」やPlaywrightのrouteも、Chromeに対するインターセプトの内部では、同じFetchドメインを包んでいます。

chrome-useにとって、重要な点は2つあります。
1つ目は、もともとCDPを話していることです。chrome-useは独自のネイティブCDPクライアントでブラウザを操作しており、fulfillRequest / continueRequest などのコマンドはすでにコード内にあります(ドメインフィルタやプロキシ認証でも使っています)。mockやリクエスト変更の追加は、既存の実行能力をコマンドラインから出しただけに近く、ゼロから別の仕組みを書いたわけではありません。
2つ目は、ブラウザ拡張機能の権限に触れないことです。chrome-useが実際のChromeにつながるときは、拡張機能の chrome.debugger 経路を使います。リクエストのインターセプトは、この経路でCDPコマンドをいくつか追加で送るだけです。拡張機能のmanifestは1文字も変える必要がなく、webRequest も不要で、declarativeNetRequest も不要です。そしてこの2つは、まさにChromeウェブストアが重点的に審査する権限です。つまり、この機能は新しい権限を一切導入せず、拡張機能の審査通過に悪影響を与えるリスクもありません。
ついでに、なぜ既存のmockツールをそのまま統合しなかったのかも説明します。いくつか調査しました。mockttpはプロセス内のNodeプロキシで、自己署名CAが必要です。mitmproxyは独立したPython MITMプロキシで、こちらも証明書のインストールが必要です。MSWはページにService Workerを注入するため、この道はchrome-useの「JS注入ゼロ」というステルス原則に直接反します。これらは重いか、プロキシと証明書が必要か、ステルス性を壊すかのどれかです。そしてChromeに対するインターセプトでは、内部でやはりCDP Fetchを包んでいます。すでにこのプロトコルを話しているなら、表面を補うのが最も軽い道です。
実機で一度動かす
httpbin.org(リクエストをそのままエコーバックしてくれる)を使って、2つの主な経路を検証します。まず隔離したブラウザを起動します。
Mockレスポンス: /get に仮データを設定し、その後ページ内からfetchします。
chrome-use --launch --session demo network route "*/get" \
--body '{"mocked":true,"by":"chrome-use"}' --status 200 --content-type application/json
chrome-use --session demo open https://httpbin.org/
# ページ内: fetch('/get') → {"mocked":true,"by":"chrome-use"}
返ってくるのは設定した仮データであり、httpbinの実際の /get レスポンスではありません。リクエストはまったく外へ出ていません。
リクエスト変更: /headers にカスタムヘッダーを追加し、もう一度fetchします(httpbinは受け取ったリクエストヘッダーをエコーバックします)。
chrome-use --session demo network route "*/headers" --set-header X-Chrome-Use=hello123
# ページ内: fetch('/headers') → エコーされたheaders内に "X-Chrome-Use": "hello123" が現れる
httpbinがエコーバックしたリクエストヘッダーに X-Chrome-Use: hello123 が含まれているため、このヘッダーがリクエストの実際の送信前に追加されたことがわかります。
実レスポンス変更は example.com で検証します。リクエストは通常どおり送信し、実際のページを取得した後、レスポンスボディ内の文字列を置換し、ステータスコードを599に変更し、レスポンスヘッダーを追加します。
chrome-use --launch --session demo network route "*example.com/" \
--edit-status 599 --edit-header X-Edited=yes --replace 'Example=>EDITED' --resource-type xhr,fetch
chrome-use --session demo open https://example.com/
# ページ内で fetch('/') → {status:599, xedited:"yes", bodyEdited:true}
取得できるのは、実レスポンスを変更したバージョンです。ステータスコードは599になり、X-Edited ヘッダーが追加され、ボディ内の Example は EDITED に置き換わっています。ここでは --resource-type xhr,fetch を使い、編集対象をAPIリクエストに限定し、トップレベルドキュメントのナビゲーションには触れないようにしています(ナビゲーションドキュメントのステータスコードをエラーコードに変えると、ページ読み込みの意味が乱れるためです)。
現在の境界
実レスポンス変更は、現時点では「レスポンスボディ全体を取得し、文字列置換 + ステータス/ヘッダーの上書き」をするものです。日常的にフィールドを変えたり、エラー状態を作ったりするには十分です。より細かい構造化書き換え(たとえばJSONのあるフィールドだけを変えるなど)は、今は文字列置換で対応します。今後、需要を見て考えます。また、もともとHARは記録できるので、次のステップとして、記録したHARエントリをそのままmock fixtureとして使えるようにする予定です。一度記録し、再生時に少し変更すればよい、という形です。
2つのリポジトリがあります。chrome-useは github.com/leeguooooo/chrome-use にあります。完全なコマンドは chrome-use skills get core でローカルに取得して確認できます。

微信
支付宝
コメント
コメントは即時公開されますが、ポリシー違反時は非表示になる場合があります。