自動削除機能付き一時メディアホスティングシステム
数据来源:ClawHub。 在 ClawSkills 查看
选择你使用的 Agent
方法一:命令行安装(推荐)
推荐(无需提前安装 clawhub)
npx clawhub@latest --dir ~/.claude/skills install ephemeral-media-hosting或使用 clawhub CLI(需提前安装)
clawhub --dir ~/.claude/skills install ephemeral-media-hosting⚠️ 需要 Node.js 18+,没有 Node?请使用下方方法二直接下载 ZIP。 安装 Node.js →
方法二:手动下载安装(无需 Node)
下载 ZIP,解压后将文件夹放到以下路径,重启 Agent 即可:
安装路径
~/.claude/skills/ephemeral-media-hosting/💡解压后将文件夹放到上方路径,重启 Agent 即可生效
--- name: ephemeral-media-hosting version: 1.0.0 description: 自動削除機能付き一時メディアホスティングシステム ---
チャット共有向けの自動削除機能付きメディアディレクトリシステム。7日間の自動保持、MIME検証、fetch-image.shパターン、nginx設定の包括的ガイドです。
/var/www/media/
├── temp/ # 一時ファイル(7日保持)
├── uploads/ # アップロード受付
├── processed/ # 処理済みファイル
├── logs/ # アクセス・処理ログ
└── scripts/ # 管理スクリプト群
#!/bin/bash
# media-setup.sh
setup_media_hosting() {
local media_root="/var/www/media"
local nginx_user="www-data"
echo "=== メディアホスティング初期設定 ==="
# ディレクトリ作成
sudo mkdir -p "$media_root"/{temp,uploads,processed,logs,scripts}
# 権限設定
sudo chown -R "$nginx_user:$nginx_user" "$media_root"
sudo chmod -R 755 "$media_root"
sudo chmod 775 "$media_root"/{uploads,temp,processed}
# 設定ファイル作成
cat > "$media_root/config.env" << 'EOF'
# メディアホスティング設定
MAX_FILE_SIZE=10M
RETENTION_DAYS=7
ALLOWED_MIMES="image/jpeg,image/png,image/gif,image/webp,video/mp4,video/webm"
UPLOAD_RATE_LIMIT=100
EOF
echo "初期設定完了: $media_root"
}
# 実行
setup_media_hosting
# /etc/nginx/sites-available/ephemeral-media
server {
listen 80;
server_name media.yourdomain.com;
# セキュリティヘッダー
add_header X-Content-Type-Options "nosniff";
add_header X-Frame-Options "DENY";
add_header X-XSS-Protection "1; mode=block";
add_header Content-Security-Policy "default-src 'none'; img-src 'self'; media-src 'self';";
# ファイルサイズ制限
client_max_body_size 10M;
# メディアルート
root /var/www/media;
index index.html;
# 一時ファイル配信
location /temp/ {
alias /var/www/media/temp/;
# キャッシュヘッダー(短期間)
expires 1h;
add_header Cache-Control "public, must-revalidate";
# セキュリティ
add_header X-Ephemeral "true";
add_header X-Expires-After "7-days";
# ファイル存在確認
try_files $uri @not_found;
# ログ記録
access_log /var/log/nginx/media-access.log combined;
}
# アップロード処理
location /upload {
# POST のみ許可
limit_except POST { deny all; }
# レート制限
limit_req zone=upload_zone burst=5 nodelay;
# PHP-FPM等へプロキシ
proxy_pass http://127.0.0.1:8080/upload;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# アップロードログ
access_log /var/log/nginx/upload-access.log upload_format;
}
# 直接ファイル配信
location ~* \.(jpg|jpeg|png|gif|webp|mp4|webm)$ {
# セキュリティチェック
if ($request_uri ~* "\.\./") {
return 403;
}
# MIME設定
location ~* \.jpg$ { add_header Content-Type "image/jpeg"; }
location ~* \.png$ { add_header Content-Type "image/png"; }
location ~* \.gif$ { add_header Content-Type "image/gif"; }
location ~* \.webp$ { add_header Content-Type "image/webp"; }
location ~* \.mp4$ { add_header Content-Type "video/mp4"; }
location ~* \.webm$ { add_header Content-Type "video/webm"; }
# レスポンシブ画像対応
expires 1d;
add_header Vary "Accept-Encoding";
}
# エラーページ
location @not_found {
return 404 "ファイルが見つからないか、有効期限が切れています";
}
# メインページ(アップロードフォーム等)
location = / {
try_files /index.html @upload_form;
}
location @upload_form {
return 200 '<!DOCTYPE html>
<html><head><title>一時メディア共有</title></head>
<body>
<h1>一時ファイル共有</h1>
<p>7日間で自動削除されます。</p>
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="media" accept="image/*,video/*" required>
<button type="submit">アップロード</button>
</form>
</body></html>';
add_header Content-Type "text/html; charset=utf-8";
}
}
# レート制限設定
http {
limit_req_zone $binary_remote_addr zone=upload_zone:10m rate=10r/m;
# カスタムログフォーマット
log_format upload_format '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'upload_size:$content_length';
}
#!/bin/bash
# cleanup-ephemeral-media.sh
cleanup_old_files() {
local media_root="/var/www/media"
local retention_days="7"
local log_file="$media_root/logs/cleanup.log"
echo "$(date): 一時ファイル削除開始" >> "$log_file"
# 7日前より古いファイルを削除
local deleted_count=0
find "$media_root/temp" -type f -mtime +"$retention_days" -print0 | \
while IFS= read -r -d '' file; do
local file_size="$(stat -c%s "$file")"
local file_name="$(basename "$file")"
if rm "$file" 2>/dev/null; then
echo "$(date): 削除 $file_name ($file_size bytes)" >> "$log_file"
((deleted_count++))
else
echo "$(date): 削除失敗 $file_name" >> "$log_file"
fi
done
# 空ディレクトリ削除
find "$media_root/temp" -type d -empty -delete 2>/dev/null
# 統計ログ
local total_files="$(find "$media_root/temp" -type f | wc -l)"
local total_size="$(du -sh "$media_root/temp" | cut -f1)"
echo "$(date): 削除完了 - 残存ファイル: $total_files, 総サイズ: $total_size" >> "$log_file"
# ログローテーション(30日以上のログ削除)
find "$media_root/logs" -name "*.log" -mtime +30 -delete
}
# crontab設定例
install_cron() {
local cron_entry="0 2 * * * /var/www/media/scripts/cleanup-ephemeral-media.sh"
# 現在のcrontab取得・更新
(crontab -l 2>/dev/null; echo "$cron_entry") | sort -u | crontab -
echo "cron設定完了: 毎日2時に実行"
}
cleanup_old_files
#!/bin/bash
# mime-validator.sh
validate_file_mime() {
local file_path="$1"
local allowed_mimes="$2"
# 実際のMIMEタイプ検出
local detected_mime="$(file --mime-type -b "$file_path")"
local file_extension="${file_path##*.}"
echo "=== MIME検証: $(basename "$file_path") ==="
echo "検出MIME: $detected_mime"
echo "拡張子: $file_extension"
# 許可リストチェック
if echo "$allowed_mimes" | grep -q "$detected_mime"; then
echo "✓ MIME許可済み"
else
echo "✗ MIME不許可"
return 1
fi
# 拡張子とMIMEの整合性チェック
case "$detected_mime" in
"image/jpeg")
[[ "$file_extension" =~ ^(jpg|jpeg)$ ]] || { echo "✗ 拡張子不整合"; return 1; } ;;
"image/png")
[[ "$file_extension" == "png" ]] || { echo "✗ 拡張子不整合"; return 1; } ;;
"image/gif")
[[ "$file_extension" == "gif" ]] || { echo "✗ 拡張子不整合"; return 1; } ;;
"image/webp")
[[ "$file_extension" == "webp" ]] || { echo "✗ 拡張子不整合"; return 1; } ;;
"video/mp4")
[[ "$file_extension" == "mp4" ]] || { echo "✗ 拡張子不整合"; return 1; } ;;
"video/webm")
[[ "$file_extension" == "webm" ]] || { echo "✗ 拡張子不整合"; return 1; } ;;
*)
echo "✗ 未対応MIME"; return 1 ;;
esac
echo "✓ 拡張子整合性OK"
# ファイルサイズチェック
local file_size="$(stat -c%s "$file_path")"
local max_size="$((10 * 1024 * 1024))" # 10MB
if [[ "$file_size" -gt "$max_size" ]]; then
echo "✗ ファイルサイズ超過 ($file_size > $max_size)"
return 1
fi
echo "✓ ファイルサイズOK ($file_size bytes)"
return 0
}
# ウイルススキャン(ClamAV使用)
scan_for_malware() {
local file_path="$1"
if command -v clamscan >/dev/null; then
echo "ウイルススキャン実行中..."
if clamscan --quiet "$file_path"; then
echo "✓ スキャン正常"
return 0
else
echo "✗ 脅威検出またはスキャンエラー"
return 1
fi
else
echo "⚠ ClamAV未インストール。スキャンスキップ。"
return 0
fi
}
...安装 Ephemeral Media Hosting 后,可以对 AI 说这些话来触发它
Help me get started with Ephemeral Media Hosting
Explains what Ephemeral Media Hosting does, walks through the setup, and runs a quick demo based on your current project
Use Ephemeral Media Hosting to temporary media hosting system with auto-delete feature
Invokes Ephemeral Media Hosting with the right parameters and returns the result directly in the conversation
What can I do with Ephemeral Media Hosting in my general tools workflow?
Lists the top use cases for Ephemeral Media Hosting, with example commands for each scenario
将技能文件夹放到 ~/.claude/skills/ephemeral-media-hosting/ 目录(个人级,所有项目可用),或 .claude/skills/ephemeral-media-hosting/(项目级)。重启 AI 客户端后,用 /ephemeral-media-hosting 主动调用,或让 AI 根据上下文自动发现并使用。
Ephemeral Media Hosting 支持 Claude、Cursor、OpenClaw,可与这些 AI 平台无缝集成,扩展其能力。
Ephemeral Media Hosting 可免费安装使用。请查阅仓库了解许可证信息。
自動削除機能付き一時メディアホスティングシステム
Ephemeral Media Hosting 属于「General Tools」分类,该分类的技能帮助 AI 智能体在此领域执行专业任务。
Automate my general tools tasks using Ephemeral Media Hosting
Identifies repetitive steps in your workflow and sets up Ephemeral Media Hosting to handle them automatically