実機のキャプチャを、そのまま使える形で
シードから合成したペルソナの代わりに、実在する Chrome マシンで収集した値(GPU 文字列、画面、フォント、ハードウェアの数値)を --fingerprint-profile で報告させます。clearcote-profiles ライブラリは、オープンデータセット chrome-fingerprints(実機の Windows 版 Chrome から収集した約 10k 件のキャプチャ)を、整合性のとれたすぐに使えるプロファイル数千件に変換したものです。
72
厳選・検証済みのサンプル。GPU の構成も幅広く、すぐに使えます
~8.5k
ライブラリ全体を生成した場合のプロファイル数
~10k
元データセットに含まれる実機 Chrome のキャプチャ数
変換しただけではなく、厳選しています。ソフトウェアレンダリング(SwiftShader / llvmpipe)や VM 内(Parallels / VMware / VirtualBox)で取得したキャプチャは除外しています。VM のアダプタはそれだけで判別の手がかりになるからです。除外したレコードは透明性のためにリポジトリの excluded/ フォルダに残してあり、その隣には、すべてのプロファイルに GPU ベンダー、ファミリー、画面、論理コア数のタグを付けたマニフェスト index.json があります(サンプルセットの内訳は Intel 29 · NVIDIA 34 · AMD 9)。
プロファイルに含まれるもの、あえて含めないもの
報告する値
- GPU:WebGL の unmasked vendor/renderer の文字列、getParameter テーブル、対応する拡張機能の一覧
- 画面:解像度、利用可能な領域、色深度、デバイスピクセル比、色域
- ハードウェア:hardwareConcurrency と deviceMemory
- フォント、音声合成のボイス、オーディオのサンプルレート & レイテンシ
ブラウザのバージョン(常に最新)
プロファイルには User-Agent、Chrome のバージョン、UA-CH のブランドは含まれません。元データセットは Chrome 117 のもので、Clearcote はそれよりはるかに新しいエンジンを搭載しています。古いバージョンを取り込むと、ブラウザは 117 を名乗りながら実際のバージョンどおりに振る舞うことになり、その食い違い自体が検出可能です。Clearcote は自身の最新バージョンを保ち、借りるのは収集された値だけです。
{
"meta": { "id": "vinyzu-04201", "gpu_vendor": "Intel", "gpu_family": "Arc" },
"hardware_concurrency": 12,
"device_memory": 8,
"screen": { "width": 1920, "height": 1080, "color_depth": 24, "device_pixel_ratio": 1 },
"webgl": {
"UNMASKED_VENDOR_WEBGL": "Google Inc. (Intel)",
"UNMASKED_RENDERER_WEBGL": "ANGLE (Intel, Intel(R) Arc(TM) A770 Graphics Direct3D11 vs_5_0 ps_5_0, D3D11)"
},
"fonts": { "detected": ["Arial", "Calibri", "Cambria", "Consolas", "Segoe UI", "… 390 more"] },
"audio": { "BaseAudioContextSampleRate": 48000, "AudioContextBaseLatency": 0.01 }
}実際にダウンロードするのは、このようなファイルです。プロファイル 1 件が 1 つの JSON ファイルで、この例は Intel Arc A770 搭載のデスクトップ機のものです。実在する 1 台のマシンが報告した値を丸ごと収集しています。Arc A770 のドライバテーブル、12 スレッド、8 GB、1080p の画面、インストール済みフォント 395 個。samples/ にはさらに 71 件が同梱され、generate.py を使えば約 8.5k 件を追加で生成できます。
プロファイルはハードウェアではありません。プロファイルが変えるのは、ブラウザが報告する内容です。ピクセルを描画するものは変わりません。canvas、WebGL の readback、オーディオは引き続き実際に動作しているマシンから得られ、これはどのブラウザにも変えられません。そのため、1 台のマシン上で 2 つのアカウントが別々のプロファイルを使っても、描画される canvas は同一です。アカウントごとにピクセルレベルでも別のマシンに見せたい場合、それを担うのはプロファイルではなく、アカウントごとの fingerprint シードです。
設定方法
pixelscan と BrowserScan で約 30 通りの構成を計測しました。結果を実際に左右したのは、次の 2 つのルールです。
1実際の GPU を報告する
どちらにしてもピクセルを描画するのはホストです。別の GPU を名乗ると名前と描画結果が食い違い、レンダリング結果をハッシュ化するスキャナーはそこを減点します。disable_gpu_fingerprint=True を有効にすると、報告される GPU が実際に処理を担う GPU と一致します。WebGL と WebGPU がまとめて切り替わるので、両者が矛盾することはありません。画面、フォント、ハードウェアの数値は引き続きプロファイルから供給されます。
2シードはアカウントごとに 1 つ。プロファイルとは組み合わせない
プロファイルだけでは、すべてのアカウントが同じ canvas になります。プロファイルは報告値を置き換えるだけで、描画には一切手を加えないからです。アカウントごとの canvas は fingerprint シードから生まれます。シードと収集済みプロファイルの同時指定は、スキャナーが改ざん(tampering)と判定する唯一の組み合わせです。どちらか一方を選んでください。複数のアカウントを運用するならシードを選びます。
マルチアカウントの構成:アカウントごとに固有のシード + 実際の GPU + 専用のプロキシ。canvas ノイズはオンのままにしてください。オフにすると、せっかく用意したアカウントごとの canvas が失われます。
import clearcote
# ONE ACCOUNT, ONE IDENTITY — the multi-account setup
browser = clearcote.launch(
fingerprint="acct-1", # unique per account: this is what varies the canvas
disable_gpu_fingerprint=True, # report the real GPU, so name and render agree
geoip=True, # timezone + language follow the proxy
proxy={"server": "..."}, # one per account
) # note: no fingerprint_profile — a seed replaces it
# A CAPTURED MACHINE INSTEAD — for a single identity, not a fleet
# (the repo's samples/ set works out of the box)
browser = clearcote.launch(
fingerprint_profile="samples/vinyzu-04201.json", # an Intel Arc A770 desktop
disable_gpu_fingerprint=True,
) # note: no fingerprint seed alongside itライブラリ全体を生成する
正規のコンバーターはブラウザのリポジトリにあり、依存関係として固定されています。厳選の処理はその上に重ねています。
pip install -r requirements.txt # dataset + canonical converter
python generate.py # -> profiles/*.json (~8.5k profiles)
python generate.py --samples 80 --out samples # regenerate the sample setクリック操作で済ませたいなら
Profile Manager が、ホストの GPU ベンダーで絞り込んだこのライブラリを代わりに一覧表示し、選んだプロファイルをインタラクティブなウィンドウとして起動します。コードは一切不要です。

ライセンス & 帰属表示。プロファイルは chrome-fingerprints © Vinyzu を基にしているため、ライブラリのライセンスは GPL-3.0 です。BSD-3-Clause である Clearcote ブラウザ本体とは異なる点に注意してください。再配布する場合は、帰属表示とライセンスを残してください。