【问题标题】:reading cookies file created by curl读取 curl 创建的 cookie 文件
【发布时间】:2016-09-20 20:58:42
【问题描述】:

我有以下由 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)?

谢谢。

【问题讨论】:

    标签: python curl cookies


    【解决方案1】:

    我测试了您的代码并对其进行了修改,它可以正常工作。 首先在 cookie 文件中你必须在你的 cookie 之前推迟 '#',我认为它会在它之后评论数据。 其次 cookie 中的 0 表示过期时间,0 表示现在过期,因此您可以将 0 更改为空字符串或稍后的时间,但我建议您使用参数 ignore_expire=True,官方意思是:

    ignore_discard:保存甚至设置为丢弃的cookie。

    ignore_expires: 保存已经过期的cookies,如果文件已经存在则覆盖

    结果代码是:

    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

    【讨论】:

    • 是的,igonore_expires=True 允许读取 0 ttl 的 cookie。 #HttpOnly_ 的问题仍然存在(这不是评论) - 有没有办法以某种方式对 python 说我确实想读取设置了 HttpOnly 标志的 cookie?当然,我可以(并且确实)手动打开 cookiefile 并对其进行修改(删除 #HttpOnly_),但最好使用合法的方式(如果存在)。
    • 如果你不想阅读一些cookie,你可以用'#'评论它,如果你说#HttpOnly_不是评论,那么我不知道如何解决你的问题,我不知道如何使用合法的方式来避免读取您设置标志的cookie
    【解决方案2】:

    这似乎是一个开放的错误: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()
    

    【讨论】:

      猜你喜欢
      • 2018-12-26
      • 1970-01-01
      • 2011-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-04
      • 1970-01-01
      相关资源
      最近更新 更多