gdata-python-api + аналитика с простой аутентификацией - PullRequest
10 голосов
/ 05 мая 2011

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

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

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

1 Ответ

12 голосов
/ 21 апреля 2012

Greg,

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

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

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

Часть 2 : из проекта перейдите в раздел «Службы» и включите «Analytics API»

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

Part 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 FAQ , хотя я не уверен, что это правильно.

Часть 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 минут, а токена доступа - 1 час.Токен обновления позволит вам получать новые токены доступа для подписания запросов на неограниченный срок (или до тех пор, пока вы не аннулируете разрешения от своей учетной записи).

Часть 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 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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...