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 0
s 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.