fix: 优化后台数据

This commit is contained in:
Daniel
2026-03-02 15:35:40 +08:00
parent 84e97f3370
commit 81628a136a
10 changed files with 114 additions and 11 deletions

View File

@@ -54,23 +54,56 @@ EVENT_CACHE: List[dict] = []
def calculate_impact_score(title: str) -> int:
score = 1
t = (title or "").lower()
if "missile" in t:
if "missile" in t or "导弹" in t:
score += 3
if "strike" in t:
if "strike" in t or "袭击" in t or "打击" in t:
score += 2
if "killed" in t or "death" in t or "casualt" in t:
if "killed" in t or "death" in t or "casualt" in t or "死亡" in t or "伤亡" in t:
score += 4
if "troops" in t or "soldier" in t:
if "troops" in t or "soldier" in t or "士兵" in t or "军人" in t:
score += 2
if "attack" in t or "attacked" in t:
if "attack" in t or "attacked" in t or "攻击" in t:
score += 3
if "nuclear" in t or "" in t:
score += 4
if "explosion" in t or "blast" in t or "bomb" in t:
if "explosion" in t or "blast" in t or "bomb" in t or "爆炸" in t:
score += 2
return min(score, 10)
# 根据 severity 映射到 impact_score
def _severity_to_score(sev: str) -> int:
m = {"critical": 9, "high": 7, "medium": 5, "low": 2}
return m.get((sev or "").lower(), 5)
# 根据文本推断坐标 [lng, lat],用于 GDELT 禁用时 RSS→gdelt_events
_LOC_COORDS = [
(["阿克罗蒂里", "akrotiri", "塞浦路斯", "cyprus"], (32.98, 34.58)),
(["巴格拉姆", "bagram", "阿富汗", "afghanistan"], (69.26, 34.95)),
(["巴格达", "baghdad", "伊拉克", "iraq"], (44.37, 33.31)),
(["贝鲁特", "beirut", "黎巴嫩", "lebanon"], (35.49, 33.89)),
(["耶路撒冷", "jerusalem", "特拉维夫", "tel aviv", "以色列", "israel"], (35.21, 31.77)),
(["阿巴斯港", "bandar abbas", "霍尔木兹", "hormuz"], (56.27, 27.18)),
(["米纳布", "minab"], (57.08, 27.13)),
(["德黑兰", "tehran", "伊朗", "iran"], (51.389, 35.689)),
(["大马士革", "damascus", "叙利亚", "syria"], (36.28, 33.50)),
(["迪拜", "dubai", "阿联酋", "uae"], (55.27, 25.20)),
(["沙特", "saudi"], (46.73, 24.71)),
(["巴基斯坦", "pakistan"], (73.06, 33.72)),
(["奥斯汀", "austin"], (-97.74, 30.27)),
]
def _infer_coords(text: str) -> tuple:
t = (text or "").lower()
for kws, (lng, lat) in _LOC_COORDS:
for k in kws:
if k in t:
return (lng, lat)
return (IRAN_COORD[0], IRAN_COORD[1])
# ==========================
# 获取 GDELT 实时事件
# ==========================
@@ -216,6 +249,39 @@ def _notify_node() -> None:
print(f" [warn] notify API: {e}")
def _rss_to_gdelt_fallback() -> None:
"""GDELT 禁用时,将 situation_update 同步到 gdelt_events使地图有冲突点"""
if not GDELT_DISABLED or not os.path.exists(DB_PATH):
return
try:
conn = sqlite3.connect(DB_PATH, timeout=10)
rows = conn.execute(
"SELECT id, timestamp, category, summary, severity FROM situation_update ORDER BY timestamp DESC LIMIT 50"
).fetchall()
conn.close()
events = []
for r in rows:
uid, ts, cat, summary, sev = r
lng, lat = _infer_coords((summary or "")[:300])
impact = _severity_to_score(sev)
events.append({
"event_id": f"rss_{uid}",
"event_time": ts,
"title": (summary or "")[:500],
"lat": lat,
"lng": lng,
"impact_score": impact,
"url": "",
})
if events:
global EVENT_CACHE
EVENT_CACHE = events
_write_to_db(events)
_notify_node()
except Exception as e:
print(f" [warn] RSS→gdelt fallback: {e}")
# ==========================
# RSS 新闻抓取(补充 situation_update + AI 提取面板数据)
# ==========================
@@ -243,6 +309,9 @@ def fetch_news() -> None:
LAST_FETCH["inserted"] = n
if items:
_extract_and_merge_panel_data(items)
# GDELT 禁用时用 RSS 填充 gdelt_events使地图有冲突点
if GDELT_DISABLED:
_rss_to_gdelt_fallback()
# 每次抓取完成都通知 Node 更新时间戳,便于「实时更新」显示
_notify_node()
print(f"[{datetime.now().strftime('%H:%M:%S')}] RSS 抓取 {len(items)} 条,新增入库 {n}")