上传YouTube视频时缩略图与标签未生效,请求排查代码问题
问题排查:YouTube视频上传后缩略图和标签未生效
问题描述
使用代码上传YouTube视频时,视频、标题、描述均成功上传,但缩略图和标签未生效,图片尺寸1280x720px符合maxres规格,代码基于官方API文档编写。
错误原因分析
1. 缩略图设置方式错误
YouTube Data API的videos.insert接口中,snippet.thumbnails是只读字段,仅用于返回视频已有的缩略图信息,无法通过该字段直接指定外部URL设置自定义缩略图,必须通过单独的thumbnails.set接口上传本地图片完成设置。
2. 可恢复上传未正确处理
代码中启用了resumable=True可恢复上传,但直接调用request.execute()是错误的。可恢复上传需要通过next_chunk()方法分块处理上传流程,否则可能导致视频元数据(如标签)未被正确提交。
3. 权限范围不足
当前仅使用youtube.upload权限,该权限仅支持视频上传,无法调用thumbnails.set接口设置缩略图,需要添加更高权限的https://www.googleapis.com/auth/youtube.force-ssl。
修正后的代码
import sys import os import google_auth_oauthlib.flow import googleapiclient.discovery import googleapiclient.errors from google.oauth2.credentials import Credentials from googleapiclient.http import MediaFileUpload from google.auth.transport.requests import Request # 更新权限范围,添加缩略图设置所需权限 scopes = [ "https://www.googleapis.com/auth/youtube.upload", "https://www.googleapis.com/auth/youtube.force-ssl" ] CLIENT_SECRETS_FILE = "client_secrets.json" VIDEO_FILE = "video.mkv" THUMBNAIL_FILE = "thumbnail.jpg" # 本地缩略图文件路径 CREDENTIALS_FILE = "credentials.json" def get_credentials(): creds = None if os.path.exists(CREDENTIALS_FILE): with open(CREDENTIALS_FILE, 'r') as f: creds = Credentials.from_authorized_user_info(eval(f.read())) if not creds or not creds.valid: if creds and creds.expired and creds.refresh_token: creds.refresh(Request()) else: flow = google_auth_oauthlib.flow.InstalledAppFlow.from_client_secrets_file( CLIENT_SECRETS_FILE, scopes) creds = flow.run_local_server(port=0) with open(CREDENTIALS_FILE, 'w') as f: f.write(creds.to_json()) return creds def main(): os.environ["OAUTHLIB_INSECURE_TRANSPORT"] = "1" credentials = get_credentials() youtube = googleapiclient.discovery.build( "youtube", "v3", credentials=credentials) request_body = { "snippet": { "title": "My awesome video", "description": "This is a video that I made for YouTube.", "tags": ["youtube", "video", "awesome"], "categoryId": "22" }, "status": { "privacyStatus": "public" } } media_type = 'video/*' # 正确处理可恢复上传 request = youtube.videos().insert( part="snippet,status", body=request_body, media_body=MediaFileUpload(VIDEO_FILE, mimetype=media_type, resumable=True) ) response = None while response is None: status, response = request.next_chunk() if status: print(f"视频上传进度: {int(status.progress() * 100)}%") video_id = response["id"] print(f"视频上传完成,ID: {video_id}") # 上传并设置缩略图 try: thumbnail_request = youtube.thumbnails().set( videoId=video_id, media_body=MediaFileUpload(THUMBNAIL_FILE) ) thumbnail_response = thumbnail_request.execute() print("缩略图设置成功") except googleapiclient.errors.HttpError as e: print(f"设置缩略图失败: {e}") if __name__ == "__main__": main()
关键修正说明
- 权限更新:添加
youtube.force-ssl权限,满足缩略图设置的权限要求。 - 可恢复上传处理:使用
next_chunk()循环处理上传,确保视频元数据(标签等)被正确提交。 - 缩略图设置:移除
request_body中无效的thumbnails字段,改用thumbnails.set接口上传本地图片完成设置。 - 凭证刷新优化:添加凭证过期时自动刷新的逻辑,避免重复登录。
内容的提问来源于stack exchange,提问作者Oleksandr Myronchuk
相关产品推荐
相关产品推荐

