1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | import os import httplib2 from apiclient.discovery import build from oauth2client.client import flow_from_clientsecrets from oauth2client.file import Storage from oauth2client.tools import run from pylons import config def _prepare_credentials(token_filename, credentials_filename): """ Either returns the user's oauth credentials or uses the credentials file to generate a token (by forcing the user to login in the browser) """ storage = Storage(token_filename) credentials = storage.get() if credentials is None or credentials.invalid: flow = flow_from_clientsecrets(credentials_filename, scope='https://www.googleapis.com/auth/analytics.readonly', message="Can't find the credentials file") credentials = run(flow, storage) return credentials def init_service(token_file, credentials_file): """ Given a file containing the user's oauth token (and another with credentials in case we need to generate the token) will return a service object representing the analytics API. """ http = httplib2.Http() credentials = _prepare_credentials(token_file, credentials_file) http = credentials.authorize(http) # authorize the http object return build('analytics', 'v3', http=http) def get_profile_id(service): """ Get the profile ID for this user and the service specified by the 'googleanalytics.id' configuration option. This function iterates over all of the accounts available to the user who invoked the service to find one where the account name matches (in case the user has several). """ accounts = service.management().accounts().list().execute() if not accounts.get('items'): return None accountName = config.get('googleanalytics.account') if not accountName: raise Exception('googleanalytics.account needs to be configured') webPropertyId = config.get('googleanalytics.id') if not webPropertyId: raise Exception('googleanalytics.id needs to be configured') for acc in accounts.get('items'): if acc.get('name') == accountName: accountId = acc.get('id') webproperties = service.management().webproperties().list(accountId=accountId).execute() profiles = service.management().profiles().list( accountId=accountId, webPropertyId=webPropertyId).execute() if profiles.get('items'): return profiles.get('items')[0].get('id') return None |