调用YouTube Analytics API提示缺少认证凭据报错排查
问题原因与修复方案
你的代码存在2个核心配置/参数错误,是导致报错的直接原因:
- 最核心错误:
ids参数不符合YouTube Analytics V2接口规范
该接口的ids参数仅支持两种合法取值:channel=={你的频道ID}(查自有频道数据时可直接写channel==MINE)、contentOwner=={内容所有者ID}(MCN账号使用),不存在video=={视频ID}的写法。你要查询单个视频的数据,需要把视频ID放到filters参数中传入,不能直接写在ids里。
谷歌这个接口的参数校验逻辑不完善,传入不合法的ids值时不会返回明确的400参数错误,只会抛出模糊的500内部错误,排查起来很有迷惑性。至于你手动复制请求地址在浏览器访问时提示缺少认证凭证,是因为OAuth2生成的access token是放在请求头Authorization: Bearer {token}里传输的,不会拼在URL参数中,浏览器访问不会自动带上这个请求头,这个提示和代码里凭证是否正常无关。 - 冗余权限范围可能导致授权异常
你一次性加了10个权限scope,其中很多和读取分析数据的需求无关,甚至包含上传、第三方链接创建这类写权限,多余的权限可能导致授权时账号无对应权限、token生成异常,只保留必要的只读权限即可。
另外你的代码还有一个潜在运行时问题:main_data函数里用到的year/month/day变量没有作为参数传入函数,也没有定义为全局变量,后续运行会触发NameError,同时返回结果没有做空值判断,查询日期范围内无数据时会触发KeyError。
修正后的核心代码示例
import os import google_auth_oauthlib.flow import googleapiclient.discovery # 仅保留查询分析数据必需的只读权限 scopes = [ 'https://www.googleapis.com/auth/yt-analytics.readonly', 'https://www.googleapis.com/auth/youtube.readonly' ] client_secrets_file = 'client_secret_xxxxxxx.apps.googleusercontent.com.json' # 该行仅可用于本地调试,生产环境部署必须删除 os.environ['OAUTHLIB_INSECURE_TRANSPORT'] = '1' flow = google_auth_oauthlib.flow.InstalledAppFlow.from_client_secrets_file(client_secrets_file, scopes) credentials = flow.run_console() youtube_analytics = googleapiclient.discovery.build('youtubeAnalytics', 'v2', credentials=credentials) # 将日期、视频ID作为函数入参传入,避免作用域错误 def main_data(video_id, year, month, day): request_analytics = youtube_analytics.reports().query( startDate = '%d-%02d-01' % (year, month), endDate = '%d-%02d-%d' % (year, month, day), # ids必须传入频道标识,查询自有频道数据直接填channel==MINE即可 ids = 'channel==MINE', dimensions = 'day', metrics = 'views', # 待查询的视频ID放到filters参数中做筛选 filters = f'video=={video_id}' ) response = request_analytics.execute() # 增加空值判断,日期范围内无数据时返回空列表避免报错 return response.get('rows', [])
额外注意事项
- 本地调试授权时,要确保登录的账号就是对应视频所属频道的主账号,或是有分析数据查看权限的管理员账号,否则会返回权限不足错误。
- 如果需要查询收益类相关指标,再补充添加
https://www.googleapis.com/auth/yt-analytics-monetary.readonly权限即可,不需要加其他无关权限。
内容的提问来源于stack exchange,提问作者nike01705
相关产品推荐
相关产品推荐

