【问题标题】:How do I reach cookie information in python requests?如何在 python 请求中获取 cookie 信息?
【发布时间】:2016-10-09 04:16:00
【问题描述】:

我正在尝试编写一个小脚本,让我可以查看与我的网站设置的 cookie 相关的信息。

我想知道它是否设置了securehttpOnly 标志。但到目前为止我还不能做到,我只知道如何获取 cookie 名称和值。这是我当前的代码:

r = requests.post('url', data=data, headers=headers)

for (name, cookie) in r.cookies.items():
    print name, cookie

到目前为止,这工作正常,但我想获取与 cookie相关的信息,而不是值本身。如果您愿意,可以使用 Cookie 元数据。

我怎样才能做到这一点?

【问题讨论】:

    标签: python cookies python-requests


    【解决方案1】:

    您可以单独从每个 cookie 中提取信息:

    import requests
    
    r = requests.post('http://www.about.com')
    
    for cookie in r.cookies:
        print(cookie.__dict__)
        print(cookie.secure)
    

    这是因为r.cookiesRequestsCookieJar 的一个实例,它扩展自CookieJar(Python 2:cookielib.CookieJar,Python 3:http.cookiejar.CookieJar)。 CookieJarCookie 对象。

    参考资料:

    更新: 我还没有找到从Cookie 对象中检索httponly 值的方法。在 Python 3 中,您可以通过字典定义 Morsel 对象,它认为 httponly 是 cookie 的标准属性(https://docs.python.org/3/library/http.cookies.html),但我在定义规范 RFC2109 (https://www.ietf.org/rfc/rfc2109.txt)。

    也就是说,如果httponly 实际上是一个非标准属性,那么您可以使用以下命令来检查 cookie 是否具有它: cookie.has_nonstandard_attr('httponly')

    【讨论】:

    • 你可以直接for cookie in r.cookies:,也不需要导入print_function
    • 啊很好 :) 但我发现它不适用于 httpOnly。至少不是在 2.7 上。有没有办法达到那个目标?
    • @RodrigoSasaki,我对此并不完全确定,但根据 RFC2109 (ietf.org/rfc/rfc2109.txt),httponly 似乎不是 cookie 中预期的标准属性的一部分。您可以检查 cookie 是否包含非标准属性,尽管如此 cookie.has_nonstandard_attr('httponly')。尽管有相互矛盾的证据表明httponly 也可能有效(参见:docs.python.org/3.5/library/…)。只是在 RFC2109 文档中找不到对它的单一引用。
    • @HEADLESS_0NE,我明白了.. 我真的很好奇,但我可以从现在开始处理它:) 谢谢你的帮助!
    【解决方案2】:

    在 Python 3 下,我无法从以下位置检索 httpOnly 标志:

    cookie.get_nonstandard_attr('httpOnly')
    

    cookie.has_nonstandard_attr('httpOnly')
    

    即使在 cookie 中包含 httpOnly 标志,也会返回 False

    这也不适用于httponlyHttpOnly 等的任何变体。

    使用@HEADLESS_0NE 的帖子,我发现您可以通过查看cookie.__dict__ 中的_rest 字段来检索标志。如果httpOnly包含在cookie中,

    cookie.__dict__['_rest']
    

    将返回如下内容:

    {'HttpOnly': None, ...}
    

    因此,这里有一个小辅助函数来检查 cookie 是否具有 httpOnly 标志。

    def has_http_only(cookie):
        extra_args = cookie.__dict__.get('_rest')
        if extra_args:
            for key in extra_args.keys():
                if key.lower() == 'httponly':
                    return True
    
        return False
    

    安全标志会自动添加到cookie 对象中,并且可以使用cookie.secure 进行检索。

    【讨论】:

    • cookie.has_nonstandard_attr 最初可能不起作用,因为看起来 Python 用于 HttpOnly 的大小写发生了一些变化。混合大小写目前是正确的,并且在几个版本之前进行了更新。 hg.python.org/cpython/rev/0d8380c493ad
    猜你喜欢
    • 2012-05-22
    • 2015-07-07
    • 2019-06-20
    • 1970-01-01
    • 1970-01-01
    • 2018-08-03
    • 2014-06-16
    • 2021-11-29
    • 2023-03-04
    相关资源
    最近更新 更多