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

如何自动化Youtube Data API v3的OAuth认证以避免人工干预?

实现YouTube Data API v3 OAuth认证自动化(无需人工干预)

核心思路

OAuth认证只需用户首次手动授权一次,获取包含刷新令牌的凭据并保存到本地文件。后续运行时直接加载该文件,利用刷新令牌自动更新过期的访问令牌,全程无需人工干预。

1. 前期准备

  • 已在GCP控制台创建OAuth 2.0客户端ID,下载credentials.json到项目目录
  • 依赖版本与你提供的一致,无需额外调整

2. 首次手动授权(仅执行一次)

运行以下代码,完成首次授权并保存凭据:

from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build
import os

# 定义API权限(此处为YouTube只读权限,按需调整)
SCOPES = ["https://www.googleapis.com/auth/youtube.readonly"]
CREDENTIALS_PATH = "credentials.json"
TOKEN_PATH = "token.json"

def main():
    # 初始化授权流程
    flow = InstalledAppFlow.from_client_secrets_file(CREDENTIALS_PATH, SCOPES)
    # 启动本地服务器引导授权,完成后返回凭据
    credentials = flow.run_local_server(port=0)
    
    # 将凭据写入本地文件,供后续自动使用
    with open(TOKEN_PATH, "w") as token_file:
        token_file.write(credentials.to_json())
    
    # 测试API调用(可选)
    youtube = build("youtube", "v3", credentials=credentials)
    test_request = youtube.channels().list(part="snippet", forUsername="GoogleDevelopers")
    print(test_request.execute())

if __name__ == "__main__":
    main()

首次运行时会自动打开浏览器,按提示完成授权即可,授权成功后token.json会被创建在项目目录下。

3. 自动化运行代码(后续无需人工干预)

使用以下代码直接加载保存的凭据,自动处理令牌刷新:

from google.oauth2.credentials import Credentials
from googleapiclient.discovery import build
from google.auth.transport.requests import Request
import os

SCOPES = ["https://www.googleapis.com/auth/youtube.readonly"]
CREDENTIALS_PATH = "credentials.json"
TOKEN_PATH = "token.json"

def get_authenticated_youtube_service():
    credentials = None
    
    # 加载本地已保存的凭据
    if os.path.exists(TOKEN_PATH):
        credentials = Credentials.from_authorized_user_file(TOKEN_PATH, SCOPES)
    
    # 处理凭据过期或无效的情况:自动刷新或 fallback 到手动授权(首次运行后不会触发手动授权)
    if not credentials or not credentials.valid:
        if credentials and credentials.expired and credentials.refresh_token:
            # 自动刷新访问令牌
            credentials.refresh(Request())
            # 保存刷新后的凭据
            with open(TOKEN_PATH, "w") as token_file:
                token_file.write(credentials.to_json())
        else:
            # 仅当无有效凭据时才触发手动授权(首次运行后不会走到这里)
            flow = InstalledAppFlow.from_client_secrets_file(CREDENTIALS_PATH, SCOPES)
            credentials = flow.run_local_server(port=0)
            with open(TOKEN_PATH, "w") as token_file:
                token_file.write(credentials.to_json())
    
    # 返回已认证的API服务实例
    return build("youtube", "v3", credentials=credentials)

def fetch_channel_videos(youtube_service, channel_id):
    # 获取频道的上传列表ID
    channel_request = youtube_service.channels().list(part="contentDetails", id=channel_id)
    channel_response = channel_request.execute()
    uploads_playlist_id = channel_response["items"][0]["contentDetails"]["relatedPlaylists"]["uploads"]
    
    # 分页获取所有上传视频
    videos = []
    playlist_request = youtube_service.playlistItems().list(
        part="snippet", playlistId=uploads_playlist_id, maxResults=50
    )
    
    while playlist_request:
        playlist_response = playlist_request.execute()
        videos.extend(playlist_response["items"])
        playlist_request = youtube_service.playlistItems().list_next(playlist_request, playlist_response)
    
    return videos

if __name__ == "__main__":
    # 初始化认证服务
    youtube = get_authenticated_youtube_service()
    # 替换为目标频道ID
    target_channel_id = "UC_x5XG1OV2P6uZZ5FSM9Ttw"
    # 获取频道视频列表
    channel_videos = fetch_channel_videos(youtube, target_channel_id)
    
    # 打印视频信息(按需处理)
    for idx, video in enumerate(channel_videos, 1):
        title = video["snippet"]["title"]
        video_id = video["snippet"]["resourceId"]["videoId"]
        print(f"{idx}. 标题: {title} | 视频ID: {video_id}")

注意事项

  • 切勿泄露credentials.json和token.json文件,它们包含敏感的认证信息
  • 如果修改了API权限范围,或令牌被吊销,需要删除token.json后重新执行首次授权流程
  • 刷新令牌长期有效(除非用户主动撤销授权或GCP控制台配置变更),可长期用于自动认证

内容的提问来源于stack exchange,提问作者Yutaka Fujii

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 13:05:53