cloudflare-browser について
cloudflare-browserは、WebSocket経由のCDPを使い、Cloudflare Browser Renderingでヘッドレスブラウザーを操作するスキルです。スクリーンショット、ページ移動、ビューポート設定、複数ページの動画作成に関するスクリプトと手順を備えています。
主な機能
- 01WebSocket経由のCDP操作
- 02ページのスクリーンショット取得
- 03ページ移動とスクロール
- 04ビューポートサイズの設定
- 05複数ページ動画の作成
活用シーン
- 01レンダリング済みページの画像保存
- 02複数サイトの閲覧を動画で記録
- 03ブラウザーページでのJavaScript実行
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ cloudflare/ moltworker --skill cloudflare-browserインストール後、Claude Code で/cloudflare-browserを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
scripts/cdp-client.jsscreenshot.jsvideo.js詳細
Cloudflare Browser Rendering
WebSocket 経由の CDP(Chrome DevTools Protocol)を使用して、Cloudflare の Browser Rendering サービスでヘッドレスブラウザーを操作します。
前提条件
CDP_SECRET環境変数が設定されていること- openclaw.json でブラウザープロファイルが設定され、
cdpUrlがワーカーのエンドポイントを指していること:"browser": { "profiles": { "cloudflare": { "cdpUrl": "https://your-worker.workers.dev/cdp?secret=..." } } }
クイックスタート
スクリーンショット
node /path/to/skills/cloudflare-browser/scripts/screenshot.js https://example.com output.png
複数ページの動画
node /path/to/skills/cloudflare-browser/scripts/video.js "https://site1.com,https://site2.com" output.mp4
CDP 接続パターン
ワーカーは WebSocket 接続時にページターゲットを自動的に作成します。Target.targetCreated イベントを待ち受けて、targetId を取得します:
const WebSocket = require('ws');
const CDP_SECRET = process.env.CDP_SECRET;
const WS_URL = `wss://your-worker.workers.dev/cdp?secret=${encodeURIComponent(CDP_SECRET)}`;
const ws = new WebSocket(WS_URL);
let targetId = null;
ws.on('message', (data) => {
const msg = JSON.parse(data.toString());
if (msg.method === 'Target.targetCreated' && msg.params?.targetInfo?.type === 'page') {
targetId = msg.params.targetInfo.targetId;
}
});
主な CDP コマンド
| コマンド | 用途 |
|---|---|
| Page.navigate | URL に移動 |
| Page.captureScreenshot | PNG/JPEG をキャプチャ |
| Runtime.evaluate | JavaScript を実行 |
| Emulation.setDeviceMetricsOverride | ビューポートサイズを設定 |
よくあるパターン
ページに移動してスクリーンショットを撮影
await send('Page.navigate', { url: 'https://example.com' });
await new Promise(r => setTimeout(r, 3000)); // Wait for render
const { data } = await send('Page.captureScreenshot', { format: 'png' });
fs.writeFileSync('out.png', Buffer.from(data, 'base64'));
ページをスクロール
await send('Runtime.evaluate', { expression: 'window.scrollBy(0, 300)' });
ビューポートを設定
await send('Emulation.setDeviceMetricsOverride', {
width: 1280,
height: 720,
deviceScaleFactor: 1,
mobile: false
});
動画の作成
- ページ移動中にフレームを PNG としてキャプチャします
- ffmpeg を使って結合します:
ffmpeg -framerate 10 -i frame_%04d.png -c:v libx264 -pix_fmt yuv420p output.mp4
トラブルシューティング
- ターゲットが作成されない:競合状態です。タイムアウトを設定して、Target.targetCreated イベントを待ちます
- コマンドがタイムアウトする:ワーカーのコールドスタートで遅延している可能性があります。タイムアウトを 30~60 秒に延長します
- WebSocket が応答しない:CDP_SECRET がワーカーの設定と一致していることを確認します
コメント
Markdown 対応