¿Cómo puedo usar cookies en las solicitudes de Python?

4 minutos de lectura

avatar de usuario de user1474157
usuario1474157

Estoy tratando de iniciar sesión en una página y acceder a otro enlace en la página.

Recibo un error “405 No permitido” de este intento:

payload={'username'=<username>,'password'=<password>}
with session() as s:
    r = c.post(<URL>, data=payload)
    print(r)
    print(r.content)

Revisé los detalles del método de publicación con las herramientas para desarrolladores de Chrome y encontré una URL que parecía ser un punto final de la API. Publiqué en esa URL con la carga útil y pareció funcionar; Obtuve una respuesta similar a la que pude ver en el desarrollador.

Desafortunadamente, cuando trato de ‘obtener’ otra URL después de iniciar sesión, sigo obteniendo el contenido de la página de inicio de sesión. ¿Por qué no se pega el inicio de sesión? ¿Debo usar cookies? ¿Cómo?

avatar de usuario de gtalarico
gtalarico

Puede utilizar un objeto de sesión. Almacena las cookies para que pueda realizar solicitudes y las maneja por usted.

s = requests.Session() 
# all cookies received will be stored in the session object

s.post('http://www...',data=payload)
s.get('http://www...')

Documentos: https://requests.readthedocs.io/en/master/user/advanced/#session-objects

También puede guardar los datos de las cookies en un archivo externo y luego volver a cargarlos para mantener la sesión persistente sin tener que iniciar sesión cada vez que ejecuta el script:

¿Cómo guardar cookies de solicitudes (python) en un archivo?

  • :O Esto es increíble! Ojalá hubiera sabido acerca de esta característica antes. ¿Está almacenando las cookies en el disco como un navegador, o simplemente reteniéndolas en la memoria?

    – Aurelio

    30 de junio de 2018 a las 10:16


  • Simplemente los mantiene en la memoria mientras se ejecuta la aplicación. Para guardar/cargar cookies desde el disco, vea esto: stackoverflow.com/a/30441145/4411196

    – gtalarico

    20 de julio de 2018 a las 13:51

  • En lugar de guardarlos, hice una variable global, le asigné una sesión e hice una función para que inicie sesión si la cookie no está allí y/o devuelve la sesión.

    – yashas123

    13 de julio de 2020 a las 15:06

  • para mí, print (s.cookies) muestra que las cookies están en la sesión pero no siempre se pasan en solicitudes posteriores (de hecho, el mismo código funciona contra localhost pero contra un servidor de prueba no lo hace)

    – Andrzej Martina

    30 de diciembre de 2021 a las 10:55


Avatar de usuario de Freek Wiekmeijer
Freek Wiekmeijer

Desde el documentación:

  1. obtener una cookie de la respuesta

     url="http://example.com/some/cookie/setting/url"
     r = requests.get(url)
     r.cookies
    

    {'example_cookie_name': 'example_cookie_value'}

  2. devolver la cookie al servidor en una solicitud posterior

     url="http://httpbin.org/cookies"
     cookies = {'cookies_are': 'working'}
     r = requests.get(url, cookies=cookies)`
    

  • Gracias. En realidad, parece que no se crean cookies. Revisé los encabezados de solicitud y no pude ver ninguna ‘cookie’. Mientras tanto, se crea una cookie en los encabezados de respuesta. ¿Cómo puedo hacer que mi inicio de sesión se mantenga si no hay una cookie?

    – usuario1474157

    22 de julio de 2015 a las 9:40


  • El flujo normal para una cookie de autenticación es: (1) cuando envía un formulario de inicio de sesión, recibe una cookie en los encabezados de respuesta. (2) en solicitudes de página posteriores, agrega la cookie a los encabezados de solicitud.

    – Freek Wiekmeijer

    22 de julio de 2015 a las 9:54

  • ¿Cómo se agregan varias cookies?

    – Jitín

    27 de octubre de 2020 a las 6:11

  • Las “cookies” de kwarg son un dictado, puede agregar tantos elementos como desee.

    – Freek Wiekmeijer

    27 de octubre de 2020 a las 6:38

Resumen (@Freek Wiekmeijer, @gtalarico) la respuesta de otros:

Lógica de inicio de sesión

  • Muchos recursos (páginas, api) necesitan authenticationentonces puede acceder, de lo contrario 405 Not Allowed
  • Común authentication=grant access método son:
    • cookie
    • auth header
      • Basic xxx
      • Authorization xxx

Como usar cookie en requests para autenticar

  1. primero obtener/generar cookie
  2. enviar cookie para la siguiente solicitud
  • conjunto manual cookie en headers
  • proceso automático cookie por requests‘s
    • session para administrar automáticamente las cookies
    • response.cookies para configurar manualmente las cookies

utilizar requests‘s session administrar automáticamente las cookies

curSession = requests.Session() 
# all cookies received will be stored in the session object

payload={'username': "yourName",'password': "yourPassword"}
curSession.post(firstUrl, data=payload)
# internally return your expected cookies, can use for following auth

# internally use previously generated cookies, can access the resources
curSession.get(secondUrl)

curSession.get(thirdUrl)

controlar manualmente requests‘s response.cookies

payload={'username': "yourName",'password': "yourPassword"}
resp1 = requests.post(firstUrl, data=payload)

# manually pass previously returned cookies into following request
resp2 = requests.get(secondUrl, cookies= resp1.cookies)

resp3 = requests.get(thirdUrl, cookies= resp2.cookies)

Como otros señalaron, aquí hay un ejemplo de cómo agregar cookies como variable de cadena al parámetro de encabezado:

    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ...',
        'cookie': '_fbp=fb.1.1654447470850.2143140577; _ga=GA1.2.1...'
    }
    response = requests.get(url, headers=headers)

¿Ha sido útil esta solución?