Saltar al contenido

Uso del archivo cookies.txt con solicitudes de Python

Te sugerimos que pruebes esta solución en un ambiente controlado antes de enviarlo a producción, un saludo.

Solución:

MozillaCookieJar hereda de FileCookieJar que tiene la siguiente cadena de documentación en su constructor:

Cookies are NOT loaded from the named file until either the .load() or
.revert() method is called.

tienes que llamar .load() método entonces.

Además, como señaló Jermaine Xu, la primera línea del archivo debe contener # Netscape HTTP Cookie File o # HTTP Cookie File string. Los archivos generados por el complemento que usa no contienen tal string así que tienes que insertarlo tú mismo. Presenté el error apropiado en http://code.google.com/p/cookie-txt-export/issues/detail?id=5

EDITAR

Las cookies de sesión se guardan con 0 en la quinta columna. si no pasas ignore_expires=True para load() Todas estas cookies se descartan cuando se cargan desde un archivo.

Expediente session_cookie.txt:

# Netscape HTTP Cookie File
.domain.com TRUE    /   FALSE   0   name    value

Escritura de Python:

import cookielib

cj = cookielib.MozillaCookieJar('session_cookie.txt')
cj.load()
print len(cj)

Producción:
0

EDITAR 2

Aunque logramos colocar las galletas en el frasco de arriba, posteriormente son descartadas por cookielib porque todavía tienen 0 valor en el expires attribute. Para evitar esto, debemos establecer el tiempo de caducidad en algún momento futuro de la siguiente manera:

for cookie in cj:
    # set cookie expire date to 14 days from now
    cookie.expires = time.time() + 14 * 24 * 3600

EDITAR 3

Revisé tanto wget como curl y ambos usan 0 tiempo de caducidad para indicar cookies de sesión, lo que significa que es el estándar de facto. Sin embargo, la implementación de Python utiliza vacío string con el mismo propósito de ahí el problema planteado en la pregunta. Creo que el comportamiento de Python en este sentido debería estar en línea con lo que hacen wget y curl y es por eso que planteé el error en http://bugs.python.org/issue17164
Tomaré nota de que reemplazando 0s con cadenas vacías en la quinta columna del archivo de entrada y pasando ignore_discard=True para load() es la forma alternativa de resolver el problema (no es necesario cambiar el tiempo de caducidad en este caso).

Traté de tener en cuenta todo lo que Piotr Dobrogost valientemente había descubierto sobre MozillaCookieJar pero fue en vano. Me harté y simplemente analicé el maldito cookies.txt yo mismo y ahora todo está bien:

import re
import requests

def parseCookieFile(cookiefile):
    """Parse a cookies.txt file and return a dictionary of key value pairs
    compatible with requests."""

    cookies = 
    with open (cookiefile, 'r') as fp:
        for line in fp:
            if not re.match(r'^#', line):
                lineFields = line.strip().split('t')
                cookies[lineFields[5]] = lineFields[6]
    return cookies

cookies = parseCookieFile('cookies.txt')

import pprint
pprint.pprint(cookies)

r = requests.get('https://example.com', cookies=cookies)

Te mostramos comentarios y valoraciones

No se te olvide comunicar este tutorial si te fue útil.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *