30MBのRust製ヘッドレスブラウザ「Obscura」:Chromeを凌駕、本物のV8 JSとCDP完全互換。AIエージェントとスクレイピングのステルス核兵器

Obscura:オープンソース界のダークホース

画像

AIエージェントや大規模ウェブスクレイピングの時代において、従来のヘッドレスChromeはますます扱いにくくなっています。200MB以上のメモリ使用量、300MB以上のバイナリサイズ、起動の遅さ、特徴的なフィンガープリント、そしてアンチボット対策能力はほぼゼロです。

GitHubのオープンソースプロジェクトであるh4ckf0r0day/obscuraは、このゲームのルールを変えました。純粋なRustで構築された軽量な#ヘッドレスブラウザ#エンジンであり、AIエージェントの自動化とウェブスクレイピングのために設計されました。シングルバイナリで、ChromeもNode.jsも外部依存関係も一切不要です。本物のV8 JavaScriptエンジンを実行し、Chrome DevTools Protocol (CDP) を完全にサポートしており、PuppeteerやPlaywrightのシームレスな代替品として直接使用できます。

プロジェクトの主要指標:

メモリ使用量:わずか30MB(Chromeは200MB以上)

バイナリサイズ:わずか70MB(Chromeは300MB以上)

ページロード時間:85ミリ秒(Chromeは約500ミリ秒)

起動速度:瞬時に起動(Chromeは約2秒)

アンチ検出機能を内蔵、3,520のトラッカードメインをブロック

1. Obscuraのコア機能概要

Obscuraが提供する3つの主要機能は以下の通りです。

1.CLIコマンドラインツール(obscuraバイナリ)

obscura fetch <URL>:単一ページの取得。本物のJSレンダリング、カスタムeval、待機条件、セレクタ待機、HTML/テキスト/リンク出力をサポート。

obscura scrape <URL...>:複数URLの並行取得(--concurrencyで制御)。統一evalとJSON/テキスト出力をサポート。

obscura serve:CDP WebSocketサーバーを起動し、Puppeteer/Playwrightのバックエンドとして機能。

2.ステルスモード(アンチ検出モード)(--stealth または cargo build --features stealth)

フィンガープリントのランダム化:セッションごとにGPU、画面解像度、Canvas、Web Audio API、バッテリー情報などのフィンガープリントをランダム化。

本物のChromeのシミュレーション:navigator.userAgentDataには高エントロピーなChrome 145の値を使用。event.isTrustedをtrueに設定、内部プロパティを隠蔽、Function.prototype.toString()が[native code]を返す、navigator.webdriverをundefinedに設定。

トラッカーブロッキング:3,520もの分析、広告、テレメトリー、フィンガープリンティング関連ドメインを自動ブロックし、スクリプトを一切読み込ませない。

--stealthフラグで、アンチ検出とトラッカーブロックの両方を有効化。

3.Chrome DevTools Protocol (CDP) 完全互換

Puppeteer-coreやplaywright-coreからws://127.0.0.1:9222を通じて直接接続可能。

実装済みのドメインと主要メソッド(プロジェクトにより明示):

Target:createTarget、closeTarget、attachToTarget、createBrowserContext、disposeBrowserContext

Page:navigate、getFrameTree、addScriptToEvaluateOnNewDocument、lifecycleEvents

Runtime:evaluate、callFunctionOn、getProperties、addBinding

DOM:getDocument、querySelector、querySelectorAll、getOuterHTML、resolveNode

Network:enable、setCookies、getCookies、setExtraHTTPHeaders、setUserAgentOverride

Fetch:enable、continueRequest、fulfillRequest、failRequest(リアルタイムのリクエストインターセプト)

Storage:Cookieのget/set/delete

Input:dispatchMouseEvent、dispatchKeyEvent

LP:getMarkdown(DOMをMarkdownに変換)

追加の実用的な機能:

--proxy(HTTP/SOCKS5プロキシ)をサポート

--obey-robots(robots.txtを遵守)

--wait-until(load / domcontentloaded / networkidle0)

--workers(マルチプロセス並行処理)

フォーム送信、ログイン、302リダイレクト、Cookie維持をネイティブサポート(本物のブラウザ動作)

2. インストール方法

1. プリコンパイル済みバイナリ(推奨、最速)

Releasesページ(https://github.com/h4ckf0r0day/obscura/releases)から最新版をダウンロードします。

bash
# Linux x86_64
curl -LO https://github.com/h4ckf0r0day/obscura/releases/latest/download/obscura-x86_64-linux.tar.gz
tar xzf obscura-x86_64-linux.tar.gz
chmod +x obscura

# macOS Apple Silicon
curl -LO https://github.com/h4ckf0r0day/obscura/releases/latest/download/obscura-aarch64-macos.tar.gz
tar xzf obscura-aarch64-macos.tar.gz

# macOS Intel
curl -LO https://github.com/h4ckf0r0day/obscura/releases/latest/download/obscura-x86_64-macos.tar.gz
tar xzf obscura-x86_64-macos.tar.gz

# Windows:.zipをダウンロードして解凍するだけ

2. ソースからのインストール(ステルス機能サポート)

bash
git clone https://github.com/h4ckf0r0day/obscura.git
cd obscura
# 通常のビルド
cargo build --release
# ステルスモード付き(強く推奨)
cargo build --release --features stealth

要件:Rust 1.75以上(rustupでインストール)。初回ビルドは約5分(V8をソースからコンパイル、以降はキャッシュされます)。

バイナリパスは target/release/obscura です。

3. 使用方法

CLIコアコマンド(プロジェクトからの完全なパラメータリストに基づく)

obscura serve --port 9222 [--stealth] [--proxy <URL>] [--workers N] [--obey-robots]

obscura fetch <URL> [--dump html|text|links] [--eval "JS"] [--wait-until load|domcontentloaded|networkidle0] [--selector "css"] [--stealth]

obscura scrape <URL1> <URL2>... [--concurrency 10] [--eval "JS"] [--format json|text] [--stealth]

Puppeteer統合例(完全に動作可能)

javascript
import puppeteer from 'puppeteer-core';
const browser = await puppeteer.connect({ browserWSEndpoint: 'ws://127.0.0.1:9222/devtools/browser' });
const page = await browser.newPage();
await page.goto('https://news.ycombinator.com');
// 本物のJS実行、Cookie、ログインすべてサポート

Playwrightの例も同様で、chromium.connectOverCDP({ endpointURL: 'ws://127.0.0.1:9222' })を使用します。

フォームログイン、動的コンテンツの待機、リアルタイムFetchインターセプトなどのシナリオは、すべてプロジェクトのREADMEに完全なデモが掲載されています。

4. 技術原理とアーキテクチャ

ObscuraはCargo Workspaceのマルチクレートアーキテクチャを採用し、高度にモジュール化され、非同期駆動型です。これが究極の軽量性と高性能を実現する中核的な理由です。

1. 全体アーキテクチャ

ワークスペース:6つのクレート — obscura-dom、obscura-net、obscura-js、obscura-browser、obscura-cdp、obscura-cli。

中核的な依存関係:

tokio:完全非同期ランタイム

reqwest:HTTPクライアント(cookies、gzip/brotli/deflate、native-tls対応)

deno_core 0.350(obscura-js):本物のV8エンジン統合(ビルド依存としてもdeno_coreに依存)

html5ever + markup5ever + selectors + cssparser + servo_arc(obscura-dom):Servoスタイルの高性能HTML/CSS/DOMパーサー

tokio-tungstenite(obscura-cdp):WebSocket CDPサーバー

wreq + wreq-util(obscura-netのstealthフィーチャー):高度なネットワークリクエスト制御とトラッカーブロッキング

2. 各クレートの主要な責務

obscura-dom:html5everでHTMLを解析し、selectorsでCSSクエリを実行して軽量DOMツリーを実装。

obscura-js:deno_coreを介してV8ランタイムを構築し、module_loader、runtime、opsカスタム操作をサポート。各Pageは独立したJSコンテキストを持ち、本物のJavaScript実行を実現(シミュレーションではありません)。

obscura-net:reqwestを中核としたネットワーク層。stealthフィーチャーが有効な場合、wreqを利用してドメインレベルのトラッカーブロック(3,520ドメイン)とリクエスト偽装を実現。

obscura-browser:中核的な接着層。Page、BrowserContext、LifecycleStateを公開。DOM + JS + Netの連携を調整し、ページライフサイクル(navigate、wait-until、evaluate)を実現。

obscura-cdp:Chrome DevTools Protocolの全メソッドを実装し、WebSocketを介してPuppeteer/Playwrightに公開。FetchインターセプトやInputイベントなどをサポート。

obscura-cli:clap主導のコマンドラインエントリーポイント。ブラウザとCDPを呼び出し、fetch/scrape/serveを実装。

3. 主要な実装原理

本物のJS実行:deno_coreがV8を直接組み込むため、完全なChromiumレンダリングエンジンが不要になり、メモリと容量が大幅に削減されます。

ステルス実装:コンパイル時のフィーチャー切り替えにより、ランタイム時にBrowserContextでセッションごとのランダム化、navigatorプロパティの上書き、イベント偽装、ネットワーク層でのドメインブラックリストインターセプトを実行。

究極のパフォーマンス:Blinkレンダリングエンジンなし、余分なデスクトップ機能なし、純粋なRustのゼロコスト抽象化 + Tokio非同期 + Servoパーサー → 瞬時起動と低メモリ使用量を達成。

CDP互換性:Chromeプロトコルのセマンティクスを完全に再利用し、Puppeteer/Playwrightをコード変更ゼロで接続できることを保証。

ソースコードのobscura-browser/src/lib.rsはpage/context/lifecycleの3つのモジュールのみを公開しており、ミニマルな設計哲学を体現しています。

ObscuraはAIエージェントと大規模スクレイピングのために特別に設計されたRustネイティブエンジンです。モジュール化されたクレート、deno_core V8、Servo DOM、reqwestを活用し、従来のヘッドレスChromeをはるかに凌ぐパフォーマンスとステルス性を実現しました。

自律型AIエージェントの構築、大規模データ収集、低リソースでのアンチボットソリューションなど、どのような用途においても、Obscuraは現在最も実用的な選択肢です。

関連記事

分享網址
AINews·AI 新聞聚合平台
© 2026 AINews. All rights reserved.