楼主: 王永伟
149 0

[学科前沿] TrendRadar 开源项目技术解析 [推广有奖]

  • 0关注
  • 0粉丝

等待验证会员

学前班

40%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
20 点
帖子
1
精华
0
在线时间
0 小时
注册时间
2018-12-30
最后登录
2018-12-30

楼主
王永伟 发表于 2025-11-16 13:32:46 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

摘要

在信息激增的时代,怎样从大量 APP 和繁多的信息中准确地获取有价值的内容,是每个人面临的问题。TrendRadar 作为一款开放源代码的热点新闻整合分析系统,利用智能化技术,为用户提供了高效的个性化新闻获取方案。本文将从技术框架、关键功能、实现机制等角度,全面解读这个值得留意的开源项目。

1. 项目概述

TrendRadar 是一个基于 Python 构建的热点新闻整合与智能分析系统,能够从多个主要平台收集热门新闻,并通过自定义关键字进行智能选择和推送。该项目使用 GitHub Actions 实现自动化操作,支持多样化的通知方式,具有无需技术背景即可部署的优势。

1.1 核心特性

  • 全网热点整合:汇集知乎、微博、抖音、百度热榜等 11+ 主要平台
  • 智能内容筛选:支持普通词、必选词(+)、排除词(!)三种语法规则
  • 多推送模式:提供日汇总、当前榜单、增量监控三种运作模式
  • 多渠道通知:兼容企业微信、飞书、钉钉、Telegram、邮件等通知途径
  • 热点趋势分析:基于权重算法的新闻热度排序与趋势跟踪
  • AI 智能分析:基于 MCP 协议的交互式分析功能(v3.0.0 版本新增)

1.2 效果展示

  • GitHub Actions 一键安装:
  • H5 页面生成:
  • 内容推送:

2. 技术架构分析

2.1 系统架构

TrendRadar 采取单体应用架构,所有功能集中在

main.py
文件内,此设计方便用户迅速部署和更新。系统整体架构可细分为以下主要模块:

TrendRadar/
├── 配置管理模块 (config/*.yaml, config/frequency_words.txt)
├── 数据获取模块 (DataFetcher)
├── 数据处理模块 (数据解析、统计分析)
├── 报告生成模块 (HTML/Markdown 生成)
├── 通知推送模块 (多渠道适配器)
├── AI 分析模块 (MCP 服务器)
└── 自动化部署 (GitHub Actions)

2.2 核心技术栈

技术领域 使用技术 说明
开发语言 Python 3.x 主要编程语言
配置管理 YAML 配置文件格式,支持复杂的配置结构
网络请求 requests HTTP 客户端库,支持代理和重试功能
数据处理 pytz 时区处理,支持北京标准时间
通知服务 Webhook API 支持企业微信、飞书、钉钉等多种平台
AI 协议 MCP (Model Context Protocol) 标准化的 AI 工具调用协议
部署平台 GitHub Actions 自动化执行和版本控制

3. 核心功能实现解析

3.1 数据获取引擎

系统的核心数据获取功能通过

DataFetcher
类实现:

class DataFetcher:
    def __init__(self, proxy_url: Optional[str] = None):
        self.proxy_url = proxy_url

    def fetch_data(self, id_info: Union[str, Tuple[str, str]]) -> Tuple[Optional[str], str, str]:
        """获取指定ID数据,支持重试"""
        url = f"https://newsnow.busiyi.world/api/s?id={id_value}&latest"
        # 代理支持、重试机制、错误处理
        proxies = {"http": proxy_url, "https": proxy_url} if self.proxy_url else None
        headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
            "Accept": "application/json, text/plain, */*",
        }
        # 带重试的数据获取逻辑
        response = requests.get(url, proxies=proxies, headers=headers, timeout=10)
        return response.text, id_value, alias

技术亮点:

  • 统一数据源:基于 newsnow 项目的 API,简化了多平台适应的复杂性
  • 异常处理:内置重试机制,提高了数据获取的成功率
  • 代理支持:支持 HTTP 代理,适应不同的网络环境

3.2 智能关键词匹配系统

TrendRadar 的主要优势在于其灵活的关键词匹配系统:

def matches_word_groups(title: str, word_groups: List[Dict], filter_words: List[str]) -> bool:
    """检查标题是否符合词组规则"""
    title_lower = title.lower()
    # 1. 排除词检查(优先级最高)
    if any(filter_word.lower() in title_lower for filter_word in filter_words):
        return False
    # 2. 词组匹配检查
    for group in word_groups:

required_words = group["required"] # 必需词汇(+)

normal_words = group["normal"] # 常规词汇

# 必需词汇检验:所有必需词汇均需包含

if required_words:

all_required_present = all(

req_word.lower() in title_lower for req_word in required_words

)

if not all_required_present:

continue

# 常规词汇检验:包含任一词汇即可

if normal_words:

any_normal_present = any(

normal_word.lower() in title_lower for normal_word in normal_words

)

if not any_normal_present:

continue

return True

return False

匹配准则:

常规词汇:标题中包含任一词汇即匹配

必需词汇(+):标题必须同时包含所有必需词汇

过滤词汇(!):包含过滤词汇直接排除,优先级最高

词汇管理:通过空行分隔不同词汇组,独立统计分析

3.3 热度权重算法

系统运用智能权重算法重新排列新闻热点,打破各平台算法限制:

def calculate_news_weight(title_data: Dict, rank_threshold: int = CONFIG["RANK_THRESHOLD"]) -> float:

"""计算新闻权重,用于排序"""

ranks = title_data.get("ranks", [])

count = title_data.get("count", len(ranks))

weight_config = CONFIG["WEIGHT_CONFIG"]

# 排名权重:Σ(11 - min(rank, 10)) / 出现次数

rank_scores = [11 - min(rank, 10) for rank in ranks]

rank_weight = sum(rank_scores) / len(ranks) if ranks else 0

# 频率权重:min(出现次数, 10) × 10

frequency_weight = min(count, 10) * 10

# 热度加分:高排名次数 / 总出现次数 × 100

high_rank_count = sum(1 for rank in ranks if rank <= rank_threshold)

hotness_ratio = high_rank_count / len(ranks) if ranks else 0

hotness_weight = hotness_ratio * 100

# 综合权重计算

total_weight = (

rank_weight * weight_config["RANK_WEIGHT"] + # 排名权重 60%

frequency_weight * weight_config["FREQUENCY_WEIGHT"] + # 频率权重 30%

hotness_weight * weight_config["HOTNESS_WEIGHT"] # 热度权重 10%

)

return total_weight

算法特征:

排名导向:排名较低(排名数字较小)的新闻权重较高

持续性奖励:重复出现的新闻获得更高权重

热点加分:高排名新闻的连续出现获得额外奖励

可调性:权重配置可通过配置文件动态调整

4. 运行模式解析

TrendRadar 提供三种不同的运行模式,适应不同用户需求:

4.1 当日汇总模式 (daily)

report:

mode: "daily" # 当日汇总模式

特点:

推送时机:定时推送(默认每小时)

显示内容:当日所有匹配新闻 + 新增新闻区域

适用场景:日报总结、全面了解当日热点趋势

4.2 当前榜单模式 (current)

特点:

推送时机:定时推送(默认每小时)

显示内容:当前榜单匹配新闻 + 新增新闻区域

适用场景:实时热点追踪、了解当前最热门的内容

技术实现:

if mode == "current":

# 加载完整的历史数据

analysis_data = self._load_analysis_data()

# 只处理 last_time 等于最新时间的新闻

for source_id, source_titles in results.items():

filtered_titles = {}

for title, title_data in source_titles.items():

if title_info[source_id][title]["last_time"] == latest_time:
    filtered_titles[title] = title_data
4.3 增量监控模式 (incremental)
特点
:
推送时机
:存在新增内容时推送,无新增则不活跃
显示内容
:首次显现的匹配频率词新闻
适用场景
:减少重复信息干扰,适用于高频率监控场合
增量检测逻辑
:
def detect_latest_new_titles(current_platform_ids: Optional[List[str]] = None) -> Dict:
    """检测当天最新增加的标题"""
    # 分析最近的文件
    latest_file = files[-1]
    latest_titles = parse_file_titles(latest_file)
    # 汇总过往标题
    historical_titles = set()
    for file_path in files[:-1]:
        historical_data = parse_file_titles(file_path)
        for source_id, titles_data in historical_data.items():
            for title in titles_data.keys():
                historical_titles.add(title)
    # 识别新增标题
    new_titles = {}
    for source_id, latest_source_titles in latest_titles.items():
        source_new_titles = {}
        for title in latest_source_titles.keys():
            if title not in historical_set:
                source_new_titles[title] = latest_source_titles[title]
5. 通知推送架构
5.1 多通道支持
TrendRadar 支持超过 6 种通知方式,使用适配器模式设计:
def send_to_notifications(stats: List[Dict], report_data: Dict,
report_type: str, update_info: Optional[Dict] = None,
proxy_url: Optional[str] = None) -> Dict[str, bool]:
    """多渠道统一发送接口"""
    results = {}
    # 各个平台调用
    if feishu_url:
        results["feishu"] = send_to_feishu(feishu_url, report_data, report_type)
    if dingtalk_url:
        results["dingtalk"] = send_to_dingtalk(dingtalk_url, report_data, report_type)
    if telegram_token and telegram_chat_id:
        results["telegram"] = send_to_telegram(
            telegram_token, telegram_chat_id, report_data, report_type
        )
    # ... 其他平台
    return results
5.2 消息分批处理
针对各平台的推送限制,实现智能化分批功能:
def split_content_into_batches(report_data: Dict, format_type: str,
update_info: Optional[Dict] = None,
max_bytes: int = None) -> List[str]:
    """分批处理消息内容,确保词组标题+至少首条新闻的连贯性"""
    # 确保词组标题+首条新闻的完整性
    for word_group in report_data["stats"]:
        word_header = f"???? {word_group['word']} : {word_group['count']} 条"
        first_news = word_group["titles"][0]
        # 检查词组标题+首条新闻是否超过限制
        test_content = current_batch + word_header + first_news
        if len(test_content.encode("utf-8")) >= max_bytes:
            # 创建新批次
            batches.append(current_batch)
            current_batch = word_header + first_news
        # 继续加入其余新闻
    
for news in word_group["titles"][1:]:
if current_batch_can_fit(news):
current_batch += news
else:
batches.append(current_batch)
current_batch = news
6. AI 智能分析模块 (v3.0.0 新增)
6.1 MCP 协议集成
TrendRadar v3.0.0 引入了基于 Model Context Protocol (MCP) 的 AI 分析功能:
# 创建 FastMCP 2.0 应用
mcp = FastMCP('trendradar-news')
# 全局工具实例(在首次请求时初始化)
_tools_instances = {}
def _get_tools(project_root: Optional[str] = None):
"""获取或创建工具实例(单例模式)"""
if not _tools_instances:
_tools_instances['data'] = DataQueryTools(project_root)
_tools_instances['analytics'] = AnalyticsTools(project_root)
_tools_instances['search'] = SearchTools(project_root)
_tools_instances['config'] = ConfigManagementTools(project_root)
_tools_instances['system'] = SystemManagementTools(project_root)
return _tools_instances
# ==================== 数据查询工具 ====================
@mcp.tool
async def get_latest_news(
platforms: Optional[List[str]] = None,
limit: int = 50,
include_url: bool = False
) -> str:
6.2 AI 分析工具集
系统提供了 13 种智能分析工具,分为四大类:
基础查询工具
:
get_latest_news
- 获取最新新闻
get_news_by_date
- 按日期查询新闻
get_trending_topics
- 获取热点话题 智能检索工具 :
search_news
- 智能搜索新闻
search_related_news_history
- 历史关联新闻检索 高级分析工具 :
analyze_topic_trend
- 话题趋势分析
analyze_data_insights
- 数据洞察分析
analyze_sentiment
- 情感分析
find_similar_news
- 相似新闻查找
generate_summary_report
- 摘要报告生成 系统管理工具 :
get_current_config
- 获取当前配置
get_system_status
- 系统状态检查
trigger_crawl
- 手动触发爬取 6.3 自然语言分析能力 用户可以利用自然语言与系统互动: # 示例对话场景 [ "查询今天热搜前10条新闻", "分析'人工智能'这个话题最近一周的热度趋势", "比较知乎和微博平台对'比特币'的关注度差异", "搜索'华为'相关的正面新闻", "生成今天的科技新闻摘要报告" ] 7. 部署架构与自动化 7.1 GitHub Actions 自动化 参考 快速开始 系统通过 GitHub Actions 实现全面自动化运行: # .github/workflows/crawler.yml name: Hot News Crawler on: schedule: - cron: '0 * * * *' # 每小时执行一次 workflow_dispatch: # 支持手动触发 jobs: crawl: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: 设置 Python uses: actions/setup-python@v4 with: python-version: '3.9' - name: 安装依赖 run: | pip install pyyaml requests - name: 运行爬虫 env: FEISHU_WEBHOOK_URL: ${{ secrets.FEISHU_WEBHOOK_URL }} # ... 其他环境变量 run: python main.py 7.2 多样化部署方案 GitHub Pages 部署 : 一键 Fork 即可使用 自动生成美观的网页报告 移动设备完美适配 Docker 容器化部署 : docker run -d --name trend-radar \ -v ./config:/app/config:ro \

-v ./output:/app/output \

-e FEISHU_WEBHOOK_URL="你的webhook" \

wantcat/trendradar:latest

本地化部署:

兼容 Windows/Linux/macOS
提供自动安装脚本
灵活的配置选项

8. 安全与隐私设计

8.1 配置安全

项目极其重视用户的隐私和信息安全:
秘密管理
所有敏感数据通过 GitHub Secrets 进行管理
配置隔离
Webhook URL 不会暴露在代码库中
权限最小化
仅请求必要的 API 权限

8.2 代理支持

def _setup_proxy(self) -> None:
"""配置代理设置"""
if not self.is_github_actions and CONFIG["USE_PROXY"]:
self.proxy_url = CONFIG["DEFAULT_PROXY"]
print("本地环境,启用代理")
else:
print("GitHub Actions环境,不使用代理")

9. 定制化和扩展性

平台扩展:
参考 newsnow
增加需要监测的平台:
# 添加新平台只需更改配置
platforms:
- id: "new-platform"
name: "新平台名称"

关键词扩展:

/config/frequency_words.txt
文件中添加感兴趣的关键词,支持普通词、必填词(+)、排除词(!)三种语法。

AI
机器学习
+技术

# 新主题
金融
股市
+投资

三种推送模式:

/config/config.yaml
文件中配置推送模式,包括每日汇总(daily)、当前排名(current)、增量监控(incremental),以满足不同人群的需求:
# 推送模式选择
report:
mode: "daily" # 可选: "daily"|"incremental"|"current"
rank_threshold: 5 # 排名高亮阈值

推送时间窗口控制:

/config/config.yaml
文件中配置推送时间窗口控制,即控制推送的时间和频率:
# 推送时间窗口控制(可选功能)
# 目的:限定推送的时间范围,避免非工作时间的打扰
# 应用场景:
# - 仅在工作日白天接收推送(例如 09:00-18:00)
# - 希望在晚上特定时间收到汇总(例如 20:00-22:00)
push_window:
enabled: true # 是否启用推送时间窗口控制,默认关闭
# 注意:GitHub Actions 的执行时间可能不稳定,建议预留至少 2 小时的时间范围
# 如需精确的定时推送,建议在个人服务器上使用 Docker 部署
time_range:
start: "08:00" # 推送时间窗口开始(北京时间)
end: "18:00" # 推送时间窗口结束(北京时间)
once_per_day: false # 每天在时间窗口内仅推送一次,如果 false,则窗口内每次执行均推送
push_record_retention_days: 7 # 推送记录保留天数

10. 项目价值与意义

10.1 技术价值

开源社区贡献:
为技术社群提供了全面的新闻聚合解决方案
架构设计参考:
展示了中小型应用的优质架构实例,文档详尽,适合新手
API 使用示例:
说明了如何优雅地整合第三方服务 API

10.2 用户价值

信息获取变革:
从被动接受算法推荐转变为积极获取信息
效率提高:
显著减少了浏览各类 APP 浪费的时间
个性化定制:
支持个性化的信息关注点,也可定制开发,比如输出 markdown 格式

11. 总结

TrendRadar 项目是开源理念和技术革新的理想结合,它不仅解决了信息过载时代的问题,还展现了优秀开源项目应有的特点:
技术创新:
采用 MCP 协议引入 AI 分析,实现了与智能助理的无缝连接
用户体验:
30秒内无需门槛完成部署,支持多样的通知方式
架构合理性:
模块化设计,配置驱动,便于维护和扩展
社区活跃:
详细的文档,积极的问题回应,持续的版本更新
在信息日益分散的当下,TrendRadar 为我们提供了一种重新掌握信息主动权的方法。它不仅仅是一个技术项目,更是信息获取方式的一次革新。通过此项目,我们见证了开源社区如何利用技术革新解决实际问题,同时也看到了技术如何使生活更加美好。
对于开发者来说,TrendRadar 是一个学习和实践的极佳案例;对于用户来说,它提供了一个提高信息获取效率的实用工具。

我一直有意向每天自动接收感兴趣的科技资讯,并将其推送到我的设备,以此来避免每天在各种应用程序中反复查找热门信息的复杂过程。不过,由于信息来源分散以及整合方法不够清晰,这个设想一直未能实现。最近接触到的一个开源项目给了我很大启发,它在信息源收集、数据集成和推送机制方面都具有很高的借鉴意义。将来,我打算在深入了解该项目的基础上,进行个性化定制开发,以满足个人需求,比如生成markdown格式的内容,再由AI进行总结、配图等,便于在平台上发布文章等:

这正是优质开源项目的精髓所在——不仅能解决技术难题,还能创造实际价值,促进社会发展。

项目链接

TrendRadar GitHub 仓库:https://github.com/sansan0/TrendRadar

在线演示:https://sansan0.github.io/TrendRadar/

项目文档:https://github.com/sansan0/TrendRadar/blob/master/readme.md

内容来源:https://newsnow.busiyi.world/

本文基于 TrendRadar v3.0.4 版本分析,项目正在持续更新中。

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:trend Radar Adar End DaR

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
扫码
拉您进交流群
GMT+8, 2026-1-26 19:25