Python 使用服务帐户模拟Google Drive获取刷新令牌

Python 使用服务帐户模拟Google Drive获取刷新令牌,python,google-drive-api,google-oauth,google-admin-sdk,google-api-python-client,Python,Google Drive Api,Google Oauth,Google Admin Sdk,Google Api Python Client,我写了一个脚本,将在我们公司的多个用户Gdrive中搜索文件。问题是,该脚本只能工作一段时间,但随后会出现HTTP 401错误,很可能是由于访问令牌过期。我正在使用一个启用了域范围委托的服务帐户,并使用google.oauth2 python库创建一个驱动器服务对象(请参见下面的代码)。我想通过编程获得一个刷新令牌,并在当前令牌过期时生成新的访问令牌。问题是没有关于如何使用服务帐户实现这一点的文档。在正常的用户交互oauth流中,存在一个可用的方法。我的问题是如何使用驱动器对象检索刷新令牌,然后

我写了一个脚本,将在我们公司的多个用户Gdrive中搜索文件。问题是,该脚本只能工作一段时间,但随后会出现HTTP 401错误,很可能是由于访问令牌过期。我正在使用一个启用了域范围委托的服务帐户,并使用google.oauth2 python库创建一个驱动器服务对象(请参见下面的代码)。我想通过编程获得一个刷新令牌,并在当前令牌过期时生成新的访问令牌。问题是没有关于如何使用服务帐户实现这一点的文档。在正常的用户交互oauth流中,存在一个可用的方法。我的问题是如何使用驱动器对象检索刷新令牌,然后创建新的访问令牌。我知道我将不得不以某种方式使用我的服务帐户的私钥,但不确定

我一直在看这两份文件。

  • 使用模拟用户创建驱动器服务对象
来自google.oauth2导入服务\u帐户
导入GoogleAppClient.discovery
def模拟用户(用户模拟、密钥文件、域):
作用域=['https://www.googleapis.com/auth/drive',]
如果“用户\u到\u模拟”为“无”:
raise InvalidDomainUser(f“{user_to_impersonate}不是{domain}的成员”)
如果密钥_文件为“无”:
raise FileNotFoundError(f“{key_file}不是有效的服务帐户文件”)
委托的\u凭据=服务\u帐户.credentials.from\u服务\u帐户\u文件(
密钥文件,作用域=作用域)
#模拟用户。
委派的\u凭据=委派的\u凭据。具有\u主题(用户\u到\u模拟)
驱动器\服务=googleapiclient.discovery.build('drive','v2',凭证=委托\凭证)
#设置新的驱动器资源对象
返回驱动器服务
  • 列出用户驱动器中的文件
service=impersonate\u用户(用户到模拟、密钥文件、域):
children=service.children()
对于项目中的子项:
item=service.files().get(fileId=child['id']).execute()
打印(item.get(“title”,无))

模拟用户会生成过期的访问令牌。要获得一个新的访问令牌,只需按照与第一次相同的方式生成一个。服务帐户没有刷新令牌的概念,您只需使用凭据生成一个新的访问令牌


来源:Build

这是python服务帐户的基本代码。您需要添加委派部分

只要您使用相同的服务,库就应该在需要时为您获取一个新的访问令牌。它不应该过期

"""Hello drive"""

from apiclient.discovery import build
from oauth2client.service_account import ServiceAccountCredentials


SCOPES = ['https://www.googleapis.com/auth/drive.readonly']
KEY_FILE_LOCATION = '<REPLACE_WITH_JSON_FILE>'
VIEW_ID = '<REPLACE_WITH_VIEW_ID>'


def drive():
  """Initializes an drive service object.

  Returns:
    An authorized drive service object.
  """
  credentials = ServiceAccountCredentials.from_json_keyfile_name(
      KEY_FILE_LOCATION, SCOPES)

  # Build the service object.
  drive = build('drive', 'v3', credentials=credentials)

  return drive
“你好驱动器”
从apiclient.discovery导入生成
从oauth2client.service\u帐户导入ServiceAccountCredentials
作用域=['https://www.googleapis.com/auth/drive.readonly']
密钥文件位置=“”
视图ID=“”
def驱动器():
“”“初始化驱动器服务对象。
返回:
授权驱动器服务对象。
"""
credentials=ServiceAccountCredentials.from_json_keyfile_name(
密钥文件(位置、作用域)
#构建服务对象。
驱动器=生成('drive','v3',凭据=凭据)
回程驱动

当你说“脚本可以运行,但只能运行一段时间”时,具体需要多长时间?创建服务后,是否只使用一次来列出?或者您是否在延长时间后再次使用相同的服务对象?嘿,它将在大约1小时后过期。3600秒。之后,每个api调用都会导致401错误。我在一段时间内使用同一个驱动器对象,除非该用户驱动器中的文件或文件夹归其他人所有,在这种情况下,我将通过模拟新用户重新实例化该对象。为什么不在每次需要时(延长时间后)创建一个新的服务对象,确保
user\u to\u impersonate
始终是来自与服务帐户相同域的用户。您可以传递一个空值。但实际上,你的案例听起来像是在创建服务acocunt credentails,你的代码使用一个访问令牌来创建服务对象。这是我代码中的一个逻辑错误。但它现在似乎起作用了。谢谢你的帮助!你好,是的,1小时后它似乎仍然过期。我在lib\site packages\googleapiclient\http.py文件中得到了这个错误