Инициализация клиента Oauth в Python для Tumblr API с использованием Python-oauth2 - PullRequest
7 голосов
/ 27 сентября 2011

Я новичок в Oauth.В прошлом для приложений на твиттере, написанных на Python, я использовал библиотеку python-oauth2 для инициализации клиента следующим образом:

consumer = oauth.Consumer(key = CONSUMER_KEY, secret = CONSUMER_SECRET)
token = oauth.Token(key = ACCESS_KEY, secret = ACCESS_SECRET)
client = oauth.Client(consumer, token)

Это было легко, потому что твиттер предоставляет ключи и секреты как CONSUMER, так и ACCESS.Но теперь мне нужно сделать то же самое для Tumblr.Проблема в том, что tumblr предоставляет только CONSUMER_KEY, CONSUMER_SECRET и эти URL:

Request-token URL   http://www.tumblr.com/oauth/request_token
Authorize URL       http://www.tumblr.com/oauth/authorize
Access-token URL    http://www.tumblr.com/oauth/access_token

Используя эти данные, как я могу инициализировать клиент для доступа к API Tumblr?

UPD

jterraceпредложил код, который я пытался использовать раньше.Проблема с этим - oauth_callback.Если я не укажу ничего, api вернет ошибку «Не указан oauth_callback», но если я укажу какой-нибудь URL-адрес, например «http://example.com/oauthcb/"» и перейду по ссылке http://www.tumblr.com/oauth/authorize?oauth_token=9ygTF...,, нажмите кнопку «Разрешить», tumblr не отобразитСтраница с PIN-кодом, она немедленно перенаправляет на этот URL-адрес обратного вызова, который бесполезен, поскольку это приложение для настольного компьютера. Почему PIN-код не отображается?

UPD 2

Tumblr API не поддерживает PIN-кодавторизация. Используйте взамен xAuth - https://groups.google.com/group/tumblr-api/browse_thread/thread/857285e6a2b4268/15060607dc306c1d?lnk=gst&q=pin#15060607dc306c1d

Ответы [ 6 ]

11 голосов
/ 27 сентября 2011

Сначала импортируйте модуль oauth2 и настройте URL-адрес службы и информацию о потребителе:

import oauth2

REQUEST_TOKEN_URL = 'http://www.tumblr.com/oauth/request_token'
AUTHORIZATION_URL = 'http://www.tumblr.com/oauth/authorize'
ACCESS_TOKEN_URL = 'http://www.tumblr.com/oauth/access_token'
CONSUMER_KEY = 'your_consumer_key'
CONSUMER_SECRET = 'your_consumer_secret'

consumer = oauth2.Consumer(CONSUMER_KEY, CONSUMER_SECRET)
client = oauth2.Client(consumer)

Шаг 1: Получить токен запроса. Это временный токен, который используется для пользователь авторизует токен доступа и подписывает запрос на получение указанный токен доступа.

resp, content = client.request(REQUEST_TOKEN_URL, "GET")

request_token = dict(urlparse.parse_qsl(content))
print "Request Token:"
print "    - oauth_token        = %s" % request_token['oauth_token']
print "    - oauth_token_secret = %s" % request_token['oauth_token_secret']

Шаг 2. Перенаправление на провайдера. Так как это скрипт CLI, мы не перенаправления. В веб-приложении вы будете перенаправлять пользователя на URL ниже.

print "Go to the following link in your browser:"
print "%s?oauth_token=%s" % (AUTHORIZATION_URL, request_token['oauth_token'])

# After the user has granted access to you, the consumer, the provider will
# redirect you to whatever URL you have told them to redirect to. You can 
# usually define this in the oauth_callback argument as well.
oauth_verifier = raw_input('What is the PIN? ')

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

token = oauth2.Token(request_token['oauth_token'], request_token['oauth_token_secret'])
token.set_verifier(oauth_verifier)
client = oauth2.Client(consumer, token)

resp, content = client.request(ACCESS_TOKEN_URL, "POST")
access_token = dict(urlparse.parse_qsl(content))

print "Access Token:"
print "    - oauth_token        = %s" % access_token['oauth_token']
print "    - oauth_token_secret = %s" % access_token['oauth_token_secret']
print

Теперь, когда у вас есть токен доступа, вы можете вызывать защищенные методы с его помощью.

РЕДАКТИРОВАТЬ: Оказывается, что Tumblr не поддерживает метод авторизации PIN-кода. Соответствующий пост здесь .

6 голосов
/ 30 октября 2011

Если вы просто хотите получить токен / секретный ключ для подписи, вы можете просто настроить URL обратного вызова как: http://localhost/blah

  • Запустить CLI-приложение (после изменения URL-адреса обратного вызова, секрета и токена)
  • Перейдите по ссылке в вашем браузере
  • Разрешить приложение
  • Просмотр адресной строки страницы, на которую вы были перенаправлены, в браузере после разрешения вашего приложения. Это должно выглядеть примерно так:

http://localhost/blah?oauth_token=xxxxxxxxxxxxxxxxxxxxxxxxxx0123456789ABCDEFGHIJKLMN&oauth_verifier=XXXXXXXXXXXXXXXXXXXXXXXXX0123456789abcdefghijklmn

Используйте значение параметра запроса 'oauth_verifier' в качестве PIN-кода: XXXXXXXXXXXXXXXXXXXXXXXXX0123456789abcdefghijklmn

CLI должен распечатать ваш oauth-токен и oauth-токен-секрет.

НТН! Вот так вот работает для Tumblr:)

0 голосов
/ 21 февраля 2014

@ jterrance ответ хороший. Однако следует понимать, что это one _time_ ручная процедура для получения токена доступа. Маркер доступа - это ключ, который вы используете для всех последующих вызовов API. (Вот почему он рекомендует сохранять токен доступа в базе данных.) Строка, называемая «PIN» (он же ключ проверки), не обязательно является числом. Это может быть строка для печати в любой форме. Этот ключ подтверждения отображается на странице авторизации по URL-адресу, напечатанному на шаге 2, а затем вставляется в запрос для ввода PIN-кода.

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

была эта проблема с oauth2 и facebook.@ Ответ deepvanbinnen привели меня в правильном направлении.

1002 * facebook фактически перенаправлены на страницу, похожее на это 1004 * http://localhost/blah?code=AQAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX#_=_' 1006 *, используя то 'AQAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX # _ = _ как PIN-кодфактически получил мне доступ к запрошенной учетной записи Facebook.
0 голосов
/ 27 сентября 2011

Похоже, вы пытаетесь получить доступ к API OAuth 1 с клиентом OAuth 2.

См. https://github.com/simplegeo/python-oauth2 и ищитеПример с OAuth на ножках ».

0 голосов
/ 27 сентября 2011

Посмотрите на https://github.com/ToQoz/Pyblr

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

...