From 62cff74064a2e930d69b6bf70fecae203a88a01f Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Sat, 4 Jun 2022 18:15:35 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B5=8F=E8=A7=88=E5=99=A8=E7=AE=80=E5=8D=95?= =?UTF-8?q?=E6=8A=BD=E8=B1=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- browser/IDriver.py | 2 ++ browser/__init__.py | 3 +++ browser/chrome.py | 59 ++++++++++++++++++++++++++++++++++++++++++++ browser/edge.py | 59 ++++++++++++++++++++++++++++++++++++++++++++ scripts/webdriver.py | 49 ------------------------------------ 5 files changed, 123 insertions(+), 49 deletions(-) create mode 100644 browser/IDriver.py create mode 100644 browser/__init__.py create mode 100644 browser/chrome.py create mode 100644 browser/edge.py delete mode 100644 scripts/webdriver.py diff --git a/browser/IDriver.py b/browser/IDriver.py new file mode 100644 index 0000000..e18d6ed --- /dev/null +++ b/browser/IDriver.py @@ -0,0 +1,2 @@ +class IDriver(): + ... \ No newline at end of file diff --git a/browser/__init__.py b/browser/__init__.py new file mode 100644 index 0000000..b8e985e --- /dev/null +++ b/browser/__init__.py @@ -0,0 +1,3 @@ +from browser.edge import EdgeDriver + +driver = EdgeDriver() \ No newline at end of file diff --git a/browser/chrome.py b/browser/chrome.py new file mode 100644 index 0000000..5dda8d2 --- /dev/null +++ b/browser/chrome.py @@ -0,0 +1,59 @@ +from selenium import webdriver +from selenium.webdriver import Proxy, DesiredCapabilities +from selenium.webdriver.common.proxy import ProxyType + +from config.helper import config +from browser.IDriver import IDriver +from selenium.webdriver.chrome.options import Options + + +class ChromeDriver(IDriver): + def __init__(self): + super(ChromeDriver, self).__init__() + options = Options() + if config()['webdriver']['headless']: + options.add_argument("--headless") + options.add_argument('--proxy-server=%s:%s' % (config()['mitm']['host'], config()['mitm']['port'])) + options.add_argument('-ignore-certificate-errors') + options.add_argument('-ignore -ssl-errors') + options.add_argument('--incognito') + proxy = Proxy() + proxy.proxy_type = ProxyType.MANUAL + proxy.http_proxy = "%s:%s" % (config()['mitm']['host'], config()['mitm']['port']) + proxy.ssl_proxy = "%s:%s" % (config()['mitm']['host'], config()['mitm']['port']) + capabilities = DesiredCapabilities.EDGE + proxy.add_to_capabilities(capabilities) + + self.browser = webdriver.Chrome(options=options, + desired_capabilities=capabilities, + executable_path=config()['webdriver']['chrome']['bin'] + ) + + def new_tab(self) -> str: + current_window_handles = self.browser.window_handles + self.browser.execute_script("window.open('')") + new_window_handles = self.browser.window_handles + for _handle in new_window_handles: + if _handle not in current_window_handles: + return _handle + return "" + + def change_tab(self, tab_handler: str): + if tab_handler not in self.browser.window_handles: + return + if tab_handler == self.browser.current_window_handle: + return + self.browser.switch_to_window(tab_handler) + + def open_url(self, url: str, tab_handler: str = ""): + if tab_handler != "": + self.change_tab(tab_handler) + self.browser.get(url) + + def screenshot(self, tab_handler: str = "") -> str: + cur_handle = self.browser.current_window_handle + if tab_handler != "": + self.change_tab(tab_handler) + b64 = self.browser.get_screenshot_as_base64() + self.change_tab(cur_handle) + return b64 diff --git a/browser/edge.py b/browser/edge.py new file mode 100644 index 0000000..1011839 --- /dev/null +++ b/browser/edge.py @@ -0,0 +1,59 @@ +from selenium import webdriver +from selenium.webdriver import Proxy, DesiredCapabilities +from selenium.webdriver.common.proxy import ProxyType + +from config.helper import config +from browser.IDriver import IDriver +from selenium.webdriver.edge.options import Options + + +class EdgeDriver(IDriver): + def __init__(self): + super(EdgeDriver, self).__init__() + options = Options() + if config()['webdriver']['headless']: + options.add_argument("--headless") + options.add_argument('--proxy-server=%s:%s' % (config()['mitm']['host'], config()['mitm']['port'])) + options.add_argument('-ignore-certificate-errors') + options.add_argument('-ignore -ssl-errors') + options.add_argument('--incognito') + proxy = Proxy() + proxy.proxy_type = ProxyType.MANUAL + proxy.http_proxy = "%s:%s" % (config()['mitm']['host'], config()['mitm']['port']) + proxy.ssl_proxy = "%s:%s" % (config()['mitm']['host'], config()['mitm']['port']) + capabilities = DesiredCapabilities.EDGE + proxy.add_to_capabilities(capabilities) + + self.browser = webdriver.Chrome(options=options, + desired_capabilities=capabilities, + executable_path=config()['webdriver']['edge']['bin'] + ) + + def new_tab(self) -> str: + current_window_handles = self.browser.window_handles + self.browser.execute_script("window.open('')") + new_window_handles = self.browser.window_handles + for _handle in new_window_handles: + if _handle not in current_window_handles: + return _handle + return "" + + def change_tab(self, tab_handler: str): + if tab_handler not in self.browser.window_handles: + return + if tab_handler == self.browser.current_window_handle: + return + self.browser.switch_to_window(tab_handler) + + def open_url(self, url: str, tab_handler: str = ""): + if tab_handler != "": + self.change_tab(tab_handler) + self.browser.get(url) + + def screenshot(self, tab_handler: str = "") -> str: + cur_handle = self.browser.current_window_handle + if tab_handler != "": + self.change_tab(tab_handler) + b64 = self.browser.get_screenshot_as_base64() + self.change_tab(cur_handle) + return b64 diff --git a/scripts/webdriver.py b/scripts/webdriver.py deleted file mode 100644 index 3db669a..0000000 --- a/scripts/webdriver.py +++ /dev/null @@ -1,49 +0,0 @@ -import requests -import json - -from selenium import webdriver -from selenium.webdriver.edge.options import Options -from selenium.webdriver.common.desired_capabilities import DesiredCapabilities -from selenium.webdriver.common.proxy import Proxy, ProxyType -from selenium.webdriver.common.by import By -from selenium.webdriver.support.ui import WebDriverWait -from selenium.webdriver.support.expected_conditions import presence_of_element_located - -from config.helper import config - -def go(url): - chrome_options = Options() - chrome_options.add_argument('--proxy-server=%s:%s' % (config()['mitm']['host'], config()['mitm']['port'])) - - # 2022-04-09 添加一个忽略证书 - chrome_options.add_argument('-ignore-certificate-errors') - chrome_options.add_argument('-ignore -ssl-errors') - chrome_options.add_argument('--incognito') - - proxy = Proxy() - proxy.proxy_type = ProxyType.MANUAL - proxy.http_proxy = "%s:%s" % (config()['mitm']['host'], config()['mitm']['port']) - proxy.ssl_proxy = "%s:%s" % (config()['mitm']['host'], config()['mitm']['port']) - - capabilities = DesiredCapabilities.EDGE - proxy.add_to_capabilities(capabilities) - - with webdriver.Chrome(options=chrome_options, - desired_capabilities=capabilities, - executable_path=config()['webdriver']['bin'] - ) as driver: - wait = WebDriverWait(driver, 10) - - driver.implicitly_wait(24 * 60 * 60) - - driver.get(url) - - first_result = wait.until(presence_of_element_located((By.ID, "RENDER_DATA"))) - json_str = requests.utils.unquote(first_result.get_attribute("textContent")) - json_obj = json.loads(json_str) - - roomInfo = json_obj['initialState']['roomStore']['roomInfo'] - print(roomInfo) - - wait.until(presence_of_element_located((By.CLASS_NAME, "oSu9Aw19"))) - \ No newline at end of file