【发布时间】:2018-12-01 21:51:26
【问题描述】:
我是一名拥有近 300 名用户的 GSuite 管理员,我正在从 GSuite 迁移出去。我需要下载他们创建/上传的所有用户文件。
我从编写 Python 脚本开始,该脚本将在列表中显示用户文件,似乎我遇到了压倒性的授权问题。
- 我在 Google 控制台中创建了一个项目,并创建了一个服务帐户,其中包含私钥(基于 json)并勾选了 GSuite 域范围的委派复选框
- 在我的 GSuite 管理面板中,我在管理 API 访问这些范围中添加了新创建的客户端 ID 和权限范围:
https://www.googleapis.com/auth/drive,https://www.googleapis.com/auth/admin.datatransfer,https://www.googleapis.com/auth/admin.directory.user, https://www.googleapis.com/auth/admin.directory.group
根据文档(https://developers.google.com/admin-sdk/directory/v1/guides/delegation)非常好
-
我正在从 ServiceAccountCredentials 创建一个资源对象,并分别基于 API 名称/版本“drive”和“v3”构建一个对象,并尝试根据 Google 的快速入门 (https://developers.google.com/drive/api/v3/quickstart/python) 获取文件列表:
from googleapiclient.discovery import build from oauth2client.service_account import ServiceAccountCredentials SERVICE_ACCOUNT_EMAIL = "drive-getter@mygoogledomain.iam.gserviceaccount.com" SERVICE_ACCOUNT_PKCS12 = "./service_key.json" def create_directory_service(user_email): credentials = ServiceAccountCredentials.from_json_keyfile_name(SERVICE_ACCOUNT_PKCS12, scopes=['https://www.googleapis.com/auth/drive']) credentials = credentials.create_delegated(user_email) return build('drive', 'v3', credentials=credentials) resource = create_directory_service('username@mydomain.com') results = resource.files().list( pageSize=10, fields="nextPageToken, files(id, name)" ).execute() items = results.get('files', []) print(items)
看起来完全正确,但我收到以下错误消息:
连接到 pydev 调试器(内部版本 181.5087.37)
Traceback(最近一次调用最后一次):文件 “/Applications/PyCharm.app/Contents/helpers/pydev/pydevd.py”,行 1664 年,在 main() 文件“/Applications/PyCharm.app/Contents/helpers/pydev/pydevd.py”,行 1658,主要 globals = debugger.run(setup['file'], None, None, is_module) File "/Applications/PyCharm.app/Contents/helpers/pydev/pydevd.py", 第 1068 行,运行中 pydev_imports.execfile(file, globals, locals) # 执行脚本文件 "/Applications/PyCharm.app/Contents/helpers/pydev/_pydev_imps/_pydev_execfile.py", 第 18 行,在 execfile 中 exec(compile(contents+"\n", file, 'exec'), glob, loc) File "/Users/probe/Projects/drive_getter/src/dconnect.py",第 16 行,在 pageSize=10, fields="nextPageToken, files(id, name)" 文件 "/Users/probe/Projects/drive_getter/drive_getter/lib/python3.6/site-packages/googleapiclient/_helpers.py", 第 130 行,在 positional_wrapper 中 返回包装的(*args,**kwargs)文件“/Users/probe/Projects/drive_getter/drive_getter/lib/python3.6/site-packages/googleapiclient/http.py”, 第 835 行,执行中 方法=str(self.method), body=self.body, headers=self.headers) 文件 "/Users/probe/Projects/drive_getter/drive_getter/lib/python3.6/site-packages/googleapiclient/http.py", 第 162 行,在 _retry_request 中 resp, content = http.request(uri, method, *args, **kwargs) 文件 "/Users/probe/Projects/drive_getter/drive_getter/lib/python3.6/site-packages/oauth2client/transport.py", 第 159 行,在 new_request 中 credentials._refresh(orig_request_method)文件“/Users/probe/Projects/drive_getter/drive_getter/lib/python3.6/site-packages/oauth2client/client.py”, 第 749 行,在 _refresh 中 self._do_refresh_request(http) 文件“/Users/probe/Projects/drive_getter/drive_getter/lib/python3.6/site-packages/oauth2client/client.py”, 第 819 行,在 _do_refresh_request 中 引发 HttpAccessTokenRefreshError(error_msg, status=resp.status) oauth2client.client.HttpAccessTokenRefreshError:未授权客户端: 客户端未经授权无法使用此方法检索访问令牌。
知道在这个过程中做错了什么吗?再说一遍 - 我的目标是列出所有 GSuite 用户的所有用户文件并稍后下载,因此我正在考虑循环我的用户电子邮件并对所有用户应用相同的逻辑,直到我下载所有文件。
感谢您的合作!
【问题讨论】:
-
你能用
fields="files(id, name)"试试这个吗?
标签: python oauth google-api google-drive-api google-oauth