gdata-python-api + Аналитика с простой авторизацией

Я работаю над преобразованием скрипта Python с использованием клиента Google gdata API + аутентификации пользователя/пароля во что-то более подходящее для производства (ключ API). Я очень разочарован запутанным состоянием их документации по аутентификации. Я, по общему признанию, не очень хорошо разбираюсь в OAuth2, но кажется, что это намного сложнее для моего случая использования, а именно: заходите в Google Analytics каждые 24 часа, чтобы получить X самых популярных статей на нашем сайте.

В этом сценарии мы не имеем дело с изменением чьих-либо личных данных, и все действия сосредоточены на одной учетной записи. Не похоже, что OAuth2 стоит сложности для чего-то такого простого.

Я вижу, что в консоли Google API (https://code.google.com/apis/console/) я зарегистрировался там и заметил, что есть раздел «Простой доступ к API» с одним ключом под «Идентификатором клиента для веб-приложений» (который выглядит как OAuth2). Также есть страница обновления домена Google, https://www.google.com/accounts/UpdateDomain, но она выглядит быть связанным с OAuth.

Есть ли способ использовать этот простой ключ доступа к API (не OAuth) для получения аналитических данных с помощью клиента Python gdata, и если да, то есть ли у кого-нибудь примеры аутентификации? У меня уже есть средства для извлечения данных, работающие после аутентификации, но я использую подход «пользователь/пароль», который не подходит для производства.


person Greg    schedule 05.05.2011    source источник
comment
Я согласен, что это действительно расстраивает, я сейчас в той же лодке. Вариант использования OAuth2 на самом деле не имеет смысла, если вы используете только свои собственные данные и вам не нужно проходить аутентификацию с помощью учетных записей пользователей. Так что я тоже смущен тем, почему они перемещают много API. Насколько я понимаю, OAuth1 работает без этой идеи URL-адреса обратного вызова? Я бы предпочел также использовать простой ключ API, но неясно, устарел ли он и на каком API. Будем надеяться, что Google скоро исправит это!   -  person Brian Armstrong    schedule 17.06.2011
comment
Прошло 6 месяцев с этого вопроса, кто-нибудь нашел ответ? Я только что задал 2 очень похожих вопроса здесь stackoverflow.com/questions/8263776/ и здесь stackoverflow.com /questions/8270994/ и моя проблема такая же: мне не нужен доступ к чужому календарю, мне нужен доступ только к ОДНОМУ. Таким образом, ключ разработчика должен быть подходящим, но я не могу найти ЛЮБЫЕ учебные пособия или примеры в Интернете. Кто-нибудь может помочь?   -  person Joel    schedule 25.11.2011
comment
Я также попробовал простой googleapis.com/analytics/v3/management/accounts/XXXXX/{YOUR-KEY-HERE} безуспешно. Я думаю, вам нужен OAuth, даже если это ваши собственные данные =( . Я хотел бы увидеть решение этого вопроса   -  person DougA    schedule 04.03.2012
comment
Если вас интересует рабочий пример для OAuth2 с Python и его документация, посмотрите здесь:joyofdata.de/blog/oauth2-google-api-python-google-analytics. Это не так сложно, если доступно ясное объяснение. Если вы хотите пропустить этап аутентификации пользователя, лучшим вариантом будет двухэтапный OAuth с помощью сервисного приложения — это станет ясно после того, как вы проработаете обычный процесс OAuth2.   -  person Raffael    schedule 15.02.2015


Ответы (1)


Грег,

Если вы уже используете библиотеку gdata-python-client, это относительно легко сделать, если вы единственный пользователь, которому ваше приложение будет авторизовать.

Общие механизмы подробно описаны в сообщении в блоге в сентябре. 2011, но я опишу их здесь для полноты картины.

Часть 1. Перейдите в консоль API и запустите новый проект.

Часть 2. В проекте перейдите в раздел "Сервисы" и включите "Analytics API".

Часть 3. В проекте перейдите в раздел "Доступ к API" и нажмите "Создать идентификатор клиента OAuth 2.0..." (вам потребуется указать название продукта, хотя указанное вами значение имеет преимущество). не важно). Когда вас спросят о типе приложения, выберите «Установленное приложение», а затем «Создать идентификатор клиента». Поскольку вы будете единственным пользователем, вам понадобится только один токен обновления, и вы можете получить его, авторизовавшись из настольного приложения один раз.

Часть 4. Получите идентификатор клиента и секрет клиента из консоли API, а затем создайте пустой токен:

import gdata.gauth

CLIENT_ID = 'id-from-apis-console'
CLIENT_SECRET = 'secret-from-apis-console'
SCOPE = 'https://www.google.com/analytics/feeds/'  # Default scope for analytics

token = gdata.gauth.OAuth2Token(
    client_id=CLIENT_ID,
    client_secret=CLIENT_SECRET, 
    scope=SCOPE,
    user_agent='application-name-goes-here')

Я получил область из часто задаваемых вопросов по GData, хотя я не уверен, что она верна.

Часть 5. Используйте токен для создания URL-адреса авторизации для посещения:

url = token.generate_authorize_url(redirect_uri='urn:ietf:wg:oauth:2.0:oob')

Поскольку ваше приложение является «установленным приложением», ваш URI перенаправления по умолчанию — 'urn:ietf:wg:oauth:2.0:oob'. (Также обратите внимание, что в сообщении блога была опечатка и использовался ключевой аргумент redirect_url.)

Часть 6. Посетите URL-адрес и разрешите приложению отправлять запросы от имени вашей учетной записи. После авторизации вы будете перенаправлены на страницу с кодом. Этот код будет использоваться для обмена на токен доступа и долгоживущий токен обновления. Код имеет срок действия 10 минут, а токен доступа — час. Токен обновления позволит вам получать новые токены доступа для подписания запросов на неопределенный срок (или до тех пор, пока вы отзовете разрешение из своего аккаунта).

Часть 7. Используйте код для получения токена доступа:

code = 'random-string-from-redirected-page'
token.get_access_token(code)  # This returns the token, but also changes the state

Это снова немного отличается от сообщения в блоге, потому что мы используем установленное приложение.

Часть 8. Теперь с помощью токена вы можете делать все запросы, которые хотите сделать, к клиенту аналитики:

import gdata.analytics.client

client = gdata.analytics.client.AnalyticsClient()
token.authorize(client)

Вот это большие деньги. По истечении срока действия токена доступа запросы API, подписанные этим токеном, отклоняются. Однако при авторизации клиента, как указано выше, при сбое указанных запросов token пытается использовать токен обновления для получения нового токена доступа. Если он успешно получает новый токен доступа, клиент повторно отправляет исходный запрос API, подписанный новым токеном доступа.

Я ничего не знаю об Analytics API, поэтому я не буду предоставлять больше подробностей.

Примечание 1 по использованию в будущем. Сохранение информации для использования в будущем. Вы можете повторно использовать это из разных мест и после этого использовать очень легко. Существуют методы с именами token_to_blob и token_from_blob, предоставляемые библиотекой, которые позволяют превратить токен в строку и преобразовать из строки:

saved_blob_string = gdata.gauth.token_to_blob(token)

Сделав это, вы можете сохранить строку в файле и завершить запущенный процесс Python. Когда вы захотите использовать его снова:

saved_blob_string = retrieve_string_from_file()  # You'll need to implement this
token = gdata.gauth.token_from_blob(saved_blob_string)

Примечание 2 по будущему использованию. Этот токен можно будет использовать для авторизации клиента и выполнения всех ваших действий снова и снова, пока у вас есть токен обновления. Если по какой-то причине вы хотите снова получить токен доступа без вызова token.generate_authorize_url, вам нужно будет вручную установить это для объекта:

token.redirect_uri = 'urn:ietf:wg:oauth:2.0:oob'

Примечание 3 по использованию в будущем. Кроме того, если вы потеряли токен обновления и хотели бы получить новый, не открывая браузер, на отозвать оригинал, вы можете использовать параметр approval_prompt, чтобы получить новый токен обновления, посетив URL-адрес, созданный:

url = token.generate_authorize_url(
    redirect_uri='urn:ietf:wg:oauth:2.0:oob',
    approval_prompt='force')
person bossylobster    schedule 21.04.2012
comment
Я знаю, что это было опубликовано год назад, но я также занимаюсь этим процессом и задаюсь вопросом, почему API «Сайтов» не указан в консоли API. API Сайтов не поддерживается? - person cemulate; 29.05.2013
comment
Существует разница между API GData и API на основе Discovery. API Сайтов — это API GData, а в консоли есть только API на основе Discovery. См. stackoverflow.com/questions/13981641 некоторые комментарии о различии. - person bossylobster; 29.05.2013