2012-09-27 21 views
6

He estado golpeando mi cabeza contra la pared para averiguar cómo enviar solicitudes autenticadas con oauth.Cómo enviar una solicitud oauth con python-oauth2

Pude obtener tokens de acceso, pero no estaba del todo seguro de cómo enviar una solicitud con ellos. He encontrado esto en la información del desarrollador de Twitter:

https://dev.twitter.com/docs/auth/oauth/single-user-with-examples#python que tiene un código de ejemplo para el envío de una solicitud autorizada:

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) 

Sin embargo, al incluir a toda mi información, que recibe el siguiente error:

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' 

donde: el usuario es el usuario real (lo he quitado de la publicación) y tokenKey/tokenSecret son los tokens de acceso.

pensé que tal vez era tan simple como comentario la línea en cuestión, pero no hubo suerte:

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 

Así que ahora, stackoverflow, que son mi única esperanza! ¿Alguien tiene sugerencias sobre cómo usar mi token de acceso para enviar una solicitud?

gracias!

+0

¿Puedes publicar tu código? no es posible ayudar sin él – jterrace

+0

El código es el mismo que el del enlace en la publicación original. He editado la publicación original para que contenga el código; ¡Gracias! –

Respuesta

10

La documentación de Twitter está desactualizada; la versión de oauth2 con la que se vincula es una horquilla de 3 años. No hay ningún argumento de palabra clave force_auth_header más por oauth2.Client.request

La razón por la que todavía se producen errores, incluso después de la eliminación de la línea en cuestión es debido a que su valor por defecto para post_body es None la que se pasa directamente a través de oauth2.Client.request. No podrás hacer eso en la práctica. Deberá requerir ese argumento, elegir un valor predeterminado que funcione (por ejemplo, una cadena vacía) o verificar antes de pasarlo para evitar este error.

4

Sólo para ampliar los comentarios de Rafe ...

La mayor parte de las bibliotecas de OAuth en Python son increíblemente roto, fuera de fecha, y ya no se mantiene. La mayoría de ellos ni siquiera pasan sus propias pruebas, y mucho menos las especificaciones de formato. Twitter no debería hacer referencia a ninguna de esas cosas, pero lo hacen.

Twython es un cliente de Twitter Python que envuelve OAuth - https://github.com/ryanmcgrath/twython - que envuelve la especificación OAuth1 a través de los requests y requests-oauth paquetes - , http://pypi.python.org/pypi/requests-oauth - pero API de Twitter que acepta.

en términos de oAuth 2, esta biblioteca tiene algunos trabajos recientes tratando de implementarlo (último compromiso hace 2 meses) - https://github.com/idan/oauthlib. No lo he probado yo mismo, y lo descubrí ayer.

para agregar rápidamente, aunque use etsy, debería poder realizar ingeniería inversa en twython para usar los puntos finales etsy si es compatible con oauth1.

+0

Si necesita una biblioteca cliente completa y mantenida para OAuth 1.0/a y 2.0, puede probar [rauth] (https://github.com/litl/rauth). – maxcountryman

Cuestiones relacionadas