From ea02a25c5d3bf83064b18de49bce9f63ed8b3b33 Mon Sep 17 00:00:00 2001 From: g1879 Date: Fri, 24 Mar 2023 17:37:53 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=91=E6=B5=8F=E8=A7=88=E5=99=A8=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0cookie=E6=97=B6=E4=BC=9A=E8=87=AA=E5=8A=A8=E9=87=8D?= =?UTF-8?q?=E8=AF=95=E4=BF=9D=E8=AF=81=E6=B7=BB=E5=8A=A0=E6=88=90=E5=8A=9F?= =?UTF-8?q?=EF=BC=8C=E5=BE=85=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DrissionPage/chromium_base.py | 2 +- DrissionPage/chromium_page.py | 5 ++++- DrissionPage/commons/web.py | 42 ++++++++++++++++++++++++++++------- DrissionPage/commons/web.pyi | 3 +++ 4 files changed, 42 insertions(+), 10 deletions(-) diff --git a/DrissionPage/chromium_base.py b/DrissionPage/chromium_base.py index 3d18ab4..c326e94 100644 --- a/DrissionPage/chromium_base.py +++ b/DrissionPage/chromium_base.py @@ -42,7 +42,7 @@ class ChromiumBase(BasePage): self._set = None self._screencast = None - if address and (isinstance(address, int) or address.isdigit()): + if isinstance(address, int) or (isinstance(address, str) and address.isdigit()): address = f'127.0.0.1:{address}' self._set_start_options(address, None) diff --git a/DrissionPage/chromium_page.py b/DrissionPage/chromium_page.py index ca17a1e..8aabe78 100644 --- a/DrissionPage/chromium_page.py +++ b/DrissionPage/chromium_page.py @@ -109,7 +109,10 @@ class ChromiumPage(ChromiumBase): pass self._process_id = None - for i in self.browser_driver.SystemInfo.getProcessInfo()['processInfo']: + r = self.browser_driver.SystemInfo.getProcessInfo() + if 'processInfo' not in r: + return None + for i in r['processInfo']: if i['type'] == 'browser': self._process_id = i['id'] break diff --git a/DrissionPage/commons/web.py b/DrissionPage/commons/web.py index 6c3dc42..75e35b0 100644 --- a/DrissionPage/commons/web.py +++ b/DrissionPage/commons/web.py @@ -253,15 +253,41 @@ def set_browser_cookies(page, cookies): cookie.pop('expiry') if 'expires' in cookie: cookie['expires'] = int(cookie['expires']) - - if not cookie.get('domain', None): - ex_url = extract(page._browser_url) - cookie['domain'] = f'{ex_url.domain}.{ex_url.suffix}' if ex_url.suffix else ex_url.domain - if cookie['value'] is None: cookie['value'] = '' - try: + if cookie.get('domain', None): + try: + page.run_cdp_loaded('Network.setCookie', **cookie) + continue + except Exception: + pass + + ex_url = extract(page._browser_url) + d_list = ex_url.subdomain.split('.') + d_list.append(f'{ex_url.domain}.{ex_url.suffix}' if ex_url.suffix else ex_url.domain) + + for i in range(len(d_list)): + d = f'.{".".join(d_list[i:])}' + cookie['domain'] = d page.run_cdp_loaded('Network.setCookie', **cookie) - except Exception: - pass + if is_cookie_in_driver(page, cookie): + continue + + d = f'{".".join(d_list[i:])}' + cookie['domain'] = d + page.run_cdp_loaded('Network.setCookie', **cookie) + if is_cookie_in_driver(page, cookie): + continue + + +def is_cookie_in_driver(page, cookie): + """查询cookie是否在浏览器内 + :param page: BasePage对象 + :param cookie: dict格式cookie + :return: bool + """ + for c in page.get_cookies(): + if cookie['name'] == c['name'] and cookie['value'] == c['value']: + return True + return False diff --git a/DrissionPage/commons/web.pyi b/DrissionPage/commons/web.pyi index e661b30..b91ba71 100644 --- a/DrissionPage/commons/web.pyi +++ b/DrissionPage/commons/web.pyi @@ -42,3 +42,6 @@ def set_session_cookies(session: Session, cookies: Union[RequestsCookieJar, list def set_browser_cookies(page: ChromiumBase, cookies: Union[RequestsCookieJar, list, tuple, str, dict]) -> None: ... + + +def is_cookie_in_driver(page: ChromiumBase, cookie: dict) -> bool: ...