diff --git a/DrissionPage/config.py b/DrissionPage/config.py index 8e71e33..84fff5a 100644 --- a/DrissionPage/config.py +++ b/DrissionPage/config.py @@ -6,9 +6,11 @@ @File : config.py """ from configparser import ConfigParser, NoSectionError, NoOptionError +from http.cookiejar import Cookie from pathlib import Path from typing import Any, Union +from requests.cookies import RequestsCookieJar from selenium import webdriver from selenium.webdriver.chrome.options import Options @@ -175,8 +177,8 @@ class SessionOptions(object): if options_dict.get('cert', None) is not None: self._cert = options_dict['cert'] - if options_dict.get('adapters', None) is not None: - self._adapters = options_dict['adapters'] + # if options_dict.get('adapters', None) is not None: + # self._adapters = options_dict['adapters'] if options_dict.get('stream', None) is not None: self._stream = options_dict['stream'] @@ -682,8 +684,15 @@ def _session_options_to_dict(options: Union[dict, SessionOptions, None]) -> Unio return options re_dict = dict() - attrs = ['headers', 'cookies', 'auth', 'proxies', 'hooks', 'params', 'verify', - 'adapters', 'stream', 'trust_env', 'max_redirects'] + attrs = ['headers', 'auth', 'proxies', 'hooks', 'params', 'verify', + 'stream', 'trust_env', 'max_redirects'] # 'adapters', + + val = options.__getattribute__(f'_cookies') + if val is not None: + if isinstance(val, (list, tuple)): + re_dict['cookies'] = val + elif isinstance(val, RequestsCookieJar): + re_dict['cookies'] = [_cookie_to_dict(cookie) for cookie in val] for attr in attrs: val = options.__getattribute__(f'_{attr}') @@ -694,3 +703,13 @@ def _session_options_to_dict(options: Union[dict, SessionOptions, None]) -> Unio re_dict['cert'] = options.__getattribute__('_cert') return re_dict + + +def _cookie_to_dict(cookie: Cookie) -> dict: + # TODO: 其它值? + cookie_dict = {'name': cookie.name, 'value': str(cookie.value), 'path': cookie.path, 'domain': cookie.domain} + + if cookie.expires: + cookie_dict['expiry'] = cookie.expires + + return cookie_dict diff --git a/DrissionPage/drission.py b/DrissionPage/drission.py index dd97554..3ee6837 100644 --- a/DrissionPage/drission.py +++ b/DrissionPage/drission.py @@ -17,7 +17,7 @@ from selenium.webdriver.chrome.webdriver import WebDriver from tldextract import extract from .config import (_dict_to_chrome_options, _session_options_to_dict, - SessionOptions, DriverOptions, _chrome_options_to_dict, OptionsManager) + SessionOptions, DriverOptions, _chrome_options_to_dict, OptionsManager, _cookie_to_dict) class Drission(object): @@ -160,14 +160,14 @@ class Drission(object): self._session = Session() attrs = ['headers', 'auth', 'proxies', 'hooks', 'params', 'verify', - 'cert', 'adapters', 'stream', 'trust_env', 'max_redirects'] + 'cert', 'stream', 'trust_env', 'max_redirects'] # , 'adapters' if 'cookies' in data: if isinstance(data['cookies'], (list, tuple)): - pass - # for cookie in data['cookies']: - # kwargs = {x: cookie[x] for x in cookie if x not in ('name', 'value')} - # self._session.cookies.set(cookie['name'], cookie['value'], **kwargs) + for cookie in data['cookies']: + kwargs = {x: cookie[x] for x in cookie if x not in ('name', 'value')} + self._session.cookies.set(cookie['name'], cookie['value'], **kwargs) + elif isinstance(data['cookies'], RequestsCookieJar): for cookie in data['cookies']: self._session.cookies.set_cookie(cookie) @@ -212,11 +212,7 @@ class Drission(object): # 翻译cookies for i in [x for x in session.cookies if domain in x.domain]: - cookie_data = {'name': i.name, 'value': str(i.value), 'path': i.path, 'domain': i.domain} - - if i.expires: - cookie_data['expiry'] = i.expires - + cookie_data = _cookie_to_dict(i) self._ensure_add_cookie(cookie_data, driver=driver) def _ensure_add_cookie(self, cookie, override_domain=None, driver=None) -> None: