我能够使用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必须 支持迭代
任何人都有任何想法会出现什么问题?
谢谢!
答案 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)