instapaper and oauth - ошибка 403 "Не авторизован"
Я пытаюсь использовать API instapaper, но я получаю ошибку 403 для моих запросов. Вот код:
consumer_key='...'
consumer_secret='...'
access_token_url = 'https://www.instapaper.com/api/1/oauth/access_token'
consumer = oauth.Consumer(consumer_key, consumer_secret)
client = oauth.Client(consumer)
client.add_credentials('...','...')
params = {}
params["x_auth_username"] = '..'
params["x_auth_password"] = '...'
params["x_auth_mode"] = 'client_auth'
client.set_signature_method = oauth.SignatureMethod_HMAC_SHA1()
resp, token = client.request(access_token_url, method="POST",body=urllib.urlencode(params))
result = simplejson.load(urllib.urlopen('https://www.instapaper.com/api/1/bookmarks/list?' + token))
Есть идеи?
2 ответа
Решение
Вы правы насчет метода подписи. Но моей главной проблемой было то, что я неправильно обращался с токеном. Вот рабочий код:
consumer = oauth.Consumer('key', 'secret')
client = oauth.Client(consumer)
# Get access token
resp, content = client.request('https://www.instapaper.com/api/1/oauth/access_token', "POST", urllib.urlencode({
'x_auth_mode': 'client_auth',
'x_auth_username': 'uname',
'x_auth_password': 'pass'
}))
token = dict(urlparse.parse_qsl(content))
token = oauth.Token(token['oauth_token'], token['oauth_token_secret'])
http = oauth.Client(consumer, token)
# Get starred items
response, data = http.request('https://www.instapaper.com/api/1/bookmarks/list', method='POST', body=urllib.urlencode({
'folder_id': 'starred',
'limit': '100'
}))
res = simplejson.loads(data)
Во-первых, убедитесь, что oauth2 - это библиотека, которую вы используете. Это самый ухоженный модуль oauth для Python.
Во-вторых, это выглядит подозрительно:
client.set_signature_method = oauth.SignatureMethod_HMAC_SHA1()
Вы заменяете функцию set_signature_method. Так должно быть:
client.set_signature_method(oauth.SignatureMethod_HMAC_SHA1())
Вы должны следовать примеру здесь: https://github.com/simplegeo/python-oauth2/blob/master/example/client.py