读取curl创建的cookie文件

som*_*ome 5 python cookies curl

我通过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
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用以下代码阅读它:

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))
Run Code Online (Sandbox Code Playgroud)

它输出0(无法读取cookie)。如果我手动将cookie修改为以下行(删除HttpOnly标志,并将0更改为空字符串以使其过期,然后再次制表符分隔):

my-example.com  FALSE   /   FALSE       _rails-root_session test
Run Code Online (Sandbox Code Playgroud)

然后输出1(成功读取cookie)。

要读取原始Cookie行,需要对我的python代码做些什么?并且最好能够将其保存为相同的格式(使用HttpOnly标志并使用0而不是空字符串表示永不过期的Cookie)?

谢谢。

Mit*_*tch 5

这似乎是一个未解决的错误: 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()
Run Code Online (Sandbox Code Playgroud)


小智 2

我测试了你的代码并修改了它,它有效。首先,在 cookie 文件中,您必须在 cookie 之前取消“ # ”,我认为它会注释后面的数据。其次cookie中的0表示过期时间,0表示现在过期,所以你可以将0更改为空字符串或稍后的时间,但我建议你使用参数ignore_expire=True,官方的意思是:

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))
Run Code Online (Sandbox Code Playgroud)

您可以查看链接以查找更多详细信息: Using cookies.txt file with Python Requests