Skip to content

Instantly share code, notes, and snippets.

@carlopires
Created July 28, 2016 15:38
Show Gist options
  • Save carlopires/efbf607f746c5acb05b452571e784bbe to your computer and use it in GitHub Desktop.
Save carlopires/efbf607f746c5acb05b452571e784bbe to your computer and use it in GitHub Desktop.
Google API with eventlet - memberships download example
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