使用带有Python请求的cookies.txt文件

时间:2013-02-07 03:14:13

标签: python cookies python-requests cookielib

我正在尝试使用带有Python请求的cookies.txt文件(使用Chrome扩展程序生成)访问经过身份验证的网站:

import requests, cookielib

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

它不会抛出任何错误或异常,但会错误地生成登录屏幕。但是,我知道我的cookie文件是有效的,因为我可以使用wget成功检索我的内容。知道我做错了吗?

修改

我正在跟踪cookielib.MozillaCookieJar._really_load并且可以验证Cookie是否已正确解析(即它们具有domainpathsecure等的正确值。令牌)。但由于事务仍然导致登录表单,wget似乎必须做一些额外的操作(因为完全相同的cookies.txt文件适用于它)。

4 个答案:

答案 0 :(得分:11)

MozillaCookieJar继承自FileCookieJar,其构造函数中包含以下docstring:

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

然后你需要调用.load()方法。

此外,与Jermaine Xu一样,该文件的第一行需要包含# Netscape HTTP Cookie File# HTTP Cookie File字符串。您使用的插件生成的文件不包含此类字符串,因此您必须自己插入。我在http://code.google.com/p/cookie-txt-export/issues/detail?id=5

提出了适当的错误

修改

会话cookie在第5列中保存为0。如果您未将ignore_expires=True传递给load()方法,则从文件加载时会丢弃所有此类Cookie。

档案session_cookie.txt

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

Python脚本:

import cookielib

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

输出: 0

编辑2

虽然我们设法在上面的jar中获取了Cookie,但cookielib 0之后expires因为for cookie in cj: # set cookie expire date to 14 days from now cookie.expires = time.time() + 14 * 24 * 3600 属性中的值仍为0。为了防止这种情况发生,我们必须discarded过期时间到以后某个时间:

0

编辑3

我检查了wget和curl,并且都使用ignore_discard=True到期时间来表示会话cookie,这意味着它是事实上的标准。但是,Python的实现使用空字符串用于相同的目的,因此问题中出现了问题。我认为Python在这方面的行为应该与wget和curl的行为一致,这就是我在set提出错误的原因。 我会注意到,在输入文件的第5列中用空字符串替换load()并将{{1}}传递给{{1}}是解决问题的另一种方法(无需更改到期日期)在这种情况下的时间)。

答案 1 :(得分:0)

我终于找到了一种让它工作的方法(我通过查看curl的详细输出得到了这个想法):我只是创建了一个dict而不是从文件中加载我的cookie。所需的value/name对:

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

并且它有效(虽然它没有解释为什么以前的方法没有)。感谢所有的帮助,非常感谢。

答案 2 :(得分:0)

我尝试考虑了Piotr Dobrogost勇敢地想出的关于MozillaCookieJar的所有内容,但无济于事。我受够了,自己剖析了该死的cookies.txt,现在一切都好了:

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)

答案 3 :(得分:0)

这对我有用:

from http.cookiejar import MozillaCookieJar
from pathlib import Path
import requests

cookies = Path('/Users/name/cookies.txt')
jar = MozillaCookieJar(cookies)
jar.load()
requests.get('https://path.to.site.com', cookies=jar)
<Response [200]>