You've already forked pruchase_jhw
新闻
This commit is contained in:
@@ -5,11 +5,13 @@ from loguru import logger
|
||||
|
||||
from src.tasks.surugaya import SurugayaPurchaseTask
|
||||
from src.tasks.surugaya_trade_monitor import SurugayaTradeMonitorTask
|
||||
from src.tasks.surugaya_news_monitor import SurugayaNewsMonitorTask
|
||||
|
||||
# topic 到采购任务类的映射注册表
|
||||
TOPIC_TO_TASK_MAP: Dict[str, Type[Any]] = {
|
||||
"surugaya": SurugayaPurchaseTask, # 骏河屋采购任务
|
||||
"surugaya_trade_monitor": SurugayaTradeMonitorTask, # 骏河屋交易订单获取任务
|
||||
"surugaya_news": SurugayaNewsMonitorTask, # 骏河屋通知(お知らせ)抓取任务
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
import asyncio
|
||||
|
||||
from loguru import logger
|
||||
|
||||
from src.config.accounts import load_accounts_config
|
||||
from src.config.settings import get_settings
|
||||
from src.task_queue.dispatcher import TaskDispatcher
|
||||
from src.task_queue.task_messages import build_news_monitor_task
|
||||
|
||||
|
||||
class NewsFetchScheduler:
|
||||
"""
|
||||
通知(お知らせ)定时抓取调度器。
|
||||
|
||||
与 Redis 监听器不同,这是纯时间驱动:每隔 news_fetch_interval_seconds,
|
||||
为每个已配置的骏河屋账号派发一条 surugaya_news 任务(启动后立即先跑一轮)。
|
||||
任务经 TaskDispatcher 的同账号串行锁排队,不会与采购/订单任务争抢浏览器。
|
||||
"""
|
||||
|
||||
def __init__(self, dispatcher: TaskDispatcher) -> None:
|
||||
self.settings = get_settings()
|
||||
self.dispatcher = dispatcher
|
||||
self.running = False
|
||||
self.interval_seconds = self.settings.news_fetch_interval_seconds
|
||||
|
||||
async def listen(self) -> None:
|
||||
if not self.settings.news_fetch_enabled:
|
||||
logger.info("通知定时抓取已禁用(NEWS_FETCH_ENABLED=false),跳过。")
|
||||
return
|
||||
|
||||
self.running = True
|
||||
logger.info(
|
||||
f"通知定时抓取调度器已启动,间隔 {self.interval_seconds}s。"
|
||||
)
|
||||
|
||||
while self.running:
|
||||
try:
|
||||
await self._dispatch_round()
|
||||
except Exception as e:
|
||||
logger.exception(f"通知定时抓取调度发生未预期错误: {e}")
|
||||
|
||||
# 可中断的间隔等待:停机时尽快退出循环。
|
||||
for _ in range(self.interval_seconds):
|
||||
if not self.running:
|
||||
break
|
||||
await asyncio.sleep(1)
|
||||
|
||||
async def _dispatch_round(self) -> None:
|
||||
accounts = load_accounts_config().sites.surugaya
|
||||
if not accounts:
|
||||
logger.debug("未配置骏河屋账号,本轮通知抓取跳过。")
|
||||
return
|
||||
|
||||
for account in accounts:
|
||||
message = build_news_monitor_task(account.account_id)
|
||||
logger.debug(
|
||||
f"派发通知抓取任务: account='{account.account_id}', task_id='{message['task_id']}'。"
|
||||
)
|
||||
await self.dispatcher.dispatch(message)
|
||||
|
||||
async def stop(self) -> None:
|
||||
logger.info("正在停止通知定时抓取调度器...")
|
||||
self.running = False
|
||||
@@ -6,6 +6,23 @@ TRADE_MONITOR_ACCOUNT = "trdian023@tokugen.jp"
|
||||
TRADE_MONITOR_SITE_ID = "7"
|
||||
|
||||
|
||||
def build_news_monitor_task(account_id: str) -> Dict[str, Any]:
|
||||
"""
|
||||
构造骏河屋通知抓取任务消息(TaskDispatcher 兼容结构)。
|
||||
|
||||
供通知定时调度器(NewsFetchScheduler)使用:每个配置账号一条任务,
|
||||
与采购/订单任务共用同账号串行锁,避免并发占用同一浏览器上下文。
|
||||
"""
|
||||
return {
|
||||
"task_id": f"news_{int(time.time())}",
|
||||
"topic": "surugaya_news",
|
||||
"purchase_account": account_id,
|
||||
"site_id": TRADE_MONITOR_SITE_ID,
|
||||
"record_video": "",
|
||||
"payload": {},
|
||||
}
|
||||
|
||||
|
||||
def build_trade_monitor_task(trade_code: Any) -> Dict[str, Any]:
|
||||
"""
|
||||
构造骏河屋交易订单获取任务消息(TaskDispatcher 兼容结构)。
|
||||
|
||||
Reference in New Issue
Block a user