2012-09-27 15 views
6

Sto battendo la testa contro il muro per capire come inviare richieste autenticate con oauth.Come inviare una richiesta di oauth con python-oauth2

Sono stato in grado di ottenere token di accesso, ma non ero del tutto sicuro di come inviare una richiesta con loro. Ho trovato questo su informazioni dello sviluppatore di Twitter:

https://dev.twitter.com/docs/auth/oauth/single-user-with-examples#python che ha qualche codice di esempio per l'invio di una richiesta di autorizzazione:

def oauth_req(url, key, secret, http_method="GET", post_body=None,http_headers=None): 
    consumer = oauth.Consumer(key=consumerKey, secret=consumerSecret) 
    token = oauth.Token(key=tokenKey, secret=tokenSecret) 
    client = oauth.Client(consumer, token) 
    resp, content = client.request(
     url, 
     method=http_method, 
     body=post_body, 
     headers=http_headers, 
     #force_auth_header=True                                     
     ) 
    return resp,content 

oauth_req('http://openapi.etsy.com/v2/shops/:user/transactions',tokenKey,tokenSecret) 

Tuttavia, quando ho inserito tutti i miei dati, ho ricevuto il seguente errore:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/tmp/python-22060Umg.py", line 153, in <module> 
    transactions = oauth_req('http://openapi.etsy.com/v2/shops/:user/transactions',tokenKey,tokenSecret) 
    File "/tmp/python-22060Umg.py", line 76, in oauth_req 
    force_auth_header=True 
TypeError: request() got an unexpected keyword argument 'force_auth_header' 

dove: l'utente è l'utente effettivo (l'ho rimosso dal post) e tokenKey/tokenSecret sono i token di accesso.

ho pensato forse era così semplice come commento la riga incriminata, ma senza fortuna del genere:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/tmp/python-22060hwm.py", line 153, in <module> 
    transactions = oauth_req('http://openapi.etsy.com/v2/shops/:user/transactions',tokenKey,tokenSecret) 
    File "/tmp/python-22060hwm.py", line 75, in oauth_req 
    headers=http_headers 
    File "/usr/lib/python2.7/dist-packages/oauth2/__init__.py", line 662, in request 
    req.sign_request(self.method, self.consumer, self.token) 
    File "/usr/lib/python2.7/dist-packages/oauth2/__init__.py", line 493, in sign_request 
    self['oauth_body_hash'] = base64.b64encode(sha(self.body).digest()) 
TypeError: must be string or buffer, not None 

Così ora, StackOverflow, si sono la mia unica speranza! Qualcuno ha suggerimenti su come utilizzare il mio token di accesso per inviare una richiesta?

grazie!

+0

puoi pubblicare il tuo codice? non è davvero possibile aiutare senza di esso – jterrace

+0

Il codice è lo stesso del link nel post originale. Ho modificato il post originale per contenere il codice; Grazie! –

risposta

10

La documentazione di Twitter non è aggiornata - la versione di oauth2 a cui si collega è una forcella di 3 anni. Non v'è alcun argomento chiave force_auth_header più per oauth2.Client.request

Il motivo per cui è ancora ottenere errori anche dopo la rimozione della riga incriminata è perché il valore predefinito per post_body è None che viene passata oauth2.Client.request. Non sarai in grado di farlo in pratica. Dovrai richiedere quell'argomento, scegliere un valore predefinito che funzioni (ad es. Una stringa vuota), o controllare prima di passarlo per evitare questo errore.

4

Giusto per espandere su commenti di Rafe ...

La maggior parte delle librerie di OAuth in Python sono incredibilmente rotto, fuori moda, e non è più mantenuto. La maggior parte di loro non passa nemmeno i propri test, per non parlare delle specifiche del formato. Twitter non dovrebbe fare riferimento a nessuna di quelle cose, ma lo fanno.

Twython è un client Twitter Python che avvolge oAuth - https://github.com/ryanmcgrath/twython - avvolge le specifiche OAuth1 tramite i pacchetti requests e requests-oauth - , http://pypi.python.org/pypi/requests-oauth - ma le API di Twitter che accetta.

in termini di oAuth 2, questa libreria ha alcuni lavori recenti che cercano di implementarlo (ultimo commit 2 mesi fa) - https://github.com/idan/oauthlib. non l'ho provato da solo, e l'ho scoperto ieri.

da aggiungere rapidamente - anche se si sta utilizzando etsy, si dovrebbe essere in grado di decodificare twython per utilizzare endpoint etsy se supportano oauth1.

+0

Se è necessaria una libreria client completa e mantenuta per OAuth 1.0/ae 2.0, è possibile provare [rauth] (https://github.com/litl/rauth). – maxcountryman

Problemi correlati