mcpField
G
giil

giil

github.com/dicklesworthstone生産性7351 回インストール8 週間前に更新
リポジトリ

giil について

giilは、iCloud、Dropbox、Google Photos、Google Driveの共有リンクから高解像度画像を取得するコマンドラインツールです。スクリプト処理やリモートでのAIデバッグ向けに、JSONやBase64での出力にも対応します。

主な機能

  1. 014つのクラウドサービスから画像を取得
  2. 02ブラウザーキャプチャと直接ダウンロード
  3. 03共有アルバムの一括ダウンロード
  4. 04JSON、Base64、URLで出力
  5. 05画像の変換と圧縮

活用シーン

  1. 01スマートフォンの画面をリモートのコーディング作業に渡す
  2. 02共有アルバムの画像をまとめて取得
  3. 03画像データをスクリプトやAPIに渡す

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/dicklesworthstone/agent_flywheel_clawdbot_skills_and_integrations --skill giil

インストール後、Claude Code で/giilを入力して読み込まれたか確認します。

詳細

GIIL — Get Image [from] Internet Link

クラウド写真共有からフル解像度の画像をダウンロードする、セットアップ不要の CLI です。iPhone のスクリーンショットとリモート AI コーディングセッションをつなぐ欠けていたリンクです。

開発の背景

主な用途:リモートでの AI 支援デバッグ

Claude Code、Codex、または別の AI アシスタントを実行しているリモートサーバーに SSH で接続しています。iPhone の UI の問題をデバッグする必要がありますが、そのスクリーンショットをリモートターミナルに送るにはどうすればよいでしょうか?

giil を使わない場合:

Download image locally → SCP to server → Tell AI the path
Email yourself → Download on server → Hope it works
Set up complex file sync between devices

giil を使う場合:

giil "https://share.icloud.com/photos/0a1Abc_xYz..." --json
# {"path": "/tmp/icloud_20240115_143022.jpg", "width": 1170, ...}

コマンドは 1 つだけです。AI がすぐに画像を確認できます。ファイル転送も、コンテキストの切り替えも必要ありません。

ワークフロー
iPhone Screenshot → iCloud Sync → Photos.app Share Link → Paste to SSH → giil Downloads → AI Analyzes
クラウド共有が難しい理由
問題難しい理由giil による解決方法
JavaScript を多用する SPA標準の curl/wget では JavaScript を実行できませんPlaywright 経由のヘッドレス Chromium
動的な画像読み込み画像は CDN から非同期に読み込まれますネットワークインターセプトで CDN の応答を取得します
直接ダウンロードできるリンクがないURL はセッションごとに異なり、有効期限がありますダウンロードボタンをクリックするか、実行中のリクエストをインターセプトします
コピー&ペーストで画質が落ちる手動のスクリーンショットでは画像が圧縮されますソースから元の解像度で取得します
Apple の HEIC 形式多くのツールは HEIC/HEIF を処理できませんプラットフォームに対応した変換(sips/heif-convert)

クイックスタート

# Install
curl -fsSL "https://raw.githubusercontent.com/Dicklesworthstone/giil/main/install.sh?v=3.0.0" | bash

# Download single image
giil "https://share.icloud.com/photos/02cD9okNHvVd-uuDnPCH3ZEEA"

# JSON output (best for AI workflows)
giil "https://share.icloud.com/photos/..." --json

# Download entire album
giil "https://share.icloud.com/photos/..." --all --output ~/album

注: 初回の実行時に Playwright Chromium(約 200MB)がダウンロードされ、~/.cache/giil/ にキャッシュされます。

対応プラットフォーム

プラットフォームURL パターン方法ブラウザーが必要
iCloudshare.icloud.com/photos/*、icloud.com/photos/#*4 段階の取得戦略はい
Dropboxdropbox.com/s/*、dropbox.com/scl/fi/*curl による直接取得(raw=1)いいえ
Google Photosphotos.app.goo.gl/*、photos.google.com/share/*URL 抽出 + =s0 修飾子はい
Google Drivedrive.google.com/file/d/*、drive.google.com/open?id=*認証検出を含む複数段階の方法はい

Dropbox の高速経路: ブラウザー処理を介さず、curl で直接ダウンロードします。通常は 1〜2 秒で完了します。

Google Photos のフル解像度取得: CDN の URL に =s0 を自動的に追加し、最大解像度で取得します。

4 段階の取得戦略

giil は信頼性を最大限に高めるため、フォールバック戦略を実装しています。

1. ダウンロードボタン(最高品質)
  • 9 種類のセレクターパターンを使って、表示されているダウンロードボタンを検出します
  • クリックして、ブラウザーのダウンロードイベントを待ちます
  • 元のファイルを取得します(再エンコードによる画質の劣化はありません)
  • HEIC/HEIF のオリジナル画像にも対応します
2. ネットワークインターセプト(フル解像度)
  • すべての HTTP 応答を監視し、CDN パターン(cvws.icloud-content.com など)を探します
  • content-type でフィルタリングします(画像形式のみ)
  • 最大の画像バッファーを取得します(サムネイルを除外するため、しきい値は 10KB 超)
  • UI 要素が隠れている場合でも機能します
3. 要素のスクリーンショット
  • 10 種類のセレクターパターンを使って、画像要素を検索します
  • 要素が表示されていて、サイズが 100×100 ピクセル以上であることを確認します
  • 要素の PNG スクリーンショットを撮影します
4. ビューポートのスクリーンショット(最後の手段)
  • 表示されているビューポート(1920×1080)を取得します
  • ページが読み込まれれば必ず成功します
  • ページの状態をデバッグするのに便利です

コマンドリファレンス

基本的な使い方
giil <url> [options]
オプション
フラグデフォルト説明
--output DIR.出力ディレクトリ
--preserveoff元のバイト列を保持します(MozJPEG 圧縮をスキップします)
--convert FMT—変換先:jpeg、png、webp
--quality N85JPEG の品質(1~100)
--base64offbase64 を標準出力に出力します(ファイルは保存しません)
--jsonoffJSON メタデータを出力します
--alloffアルバム内のすべての写真をダウンロードします
--timeout N60ページ読み込みのタイムアウト時間(秒)
--debugoff失敗時にデバッグ用ファイルを保存します
--verboseoff詳細な進行状況を表示します
--traceoff詳細なデバッグ用に Playwright のトレースを有効にします
--print-urloff解決された CDN URL を出力します(ダウンロードしません)
--debug-dir DIR.デバッグ用ファイルのディレクトリ
--updateoff依存関係を強制的に再インストールします

出力モード

デフォルト:ファイルパス
giil "https://share.icloud.com/photos/XXX"
# stdout: /current/dir/icloud_20240115_143245.jpg

スクリプトでの使用:

IMAGE_PATH=$(giil "..." --output ~/Downloads 2>/dev/null)
JSON モード
giil "https://share.icloud.com/photos/XXX" --json

成功:

{
  "ok": true,
  "schema_version": "1",
  "platform": "icloud",
  "path": "/absolute/path/to/icloud_20240115_143245.jpg",
  "datetime": "2024-01-15T14:32:45.000Z",
  "sourceUrl": "https://cvws.icloud-content.com/...",
  "method": "network",
  "size": 245678,
  "width": 4032,
  "height": 3024
}

エラー:

{
  "ok": false,
  "schema_version": "1",
  "platform": "icloud",
  "error": {
    "code": "AUTH_REQUIRED",
    "message": "Login required - link is not publicly shared",
    "remediation": "The file is not publicly shared. The owner must enable public access."
  }
}
フィールド説明
methodキャプチャ方法:download、network、element-screenshot、viewport-screenshot、direct
error.codeエラーコード(終了コードを参照)
error.remediation推奨される修正方法
Base64 モード
# Decode to file
giil "..." --base64 | base64 -d > image.jpg

# Create data URI
echo "data:image/jpeg;base64,$(giil '...' --base64)" > uri.txt

# Pipe to API
giil "..." --base64 | curl -X POST -d @- https://api.example.com/upload
URL のみのモード
giil "https://share.icloud.com/photos/XXX" --print-url
# stdout: https://cvws.icloud-content.com/B/...

外部ダウンローダー、キャッシュ、デバッグに便利です。

アルバムモード

--all を指定すると、共有アルバム全体をダウンロードします:

giil "https://share.icloud.com/photos/XXX" --all --output ~/album
動作の仕組み
  1. アルバムページを読み込みます
  2. サムネイルのグリッドを検出します(11 種類のセレクター戦略)
  3. 各サムネイルについて、クリック → キャプチャ → 閉じる → 次へ進みます
  4. 写真ごとにパスまたは JSON を出力します
アルバムの機能
  • 堅牢性: 写真の取得に失敗しても、次の写真の処理を続けます
  • 連番ファイル名: 並び順を示す _001、_002 などを付けます
  • レート制限: 写真の間に 1 秒の待機時間を設けます(配慮のあるダウンロード)
  • 指数バックオフ: レート制限の兆候がある場合に自動で再試行します
アルバムの出力
# Default
/path/to/album/icloud_20240115_143245_001.jpg
/path/to/album/icloud_20240115_143246_002.jpg

# With --json
{"path": "...001.jpg", "method": "download", "width": 4032, ...}
{"path": "...002.jpg", "method": "network", "width": 3024, ...}

画像処理パイプライン

EXIF の日時抽出

ファイル名の生成に使用する優先順位:

  1. DateTimeOriginal(写真の撮影日時)
  2. CreateDate
  3. DateTimeDigitized
  4. ModifyDate
  5. 現在の時刻(フォールバック)
HEIC/HEIF の変換
プラットフォームツール備考
macOSsips標準搭載されており、常に利用できます
Linuxheif-convertlibheif-examples パッケージが必要です
# Install HEIC support on Linux
sudo apt-get install libheif-examples  # Debian/Ubuntu
sudo dnf install libheif-tools         # Fedora
MozJPEG 圧縮(デフォルト)

デフォルトでは、giil は最適なサイズと品質を実現するために MozJPEG で圧縮します:

  • 同等の品質の標準 JPEG より 40~50% 小さくなります
  • 品質 85(--quality で設定できます)
  • 元のバイト列を保持するには --preserve を使用します
ファイル名の形式
icloud_YYYYMMDD_HHMMSS[_NNN][_counter].jpg
        │              │      │
        │              │      └── Collision counter (if file exists)
        │              └── Album index (--all mode only)
        └── Date/time from EXIF or capture time

ダウンロードの検証

giil は、次の 3 段階でダウンロードを検証します:

1. Content-Type の検証

HTTP の Content-Type が想定される画像形式と一致するか検証します。

2. マジックバイトの検出

サーバーの申告内容にかかわらず、バイナリ署名を検証します:

形式マジックバイト
JPEGFF D8 FF
PNG89 50 4E 47
GIF47 49 46 38
WebPWEBP を含む RIFF コンテナー
HEIC/HEIFISO ベースメディアファイル(ftyp ボックス)
3. HTML エラーページの検出

画像ではなくエラーページを示す HTML コンテンツを拒否します。

終了コード

コード名前説明
0成功画像をキャプチャし、保存または出力しました
1キャプチャ失敗すべてのキャプチャ方法が失敗しました
2使用方法エラー引数が無効、または URL がありません
3依存関係エラーNode.js、Playwright、または Chromium の問題です
10ネットワークエラータイムアウト、DNS の失敗、またはホストに到達できません
11認証が必要ログインへのリダイレクト、パスワードが必要、または一般公開されていません
12見つかりませんリンクの期限切れ、ファイルの削除、または 404 です
13未対応の形式動画、Google ドキュメント、または画像以外のコンテンツです
20内部エラーgiil のバグです(報告してください!)

スクリプトでの使用:

giil "https://share.icloud.com/photos/XXX" 2>/dev/null
case $? in
    0) echo "Success!" ;;
    10) echo "Network issue - retry later" ;;
    11) echo "Link not public - ask owner to share" ;;
    12) echo "Link expired" ;;
    *) echo "Failed with code $?" ;;
esac

環境変数

ランタイム変数
変数説明デフォルト
XDG_CACHE_HOMEキャッシュの基本ディレクトリ~/.cache
GIIL_HOMEgiil のランタイムディレクトリ$XDG_CACHE_HOME/giil
PLAYWRIGHT_BROWSERS_PATHカスタム Chromium キャッシュ$GIIL_HOME/ms-playwright
GIIL_NO_GUMgum のスタイル設定を無効化未設定
GIIL_CHECK_UPDATESアップデート確認を有効化未設定
インストーラー変数
変数説明デフォルト
DESTカスタムインストールディレクトリ~/.local/bin
GIIL_SYSTEM/usr/local/bin にインストール未設定
GIIL_VERIFYSHA256 チェックサムを検証未設定
GIIL_VERSION特定のバージョンをインストール最新

ファイルの場所

パス用途
~/.local/bin/giilメインスクリプト
~/.cache/giil/ランタイムディレクトリ
~/.cache/giil/node_modules/Playwright、Sharp、exifr
~/.cache/giil/extractor.mjs生成された Node.js スクリプト
~/.cache/giil/ms-playwright/Chromium ブラウザーのキャッシュ
デバッグ用ファイル(--debug を指定して失敗した場合)
ファイル内容
giil_debug_<timestamp>.pngページ全体のスクリーンショット
giil_debug_<timestamp>.htmlページの DOM コンテンツ

パフォーマンス

フェーズ初回実行2 回目以降
Chromium のダウンロード30-60sスキップ(キャッシュ済み)
ブラウザーの起動2-3s2-3s
ページの読み込み3-10s3-10s
画像のキャプチャ1-5s1-5s
合計40-80s5-15s

Dropbox: 1-2 秒(ブラウザーを使わず、curl で直接処理)。

トラブルシューティング

「Auth required」エラー

リンクが一般公開されていません。所有者がクラウド設定で一般公開を有効にする必要があります。

タイムアウトエラー

タイムアウトを延長します:giil "..." --timeout 120

画像が誤っている/小さい

--debug を指定して実行し、ページの状態を確認します。デバッグ用ファイルを添えて問題を報告してください。

Linux で HEIC の変換に失敗する
sudo apt-get install libheif-examples  # Debian/Ubuntu
sudo dnf install libheif-tools         # Fedora
Chromium の起動に失敗する
giil "..." --update
# Or manually:
cd ~/.cache/giil && npx playwright install --with-deps chromium
デバッグ
# Verbose output
giil "..." --verbose

# Debug artifacts on failure
giil "..." --debug

# Playwright trace (generates trace.zip)
giil "..." --trace
npx playwright show-trace ~/.cache/giil/trace.zip

インストール

# One-liner (recommended)
curl -fsSL "https://raw.githubusercontent.com/Dicklesworthstone/giil/main/install.sh?v=3.0.0" | bash

# Verified installation
GIIL_VERIFY=1 curl -fsSL .../install.sh | bash

# System-wide
GIIL_SYSTEM=1 curl -fsSL .../install.sh | bash

# Manual
curl -fsSL https://raw.githubusercontent.com/Dicklesworthstone/giil/main/giil -o ~/.local/bin/giil
chmod +x ~/.local/bin/giil

アンインストール

rm ~/.local/bin/giil
rm -rf ~/.cache/giil
rm -rf ~/.cache/ms-playwright  # If no other Playwright tools

セキュリティとプライバシー

  • ローカルで実行: すべての処理はお使いのマシン上で行われます
  • テレメトリなし: クラウドサービス以外にはデータを送信しません
  • 認証情報を保存しない: 一般公開共有の仕組みを使用します
  • Cookie を保存しない: ブラウザーコンテキストは一時的なものです
  • 一時ファイルのクリーンアップ: ダウンロードしたファイルは処理後に削除されます

Flywheel との連携

ツール連携方法
Claude CodeSSH 経由でビジュアルデバッグ用のスクリーンショットをダウンロード
NTMマルチエージェントセッション間で画像を共有
Agent Mailダウンロードした画像をエージェントのメッセージに添付
CASS画像のコンテキストとして giil を使用したセッションを検索

コメント