作成: 2026-06-21 / カテゴリ: 技術(CLI ツール・自動化)
cloudfetch は、Android スマホで撮った写真を Google Drive 上の専用フォルダ経由でローカルに取り込み、Claude Code(Max プラン)または Antigravity(Google AI Pro)に Vision でその場で解析させるための個人用 Python CLI(コマンド名は photofetch)です。Google Photos Library API が 2025-04 以降「第三者アプリは Picker API 経由のユーザー手動選択しかできない」よう制限されたため、自動化のためにDrive フォルダ運用に倒した設計です。本ノートは、全体アーキテクチャ・OAuth セットアップ・md5 重複防止ロジック・Drive vs Photos API の制約・ファイル構成・Windows / Mac の起動方法・設計判断と既知の制約をまとめます。
uv tool install でグローバルに入る実行ファイル名)。当初は Google Photos Library API でスマホのカメラロールから直接画像を取得する設計を検討した。しかし 2025-04 の Google の API ポリシー変更で、第三者アプリは Picker API(ユーザーが毎回 GUI で手動選択)を経由しないと Photos ライブラリにアクセスできなくなった。これでは「今日撮った写真をワンコマンドで取り込んで Claude に渡す」という自動化要件を満たせない。🟢 公式アナウンス確認済
一方 Google Drive API は今もフォルダ単位の自動同期が可能で、md5Checksum・imageMediaMetadata といったメタデータも取得できる。そこで「スマホの Drive アプリで専用フォルダに写真をアップ → CLI が定期的に取りに行く」というシンプルな運用に倒した。🟢 Drive API v3 公式ドキュメントで確認済
Android からローカルマシン、そして AI への流れを 1 本の図にまとめる。
リポジトリのファイル配置を図にする。Skill ファイルだけ Claude Code のグローバルスキルディレクトリにコピーする運用なので、リポジトリ内では skill/ に置いてある。
初回だけ Google Cloud Console での設定が必要。以降は token のリフレッシュで自動継続する。
~/.photofetch/client_secret.json と ~/.photofetch/token.json。どちらも Git に上げない。「同じ写真を 2 回ダウンロードしない」「index.json を消しても/別の経路(MCP 等)で既に取得済みでも、重複ダウンロードを避ける」ことを保証するため、ローカル全体の md5 スキャンと index.json のキャッシュを併用している。
index.json が消えた/別マシンから rsync された場合でも、ローカルファイルの md5 から重複を検知できる。md5Checksum フィールドはサーバ計算なので、ローカルとの突合だけで判定できる(追加ダウンロード不要)。🟢 Drive API v3 仕様| 項目 | Google Drive API | Google Photos Library API |
|---|---|---|
| 2025-04 以降の制限 | 従来通り、フォルダ単位で API アクセス可 | 第三者アプリは Picker API 経由の 手動選択のみ |
| 自動同期 | 可能(フォルダを巡回) | 不可(毎回 GUI が必要) |
| md5 取得 | md5Checksum フィールドあり | なし |
| EXIF / GPS | imageMediaMetadata で取得可 | 一部のみ・形式が異なる |
| 運用負荷 | スマホ Drive アプリでフォルダにアップ | API 経由の自動化が事実上不可 |
| 採用判断 | 採用 | 不採用 |
cd C:\Users\lunel\Projects\Others\cloudfetch uv tool install --from . photofetch # photofetch コマンドをグローバル化 # Google Cloud Console で OAuth クライアントを作り、client_secret.json を取得 # それを ~/.photofetch/client_secret.json に配置 photofetch login # 初回のみブラウザ認証 # 日常使用 photofetch sync today --ocr-source none photofetch sync yesterday photofetch sync 2026-06-21 photofetch sync last:7d photofetch sync 2026-06-01..2026-06-21 # Claude Code から /photofetch today
詳細は docs/SETUP_MAC.md 参照。要点だけ:
curl -LsSf https://astral.sh/uv/install.sh | sh # uv 導入 git clone <your-repo> cd cloudfetch uv tool install --from . photofetch # 認証情報の選択肢 # (a) Windows と同じ Google アカウントなら token.json をコピーして共有 # (b) または改めて photofetch login # Skill を Claude Code に登録 mkdir -p ~/.claude/skills/photofetch cp skill/SKILL.md ~/.claude/skills/photofetch/
CLI はダウンロードと EXIF/GPS 抽出だけに絞っている。画像内容そのもの(OCR・物体認識・要約)は AI 側に任せる。
imageMediaMetadata から GPS / 撮影日時 / カメラを JSON 化。--ocr-source none がデフォルト。--ocr-source drive オプションは設計時に検討したが、対応する API が無いため不採用。🟢 公式ドキュメントで確認済
| 判断 | 選んだ方向 | 理由 |
|---|---|---|
| 取得元 | Google Drive | Photos API は手動選択強制 (2025-04 〜) |
| OCR の場所 | CLI には入れない | Claude / Antigravity の Vision で十分・API 課金回避 |
| 重複防止 | index.json + md5 ローカルスキャン | index 消失や別経路ダウンロードに頑健 |
| 配布方法 | uv tool install | グローバルコマンド化・依存衝突なし |
| Skill 化 | /photofetch として登録 | Claude Code から自然言語で呼べる |
createdTime はアップロード日時で、撮影日時とは異なる場合がある。撮影日時は imageMediaMetadata.time(EXIF 由来)を優先する。~/.photofetch/client_secret.json と token.json は秘密情報。Git に上げない(リポジトリの .gitignore でも除外しているが念のため確認)。token.json を共有できる(同じアカウントで使うなら)。確信度ラベル: 本ノートの技術仕様の大半は実装済みコード・公式ドキュメントから確認済(🟢)。Antigravity の挙動はユーザの利用ログに基づく所感(🟡)を含む。