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

PyDrive为何运行一段时间后停止自动刷新访问令牌?

解决PyDrive2定期上传时的RefreshError问题

问题根源

你遇到的pydrive2.auth.RefreshError本质是桌面应用类型的刷新令牌有效期仅7-14天,到期后无法自动续期,导致认证失败。当前采用的手动浏览器认证属于桌面应用授权,默认存在这个期限限制。

解决方案

1. 切换到服务账号授权(推荐,无需手动重复认证)

服务账号的令牌无有效期限制,适合长期自动化任务:

  • 在Google Cloud后台创建服务账号:
    • 进入IAM与管理 > 服务账号,创建新账号,角色选择「Editor」或更精细的Drive权限
    • 为该账号生成JSON密钥文件(下载后重命名为service_account.json,放置到项目目录)
  • 修改PyDrive2的认证代码:
    from pydrive2.auth import GoogleAuth
    from pydrive2.drive import GoogleDrive
    
    gauth = GoogleAuth()
    # 启用服务账号认证
    gauth.ServiceAuth(service_account_file='service_account.json')
    drive = GoogleDrive(gauth)
    
  • 给服务账号授权目标Drive文件夹:
    打开需要上传的Google Drive文件夹,共享给服务账号的邮箱(JSON密钥文件中的client_email字段),权限设置为「编辑」

2. 延长桌面应用刷新令牌有效期(临时缓解方案)

若不想更换服务账号,可尝试延长桌面应用的刷新令牌有效期:

  • 进入Google Cloud后台 > API与服务 > 凭据 > 找到你的OAuth客户端ID(桌面应用类型)
  • 点击「编辑OAuth客户端」,在「高级设置」中,将「令牌有效期」的刷新令牌设置为「长期」(部分账号可能需要申请,不一定能成功)
  • 重新生成credentials.json,之后有效期会延长,但仍存在上限

3. 自动处理令牌失效(兜底方案)

如果以上方法无法实施,可在代码中捕获RefreshError,自动触发重新认证:

from pydrive2.auth import GoogleAuth, RefreshError
from pydrive2.drive import GoogleDrive
import os

def get_authenticated_drive():
    gauth = GoogleAuth()
    # 尝试加载已有凭据
    if os.path.exists('credentials.json'):
        gauth.LoadCredentialsFile('credentials.json')
    if gauth.credentials is None or gauth.access_token_expired:
        # 无凭据或令牌过期时尝试刷新
        try:
            gauth.Refresh()
        except RefreshError:
            # 刷新失败则删除旧凭据,重新启动认证流程
            if os.path.exists('credentials.json'):
                os.remove('credentials.json')
            gauth.LocalWebserverAuth()
        # 保存新凭据
        gauth.SaveCredentialsFile('credentials.json')
    gauth.Authorize()
    return GoogleDrive(gauth)

# 使用示例
drive = get_authenticated_drive()
# 后续上传逻辑代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 10:33:22