2012-08-14 119 views
2

我在尝试使用Python查询Google Analytics API。我已经按照文档中的示例进行了操作。 (我做了很小的改动来帮助我调试我遇到的问题)。我一直得到'NoneType'对象没有属性'__ getitem __'',我似乎无法解释。我只是遵循Google提供的文档中的示例,该文档尝试获取03/03/2012的ga:访问数据。Python中的Google Analytics API

我跑的代码是:

#!/usr/bin/python 
# -*- coding: utf-8 -*- 

import sys 

# import the Auth Helper class 
import hello_analytics_api_v3_auth 

from apiclient.errors import HttpError 
from oauth2client.client import AccessTokenRefreshError 

def main(argv): 
    # Step 1. Get an analytics service object. 
    print "I got here twice" 
    service = hello_analytics_api_v3_auth.initialize_service() 

    try: 
    # Step 2. Get the user's first profile ID. 
    profile_id = get_first_profile_id(service) 
    print profile_id 

    if profile_id: 
     # Step 3. Query the Core Reporting API. 
     results = get_results(service, profile_id) 
     print "I got the results" 

     # Step 4. Output the results. 
     print_results(results) 
     print "I printed the results" 

    except TypeError, error: 
    # Handle errors in constructing a query. 
    print ('There was an error in constructing your query : %s' % error) 

    except HttpError, error: 
    # Handle API errors. 
    print ('Arg, there was an API error : %s : %s' % 
      (error.resp.status, error._get_reason())) 

    except AccessTokenRefreshError: 
    # Handle Auth errors. 
    print ('The credentials have been revoked or expired, please re-run ' 
      'the application to re-authorize') 

def get_first_profile_id(service): 
    # Get a list of all Google Analytics accounts for this user 
    print "I am trying to get first profile ID" 
    accounts = service.management().accounts().list().execute() 

    if accounts.get('items'): 
    # Get the first Google Analytics account 
    firstAccountId = accounts.get('items')[0].get('id') 

    # Get a list of all the Web Properties for the first account 
    webproperties = service.management().webproperties().list(accountId=firstAccountId).execute() 

    if webproperties.get('items'): 
     # Get the first Web Property ID 
     firstWebpropertyId = webproperties.get('items')[0].get('id') 

     # Get a list of all Profiles for the first Web Property of the first Account 
     profiles = service.management().profiles().list(
      accountId=firstAccountId, 
      webPropertyId=firstWebpropertyId).execute() 

     if profiles.get('items'): 
     # return the first Profile ID 
     return profiles.get('items')[0].get('id') 

    return None 


def get_results(service, profile_id): 
    # Use the Analytics Service Object to query the Core Reporting API 
    return service.data().ga().get(
     ids='ga:' + profile_id, 
     start_date='2012-03-03', 
     ##The start date dates range is hard coded here 
     ##We have to change this so it becomes an input parameter 
     end_date='2012-03-03', 
     ##The end date is also hard coded in 
     ##Change this to be an input parameter 
     ##If you run out of ideas, read the start date off a txt file 
     ##And then have the user change the text file before running 
     ##the program 
     metrics='ga:visits').execute() 

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

    else: 
    print 'No results found' 

##if __name__ == '__main__': 
main(sys.argv) 

这是返回结果如下:

I got here twice 
I am trying to get first profile ID 
REDACT PROFILE ID 
I got the results 
{u'kind': u'analytics#gaData', u'containsSampledData': False}, u'itemsPerPage': 1000, u'totalsForAllResults': {u'ga:visits': u'0'}, u'columnHeaders': [{u'dataType': u'INTEGER', u'columnType': u'METRIC', u'name': u'ga:visits'}], u'query': {u'max-results': 1000, u'start-date': u'2012-03-03', u'start-index': 1, u'ids': u'ga:REDACTED', u'metrics': [u'ga:visits'], u'end-date': u'2012-03-03'}, u'totalResults': 0, u'id': u'https://www.googleapis.com/analytics/v3/data/ga?ids=ga:4159539&metrics=ga:visits&start-date=2012-03-03&end-date=2012-03-03&start-index=1&max-results=1000', u'selfLink': u'https://www.googleapis.com/analytics/v3/data/ga?ids=ga:4159539&metrics=ga:visits&start-date=2012-03-03&end-date=2012-03-03&start-index=1&max-results=1000'} 
First Profile: H - REDACTED 
There was an error in constructing your query : 'NoneType' object has no attribute '__getitem__' 

任何人都可以帮助我们解释发生了什么错误,向我们展示了我们需要修复? :)

谢谢

+0

'结果'是什么类型? – fredrik 2012-08-14 13:42:02

回答

2

在调用get函数之前确保对象不是None。也许

service.management().profiles().list(
      accountId=firstAccountId, 
      webPropertyId=firstWebpropertyId).execute() 

将返回None和profiles.get('items')失败。

3

你为时已晚,但也许有人会有类似的问题。

是,在第一点错误是因为

 `service.management().profiles().list(
     accountId=firstAccountId, 
     webPropertyId=firstWebpropertyId).execute()` 

将返回无。但可读的答案是,你在给定日期没有任何会话。这是我的情况,因为我想从2012年获取数据,并且API未在结果中返回('rows')

1

就我而言,这只是我在上述日期之间没有会话。所以得到了相同的'NoneType'对象返回

0

是的我有同样的问题。默认日期范围是“最近七天”,因为没有会话,所以我收到错误。但是,一旦我增加了日期范围,我得到了期望的输出