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

使用Python调用YouTube Data API v3如何跳过授权验证提示?

解决Python调用YouTube Data API每次重复授权的问题

问题分析

你遇到的核心问题是脚本无法正确复用已保存的OAuth凭据,导致每次运行都触发授权流程。结合你的代码,主要有几个潜在问题点:

  • main函数中多余创建了flow实例,虽不直接影响,但易混淆逻辑
  • 未检查已保存凭据是否过期,过期凭据无法自动刷新
  • 可能存在CREDENTIALS_PICKLE_FILE路径或权限问题,导致无法读取已保存的凭据

修正后的代码

import os
import sys
import pickle
from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build
from google.auth.transport.requests import Request

file_path = os.path.dirname(__file__)
module_path = os.path.join(file_path, "lib")
sys.path.append(module_path)

# 权限范围,按需缩减,不需要的权限可以移除
SCOPES = [
    "https://www.googleapis.com/auth/youtube.readonly",  # 只读权限足够获取视频列表
    "https://www.googleapis.com/auth/youtube.upload"     # 如果需要更新视频保留此权限
]
CLIENT_SECRETS_FILE = "credentials.json"
API_SERVICE_NAME = "youtube"
API_VERSION = "v3"
# 使用绝对路径确保凭据文件位置稳定
CREDENTIALS_PICKLE_PATH = os.path.join(file_path, "youtube_credentials.pickle")

def get_authenticated_service():
    credentials = None
    # 检查是否存在已保存的凭据
    if os.path.exists(CREDENTIALS_PICKLE_PATH):
        with open(CREDENTIALS_PICKLE_PATH, 'rb') as f:
            credentials = pickle.load(f)
    
    # 凭据不存在或已过期,重新授权或刷新
    if not credentials or not credentials.valid:
        if credentials and credentials.expired and credentials.refresh_token:
            # 刷新过期的凭据
            credentials.refresh(Request())
        else:
            # 首次授权
            flow = InstalledAppFlow.from_client_secrets_file(CLIENT_SECRETS_FILE, SCOPES)
            credentials = flow.run_console()
        # 保存更新后的凭据
        with open(CREDENTIALS_PICKLE_PATH, 'wb') as f:
            pickle.dump(credentials, f)
    
    return build(API_SERVICE_NAME, API_VERSION, credentials=credentials)

def main():
    # 仅在本地测试时禁用HTTPS验证,生产环境务必删除
    os.environ["OAUTHLIB_INSECURE_TRANSPORT"] = "1"
    
    youtube = get_authenticated_service()
    # 获取自己频道的内容详情
    request = youtube.channels().list(
        part="contentDetails",
        mine=True
    )
    response = request.execute()
    print(response)

if __name__ == "__main__":
    main()

关键优化点说明

  • 使用绝对路径存储凭据:避免因运行目录变化导致无法找到pickle文件
  • 添加凭据刷新逻辑:当凭据过期但有刷新令牌时,自动刷新无需重新授权
  • 缩减权限范围:只保留必要的权限,减少授权复杂度,youtube.readonly足以获取视频列表
  • 移除冗余代码:删除main中未使用的flow实例,简化逻辑

额外检查项

  1. 确认credentials.json是从Google Cloud控制台下载的桌面应用类型凭据(和.NET中使用的一致)
  2. 检查youtube_credentials.pickle文件是否在脚本运行后生成,且脚本有读写该文件的权限
  3. 如果仍出现授权提示,删除现有的pickle文件,重新授权一次,确保刷新令牌被正确保存

内容的提问来源于stack exchange,提问作者Chargui Taieb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 10:26:04