का उपयोग करते हुए टंबल एपीआई के साथ काम करते समय ओएथ "अनुरोध टोकन" प्राप्त करने में असमर्थ, मैं अब तक ओएथ को संभालने के लिए पुस्तकालयों का उपयोग कर रहा हूं, लेकिन हाल ही में मैं अंतर्निहित ओथ प्रक्रिया को समझने की गहरी कोशिश कर रहा हूं। वर्तमान में, मैं इस सरल कोड के साथ OAuth 1.0a का उपयोग कर Tumblr API v2 से कनेक्ट करने के कोशिश कर रहा हूँ:पायथन
import urllib, urllib2, time, random, hmac, base64, hashlib
def makenonce():
random_number = ''.join(str(random.randint(0, 9)) for _ in range(40))
m = hashlib.md5(str(time.time()) + str(random_number))
return m.hexdigest()
def encodeparams(s):
return urllib.quote(str(s), safe='~')
# Actual key and secret from a test app created using a dummy Tumblr account
consumer_key = '97oAujQhSaQNv4XDXzCjdZlOxwNyhobmDwmueJBCHWsFFsW7Ly'
consumer_secret = '5q1dpF659SOgSUb0Eo52aAyoud8N8QOuJu6enCG92aDR6WoMlf'
#oauth URLs
request_tokenURL = 'http://www.tumblr.com/oauth/request_token'
#oauth params
oauth_parameters = {
'oauth_consumer_key' : consumer_key,
'oauth_nonce' : makenonce(),
'oauth_timestamp' : str(int(time.time())),
'oauth_signature_method' : "HMAC-SHA1",
'oauth_version' : "1.0"
}
normalized_parameters = encodeparams('&'.join(['%s=%s' % (encodeparams(str(k)), encodeparams(str(oauth_parameters[k]))) for k in sorted(oauth_parameters)]))
# Since I'm focusing only on getting the request token for now, I set this to POST.
normalized_http_method = 'POST'
normalized_http_url = encodeparams(request_tokenURL)
signature_base_string = '&'.join([normalized_http_method, normalized_http_url, normalized_parameters])
oauth_key = consumer_secret + '&'
hashed = hmac.new(oauth_key, signature_base_string, hashlib.sha1)
oauth_parameters['oauth_signature'] = base64.b64encode(hashed.digest())
oauth_header = 'Authorization: OAuth realm="http://www.tumblr.com",' + 'oauth_nonce="' + oauth_parameters['oauth_nonce'] + '",' + 'oauth_timestamp="' + oauth_parameters['oauth_timestamp'] + '",' + 'oauth_consumer_key="' + oauth_parameters['oauth_consumer_key'] + '",' + 'oauth_signature_method="HMAC-SHA1",oauth_version="1.0",oauth_signature="' + oauth_parameters['oauth_signature'] +'"'
# sample oauth_header generated by the code above:
# Authorization: OAuth realm="http://www.tumblr.com",oauth_nonce="c200a0e06f30b84b851ac3e99a71054b",oauth_timestamp="1315231855",oauth_consumer_key="97oAujQhSaQNv4XDXzCjdZlOxwNyhobmDwmueJBCHWsFFsW7Ly",oauth_signature_method="HMAC-SHA1",oauth_version="1.0",oauth_signature="kVAlmwolCX0WJIvTF9MB2UV5rnU="
req = urllib2.Request(request_tokenURL)
req.add_header('Authorization', oauth_header)
# If all goes well, Tumblr should send me the oauth request token.
print urllib2.urlopen(req).read()
OAuth अनुरोध टोकन के बजाय
, Tumblr रिटर्न HTTP त्रुटि 401: अनधिकृत।
चीजें मैं किसी भी सफलता के बिना की कोशिश की है:
- "1.0" के लिए "1.0a" में बदल गया
oauth_version
, और फिर से वापस बदल दिया। oauth_key
प्राप्त करने के लिएconsumer_secret
के अंत में '' को जोड़ने के लिए ओएथ पर एक मार्गदर्शिका अनिवार्य है। मैंने यह देखने के लिए बाद में '&' को हटाने का प्रयास किया कि क्या इससे कोई फर्क पड़ता है।- जांच की गई कि OAuth पैरामीटर सॉर्ट किए गए थे, और वे थे।
- स्ट्रिंग "प्रमाणीकरण:" को
oauth_header
में नहीं जोड़ा गया, फिर इसे बाद में जोड़ा गया। न तो कोई फर्क पड़ता है।
मैं गलत कहां गया हूं?
शायद आपके पास –
@Cal पर आपकी गुप्त कुंजी नहीं होनी चाहिए, यह विशेष रूप से इस प्रश्न के लिए बनाई गई एक डमी ऐप है। टिप्पणियों में यह ठीक है: // // ** डमी ** टंबल खाता 'का उपयोग करके बनाई गई एक परीक्षण ऐप से वास्तविक कुंजी और रहस्य। – vjk2005