You've already forked pruchase_jhw
修改
This commit is contained in:
+12
-15
@@ -6,12 +6,12 @@ from pathlib import Path
|
||||
from typing import Dict, Any
|
||||
|
||||
import redis.asyncio as aioredis
|
||||
from playwright.async_api import Playwright, BrowserContext, Page
|
||||
from playwright.async_api import BrowserContext, Page
|
||||
from loguru import logger
|
||||
|
||||
from src.config.settings import get_settings
|
||||
from src.config.accounts import get_account_config, AccountConfig
|
||||
from src.browser.manager import BrowserManager
|
||||
from src.browser.manager import get_browser_manager
|
||||
from src.notifications.service import NotificationService
|
||||
from src.utils.video_recorder import TaskVideoRecorder
|
||||
|
||||
@@ -30,7 +30,7 @@ class BasePurchaseTask(ABC):
|
||||
def __init__(self, message_data: Dict[str, Any]) -> None:
|
||||
self.message = message_data
|
||||
self.settings = get_settings()
|
||||
self.browser_manager = BrowserManager()
|
||||
self.browser_manager = get_browser_manager()
|
||||
self.notification_service = NotificationService(self.settings)
|
||||
|
||||
# 从消息中提取的任务参数
|
||||
@@ -39,8 +39,7 @@ class BasePurchaseTask(ABC):
|
||||
self.account_id: str = message_data.get("purchase_account", "")
|
||||
self.site_id: str = message_data.get("site_id", "unknown")
|
||||
|
||||
# 需在结束时清理的 Playwright 对象
|
||||
self.playwright_driver: Playwright | None = None
|
||||
# 浏览器上下文由进程级 BrowserManager 常驻持有,任务只负责自己的 Page
|
||||
self.context: BrowserContext | None = None
|
||||
self.page: Page | None = None
|
||||
self.video_recorder: TaskVideoRecorder | None = None
|
||||
@@ -87,8 +86,8 @@ class BasePurchaseTask(ABC):
|
||||
f"{self.video_output_path.name} | 路径: {self.video_output_path.absolute()}"
|
||||
)
|
||||
|
||||
# 通过 BrowserManager 启动浏览器
|
||||
self.playwright_driver, self.context = await self.browser_manager.get_context(account_config)
|
||||
# 从进程级浏览器池获取该账号的常驻上下文(已预热则即取即用)
|
||||
self.context = await self.browser_manager.get_context(account_config)
|
||||
|
||||
# 打开新标签页
|
||||
self.page = await self.context.new_page()
|
||||
@@ -120,16 +119,14 @@ class BasePurchaseTask(ABC):
|
||||
# 正常结束或未被 except 拦截的其他情况(如主动 Cancel),确保停止录屏
|
||||
await self._stop_video_record_safely()
|
||||
|
||||
# 无论成败都回收 Playwright 后台进程
|
||||
logger.debug(f"[任务 {self.task_id}] 正在清理浏览器上下文并停止驱动...")
|
||||
# 浏览器上下文常驻复用,任务只关闭自己打开的标签页
|
||||
logger.debug(f"[任务 {self.task_id}] 正在关闭任务标签页(浏览器保持常驻)...")
|
||||
try:
|
||||
if self.context:
|
||||
await self.context.close()
|
||||
if self.playwright_driver:
|
||||
await self.playwright_driver.stop()
|
||||
logger.debug(f"[任务 {self.task_id}] 浏览器资源已安全释放。")
|
||||
if self.page and not self.page.is_closed():
|
||||
await self.page.close()
|
||||
logger.debug(f"[任务 {self.task_id}] 任务标签页已关闭。")
|
||||
except Exception as close_err:
|
||||
logger.error(f"[任务 {self.task_id}] 释放浏览器资源时出错: {close_err}")
|
||||
logger.error(f"[任务 {self.task_id}] 关闭任务标签页时出错: {close_err}")
|
||||
|
||||
# 上报任务结果
|
||||
if self.is_report:
|
||||
|
||||
@@ -14,11 +14,11 @@ from loguru import logger
|
||||
from playwright.async_api import Page
|
||||
from playwright.async_api import TimeoutError as PlaywrightTimeoutError
|
||||
|
||||
from notifications import NotificationEvent
|
||||
from src.notifications import NotificationEvent
|
||||
from src.tasks.base import BasePurchaseTask
|
||||
from src.config.accounts import get_account_config
|
||||
from src.utils.page_utils import format_japanese_price
|
||||
from task_queue.redis_manager import get_redis_client
|
||||
from src.task_queue.redis_manager import get_redis_client
|
||||
from surugaya_common.models import SurugayaOrderDetail
|
||||
from surugaya_common.parsers.surugaya.order_detail import SurugayaOrderDetailParser
|
||||
from surugaya_common.browser_utils import human_scroll
|
||||
|
||||
@@ -6,7 +6,7 @@ from loguru import logger
|
||||
|
||||
from surugaya_common.parsers.surugaya import SurugayaOrderDetailParser
|
||||
from src.tasks.base import BasePurchaseTask
|
||||
from task_queue.redis_manager import get_redis_client
|
||||
from src.task_queue.redis_manager import get_redis_client
|
||||
|
||||
|
||||
class SurugayaTradeMonitorTask(BasePurchaseTask):
|
||||
|
||||
Reference in New Issue
Block a user