Canvas のピクセルを、名乗る GPU から
GPU の文字列を変えるのは簡単ですが、その GPU が描くはずのピクセルはそうはいきません。canvas ブリッジは、canvas と WebGL の操作を、ペルソナが提示する GPU を実際に搭載したマシンに転送し、そのピクセルを返します。これにより、描画して読み出すページは、その GPU が返すはずの答えを受け取ります。
実験的なオプトイン機能です。ほとんどの構成では必要ありません。
レンダーサーバー、トンネル、オプション 1 つ
# on the machine with the real GPU (a Windows GPU for a Windows persona), next to a regular Chrome
# started with --remote-debugging-port=9222 --user-data-dir=<a separate folder>
# (Chrome ignores the port on its default profile)
pip install playwright
python tools/canvas-bridge-server/server.py \
--backend cdp \
--cdp-url ws://127.0.0.1:9222/devtools/browser/... \
--port 8443
# it prints the render GPU's renderer string: use it in step 3主なポイント
記録ではなく操作を
転送するのは描画呼び出しで、事前に記録した画像のライブラリではありません。そのため既知のプローブだけでなく、その場で生成されるほとんどの canvas に対応します。
肝心な読み出し
getImageData、toDataURL、readPixels、measureText は、ブリッジホストの実際の出力を返します。この経路ではローカルのノイズは付加されず、ブリッジのピクセルが正解になります。
サイトごとのポリシー
全サイトをブリッジするか、canvas の整合性が重要なサイトの許可リストだけにするか、拒否リスト以外の全サイトにするかを選べます。
待つか、先に進むか
キャッシュが温まっていない状態でキャッシュミスが起きたとき、block はブリッジの応答を待ち、local は待たずに高速なローカル描画を返します。
設定しない限りオフ
ブリッジ URL がなければ、レンダリングは完全にローカルのままです。ブリッジに到達できない場合、Clearcote は警告をログに出してローカルレンダリングにフォールバックします。
なぜブリッジなのか、その代償は
Clearcote は canvas と WebGL を、ホストが実際に搭載している GPU で描画します。ペルソナが別の GPU を名乗っている場合、描画されたピクセルを申告されたハードウェアと照合するチェックはその差に気づけます。そして、ある GPU に別の GPU とまったく同じピクセルを出させることは、ソフトウェアをどれだけ工夫してもできません。ブリッジは不一致を隠すのではなく、なくします。名乗っている GPU そのもので描画するのです。
レンダーサーバーは、GPU マシン上で動く小さな Python のコーディネーターです。そのマシン上のブラウザ(CDP 経由の通常の Chrome、または自身で起動するヘッドレスの Clearcote)を操作し、転送されてきた操作を実際の canvas 上で再生します。クライアントはレンダラープロセスからブリッジのソケットを開くため --no-sandbox が必要ですが、ブリッジ URL を設定すると SDK がこれを追加します。
コストは確かにあります。ブリッジのキャッシュにないピクセルの読み出しは、ネットワークのラウンドトリップを待つことになります(ローカルにフォールバックするまでのタイムアウトは 5 秒)。measureText は呼び出しのたびにラウンドトリップが発生するため、レンダーホストは同じ LAN かデータセンター内に置いてください。また、canvas のアイデンティティはシードではなくレンダーホストのものになります。ひとつのブリッジホストを共有するプロファイルはすべて同じ canvas ハッシュを共有するため、互いに切り離しておきたいアイデンティティのグループごとに GPU ホストを 1 台ずつ用意してください。
主な用途
ホストでは描画できないペルソナ
自動化マシンにない GPU を、それに見合うピクセルとともに提示します。
GPU のないサーバー
本来ならソフトウェアラスタライザで描画することになるヘッドレスサーバー。
モバイルのペルソナ
デスクトップ版エンジン上の Android ペルソナに、対応するハードウェアでの描画を組み合わせます。
Clearcote は、プライバシー保護、テスト、研究、合法的な自動化のために作られています。どう使うか、そしてアクセスするサイトの規約を守ることは、利用者ご自身の責任です。
対象プラン
実験的な機能で、すべてのプランで利用できます。レンダーホストはご自身で用意してください。見せたい GPU を搭載し(Windows ペルソナなら Windows の GPU)、プライベートネットワーク経由で到達できるマシンです。
プランを比較よくある質問
GPU を偽装するだけではだめなのですか?
GPU の文字列なら偽装できますし、Clearcote もそうしています。しかしページは何かを描画してそのピクセルを読み出すこともでき、そのピクセルは実際に描画した GPU から出てきます。ピクセルを変えずに文字列だけを変えるのは、まさにチェックが探している類の矛盾です。
動かすには何が必要ですか?
レンダーホストとなる実 GPU 搭載マシン(Windows ペルソナなら Windows の GPU。その GPU が、プロファイルが見せる canvas のアイデンティティになります)と、そこへのプライベートなネットワーク経路(Tailscale、WireGuard、SSH トンネルなど)が必要です。
安全ですか?
ブリッジは平文の WebSocket で通信するため、プライベートネットワークか暗号化されたトンネル上でのみ使い、ブリッジのポートは決してパブリックなインターネットに公開しないでください。リファレンスサーバーは --canvas-bridge-auth を検証しないので、アクセス制御はネットワークで行うことになります。
どの canvas がブリッジされますか?
Canvas 2D と WebGL で、プロシージャルに生成された WebGL テクスチャも含みます。画像、2D canvas、動画、ImageBitmap、3D テクスチャをソースにした場合、その canvas はローカルレンダリングにフォールバックします。結果は正しいままですが、ブリッジはされません。
ドキュメントで詳しく
関連する機能
canvas、WebGL、WebGPU、オーディオ、フォント、画面、ハードウェアを C++ のエンジン内で 1 つのシードから導出し、ロケールとタイムゾーンもそれに合わせます。すべての項目が互いに整合します。
アカウントごとに 1 つのシード。セッションのたびに同じデバイス、次のアカウントには別のデバイス。Cookie とストレージは実行をまたいで保持されます。
公式 Docker イメージ、serve()、CLI のいずれかで Clearcote を常駐の CDP エンドポイントとして動かし、どのフレームワークでもコードを変えずに接続できます。
TLS ハンドシェイクと HTTP/2 フレームは Chromium 自身のネットワークスタックから送られ、バージョン依存のフィールドはペルソナが名乗る Chrome バージョンに従います。
関連記事
Clearcote を試す
Playwright & Puppeteer にそのまま組み込め、TLS ハンドシェイクまで整合性を保ちます。まずはオープンソースのビルドから始められます。
GitHub があればブラウザ 1 つまで無料。カード登録は不要です。