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

如何在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验证失败。

验证修复效果

  1. 运行代码完成首次授权,确认控制台输出有效Refresh Token。
  2. 等待1小时(Access Token过期)后再次运行,确认自动刷新Token成功,无需重新授权。
  3. 若次日仍报错,检查:
    • 用户是否在Google账号「安全-第三方应用访问」中撤销了授权。
    • test.json文件是否被修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 16:36:23