mirror of
https://gitee.com/g1879/DrissionPage.git
synced 2024-12-10 04:00:23 +08:00
继续修改cookies功能,未完成
This commit is contained in:
parent
237ed9607e
commit
bfd967edf0
@ -727,12 +727,16 @@ def _session_options_to_dict(options: Union[dict, SessionOptions, None]) -> Unio
|
|||||||
|
|
||||||
def _cookie_to_dict(cookie: Cookie) -> dict:
|
def _cookie_to_dict(cookie: Cookie) -> dict:
|
||||||
"""把Cookie对象转为dict格式"""
|
"""把Cookie对象转为dict格式"""
|
||||||
|
# print(cookie)
|
||||||
if isinstance(cookie, Cookie):
|
if isinstance(cookie, Cookie):
|
||||||
# return cookie.__dict__
|
cookie_dict = cookie.__dict__.copy()
|
||||||
cookie_dict = {'name': cookie.name, 'value': str(cookie.value), 'path': cookie.path, 'domain': cookie.domain}
|
cookie_dict.pop('rfc2109')
|
||||||
|
cookie_dict.pop('_rest')
|
||||||
if cookie.expires:
|
return cookie_dict
|
||||||
cookie_dict['expiry'] = cookie.expires
|
# cookie_dict = {'name': cookie.name, 'value': str(cookie.value), 'path': cookie.path, 'domain': cookie.domain}
|
||||||
|
#
|
||||||
|
# if cookie.expires:
|
||||||
|
# cookie_dict['expiry'] = cookie.expires
|
||||||
|
|
||||||
elif isinstance(cookie, dict):
|
elif isinstance(cookie, dict):
|
||||||
return cookie
|
return cookie
|
||||||
|
@ -6,12 +6,11 @@
|
|||||||
"""
|
"""
|
||||||
from sys import exit
|
from sys import exit
|
||||||
from typing import Union
|
from typing import Union
|
||||||
from urllib.parse import urlparse
|
|
||||||
|
|
||||||
from requests import Session
|
from requests import Session
|
||||||
from requests.cookies import RequestsCookieJar
|
from requests.cookies import RequestsCookieJar
|
||||||
from selenium import webdriver
|
from selenium import webdriver
|
||||||
from selenium.common.exceptions import WebDriverException, SessionNotCreatedException
|
from selenium.common.exceptions import SessionNotCreatedException, UnableToSetCookieException # , WebDriverException
|
||||||
from selenium.webdriver.chrome.options import Options
|
from selenium.webdriver.chrome.options import Options
|
||||||
from selenium.webdriver.chrome.webdriver import WebDriver
|
from selenium.webdriver.chrome.webdriver import WebDriver
|
||||||
from tldextract import extract
|
from tldextract import extract
|
||||||
@ -20,6 +19,9 @@ from .config import (_dict_to_chrome_options, _session_options_to_dict,
|
|||||||
SessionOptions, DriverOptions, _chrome_options_to_dict, OptionsManager, _cookie_to_dict)
|
SessionOptions, DriverOptions, _chrome_options_to_dict, OptionsManager, _cookie_to_dict)
|
||||||
|
|
||||||
|
|
||||||
|
# from urllib.parse import urlparse
|
||||||
|
|
||||||
|
|
||||||
class Drission(object):
|
class Drission(object):
|
||||||
"""Drission类用于管理WebDriver对象和Session对象,是驱动器的角色"""
|
"""Drission类用于管理WebDriver对象和Session对象,是驱动器的角色"""
|
||||||
|
|
||||||
@ -153,12 +155,19 @@ class Drission(object):
|
|||||||
self._driver.get(url)
|
self._driver.get(url)
|
||||||
|
|
||||||
for cookie in cookies:
|
for cookie in cookies:
|
||||||
self._ensure_add_cookie(cookie)
|
# self._ensure_add_cookie(cookie)
|
||||||
|
self.set_cookies(cookie, set_driver=True)
|
||||||
|
|
||||||
def set_cookies(self,
|
def set_cookies(self,
|
||||||
cookies: Union[RequestsCookieJar, list, tuple, str],
|
cookies: Union[RequestsCookieJar, list, tuple, str],
|
||||||
set_session: bool = False,
|
set_session: bool = False,
|
||||||
set_driver: bool = False) -> None:
|
set_driver: bool = False) -> None:
|
||||||
|
"""
|
||||||
|
:param cookies:
|
||||||
|
:param set_session:
|
||||||
|
:param set_driver:
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
if isinstance(cookies, (list, tuple, RequestsCookieJar)):
|
if isinstance(cookies, (list, tuple, RequestsCookieJar)):
|
||||||
cookies = tuple(_cookie_to_dict(cookie) for cookie in cookies)
|
cookies = tuple(_cookie_to_dict(cookie) for cookie in cookies)
|
||||||
elif isinstance(cookies, str):
|
elif isinstance(cookies, str):
|
||||||
@ -169,12 +178,34 @@ class Drission(object):
|
|||||||
raise TypeError
|
raise TypeError
|
||||||
|
|
||||||
for cookie in cookies:
|
for cookie in cookies:
|
||||||
|
if cookie['value'] is None:
|
||||||
|
cookie['value'] = ''
|
||||||
|
|
||||||
if set_session:
|
if set_session:
|
||||||
kwargs = {x: cookie[x] for x in cookie if x not in ('name', 'value')}
|
kwargs = {x: cookie[x] for x in cookie if x not in ('name', 'value', 'httpOnly', 'expiry')}
|
||||||
|
|
||||||
|
if 'expiry' in cookie:
|
||||||
|
kwargs['expires'] = cookie['expiry']
|
||||||
|
|
||||||
self.session.cookies.set(cookie['name'], cookie['value'], **kwargs)
|
self.session.cookies.set(cookie['name'], cookie['value'], **kwargs)
|
||||||
|
|
||||||
if set_driver:
|
if set_driver:
|
||||||
self.driver.add_cookie(cookie)
|
|
||||||
|
try:
|
||||||
|
self.driver.add_cookie(cookie)
|
||||||
|
|
||||||
|
except UnableToSetCookieException:
|
||||||
|
cookie_domain = cookie['domain'] if cookie['domain'][0] != '.' else cookie['domain'][1:]
|
||||||
|
|
||||||
|
try:
|
||||||
|
browser_domain = extract(self.driver.current_url).fqdn
|
||||||
|
except AttributeError:
|
||||||
|
browser_domain = ''
|
||||||
|
|
||||||
|
if cookie_domain not in browser_domain:
|
||||||
|
self.driver.get(f'http://{cookie_domain.lstrip("http://")}')
|
||||||
|
|
||||||
|
self.driver.add_cookie(cookie)
|
||||||
|
|
||||||
def add_a_cookie(self,
|
def add_a_cookie(self,
|
||||||
cookie: str,
|
cookie: str,
|
||||||
@ -199,103 +230,108 @@ class Drission(object):
|
|||||||
'cert', 'stream', 'trust_env', 'max_redirects'] # , 'adapters'
|
'cert', 'stream', 'trust_env', 'max_redirects'] # , 'adapters'
|
||||||
|
|
||||||
if 'cookies' in data:
|
if 'cookies' in data:
|
||||||
self.set_cookies(data['cookies'], set_driver=False)
|
self.set_cookies(data['cookies'], set_session=True)
|
||||||
|
|
||||||
for i in attrs:
|
for i in attrs:
|
||||||
if i in data:
|
if i in data:
|
||||||
self._session.__setattr__(i, data[i])
|
self._session.__setattr__(i, data[i])
|
||||||
|
|
||||||
def cookies_to_session(self, copy_user_agent: bool = False,
|
def cookies_to_session(self, copy_user_agent: bool = False) -> None:
|
||||||
driver: WebDriver = None,
|
|
||||||
session: Session = None) -> None:
|
|
||||||
"""把driver对象的cookies复制到session对象 \n
|
"""把driver对象的cookies复制到session对象 \n
|
||||||
:param copy_user_agent: 是否复制ua信息
|
:param copy_user_agent: 是否复制ua信息
|
||||||
:param driver: 来源driver对象
|
|
||||||
:param session: 目标session对象
|
|
||||||
:return: None
|
:return: None
|
||||||
"""
|
"""
|
||||||
driver = driver or self.driver
|
|
||||||
session = session or self.session
|
|
||||||
|
|
||||||
if copy_user_agent:
|
if copy_user_agent:
|
||||||
self.user_agent_to_session(driver, session)
|
self.user_agent_to_session(self.driver, self.session)
|
||||||
|
|
||||||
for cookie in driver.get_cookies():
|
self.set_cookies(self.driver.get_cookies(), set_session=True)
|
||||||
session.cookies.set(cookie['name'], cookie['value'], domain=cookie['domain'])
|
# for cookie in driver.get_cookies():
|
||||||
|
# session.cookies.set(cookie['name'], cookie['value'], domain=cookie['domain'])
|
||||||
|
|
||||||
def cookies_to_driver(self, url: str,
|
def cookies_to_driver(self, url: str) -> None:
|
||||||
driver: WebDriver = None,
|
|
||||||
session: Session = None) -> None:
|
|
||||||
"""把session对象的cookies复制到driver对象 \n
|
"""把session对象的cookies复制到driver对象 \n
|
||||||
:param url: 作用域
|
:param url: 作用域
|
||||||
:param driver: 目标driver对象
|
|
||||||
:param session: 来源session对象
|
|
||||||
:return: None
|
:return: None
|
||||||
"""
|
"""
|
||||||
driver = driver or self.driver
|
url = extract(url)
|
||||||
session = session or self.session
|
domain = f'{url.domain}.{url.suffix}'
|
||||||
domain = urlparse(url).netloc
|
cookies = tuple(x for x in self.session.cookies if domain in x.domain)
|
||||||
|
|
||||||
if not domain:
|
self.set_cookies(cookies, set_driver=True)
|
||||||
raise Exception('Without specifying a domain')
|
|
||||||
|
|
||||||
# 翻译cookies
|
# def cookies_to_driver(self, url: str,
|
||||||
for i in [x for x in session.cookies if domain in x.domain]:
|
# driver: WebDriver = None,
|
||||||
cookie_data = _cookie_to_dict(i)
|
# session: Session = None) -> None:
|
||||||
self._ensure_add_cookie(cookie_data, driver=driver)
|
# """把session对象的cookies复制到driver对象 \n
|
||||||
|
# :param url: 作用域
|
||||||
def _ensure_add_cookie(self, cookie, override_domain=None, driver=None) -> None:
|
# :param driver: 目标driver对象
|
||||||
"""添加cookie到driver \n
|
# :param session: 来源session对象
|
||||||
:param cookie: 要添加的cookie
|
# :return: None
|
||||||
:param override_domain: 覆盖作用域
|
# """
|
||||||
:param driver: 操作的driver对象
|
# driver = driver or self.driver
|
||||||
:return: None
|
# session = session or self.session
|
||||||
"""
|
# domain = urlparse(url).netloc
|
||||||
driver = driver or self.driver
|
#
|
||||||
|
# if not domain:
|
||||||
if override_domain:
|
# raise Exception('Without specifying a domain')
|
||||||
cookie['domain'] = override_domain
|
#
|
||||||
|
# # 翻译cookies
|
||||||
cookie_domain = cookie['domain'] if cookie['domain'][0] != '.' else cookie['domain'][1:]
|
# for i in [x for x in session.cookies if domain in x.domain]:
|
||||||
|
# cookie_data = _cookie_to_dict(i)
|
||||||
try:
|
# self._ensure_add_cookie(cookie_data, driver=driver)
|
||||||
browser_domain = extract(driver.current_url).fqdn
|
#
|
||||||
except AttributeError:
|
# def _ensure_add_cookie(self, cookie, override_domain=None, driver=None) -> None:
|
||||||
browser_domain = ''
|
# """添加cookie到driver \n
|
||||||
|
# :param cookie: 要添加的cookie
|
||||||
if cookie_domain not in browser_domain:
|
# :param override_domain: 覆盖作用域
|
||||||
driver.get(f'http://{cookie_domain.lstrip("http://")}')
|
# :param driver: 操作的driver对象
|
||||||
|
# :return: None
|
||||||
if 'expiry' in cookie:
|
# """
|
||||||
cookie['expiry'] = int(cookie['expiry'])
|
# driver = driver or self.driver
|
||||||
|
#
|
||||||
driver.add_cookie(cookie)
|
# if override_domain:
|
||||||
|
# cookie['domain'] = override_domain
|
||||||
# 如果添加失败,尝试更宽的域名
|
#
|
||||||
if not self._is_cookie_in_driver(cookie, driver):
|
# cookie_domain = cookie['domain'] if cookie['domain'][0] != '.' else cookie['domain'][1:]
|
||||||
cookie['domain'] = extract(cookie['domain']).registered_domain
|
#
|
||||||
driver.add_cookie(cookie)
|
# try:
|
||||||
|
# browser_domain = extract(driver.current_url).fqdn
|
||||||
if not self._is_cookie_in_driver(cookie):
|
# except AttributeError:
|
||||||
raise WebDriverException(f"Couldn't add the following cookie to the webdriver\n{cookie}\n")
|
# browser_domain = ''
|
||||||
|
#
|
||||||
def _is_cookie_in_driver(self, cookie, driver=None) -> bool:
|
# if cookie_domain not in browser_domain:
|
||||||
"""检查cookie是否已经在driver里 \n
|
# driver.get(f'http://{cookie_domain.lstrip("http://")}')
|
||||||
只检查name、value、domain,检查domain时比较宽 \n
|
#
|
||||||
:param cookie: 要检查的cookie
|
# if 'expiry' in cookie:
|
||||||
:param driver: 被检查的driver
|
# cookie['expiry'] = int(cookie['expiry'])
|
||||||
:return: 返回布尔值
|
#
|
||||||
"""
|
# driver.add_cookie(cookie)
|
||||||
driver = driver or self.driver
|
#
|
||||||
for driver_cookie in driver.get_cookies():
|
# # 如果添加失败,尝试更宽的域名
|
||||||
|
# if not self._is_cookie_in_driver(cookie, driver):
|
||||||
if (cookie['name'] == driver_cookie['name'] and
|
# cookie['domain'] = extract(cookie['domain']).registered_domain
|
||||||
cookie['value'] == driver_cookie['value'] and
|
# driver.add_cookie(cookie)
|
||||||
(cookie['domain'] == driver_cookie['domain'] or
|
#
|
||||||
f'.{cookie["domain"]}' == driver_cookie['domain'])):
|
# if not self._is_cookie_in_driver(cookie):
|
||||||
return True
|
# raise WebDriverException(f"Couldn't add the following cookie to the webdriver\n{cookie}\n")
|
||||||
|
#
|
||||||
return False
|
# def _is_cookie_in_driver(self, cookie, driver=None) -> bool:
|
||||||
|
# """检查cookie是否已经在driver里 \n
|
||||||
|
# 只检查name、value、domain,检查domain时比较宽 \n
|
||||||
|
# :param cookie: 要检查的cookie
|
||||||
|
# :param driver: 被检查的driver
|
||||||
|
# :return: 返回布尔值
|
||||||
|
# """
|
||||||
|
# driver = driver or self.driver
|
||||||
|
# for driver_cookie in driver.get_cookies():
|
||||||
|
#
|
||||||
|
# if (cookie['name'] == driver_cookie['name'] and
|
||||||
|
# cookie['value'] == driver_cookie['value'] and
|
||||||
|
# (cookie['domain'] == driver_cookie['domain'] or
|
||||||
|
# f'.{cookie["domain"]}' == driver_cookie['domain'])):
|
||||||
|
# return True
|
||||||
|
#
|
||||||
|
# return False
|
||||||
|
|
||||||
def user_agent_to_session(self, driver: WebDriver = None, session: Session = None) -> None:
|
def user_agent_to_session(self, driver: WebDriver = None, session: Session = None) -> None:
|
||||||
"""把driver的user-agent复制到session \n
|
"""把driver的user-agent复制到session \n
|
||||||
|
Loading…
x
Reference in New Issue
Block a user