2

我正在尝试使用 Python 查询 Google Analytics API。我已经按照文档中的示例进行操作。(我做了非常小的改动来帮助我调试我遇到的问题)。我不断得到一个“NoneType”对象没有属性“ __ getitem __ ”,我似乎无法解释。我只是按照 Google 提供的文档中的示例尝试获取 2012 年 3 月 3 日的 ga:visits 数据。

我正在运行的代码是:

#!/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__'

任何人都可以通过解释出了什么问题并向我们展示我们需要解决的问题来帮助我们吗?:)

谢谢

4

4 回答 4

3

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

是的,首先错误是因为

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

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

于 2014-05-24T13:37:31.753 回答
2

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

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

正在返回 None 并且profiles.get('items')失败了。

于 2012-08-14T13:40:44.473 回答
1

就我而言,只是在提到的日期之间我没有会议。所以返回了相同的“NoneType”对象

于 2014-05-26T16:02:56.260 回答
0

是的,我遇到了同样的问题。默认日期范围是“过去 7 天”,因为没有会话,我收到错误消息。但是一旦我增加了日期范围,我就得到了想要的输出

于 2016-02-11T23:05:55.873 回答