【问题标题】:How to get everyone's Gmail with G-Suite Admin SDK Directory API?如何使用 G-Suite Admin SDK Directory API 获取每个人的 Gmail?
【发布时间】:2019-03-13 09:39:55
【问题描述】:

我有一个 G-Suite 管理员帐户,我使用此代码获取我公司的 gmail 地址:

from __future__ import print_function
import pickle
import os.path
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request

SCOPES = ['https://www.googleapis.com/auth/admin.directory.user']
def main():
    creds = None
    if os.path.exists('token.pickle'):
        with open('token.pickle', 'rb') as token:
            creds = pickle.load(token)
    # If there are no (valid) credentials available, let the user log in.
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file('Calendar_Administrator.json', SCOPES)
            creds = flow.run_local_server()
        # Save the credentials for the next run
        with open('token.pickle', 'wb') as token:
            pickle.dump(creds, token)
    service = build('admin', 'directory_v1', credentials=creds)
    results = service.users().list(customer='my_customer', maxResults=500,orderBy='email').execute()
    users = results.get('users', [])
    if not users:
        print('No users in the domain.')
    else:
        print('Users:')
        for user in users:
            print(u'{0} {1}'.format(user['primaryEmail'],
                user['name']['fullName']))


if __name__ == '__main__':
    main()

正如官方page所说:

maxResults:要返回的最大结果数。默认值为 100。最大值为 500。可接受的值为 1 到 500,包括 1 到 500。

我只能得到500个gmail地址。实际上,我公司有3000多人。

如何获取大家的邮箱?如何修改我的代码?

【问题讨论】:

    标签: python-3.x google-api google-admin-sdk


    【解决方案1】:

    我使用 nextPageToken 来解决这个问题,我的代码:

    from __future__ import print_function
    import pickle
    import os.path
    from googleapiclient.discovery import build
    from google_auth_oauthlib.flow import InstalledAppFlow
    from google.auth.transport.requests import Request
    
    SCOPES = 'https://www.googleapis.com/auth/admin.directory.user'
    def main():
    
        creds = None
        if os.path.exists('token.pickle'):
            with open('token.pickle', 'rb') as token:
                creds = pickle.load(token)
        # If there are no (valid) credentials available, let the user log in.
        if not creds or not creds.valid:
            if creds and creds.expired and creds.refresh_token:
                creds.refresh(Request())
            else:
                flow = InstalledAppFlow.from_client_secrets_file('Calendar_Administrator.json', SCOPES)
                creds = flow.run_local_server()
            # Save the credentials for the next run
            with open('token.pickle', 'wb') as token:
                pickle.dump(creds, token)
        service = build('admin', 'directory_v1', credentials=creds)
        results = service.users().list(customer='my_customer',maxResults=500,orderBy='email').execute()
        users = results.get('users', [])
        nextPageToken = results.get('nextPageToken', {})
        print(nextPageToken)
        if not users:
            print('No users in the domain.')
        else:
            print('Users:')
            for user in users:
                print(u'{0} {1}'.format(user['primaryEmail'],
                    user['name']['fullName']))
    
    
        loopFlag = True
        while loopFlag:
            if nextPageToken:
                print(nextPageToken)
                results = service.users().list(customer='my_customer', pageToken = nextPageToken, maxResults=500, orderBy='email').execute()
                users = results.get('users', [])
                if not users:
                    print('No users in the domain.')
                else:
                    print('Users:')
                    for user in users:
                        print(u'{0} {1}'.format(user['primaryEmail'],
                                                user['name']['fullName']))
    
                nextPageToken = results.get('nextPageToken', {})
                if not nextPageToken:
                    loopFlag = False
                    break
    
    
    if __name__ == '__main__':
        main()
    

    【讨论】:

      【解决方案2】:

      您正在使用Users:list 检索已删除用户或域中所有用户的分页列表。设置为maxResults 的数字代表maximum number of results per page。由于您已经获得了 Gmail 地址,我很确定您的回复如下所示:

      {
        "kind": "admin#directory#users",
        "etag": etag,
        "users": [
          users Resource
        ],
        "nextPageToken": string
      }
      

      您已经在检索所有用户,但您没有看到它,因为您没有指定 nextPageToken,这是用于访问此结果的下一页的令牌。您可以在此page 底部找到此信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-07
        • 2018-04-17
        • 2021-01-28
        • 2018-10-20
        • 1970-01-01
        • 1970-01-01
        • 2018-11-30
        • 2018-04-22
        相关资源
        最近更新 更多