2016-06-05 7 views
5

Mit oauth2 Daten von Twitter zu bekommen, aber immer den Fehler:Python 3.4 Fehler "Unicode-Objekte müssen vor Hashing codiert werden"

Unicode-objects must be encoded before hashing

unter Verwendung des Codes,

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) 

Auch versuchte utf8 codierte Werte für die Variablen, die ich in def übergebe.

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

Können Sie die vollständige Traceback Ihrer Ausnahme buchen? Aus Ihrer Beschreibung geht nicht eindeutig hervor, welcher 'oauth2'-Aufruf das Problem verursacht. – Blckknght

+0

Es geht wie folgt: Traceback (jüngste Aufforderung zuletzt): File "" Linie 1 in data = oauth_req (url, TOKEN_KEY, TOKEN_SECRET) File "", Zeile 2, in oauth_req Verbraucher = oauth2.Consumer (key = API_KEY, secret = API_SECRET) NameError: Name 'oauth2' ist nicht definiert –

+0

Bitte bearbeiten Sie die Traceback in die Frage, wo Sie es richtig formatieren können. Wie auch immer, das sieht nach einer ganz anderen Ausnahme aus als das, was Sie vorher erwähnt haben. 'NameError: Name 'oauth2' ist nicht definiert 'weist darauf hin, dass Sie das Modul' oauth2 'nicht importiert haben und nichts mit Codierungen oder Unicode-Objekten zu tun haben. – Blckknght

Antwort

5

Der Körper Argument von client.request sollte ein bytestring sein. Also zuerst fixiert den Standardwert

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

(Das soll den Fehler in dem Beispielcode fix)

Und dann dafür sorgen, dass die Daten, die Sie in diese Funktion übergeben für den Post-Körper ist ein bytestring, wie Sein sha Hash wird berechnet. Um eine Zeichenkette in Bytes umzuwandeln, verwenden Sie mybytestring = bytes(mystring, "utf-8") oder welche Kodierung auch immer korrekt ist. Hier

ist die relevant line from the source:

0

@ JamesK Antwort richtig ist. Der vollständige Code ist hier

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 
Verwandte Themen