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
相关产品推荐
相关产品推荐

