Package Exports
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (@hayashiii/sitesnap) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
🇬🇧 English
@hayashiii/sitesnap
ウェブサイトのスクリーンショット(デスクトップ + モバイル)を一括キャプチャしてローカルに保管する、AIエージェントフレンドリーなCLIツール。ポートフォリオ用のサイト集めを目的として設計。
- 📁 データはJSON + PNGファイル(DB不要)
- 🤖 Claude Code / Codex などのAIエージェントから1コマンドで実行可能(Claude Code Skill同梱)
- 📡
--jsonフラグで構造化出力 → エージェントが結果をパース可能 - 🌐 別プロジェクト(Astro等)から
meta.jsonを読み込んで公開ポートフォリオに統合可能
インストール
# グローバルインストール(推奨)
npm install -g @hayashiii/sitesnap
# または: pnpm add -g @hayashiii/sitesnap
# または: yarn global add @hayashiii/sitesnap
# Playwright の Chromium ブラウザを取得(初回のみ)
npx playwright install chromiumNode.js 22以上 が必要です。
Quick Start
# サイトマップから全ページを一気にキャプチャ
sitesnap site https://example.com/sitemap.xml
# 1ページだけ
sitesnap page https://example.com/about
# キャプチャ済みのサイト一覧
sitesnap list
# サイトのフォルダを Finder で開く(macOS)
sitesnap open example.comコマンド一覧
| コマンド | 用途 |
|---|---|
sitesnap site <sitemap-url> |
sitemapから全URL展開 → 全ページキャプチャ |
sitesnap page <url> |
単一ページのみキャプチャ |
sitesnap list |
キャプチャ済みサイト一覧 |
sitesnap open <domain> |
Finderでサイトのフォルダを開く |
sitesnap retry <domain> |
失敗したページのみ再取得 |
sitesnap help |
ヘルプ表示 |
グローバルフラグ
| フラグ | 用途 |
|---|---|
--json |
構造化JSON出力(stdoutにJSON、進捗ログはstderr)。AIエージェントから扱いやすい |
--force-visible |
スクロール連動アニメで隠れた要素を強制表示。スクショが真っ白な時に使う(AOS, wow.js 等対策) |
--out <dir> |
出力先ディレクトリ(デフォルト: カレントディレクトリの ./sites/)。SITESNAP_OUT 環境変数でも指定可 |
--limit <N> |
最初の N 件のURLだけキャプチャ(--exclude 適用後の順序) |
--exclude <regex> |
この正規表現にマッチするURLをスキップ(例: '\?utm_') |
--concurrency <N> |
並列ワーカー数を上書き(デフォルト3) |
--min-interval <ms> |
同一ホストへの最小間隔(ms、デフォルト 0 で無効)。サーバーに優しい運用に |
--strict |
1ページでも失敗したら非ゼロ終了(CIで使う想定) |
--allow-private |
localhost/プライベートIPへのアクセスを許可(デフォルトは拒否) |
sitesnap list --json
# → [{ "domain": "...", "pages": 45, ... }]
sitesnap site https://example.com/sitemap.xml --force-visible --out ~/capturesアニメーション対策(デフォルトで有効)
Playwrightブラウザコンテキストに以下を自動適用しています:
prefers-reduced-motion: reduceの送信(まともなサイトはこれでアニメ無効化)- 全要素の
animation/transitionを0.001sに短縮するCSS注入 document.fonts.readyと全画像のロード完了を待ってから撮影
それでも真っ白なら --force-visible を試してください(AOS等のscroll-reveal対策)。
出力構造
sites/ (--out で変更可)
├── index.json 全サイトのサマリ
└── <domain>/
├── meta.json ページ一覧 + 画像パス + タイトル
├── desktop/<slug>.png デスクトップ版スクショ
└── mobile/<slug>.png モバイル版スクショmeta.json のスキーマ
{
"domain": "example.com",
"source": "https://example.com/sitemap.xml",
"captured_at": "2026-05-01T12:00:00Z",
"pages": [
{
"url": "https://example.com/",
"slug": "index",
"title": "ページタイトル",
"desktop": "desktop/index.png",
"mobile": "mobile/index.png",
"captured_at": "2026-05-01T12:00:00Z",
"desktop_error": null,
"mobile_error": null
}
]
}AI Agent からの使い方
Claude Code
ソースリポジトリには .claude/skills/sitesnap/SKILL.md が同梱されています。同じファイルを自分のプロジェクトの .claude/skills/ にコピーすればネイティブで呼び出せるようになります:
ハヤシさん: 「このサイト保存して: https://example.com/sitemap.xml」 Claude Code が自動的に
sitesnap site …を実行
Codex / その他のシェル実行可能なAIエージェント
--json フラグで構造化出力できるので、エージェントに以下のような指示を渡すだけで使えます:
このCLIには
sitesnapコマンドが使える。
sitesnap site <sitemap-url> --jsonでサイト全体sitesnap page <url> --jsonで単一ページ 出力はstdoutにJSON、進捗ログはstderr。
設定変更(ソースを編集する場合)
src/config.mjs でデフォルト値を調整できます:
viewports.desktop… デスクトップのビューポートサイズviewports.mobile… モバイルのデバイス名 (Playwrightdevices参照)concurrency… 並列キャプチャ数(デフォルト3)navigationTimeout… ページ読み込みタイムアウト(ms)
ポートフォリオサイトへの統合
meta.json を静的サイトジェネレーター(Astro等)から読み込む想定で設計しています。Astroの例:
// src/pages/portfolio/[domain]/[slug].astro
import meta from '../../../path/to/sites/example.com/meta.json';
export function getStaticPaths() {
return meta.pages.map(p => ({
params: { domain: meta.domain, slug: p.slug },
props: { page: p, domain: meta.domain }
}));
}画像パスは meta.json 内で desktop/<slug>.png 形式の相対パスなので、配信時のbaseURLと組み合わせて使ってください。
制限・注意
セキュリティ
- デフォルトで
localhost/127.x/10.x/192.168.x/172.16-31.x/169.254.x(リンクローカル) へのアクセスを拒否します(SSRF対策)。社内環境で使う場合は--allow-privateを付けてください。 http:///https://以外のスキーム(file://, ftp://, data:)は受け付けません。- HTTPリクエストには
sitesnap/<version> (+<homepage>)を User-Agent として送信します。 - sitemapindex の循環参照や深いネスト(デフォルト最大5段)は自動で検出して中断します。
その他の注意
- スクショ画像はGit管理外推奨。
meta.jsonだけGit管理に乗せるのが基本(画像はサイズ大、生成物として扱う) - ログイン必須サイトは現状未対応(今後 Playwright の
storageStateで対応予定) - JavaScriptを大量に使うSPAは
networkidleで待機してますが、撮り逃しがあればsitesnap retry <domain>で再取得を
ライセンス
MIT © 2026 Hayashi