初始手动版本 可用
This commit is contained in:
124
browser_utils.py
124
browser_utils.py
@@ -100,39 +100,25 @@ class BrowserManager:
|
||||
background_file.write(background_js)
|
||||
return plugin_folder
|
||||
|
||||
def get_proxy(self, use_api=False, mode=False, proxy_choice=None, custom_api=None):
|
||||
def get_proxy(self, use_api=False, mode=False):
|
||||
"""
|
||||
获取代理配置
|
||||
Args:
|
||||
use_api: 是否使用API获取代理
|
||||
mode: 如果开启 返回格式要改变成 host port username password
|
||||
proxy_choice: 代理选择 (1=本地代理, 2=全局代理)
|
||||
custom_api: 自定义代理API地址
|
||||
Returns:
|
||||
str 或 tuple: 代理URL或(host, port, username, password)元组
|
||||
"""
|
||||
logging.info(f"获取代理配置, use_api={use_api}, mode={mode}, proxy_choice={proxy_choice}")
|
||||
logging.info(f"获取代理配置, use_api={use_api}, mode={mode}")
|
||||
if use_api:
|
||||
try:
|
||||
# 从API获取代理
|
||||
import requests
|
||||
logging.info("正在从API获取代理...")
|
||||
response = requests.get("https://cursorapi.nosqli.com/admin/api.proxyinfo/getproxyarmybendi")
|
||||
#response = requests.get("https://cursorapi.nosqli.com/admin/api.GlobalProxyip/get_proxy")
|
||||
|
||||
|
||||
# 根据选择使用不同的API
|
||||
if custom_api:
|
||||
api_url = custom_api
|
||||
logging.info(f"使用自定义API: {api_url}")
|
||||
elif proxy_choice == 1:
|
||||
api_url = "https://cursorapi.nosqli.com/admin/api.proxyinfo/getproxyarmybendi"
|
||||
logging.info("使用本地代理API")
|
||||
elif proxy_choice == 2 or proxy_choice is None: # 如果未指定或选择全局代理
|
||||
api_url = "https://cursorapi.nosqli.com/admin/api.GlobalProxyip/get_proxy"
|
||||
logging.info("使用全局代理API")
|
||||
else:
|
||||
logging.warning(f"未知的代理选择: {proxy_choice},使用cn代理")
|
||||
api_url = "https://cursorapi.nosqli.com/admin/api.proxyinfo/getproxyarmybendi"
|
||||
|
||||
response = requests.get(api_url)
|
||||
logging.info(f"API响应状态码: {response.status_code}")
|
||||
|
||||
if response.status_code == 200:
|
||||
@@ -145,13 +131,12 @@ class BrowserManager:
|
||||
proxy_port = proxy_info.get("port")
|
||||
proxy_username = proxy_info.get("username", "")
|
||||
proxy_password = proxy_info.get("password", "")
|
||||
proxy_data = proxy_info.get("proxy_data", "")
|
||||
logging.info(f"解析到代理信息 - host:{proxy_host}, port:{proxy_port}")
|
||||
|
||||
if proxy_host and proxy_port:
|
||||
if mode:
|
||||
logging.info(f"使用API代理(mode=True): 返回元组格式")
|
||||
return proxy_host, proxy_port, proxy_username, proxy_password, proxy_data
|
||||
return proxy_host, proxy_port, proxy_username, proxy_password
|
||||
else:
|
||||
proxy_url = f"http://{proxy_host}:{proxy_port}"
|
||||
logging.info(f"使用API代理: {proxy_url}")
|
||||
@@ -165,9 +150,8 @@ class BrowserManager:
|
||||
proxy_port = os.getenv("PROXY_PORT", PROXY_PORT)
|
||||
proxy_username = os.getenv("PROXY_USERNAME", PROXY_USERNAME )
|
||||
proxy_password = os.getenv("PROXY_PASSWORD", PROXY_PASSWORD)
|
||||
proxy_data = os.getenv("PROXY_DATA", "")
|
||||
logging.info(f"使用默认代理信息(mode=True): host={proxy_host}, port={proxy_port}")
|
||||
return proxy_host, proxy_port, proxy_username, proxy_password, proxy_data
|
||||
return proxy_host, proxy_port, proxy_username, proxy_password
|
||||
else:
|
||||
default_proxy = os.getenv("BROWSER_PROXY", PROXY_URL)
|
||||
logging.info(f"使用默认代理: {default_proxy}")
|
||||
@@ -181,9 +165,8 @@ class BrowserManager:
|
||||
proxy_port = os.getenv("PROXY_PORT", PROXY_PORT)
|
||||
proxy_username = os.getenv("PROXY_USERNAME", PROXY_USERNAME)
|
||||
proxy_password = os.getenv("PROXY_PASSWORD", PROXY_PASSWORD)
|
||||
proxy_data = os.getenv("PROXY_DATA", "")
|
||||
logging.info(f"异常情况下使用默认代理信息(mode=True)")
|
||||
return proxy_host, proxy_port, proxy_username, proxy_password, proxy_data
|
||||
return proxy_host, proxy_port, proxy_username, proxy_password
|
||||
else:
|
||||
default_proxy = os.getenv("BROWSER_PROXY", PROXY_URL)
|
||||
logging.info(f"使用默认代理: {default_proxy}")
|
||||
@@ -195,81 +178,38 @@ class BrowserManager:
|
||||
proxy_port = os.getenv("PROXY_PORT", PROXY_PORT)
|
||||
proxy_username = os.getenv("PROXY_USERNAME", PROXY_USERNAME)
|
||||
proxy_password = os.getenv("PROXY_PASSWORD", PROXY_PASSWORD)
|
||||
proxy_data = os.getenv("PROXY_DATA", "")
|
||||
logging.info(f"不使用API,返回默认代理信息(mode=True)")
|
||||
return proxy_host, proxy_port, proxy_username, proxy_password, proxy_data
|
||||
return proxy_host, proxy_port, proxy_username, proxy_password
|
||||
else:
|
||||
default_proxy = os.getenv("BROWSER_PROXY", PROXY_URL)
|
||||
logging.info(f"不使用API,直接返回默认代理: {default_proxy}")
|
||||
return default_proxy
|
||||
|
||||
def get_plugin_folder(self):
|
||||
"""获取代理插件文件夹路径"""
|
||||
# 使用当前目录下的kdl_Chromium_Proxy文件夹
|
||||
current_directory = os.path.dirname(os.path.abspath(__file__))
|
||||
plugin_folder = os.path.join(current_directory, 'kdl_Chromium_Proxy')
|
||||
|
||||
# 确保文件夹存在
|
||||
if not os.path.exists(plugin_folder):
|
||||
os.makedirs(plugin_folder)
|
||||
def init_browser(self, user_agent=None):
|
||||
"""
|
||||
初始化浏览器
|
||||
Args:
|
||||
user_agent: 用户代理字符串
|
||||
Returns:
|
||||
tuple: (browser实例, 代理信息元组(host, port, username, password))
|
||||
"""
|
||||
logging.info("正在初始化浏览器...")
|
||||
|
||||
logging.info(f"代理插件文件夹路径: {plugin_folder}")
|
||||
return plugin_folder
|
||||
|
||||
def init_browser(self, user_agent=None, proxy_choice=None, custom_api=None):
|
||||
"""
|
||||
初始化浏览器实例
|
||||
Args:
|
||||
user_agent: 自定义User-Agent
|
||||
proxy_choice: 代理选择 (1=本地代理, 2=全局代理)
|
||||
custom_api: 自定义代理API地址
|
||||
Returns:
|
||||
tuple: (browser实例, 代理信息元组)
|
||||
"""
|
||||
try:
|
||||
# 获取代理配置
|
||||
proxy_info = self.get_proxy(use_api=True, mode=True, proxy_choice=proxy_choice, custom_api=custom_api)
|
||||
proxy_host, proxy_port, proxy_username, proxy_password, proxy_data = proxy_info
|
||||
co = self._get_browser_options(user_agent)
|
||||
|
||||
# 创建代理认证插件
|
||||
plugin_folder = self.create_proxyauth_extension(
|
||||
proxy_host=proxy_host,
|
||||
proxy_port=proxy_port,
|
||||
proxy_username=proxy_username,
|
||||
proxy_password=proxy_password
|
||||
)
|
||||
|
||||
# 设置浏览器选项
|
||||
co = ChromiumOptions()
|
||||
co.set_argument("--hide-crash-restore-bubble")
|
||||
co.set_pref("credentials_enable_service", False)
|
||||
|
||||
# 添加代理插件
|
||||
co.add_extension(plugin_folder)
|
||||
|
||||
# 设置用户代理
|
||||
if user_agent:
|
||||
co.set_user_agent(user_agent)
|
||||
|
||||
# 设置无头模式
|
||||
co.headless(True)
|
||||
|
||||
# Mac系统特殊处理
|
||||
if sys.platform == "darwin":
|
||||
co.set_argument("--no-sandbox")
|
||||
co.set_argument("--disable-gpu")
|
||||
|
||||
# 创建浏览器实例
|
||||
browser = Chromium(co)
|
||||
self.browser = browser
|
||||
self.current_proxy_info = proxy_info
|
||||
|
||||
logging.info("浏览器实例创建成功")
|
||||
return browser, proxy_info
|
||||
|
||||
except Exception as e:
|
||||
logging.error(f"初始化浏览器失败: {str(e)}")
|
||||
raise
|
||||
logging.info("正在启动临时浏览器...")
|
||||
try:
|
||||
browser = Chromium(co)
|
||||
self.browser = browser
|
||||
logging.info("浏览器初始化成功")
|
||||
# 返回浏览器实例和代理信息
|
||||
return browser, self.current_proxy_info
|
||||
except Exception as e:
|
||||
logging.error(f"浏览器初始化失败: {str(e)}")
|
||||
if "DevToolsActivePort file doesn't exist" in str(e):
|
||||
logging.error("可能是Chrome实例未正确关闭,请检查进程")
|
||||
raise
|
||||
|
||||
|
||||
def _get_browser_options(self, user_agent=None):
|
||||
"""获取浏览器配置"""
|
||||
|
||||
Reference in New Issue
Block a user