2016-06-05 7 views
5

OAuth2 को उपयोग ट्विटर से डेटा प्राप्त करने के लिए, लेकिन के रूप में त्रुटि मिल रही है "यूनिकोड-वस्तुओं hashing से पहले एन्कोड किया जाना चाहिए": नीचे दिए गए कोड का उपयोगअजगर 3.4 त्रुटि

Unicode-objects must be encoded before hashing

,

def oauth_req(url, key, secret, http_method="GET", post_body="",http_headers=None): 
    consumer = oauth2.Consumer(key=API_KEY, secret=API_SECRET) 
    token = oauth2.Token(key=key, secret=secret) 
    client = oauth2.Client(consumer, token) 
    resp, content = client.request(url, method=http_method, body=post_body, headers=http_headers) 
    return content 
data = oauth_req(url, TOKEN_KEY, TOKEN_SECRET) 

इसके अलावा मैं def में गुजर रहे चर के लिए utf8 एन्कोडेड मानों का प्रयास किया।

File "<pyshell#11>", line 1, in <module> 
    data = oauth_req(url, TOKEN_KEY, TOKEN_SECRET) 
File "<pyshell#8>", line 6, in oauth_req 
    body=post_body, headers=http_headers) 
File "C:\Python35-32\lib\site-packages\oauth2_init_.py", line 673, in request 
    req.sign_request(self.method, self.consumer, self.token) 
File "C:\Python35-32\lib\site-packages\oauth2_init_.py", line 493, in sign_request 
    self['oauth_body_hash'] = base64.b64encode(sha1(self.body).digest()) 
TypeError: Unicode-objects must be encoded before hashing 
+0

क्या आप अपने अपवाद का पूरा पता पोस्ट कर सकते हैं? यह आपके विवरण से बिल्कुल स्पष्ट नहीं है कि 'oauth2' कॉल समस्या का कारण बन रहा है। डेटा = oauth_req (यूआरएल, TOKEN_KEY, TOKEN_SECRET) फ़ाइल "", पंक्ति 2 में फ़ाइल "", लाइन 1,, oauth_req उपभोक्ता में: – Blckknght

+0

यह नीचे के रूप में चला जाता है: Traceback (सबसे हाल कॉल पिछले) = oauth2.Consumer (key = API_KEY, secret = API_SECRET) नाम त्रुटि: नाम 'oauth2' परिभाषित नहीं किया गया है –

+0

कृपया उस प्रश्न में ट्रेसबैक संपादित करें जहां आप इसे ठीक से प्रारूपित कर सकते हैं। वैसे भी, यह आपके द्वारा पहले उल्लेख किए गए एक बहुत अलग अपवाद की तरह दिखता है। 'NameError: name 'oauth2' परिभाषित नहीं किया गया है 'सुझाव देता है कि आपने' oauth2' मॉड्यूल आयात नहीं किया है, और इसमें एन्कोडिंग या यूनिकोड ऑब्जेक्ट्स के साथ कुछ लेना देना नहीं है। – Blckknght

उत्तर

5

client.request का शरीर तर्क एक उपद्रव होना चाहिए। तो सबसे पहले, डिफ़ॉल्ट मान

def oauth_req(url, key, secret, http_method="GET", post_body=b"", http_headers=None): 

(यही कारण है कि उदाहरण के कोड में त्रुटि को ठीक करना चाहिए)

और फिर यह सुनिश्चित करें कि डेटा है कि आप के बाद शरीर के लिए इस समारोह में पारित एक bytestring है ठीक के रूप में इसकी शा हैश की गणना की जाएगी। स्ट्रिंग को बाइट्स में बदलने के लिए mybytestring = bytes(mystring, "utf-8") या जो भी एन्कोडिंग उपयोग करने के लिए सही है।

यहाँ relevant line from the source है:

0

@ JamesK के जवाब सही है। पूर्ण कोड यहां है

def oauth_req(url, token, secret, http_method="GET", post_body="", http_headers=None): 
    consumer = oauth2.Consumer(key=CONSUMER_KEY, secret=CONSUMER_SECRET) 
    token = oauth2.Token(key=token, secret=secret) 
    client = oauth2.Client(consumer, token) 
    resp, content = client.request(url, method=http_method, body=bytes(post_body, "utf-8"), headers=http_headers) 
    return content 
संबंधित मुद्दे