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


我正在尝试使用a访问经过身份验证的站点 cookies.txt 使用Python请求的文件(使用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 文件适用于它)。


9762
2018-02-07 03:14


起源

有关: 在Python-Requests中使用Chrome的Cookie - Piotr Dobrogost
我用这个扩展名: chrome.google.com/webstore/detail/cookietxt-export/... - cjauvin


答案:


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

虽然我们设法将饼干放入上面的罐子里,但随后它们也是如此 丢弃 通过 cookielib 因为他们还有 0 价值在 expires 属性。为了防止这种情况,我们必须  未来某个时间的到期时间如下:

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
我会注意到更换 0s在输入文件的第5列中使用空字符串并传递 ignore_discard=True 至 load() 是解决问题的另一种方法(在这种情况下无需更改到期时间)。


11
2018-02-07 19:47



是的我在打电话 load,我已经在文件的顶部添加了正确的标题,但它仍然无法正常工作(我也试过了 urllib2代替 requests)。这是一个完全的谜。 - cjauvin
@cjauvin请永远不要在没有任何警告的情况下给出补码。 - Piotr Dobrogost
你到底是什么意思?我在没有警告的情况下提供了什么“编码”? - cjauvin
@cjauvin以下两行; cj = cookielib.MozillaCookieJar('cookies.txt') r = requests.get(url, cookies=cj) 其中不包含调用 .load() 您在代码中的这两行之间的某个方法。所以,这不是你拥有的真正的代码,而是一个组成的代码。 - Piotr Dobrogost
感谢更新!我充满了希望,因为你是对的: ignore_expires 参数确实有所作为,但不幸的是它仍然是相同的结果:无法登录。我想知道是否有一种方法可以比较什么 wget 我的脚本做了什么(即在确切的HTTP事务方面)? - cjauvin


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

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

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


0
2018-02-07 22:21



我很高兴你没有问你想问的问题 - “如何使用请求发送cookie | urllib2 | Python?”因为a)这已经被问及并回答了,b)我们有机会学到新东西。 :) - Piotr Dobrogost