Usando el archivo cookies.txt con Python Requests

Estoy tratando de acceder a un sitio autenticado usando un archivo cookies.txt (generado con una extensión de Chrome) con solicitudes de Python:

 import requests, cookielib cj = cookielib.MozillaCookieJar('cookies.txt') cj.load() r = requests.get(url, cookies=cj) 

No lanza ningún error o excepción, pero muestra la pantalla de inicio de sesión, de manera incorrecta. Sin embargo, sé que mi archivo de cookie es válido, porque puedo recuperar exitosamente mi contenido con wget . ¿Alguna idea de lo que estoy haciendo mal?

Editar:

Estoy rastreando cookielib.MozillaCookieJar._really_load y puedo verificar que las cookies están correctamente analizadas (es decir, tienen los valores correctos para el domain , path , tokens secure , etc.). Pero como la transacción sigue dando como resultado el formulario de inicio de sesión, parece que wget debe estar haciendo algo adicional (ya que el mismo archivo cookies.txt funciona para ello).

Related of "Usando el archivo cookies.txt con Python Requests"

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. 

Necesitas llamar al método .load() entonces.

Además, como Jermaine Xu señaló que la primera línea del archivo debe contener el # Netscape HTTP Cookie File o el # HTTP Cookie File . Los archivos generados por el complemento que utiliza no contienen dicha cadena, por lo que debe insertarlo usted 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 5ª columna. Si no pasa el ignore_expires=True to load() , todas esas cookies se descartan cuando se cargan desde un archivo.

Archivo session_cookie.txt :

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

Script Python:

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

Salida: 0

Editar 2

Aunque logramos obtener cookies en el flask anterior, cookielib las descarta posteriormente porque aún tienen un valor de 0 en el atributo de expires . Para evitar esto, tenemos que establecer el tiempo de caducidad en un tiempo futuro como el siguiente:

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

EDITAR 3

Revisé wget y curl y ambos usan el tiempo de caducidad 0 para indicar las cookies de sesión, lo que significa que es el estándar de facto. Sin embargo, la implementación de Python usa una cadena vacía para el mismo propósito, de ahí el problema que se plantea 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 presenté el error en http://bugs.python.org/issue17164
ignore_discard=True que reemplazar 0 s con cadenas vacías en la quinta columna del archivo de entrada y pasar ignore_discard=True to load() es la forma alternativa de resolver el problema (en este caso, no es necesario cambiar el tiempo de caducidad).

Finalmente encontré una forma de hacerlo funcionar (tuve la idea al ver la salida verbosa de curl ): en lugar de cargar mis cookies desde un archivo, simplemente creé un dict con los pares de value/name requeridos:

 cd = {'v1': 'n1', 'v2': 'n2'} r = requests.get(url, cookies=cd) 

y funcionó (aunque no explica por qué el método anterior no lo hizo). Gracias por toda la ayuda, es muy apreciado.

Traté de tener en cuenta todo lo que Piotr Dobrogost había descubierto valientemente acerca de MozillaCookieJar pero fue en vano. Me harté y solo cookies.txt las malditas cookies.txt 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)