Files
vps-management-bot/projects/news-bot/summarizer.py

98 lines
2.8 KiB
Python
Raw Normal View History

2026-03-21 01:10:53 +08:00
"""
新闻总结生成模块
使用规则引擎生成中文总结不调用外部 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())