2013-10-05 5 views
1

я пытаюсь твиттере доступа с помощью API я создал приложение и проверил «Разрешить этому приложению использоваться для входа в систему Twitter», то я следовал следующие шаги:Twitter OAuth с питоном

https://dev.twitter.com/docs/api/1/post/oauth/request_token 
https://dev.twitter.com/docs/auth/authorizing-request 
https://dev.twitter.com/docs/auth/creating-signature 

, но я получаю

urllib2.HTTPError: HTTP Error 401: Unauthorized 

, так что я должен был сделать что-то не так или что-то пропустил

кто-то может обнаружить свою ошибку?

import urllib2 
import time 
import urllib 
import hashlib 
import hmac 
import base64 

def escape(s): 
    return urllib.quote(s, safe='~') 

consumer_key = 'yBsHl3G6MqXx9JpnoLoGbA' 
consumer_secret = 'JBk5oUDLSuNAXxdBHrDmoUFxemw7IJ1a2yWPmCydX7w' 
http_method = 'POST' 
base_url = 'https://api.twitter.com/oauth/request_token' 
oauth_token_secret = '' 

data={'oauth_callback':'http://localhost.de:8000/accounts/callback/twitter'} 

header = { 
    'oauth_consumer_key': consumer_key, 
    'oauth_timestamp': str(int(time.time())), 
    'oauth_nonce': hashlib.md5(str(time.clock())).hexdigest(), 
    'oauth_version': '1.0', 
    'oauth_signature_method': 'HMAC-SHA1' 
} 
header.update(data) 

paramstr = '' 
for k in sorted(header): 
    paramstr+=escape(k)+'='+escape(header[k])+'&' 
paramstr = paramstr[:-1] 
print paramstr 

sig_base_str = http_method.upper()+'&'+escape(base_url)+'&'+escape(paramstr) 
print sig_base_str 
key = escape(consumer_secret)+'&'+escape(oauth_token_secret) 
signature = base64.b64encode(hmac.new(key, sig_base_str, hashlib.sha1).digest()) 

header['oauth_signature'] = signature 
header_str = 'OAuth ' 
for k in sorted(header): 
    header_str+=escape(k)+'="'+escape(header[k])+'", ' 
header_str = header_str[:-2] 
print header_str 

req=urllib2.Request(base_url, data=urllib.urlencode(data)) 
req.add_header('Authorization', header_str) 
print urllib2.urlopen(req).read() 

я знаю, что есть библиотеки для делать это, но я хотел бы написать свой собственный код для тестирования целей

+0

Секрет предполагают, чтобы быть секрет. :) – Arpit

+0

это просто приложение для тестирования, так что неважно;) – elbarto132

ответ

2

я решил сам. твиттер-документы не на 100% правильны. , например, здесь

https://dev.twitter.com/docs/api/1/post/oauth/request_token 

они говорят, что заголовок авторизации должен выглядеть следующим образом

OAuth oauth_nonce="K7ny27JTpKVsTgdyLdDfmQQWVLERj2zAK5BslRsqyw", oauth_callback="http%3A%2F%2Fmyapp.com%3A3005%2Ftwitter%2Fprocess_callback", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1300228849", oauth_consumer_key="OqEqJeafRSF11jBMStrZz", oauth_signature="Pc%2BMLdv028fxCErFyi8KXFM%2BddU%3D", oauth_version="1.0" 

, но это не так, вы не должны добавлять oauth_callback="http%3A%2F%2Fmyapp.com%3A3005%2Ftwitter%2Fprocess_callback" в заголовок авторизации