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

时间:2015-08-25 21:06:16

标签: python-2.7 google-admin-sdk google-directory-api

目前我有一个方法可以检索所有~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个accts(下载大约需要10分钟)。想尽量减少沟通错误。请告知是否存在更好的方法或者也可以使用非循环方法。

1 个答案:

答案 0 :(得分:0)

由于您需要知道每个pageToken,并且只在检索到页面时才会这样做,因此无法批量执行此操作。但是,您可以通过获取更大的页面来提高性能:

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

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

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

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

最后,如果您的应用经常检索用户列表,turning on caching可能会有所帮助。