如何自动化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
相关产品推荐
相关产品推荐

