CookieError:非法密钥

时间:2017-10-27 14:53:57

标签: cookies python-3.6 python-asyncio aiohttp

我正在aiohttp中编写一个网络抓取工具,并遇到Cookie问题。服务器我正在尝试抓取需要身份验证,并且为了获取经过身份验证的用户可用的页面,我需要在密钥本身中设置带括号的cookie。这是一个问题,因为aiohttp.ClientSession.cookie_jar.update_cookies要么忽略任何非法cookie:

session = ClientSession()
cookie = SimpleCookie("a[b]=1234;")
session.cookie_jar.update_cookies(cookie)
print([f for f in session.cookie_jar])  # empty list, cookie not set

或提出CookieError

session = ClientSession()
cookie = SimpleCookie()
cookie["a[b]"] = "1234"  # http.cookies.CookieError: Illegal key 'a[b]'
session.cookie_jar.update_cookies(cookie)
print([f for f in session.cookie_jar])


session = ClientSession()
session.cookie_jar.update_cookies([("a[b]", "1234")])  # http.cookies.CookieError: Illegal key 'a[b]'
print([f for f in session.cookie_jar])

可以通过访问http.cookies.Morsel的受保护成员_key强制设置cookie,即

session = ClientSession()
session.cookie_jar.update_cookies([("__tmp", "1234")])
for cookie in session.cookie_jar:
    if cookie.key == "__tmp":
        cookie._key = "a[b]"
print([f for f in session.cookie_jar])  # invalid cookie is set correctly

但这只会将问题推回一步,因为任何会话请求,例如session.get(url)开始提出http.cookies.CookieError

我无法绕过发送此Cookie。我是否坚持使用像requests这样的非异步库,或者有办法忽略这个问题吗?

2 个答案:

答案 0 :(得分:0)

aiohttp.CookieJar的建模遵循相应的RFC规范。为什么要处理非法 cookie名称?

答案 1 :(得分:0)

我找到了一种解决方法,虽然我不喜欢使用它,但它是重写整个aiohttp的首选解决方案:

import sys
if "http" in sys.modules:
    raise ImportError("Crawler must be imported before http module")
import http.cookies
http.cookies._is_legal_key = lambda _: True