在 Python 请求中使用 cookies.txt 文件

新手上路,请多包涵

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

 import requests, cookielib

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

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

编辑:

I’m tracing cookielib.MozillaCookieJar._really_load and can verify that the cookies are correctly parsed (ie they have the correct values for the domain , path , secure 等标记)。但是由于交易仍然导致登录表单,似乎 wget 必须做一些额外的事情(因为完全相同的 cookies.txt 文件适用于它)。

原文由 cjauvin 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

MozillaCookieJar 继承自 FileCookieJar 在其构造函数中具有以下文档字符串:

 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

尽管我们设法将 cookie 放入上面的 jar 中,但它们随后被 cookielib 丢弃,因为它们在 expires 属性中仍然具有 0 值。为了防止这种情况,我们必须将过期时间 设置 为将来的某个时间,如下所示:

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

编辑 3

我检查了 wget 和 curl,都使用 0 到期时间来表示会话 cookie,这意味着它是事实上的标准。然而,Python 的实现出于相同目的使用空字符串,因此问题中提出了问题。我认为 Python 在这方面的行为应该与 wget 和 curl 的行为一致,这就是我在 http://bugs.python.org/issue17164 提出错误的原因

我会注意到,在输入文件的第 5 列中用空字符串替换 0 s 并将 ignore_discard=True 传递给 load() 是解决问题的替代方法(在这种情况下无需更改到期时间)。

原文由 Piotr Dobrogost 发布,翻译遵循 CC BY-SA 3.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)

原文由 Tristan 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题