YouTube截图捕手
自动从YouTube视频和Shorts中以指定的时间间隔捕获并处理屏幕截图,支持自定义截图时间,并提供用于图像管理的API端点。
服务介绍
YouTube MCP
这是一个从YouTube视频中自动截取屏幕截图的工具。支持YouTube Shorts和YouTube视频。
功能
YouTube Shorts
- 每隔指定的n秒拍摄一次屏幕截图
- 最多可拍摄60张(如果视频超过60秒)
- 精确裁剪视频区域并保存到
tmp/目录下 - 实时显示屏幕截图
- 可以选择下载所有或选定的图片为ZIP文件(Mac和Windows均可打开)
YouTube 视频
- 每隔指定的n秒拍摄一次屏幕截图
- 最多可拍摄60张(如果视频超过60秒)
- 精确裁剪视频区域并保存到
tmp/目录下 - 实时显示屏幕截图
- 可以选择下载所有或选定的图片为ZIP文件(Mac和Windows均可打开)
TikTok
- 目前正在准备支持
- 请使用YouTube或YouTube Shorts的URL
技术栈
- Node.js 18
- Express
- Playwright
- Firebase Functions (Gen 2)
- Firebase Hosting
- Firebase Storage
- TypeScript
- Bootstrap CSS
项目结构
Playwrigh-MCP-Server/
├── functions/ # Cloud Functions
│ ├── src/ # ソースコード
│ │ ├── index.ts # メインエントリーポイント
│ │ ├── screenshot.ts # スクリーンショット機能
│ │ ├── screenshots.ts # スクリーンショット一覧取得
│ │ ├── download-zip.ts # ZIPダウンロード機能
│ │ └── types.ts # 型定義
│ ├── package.json # 依存関係
│ └── tsconfig.json # TypeScript設定
├── public/ # 静的ファイル
│ └── index.html # メインページ
├── firebase.json # Firebase設定
└── storage.rules # Storageセキュリティルール
API列表
获取屏幕截图
- 端点:
/screenshot - 方法: POST
- 参数:
{ "url": "YouTube URL", "interval": 1 // 间隔(秒) } - 响应:
{ "success": true, "screenshots": [ { "imageUrl": "带签名的URL", "time": "时间戳", "filename": "文件名" } ], "interval": 1 }
获取屏幕截图列表
- 端点:
/screenshots - 方法: GET
- 响应:
[ { "filename": "文件名", "imageUrl": "带签名的URL", "time": "时间戳" } ]
ZIP下载
- 端点:
/download-zip - 方法: POST
- 参数:
{ "filenames": ["文件名1", "文件名2"] } - 响应: ZIP文件
GCP架构
使用的服务
-
Firebase Functions (Gen 2)
- 运行时: Node.js 18
- 区域: us-central1
- 内存: 1GiB
- CPU: 1
- 超时: 540秒
- 最大实例数: 100
- 并发执行数: 80
- 端点: https://api-ub7zp5pjra-uc.a.run.app
-
Firebase Storage
- 存储桶: mcp-5e4b5.firebasestorage.app
- 安全规则: 仅认证用户可访问
-
Firebase Hosting
IAM权限设置
用户权限
t@bonginkan.airoles/owner(项目所有者)roles/run.admin(Cloud Run管理员)
服务账户权限
-
Cloud Functions
33501462786-compute@developer.gserviceaccount.comroles/run.adminroles/run.developerroles/run.invokerroles/cloudfunctions.developerroles/storage.admin
-
Firebase Admin
firebase-adminsdk-fbsvc@mcp-5e4b5.iam.gserviceaccount.comroles/firebase.sdkAdminServiceAgentroles/firebaseauth.adminroles/iam.serviceAccountTokenCreatorroles/storage.admin
-
Cloud Build
33501462786@cloudbuild.gserviceaccount.comroles/run.adminroles/cloudfunctions.developerroles/storage.adminroles/artifactregistry.adminroles/eventarc.admin
实现细节
截图功能
- 使用Playwright控制无头浏览器
- 视口大小: 1280x720
- 使用临时目录暂时保存截图
- 上传到Firebase Storage后删除临时文件
- 签名URL有效期为15分钟
错误处理
- 在每个API端点捕获错误
- 以JSON格式返回错误信息
- 处理404端点
- 适当地处理500错误响应
CORS配置
- 允许的源:
- https://mcp-5e4b5.web.app
- http://localhost:3001
- 允许的方法: GET, POST
- 凭证: 有效
安全性
- Firebase Storage的安全规则
- 签名URL的有效期设置(15分钟)
- 临时文件的适当删除
最新修订内容(2024-03-28)
Bug修复
-
CORS设置改进
- 明确指定允许的源
- 启用凭据
-
错误处理加强
- 404错误以JSON格式响应
- 500错误时提供详细的错误消息
-
Firebase Storage支持
- 明确指定存储桶名称
- 设置签名URL有效期为15分钟
-
Cloud Functions Gen 2优化
- 优化内存设置(1GiB)
- 调整超时设置(540秒)
- 设置并发执行数(80)
功能改进
-
截图功能
- Playwright配置优化
- 无头浏览器视口设置
- 改进临时文件管理
- 改进对YouTube Shorts的支持
- 实现实时显示功能
-
API响应改进
- 错误信息日语化
- 统一响应格式
- 标准化时间戳格式
- 实现流式响应
-
安全性增强
- 更新Firebase Storage安全规则
- 确保临时文件被彻底删除
- 适当限制错误信息
-
前端改进
- 优化实时显示
- 修正图片URL
- 加强错误处理
- 改进用户界面
设置
- 克隆仓库
git clone https://github.com/tsubouchi/youtube_mcp.git
cd youtube_mcp
- 安装依赖包
# プロジェクトルート
npm install
# Cloud Functions
cd functions
npm install
- 安装Firebase CLI
npm install -g firebase-tools
- 登录Firebase
firebase login
- 初始化项目
firebase init
- 部署
# Cloud Functions
cd functions
npm run deploy
# Firebase Hosting
cd ..
firebase deploy --only hosting
本地开发环境设置
- 安装依赖包
# プロジェクトルート
npm install
# Cloud Functions
cd functions
npm install
- 设置服务账号密钥
- 从Firebase控制台下载服务账号密钥
- 保存为
functions/service-account.json
- 设置环境变量
# functions/.env
GOOGLE_APPLICATION_CREDENTIALS=./service-account.json
- 启动模拟器
cd functions
npm run serve
模拟器端口设置
模拟器使用以下端口:
- Functions: http://127.0.0.1:5001
- Emulator UI: http://127.0.0.1:4001
API测试
- 健康检查
curl http://localhost:5001/mcp-5e4b5/us-central1/api
- 获取截图
curl -X POST http://localhost:5001/mcp-5e4b5/us-central1/api/screenshot \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"url": "YouTube URL", "interval": 5}'
- 获取截图列表
curl http://localhost:5001/mcp-5e4b5/us-central1/api/screenshots
- ZIP下载
curl -X POST http://localhost:5001/mcp-5e4b5/us-central1/api/download-zip \
-H "Content-Type: application/json" \
-d '{"filenames": ["ファイル名1", "ファイル名2"]}'
注意事项
- 使用模拟器时,实际上会访问真实的Firebase Storage
- 服务账号密钥包含在
.gitignore中,不会提交到仓库 - 可以通过模拟器UI查看函数执行情况和日志
注意事项
- Node.js 18将于2025年4月30日不再推荐使用
- 截图将保存在临时目录中,并在处理后被删除
- 如果视频长度超过60秒,只保存前60张截图
- Firebase Storage的安全规则仅允许认证用户访问
- 签名URL有效期仅为15分钟
重要提示
截图保存与ZIP化的规格
-
截图保存
- 所有截图都将暂时保存在
/tmp/screenshots/目录下 - 文件名格式为
screenshot_[时间戳]_[序号].png - 临时文件在处理完成后仍然保留,直到拍摄新的截图时会被覆盖
- 所有截图都将暂时保存在
-
创建ZIP文件
- 选定的截图将直接从
/tmp/screenshots/读取 - ZIP文件将暂时创建于
/tmp/screenshots/,并在下载后删除 - ZIP文件名格式为
screenshots_[时间戳].zip
- 选定的截图将直接从
-
临时文件管理
- 临时文件需要定期清理
- 推荐在拍摄新截图之前先删除旧文件
许可证
MIT License