python中的gdata分析客户端问题

时间:2011-04-07 05:01:08

标签: python google-analytics gdata

我能够使用Google的gdata python库成功检索Google Analytics的OAuth访问令牌。

但是,我尝试使用令牌访问Google Analytics数据失败了。以下是相关的代码段:

client = gdata.analytics.client.AnalyticsClient(source='myapp')

client.auth_token = access_token # retrieved earlier

dataQuery = gdata.analytics.client.DataFeedQuery({
    'ids': 'ga:********',
    'start-date': '2011-03-23',
    'end-date': '2011-04-04',
    'metrics': 'ga:percentNewVisits',
    'max-results': 50})

data = client.GetDataFeed(dataQuery)

我得到以下stacktrace:

  

追踪(最近的呼叫最后):
  文件   “/Library/Python/2.6/site-packages/django/core/servers/basehttp.py”   第280行,在运行中       self.result = application(self.environ,   self.start_response)

     

文件   “/Library/Python/2.6/site-packages/django/core/servers/basehttp.py”   第674行,致电       return self.application(environ,start_response)

     

文件   “/Library/Python/2.6/site-packages/django/core/handlers/wsgi.py”   第248行,致电       response = self.get_response(request)

     

文件   “/Library/Python/2.6/site-packages/django/core/handlers/base.py”   第141行,在get_response中       return self.handle_uncaught_exception(request,   resolver,sys.exc_info())

     

文件   “/Library/Python/2.6/site-packages/django/core/handlers/base.py”   第100行,在get_response中       response = callback(request,* callback_args,** callback_kwargs)

     

文件   “/Library/Python/2.6/site-packages/django/contrib/auth/decorators.py”   第25行,在_wrapped_view中       return view_func(request,* args,** kwargs)

     

文件   “/用户/ * ** / ** * < /强> / ** / *** / * * /googleAnalyticsOauth.py”,   第52行,在googleAnalyticsTest中       data = client.GetDataFeed(dataQuery)

     

文件   “建立/ bdist.macosx-10.6通用/蛋/ GDATA /分析/ client.py”   第77行,在get_data_feed中       ** kwargs)

     

文件   “构建/ bdist.macosx-10.6通用/蛋/ GDATA / client.py”   第635行,在get_feed中       ** kwargs)

     

文件   “构建/ bdist.macosx-10.6通用/蛋/ GDATA / client.py”   第265行,请求中       uri = uri,auth_token = auth_token,http_request = http_request,** kwargs)

     

文件   “构建/ bdist.macosx-10.6-通用/蛋/原子/ client.py”,   第110行,请求中       self.auth_token.modify_request(HTTP_REQUEST)

     

文件   “构建/ bdist.macosx-10.6通用/蛋/ GDATA / gauth.py”   第980行,在modify_request中       token_secret = self.token_secret,verifier = self.verifier)

     

文件   “构建/ bdist.macosx-10.6通用/蛋/ GDATA / gauth.py”   第604行,在generate_hmac_signature中       next,token,verifier = verifier)

     

文件   “构建/ bdist.macosx-10.6通用/蛋/ GDATA / gauth.py”   第565行,在build_oauth_base_string中       urllib.quote(params [key],safe ='〜')))

     

文件   “/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/urllib.py”   第1216行,引用       res = map(safe_map。 getitem ,s)

     

TypeError:map()的参数2必须   支持迭代

任何人都有任何想法会出现什么问题?

谢谢!

2 个答案:

答案 0 :(得分:2)

问题出在gauth.py(gdata客户端库的一部分),位于版本2.0.15的第587行。

传递给urllib.quote的“max-results”参数的值是10000,一个整数,而不是一个字符串,所以它没有迭代器。

我的快速解决方法是:

  for key in sorted_keys:
    safe_str_param = urllib.quote(str(params[key]), safe='~')
    pairs.append('%s=%s' % (urllib.quote(key, safe='~'), safe_str_param))

您可以使用pdb自行跟踪问题,如下所示:

python -m pdb pagination_demo.py
> ga-api-http-samples-read-only/src/data_export/v2/python/pagination/pagination_demo.py(35)<module>()
-> """ """
# Note that (Pdb) indicates a prompt from the debugger
(Pdb) c
Executing query: https://www.google.com/analytics/feeds/data?max-results=10000&...&start-date=2011-01-01&ids=ga%3A999999&metrics=ga%3Apageviews&end-date=2011-12-30

# then you get more or less your trace above, plus this:

TypeError: argument 2 to map() must support iteration
Uncaught exception. Entering post mortem debugging
Running 'cont' or 'step' will restart the program
> lib/python2.6/urllib.py(1224)quote()
-> res = map(safe_map.__getitem__, s)

# Ok, let's see what the type of 's' is with pretty print
(Pdb) pp type(s)
<type 'int'>
(Pdb) q

如果一切正常(比如你将我的hack添加到gauth.py上面),你会看到这而不是堆栈跟踪:

Total results found: 124
Total pages needed, with one page per API request: 1

The program finished and will be restarted
> ga-api-http-samples-read-only/src/data_export/v2/python/pagination/pagination_demo.py(35)<module>()
-> """
(Pdb) q

答案 1 :(得分:0)

FWIW,必须做以下事情:

my_client.auth_token = gdata.gauth.OAuthHmacToken(CONSUMER_KEY,CONSUMER_SECRET,TOKEN,TOKEN_SECRET,gdata.gauth.ACCESS_TOKEN)

Via