让 OpenClaw 自动上传视频到 YouTube —— 完整实战教程
摘要 该项目展示了如何通过ReSpeaker XVF3800麦克风阵列和OpenClaw机器人实现语音控制的YouTube视频自动上传功能。核心功能包括:1)通过语音指令"帮我把刚才的视频上传到YouTube"触发上传;2)利用YouTube Data API v3和OAuth 2.0实现长期授权;3)支持断点续传和大文件上传。项目开源了Python核心脚本,实现从语音输入到自
只需一句语音指令,AI 自动帮你上传视频到 YouTube
🎙️ 想让你的机器人具备语音交互能力?试试 Seeed Studio 的 reSpeaker 系列吧!
reSpeaker XVF3800 是一款基于 XMOS XVF3800 芯片的专业级 4 麦克风圆形阵列麦克风,即使在嘈杂的环境中也能清晰地拾取目标语音。它具备双模式、360° 远场语音拾取(最远 5 米)、自动回声消除 (AEC)、自动增益控制 (AGC)、声源定位 (DoA)、去混响、波束成形和噪声抑制等功能。
结合飞书 OpenClaw 机器人 + YouTube 自动上传功能,你可以打造这样的工作流:
语音唤醒 → 生成视频 → 自动上传到 YouTube,全程无需动手!📦 项目源码:
🔧 reSpeaker GitHub:
🛒 购买链接: reSpeaker 四麦克风阵列 | Seeed Studio
实际效果演示
项目亮点
最近我给 OpenClaw 开发了一个 YouTube 自动上传 Skill,实现了以下功能:
✅ 语音一句话上传 - “帮我把刚才的视频上传到 YouTube”
✅ 全自动流程 - 无需人工干预,后台静默完成
✅ 断点续传 - 大文件也不怕网络中断
✅ 长期授权 - 一次配置,永久使用
本文将手把手教你如何实现这个功能,代码开源,直接可用!
实现原理
整个流程分为三步:
┌─────────────┐ ┌─────────────────┐ ┌─────────────┐
│ 语音指令输入 │ → │ OpenClaw 解析意图 │ → │ YouTube API │
│ (reSpeaker) │ │ 调用上传 Skill │ │ 完成上传 │
└─────────────┘ └─────────────────┘ └─────────────┘
核心是使用 YouTube Data API v3 + OAuth 2.0 Refresh Token 实现长期自动化授权。
完整代码
1. 核心上传脚本:send_to_youtube.py
#!/usr/bin/env python3
"""
OpenClaw YouTube 自动上传工具
实现完全自动化的视频上传,支持 OpenClaw Skill 调用
"""
import json
import os
import sys
import pickle
from pathlib import Path
from googleapiclient.discovery import build
from googleapiclient.http import MediaFileUpload
from google.auth.transport.requests import Request
def get_authenticated_service():
"""获取认证服务 - 使用 Refresh Token 自动续期"""
token_path = os.path.expanduser('~/.youtube_credentials/token.pickle')
if not os.path.exists(token_path):
return None, f"Token 文件不存在: {token_path}"
try:
with open(token_path, 'rb') as f:
creds = pickle.load(f)
# 检查令牌是否过期,如果过期则自动刷新
if creds.expired and creds.refresh_token:
print("🔄 Refresh Token 过期,正在自动刷新...")
creds.refresh(Request())
# 保存刷新后的令牌
with open(token_path, 'wb') as f:
pickle.dump(creds, f)
print("✅ Token 刷新成功!")
print(f"✅ Token 有效期: {creds.expiry}")
print(f"✅ Refresh Token: {'已配置' if creds.refresh_token else '未配置'}")
return build('youtube', 'v3', credentials=creds), None
except Exception as e:
return None, f"加载 Token 失败: {e}"
def upload_video(video_path, title, description="", privacy="private", tags=None):
"""
上传视频到 YouTube
Args:
video_path: 视频文件路径
title: 视频标题(必填)
description: 视频描述(可选)
privacy: 隐私设置 - private/unlisted/public
tags: 标签列表(可选)
Returns:
dict: 包含 video_id、video_url 和上传状态
"""
if not os.path.exists(video_path):
return {"success": False, "error": f"文件不存在: {video_path}"}
print(f"🚀 开始上传: {os.path.basename(video_path)}")
print(f"📊 文件大小: {os.path.getsize(video_path) / (1024*1024):.1f} MB")
try:
# 获取认证服务
youtube, error = get_authenticated_service()
if error:
return {"success": False, "error": error}
# 准备视频元数据
body = {
'snippet': {
'title': title,
'description': description,
'tags': tags or [],
'categoryId': '28' # Science & Technology
},
'status': {
'privacyStatus': privacy,
'selfDeclaredMadeForKids': False
}
}
# 创建媒体文件上传对象(支持断点续传)
media = MediaFileUpload(
video_path,
resumable=True,
chunksize=1024*1024 # 1MB 分块
)
print("⬆️ 开始上传...")
# 创建上传请求
request = youtube.videos().insert(
part='snippet,status',
body=body,
media_body=media
)
# 执行上传并显示进度
response = None
while response is None:
status, response = request.next_chunk()
if status:
print(f"⏫ 上传进度: {int(status.progress() * 100)}%")
print("✅ 上传完成!")
return {
"success": True,
"video_id": response['id'],
"video_url": f"https://youtu.be/{response['id']}",
"title": title
}
except Exception as e:
return {"success": False, "error": str(e)}
def execute_tool(tool_name, parameters):
"""OpenClaw Skill 接口 - 执行工具"""
if tool_name == "upload_video":
return upload_video(**parameters)
return {"success": False, "error": f"未知工具: {tool_name}"}
if __name__ == "__main__":
# 支持从 stdin 或命令行参数读取
if not sys.stdin.isatty():
params = json.load(sys.stdin)
else:
params = json.loads(sys.argv[1]) if len(sys.argv) > 1 else {}
result = execute_tool("upload_video", params)
print(json.dumps(result, ensure_ascii=False, indent=2))
2. 获取 Refresh Token 脚本
首次使用需要先获取授权 Token:
#!/usr/bin/env python3
"""获取 YouTube API 的 Refresh Token - 只需运行一次"""
import os
import pickle
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
# ========== 配置区域 ==========
CLIENT_ID = "your-client-id" # 从 Google Cloud Console 获取
CLIENT_SECRET = "your-client-secret" # 从 Google Cloud Console 获取
# ==============================
SCOPES = ['https://www.googleapis.com/auth/youtube.upload']
def get_refresh_token():
"""获取并保存 Refresh Token"""
client_config = {
"installed": {
"client_id": CLIENT_ID,
"client_secret": CLIENT_SECRET,
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"redirect_uris": ["urn:ietf:wg:oauth:2.0:oob", "http://localhost"]
}
}
flow = InstalledAppFlow.from_client_config(client_config, SCOPES)
creds = flow.run_local_server(port=0)
# 保存凭据
creds_dir = os.path.expanduser('~/.youtube_credentials')
os.makedirs(creds_dir, exist_ok=True)
token_path = os.path.join(creds_dir, 'token.pickle')
with open(token_path, 'wb') as f:
pickle.dump(creds, f)
print(f"✅ 凭据已保存到: {token_path}")
print(f"📋 Refresh Token: {creds.refresh_token[:20]}...")
return creds
if __name__ == "__main__":
get_refresh_token()
快速开始
步骤 1:创建 Google Cloud 项目
- 访问 Google Cloud Console
- 创建新项目 → 启用 YouTube Data API v3
- 创建 OAuth 2.0 桌面应用凭据,记下 Client ID 和 Secret
步骤 2:安装依赖
pip install google-auth-oauthlib google-auth-httplib2 google-api-python-client
步骤 3:获取 Refresh Token
# 编辑 get_refresh_token.py,填入 Client ID 和 Secret
python get_refresh_token.py
浏览器会弹出授权窗口,登录 YouTube 账号并允许访问。成功后 Token 保存在 ~/.youtube_credentials/token.pickle。
步骤 4:配置 OpenClaw Skill
创建 Skill 目录结构:
mkdir -p ~/.openclaw/skills/youtube_uploader
cp send_to_youtube.py ~/.openclaw/skills/youtube_uploader/
创建 __init__.py:
from .send_to_youtube import upload_video, execute_tool
__all__ = ['upload_video', 'execute_tool']
步骤 5:开始使用!
命令行测试:
python send_to_youtube.py '{
"video_path": "/path/to/your/video.mp4",
"title": "OpenClaw 自动上传测试",
"description": "由 OpenClaw + ReSpeaker 自动上传",
"privacy": "public",
"tags": ["OpenClaw", "YouTube", "自动化"]
}'
语音指令(配合 reSpeaker):
"帮我把今天的会议录像上传到 YouTube,标题叫项目周会"
"上传 /home/user/demo.mp4 到 YouTube,设为公开"
实际应用场景
结合 reSpeaker XVF3800 + OpenClaw,你可以实现:
| 场景 | 语音指令 | 自动执行 |
|---|---|---|
| 会议记录 | “开始录制会议” | 录制 → 生成摘要 → 上传 YouTube |
| 代码演示 | “录屏并上传” | 录屏 → 自动发布教程视频 |
| 直播剪辑 | “上传精彩片段” | 剪辑 → 直接发布到频道 |
安全提醒
⚠️ 保护你的凭据:
# 添加到 .gitignore
echo "~/.youtube_credentials/" >> .gitignore
echo "*.pickle" >> .gitignore
echo "get_refresh_token.py" >> .gitignore
# 设置文件权限
chmod 600 ~/.youtube_credentials/token.pickle
技术细节
OAuth 2.0 流程
┌─────────┐ ┌─────────────┐
│ 用户 │ ────── 浏览器授权 ─────────────────→ │ Google OAuth │
│ │ ←───── 返回 Authorization Code ────│ │
│ │ └──────┬──────┘
│ │ │
│ │ ────── 用 Code 换取 Access Token + ─────→ │
│ │ ←───── Refresh Token ──────────────────── │
│ │ │
│ │ 以后用 Refresh Token 自动获取新 Token │
└─────────┘ └──────────┘
分块上传机制
大文件采用 Resumable Upload 技术:
- 文件分成 1MB 块上传
- 网络中断后可从断点续传
- 实时显示上传进度
完整项目链接
📦 本项目源码: https://github.com/DengMingXi777GZ/openclaw-feishu-InteractMeetingCard
包含:
- ✅ OpenClaw 飞书会议卡片 Skill
- ✅ YouTube 自动上传功能
- ✅ reSpeaker 语音识别集成
- ✅ 完整文档和示例
相关资源
- 🔧 reSpeaker GitHub: https://github.com/respeaker
- 🛒 reSpeaker 购买: https://www.seeedstudio.com.cn/product/respeaker-mic-array-v2-0
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)