2011-08-28 3 views
2

instapaper API를 사용하려고하지만 요청에 403 오류가 계속 발생합니다. 코드는 다음과 같습니다.instapaper 및 oauth - 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)) 

아이디어가 있으십니까?

+0

당신이 액세스를 얻기 전에 요청 토큰을 얻을 필요가 토큰 – jterrace

+0

API 설명서는 (http://www.instapaper.com/api/full) 더 요청 토큰이 필요하지 않습니다 말한다 . – pnsilva

+0

아, 알겠습니다. ''client.request''에 의해 반환되는''token''은 유효합니까? 직접 urllib.urlopen 대신 OauthRequest를 사용해야합니다. https://github.com/simplegeo/python-oauth2/blob/master/example/client.py#L145-156 – jterrace

답변

4

당신은 서명 방법에 대한 맞아요. 하지만 내 주요 문제는 내가 적절하게 토큰을 처리하지 못한다는 것이 었습니다. 여기에 작업 코드입니다 :

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) 
3

먼저, oauth2이 사용중인 라이브러리인지 확인하십시오. 가장 잘 관리 된 Python oauth 모듈입니다.

둘째, 이것은 의심 같습니다

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