¿Cómo enviar cookies en una solicitud de publicación con la biblioteca Python Requests?

94

Estoy tratando de usar la biblioteca de solicitudes para enviar cookies con una solicitud de publicación, pero no estoy seguro de cómo configurar las cookies en función de su documentación. El script es para uso en Wikipedia, y las cookies que deben enviarse tienen este formato:

enwiki_session=17ab96bd8ffbe8ca58a78657a918558e; path=/; domain=.wikipedia.com; HttpOnly

Sin embargo, la requestsguía de inicio rápido de la documentación ofrece esto como único ejemplo:

cookies = dict(cookies_are='working')

¿Cómo puedo codificar una cookie como la anterior usando esta biblioteca? ¿Necesito hacerlo con la biblioteca de cookies estándar de Python y luego enviarlo junto con la solicitud POST?

Ricardo Altamirano
fuente
2
Su cookie consta de varios a=b;pares. En una suposición, utilícelo acomo clave y bcomo valor en un diccionario.
Thomas K

Respuestas:

214

La última versión de Requests creará CookieJars para usted a partir de diccionarios simples.

import requests

cookies = {'enwiki_session': '17ab96bd8ffbe8ca58a78657a918558'}

r = requests.post('http://wikipedia.org', cookies=cookies)

Disfruta :)

Kenneth Reitz
fuente
¿Se supone que este código coloca una cookie en mi navegador? Lo probé y no me funcionó.
Chris Nielsen
15
@ChrisNielsen esta pregunta / respuesta no tiene nada que ver con los navegadores
ThiefMaster
@ThiefMaster: Normalmente, las cookies viven en los navegadores. Si esta respuesta no tiene que ver con los navegadores, ¿con qué tiene que ver?
Chris Nielsen
4
@ChrisNielsen: Esta pregunta y el código de la respuesta tratan sobre la configuración de una cookie en una solicitud de Python. La solicitud hace algo similar a una solicitud de navegador, pero no hay navegadores involucrados.
Día
118

Solo para ampliar la respuesta anterior, si está vinculando dos solicitudes juntas y desea enviar las cookies devueltas de la primera a la segunda (por ejemplo, manteniendo una sesión activa entre las solicitudes), puede hacer:

import requests
r1 = requests.post('http://www.yourapp.com/login')
r2 = requests.post('http://www.yourapp.com/somepage',cookies=r1.cookies)
Oarevalo
fuente
54
Además, puede usar requests.sessionpara esto exactamente, almacenar cookies en múltiples sesiones, haciendo llamadas desde el sessionobjeto devuelto .
TankorSmash
7
He tenido que utilizar esto incluso cuando uso sesiones a veces. Las sesiones parecen perder los encabezados Set-Cookie en algunas situaciones.
kervin
1
@kervin, esto también me pasó a mí. Parece un error en las solicitudes, porque la sesión debería manejar eso.
deweydb
3
@TankorSmash definitivamente hay un error, mis cookies no se request.session
transfieren
¿Es esta la mejor manera de configurar una cookie (perdida) en una sesión? stackoverflow.com/a/17240616/143397
davidA
0

Si desea pasar la cookie al navegador, debe agregarla a los encabezados para que se envíe de vuelta. Si está usando wsgi:

import requests
...


def application(environ, start_response):
    cookie = {'enwiki_session': '17ab96bd8ffbe8ca58a78657a918558'}
    response_headers = [('Content-type', 'text/plain')]
    response_headers.append(('Set-Cookie',cookie))
...

    return [bytes(post_env),response_headers]

Puedo autenticarme con éxito con Bugzilla y TWiki alojados en el mismo dominio que se está ejecutando mi script wsgi de Python al pasar el usuario / contraseña de autenticación a mi script de Python y pasar las cookies al navegador. Esto me permite abrir las páginas de Bugzilla y TWiki en el mismo navegador y autenticarme. Estoy tratando de hacer lo mismo con SuiteCRM, pero tengo problemas para que SuiteCRM acepte las cookies de sesión obtenidas del script de Python a pesar de que se ha autenticado correctamente.

Esforzarse más
fuente