2
votes

I am trying to import Google Analytics data to Google Cloud DataLab and having trouble with the oauth2 part of it.

I am basically following this quick start and I got it working in my terminal but then I moved it to Cloud Datalab I run the code and get this message:

Your browser has been opened to visit:

https://accounts.google.com/o/oauth2/auth?scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fanalytics.readonly&redirect_uri=http%3A%2F%2Flocalhost%3A8090%2F&response_type=code&client_id=xxxxxxxxxxxx.apps.googleusercontent.com&access_type=offline

If your browser is on a different machine then exit and re-run this
application with the command-line parameter 

  --noauth_local_webserver

I click the link and go through the authentication process and allow access but it kicks me back to a localhost url that 404s: http://localhost:8090/?code=4/xxxxxxxxxxxxxxx2C-WoxViSyyyyyyyyyxMsvGgs#

And never gives access to the datalab notebook.

How do I get it redirect me back to the correct place or authenticate that notebook? Or is there another oauth method I should use?

Here is all the code I'm running:

import argparse

from apiclient.discovery import build
import httplib2
from oauth2client import client
from oauth2client import file
from oauth2client import tools

def get_service(api_name, api_version, scope, client_secrets_path):
    """Get a service that communicates to a Google API.

    Args:
    api_name: string The name of the api to connect to.
    api_version: string The api version to connect to.
    scope: A list of strings representing the auth scopes to authorize for the
        connection.
    client_secrets_path: string A path to a valid client secrets file.

    Returns:
    A service that is connected to the specified API.
    """
    # Parse command-line arguments.
    parser = argparse.ArgumentParser(
        formatter_class=argparse.RawDescriptionHelpFormatter,
        parents=[tools.argparser])
    flags = parser.parse_args([])

    # Set up a Flow object to be used if we need to authenticate.
    flow = client.flow_from_clientsecrets(
        client_secrets_path, scope=scope,
        message=tools.message_if_missing(client_secrets_path))

    # Prepare credentials, and authorize HTTP object with them.
    # If the credentials don't exist or are invalid run through the native client
    # flow. The Storage object will ensure that if successful the good
    # credentials will get written back to a file.
    storage = file.Storage(api_name + '.dat')
    credentials = storage.get()
    if credentials is None or credentials.invalid:
        credentials = tools.run_flow(flow, storage, flags)
    http = credentials.authorize(http=httplib2.Http())
    # Build the service object.
    service = build(api_name, api_version, http=http)
    return service

def get_results(service, profile_id):
    # Use the Analytics Service Object to query the Core Reporting API
    # for the number of sessions in the past seven days.
    return service.data().ga().get(
        ids='ga:' + profile_id,
        start_date='7daysAgo',
        end_date='today',
        metrics='ga:sessions').execute()

def print_results(results):
    # Print data nicely for the user.
    if results:
        print ('View (Profile): %s' % results.get('profileInfo').get('profileName'))
        print ('Total Sessions: %s' % results.get('rows')[0][0])

    else:
        print ('No results found')

def get_data():
    # Define the auth scopes to request.
    scope = ['https://www.googleapis.com/auth/analytics.readonly']

    # Authenticate and construct service.
    service = get_service('analytics', 'v3', scope, 'client_secrets.json')
    profile = '75633300' #get_first_profile_id(service)
    print_results(get_results(service, profile))

get_data()
1
I am also facing the same issue, are you able to connect to google-analytics from datalab ??Rinsen S

1 Answers

-1
votes

Here is the answer!

craigcitro commented on 10 Jun 2017

The issue here is just what @ncouture guessed -- you're not passing any args to parse_args, so it's trying to parse sys.argv.

Try calling argparser.parse_args([]), or add additional arguments there as you'd like.

So you just execute "create service" with flags = parser.parse_args(['--noauth_local_webserver'])