Python连接YouTube Analytics API出现授权错误问题求助
问题根因
你碰到的两个报错核心原因一致:谷歌在2022年10月正式停用了传统带外(OOB)OAuth授权流,也就是代码里flow.run_console()默认调用的urn:ietf:wg:oauth:2.0:oob回调地址,这个旧流程被判定存在安全风险,不管创建Web客户端还是桌面客户端,直接沿用旧示例代码都会触发报错。
之前教程里普遍推荐选择的「Others」类型客户端,本身就是为OOB流设计的,下线也是配合这次旧授权流的弃用动作。
可行修复方案
方案1:本地脚本/个人调试场景(最简便)
- 保留已经创建的桌面应用类型OAuth 2.0客户端,不要用Web应用客户端做本地脚本调试。
- 替换旧的授权逻辑,弃用
run_console()方法,改用本地端口监听的授权流,同时修正代码里的权限配置错误:- 原代码里的
credentials = flow.run_console()需要替换为本地服务回调逻辑,授权时会自动拉起浏览器,在本地端口接收授权回调,不需要手动复制粘贴授权码。 - 原代码填写的scope有误:
https://www.googleapis.com/auth/youtube.readonly是YouTube Data API的权限,不是YouTube Analytics API的权限,就算授权通过也会报403权限不足,需要替换为Analytics API对应的只读权限。
调整完成的可运行代码如下:
import os from googleapiclient.discovery import build from google_auth_oauthlib.flow import InstalledAppFlow from google.auth.transport.requests import Request from google.oauth2.credentials import Credentials # 注意替换为YouTube Analytics API的正确scope scopes = ["https://www.googleapis.com/auth/yt-analytics.readonly"] TOKEN_PATH = "yt_analytics_token.json" def main(): api_service_name = "youtubeAnalytics" api_version = "v2" client_secrets_file = "cliente_analytics.json" creds = None # 本地缓存已生成的凭证,避免每次运行都重复授权 if os.path.exists(TOKEN_PATH): creds = Credentials.from_authorized_user_file(TOKEN_PATH, scopes) # 凭证失效时自动刷新或重新走授权流程 if not creds or not creds.valid: if creds and creds.expired and creds.refresh_token: creds.refresh(Request()) else: flow = InstalledAppFlow.from_client_secrets_file( client_secrets_file, scopes ) # 用本地服务回调替代已废弃的run_console creds = flow.run_local_server(port=10086) # 把新生成的凭证存到本地 with open(TOKEN_PATH, "w") as token: token.write(creds.to_json()) youtube_analytics = build(api_service_name, api_version, credentials=creds) request = youtube_analytics.reports().query( dimensions="day", endDate="2021-04-01", ids="channel==MINE", maxResults=5, metrics="likes", startDate="2021-03-01" ) response = request.execute() print(response) if __name__ == "__main__": main() - 原代码里的
- 第一次运行代码会自动拉起浏览器跳转到谷歌授权页,正常登录对应YouTube账号授权即可。如果弹出「谷歌未验证此应用」的提示,不需要提交应用审核,点击提示页的「高级」->「继续访问(你的应用名)」就能完成授权,个人本地使用的脚本不需要走谷歌OAuth验证流程。
方案2:服务端部署的Web服务场景
不要使用桌面应用客户端,创建Web应用类型OAuth客户端,在谷歌云控制台的OAuth客户端配置页,把服务实际使用的回调地址添加到「已授权的重定向URI」列表中,代码里对应配置好重定向地址即可,不要使用任何OOB相关的回调地址。
内容的提问来源于stack exchange,提问作者MatmataHi
相关产品推荐
相关产品推荐

