如何在Google YouTube Data API中使用刷新令牌?解决invalid_grant持续报错
解决YouTube Data API的
invalid_grant错误及Refresh Token正确使用指南 问题根源分析
你遇到的google.auth.exceptions.RefreshError: ('invalid_grant: Bad Request')错误,通常由以下原因导致:
- Refresh Token无效/已过期:Installed应用类型的Refresh Token默认长期有效,但超过6个月未使用、用户手动撤销授权或关联客户端密钥变更时会失效。
- 未正确请求离线访问权限:你的认证流程未明确指定
access_type='offline',可能仅获取到短期Access Token,未拿到Refresh Token。 - 系统时间偏差:本地设备时间与Google服务器时间差超过5分钟,会导致Token验证失败。
- 凭据不匹配:Pickle文件中保存的凭据与当前
test.json里的客户端ID/密钥不一致。
正确使用Refresh Token的方法
1. 确保获取有效Refresh Token
创建认证流时必须添加access_type='offline'参数,明确请求长期Refresh Token:
flow = InstalledAppFlow.from_client_secrets_file(CLIENT_SECRETS_FILE, SCOPES) flow.params.update({'access_type': 'offline', 'prompt': 'consent'}) # 添加此行 cred = flow.run_console()
access_type='offline':告知Google你需要离线访问权限,触发返回Refresh Token。prompt='consent':强制用户重新授权,确保每次都能获取到Refresh Token(调试阶段适用,正式环境可按需调整)。
2. 完善Refresh Token的错误处理
修改Google.py中的认证逻辑,当Refresh Token失效时自动重新获取授权:
from google.auth.exceptions import RefreshError # 需导入该异常 if not cred or not cred.valid: if cred and cred.expired and cred.refresh_token: try: cred.refresh(Request()) except RefreshError: # Refresh Token失效,重新发起授权 flow = InstalledAppFlow.from_client_secrets_file(CLIENT_SECRETS_FILE, SCOPES) flow.params.update({'access_type': 'offline', 'prompt': 'consent'}) cred = flow.run_console() else: flow = InstalledAppFlow.from_client_secrets_file(CLIENT_SECRETS_FILE, SCOPES) flow.params.update({'access_type': 'offline', 'prompt': 'consent'}) cred = flow.run_console() with open(pickle_file, 'wb') as token: pickle.dump(cred, token)
3. 验证Refresh Token有效性
打印cred.refresh_token确认是否获取到有效Token:
print(f"Refresh Token: {cred.refresh_token}")
若输出为None,说明未成功获取,需检查认证流程参数。
如何创建有效期超过24小时的令牌
针对YouTube Data API:
- 普通个人频道:使用
access_type='offline'获取的Refresh Token默认有效期为6个月(定期使用会自动续期),Access Token有效期1小时,可通过Refresh Token自动刷新,无需用户干预,实现长期无交互授权。 - 服务账号:仅适用于Google Workspace账号关联的频道,个人频道无法使用。服务账号可实现长期无交互授权,但YouTube API不支持其直接上传视频到普通个人频道。
针对你代码的具体修复步骤
1. 补全认证流程参数
修改Google.py中的Create_Service函数,添加access_type='offline'和prompt='consent'参数(如前文代码所示)。
2. 删除旧Pickle文件
删除当前目录下的token_youtube_v3.pickle文件,强制重新获取包含有效Refresh Token的凭据。
3. 修正视频上传请求错误
request_body中的categoryI是拼写错误,改为categoryId:'snippet': { 'categoryId': 10, # 修正拼写错误 ... }publishAt格式需符合RFC 3339标准,使用Google.py中的convert_to_RFC_datetime函数生成:upload_video_time = convert_to_RFC_datetime(2022, 8, 23, 0, 0)
4. 同步系统时间
确保本地设备时间与网络时间同步,避免因时间偏差导致Token验证失败。
验证修复效果
- 运行代码完成首次授权,确认控制台输出有效Refresh Token。
- 等待1小时(Access Token过期)后再次运行,确认自动刷新Token成功,无需重新授权。
- 若次日仍报错,检查:
- 用户是否在Google账号「安全-第三方应用访问」中撤销了授权。
test.json文件是否被修改。
内容的提问来源于stack exchange,提问作者absoluutly_begginer
相关产品推荐
相关产品推荐

