solicitud de Python con autenticación (access_token)

84

Estoy tratando de obtener una consulta de API en Python. La linea de comando

curl --header "Authorization:access_token myToken" https://website.com/id

da una salida json. myToken es una variable hexadecimal que permanece constante en todo momento. Me gustaría hacer esta llamada desde Python para poder recorrer diferentes identificadores y analizar la salida. ¿Algunas ideas? Antes de que se necesitara la autenticación, lo hice con urllib2. También eché un vistazo al módulo de solicitudes, pero no pude averiguar cómo hacerlo.

Muchas gracias.

usuario1895406
fuente
Configuración de un token de autenticación para toda la sesión: stackoverflow.com/a/47043335/911945
Anton Tarasenko

Respuestas:

128

El paquete de solicitudes tiene una API muy agradable para solicitudes HTTP, agregar un encabezado personalizado funciona así ( fuente: documentos oficiales ):

>>> import requests
>>> response = requests.get(
... 'https://website.com/id', headers={'Authorization': 'access_token myToken'})

Si no desea usar una dependencia externa, lo mismo que usa urllib2 de la biblioteca estándar se ve así ( fuente: el manual que falta ):

>>> import urllib2
>>> response = urllib2.urlopen(
... urllib2.Request('https://website.com/id', headers={'Authorization': 'access_token myToken'})
wosc
fuente
Gracias por su respuesta. Probé ambas implementaciones y obtengo un Error HTTP 401: No autorizado. Sin embargo, la línea de comandos funciona bien. Nunca he trabajado con tokens de acceso, así que para ser claro: el token que tengo es de 40 dígitos del formulario 3f4264ff, etc.
user1895406
1
Extraño. Lo que me molesta un poco son los dos puntos en el encabezado ... ¡ah! Quizás yo (o ambos;) leímos mal. El encabezado podría llamarse "Autorización" y su valor sería "access_token long_hexadecimal_string". ¿Quieres darle una vuelta?
wosc
¡eso funciono! Muchas gracias. lo que terminé escribiendo es url = ' website.com/id ' head = {'Authorization': 'access_token hex_string'} res = request.get (url, headers = head)
user1895406
1
Esta solución está obsoleta o no funciona en la instalación predeterminada de Anaconda.
bloodrootfc
1
Es un token de autenticación que el servidor usa para verificar que está autorizado para tener acceso a la API. Debe obtener las credenciales del cliente (nombre de usuario, contraseña, clave API) para la API a la que desea acceder y luego enviarlas (por ejemplo, a través de una solicitud de obtención) al servidor de autenticación. El servidor devuelve una cadena que podría estar codificada en JSON a su cliente y luego la usa como un token en sus llamadas a la API. Busque JWT u OAuth para leer un poco más y ver algunos ejemplos.
Filip
28

Tuve el mismo problema al intentar usar un token con Github.

La única sintaxis que me ha funcionado con Python 3 es:

import requests

myToken = '<token>'
myUrl = '<website>'
head = {'Authorization': 'token {}'.format(myToken)}
response = requests.get(myUrl, headers=head)
Bloodrootfc
fuente
¿Cuál sería la ficha aquí? ¿O cómo obtener el token de autenticación?
Deep Jadia
8
>>> import requests
>>> response = requests.get('https://website.com/id', headers={'Authorization': 'access_token myToken'})

Si lo anterior no funciona, intente esto:

>>> import requests
>>> response = requests.get('https://api.buildkite.com/v2/organizations/orgName/pipelines/pipelineName/builds/1230', headers={ 'Authorization': 'Bearer <your_token>' })
>>> print response.json()
Sowmiya Ragu
fuente
1
Tuve el mismo problema esta semana y lo que terminó funcionando para mí fue la opción de portador de autorización. No estoy seguro de por qué hay una diferencia, ¡pero gracias por brindarme esa opción para intentar trabajar con éxito!
Ryan Harris
@SowmiyaRagu, la segunda parte funciona para mí, Bearer <my_token>mientras que la primera no porque la respuesta es como si la solicitud no estuviera autenticada.
Hydradon
2

¿Has probado el uncurlpaquete ( https://github.com/spulec/uncurl )? Se puede instalar a través de la pipa, pip install uncurl. Su solicitud de curl regresa:

>>> uncurl "curl --header \"Authorization:access_token myToken\" https://website.com/id"

requests.get("https://website.com/id",
    headers={
        "Authorization": "access_token myToken"
    },
    cookies={},
)
tschmelz
fuente
1

Agregaré una pequeña pista: parece que lo que pasa como el valor clave de un encabezado depende de su tipo de autorización, en mi caso eso fue PRIVATE-TOKEN

header = {'PRIVATE-TOKEN': 'my_token'}
response = requests.get(myUrl, headers=header)
Orkhan M.
fuente