Created
July 28, 2016 15:38
-
-
Save carlopires/efbf607f746c5acb05b452571e784bbe to your computer and use it in GitHub Desktop.
Google API with eventlet - memberships download example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import eventlet | |
eventlet.patcher.monkey_patch(select=True, socket=True) | |
import json | |
import time | |
import codecs | |
import httplib2 | |
import logging | |
logging.basicConfig(level=logging.DEBUG) | |
from oauth2client.service_account import ServiceAccountCredentials | |
from googleapiclient.discovery import build | |
from googleapiclient.http import HttpError | |
SERVICE_ACCOUNT_EMAIL = 'my service account email' | |
GOOGLE_ADMIN_EMAIL = 'my google admin email' | |
APP_PKCS12_FILE_PATH = 'my_app_pkcs12_file.p12' | |
scopes = ( | |
'https://www.googleapis.com/auth/admin.directory.group', | |
) | |
def fetch(group_email): | |
credentials = ServiceAccountCredentials.from_p12_keyfile( | |
SERVICE_ACCOUNT_EMAIL, | |
APP_PKCS12_FILE_PATH, | |
scopes=scopes).create_delegated(GOOGLE_ADMIN_EMAIL) | |
http_client = credentials.authorize(httplib2.Http()) | |
service = build('admin', 'directory_v1', http=http_client) | |
page = None | |
members = [] | |
kwargs = {'groupKey': group_email} | |
while 1: | |
if page: | |
kwargs['pageToken'] = page | |
try: | |
result = service.members().list(**kwargs).execute(num_retries=5) | |
except HttpError as error: | |
if error.resp.status == 404: | |
print('{}: not found'.format(group_email)) | |
return | |
else: | |
raise | |
members.extend(result.get('members', [])) | |
if 'nextPageToken' in result: | |
page = result['nextPageToken'] | |
else: | |
break | |
group_name = group_email.split('@')[0] | |
group_members_filename = 'membersof_{}.json'.format(group_name) | |
with codecs.open(group_members_filename, 'w', encoding='UTF8') as emails: | |
json.dump(members, emails) | |
print('{}: {} memberhips'.format(group_email, len(members))) | |
def main(): | |
with open('groups_emails.json') as users: | |
groups = json.load(users) | |
pool = eventlet.GreenPool(size=100) | |
t0, count = time.time(), 0 | |
for group_email in groups: | |
pool.spawn_n(fetch, group_email) | |
count += 1 | |
if count == 15: # max requests per second | |
eventlet.sleep(int(t0)+1 - t0) | |
t0, count = time.time(), 0 | |
pool.waitall() | |
if __name__ == '__main__': | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment