Gdata-python-api + Аналитика с простым auth

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

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

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

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

Ответ 1

Грег,

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

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

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

Часть 2. Из проекта перейдите в раздел "Услуги" и включите "API Google Analytics"

Часть 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, подписанный с новым токеном доступа.

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

Использование в будущем Примечание 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')