2013-10-05 3 views
1

je suis en train d'accéder twitter en utilisant le api i créé une application et vérifié « Autoriser cette application à utiliser pour Connectez-vous avec Twitter », puis j'ai suivi ces étapes:twitter oauth python

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 

mais je reçois

urllib2.HTTPError: HTTP Error 401: Unauthorized 

donc je dois avoir fait quelque chose

quelque chose de mal ou manqués quelqu'un peut repérer mon erreur?

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

Je sais qu'il ya libs pour ce faire, mais je voudrais écrire mon propre code à des fins de test

+0

secret est supposé être un secret. :) – Arpit

+0

c'est juste une application pour tester, donc nevermind;) – elbarto132

Répondre

2

i résolu moi-même. les docs de twitter ne sont pas 100% corrects. par exemple ici

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

ils disent que l'en-tête d'autorisation devrait ressembler à ceci

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" 

mais cela ne va pas, vous ne devez pas ajouter oauth_callback="http%3A%2F%2Fmyapp.com%3A3005%2Ftwitter%2Fprocess_callback" à l'en-tête d'autorisation