python 目录 api 的代码,用于从域中批量检索所有用户

python code for directory api to batch retrieve all users from domain

目前我有一个方法可以检索所有 ~119,000 个 gmail 帐户并使用下面的 python 代码和启用的 admin.sdk + auth 2.0 将它们写入 csv 文件:

def get_accounts(self):
    students = []
    page_token = None
    params = {'customer': 'my_customer'}

    while True:
        try:
            if page_token:
                params['pageToken'] = page_token
            current_page = self.dir_api.users().list(**params).execute()

            students.extend(current_page['users'])

            # write each page of data to a file
            csv_file = CSVWriter(students, self.output_file)
            csv_file.write_file()

            # clear the list for the next page of data
            del students[:]

            page_token = current_page.get('nextPageToken')

            if not page_token:
                break

        except errors.HttpError as error:
            break

我想一次性检索所有 119,000,也就是说,无需循环或作为批调用。这可能吗?如果可以,您能否提供示例 python 代码?我 运行 遇到通信问题,必须多次重新 运行 该过程才能成功获得 ~119,000 个帐户(下载大约需要 10 分钟)。希望尽量减少通信错误。请告知是否存在更好的方法或非循环方法也是可能的。

无法批量执行此操作,因为您需要知道每个 pageToken,而这些仅在检索页面时提供。但是,您可以通过获取更大的页面来稍微提高性能:

params = {'customer': 'my_customer', 'maxResults': 500}

由于未设置 maxResults 时的默认页面大小为 100,因此添加 maxResults: 500 会将 API 调用的数量减少 5 个数量级。虽然每次调用可能需要稍长的时间,但您应该会注意到性能提升,因为您进行的 API 调用和 HTTP 往返次数要少得多。

您还应该查看使用 fields 参数仅指定您需要在列表中读取的用户属性。这样,您就不会浪费时间和带宽来检索您的应用从未使用过的用户详细信息。尝试类似的东西:

my_fields = 'nextPageToken,users(primaryEmail,name,suspended)'
params = {
  'customer': 'my_customer',
   maxResults': 500,
   fields: my_fields
   }

最后,如果您的应用相当频繁地检索用户列表,turning on caching 可能会有所帮助。