feat: GEO/SEO structured data + search ranking tracker
This commit is contained in:
@@ -56,6 +56,7 @@ MODULES = {
|
||||
"scheduled_metrics_sync": {"name": "📊 指标同步", "cron": "06:00"},
|
||||
"scheduled_reset_search_usage": {"name": "🔁 搜索用量重置", "cron": "00:05"},
|
||||
"scheduled_task_monitor": {"name": "⏰ 任务监控", "cron": "*"},
|
||||
"scheduled_rank_tracker": {"name": "🔍 搜索排名追踪", "cron": "07:00"},
|
||||
}
|
||||
|
||||
LOG_FILE_MAP = {
|
||||
@@ -67,6 +68,7 @@ LOG_FILE_MAP = {
|
||||
"scheduled_metrics_sync": "metrics_sync",
|
||||
"scheduled_reset_search_usage": "reset_search_usage",
|
||||
"scheduled_task_monitor": "task_monitor",
|
||||
"scheduled_rank_tracker": "rank_tracker",
|
||||
}
|
||||
|
||||
def _log_to_file(module_id: str, status: str, message: str = None, error_trace: str = None):
|
||||
@@ -182,6 +184,7 @@ class TaskScheduler:
|
||||
("scheduled_optimize_sources", self._run_optimize_sources, "信息源优化"),
|
||||
("scheduled_metrics_sync", self._run_metrics_sync, "指标同步"),
|
||||
("scheduled_reset_search_usage", self._run_reset_search_usage, "搜索用量重置"),
|
||||
("scheduled_rank_tracker", self._run_rank_tracker, "搜索排名追踪"),
|
||||
]
|
||||
|
||||
for module_id, fn, name in MODULE_JOBS:
|
||||
@@ -585,6 +588,40 @@ class TaskScheduler:
|
||||
started_at=started, finished_at=datetime.now(timezone.utc))
|
||||
logger.exception("[TaskMonitor] 监控检查失败: %s", e)
|
||||
|
||||
def _run_rank_tracker(self):
|
||||
"""每日搜索排名追踪(Bing 查询关键词排名)"""
|
||||
started = datetime.now(timezone.utc)
|
||||
log_id = _log_task("scheduled_rank_tracker", "running", started_at=started)
|
||||
try:
|
||||
import subprocess
|
||||
result = subprocess.run(
|
||||
[sys.executable, str(PROJECT_ROOT / "scripts" / "rank_tracker.py"), "--engine", "bing"],
|
||||
capture_output=True, text=True, timeout=300
|
||||
)
|
||||
if result.returncode == 0:
|
||||
try:
|
||||
data = json.loads(result.stdout.strip())
|
||||
except json.JSONDecodeError:
|
||||
data = {}
|
||||
_log_task("scheduled_rank_tracker", "success", log_id=log_id,
|
||||
message=f"追踪完成: {data.get('keywords_checked', 0)} 关键词, "
|
||||
f"{data.get('on_page', 0)} 条有排名",
|
||||
result_data=data,
|
||||
started_at=started, finished_at=datetime.now(timezone.utc))
|
||||
logger.info("[RankTracker] 完成: %s", result.stdout.strip()[:200])
|
||||
else:
|
||||
_log_task("scheduled_rank_tracker", "failed", log_id=log_id,
|
||||
message=f"返回码 {result.returncode}",
|
||||
error_trace=result.stderr[-500:],
|
||||
started_at=started, finished_at=datetime.now(timezone.utc))
|
||||
except Exception as e:
|
||||
import traceback
|
||||
_log_task("scheduled_rank_tracker", "failed", log_id=log_id,
|
||||
message=str(e),
|
||||
error_trace=traceback.format_exc(),
|
||||
started_at=started, finished_at=datetime.now(timezone.utc))
|
||||
logger.exception("[RankTracker] 排名追踪失败: %s", e)
|
||||
|
||||
def get_jobs(self):
|
||||
"""返回当前所有定时任务的状态"""
|
||||
jobs = []
|
||||
|
||||
Reference in New Issue
Block a user