NewsLive 是一个可本地运行、可自动化部署到 GitHub Pages 的新闻聚合工具。
它支持多源获取、关键词筛选、重点推送、AI 标题翻译(Anthropic 接口兼容)以及“仅保留当日新闻”的时效过滤。
- 多源获取:支持
html_links、browser_html_links、rss、json_items、markdown_link_pages - 关键词体系:普通关键词筛选 + 重点关键词推送
- AI 翻译:获取后将英文标题翻译为中文,保留原标题
- 时效控制:仅保留
pubDate为配置时区下「当天」的新闻 - 推送去重:同一条重点内容支持重复推送间隔控制
- 推送拆包:按消息体积拆分;day.app 额外做 URL 长度保护,避免 431
- 双形态页面:
- 本地动态页面:
public/index.html+/api/state - 静态页面产物:
docs/index.html+docs/state.json
- 本地动态页面:
- Node.js
>=20 - Express
- Cheerio
- Playwright
- YAML
- dotenv
npm install复制示例文件:
cp .env.example .env填写 .env(示例):
ANTHROPIC_API_KEY=your_anthropic_compatible_api_key
ANTHROPIC_API_URL=https://api.deepseek.com/anthropic/v1/messages
ANTHROPIC_MODEL=deepseek-chat
DAY_APP_PUSH_URL=https://api.day.app/your_push_key/
NTFY_PUSH_URL=https://ntfy.example.com/your_topicnpm start默认地址:http://localhost:5178
npm run build:pages- 每行一个关键词
=======前:普通关键词=======后:重点关键词(命中后触发推送逻辑)
示例:
AI
开源
Linux
=======
漏洞
裁员获取源由 sources.yaml 驱动。当前仓库示例包含:
- AP News
- AP Top News
- Reuters World News(RSS)
- Guardian World(RSS)
- Google News(RSS)
- Hacker News(HTML / RSS / Algolia JSON)
- Lobsters RSS
- ProPublica
支持类型与常用字段:
html_linksurlmin_title_lengthmax_items
browser_html_links- 额外支持
wait_for_selectorlink_selectorbrowser_wait_msheaders
- 额外支持
rss- 自动抽取
title/link/pubDate(含部分兼容字段)
- 自动抽取
json_itemsitems_pathtitle_path(s)url_path(s)id_path(s)date_path(s)url_templatemethod
markdown_link_pages- 从 markdown 提取链接后回抓页面标题
非敏感配置放在 setting.yaml,敏感配置放在 .env。
主要配置项:
timezone:业务时区(IANA 时区名,如Asia/Shanghai)。用于pause_time_ranges的钟点、「仅当日」筛选、data/news-days.json的日期键、新闻保留清理的日期边界。留空或无效值时回退为运行环境的系统本地时区。环境变量NEWS_TIMEZONE可覆盖此项(例如在 CI 与本地共用同一仓库时显式指定)。fetch_interval_minutes:自动获取间隔(分钟)min_fetch_interval_minutes:手动/自动获取最短间隔(分钟)request_timeout_seconds:单请求超时(秒)pause_time_ranges:暂停时间段(格式时-分 to 时-分,支持跨天;钟点按timezone解释)news_retention.cleanup_interval_days:每多少天清理一次新闻(保留最近 N 天)news_retention.archive_on_cleanup:清理时是否归档被清理新闻news_retention.archive_retention_days:归档列表保留最近多少天(默认 7);<=0时不按时间删除归档记录ai_translation.*:翻译开关、批量大小、超时、请求头等(不含 key)push.*:推送开关、重复间隔、黑名单、消息长度上限等ui.poll_interval_seconds:前端轮询间隔
NEWS_TIMEZONE:可选,覆盖setting.yaml中的timezone(IANA 名称)ANTHROPIC_API_KEY:AI 翻译 API Key(必填,启用翻译时)ANTHROPIC_API_URL:Anthropic Messages 兼容接口地址ANTHROPIC_MODEL:模型名DAY_APP_PUSH_URL:Bark / day.app 推送地址(可选)NTFY_PUSH_URL:ntfy 推送地址(可选)NTFY_BEARER_TOKEN:ntfyAuthorization: Bearer(可选,私有主题等)PORT:本地服务端口(默认 5178)
可以不启动服务,单独测试所有源连接状态:
npm run test:sources若需代理,请在项目根目录新建 proxy.local.json(该文件已加入 .gitignore,不会上传):
{
"http": "http://127.0.0.1:7897",
"https": "http://127.0.0.1:7897"
}可直接复制 proxy.local.example.json 后改名为 proxy.local.json 使用。
npm run archive:clear该命令会清空归档文件中的全部新闻记录。
GitHub Actions 等 Linux 环境默认系统时区多为 UTC,若依赖「系统本地」而不配置 timezone,容易出现与你在 Windows/macOS 上本地运行时不一致的情况(例如同一 pause_time_ranges 命中窗口不同、或「当天」判定不同)。
建议在 setting.yaml 中设置 timezone(例如 Asia/Shanghai),或在 CI 的 Secrets/Variables 中通过环境变量 NEWS_TIMEZONE 注入相同值,使本地与 Action 行为一致。
获取后会检查每条新闻的 pubDate:
- 无
pubDate或无法解析:过滤 pubDate在配置的timezone下非「当天」:过滤
被过滤数量会体现在状态里(filteredOutByDateCount)。
同一天内已抓取过的新闻不会重复参与“新增处理/推送”,但页面会展示“当天累计全部新闻”。
- 匹配范围仅标题(含翻译后标题),不再匹配 URL
- 英文关键词(如
AI)按“完整词”匹配,减少误命中(如detail)
- 先按
push.max_message_chars(默认 4096)构建消息 - day.app 额外按最终 URL 长度控制(内部保护),超长会截断并重试
- 同一条重点内容根据
push.repeat_interval_minutes去重
GET /api/state:当前状态与新闻列表GET /api/archive:归档新闻列表POST /api/refresh:手动触发获取- 可能返回
429(最小间隔限制) - 可能返回
423(命中暂停时间段)
- 可能返回
- 本地运行:
/archive.html - GitHub Pages:
docs/archive.html
支持按日期与标签双重筛选。
主工作流:.github/workflows/newslive-pages.yml
流程:
- 定时/手动触发
npm ci+ 安装 Playwright Chromium- 执行
npm run build:pages - 自动提交
docs/与data/notified-history.json - 发布到 GitHub Pages
在 Actions → Secrets and variables 中配置(DAY_APP_PUSH_URL / NTFY_PUSH_URL 也可放在 Variables 同名项中,工作流会优先读 Secrets 再读 Variables):
DAY_APP_PUSH_URL(Bark / day.app,形如https://api.day.app/<你的 key>/)NTFY_PUSH_URL(可选)NTFY_BEARER_TOKEN(可选,私有 ntfy 等需 Bearer 时)ANTHROPIC_API_KEY(启用翻译时必填)ANTHROPIC_API_URL(例如https://api.deepseek.com/anthropic/v1/messages)ANTHROPIC_MODEL(例如deepseek-chat)
CI 会一并提交 data/news-days.json,与本地长期运行时的「当日已见新闻」判断一致,避免重复误判重点推送。
本项目也可以直接在部署在服务器运行。
- 安装 Node.js(建议 20+)
- 拉取项目代码并安装依赖:
npm ci- 配置环境变量(
.env,参考.env.example) - 启动服务:
npm start默认端口为 5178,可通过环境变量覆盖:
PORT=8080 npm startnpm install -g pm2
pm2 start npm --name newslive -- start
pm2 save
pm2 startup常用命令:
pm2 status
pm2 logs newslive
pm2 restart newslive若不用 PM2,也可用 systemd 守护 node src/server.js。
建议在 service 中设置 WorkingDirectory 为项目目录,并加载 .env 变量。
src/server.js:本地服务与 APIsrc/crawler.js:获取编排、过滤、翻译、推送、状态管理src/sources.js:多类型获取器实现src/ai-translate.js:Anthropic 兼容翻译客户端src/config.js:配置加载(含.env)src/build-pages.js:静态页面构建public/index.html:本地动态前端docs/:静态页面产物
- 不要把真实密钥写入仓库文件
.env已被.gitignore忽略- 如密钥曾暴露,请立即在供应商后台轮换
项目使用仓库中的 LICENSE。