我有curl保存的以下cookie(在test.txt中,以制表符分隔,此编辑器不保留制表符):
# Netscape HTTP Cookie File
# http://curlm.haxx.se/rfc/cookie_spec.html
# This file was generated by libcurl! Edit at your own risk.
#HttpOnly_my-example.com FALSE / FALSE 0 _rails-root_session test
我正在尝试使用以下代码阅读它:
import sys
if sys.version_info < (3,):
from cookielib import Cookie, MozillaCookieJar
else:
from http.cookiejar import Cookie, MozillaCookieJar
def load_cookies_from_mozilla(filename):
ns_cookiejar = MozillaCookieJar()
ns_cookiejar.load(filename, ignore_discard=True)
return ns_cookiejar
cookies = load_cookies_from_mozilla("test.txt")
print (len(cookies))
输出0(无法读取cookie)。 如果我手动将我的cookie修改为以下行(删除HttpOnly标志并将0更改为空字符串的到期时间,再次,以制表符分隔):
my-example.com FALSE / FALSE _rails-root_session test
然后输出1(成功读取cookie)。
我的python代码需要做什么来读取原始的cookie行?并且最好能够以相同的格式保存它(使用HttpOnly标志和0而不是空字符串表示永不过期的cookie)?
感谢。
答案 0 :(得分:1)
我测试了你的代码并对其进行了修改,它确实有效。 首先在Cookie文件中,您必须推迟&#39; # &#39;在你的cookie之前,我认为它会在它之后评论数据。 其次,cookie中的0表示过期时间,0表示现在过期,因此您可以将0更改为空字符串或后者,但我建议您使用参数 ignore_expire = True < / strong>,官方的意思是:
ignore_discard:保存甚至设置为丢弃的cookie。
ignore_expires:保存已过期的Cookie如果文件已存在则覆盖该文件
,结果代码为:
import sys
if sys.version_info < (3,):
from cookielib import Cookie, MozillaCookieJar
else:
from http.cookiejar import Cookie, MozillaCookieJar
def load_cookies_from_mozilla(filename):
ns_cookiejar = MozillaCookieJar()
ns_cookiejar.load(filename, ignore_discard=True, ignore_expires=True)
return ns_cookiejar
cookies = load_cookies_from_mozilla("test.txt")
print (len(cookies))
您可以看到链接以查找更多详细信息: Using cookies.txt file with Python Requests
答案 1 :(得分:1)
这似乎是一个公开的错误:https://bugs.python.org/issue2190。
此错误报告包含解决方法的链接:https://gerrit.googlesource.com/git-repo/+/master/subcmds/sync.py#995
在该链接的代码中,开发人员创建一个临时cookie文件,删除“ #HttpOnly_”前缀,然后使用该临时文件创建一个cookiejar。
tmpcookiefile = tempfile.NamedTemporaryFile()
tmpcookiefile.write("# HTTP Cookie File")
try:
with open(cookiefile) as f:
for line in f:
if line.startswith("#HttpOnly_"):
line = line[len("#HttpOnly_"):]
tmpcookiefile.write(line)
tmpcookiefile.flush()
cookiejar = cookielib.MozillaCookieJar(tmpcookiefile.name)
try:
cookiejar.load()
except cookielib.LoadError:
cookiejar = cookielib.CookieJar()
finally:
tmpcookiefile.close()