Kindle Web Reader/Kindle...
Kindle Web Readerから書籍のスクリーンショットを自動取得し、PDFを生成します。
このSkillは、Amazon Kindle Web Reader(read.amazon.co.jp)とKindle macOSアプリの両方に対応します。WebはPlaywrightとKindleRenderer APIで自動キャプチャし、アプリはスクリーンショットで取得します。タイトル取得に失敗した場合は、表紙を1枚キャプチャしてAIが視認し、適切な書籍名で命名します。
capture_cover.py --json → view_imageで表紙タイトル確認 → 取得タイトルを --book に使用src/dedupe_tail.py で巻末末尾の重複ページを必ず検出・削除する(末尾の連続ページで同一画像が続く場合は重複として除去する)。/Users/tsunoda/Library/CloudStorage/GoogleDrive-tsunoda799@gmail.com/マイドライブ/Kindle)。cd /Users/tsunoda/Development/kindle-app
# 仮想環境を作成(初回のみ)
python3 -m venv venv
# 仮想環境を有効化
source venv/bin/activate
# 依存パッケージをインストール
pip install -r requirements.txt
# 注意: このツールはシステムのGoogle Chromeを使用します
# Playwrightのブラウザインストールは不要です
重要: トリミングは必須ステップです。UIが映り込んでいても無視し、本体ページの四隅(紙面の外枠)に合わせてトリミングします。
source venv/bin/activate
python src/capture.py --asin <ASIN> --layout double
書籍のASINコードを指定して、全ページのスクリーンショットを取得します。
デフォルトはログイン済みの既存プロファイルを使用します。Chrome起動中でプロファイルロックが発生した場合は、自動的に ~/Library/Application Support/Google/Chrome-Kindle にフォールバックします(初回ログインが必要)。
# AIがサンプル画像(page_0001.png等)を確認してcrop_box値を決定
# UIは無視し、本体ページの外枠(四隅)を基準に計測する
# ここに数値の例は書かない(画像ごとに必ず計測する)
python src/trim.py --input ./kindle-captures/<ASIN>/ --crop "<left,top,right,bottom>"
キャプチャ画像のうち、本体ページの外枠(紙面)に合わせてトリミングします。AIは複数ページを確認して最適なcrop_box値を決定します。 詳細は「AIアシストトリミング ワークフロー」セクションを参照。
PDF生成前に src/dedupe_tail.py を実行して末尾重複を削除します。
source venv/bin/activate
python src/dedupe_tail.py --input ./kindle-captures/<ASIN>/trimmed/
python src/create_pdf.py --input ./kindle-captures/<ASIN>/trimmed/
mkdir -p "/Users/tsunoda/Library/CloudStorage/GoogleDrive-tsunoda799@gmail.com/マイドライブ/Kindle/<BOOK_TITLE>"
mv "<PDF_PATH>" "/Users/tsunoda/Library/CloudStorage/GoogleDrive-tsunoda799@gmail.com/マイドライブ/Kindle/<BOOK_TITLE>/<BOOK_TITLE>.pdf"
mv "./kindle-captures/<CAPTURE_DIR>/" "/Users/tsunoda/Library/CloudStorage/GoogleDrive-tsunoda799@gmail.com/マイドライブ/Kindle/<BOOK_TITLE>/画像_<RUN_ID>"
トリミング後の画像からPDFを生成します。必ず /trimmed/ ディレクトリを指定してください。
source venv/bin/activate
python src/capture_cover.py --json
kindle-captures/<ASIN>/cover.png を view_image で確認metadata.json の book を更新注意: 表紙が表示されている状態で実行すること(現在表示中のページを撮影)。
source venv/bin/activate
python src/capture_app.py --book "<BOOK_TITLE>"
# 末尾の重複ページを削除してからPDF生成(スクリプト使用)
python src/dedupe_tail.py --input ./kindle-captures/<BOOK_TITLE>/
python src/create_pdf.py --input ./kindle-captures/<BOOK_TITLE>/
# PDF生成後にGoogle Driveへ移動(PDF+画像フォルダ)
mv "./<BOOK_TITLE>.pdf" "/Users/tsunoda/Library/CloudStorage/GoogleDrive-tsunoda799@gmail.com/マイドライブ/Kindle/<BOOK_TITLE>/<BOOK_TITLE>.pdf"
mv "./kindle-captures/<BOOK_TITLE>/" "/Users/tsunoda/Library/CloudStorage/GoogleDrive-tsunoda799@gmail.com/マイドライブ/Kindle/<BOOK_TITLE>/画像_<RUN_ID>"
必須オプション:
--asin <ASIN>: 書籍のASINコード(Amazon商品識別子)主要オプション:
--chrome-profile <パス>: Chromeプロファイルパス(デフォルト: ~/Library/Application Support/Google/Chrome)~/Library/Application Support/Google/Chrome-Kindle に自動フォールバック--layout <single|double>: レイアウトモード(デフォルト: double)single: シングルページ表示double: 見開き(ダブルページ)表示--start <位置>: キャプチャ開始位置(Kindleの位置番号)--end <位置>: キャプチャ終了位置(Kindleの位置番号)--output <ディレクトリ>: 出力先ディレクトリ(デフォルト: ./kindle-captures/{ASIN}/)--headless: ヘッドレスモードで実行(デフォルト: false)--max-pages <数値>: 取得ページ数の上限(デフォルト: 無制限)--viewport-width <数値>: ブラウザのviewport幅(デフォルト: 3840)--viewport-height <数値>: ブラウザのviewport高さ(デフォルト: 2160)必須オプション:
--input <ディレクトリ>: スクリーンショットが保存されているディレクトリ主要オプション:
--output <ファイル名>: 出力PDFファイル名(デフォルト: {ASIN}.pdf)--quality <1-100>: JPEG品質(デフォルト: 85)--resize <0.1-1.0>: リサイズ比率(デフォルト: 1.0 = リサイズなし)必須オプション:
--book <タイトル>: 書籍名/識別子主要オプション:
--output <ディレクトリ>: 出力先(デフォルト: ./kindle-captures/{book})--max-pages <数値>: 取得ページ上限--region <x,y,w,h>: キャプチャ領域指定--scale <倍率>: 座標スケール(Retinaなら2.0)--wait <秒>: ページ送り後の待機--next-key <right|left|space|pagedown>: ページ送りキー主要オプション:
--book <タイトル>: 書籍名を直接指定(命名用)--asin <ASIN>: ASIN指定(タイトル取得の補助)--online: ローカルでタイトルが取れない場合にAmazonから補完--json: スクリプト連携向けJSON出力書籍全体をキャプチャしてPDF化する基本的なワークフローです。トリミングは必須です。
source venv/bin/activate
# 1. スクリーンショット取得
python src/capture.py --asin B0DSKPTJM5 --layout double
# 2. AIがサンプル画像を確認してcrop_box値を決定
# (AIエージェントがpage_0001.png等を読み、本体ページの外枠に合わせて判断)
# 3. トリミング実行(画像から測定した値を使用)
python src/trim.py --input ./kindle-captures/B0DSKPTJM5/ --crop "<left,top,right,bottom>"
# 4. AIがトリミング結果を複数ページで確認
# (本体外枠のバランス、コンテンツ切れがないか確認)
# 5. 巻末末尾の重複削除(トリミング後の画像で末尾重複を除去 / スクリプト使用)
python src/dedupe_tail.py --input ./kindle-captures/B0DSKPTJM5/trimmed/
# 6. PDF生成(トリミング後の画像から)
python src/create_pdf.py --input ./kindle-captures/B0DSKPTJM5/trimmed/
# 7. Google Driveへ移動(日本語ディレクトリ名・ファイル名)
mkdir -p "/Users/tsunoda/Library/CloudStorage/GoogleDrive-tsunoda799@gmail.com/マイドライブ/Kindle/<BOOK_TITLE>"
mv "./<BOOK_TITLE>.pdf" "/Users/tsunoda/Library/CloudStorage/GoogleDrive-tsunoda799@gmail.com/マイドライブ/Kindle/<BOOK_TITLE>/<BOOK_TITLE>.pdf"
mv "./kindle-captures/<BOOK_TITLE>/" "/Users/tsunoda/Library/CloudStorage/GoogleDrive-tsunoda799@gmail.com/マイドライブ/Kindle/<BOOK_TITLE>/画像_<RUN_ID>"
特定の範囲のみをキャプチャする場合に使用します。トリミングは必須です。
source venv/bin/activate
# 1. 位置1000から5000までをキャプチャ
python src/capture.py --asin B0DSKPTJM5 --start 1000 --end 5000 --layout double
# 2. トリミング(画像から測定した値を使用)
python src/trim.py --input ./kindle-captures/B0DSKPTJM5/ --crop "<left,top,right,bottom>"
# 3. PDF生成
python src/create_pdf.py --input ./kindle-captures/B0DSKPTJM5/trimmed/
指定したページ数だけキャプチャする場合に使用します。トリミングは必須です。
source venv/bin/activate
# 1. 最初の15ページをキャプチャ
python src/capture.py --asin B0DSKPTJM5 --max-pages 15 --layout double
# 2. トリミング(画像から測定した値を使用)
python src/trim.py --input ./kindle-captures/B0DSKPTJM5/ --crop "<left,top,right,bottom>"
# 3. PDF生成
python src/create_pdf.py --input ./kindle-captures/B0DSKPTJM5/trimmed/
モバイルデバイス用にファイルサイズを最適化する場合に使用します。トリミングは必須です。
source venv/bin/activate
# 1. キャプチャ
python src/capture.py --asin B0DSKPTJM5 --layout double
# 2. トリミング(画像から測定した値を使用)
python src/trim.py --input ./kindle-captures/B0DSKPTJM5/ --crop "<left,top,right,bottom>"
# 3. リサイズ&圧縮してPDF生成
python src/create_pdf.py --input ./kindle-captures/B0DSKPTJM5/trimmed/ --resize 0.7 --quality 80
AIエージェントが視覚的にキャプチャ画像を確認し、最適なトリミング範囲を決定するワークフローです。
capture.py
↓
[AI: 中程から3-5ページ選択(例: 5,8,10,12)]
↓
mark.py --pages "5,8,10,12" --crop "..." (元画像にマーカー描画)
↓
[AI: マーカー付き画像を確認] → 位置調整が必要? → crop値調整して mark.py 再実行
↓ 位置OK ↑ (2-3回繰り返し)
trim.py --crop "..." (全ページトリミング)
↓
create_pdf.py
⚠️ 重要: マーカーで視覚的に位置を確認してからトリミングを実行します。
原則:
例:
--pages "5,8,10,12"--pages "10,20,30,40"--pages "20,40,60,80"AIは以下の要素を確認してトリミング範囲を決定します:
コマンド例(テンプレート):
python src/trim.py --input ./kindle-captures/<ASIN>/ --crop "<left,top,right,bottom>"
注意: 数値の例は記載しません。必ず対象画像を見て測定し、他書籍や過去の値を流用しないこと。
判断手順:
"left,top,right,bottom" 形式で決定(数値は画像から測定)⚠️ このステップが最も重要です。一発でOKになることは稀なので、厳しい目でチェックしてください。
トリミング後、AIはサンプルページを確認します(1ページだけで判断しない):
確認すべきページ(中程から3-5ページ):
確認チェックリスト:
🔴 余白が少しでも残っている場合は、即座に再トリミングを実行してください。
基準: 本体ページ(紙面)の端がトリミング後の画像の端にほぼ一致していること。グレーや白の余白が目立つ場合はNGです。
⚠️ 重要な注意事項:
再トリミングの手順:
元画像は保持されているため、新しいcrop_box値でtrim.pyを再実行するだけでOKです。
# 例: 右側と下側の余白を詰める場合
# right値を小さく、bottom値を小さくして再実行
python src/trim.py --input ./kindle-captures/<ASIN>/ --crop "<left,top,新しいright,新しいbottom>"
元画像にトリミング位置を示すマーカー(赤い枠線とL字コーナー)を描画します。 各ページにつき5つの画像を生成:全体画像 + 4辺の拡大画像で、位置を精密に確認できます。
生成される画像:
{page}_marked.png: 全体画像(マーカー付き){page}_top.png: 上辺の拡大画像{page}_bottom.png: 下辺の拡大画像{page}_left.png: 左辺の拡大画像{page}_right.png: 右辺の拡大画像必須オプション:
--input <ディレクトリ>: 元画像ディレクトリ--crop "left,top,right,bottom": マーカー位置(絶対座標)オプション:
--pages "5,8,10,12": 指定ページのみマーカー描画--output <ディレクトリ>: 出力先(デフォルト: {input}/marked/)--color <色>: マーカーの色(デフォルト: red)--width <数値>: 線の太さ(デフォルト: 4)--margin <数値>: 拡大画像のマージン(デフォルト: 150px)マーカー→確認→トリミングの手順:
# 1. サンプルページにマーカーを描画(5画像×ページ数 生成)
python src/mark.py --input ./kindle-captures/<ASIN>/ --crop "305,115,3280,1955" --pages "5,8,10,12"
# 2. 各辺の拡大画像と全体像を確認(5画像)
# - page_0005_top.png: 上辺のマーカー位置を確認
# - page_0005_bottom.png: 下辺のマーカー位置を確認
# - page_0005_left.png: 左辺のマーカー位置を確認
# - page_0005_right.png: 右辺のマーカー位置を確認
# - page_0005_marked.png: 全体画像で四隅のバランスを確認
# 3. 位置調整が必要なら crop値を変更して再実行
python src/mark.py --input ./kindle-captures/<ASIN>/ --crop "310,120,3270,1950" --pages "5,8,10,12"
# 4. 位置がOKなら全ページをトリミング
python src/trim.py --input ./kindle-captures/<ASIN>/ --crop "310,120,3270,1950"
必須オプション:
--input <ディレクトリ>: 元画像ディレクトリ--crop "left,top,right,bottom": トリミング範囲(絶対座標)オプション:
--pages "5,8,10,12": 指定ページのみトリミング(省略時は全ページ)--output <ディレクトリ>: 出力先(デフォルト: {input}/trimmed/)--note <テキスト>: メタデータに記録するメモこのスキルはブラウザ自動化ツールを使用してKindleライブラリから書籍を検索できます。使用するエージェントに応じて適切なツールを使用してください。
https://read.amazon.co.jp/?asin=B0DSKPTJM5)source venv/bin/activate && python src/capture.py --asin <ASIN> --layout double を実行python src/mark.py --input ./kindle-captures/<ASIN>/ --crop "<値>" --pages "5,8,10,12" でマーカー描画python src/trim.py --input ./kindle-captures/<ASIN>/ --crop "<値>" で全ページトリミングsource venv/bin/activate && python src/create_pdf.py --input ./kindle-captures/<ASIN>/trimmed/ を実行ブラウザ自動化ツール: mcp__claude-in-chrome__*
| 操作 | ツール |
|---|---|
| タブ確認/作成 | tabs_context_mcp, tabs_create_mcp |
| ナビゲート | navigate |
| 要素検索 | find |
| フォーム入力 | form_input |
| クリック/操作 | computer |
| ページ読み取り | read_page |
前提条件: Claude in Chrome エクステンション(https://claude.ai/chrome)
実装例:
mcp__claude-in-chrome__tabs_context_mcp でブラウザ接続を確認mcp__claude-in-chrome__navigate でKindleライブラリにアクセスmcp__claude-in-chrome__find で検索バーを特定mcp__claude-in-chrome__form_input でキーワードを入力mcp__claude-in-chrome__computer で検索を実行mcp__claude-in-chrome__read_page で検索結果を取得ブラウザ自動化ツール: mcp__chrome-devtools__*
| 操作 | ツール |
|---|---|
| 新規ページ | new_page |
| ナビゲート | navigate_page |
| スナップショット | take_snapshot |
| フォーム入力 | fill |
| キー入力 | press_key |
| クリック | click |
| スクリプト実行 | evaluate_script |
実装例:
mcp__chrome-devtools__new_page でKindleライブラリにアクセスmcp__chrome-devtools__take_snapshot で検索バーを特定mcp__chrome-devtools__fill でキーワードを入力mcp__chrome-devtools__press_key(Enter)で検索実行mcp__chrome-devtools__take_snapshot で検索結果を取得上記に該当しないエージェントを使用している場合:
手動確認の案内:
https://read.amazon.co.jp/?asin=B0DSKPTJM5 → ASIN: B0DSKPTJM5https://www.amazon.co.jp/dp/B0DSKPTJM5/ → ASIN: B0DSKPTJM5(/dp/の後の英数字)「githubの本をPDF化して」(書籍名が曖昧な場合):
「アプリで(ローカルで)PDF化して」:
python src/capture_cover.py --json で表紙を取得view_image で表紙を読み取り、適切な書籍名で命名python src/capture_app.py --book "<BOOK_TITLE>" を実行python src/create_pdf.py --input ./kindle-captures/<BOOK_TITLE>/ を実行「この本の100ページ目から200ページ目までPDF化」:
--start と --end オプションで範囲指定「見開きでキャプチャして」:
--layout double オプションを使用「モバイル用に軽量化してPDF化」:
--resize 0.7 --quality 80 オプションを使用症状: ブラウザ自動化ツールが接続されていない
対処法:
source venv/bin/activate && python src/capture.py --asin <ASIN> で直接実行対処法:
python src/capture_cover.py --json を実行view_image で cover.png を確認して書籍名を決める--book にその書籍名を使って再実行症状: Session invalid. Please log in to Kindle in Chrome and retry.
原因: Kindle Web Readerのログインセッションが切れている
対処法:
症状: Failed to launch browser または Chrome profile is locked
原因: 既にChromeが起動中で、デフォルトのプロファイルが使用されている
対処法(推奨): 一時的なプロファイルを使用してプロファイル競合を回避します。この方法を使えば、通常のChromeを起動したままでもキャプチャできます。
source venv/bin/activate
python src/capture.py --asin <ASIN> --chrome-profile /tmp/kindle-test-profile
補足: 自動フォールバック後は初回ログインが必要です。
代替対処法:
症状: キャプチャが途中で進まなくなる、または遅い
原因: ネットワーク速度が遅い、またはページ読み込み検知のタイムアウトが短すぎる
対処法:
config.yaml の wait_timeout を増やす(例: 3.0 → 5.0)# config.yaml
capture:
wait_timeout: 5.0 # 3.0から5.0に変更
症状: No screenshots found in {directory}
原因: capture.pyを実行せずにcreate_pdf.pyを実行した、またはディレクトリパスが間違っている
対処法:
source venv/bin/activate && python src/capture.py --asin <ASIN> を実行(フォールバック時は初回ログイン)--input ./kindle-captures/<ASIN>/)kindle-captures/
└── {ASIN}/
├── page_0001.png # 元画像
├── page_0002.png
├── page_0003.png
├── ...
├── metadata.json # キャプチャメタデータ
├── marked/ # マーカー付き画像(mark.py実行時)
│ ├── page_0005_marked.png # 全体画像
│ ├── page_0005_top.png # 上辺拡大
│ ├── page_0005_bottom.png # 下辺拡大
│ ├── page_0005_left.png # 左辺拡大
│ ├── page_0005_right.png # 右辺拡大
│ └── ...
└── trimmed/ # トリミング後(trim.py実行時)
├── page_0001.png
├── page_0002.png
├── ...
└── trim_metadata.json # トリミング設定・履歴
各キャプチャセッションの詳細情報を記録します:
{ASIN}.pdf--output オプションで指定したファイル名このツールは私的利用のみを目的としています。以下の点を遵守してください:
Kindle Web ReaderのJavaScript APIを利用:
getMinimumPosition() / getMaximumPosition(): 書籍の位置範囲取得gotoPosition(position): 指定位置へ移動hasNextScreen(): 次ページの有無確認nextScreen(): 次ページへ移動