ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

TrendRadar 开源项目技术解析:从数据采集到告警推送的完整链路拆解

TrendRadar 开源项目技术解析:从数据采集到告警推送的完整链路拆解 1. TrendRadar 数据采集链路拆解从 newsnow 接口到本地落盘TrendRadar 是一个用 Python 写的热点新闻聚合与智能分析系统核心能力是把多个平台的热榜数据抓下来、按关键词筛选、算热度权重、再推送到你指定的渠道。它适合两类人一类是想每天自动收到自己关心领域热点的普通用户另一类是想研究「数据采集 规则匹配 权重排序 多通道推送」这条完整链路的开发者。我这次不打算只讲它有什么功能而是把采集、匹配、权重、推送四个环节拆开配上可复制的配置和验证命令让你在自己机器上跑通。整个项目的入口是main.py配置集中在config/目录下。数据采集模块叫DataFetcher它并不直接去爬各个平台的页面而是统一走 newsnow 项目提供的聚合接口用id参数区分平台。这样做的好处是平台适配的脏活被上游吃掉了你只需要维护一份平台 id 列表。采集回来的原始数据是 JSON 文本后面所有环节都基于它做解析。先说你最关心的怎么在本地把它跑起来并看到采集结果。我建议先不碰 GitHub Actions纯本地验证链路这样出问题好定位。git clone https://github.com/sansan0/TrendRadar.git cd TrendRadar python -m venv venv source venv/bin/activate # Windows 用 venv\Scripts\activate pip install pyyaml requests pytz装完依赖后先看一眼config/config.yaml里的平台配置。每个平台是一个id加一个nameid就是传给 newsnow 接口的标识。你可以只留两三个平台做最小验证减少首次运行的等待时间。platforms: - id: zhihu name: 知乎 - id: weibo name: 微博 - id: baidu name: 百度热搜然后直接跑主程序python main.py如果采集成功你会在output/目录下看到按日期命名的文件里面是解析后的标题、排名、来源平台等结构化数据。这一步是整个链路的地基采集不通后面的匹配和推送都无从谈起。我实测下来首次运行最容易卡在依赖缺失和平台 id 写错这两件事上前者报ModuleNotFoundError后者表现为某个平台数据为空但不报错需要你对着输出文件逐个平台核对。采集模块内部对每个平台请求都带了重试和超时控制超时设的是 10 秒请求头伪装成常见浏览器。如果你所在网络环境访问接口不稳定可以在配置里打开代理开关让请求走你本地的代理地址。注意这里说的是本地网络代理配置用于提升请求成功率和任何绕过网络管理的行为无关。采集回来的 JSON 里每条新闻包含标题、当前排名、平台 id 等字段。系统会把同一批次的数据按平台分组再进入下一步的关键词匹配。理解这一点很重要采集和匹配是解耦的采集只管拿数据匹配只管筛数据这样你替换数据源时不用动匹配逻辑。2. TaoToken 前置准备给 TrendRadar 的 AI 分析模块接上模型能力TrendRadar v3.0.0 之后引入了基于 MCP 协议的 AI 分析模块提供analyze_topic_trend、analyze_sentiment、generate_summary_report等工具。这些工具本身是数据查询和分析逻辑但如果你想让 AI 真正对热点做语义总结、情感判断就需要给它接一个可调用的模型服务。这一步我用 TaoToken 来做原因是它的接口兼容 OpenAI 风格配置成本低适合在本地脚本里快速验证。先说清楚它是什么TaoToken 提供统一的模型调用入口你拿到一个 API Key 和一个 Base URL就能用标准的 chat completions 格式请求模型。对 TrendRadar 这种需要把「一批新闻标题」丢给模型做归纳的场景来说你只需要在分析脚本里加一个 HTTP 请求即可不需要改项目主体结构。适合谁用如果你只是想让 TrendRadar 每天推一份带 AI 摘要的热点报告那这一步是可选增强如果你要做趋势分析、情感判断这类需要模型理解语义的功能那这一步是必需的。我建议先把采集和推送跑通再来接模型避免一次性引入太多变量。获取 Key 的路径很直接打开 https://taotoken.net/api-keys 登录后创建一个 API Key复制保存。注意 Key 只在创建时完整显示一次丢了就重新建一个。然后在控制台 https://taotoken.net/console 可以看到你的调用额度和使用情况方便排查是不是 Key 失效或额度耗尽。拿到 Key 之后你需要确认三件套Base URL、API Key、Model ID。Base URL 用https://taotoken.net/api注意这个地址不带任何查询参数。Model ID 根据你要用的模型填比如做摘要可以用通用对话模型做代码相关分析可以选 coding 类模型。这三个值在后面的配置片段里会反复出现先记牢。如果你更习惯在对话界面里先试试模型效果可以打开 https://taotoken.net/models 直接和模型对话把一段新闻标题粘进去看它总结得怎么样确认可用后再写进脚本。这一步能帮你提前排除「模型选错」的问题。需要提醒的是TaoToken 在这里的角色是「模型调用入口」不是数据源也不是推送通道。TrendRadar 的数据采集仍然走它自己的 newsnow 接口推送仍然走企业微信、飞书这些 webhook。三者职责分明排查问题时可以分段定位采集看 output 文件模型看请求返回推送看 webhook 响应。3. 可复制配置把模型接入 TrendRadar 分析脚本这一节给你可以直接粘贴的配置。TrendRadar 的 AI 分析模块通过 MCP 工具暴露能力但工具本身不绑定具体模型你需要在调用层配置模型客户端。下面是一个最小可用的 Python 配置片段放在项目根目录下新建的ai_client.py里。import os import requests TAOTOKEN_BASE_URL https://taotoken.net/api TAOTOKEN_API_KEY os.environ.get(TAOTOKEN_API_KEY, ) MODEL_ID gpt-4o-mini # 按需替换为你要用的模型 ID def chat_completion(messages, temperature0.3): url f{TAOTOKEN_BASE_URL}/v1/chat/completions headers { Authorization: fBearer {TAOTOKEN_API_KEY}, Content-Type: application/json, } payload { model: MODEL_ID, messages: messages, temperature: temperature, } resp requests.post(url, headersheaders, jsonpayload, timeout30) resp.raise_for_status() return resp.json()[choices][0][message][content]注意 Base URL 后面拼的是/v1/chat/completions这是 OpenAI 兼容接口的标准路径。如果你的请求返回 404先检查这个路径有没有拼错。Key 通过环境变量传入不要硬编码在文件里避免提交到仓库。如果你用的是 Claude Code 这类工具做辅助开发它的配置文件通常在~/.claude/settings.json或项目级.claude/settings.json里面需要写全三件套{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: 你的_TaoToken_Key, ANTHROPIC_MODEL: claude-3-5-sonnet-20241022 } }这里 Base URL 同样不带查询参数Model ID 按你实际要用的填。Cline 或 Roo Code 这类 VS Code 插件的 MCP 配置也是同样的三件套逻辑在插件的模型设置里填 Base URL、API Key、Model ID 即可。Codex 的auth.json里则是base_url和api_key两个字段路径一般在~/.codex/auth.json。把模型客户端接好之后你可以在 TrendRadar 的分析流程里调用它。比如在生成摘要报告时把筛选后的标题列表拼成 prompttitles [标题1, 标题2, 标题3] prompt 以下是今日热点标题请用三句话总结共同主题\n \n.join(titles) summary chat_completion([{role: user, content: prompt}]) print(summary)跑通这一步你就把「采集 → 匹配 → 模型分析」串起来了。我试过把当天抓到的科技类标题丢进去模型能比较准确地归纳出「AI 芯片」「开源模型」这类主题词比纯关键词统计更贴近人的阅读习惯。4. 验证请求与成功结果确认采集、匹配、推送三段都通配置写完必须验证否则你不知道问题出在哪一段。我按采集、匹配、推送、模型四段分别给验证方法。采集验证运行python main.py后检查output/目录下最新日期的文件是否存在且非空。用下面命令快速看条数ls -lt output/ | head python -c import json,glob; fsorted(glob.glob(output/*.json))[-1]; djson.load(open(f)); print(sum(len(v) for v in d.values()))如果输出是 0说明采集没拿到数据回去检查平台 id 和网络。匹配验证在config/frequency_words.txt里写一个你确定今天会上榜的词比如「AI」然后重跑看输出里是否只剩包含该词的标题。匹配规则支持三种语法普通词、必须词词、过滤词!词。过滤词优先级最高命中直接剔除。推送验证以飞书 webhook 为例在config/config.yaml里填好 webhook 地址重跑后看飞书群是否收到消息。如果没收到先用 curl 单独测 webhookcurl -X POST -H Content-Type: application/json \ -d {msg_type:text,content:{text:test}} \ 你的飞书webhook地址curl 通了但程序没推说明是程序里的推送逻辑或配置读取问题。模型验证单独跑ai_client.py里的chat_completion传一句「你好」看是否返回内容。返回 401 说明 Key 无效返回 404 说明 Base URL 或路径拼错返回超时说明网络到接口不通。四段都验证通过后你会看到一条完整链路output 文件有数据、匹配结果符合预期、飞书收到推送、模型返回摘要。这时候再考虑上 GitHub Actions 做定时运行。Actions 的 workflow 里把TAOTOKEN_API_KEY和 webhook 地址都放进 Secrets用${{ secrets.XXX }}引用不要明文写在 yml 里。5. 本篇常见错排查401、local proxy failed、reading choices 逐个拆跑这条链路时报错基本集中在几个固定位置。我把真实遇到过的错误和对应解法列出来你对照着查。401 Unauthorized出现在模型请求或推送请求里。模型侧说明TAOTOKEN_API_KEY没传或传错检查环境变量是否在当前 shell 生效echo $TAOTOKEN_API_KEY看有没有值。推送侧说明 webhook 地址失效重新生成一个。注意 401 不会告诉你具体是哪个字段错所以要逐个排除。local proxy failed出现在采集请求里。说明你配置的本地代理地址不可达。检查代理端口是否在监听或者干脆把USE_PROXY关掉看直连能不能通。这个报错和模型调用无关别混淆。reading choices 相关报错通常是模型返回结构和你解析的字段不匹配。比如你请求的是某个不支持 chat completions 格式的模型返回体里没有choices字段。解决办法是确认 Model ID 对应的接口格式或者打印完整返回体看结构print(resp.json())OAuth 相关报错多出现在 Claude Code 或 Codex 这类工具的登录环节。如果你用的是 API Key 模式就不该走 OAuth 流程。检查配置文件里是不是同时存在 OAuth token 和 API Key两者冲突时优先走 OAuth 导致失败。清掉 OAuth 相关字段只留 Base URL 和 API Key。平台数据为空但不报错采集请求成功但某个平台没数据。多半是平台 id 写错或者该平台当天接口返回空。换一个平台 id 测试确认是配置问题还是数据问题。推送消息被截断长报告超过平台单条消息长度限制。TrendRadar 内置了分批逻辑会保证「词组分标题 第一条新闻」的完整性。如果还是被截断检查max_bytes配置是否和平台限制匹配。Actions 里跑失败但本地成功最常见是 Secrets 没配全或者 Actions 环境没有你本地装的某个依赖。检查 workflow 的pip install步骤是否覆盖了所有 import。6. 语义一致 CTA把链路跑通后再考虑长期运行链路跑通之后你大概率会想让它每天自动跑。这时候有两个方向一是用 GitHub Actions 定时触发适合不想维护服务器的场景二是用 Docker 部署在自己的机器或服务器上适合需要精确控制推送时间窗口的场景。如果你在接入模型、调试 MCP 工具或排查请求报错时需要对照文档可以看接入文档 https://taotoken.net/doc 里面有接口格式和参数说明。想先验证模型效果再写进脚本直接去模型对话 https://taotoken.net/models 试。如果你打算把 TrendRadar 的 AI 分析做成长期运行的编码或 Agent 任务比如每天自动生成报告并推送到多个渠道可以了解 Coding Plan https://taotoken.net/coding-plan 它更适合这种持续调用的场景。我的建议是先用本地跑通采集和推送确认每天能稳定收到消息再决定要不要加模型分析。模型分析是锦上添花采集和推送才是这条链路的地基。地基不稳加再多 AI 能力也是空中楼阁。
返回列表