Skip to content

gehth/ai-news-tracker

Repository files navigation

AI 新闻追踪 · 情报终端

一个零依赖、可嵌入、实时聚合全球 AI 资讯的单文件 Web 应用。 暗灰 + 翠绿配色,情报终端视觉风格,专为个人网站嵌套与对外展示设计。


目录


1. 项目简介

AI 新闻追踪是一个纯前端(HTML + CSS + 原生 JS,无任何框架/构建步骤)的 AI 资讯聚合终端。它能从 14 个中英权威 RSS 源实时抓取 AI 相关新闻,提供情报面板(图表/趋势/热词/排行)、收藏、已读、批量管理、全文翻译、自动刷新等能力。

核心特性:

特性 说明
🟢 单文件 所有 HTML/CSS/JS 内联,约 1694 行,122 KB,零依赖
🔌 可嵌入 作用域限定在 #ai-news-app,可安全 iframe 嵌套进个人网页
🌐 实时抓取 5 级容错抓取策略链,离线也能用缓存/备用数据
🎨 情报终端风 暗灰底 + 翠绿强调,等宽字体承载数据,7 种主题色可选
🌏 中英翻译 三级翻译容错(MyMemory → Niutrans → Google),智能中文识别
💾 历史保留 每次刷新合并旧新闻,重开页面历史仍在(localStorage,上限 800 条)
⏱ 自动刷新 可选 1/5/15/30 分钟间隔,状态栏实时倒计时
📊 情报面板 分类分布、7 日趋势、热词云、热度 TOP10、来源质量、覆盖雷达

2. 文件清单

文件 行数 作用
LICENSE MIT 开源协议(Copyright © 2026 hua)
README.md 本文档 项目解构与使用说明
CONTRIBUTING.md 贡献指南(本地运行 / 提交规范)
.gitignore Git 忽略规则(排除本地/备份/密钥文件)
ai-news-web.html ~1694 主应用:UI + 样式 + 全部逻辑,单文件交付
embed-preview.html ~40 iframe 嵌入预览页,验证嵌入态体验
worker/cloudflare-worker.js ~90 服务端 RSS 网关(边缘节点批量抓取 14 源,5 分钟缓存)
worker/deploy-worker.html ~280 Worker 部署图文指南(含「复制代码」按钮)
.gitattributes 统一行尾配置(跨平台一致)
SECURITY.md 安全漏洞披露策略
CHANGELOG.md 版本变更记录
.github/ Issue / PR 模板目录

仓库根目录放置 ai-news-web.htmlREADME.mdLICENSE.gitignoreCONTRIBUTING.mdSECURITY.mdCHANGELOG.md.gitattributesembed-preview.html;Worker 网关与部署指南统一收纳于 worker/ 子目录,社区模板位于 .github/


3. 整体架构

3.1 单文件分层

尽管是单文件,内部逻辑清晰分为三层(以注释分隔):

┌─────────────────────────────────────────────────────────┐
│ <head>  <style>  设计令牌 + 全局/组件 CSS(约 1–300 行)   │
├─────────────────────────────────────────────────────────┤
│ <body>  DOM 结构(约 307–470 行)                          │
│   #ai-news-app[data-theme][data-color]                    │
│     ├─ header        头部操作栏                           │
│     ├─ .tabs         标签页切换                           │
│     ├─ #tab-news     主视图                               │
│     ├─ #tab-express  时间线视图                           │
│     ├─ #tab-favorites收藏视图                             │
│     ├─ .modal-overlay 详情/配置弹窗                      │
│     └─ #toast-container 提示                              │
├─────────────────────────────────────────────────────────┤
│ <script>  应用逻辑(约 472–1694 行)                       │
│   常量 → 状态 → 工具函数 → 抓取 → 渲染 → 交互 → 初始化    │
└─────────────────────────────────────────────────────────┘

3.2 数据流

                 ┌──────────── 5 级抓取策略链 ────────────┐
  启动/init ──▶  │ ① 本地 Node 服务 (/api/news)          │
                 │ ② Cloudflare Worker (/all)            │──▶ allNews[]
                 │ ③ CORS 代理逐个 RSS (rss2json)        │       │
                 │ ④ benzhi.online API 补充             │       │ 去重+排序
                 │ ⑤ 天行数据 API 补充(可选 Key)       │       │
                 └──────────────────────────────────────┘       ▼
                                                          mergeNews()
                                                          saveHistory() ──▶ localStorage
                                                               │
                          ┌────────────────────────────────┼────────────────────────┐
                          ▼                                ▼                        ▼
                    renderNews()                    renderCharts()            renderTimeline()
                    (网格/列表)                      (4 图表)                  (时间线)

4. 设计系统(Design System)

4.1 设计令牌(CSS 变量,作用域 #ai-news-app

所有颜色/字体/间距均通过 CSS 变量管理,根作用域在 :root(第 9 行起),覆盖层在 #ai-news-app[data-theme] / [data-color]

令牌 浅色值 暗色值(默认) 用途
--bg #f7f8fa #0d1117 页面背景
--card #ffffff #151b23 卡片/面板
--surface-2 #f3f5f8 #1b2230 次级表面
--border #e3e8ef #232b36 边框
--text #1a1a2e #e6edf3 主文字
--text-sub #6b7280 #8b98a9 次级文字
--p(主色) #0ea371 #10b981 翠绿强调(green 主题)
--font-ui system-ui 栈 同左 UI 字体(含中文回退)
--font-mono ui-monospace 栈 同左 等宽(数据/时间/代码)
--radius 12px 同左 圆角

4.2 主题色系统

通过 data-color 属性提供 7 种强调色(第 27–32 行): green(默认翠绿)、purpleblueredorangepink,以及暗色下统一的 --p 覆盖。深浅由 data-theme="dark" 固定(已在交互层面移除切换,由宿主网页适配)。

4.3 组件库

全部以纯 CSS 实现,无组件框架:

  • 按钮.btn.btn-primary / .btn-secondary)、.icon-btn.view-btn.action-btn
  • 卡片.news-card(含 .read/.pinned/.fav 状态)、.stat-card.dash-card.skeleton-card
  • 徽标.news-source(5 类:research/industry/policy/product/technology,第 233–237 行暗色专用色板)
  • 标签/胶囊.source-pill.interest-chip.tag
  • 弹窗.modal-overlay / .modal(居中、最大 80vh 滚动)
  • 提示.toast(右下角滑入)
  • 右键菜单.context-menu(置顶/收藏/已读/复制链接/打开)

4.4 无障碍与嵌入态

  • :focus-visible 焦点环、触控靶 ≥ 40px、语义化标签、ARIA 属性(aria-expanded/aria-label
  • 嵌入式自动识别(第 1526 行 applyEmbedMode):window.self !== window.top(iframe)、URL 含 ?embed=1、或父级含 ai-news-embed 类 → 切换为 flex 纵向 + 内部滚动,绝不撑破宿主页。

5. 页面结构与 DOM 树

头部(<header>,第 309–316 行)

  • 左侧:Logo + 「情报终端」徽标
  • 右侧操作:导出收藏、⚙️ 数据源(设置)、自动刷新下拉(.auto-refresh-select,1/5/15/30 分钟)、刷新按钮

标签页(.tabs,第 318–322 行)

AI新闻追踪(主)|时间线(express)|收藏(favorites)

主视图控制栏(第 325–349 行)

  • 分类筛选:全部 / 研究 / 产业 / 政策 / 产品(第 326–330 行)
  • 搜索框(.search-box,300ms 防抖)
  • 来源状态条(.source-status-bar
  • 视图切换:网格 / 列表(第 336–339 行)
  • 批量模式开关 + 已读计数
  • 批量操作条(收藏/取消/已读/未读/取消)

统计条(.stats,第 351–355 行)

新闻总数 / 今日更新 / 热门话题 / 我的收藏

情报面板(.intel-panel,第 357–374 行,可折叠)

  • 第一排:分类分布柱状图、7 日趋势图、热词云
  • 第二排:热度 TOP10、来源质量评分、分类覆盖雷达图
  • 折叠状态持久化于 localStorage(ai-news-intel

新闻容器(.news-grid,第 377 行起)

  • 加载态:4 张骨架屏(.skeleton-card
  • 卡片模板(第 1014 行)含:来源徽标 + 时间.news-time,翠绿等宽)、标题、摘要(3 行截断)、标签、收藏星、已读勾

详情弹窗(.modal,第 387–404 行)

来源 + 时间、标题、中文翻译区、摘要、标签、收藏/阅读原文/翻译按钮

设置弹窗(.worker-overlay,第 410–442 行)

Worker URL、天行 Key(可选)、清除缓存新闻、关注领域、隐藏来源、自定义 RSS 源、主题色


6. 功能模块详解

6.1 新闻抓取:5 级容错策略链(fetchAllNews,第 569–717 行)

按优先级逐层降级,任一成功即采用,全部失败回退备用数据:

级别 名称 端点 说明
本地 Node 服务 origin + /api/news 最稳定,需本地 server.js 运行
Cloudflare Worker WorkerURL + /all 推荐线上路径,边缘批量抓取 14 源
CORS 代理逐个 RSS rss2json + 备用代理 单源失败不影响其他源
benzhi.online API /api/news 关键词(ai/大模型/芯片…)补充
天行数据 API api.tianapi.com/ai 可选,需免费 Key,补中文源

Worker 路径细节(第 591–620 行):请求 WorkerURL/all 获得 {ok, data:{hostname: rawXML}},遍历 14 源按 hostname 匹配 parseRss 解析,按 URL 去重合并进 allNews

CORS 代理链(第 488–492 行 PROXIES):alloriginscodetabscorsproxy.io,每个源经 fetchRssFeed(第 719 行)先试 rss2json、失败再试原始 XML + 代理。

6.2 RSS 源清单(RSS_SOURCES,第 495–510 行,14 个)

分类 地区
IT之家 technology
36氪 industry
Ars Technica technology
The Verge (AI) product
InfoQ 中国 research
少数派 technology
Hacker News (AI) research
OpenAI Blog product
MIT Tech Review research
VentureBeat (AI) industry
DeepMind research
arXiv cs.AI research
Google AI Blog product
量子位 industry

支持自定义 RSS(设置面板添加,合并进抓取,第 627 行)。

6.3 翻译系统:三级容错(translateModal,第 1464 行)

translateText(text)
  └─ 依次尝试 provider 数组:[tMyMemory, tNiutrans, tGoogle]
       • MyMemory  免 Key,国内可用(实测正常,返回"OpenAI发布新模型")
       • Niutrans  需配置 NIUTRANS_KEY(第 480 行,已内置)
       • Google    gtx 接口兜底
  • 智能中文识别(第 1419 行 isMostlyChinese):中文占比 > 25% 直接显示原文,避免中英混翻
  • 标题、摘要分开翻译再拼接(第 1464 行起),单段失败不影响另一段
  • 入口:详情弹窗「翻译」按钮

6.4 自动刷新(startAutoRefresh,第 941 行)

  • 头部下拉选择间隔(0/1/5/15/30 分钟),默认 5 分钟(第 519 行 autoRefreshMs
  • 状态栏实时倒计时(auto-refresh-indicator,如 自动 5m · 下次 04:32,第 971 行)
  • 到点静默调用 fetchAllNews → 合并 → 重渲染,无闪屏
  • 选择持久化于 ai-news-autorefresh

6.5 历史持久化(刷新/重开不丢新闻)

  • saveHistory()(第 891 行):抓取后写入 ai-news-history,最多 800 条,剥离函数引用防序列化错误
  • loadHistory()(第 901 行):init 启动时读回(第 556 行),旧新闻立即可见
  • mergeNews(base, incoming)(第 882 行):按 url 去重合并,刷新只追加新条目
  • clearHistory()(第 1490 行):设置面板「清除缓存新闻」,不影响收藏/已读

6.6 收藏 / 已读 / 置顶

状态 存储键 交互
收藏 ai-news-favorites 卡片星标 / 弹窗按钮 / 批量
已读 ai-news-read 卡片标题后缀 ✓ / 右键 / 批量
置顶 ai-news-pinned 右键菜单,sortByPinned 置顶排序

6.7 批量操作(toggleBatchMode,第 1279 行)

勾选卡片 → 批量收藏/取消、标记已读/未读,工具栏见第 343–349 行。

6.8 搜索与筛选

  • 分类筛选(第 1342 行 filterCategory)+ 来源筛选(第 1362 行 filterSource
  • 关键词搜索(第 1368 行 debounceSearch,300ms 防抖)+ 标签点击搜索(第 1369 行 searchTag
  • 无限滚动加载(setupInfiniteScroll + loadMore,每批 8 条)

6.9 时间显示(formatNewsTime,第 856 行)

  • safeDate(input)(第 868 行):健壮日期解析,多重兜底,永远返回合法 Date,修复少数 RSS 异常日期导致卡片无时间的问题
  • 显示规则:近 1 小时 MM-DD HH:mm · N分钟前;近 24 小时 · N小时前;更早仅 MM-DD HH:mm
  • title 属性悬停显示完整 ISO 时间

6.10 视图与键盘

  • 网格 / 列表双视图(第 1309 行 setView,持久化 ai-news-view
  • 键盘快捷键(第 1544 行 setupKeyboard):方向键导航卡片、Enter 打开、Esc 关闭、F 收藏等

7. 数据模型

每条新闻对象字段:

{
  id:          Number|String,   // 唯一标识(去重键之一)
  title:       String,          // 标题
  summary:     String,          // 摘要(≤300 字)
  source:      String,          // 来源名(如 'IT之家')
  category:    String,          // research|industry|policy|product|technology
  tags:        Array<String>,   // 关键词标签(extractTags 提取)
  url:         String,          // 原文链接(去重主键)
  time:        String,          // ISO 时间字符串
  rawTime:     Date,            // 解析后的 Date 对象(safeDate 保证有效)
}

8. localStorage 键清单

内容 读写位置
ai-news-worker-url Cloudflare Worker 域名 WORKER_KEY(第 482 行)
ai-news-rss2json-key rss2json API Key(可选) 第 486 行
ai-news-tianapi-key 天行数据 Key(可选) 第 685 行
ai-news-favorites 收藏新闻 id 数组 第 514 行
ai-news-read 已读 id 数组 第 527 行
ai-news-pinned 置顶 id 数组 第 528 行
ai-news-view 视图模式 grid/list 第 526 行
ai-news-color 主题色 green/purple… 第 532 行
ai-news-autorefresh 自动刷新间隔(ms) 第 519 行
ai-news-interests 关注领域数组 第 533 行
ai-news-hidden-sources 隐藏来源名数组 第 534 行
ai-news-custom-rss 自定义 RSS 数组 第 535 行
ai-news-history 历史新闻缓存(≤800条) HISTORY_KEY(第 889 行)
ai-news-intel 情报面板折叠状态 loadIntelState(第 1518 行)

9. 部署指南(Cloudflare Worker)

推荐线上使用 Worker 作抓取网关,规避浏览器 CORS 限制,国内可绑自定义域名(勿用 *.workers.dev,部分网络会被墙)。

步骤:

  1. Cloudflare 控制台 → Workers 和 Pages → 创建 → 从 Hello World! 开始
  2. 命名(如 ai-news-gateway)→ 部署默认代码
  3. 进入编辑器 → Ctrl+A 全选删除 → 粘贴 cloudflare-worker.js 全部内容(保留 export default)→ 保存并部署
  4. 设置+ 添加域名 → 填子域名(如 ainews.你的域名.com,需主域名已在 Cloudflare 托管 DNS)
  5. 等待 SSL 证书签发(1–5 分钟)
  6. 浏览器访问 https://ainews.你的域名.com/all 验证返回 {"ok":true,"sources":N,"data":{...}}
  7. 打开应用 → ⚙️ 数据源 → Worker URL 填 https://ainews.你的域名.com不带 /all)→ 保存 → 刷新

详见同包 deploy-worker.html(含图文与一键复制代码)。

Worker 结构:cloudflare-worker.js 为 ES Module,export default { async fetch(request, env, ctx) },对 /all 路由并行抓取 14 源、边缘缓存 5 分钟(cache-control: max-age=300),返回 {ok, sources, data} 并带 access-control-allow-origin: *


10. 嵌入个人网站

两种嵌入方式:

① iframe(推荐)

<iframe src="ai-news-web.html?embed=1"
        style="width:100%;height:800px;border:none"></iframe>

应用自动识别 iframe 环境,内部独立滚动,不撑破宿主页。

② 组件化引入#ai-news-app 整块复制进你的页面,CSS 作用域已限定 #ai-news-app,不会污染全局样式;深浅由宿主页面统一控制(应用固定 data-theme="dark")。

可用 embed-preview.html 预览嵌入效果。


11. 二次开发扩展点

想改什么 改哪里
增删 RSS 源 RSS_SOURCES 数组(第 495 行)
换翻译供应商 translateTextproviders 数组(第 1454 行)
调抓取优先级 fetchAllNews 内 5 级策略顺序(第 569 行起)
改配色 :root / [data-color] / [data-theme] 令牌(第 9–32 行)
加图表 renderCharts 系列(第 1084–1190 行)
改刷新默认 autoRefreshMs 初值(第 519 行)
历史上限 HISTORY_MAX(第 890 行)
自定义源持久 ai-news-custom-rss 键逻辑(第 535/1625 行)

技术栈: 纯原生 JS(无框架、无打包)、内联 SVG 图标(无图标库)、localStorage 持久化、Fetch + AbortSignal 超时控制。


许可证

本项目为个人学习/展示用途。RSS 源版权归各原始媒体所有,新闻转载请遵守各源许可协议。

About

单文件实时 AI 资讯聚合面板:14 路 RSS 抓取、Cloudflare Worker 边缘网关、智能去重与历史持久化、中英翻译,可一键嵌入个人网站。

Topics

Resources

License

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors