feat: GEO/SEO structured data + search ranking tracker

This commit is contained in:
Yuzhiran Dev
2026-06-09 17:18:09 +08:00
parent 23ff63baa9
commit 8595bbc521
26 changed files with 961 additions and 51 deletions
+37
View File
@@ -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 = []