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?
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
Freek Wiekmeijer
Desde el documentación:
-
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'}
-
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
authentication
entonces puede acceder, de lo contrario405 Not Allowed
- Común
authentication
=grant access
método son:cookie
auth header
Basic xxx
Authorization xxx
Como usar cookie
en requests
para autenticar
- primero obtener/generar cookie
- enviar cookie para la siguiente solicitud
- conjunto manual
cookie
enheaders
- proceso automático
cookie
porrequests
‘ssession
para administrar automáticamente las cookiesresponse.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)