Files
vps-management-bot/projects/news-bot/summarizer.py
2026-03-21 01:10:53 +08:00

98 lines
2.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
新闻总结生成模块
使用规则引擎生成中文总结(不调用外部 AI API
"""
import logging
from datetime import datetime, timedelta
from collections import defaultdict
logger = logging.getLogger(__name__)
def generate_summary(news_list: list, period: str = "全天") -> str:
"""
生成新闻总结
period: "最近1小时" / "上午" / "全天" / "昨晚到今早"
"""
if not news_list:
return f"📭 {period}暂无重要新闻"
# 按评分排序,高分在前
sorted_news = sorted(news_list, key=lambda x: x.get("score", 0), reverse=True)
# 按来源分组统计
source_count = defaultdict(int)
for n in sorted_news:
source_count[n.get("source_name", "未知")] += 1
# 构建总结
lines = []
lines.append(f"📊 *{period}新闻总结*")
lines.append(f"━━━━━━━━━━━━━━━")
lines.append(f"📰 共 {len(sorted_news)} 条快讯")
lines.append("")
# 🔴 重磅新闻(评分 >= 8
hot_news = [n for n in sorted_news if n.get("score", 0) >= 8]
if hot_news:
lines.append("🔴 *重磅快讯*")
for n in hot_news[:5]:
emoji = _score_emoji(n.get("score", 0))
lines.append(f" {emoji} {n['title']}")
lines.append("")
# 🟡 值得关注(评分 6-7
mid_news = [n for n in sorted_news if 6 <= n.get("score", 0) <= 7]
if mid_news:
lines.append("🟡 *值得关注*")
for n in mid_news[:8]:
lines.append(f"{n['title']}")
lines.append("")
# 来源统计
lines.append("📡 *来源分布*")
for src, cnt in sorted(source_count.items(), key=lambda x: x[1], reverse=True):
lines.append(f" {src}: {cnt}")
lines.append("")
lines.append(f"⏰ 生成时间: {datetime.now().strftime('%H:%M')}")
return "\n".join(lines)
def _score_emoji(score: int) -> str:
"""根据评分返回 emoji"""
if score >= 9:
return "🔥"
elif score >= 8:
return ""
elif score >= 7:
return "📌"
elif score >= 6:
return "📎"
else:
return ""
def get_period_range(period: str) -> tuple:
"""
根据时间段名称返回 (start_ts, end_ts)
"""
now = datetime.now()
today_start = now.replace(hour=0, minute=0, second=0, microsecond=0)
if period == "最近1小时":
start = now - timedelta(hours=1)
elif period == "上午":
start = today_start.replace(hour=6)
now = min(now, today_start.replace(hour=12))
elif period == "全天":
start = today_start
elif period == "昨晚到今早":
start = (today_start - timedelta(days=1)).replace(hour=20)
now = today_start.replace(hour=8)
else:
start = now - timedelta(hours=3)
return int(start.timestamp()), int(now.timestamp())