我从客户端发送了一些 cookie,允许我以编程方式登录他的服务器,而无需凭据。
我正在使用 requests 包向他的服务器发出 HTTP 请求。问题是他发送的 cookie 都是 JSON 格式的,我似乎找不到任何方法来加载这些 cookie。
除了编写一种将它们转换为常规 cookie 的方法之外,是否有任何现有的解决方案来加载这些 cookie?
这是我当前的代码:
def cookieLogin(cookies):
with open(cookies) as f:
cookies = requests.utils.cookiejar_from_dict(json.load(f)[0] )
session = requests.session()
session.cookies = cookies
r = session.get('https://example.com')
cookies 示例:
[
{
"domain": ".example.com",
"hostOnly": false,
"httpOnly": false,
"name": "act",
"path": "/",
"sameSite": "no_restriction",
"secure": false,
"session": true,
"storeId": "0",
"value": "875",
"id": 1
},
{
"domain": ".example.com",
"expirationDate": 1479135421.720188,
"hostOnly": false,
"httpOnly": false,
"name": "c_user",
"path": "/",
"sameSite": "no_restriction",
"secure": true,
"session": false,
"storeId": "0",
"value": "109",
"id": 2
},
...
错误:
Traceback (most recent call last):
File "./cookieInviter.py", line 37, in <module>
session = cookieLogin(args.cookies)
File "/Users/jj/Projects/Jim/login.py", line 78, in cookieLogin
r = session.get('https://example.com')
File "/Library/Python/2.7/site-packages/requests/sessions.py", line 487, in get
return self.request('GET', url, **kwargs)
File "/Library/Python/2.7/site-packages/requests/sessions.py", line 461, in request
prep = self.prepare_request(req)
File "/Library/Python/2.7/site-packages/requests/sessions.py", line 394, in prepare_request
hooks=merge_hooks(request.hooks, self.hooks),
File "/Library/Python/2.7/site-packages/requests/models.py", line 297, in prepare
self.prepare_cookies(cookies)
File "/Library/Python/2.7/site-packages/requests/models.py", line 518, in prepare_cookies
cookie_header = get_cookie_header(self._cookies, self)
File "/Library/Python/2.7/site-packages/requests/cookies.py", line 136, in get_cookie_header
jar.add_cookie_header(r)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/cookielib.py", line 1342, in add_cookie
_header
attrs = self._cookie_attrs(cookies)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/cookielib.py", line 1301, in _cookie_at
trs
self.non_word_re.search(cookie.value) and version > 0):
TypeError: expected string or buffer
cookies jar :
<RequestsCookieJar[<Cookie domain=.example.com for />, <Cookie hostOnly=False for />, <Cookie httpOnly=False for />,
<Cookie id=1 for />, <Cookie name=act for />, <Cookie path=/ for />, <Cookie sameSite=no_restriction for />, <Cookie s
ecure=False for />, <Cookie session=True for />, <Cookie storeId=0 for />, <Cookie value=... for />]>
最佳答案
一种方法是创建一个函数,将所有字典的非字符串值递归地转换为字符串
import requests
session = requests.session()
def stringify(obj: dict) -> dict:
"""turn every value in the dictionary to a string"""
for k, v in obj.items():
if isinstance(v, dict):
# if value is a dictionary, stringifiy recursively
stringify(v)
continue
if not isinstance(v, str):
if isinstance(v, bool):
# False/True -> false/true
obj[k] = str(v).lower()
else:
obj[k] = str(v)
return obj
with open('cookies.json') as f:
cookie_list: list = json.load(f)
# create the cookie jar from the first cookie
cookie_jar = requests.utils.cookiejar_from_dict(stringify(cookie_list[0]))
# append the rest of the cookies
for cookie in cookie_list[1:]:
requests.utils.add_dict_to_cookiejar(cookie_jar, stringify(cookie))
session.cookies = cookie_jar
关于python - 将 JSON 格式的 cookie 加载到请求中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38999554/