browser_utils.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. from DrissionPage import ChromiumOptions, Chromium
  2. import sys
  3. import os
  4. import logging
  5. from dotenv import load_dotenv
  6. load_dotenv()
  7. class BrowserManager:
  8. def __init__(self):
  9. self.browser = None
  10. def init_browser(self):
  11. """初始化浏览器"""
  12. co = self._get_browser_options()
  13. self.browser = Chromium(co)
  14. return self.browser
  15. def _get_browser_options(self):
  16. """获取浏览器配置"""
  17. co = ChromiumOptions()
  18. try:
  19. extension_path = self._get_extension_path()
  20. co.add_extension(extension_path)
  21. except FileNotFoundError as e:
  22. logging.warning(f"警告: {e}")
  23. co.set_user_agent(
  24. os.getenv('BROWSER_USER_AGENT', "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.6723.92 Safari/537.36")
  25. )
  26. co.set_pref("credentials_enable_service", False)
  27. co.set_argument("--hide-crash-restore-bubble")
  28. proxy = os.getenv('BROWSER_PROXY')
  29. if proxy:
  30. co.set_proxy(proxy)
  31. co.auto_port()
  32. co.headless(os.getenv('BROWSER_HEADLESS', 'True').lower() == 'true') # 生产环境使用无头模式
  33. # Mac 系统特殊处理
  34. if sys.platform == "darwin":
  35. co.set_argument("--no-sandbox")
  36. co.set_argument("--disable-gpu")
  37. return co
  38. def _get_extension_path(self):
  39. """获取插件路径"""
  40. root_dir = os.getcwd()
  41. extension_path = os.path.join(root_dir, "turnstilePatch")
  42. if hasattr(sys, "_MEIPASS"):
  43. extension_path = os.path.join(sys._MEIPASS, "turnstilePatch")
  44. if not os.path.exists(extension_path):
  45. raise FileNotFoundError(f"插件不存在: {extension_path}")
  46. return extension_path
  47. def quit(self):
  48. """关闭浏览器"""
  49. if self.browser:
  50. try:
  51. self.browser.quit()
  52. except:
  53. pass