проблема с клиентом аналитики gdata в python - PullRequest
0 голосов
/ 07 апреля 2011

Мне удалось успешно получить токен доступа OAuth для Google Analytics с помощью библиотеки Python Google gdata.

Однако моя попытка использовать токен для доступа к данным 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)

Я получаю следующую трассировку стека:

Traceback (последний последний вызов):
файл "/Library/Python/2.6/site-packages/django/core/servers/basehttp.py", линия 280, в прогоне self.result = приложение (self.environ, self.start_response)

Файл "/Library/Python/2.6/site-packages/django/core/servers/basehttp.py", линия 674, вызов вернуть self.application (environment, start_response)

Файл "/Library/Python/2.6/site-packages/django/core/handlers/wsgi.py", линия 248, вызов response = self.get_response (запрос)

Файл "/Library/Python/2.6/site-packages/django/core/handlers/base.py", строка 141, в get_response вернуть self.handle_uncaught_exception (запрос, resolver, sys.exc_info ())

Файл "/Library/Python/2.6/site-packages/django/core/handlers/base.py", строка 100, в get_response ответ = обратный вызов (запрос, * callback_args, ** callback_kwargs)

Файл "/Library/Python/2.6/site-packages/django/contrib/auth/decorators.py", строка 25, в _wrapped_view return view_func (request, * args, ** kwargs)

Файл «/ Users / *** / *** / ** / * ***** 1043 1044 * / ** / googleAnalyticsOauth.py», строка 122, в 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, validator = self.verifier) ​​

Файл "Сборка / bdist.macosx-10,6-универсальный / яйцо / GData / gauth.py", строка 604, в generate_hmac_signature далее токен, верификатор = верификатор)

Файл "Сборка / bdist.macosx-10,6-универсальный / яйцо / GData / gauth.py", строка 565, в build_oauth_base_string urllib.quote (params [ключ], safe = '~')))

Файл "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/urllib.py", строка 1216, в цитате res = map (safe_map. getitem , s)

TypeError: аргумент 2 для map () должен поддержка итерации

У кого-нибудь есть идеи, что может пойти не так?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 02 декабря 2011

Проблема в gauth.py (часть клиентской библиотеки gdata) в строке 587 в версии 2.0.15.

Значение параметра "max-results", передаваемое в urllib.quote10000, целое число, а не строка, поэтому у него нет итератора.

Мое быстрое исправление:

  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

Если все работает (например, когда вы добавили мой хак выше в 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
0 голосов
/ 10 сентября 2011

FWIW, нужно сделать следующее:

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

Via

...