apify/fingerprint-suiteは、ブラウザのフィンガープリントとHTTPヘッダーを現実的に生成し、PlaywrightやPuppeteerのブラウザインスタンスに注入するためのツール群です。header-generator・fingerprint-generator・fingerprint-injector・generative-bayesian-networkの4パッケージがモノレポ構成で提供されています。目的はスクレイパーの検知回避、いわゆる「アンチボット対策のかいくぐり」です。
中核はgenerative-bayesian-networkです。実データから学習したベイジアンネットワークをzip形式のnetwork.jsonとして同梱し、そこから確率的に一貫性のあるnavigator・screen・fonts・videoCardなどの値を生成します。header-generatorはこのネットワークを使ってUser-Agentや言語などに整合したHTTPヘッダー一式を作ります。fingerprint-generatorはheader-generatorを継承し、ヘッダーとブラウザAPI用のFingerprintオブジェクトをまとめて返します。最後にfingerprint-injectorがnewInjectedContext関数やnewInjectedPage関数を通じて、生成済みフィンガープリントをPlaywrightのBrowserContextやPuppeteerのPageに注入します。utils.jsによりnavigator・screen・WebGLなどのJS APIを書き換える評価スクリプトが実行される仕組みです。fingerprintOptionsのdevicesやoperatingSystemsで生成条件を絞れます。
- STEP 01
READMEのクイックスタート通りにnewInjectedContextへfingerprintOptionsとnewContextOptionsを渡すと、headless: falseで起動したChromiumに実在ブラウザらしいnavigator値やscreen値が反映された状態を確認できます。
- STEP 02
pnpm installとturboによるビルド後、test/antibot-services/antibot.jsを実行すると、BotDやCreepJSといった実在の検知サービスに対するスコアを文字コードとして取得できます。
- STEP 03
fingerprintOptionsのdevicesを mobile、operatingSystemsを ios に指定すると、生成されるuserAgentDataやplatformがモバイルiOS相当の値に一貫して変わる様子が見えます。
- STEP 04
screenオプションでminWidthやmaxWidthを指定すると、README内の注記通り1件あたりの生成時間が約0.0007秒から約0.03秒へ伸びることを体感できます。
- STEP 05
slim: trueを試すと、一部の重い評価回避処理が省略され、CreepJSなどの採点は下がる可能性がある代わりに実行速度が改善する挙動を確認できます。
実行すると、Playwrightのbrowser.newContext相当の注入済みコンテキストと、それに紐づく整合性のあるHTTPヘッダー一式が手に入ります。navigator・screen・fonts・videoCard・audioCodecsなどが単一ブラウザプロファイルとして矛盾なく揃うため、素のPlaywright/Puppeteerより検知サービスでのスコアが改善しやすくなります。
フィンガープリント生成の核となるnetwork.jsonはzipバイナリで、中身の学習データやモデル精度をソースレビューだけでは検証できません。
test/antibot-services配下のスクリプトはBotDやCreepJSなど外部の実在サービスへ実際にアクセスする内容なので、結果はネットワーク状況やサービス側の仕様変更に左右されます。
playwrightとpuppeteerはpeerDependenciesとして任意指定されているため、利用側で別途インストールしないと動作しません。
screenオプションの利用で生成速度が数十倍遅くなる点はREADME・コード双方に明記されており、大量生成用途では注意が必要です。
Playwright・Puppeteerでスクレイパーを運用していて、単純なUser-Agent偽装では検知を避けきれず悩んでいる開発者に向いています。header-generator・fingerprint-generator・fingerprint-injectorの各パッケージが独立していながらnewInjectedContext一つで組み合わせられる構成なので、既存コードへの導入コストは低めです。ソースとREADMEの記述が一致しており、生成ロジックやテスト構成も実在するため、この判断はインストールしなくても十分信頼できます。ただしモデルの中身であるzipデータの精度自体は、実際に生成・注入して検知サービスで試すまで確定的には言えません。