Google Analytics API access without local browser

2019-04-05 14:49发布

问题:

I want to query the Google Analytics API using Python to periodically download data from my Analytics account and store data in a local database. I am basically following the steps as given in the basic tutorial. I am using the Google client API library for Python in this process.

My script is working fine so far when I am running it on my local dev machine (Mac). When I start the script, my browser opens and I am prompted to grant access to my Analytics data from the app. Afterwards I can run my script as often as I want and get access to my data.

On my server (Ubuntu, only terminal available), the w3m browser opens, but I cannot access my Google account from there. I can only quit w3m and kill the program with Ctrl-C. There is an error message like:

Your browser has been opened to visit:

https://accounts.google.com/o/oauth2/auth?scope=some_long_url&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

However when I run my script with the parameter --noauth_local_webserver, I get the same results - w3m opens and I cannot authenticate.

How can I get the --noauth_local_webserver to work? I there another way to authenticate without a local browser on the same machine?

回答1:

When you use FLAGS = gflags.FLAGS, you actually need to pass the command-line arguments to FLAGS (this may or may not have tripped me up as well :) ). See here for an Analytics-centric example of how to do it (code below as links tend to go away after a while). General idea is that argv arguments are passed into the FLAGS variable, which then become available to other modules.

# From samples/analytics/sample_utils.py in the google-api-python-client source

def process_flags(argv):
  """Uses the command-line flags to set the logging level.

  Args:
    argv: List of command line arguments passed to the python script.
  """

  # Let the gflags module process the command-line arguments.
  try:
    argv = FLAGS(argv)
  except gflags.FlagsError, e:
    print '%s\nUsage: %s ARGS\n%s' % (e, argv[0], FLAGS)
    sys.exit(1)

  # Set the logging according to the command-line flag.
  logging.getLogger().setLevel(getattr(logging, FLAGS.logging_level))

Also, turns out that we aren't alone! You can track this bug to see when this will get added the documentation.



回答2:

you can also use GA as a service API:https://developers.google.com/analytics/devguides/reporting/core/v3/quickstart/service-py this works perfectly fine. Just remmeber to convert the p12 to an unencryptet PEM file using openssl $openssl pkcs12 -in client_secrets.p12 -nodes -nocerts > client_secrets.pem the import password is printed out when you download the P12 from google developer's console



回答3:

I ran into the same issue and managed to solve it by SSHing into my server. Example:

ssh -L 8080:127.0.0.1:8080 <server-name>

I then ran my script through SSH. When I was presented with the URL (https://accounts.google.com/o/oauth2/auth?scope=some_long_url&access_type=offline), I copied and pasted into the browser on my machine to complete the authentication flow.