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

使用YouTube API上传视频时如何避免每次运行都需手动授权?

解决YouTube API上传视频每次运行需重复授权的方案

问题原因

你当前代码每次运行都会调用flow.run_console()重新发起授权流程,没有缓存首次授权后获取的有效凭证,因此每次执行都需要手动完成授权验证。

解决方案

通过本地序列化存储授权凭证,后续运行优先读取本地缓存的有效凭证,无需重复授权。

修改步骤

  • 引入pickle模块用于凭证的序列化存储与读取
  • 新增凭证缓存逻辑:先检测本地是否存在已保存的凭证文件,存在则直接加载,不存在再走授权流程,授权完成后将凭证写入本地文件
  • 额外处理凭证过期逻辑:如果凭证过期且存在刷新令牌,自动刷新凭证无需重新授权

修改后的完整代码

# -*- coding: utf-8 -*-
import os
import pickle

import google_auth_oauthlib.flow
import googleapiclient.discovery
import googleapiclient.errors
from google.auth.transport.requests import Request
from googleapiclient.http import MediaFileUpload

scopes = ["https://www.googleapis.com/auth/youtube.upload"]

def main():
    # Disable OAuthlib's HTTPS verification when running locally.
    # *DO NOT* leave this option enabled in production.
    os.environ["OAUTHLIB_INSECURE_TRANSPORT"] = "1"

    api_service_name = "youtube"
    api_version = "v3"
    client_secrets_file = "C:/Users/User/computer science/moviepy/client_secret_660339349555-der7rru7no2g1v4oe1o1g7qqm27ujodo.apps.googleusercontent.com.json"
    # 凭证缓存文件路径
    token_file = "youtube_upload_token.pkl"

    credentials = None
    # 先读取本地缓存的凭证
    if os.path.exists(token_file):
        with open(token_file, 'rb') as token:
            credentials = pickle.load(token)
    
    # 如果凭证不存在或者已失效
    if not credentials or not credentials.valid:
        if credentials and credentials.expired and credentials.refresh_token:
            # 凭证过期则自动刷新
            credentials.refresh(Request())
        else:
            # 没有有效凭证则发起授权流程
            flow = google_auth_oauthlib.flow.InstalledAppFlow.from_client_secrets_file(
                client_secrets_file, scopes)
            credentials = flow.run_console()
        # 保存新的凭证到本地
        with open(token_file, 'wb') as token:
            pickle.dump(credentials, token)

    youtube = googleapiclient.discovery.build(
        api_service_name, api_version, credentials=credentials)

    request = youtube.videos().insert(
        part = "snippet,status",
        
        body={
          "snippet": {
            "title": "test",
            "description": "四次是鬼"
          },
          "status": {
            "privacyStatus": "private"
          }
        },
        
        media_body=MediaFileUpload("D:/Downloads/ytdl/wtf8.mp4")
    )
    response = request.execute()

    #print(response)

if __name__ == "__main__":
    main()

注意事项

  • 首次运行代码仍需完成一次授权,后续运行无需重复操作
  • 生成的youtube_upload_token.pkl文件包含你的授权信息,请勿泄露给他人
  • 生产环境请删除os.environ["OAUTHLIB_INSECURE_TRANSPORT"] = "1"这行配置,避免安全风险

内容的提问来源于stack exchange,提问作者Steve Deltora

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 21:18:00