You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

上传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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 17:12:47