2016-06-05 23 views
5

Twitter'dan verileri almak için OAuth2 kullanma, ancak hata alıyorum "Unicode nesneleri karma önce kodlanmış olmalıdır" def içine geçtiğim değişkenler için utf8 kodlanmış değerleri denedim.Python 3.4 hata

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

Özel durumunuzun tam izini gönderir misiniz? Açıklamanızın tam olarak hangi “oauth2” çağrısının soruna neden olduğu net değil. – Blckknght

+0

Sanki altına düştüğünde: traceback (en son çağrı son): Dosya "", 1 numaralı hat verilerine = oauth_req (url, TOKEN_KEY, TOKEN_SECRET) Dosya "", hat 2'de, oauth_req tüketici = oauth2.Consumer (anahtar = API_KEY, gizli = API_SECRET) NameError: name 'oauth2' tanımlı değil –

+0

Lütfen, biçimlendirmeyi düzgün şekilde biçimlendirebileceğiniz soruya düzenleyin. Her neyse, daha önce bahsettiğinizden çok farklı bir istisna gibi görünüyor. 'NameError: 'oauth2' ismi tanımlanmadı' 'oauth2' modülünü almadığınızı ve kodlama veya Unicode nesneleriyle ilgisi olmadığını belirtir. – Blckknght

cevap

5

client.request gövdesi bağımsız değişkeni bir bytestring olmalıdır. Yani ilk olarak, varsayılan değeri

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

(Bu örnek kodda hatayı düzeltmek gerekir) Ve sonra sonrası vücut için bu işlev aktardığınız verilere bir bytestring olmasını sağlamak düzeltmek onun sha hash hesaplanacak. Dizeyi byte'lere dönüştürmek için mybytestring = bytes(mystring, "utf-8") kullanın veya kodlamanın doğru olup olmadığını kullanın. İşte

relevant line from the source geçerli: JamesK cevabı @

0

haklı. Tam kod burada

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