Mochi.js: 高忠実度ブラウザ自動化への Bun-Native なアプローチ

ブラウザ自動化は、長らく開発者とアンチボットサービスの間のいたちごっことなってきました。Playwright や Puppeteer のようなツールはテストの業界標準ですが、それらはしばしば、高度な検出システムにとって容易な標的となる明確なフィンガープリントを残してしまいます。Mochi.js は、ブラウザのアイデンティティのあらゆる側面が論理的に一貫するように設計された、Bun-native なフレームワークとして登場し、この「フィンガープリント」問題を解決することを目指しています。

従来の自動化の問題点

ほとんどの自動化ライブラリは、ブラウザをパッチしたり、スクリプトを注入して一般的な検出ベクトルを上書きすることで、自身のアイデンティティを隠そうとします。しかし、これはしばしば「フランケンシュタイン・フィンガープリント」を生み出します。例えば、User-Agent は macOS 上で動作していると主張しているのに、WebGL レンダラーは Linux ベースの環境であることを示している、といった具合です。これらの不整合は、まさに FingerprintJS Pro のような現代的なボット検出器が探しているものです。

Mochi.js の 5 つの柱

高忠実度なステルス性を実現するために、Mochi.js は 5 つのコア技術的柱を中心に構築されています。

1. 相関的一貫性エンジン (Relational Consistency Engine)

属性をランダムに割り当てるのではなく、Mochi.js は 48 個のルールを持つ有向非巡回グラフ (DAG) を使用して、単一の (profile, seed) ペアからフィンガープリントを導出します。これにより、canvas、WebGL、audio、fonts、および WebGPU のデータがすべて相関的に一貫したものになります。あるプロファイルが macOS 上の特定の Chrome バージョンに設定されている場合、他のすべてのフィンガープリント表面もその特定の環境に合わせて調整され、ボット検出を誘発する典型的な矛盾を排除します。

2. Chromium-Native Fetch

ボットが検出される最も一般的な方法の一つは、TLS ハンドシェイクと HTTP/2 フィンガープリント (JA3/JA4) を介することです。Mochi.js は、Chrome を偽装するために別の HTTP レイヤーや FFI を使用するという一般的な落とし穴を回避します。代わりに、session.fetch() コールを Chrome DevTools Protocol (CDP) を介して直接 Chromium にルーティングすることで、ネットワークトラフィックが定義上、実際のユーザーのブラウザと区別がつかないようにします。

3. 行動合成 (Behavioral Synthesis)

ステルス性は、ブラウザが「何であるか」だけでなく、「どのように振る舞うか」にも関わる問題です。Mochi.js は、人間の相互作用をシミュレートするために生体力学的モデルを実装しています。

  • Bezier Paths: マウスの動きには、人間の不正確さを模倣するために、オーバーシュートと修正が含まれます。
  • Fitts's Law: 移動時間は、ターゲットの距離とサイズに基づいて計算されます。
  • Lognormal Digraph Delays: タイピング速度は、特定のキーの組み合わせの間に現実的な遅延をシミュレートします。

4. Probe-Manifest Harness

ステルス機能を維持するために、このライブラリには「Probe-Manifest」ハーネスが含まれています。このシステムは、実際のデバイスからベースラインをキャプチャし、CI パイプラインにおいてライブセッションをこれらのベースラインと比較します。いかなる不整合も、書面による根拠とともに正当化される必要があり、ツールが検出可能な状態に退行(リグレッション)しないように保証します。

5. 統合された Bun-Native スタック

Patchright、フィンガープリント注入器、および Python サイドカーを必要とする複雑なパイプラインを必要とする従来のセットアップとは異なり、Mochi.js は Bun 用に構築された単一のライブラリです。これにより、オーバーヘッドを削減し、ステルスブラウザのデプロイを簡レクト化します。

実装と使用方法

Mochi.js は、Playwright ユーザーの「筋肉の記憶」を維持することを目的としており、同様の API を提供します。基本的なステルスセッションは、わずか数行のコードで起動できます。

import { mochi } from "@mochi.js/core";

const session = await mochi.launch({
  profile: "linux-chrome-stable",
  seed: "user-12345",
});

const page = await session.newPage();
await page.goto("https://target.example/checkout");

await session.close();

コミュニティのフィードバックと批判

Mochi.js の技術的な野心は素晴らしいものの、Hacker News での初期の反応は、いくつかの重要な懸念事項を浮き彫りにしました。

  • 安定性と信頼性: 一部のユーザーは、特定のボット検出サイトへの遷移や、特定のページ (e.g., Grok) のレンダリングにおけるクラッシュを報告しており、ツールがまだ初期の不安定な段階にあることを示唆しています。
  • 透明性のパラドックス: あるコメント投稿者は、DAG とフィンガープリント・マニフェストを公開することで、開発者がアンチボットサービスに対して検出方法を改善するためのロードマップを提供してしまい、潜在的に「いたちごっこ」を加速させてしまう可能性があると指摘しました。
  • デバッグモードのジレンマ: 自動化コミュニティにおける一般的な批判は、デバッグモード (CDP に必要) で動作しているブラウザは検出されやすいという点です。ユーザーは、Mochi.js がブラウザが制御環境下で動作しているという事実を効果的に隠蔽できるか疑問を視点を提示しました。
  • ドキュメントと UX: フィードバックによれば、ホームページとドキュメントがモバイルフレンドリーではないことが指摘されており、これは、高忠実度なシミュレーションに焦点を当てているライブラリの性質と矛盾していると見なされることもあります。

結論

Mochi.js は、単純なパッチ適用を超え、実際のブラウザ環境のシステム的なシミュレーションへと移行するための洗練された試みです。相関的一貫性、および生体力学的行動に焦点を当てることで、高ステルス自動化を必要とする人々にとって、有望な代替案を提供します。ただし、初期の利用者が報告した安定性の課題を克服できるかどうかが鍵となります。

Sources