{
  "schemaVersion": "1.0",
  "item": {
    "slug": "ephemeral-media-hosting",
    "name": "Ephemeral Media Hosting",
    "source": "tencent",
    "type": "skill",
    "category": "通讯协作",
    "sourceUrl": "https://clawhub.ai/Byron-McKeeby/ephemeral-media-hosting",
    "canonicalUrl": "https://clawhub.ai/Byron-McKeeby/ephemeral-media-hosting",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/ephemeral-media-hosting",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=ephemeral-media-hosting",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-23T16:43:11.935Z",
      "expiresAt": "2026-04-30T16:43:11.935Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
        "contentDisposition": "attachment; filename=\"4claw-imageboard-1.0.1.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/ephemeral-media-hosting"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/ephemeral-media-hosting",
    "agentPageUrl": "https://openagent3.xyz/skills/ephemeral-media-hosting/agent",
    "manifestUrl": "https://openagent3.xyz/skills/ephemeral-media-hosting/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/ephemeral-media-hosting/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "一時メディア・ホスティング",
        "body": "チャット共有向けの自動削除機能付きメディアディレクトリシステム。7日間の自動保持、MIME検証、fetch-image.shパターン、nginx設定の包括的ガイドです。"
      },
      {
        "title": "ディレクトリ構造",
        "body": "/var/www/media/\n├── temp/                  # 一時ファイル（7日保持）\n├── uploads/               # アップロード受付\n├── processed/             # 処理済みファイル  \n├── logs/                  # アクセス・処理ログ\n└── scripts/               # 管理スクリプト群"
      },
      {
        "title": "ディレクトリ初期化",
        "body": "#!/bin/bash\n# media-setup.sh\n\nsetup_media_hosting() {\n    local media_root=\"/var/www/media\"\n    local nginx_user=\"www-data\"\n    \n    echo \"=== メディアホスティング初期設定 ===\"\n    \n    # ディレクトリ作成\n    sudo mkdir -p \"$media_root\"/{temp,uploads,processed,logs,scripts}\n    \n    # 権限設定\n    sudo chown -R \"$nginx_user:$nginx_user\" \"$media_root\"\n    sudo chmod -R 755 \"$media_root\"\n    sudo chmod 775 \"$media_root\"/{uploads,temp,processed}\n    \n    # 設定ファイル作成\n    cat > \"$media_root/config.env\" << 'EOF'\n# メディアホスティング設定\nMAX_FILE_SIZE=10M\nRETENTION_DAYS=7\nALLOWED_MIMES=\"image/jpeg,image/png,image/gif,image/webp,video/mp4,video/webm\"\nUPLOAD_RATE_LIMIT=100\nEOF\n    \n    echo \"初期設定完了: $media_root\"\n}\n\n# 実行\nsetup_media_hosting"
      },
      {
        "title": "nginx設定",
        "body": "# /etc/nginx/sites-available/ephemeral-media\nserver {\n    listen 80;\n    server_name media.yourdomain.com;\n    \n    # セキュリティヘッダー\n    add_header X-Content-Type-Options \"nosniff\";\n    add_header X-Frame-Options \"DENY\";\n    add_header X-XSS-Protection \"1; mode=block\";\n    add_header Content-Security-Policy \"default-src 'none'; img-src 'self'; media-src 'self';\";\n    \n    # ファイルサイズ制限\n    client_max_body_size 10M;\n    \n    # メディアルート\n    root /var/www/media;\n    index index.html;\n    \n    # 一時ファイル配信\n    location /temp/ {\n        alias /var/www/media/temp/;\n        \n        # キャッシュヘッダー（短期間）\n        expires 1h;\n        add_header Cache-Control \"public, must-revalidate\";\n        \n        # セキュリティ\n        add_header X-Ephemeral \"true\";\n        add_header X-Expires-After \"7-days\";\n        \n        # ファイル存在確認\n        try_files $uri @not_found;\n        \n        # ログ記録\n        access_log /var/log/nginx/media-access.log combined;\n    }\n    \n    # アップロード処理\n    location /upload {\n        # POST のみ許可\n        limit_except POST { deny all; }\n        \n        # レート制限\n        limit_req zone=upload_zone burst=5 nodelay;\n        \n        # PHP-FPM等へプロキシ\n        proxy_pass http://127.0.0.1:8080/upload;\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        \n        # アップロードログ\n        access_log /var/log/nginx/upload-access.log upload_format;\n    }\n    \n    # 直接ファイル配信\n    location ~* \\.(jpg|jpeg|png|gif|webp|mp4|webm)$ {\n        # セキュリティチェック\n        if ($request_uri ~* \"\\.\\./\") {\n            return 403;\n        }\n        \n        # MIME設定\n        location ~* \\.jpg$ { add_header Content-Type \"image/jpeg\"; }\n        location ~* \\.png$ { add_header Content-Type \"image/png\"; }\n        location ~* \\.gif$ { add_header Content-Type \"image/gif\"; }\n        location ~* \\.webp$ { add_header Content-Type \"image/webp\"; }\n        location ~* \\.mp4$ { add_header Content-Type \"video/mp4\"; }\n        location ~* \\.webm$ { add_header Content-Type \"video/webm\"; }\n        \n        # レスポンシブ画像対応\n        expires 1d;\n        add_header Vary \"Accept-Encoding\";\n    }\n    \n    # エラーページ\n    location @not_found {\n        return 404 \"ファイルが見つからないか、有効期限が切れています\";\n    }\n    \n    # メインページ（アップロードフォーム等）\n    location = / {\n        try_files /index.html @upload_form;\n    }\n    \n    location @upload_form {\n        return 200 '<!DOCTYPE html>\n<html><head><title>一時メディア共有</title></head>\n<body>\n<h1>一時ファイル共有</h1>\n<p>7日間で自動削除されます。</p>\n<form action=\"/upload\" method=\"post\" enctype=\"multipart/form-data\">\n<input type=\"file\" name=\"media\" accept=\"image/*,video/*\" required>\n<button type=\"submit\">アップロード</button>\n</form>\n</body></html>';\n        add_header Content-Type \"text/html; charset=utf-8\";\n    }\n}\n\n# レート制限設定\nhttp {\n    limit_req_zone $binary_remote_addr zone=upload_zone:10m rate=10r/m;\n    \n    # カスタムログフォーマット\n    log_format upload_format '$remote_addr - $remote_user [$time_local] '\n                            '\"$request\" $status $body_bytes_sent '\n                            '\"$http_referer\" \"$http_user_agent\" '\n                            'upload_size:$content_length';\n}"
      },
      {
        "title": "自動削除cron",
        "body": "#!/bin/bash\n# cleanup-ephemeral-media.sh\n\ncleanup_old_files() {\n    local media_root=\"/var/www/media\"\n    local retention_days=\"7\"\n    local log_file=\"$media_root/logs/cleanup.log\"\n    \n    echo \"$(date): 一時ファイル削除開始\" >> \"$log_file\"\n    \n    # 7日前より古いファイルを削除\n    local deleted_count=0\n    \n    find \"$media_root/temp\" -type f -mtime +\"$retention_days\" -print0 | \\\n    while IFS= read -r -d '' file; do\n        local file_size=\"$(stat -c%s \"$file\")\"\n        local file_name=\"$(basename \"$file\")\"\n        \n        if rm \"$file\" 2>/dev/null; then\n            echo \"$(date): 削除 $file_name ($file_size bytes)\" >> \"$log_file\"\n            ((deleted_count++))\n        else\n            echo \"$(date): 削除失敗 $file_name\" >> \"$log_file\"\n        fi\n    done\n    \n    # 空ディレクトリ削除\n    find \"$media_root/temp\" -type d -empty -delete 2>/dev/null\n    \n    # 統計ログ\n    local total_files=\"$(find \"$media_root/temp\" -type f | wc -l)\"\n    local total_size=\"$(du -sh \"$media_root/temp\" | cut -f1)\"\n    \n    echo \"$(date): 削除完了 - 残存ファイル: $total_files, 総サイズ: $total_size\" >> \"$log_file\"\n    \n    # ログローテーション（30日以上のログ削除）\n    find \"$media_root/logs\" -name \"*.log\" -mtime +30 -delete\n}\n\n# crontab設定例\ninstall_cron() {\n    local cron_entry=\"0 2 * * * /var/www/media/scripts/cleanup-ephemeral-media.sh\"\n    \n    # 現在のcrontab取得・更新\n    (crontab -l 2>/dev/null; echo \"$cron_entry\") | sort -u | crontab -\n    \n    echo \"cron設定完了: 毎日2時に実行\"\n}\n\ncleanup_old_files"
      },
      {
        "title": "MIME検証システム",
        "body": "#!/bin/bash\n# mime-validator.sh\n\nvalidate_file_mime() {\n    local file_path=\"$1\"\n    local allowed_mimes=\"$2\"\n    \n    # 実際のMIMEタイプ検出\n    local detected_mime=\"$(file --mime-type -b \"$file_path\")\"\n    local file_extension=\"${file_path##*.}\"\n    \n    echo \"=== MIME検証: $(basename \"$file_path\") ===\"\n    echo \"検出MIME: $detected_mime\"\n    echo \"拡張子: $file_extension\"\n    \n    # 許可リストチェック\n    if echo \"$allowed_mimes\" | grep -q \"$detected_mime\"; then\n        echo \"✓ MIME許可済み\"\n    else\n        echo \"✗ MIME不許可\"\n        return 1\n    fi\n    \n    # 拡張子とMIMEの整合性チェック\n    case \"$detected_mime\" in\n        \"image/jpeg\")\n            [[ \"$file_extension\" =~ ^(jpg|jpeg)$ ]] || { echo \"✗ 拡張子不整合\"; return 1; } ;;\n        \"image/png\")\n            [[ \"$file_extension\" == \"png\" ]] || { echo \"✗ 拡張子不整合\"; return 1; } ;;\n        \"image/gif\")\n            [[ \"$file_extension\" == \"gif\" ]] || { echo \"✗ 拡張子不整合\"; return 1; } ;;\n        \"image/webp\")\n            [[ \"$file_extension\" == \"webp\" ]] || { echo \"✗ 拡張子不整合\"; return 1; } ;;\n        \"video/mp4\")\n            [[ \"$file_extension\" == \"mp4\" ]] || { echo \"✗ 拡張子不整合\"; return 1; } ;;\n        \"video/webm\")\n            [[ \"$file_extension\" == \"webm\" ]] || { echo \"✗ 拡張子不整合\"; return 1; } ;;\n        *)\n            echo \"✗ 未対応MIME\"; return 1 ;;\n    esac\n    \n    echo \"✓ 拡張子整合性OK\"\n    \n    # ファイルサイズチェック\n    local file_size=\"$(stat -c%s \"$file_path\")\"\n    local max_size=\"$((10 * 1024 * 1024))\"  # 10MB\n    \n    if [[ \"$file_size\" -gt \"$max_size\" ]]; then\n        echo \"✗ ファイルサイズ超過 ($file_size > $max_size)\"\n        return 1\n    fi\n    \n    echo \"✓ ファイルサイズOK ($file_size bytes)\"\n    return 0\n}\n\n# ウイルススキャン（ClamAV使用）\nscan_for_malware() {\n    local file_path=\"$1\"\n    \n    if command -v clamscan >/dev/null; then\n        echo \"ウイルススキャン実行中...\"\n        if clamscan --quiet \"$file_path\"; then\n            echo \"✓ スキャン正常\"\n            return 0\n        else\n            echo \"✗ 脅威検出またはスキャンエラー\"\n            return 1\n        fi\n    else\n        echo \"⚠ ClamAV未インストール。スキャンスキップ。\"\n        return 0\n    fi\n}\n\n# 使用例\nvalidate_file_mime \"/tmp/uploaded-image.jpg\" \"image/jpeg,image/png,image/gif,image/webp,video/mp4,video/webm\""
      },
      {
        "title": "外部画像取得システム",
        "body": "#!/bin/bash\n# fetch-image.sh\n\nfetch_and_cache_image() {\n    local url=\"$1\"\n    local media_root=\"/var/www/media\"\n    local temp_dir=\"$media_root/temp\"\n    \n    # URL検証\n    if ! echo \"$url\" | grep -qE '^https?://'; then\n        echo \"エラー: 無効なURL\"\n        return 1\n    fi\n    \n    # URLハッシュ生成（ファイル名用）\n    local url_hash=\"$(echo -n \"$url\" | sha256sum | cut -d' ' -f1)\"\n    local timestamp=\"$(date +%s)\"\n    \n    # ファイル名推測\n    local suggested_ext=\"jpg\"\n    case \"$url\" in\n        *.png*) suggested_ext=\"png\" ;;\n        *.gif*) suggested_ext=\"gif\" ;;\n        *.webp*) suggested_ext=\"webp\" ;;\n        *.jpeg*|*.jpg*) suggested_ext=\"jpg\" ;;\n    esac\n    \n    local output_file=\"$temp_dir/${timestamp}_${url_hash:0:12}.$suggested_ext\"\n    \n    echo \"=== 画像取得: $url ===\"\n    echo \"出力先: $(basename \"$output_file\")\"\n    \n    # 取得実行\n    if curl -L --max-time 30 --max-filesize 10485760 \\\n           -H \"User-Agent: EphemeralMediaFetcher/1.0\" \\\n           -o \"$output_file\" \\\n           \"$url\"; then\n        echo \"✓ ダウンロード完了\"\n    else\n        echo \"✗ ダウンロード失敗\"\n        [[ -f \"$output_file\" ]] && rm \"$output_file\"\n        return 1\n    fi\n    \n    # MIME検証\n    if ! validate_file_mime \"$output_file\" \"image/jpeg,image/png,image/gif,image/webp\"; then\n        echo \"✗ MIME検証失敗\"\n        rm \"$output_file\"\n        return 1\n    fi\n    \n    # ファイルサイズ確認\n    local file_size=\"$(stat -c%s \"$output_file\")\"\n    echo \"ファイルサイズ: $file_size bytes\"\n    \n    # 公開URL生成\n    local public_url=\"https://media.yourdomain.com/temp/$(basename \"$output_file\")\"\n    echo \"公開URL: $public_url\"\n    \n    # メタデータファイル作成\n    cat > \"${output_file}.meta\" << EOF\n{\n    \"source_url\": \"$url\",\n    \"fetch_time\": \"$timestamp\",\n    \"expires_at\": \"$((timestamp + 7 * 86400))\",\n    \"mime_type\": \"$(file --mime-type -b \"$output_file\")\",\n    \"file_size\": $file_size,\n    \"public_url\": \"$public_url\"\n}\nEOF\n    \n    echo \"$public_url\"\n    return 0\n}\n\n# 画像リサイズ（ImageMagick）\nresize_image() {\n    local input_file=\"$1\"\n    local max_width=\"${2:-800}\"\n    local quality=\"${3:-85}\"\n    \n    if ! command -v convert >/dev/null; then\n        echo \"ImageMagick未インストール。リサイズスキップ。\"\n        return 0\n    fi\n    \n    local output_file=\"${input_file%.*}_resized.${input_file##*.}\"\n    \n    convert \"$input_file\" \\\n        -resize \"${max_width}x${max_width}>\" \\\n        -quality \"$quality\" \\\n        -strip \\\n        \"$output_file\"\n    \n    if [[ -f \"$output_file\" ]]; then\n        mv \"$output_file\" \"$input_file\"\n        echo \"✓ リサイズ完了: ${max_width}px以下, 品質${quality}%\"\n    fi\n}\n\n# バッチ処理用\nbatch_fetch() {\n    local url_list_file=\"$1\"\n    \n    while IFS= read -r url; do\n        [[ -z \"$url\" || \"$url\" =~ ^# ]] && continue\n        \n        echo \"--- 処理中: $url ---\"\n        if fetch_and_cache_image \"$url\"; then\n            echo \"✓ 成功\"\n        else\n            echo \"✗ 失敗\"\n        fi\n        echo \"\"\n        \n        # レート制限（1秒待機）\n        sleep 1\n    done < \"$url_list_file\"\n}\n\n# 使用例\n# fetch_and_cache_image \"https://example.com/image.jpg\"\n# batch_fetch \"urls.txt\""
      },
      {
        "title": "シンプルアップロードハンドラ",
        "body": "<?php\n// upload.php - シンプルなアップロード処理\n\nheader('Content-Type: application/json; charset=utf-8');\n\n// エラーハンドリング\nfunction sendError($message, $code = 400) {\n    http_response_code($code);\n    echo json_encode(['error' => $message]);\n    exit;\n}\n\n// 設定\n$config = [\n    'upload_dir' => '/var/www/media/temp/',\n    'max_size' => 10 * 1024 * 1024, // 10MB\n    'allowed_types' => ['image/jpeg', 'image/png', 'image/gif', 'image/webp', 'video/mp4', 'video/webm'],\n    'retention_days' => 7\n];\n\n// POST確認\nif ($_SERVER['REQUEST_METHOD'] !== 'POST') {\n    sendError('POST method required', 405);\n}\n\n// ファイルアップロード確認\nif (!isset($_FILES['media']) || $_FILES['media']['error'] !== UPLOAD_ERR_OK) {\n    sendError('アップロードエラー: ' . ($_FILES['media']['error'] ?? 'ファイルなし'));\n}\n\n$uploaded = $_FILES['media'];\n\n// サイズチェック\nif ($uploaded['size'] > $config['max_size']) {\n    sendError('ファイルサイズ制限超過: ' . round($uploaded['size'] / 1024 / 1024, 2) . 'MB');\n}\n\n// MIMEタイプ確認\n$finfo = finfo_open(FILEINFO_MIME_TYPE);\n$detected_mime = finfo_file($finfo, $uploaded['tmp_name']);\nfinfo_close($finfo);\n\nif (!in_array($detected_mime, $config['allowed_types'])) {\n    sendError('サポートされていないファイル形式: ' . $detected_mime);\n}\n\n// 拡張子決定\n$extension_map = [\n    'image/jpeg' => 'jpg',\n    'image/png' => 'png', \n    'image/gif' => 'gif',\n    'image/webp' => 'webp',\n    'video/mp4' => 'mp4',\n    'video/webm' => 'webm'\n];\n\n$extension = $extension_map[$detected_mime];\n\n// ファイル名生成\n$timestamp = time();\n$random = bin2hex(random_bytes(6));\n$filename = sprintf('%d_%s.%s', $timestamp, $random, $extension);\n$filepath = $config['upload_dir'] . $filename;\n\n// ファイル移動\nif (!move_uploaded_file($uploaded['tmp_name'], $filepath)) {\n    sendError('ファイル保存エラー');\n}\n\n// 権限設定\nchmod($filepath, 0644);\n\n// メタデータ保存\n$metadata = [\n    'filename' => $filename,\n    'original_name' => $uploaded['name'],\n    'mime_type' => $detected_mime,\n    'size' => $uploaded['size'],\n    'upload_time' => $timestamp,\n    'expires_at' => $timestamp + ($config['retention_days'] * 86400),\n    'upload_ip' => $_SERVER['REMOTE_ADDR'] ?? 'unknown'\n];\n\nfile_put_contents($filepath . '.meta', json_encode($metadata, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));\n\n// 公開URL\n$public_url = 'https://media.yourdomain.com/temp/' . $filename;\n\n// ログ記録\n$log_entry = sprintf(\n    \"[%s] アップロード成功: %s (%s, %d bytes) from %s\\n\",\n    date('Y-m-d H:i:s'),\n    $filename,\n    $detected_mime,\n    $uploaded['size'],\n    $_SERVER['REMOTE_ADDR'] ?? 'unknown'\n);\nfile_put_contents('/var/www/media/logs/uploads.log', $log_entry, FILE_APPEND | LOCK_EX);\n\n// レスポンス\necho json_encode([\n    'success' => true,\n    'filename' => $filename,\n    'url' => $public_url,\n    'size' => $uploaded['size'],\n    'type' => $detected_mime,\n    'expires_in' => $config['retention_days'] . ' days',\n    'expires_at' => date('Y-m-d H:i:s', $metadata['expires_at'])\n]);\n?>"
      },
      {
        "title": "使用統計収集",
        "body": "#!/bin/bash\n# media-stats.sh\n\ngenerate_media_stats() {\n    local media_root=\"/var/www/media\"\n    local stats_file=\"$media_root/logs/daily-stats.json\"\n    local date=\"$(date -I)\"\n    \n    echo \"=== メディア統計生成: $date ===\"\n    \n    # ファイル数・サイズ統計\n    local temp_files=\"$(find \"$media_root/temp\" -type f -name \"*.jpg\" -o -name \"*.png\" -o -name \"*.gif\" -o -name \"*.webp\" -o -name \"*.mp4\" -o -name \"*.webm\" | wc -l)\"\n    local temp_size=\"$(du -sb \"$media_root/temp\" 2>/dev/null | cut -f1)\"\n    \n    # 今日のアップロード数\n    local today_uploads=\"$(grep \"$(date '+%Y-%m-%d')\" \"$media_root/logs/uploads.log\" 2>/dev/null | wc -l)\"\n    \n    # アクセス統計\n    local today_requests=\"$(grep \"$(date '+%d/%b/%Y')\" /var/log/nginx/media-access.log 2>/dev/null | wc -l)\"\n    local unique_ips=\"$(grep \"$(date '+%d/%b/%Y')\" /var/log/nginx/media-access.log 2>/dev/null | awk '{print $1}' | sort -u | wc -l)\"\n    \n    # JSON統計出力\n    cat > \"$stats_file\" << EOF\n{\n    \"date\": \"$date\",\n    \"files\": {\n        \"total_count\": $temp_files,\n        \"total_size_bytes\": $temp_size,\n        \"total_size_mb\": $(echo \"scale=2; $temp_size / 1024 / 1024\" | bc -l)\n    },\n    \"daily\": {\n        \"uploads\": $today_uploads,\n        \"requests\": $today_requests,\n        \"unique_visitors\": $unique_ips\n    },\n    \"retention\": {\n        \"cleanup_files\": $(find \"$media_root/temp\" -mtime +7 | wc -l),\n        \"oldest_file\": \"$(find \"$media_root/temp\" -type f -printf '%T@ %p\\n' | sort -n | head -1 | cut -d' ' -f2- | xargs -r basename)\"\n    }\n}\nEOF\n    \n    echo \"統計ファイル更新: $stats_file\"\n    \n    # 簡易レポート表示\n    echo \"\"\n    echo \"=== 本日の概要 ===\"\n    echo \"現在のファイル数: $temp_files\"\n    echo \"使用容量: $(echo \"scale=2; $temp_size / 1024 / 1024\" | bc -l) MB\"\n    echo \"今日のアップロード: $today_uploads\"\n    echo \"今日のアクセス: $today_requests\"\n    echo \"ユニーク訪問者: $unique_ips\"\n}\n\n# アラート確認\ncheck_alerts() {\n    local media_root=\"/var/www/media\"\n    local temp_size=\"$(du -sb \"$media_root/temp\" 2>/dev/null | cut -f1)\"\n    local max_size=\"$((1024 * 1024 * 1024))\"  # 1GB\n    \n    if [[ \"$temp_size\" -gt \"$max_size\" ]]; then\n        echo \"⚠️ 警告: 使用容量が1GBを超えています ($temp_size bytes)\"\n        \n        # 古いファイル自動削除\n        find \"$media_root/temp\" -type f -mtime +3 -delete\n        echo \"3日以上経過したファイルを削除しました\"\n    fi\n    \n    # 破損ファイルチェック\n    find \"$media_root/temp\" -type f \\( -name \"*.jpg\" -o -name \"*.png\" \\) | while read file; do\n        if ! file \"$file\" | grep -q \"image data\"; then\n            echo \"⚠️ 破損ファイル検出: $(basename \"$file\")\"\n            rm \"$file\"\n        fi\n    done\n}\n\ngenerate_media_stats\ncheck_alerts\n\nコンテンツ審査と高度な無害化については太郎書館を参照。"
      }
    ],
    "body": "一時メディア・ホスティング\n\nチャット共有向けの自動削除機能付きメディアディレクトリシステム。7日間の自動保持、MIME検証、fetch-image.shパターン、nginx設定の包括的ガイドです。\n\nシステム構成\nディレクトリ構造\n/var/www/media/\n├── temp/                  # 一時ファイル（7日保持）\n├── uploads/               # アップロード受付\n├── processed/             # 処理済みファイル  \n├── logs/                  # アクセス・処理ログ\n└── scripts/               # 管理スクリプト群\n\n基本セットアップ\nディレクトリ初期化\n#!/bin/bash\n# media-setup.sh\n\nsetup_media_hosting() {\n    local media_root=\"/var/www/media\"\n    local nginx_user=\"www-data\"\n    \n    echo \"=== メディアホスティング初期設定 ===\"\n    \n    # ディレクトリ作成\n    sudo mkdir -p \"$media_root\"/{temp,uploads,processed,logs,scripts}\n    \n    # 権限設定\n    sudo chown -R \"$nginx_user:$nginx_user\" \"$media_root\"\n    sudo chmod -R 755 \"$media_root\"\n    sudo chmod 775 \"$media_root\"/{uploads,temp,processed}\n    \n    # 設定ファイル作成\n    cat > \"$media_root/config.env\" << 'EOF'\n# メディアホスティング設定\nMAX_FILE_SIZE=10M\nRETENTION_DAYS=7\nALLOWED_MIMES=\"image/jpeg,image/png,image/gif,image/webp,video/mp4,video/webm\"\nUPLOAD_RATE_LIMIT=100\nEOF\n    \n    echo \"初期設定完了: $media_root\"\n}\n\n# 実行\nsetup_media_hosting\n\nnginx設定\n# /etc/nginx/sites-available/ephemeral-media\nserver {\n    listen 80;\n    server_name media.yourdomain.com;\n    \n    # セキュリティヘッダー\n    add_header X-Content-Type-Options \"nosniff\";\n    add_header X-Frame-Options \"DENY\";\n    add_header X-XSS-Protection \"1; mode=block\";\n    add_header Content-Security-Policy \"default-src 'none'; img-src 'self'; media-src 'self';\";\n    \n    # ファイルサイズ制限\n    client_max_body_size 10M;\n    \n    # メディアルート\n    root /var/www/media;\n    index index.html;\n    \n    # 一時ファイル配信\n    location /temp/ {\n        alias /var/www/media/temp/;\n        \n        # キャッシュヘッダー（短期間）\n        expires 1h;\n        add_header Cache-Control \"public, must-revalidate\";\n        \n        # セキュリティ\n        add_header X-Ephemeral \"true\";\n        add_header X-Expires-After \"7-days\";\n        \n        # ファイル存在確認\n        try_files $uri @not_found;\n        \n        # ログ記録\n        access_log /var/log/nginx/media-access.log combined;\n    }\n    \n    # アップロード処理\n    location /upload {\n        # POST のみ許可\n        limit_except POST { deny all; }\n        \n        # レート制限\n        limit_req zone=upload_zone burst=5 nodelay;\n        \n        # PHP-FPM等へプロキシ\n        proxy_pass http://127.0.0.1:8080/upload;\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        \n        # アップロードログ\n        access_log /var/log/nginx/upload-access.log upload_format;\n    }\n    \n    # 直接ファイル配信\n    location ~* \\.(jpg|jpeg|png|gif|webp|mp4|webm)$ {\n        # セキュリティチェック\n        if ($request_uri ~* \"\\.\\./\") {\n            return 403;\n        }\n        \n        # MIME設定\n        location ~* \\.jpg$ { add_header Content-Type \"image/jpeg\"; }\n        location ~* \\.png$ { add_header Content-Type \"image/png\"; }\n        location ~* \\.gif$ { add_header Content-Type \"image/gif\"; }\n        location ~* \\.webp$ { add_header Content-Type \"image/webp\"; }\n        location ~* \\.mp4$ { add_header Content-Type \"video/mp4\"; }\n        location ~* \\.webm$ { add_header Content-Type \"video/webm\"; }\n        \n        # レスポンシブ画像対応\n        expires 1d;\n        add_header Vary \"Accept-Encoding\";\n    }\n    \n    # エラーページ\n    location @not_found {\n        return 404 \"ファイルが見つからないか、有効期限が切れています\";\n    }\n    \n    # メインページ（アップロードフォーム等）\n    location = / {\n        try_files /index.html @upload_form;\n    }\n    \n    location @upload_form {\n        return 200 '<!DOCTYPE html>\n<html><head><title>一時メディア共有</title></head>\n<body>\n<h1>一時ファイル共有</h1>\n<p>7日間で自動削除されます。</p>\n<form action=\"/upload\" method=\"post\" enctype=\"multipart/form-data\">\n<input type=\"file\" name=\"media\" accept=\"image/*,video/*\" required>\n<button type=\"submit\">アップロード</button>\n</form>\n</body></html>';\n        add_header Content-Type \"text/html; charset=utf-8\";\n    }\n}\n\n# レート制限設定\nhttp {\n    limit_req_zone $binary_remote_addr zone=upload_zone:10m rate=10r/m;\n    \n    # カスタムログフォーマット\n    log_format upload_format '$remote_addr - $remote_user [$time_local] '\n                            '\"$request\" $status $body_bytes_sent '\n                            '\"$http_referer\" \"$http_user_agent\" '\n                            'upload_size:$content_length';\n}\n\nファイル管理システム\n自動削除cron\n#!/bin/bash\n# cleanup-ephemeral-media.sh\n\ncleanup_old_files() {\n    local media_root=\"/var/www/media\"\n    local retention_days=\"7\"\n    local log_file=\"$media_root/logs/cleanup.log\"\n    \n    echo \"$(date): 一時ファイル削除開始\" >> \"$log_file\"\n    \n    # 7日前より古いファイルを削除\n    local deleted_count=0\n    \n    find \"$media_root/temp\" -type f -mtime +\"$retention_days\" -print0 | \\\n    while IFS= read -r -d '' file; do\n        local file_size=\"$(stat -c%s \"$file\")\"\n        local file_name=\"$(basename \"$file\")\"\n        \n        if rm \"$file\" 2>/dev/null; then\n            echo \"$(date): 削除 $file_name ($file_size bytes)\" >> \"$log_file\"\n            ((deleted_count++))\n        else\n            echo \"$(date): 削除失敗 $file_name\" >> \"$log_file\"\n        fi\n    done\n    \n    # 空ディレクトリ削除\n    find \"$media_root/temp\" -type d -empty -delete 2>/dev/null\n    \n    # 統計ログ\n    local total_files=\"$(find \"$media_root/temp\" -type f | wc -l)\"\n    local total_size=\"$(du -sh \"$media_root/temp\" | cut -f1)\"\n    \n    echo \"$(date): 削除完了 - 残存ファイル: $total_files, 総サイズ: $total_size\" >> \"$log_file\"\n    \n    # ログローテーション（30日以上のログ削除）\n    find \"$media_root/logs\" -name \"*.log\" -mtime +30 -delete\n}\n\n# crontab設定例\ninstall_cron() {\n    local cron_entry=\"0 2 * * * /var/www/media/scripts/cleanup-ephemeral-media.sh\"\n    \n    # 現在のcrontab取得・更新\n    (crontab -l 2>/dev/null; echo \"$cron_entry\") | sort -u | crontab -\n    \n    echo \"cron設定完了: 毎日2時に実行\"\n}\n\ncleanup_old_files\n\nMIME検証システム\n#!/bin/bash\n# mime-validator.sh\n\nvalidate_file_mime() {\n    local file_path=\"$1\"\n    local allowed_mimes=\"$2\"\n    \n    # 実際のMIMEタイプ検出\n    local detected_mime=\"$(file --mime-type -b \"$file_path\")\"\n    local file_extension=\"${file_path##*.}\"\n    \n    echo \"=== MIME検証: $(basename \"$file_path\") ===\"\n    echo \"検出MIME: $detected_mime\"\n    echo \"拡張子: $file_extension\"\n    \n    # 許可リストチェック\n    if echo \"$allowed_mimes\" | grep -q \"$detected_mime\"; then\n        echo \"✓ MIME許可済み\"\n    else\n        echo \"✗ MIME不許可\"\n        return 1\n    fi\n    \n    # 拡張子とMIMEの整合性チェック\n    case \"$detected_mime\" in\n        \"image/jpeg\")\n            [[ \"$file_extension\" =~ ^(jpg|jpeg)$ ]] || { echo \"✗ 拡張子不整合\"; return 1; } ;;\n        \"image/png\")\n            [[ \"$file_extension\" == \"png\" ]] || { echo \"✗ 拡張子不整合\"; return 1; } ;;\n        \"image/gif\")\n            [[ \"$file_extension\" == \"gif\" ]] || { echo \"✗ 拡張子不整合\"; return 1; } ;;\n        \"image/webp\")\n            [[ \"$file_extension\" == \"webp\" ]] || { echo \"✗ 拡張子不整合\"; return 1; } ;;\n        \"video/mp4\")\n            [[ \"$file_extension\" == \"mp4\" ]] || { echo \"✗ 拡張子不整合\"; return 1; } ;;\n        \"video/webm\")\n            [[ \"$file_extension\" == \"webm\" ]] || { echo \"✗ 拡張子不整合\"; return 1; } ;;\n        *)\n            echo \"✗ 未対応MIME\"; return 1 ;;\n    esac\n    \n    echo \"✓ 拡張子整合性OK\"\n    \n    # ファイルサイズチェック\n    local file_size=\"$(stat -c%s \"$file_path\")\"\n    local max_size=\"$((10 * 1024 * 1024))\"  # 10MB\n    \n    if [[ \"$file_size\" -gt \"$max_size\" ]]; then\n        echo \"✗ ファイルサイズ超過 ($file_size > $max_size)\"\n        return 1\n    fi\n    \n    echo \"✓ ファイルサイズOK ($file_size bytes)\"\n    return 0\n}\n\n# ウイルススキャン（ClamAV使用）\nscan_for_malware() {\n    local file_path=\"$1\"\n    \n    if command -v clamscan >/dev/null; then\n        echo \"ウイルススキャン実行中...\"\n        if clamscan --quiet \"$file_path\"; then\n            echo \"✓ スキャン正常\"\n            return 0\n        else\n            echo \"✗ 脅威検出またはスキャンエラー\"\n            return 1\n        fi\n    else\n        echo \"⚠ ClamAV未インストール。スキャンスキップ。\"\n        return 0\n    fi\n}\n\n# 使用例\nvalidate_file_mime \"/tmp/uploaded-image.jpg\" \"image/jpeg,image/png,image/gif,image/webp,video/mp4,video/webm\"\n\nfetch-image.sh パターン\n外部画像取得システム\n#!/bin/bash\n# fetch-image.sh\n\nfetch_and_cache_image() {\n    local url=\"$1\"\n    local media_root=\"/var/www/media\"\n    local temp_dir=\"$media_root/temp\"\n    \n    # URL検証\n    if ! echo \"$url\" | grep -qE '^https?://'; then\n        echo \"エラー: 無効なURL\"\n        return 1\n    fi\n    \n    # URLハッシュ生成（ファイル名用）\n    local url_hash=\"$(echo -n \"$url\" | sha256sum | cut -d' ' -f1)\"\n    local timestamp=\"$(date +%s)\"\n    \n    # ファイル名推測\n    local suggested_ext=\"jpg\"\n    case \"$url\" in\n        *.png*) suggested_ext=\"png\" ;;\n        *.gif*) suggested_ext=\"gif\" ;;\n        *.webp*) suggested_ext=\"webp\" ;;\n        *.jpeg*|*.jpg*) suggested_ext=\"jpg\" ;;\n    esac\n    \n    local output_file=\"$temp_dir/${timestamp}_${url_hash:0:12}.$suggested_ext\"\n    \n    echo \"=== 画像取得: $url ===\"\n    echo \"出力先: $(basename \"$output_file\")\"\n    \n    # 取得実行\n    if curl -L --max-time 30 --max-filesize 10485760 \\\n           -H \"User-Agent: EphemeralMediaFetcher/1.0\" \\\n           -o \"$output_file\" \\\n           \"$url\"; then\n        echo \"✓ ダウンロード完了\"\n    else\n        echo \"✗ ダウンロード失敗\"\n        [[ -f \"$output_file\" ]] && rm \"$output_file\"\n        return 1\n    fi\n    \n    # MIME検証\n    if ! validate_file_mime \"$output_file\" \"image/jpeg,image/png,image/gif,image/webp\"; then\n        echo \"✗ MIME検証失敗\"\n        rm \"$output_file\"\n        return 1\n    fi\n    \n    # ファイルサイズ確認\n    local file_size=\"$(stat -c%s \"$output_file\")\"\n    echo \"ファイルサイズ: $file_size bytes\"\n    \n    # 公開URL生成\n    local public_url=\"https://media.yourdomain.com/temp/$(basename \"$output_file\")\"\n    echo \"公開URL: $public_url\"\n    \n    # メタデータファイル作成\n    cat > \"${output_file}.meta\" << EOF\n{\n    \"source_url\": \"$url\",\n    \"fetch_time\": \"$timestamp\",\n    \"expires_at\": \"$((timestamp + 7 * 86400))\",\n    \"mime_type\": \"$(file --mime-type -b \"$output_file\")\",\n    \"file_size\": $file_size,\n    \"public_url\": \"$public_url\"\n}\nEOF\n    \n    echo \"$public_url\"\n    return 0\n}\n\n# 画像リサイズ（ImageMagick）\nresize_image() {\n    local input_file=\"$1\"\n    local max_width=\"${2:-800}\"\n    local quality=\"${3:-85}\"\n    \n    if ! command -v convert >/dev/null; then\n        echo \"ImageMagick未インストール。リサイズスキップ。\"\n        return 0\n    fi\n    \n    local output_file=\"${input_file%.*}_resized.${input_file##*.}\"\n    \n    convert \"$input_file\" \\\n        -resize \"${max_width}x${max_width}>\" \\\n        -quality \"$quality\" \\\n        -strip \\\n        \"$output_file\"\n    \n    if [[ -f \"$output_file\" ]]; then\n        mv \"$output_file\" \"$input_file\"\n        echo \"✓ リサイズ完了: ${max_width}px以下, 品質${quality}%\"\n    fi\n}\n\n# バッチ処理用\nbatch_fetch() {\n    local url_list_file=\"$1\"\n    \n    while IFS= read -r url; do\n        [[ -z \"$url\" || \"$url\" =~ ^# ]] && continue\n        \n        echo \"--- 処理中: $url ---\"\n        if fetch_and_cache_image \"$url\"; then\n            echo \"✓ 成功\"\n        else\n            echo \"✗ 失敗\"\n        fi\n        echo \"\"\n        \n        # レート制限（1秒待機）\n        sleep 1\n    done < \"$url_list_file\"\n}\n\n# 使用例\n# fetch_and_cache_image \"https://example.com/image.jpg\"\n# batch_fetch \"urls.txt\"\n\nアップロード処理PHP例\nシンプルアップロードハンドラ\n<?php\n// upload.php - シンプルなアップロード処理\n\nheader('Content-Type: application/json; charset=utf-8');\n\n// エラーハンドリング\nfunction sendError($message, $code = 400) {\n    http_response_code($code);\n    echo json_encode(['error' => $message]);\n    exit;\n}\n\n// 設定\n$config = [\n    'upload_dir' => '/var/www/media/temp/',\n    'max_size' => 10 * 1024 * 1024, // 10MB\n    'allowed_types' => ['image/jpeg', 'image/png', 'image/gif', 'image/webp', 'video/mp4', 'video/webm'],\n    'retention_days' => 7\n];\n\n// POST確認\nif ($_SERVER['REQUEST_METHOD'] !== 'POST') {\n    sendError('POST method required', 405);\n}\n\n// ファイルアップロード確認\nif (!isset($_FILES['media']) || $_FILES['media']['error'] !== UPLOAD_ERR_OK) {\n    sendError('アップロードエラー: ' . ($_FILES['media']['error'] ?? 'ファイルなし'));\n}\n\n$uploaded = $_FILES['media'];\n\n// サイズチェック\nif ($uploaded['size'] > $config['max_size']) {\n    sendError('ファイルサイズ制限超過: ' . round($uploaded['size'] / 1024 / 1024, 2) . 'MB');\n}\n\n// MIMEタイプ確認\n$finfo = finfo_open(FILEINFO_MIME_TYPE);\n$detected_mime = finfo_file($finfo, $uploaded['tmp_name']);\nfinfo_close($finfo);\n\nif (!in_array($detected_mime, $config['allowed_types'])) {\n    sendError('サポートされていないファイル形式: ' . $detected_mime);\n}\n\n// 拡張子決定\n$extension_map = [\n    'image/jpeg' => 'jpg',\n    'image/png' => 'png', \n    'image/gif' => 'gif',\n    'image/webp' => 'webp',\n    'video/mp4' => 'mp4',\n    'video/webm' => 'webm'\n];\n\n$extension = $extension_map[$detected_mime];\n\n// ファイル名生成\n$timestamp = time();\n$random = bin2hex(random_bytes(6));\n$filename = sprintf('%d_%s.%s', $timestamp, $random, $extension);\n$filepath = $config['upload_dir'] . $filename;\n\n// ファイル移動\nif (!move_uploaded_file($uploaded['tmp_name'], $filepath)) {\n    sendError('ファイル保存エラー');\n}\n\n// 権限設定\nchmod($filepath, 0644);\n\n// メタデータ保存\n$metadata = [\n    'filename' => $filename,\n    'original_name' => $uploaded['name'],\n    'mime_type' => $detected_mime,\n    'size' => $uploaded['size'],\n    'upload_time' => $timestamp,\n    'expires_at' => $timestamp + ($config['retention_days'] * 86400),\n    'upload_ip' => $_SERVER['REMOTE_ADDR'] ?? 'unknown'\n];\n\nfile_put_contents($filepath . '.meta', json_encode($metadata, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));\n\n// 公開URL\n$public_url = 'https://media.yourdomain.com/temp/' . $filename;\n\n// ログ記録\n$log_entry = sprintf(\n    \"[%s] アップロード成功: %s (%s, %d bytes) from %s\\n\",\n    date('Y-m-d H:i:s'),\n    $filename,\n    $detected_mime,\n    $uploaded['size'],\n    $_SERVER['REMOTE_ADDR'] ?? 'unknown'\n);\nfile_put_contents('/var/www/media/logs/uploads.log', $log_entry, FILE_APPEND | LOCK_EX);\n\n// レスポンス\necho json_encode([\n    'success' => true,\n    'filename' => $filename,\n    'url' => $public_url,\n    'size' => $uploaded['size'],\n    'type' => $detected_mime,\n    'expires_in' => $config['retention_days'] . ' days',\n    'expires_at' => date('Y-m-d H:i:s', $metadata['expires_at'])\n]);\n?>\n\n監視・統計\n使用統計収集\n#!/bin/bash\n# media-stats.sh\n\ngenerate_media_stats() {\n    local media_root=\"/var/www/media\"\n    local stats_file=\"$media_root/logs/daily-stats.json\"\n    local date=\"$(date -I)\"\n    \n    echo \"=== メディア統計生成: $date ===\"\n    \n    # ファイル数・サイズ統計\n    local temp_files=\"$(find \"$media_root/temp\" -type f -name \"*.jpg\" -o -name \"*.png\" -o -name \"*.gif\" -o -name \"*.webp\" -o -name \"*.mp4\" -o -name \"*.webm\" | wc -l)\"\n    local temp_size=\"$(du -sb \"$media_root/temp\" 2>/dev/null | cut -f1)\"\n    \n    # 今日のアップロード数\n    local today_uploads=\"$(grep \"$(date '+%Y-%m-%d')\" \"$media_root/logs/uploads.log\" 2>/dev/null | wc -l)\"\n    \n    # アクセス統計\n    local today_requests=\"$(grep \"$(date '+%d/%b/%Y')\" /var/log/nginx/media-access.log 2>/dev/null | wc -l)\"\n    local unique_ips=\"$(grep \"$(date '+%d/%b/%Y')\" /var/log/nginx/media-access.log 2>/dev/null | awk '{print $1}' | sort -u | wc -l)\"\n    \n    # JSON統計出力\n    cat > \"$stats_file\" << EOF\n{\n    \"date\": \"$date\",\n    \"files\": {\n        \"total_count\": $temp_files,\n        \"total_size_bytes\": $temp_size,\n        \"total_size_mb\": $(echo \"scale=2; $temp_size / 1024 / 1024\" | bc -l)\n    },\n    \"daily\": {\n        \"uploads\": $today_uploads,\n        \"requests\": $today_requests,\n        \"unique_visitors\": $unique_ips\n    },\n    \"retention\": {\n        \"cleanup_files\": $(find \"$media_root/temp\" -mtime +7 | wc -l),\n        \"oldest_file\": \"$(find \"$media_root/temp\" -type f -printf '%T@ %p\\n' | sort -n | head -1 | cut -d' ' -f2- | xargs -r basename)\"\n    }\n}\nEOF\n    \n    echo \"統計ファイル更新: $stats_file\"\n    \n    # 簡易レポート表示\n    echo \"\"\n    echo \"=== 本日の概要 ===\"\n    echo \"現在のファイル数: $temp_files\"\n    echo \"使用容量: $(echo \"scale=2; $temp_size / 1024 / 1024\" | bc -l) MB\"\n    echo \"今日のアップロード: $today_uploads\"\n    echo \"今日のアクセス: $today_requests\"\n    echo \"ユニーク訪問者: $unique_ips\"\n}\n\n# アラート確認\ncheck_alerts() {\n    local media_root=\"/var/www/media\"\n    local temp_size=\"$(du -sb \"$media_root/temp\" 2>/dev/null | cut -f1)\"\n    local max_size=\"$((1024 * 1024 * 1024))\"  # 1GB\n    \n    if [[ \"$temp_size\" -gt \"$max_size\" ]]; then\n        echo \"⚠️ 警告: 使用容量が1GBを超えています ($temp_size bytes)\"\n        \n        # 古いファイル自動削除\n        find \"$media_root/temp\" -type f -mtime +3 -delete\n        echo \"3日以上経過したファイルを削除しました\"\n    fi\n    \n    # 破損ファイルチェック\n    find \"$media_root/temp\" -type f \\( -name \"*.jpg\" -o -name \"*.png\" \\) | while read file; do\n        if ! file \"$file\" | grep -q \"image data\"; then\n            echo \"⚠️ 破損ファイル検出: $(basename \"$file\")\"\n            rm \"$file\"\n        fi\n    done\n}\n\ngenerate_media_stats\ncheck_alerts\n\n\nコンテンツ審査と高度な無害化については太郎書館を参照。"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/Byron-McKeeby/ephemeral-media-hosting",
    "publisherUrl": "https://clawhub.ai/Byron-McKeeby/ephemeral-media-hosting",
    "owner": "Byron-McKeeby",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/ephemeral-media-hosting",
    "downloadUrl": "https://openagent3.xyz/downloads/ephemeral-media-hosting",
    "agentUrl": "https://openagent3.xyz/skills/ephemeral-media-hosting/agent",
    "manifestUrl": "https://openagent3.xyz/skills/ephemeral-media-hosting/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/ephemeral-media-hosting/agent.md"
  }
}