Query Google Analytics API with a service account in Python

I recently needed to display a visitor counter on a website by some client’s weird demand. Maybe the 90s are coming back. Anyway, I thought it makes sense to query Google Analytics directly, but Google’s API example were not really helping. After some digging around, I finally found a solution. You’ll need oauth2client and google-api-python-client for it to work. Then follow these instructions on Google Developers to create a service account that only has access to the API without the need for a human to request some oauth token. It will give you a private key to work with.

from apiclient.discovery import build
from oauth2client.client import SignedJwtAssertionCredentials
import httplib2

def get_analytics_visitors():
    f = file('privatekey.p12', 'rb')
    key = f.read()
    f.close()
    credentials = SignedJwtAssertionCredentials('[email protected]',
                                                key,
                                                scope='https://www.googleapis.com/auth/analytics.readonly')
    http = httplib2.Http()
    http = credentials.authorize(http)
    service = build('analytics', 'v3', http=http)
    data_query = service.data().ga().get(**{
        'ids': 'ga:YOUR_PROFILE_ID_NOT_UA',
        'metrics': 'ga:visitors',
        'start_date': '2013-01-01',
        'end_date': '2015-01-01'
        })
    feed = data_query.execute()
    return feed['rows'][0][0]

Published by

Julian Bez

Julian Bez

Julian Bez is a software engineer and former startup founder from Berlin, Germany.

  • Dzung Nguyen

    Hi, this is very useful for me as I need to access a google api permanently. However when I run the code, I think the credentials does not return an access token and therefore there’s no output from the program:

    (credentials.access_token is empty)

    How to fix this issue?

  • http://www.julianbez.com/ Julian Bez

    Do you still have this problem?

    Did you get a correct key from Google and is this the complete error?

  • Reiner

    Hi @julian, thanks for this post.
    I have to implement something similar to this (pageviews instead of visitors), but I’m getting the following error when privatekey going to be used

    PKCS12 format is not supported by the PyCrpto library. Try converting to a “PEM” (openssl pkcs12 -in xxxxx.p12 -nodes -nocerts > privatekey.pem) or using PyOpenSSL if native code is an option.

    then I tried to use openssl command, but it is asking me a password


    $ openssl pkcs12 -in privatekey.p12 -nodes -nocerts > privatekey.pem
    Enter Import Password:

    any idea which password I should use?

    thanks in advance!

  • Joar

    The password for the private key is “notasecret”. It’s set as a default argument in the __init__() method of the SignedJwtAssertionCredentials class.

  • Scott Davenport

    Hi Julian,

    I am trying to do something similar to what you have done with the above code and was wondering if you would be willing to discuss via email. I would really appreciate some help!

    Thanks,
    Scott