如何使用 RSS 订阅源构建自己的“ 谷歌新闻 ”
谷歌新闻每天为数十亿头条新闻服务,但成本如何? 算术操纵、隐私被侵蚀和信任度下降迫使数百万人寻找其他选择。 在2026年,建立自己的新闻汇总器不仅仅是可能的 — — 这是实际的、负担得起的和赋予权力的。
这个综合指南会用RSS的素材来引导您创建个性化的“Google News”。从架构决定到AI的驱动过滤,您将学习如何构建一个服务于新闻体验 打开 无论是开发者大楼还是动力用户 利用现有工具,本指南都涵盖你。
1. 为什么建立自己的新闻汇总器?
在进入执行之前,了解拥有新闻管道的切实好处:
- 算术独立:你决定什么是重要,而不是参与优化AI
- 隐私保护:没有向广告商出售或用于剖析的阅读历史
- 完全定制: 精确地根据您的喜好来限制来源、话题和演示
- 没有广告或工资墙: 清真阅读体验注重内容,而非货币化.
- 便携式订阅: OPML 导出意味着您永远拥有您的订阅源列表
- 成本效率: 免费RSS feed + 负担得起的工具对多份新闻订阅
平台比较:控制,隐私和自定义(0-100)
2. 建筑概况:你新闻应用的建筑块
强力新闻聚合器需要几个互相连接的组件。
自定义新闻聚合架构
源网站
新闻网站、博客、新闻室和新闻资料
Feed 投票服务
计划每15-60分钟接取一次
内容 存储
文章加元数据 PostgreSQL/MongoDB
AI 处理层
汇总、分解、排位
过滤引擎
关键词、来源、专题、优先事项
用户界面
网络应用、移动应用、电子邮件摘要
RSS Feed Flow处理盒外的2至5层,你专注于管护和消费.
核心部分解释
Feed 投票服务
以可配置的间隔( 15- 80分) 获取 RSS 订阅源的已排定任务。 处理重试、 超时和错误记录 。
内容解析器
提取标题,作者, pubDate, 内容, 图像来自 RSS XML. 规范不同的订阅源格式( RSS 2. 0, Atom, JSON Feed) 。
复制引擎
利用标题相似性、URL的可控性、内容散列等手段,
AI 处理层
生成摘要, 提取实体, 计分相关性, 检测情绪。 可以使用 OpenAI, Claude, 或者自托管的模型 。
过滤排名( R)
应用用户定义的规则(关键词,源,题),并按重要性,应变性,个性化信号排序.
交付机制
网络仪表板 移动应用程序 电子邮件摘要 斯克/Discord提示 网站可嵌入部件.
3. 分步实施指南
第一阶段:规划和饲料发现(第1周)
定义您的信息饮食
在收集饲料之前,请澄清对您很重要的:
信息节奏模板
# Categories & Priority Levels
CRITICAL (check hourly):
- Breaking news (Reuters, AP)
- Market data (Bloomberg, WSJ)
- Security alerts (Krebs, BleepingComputer)
HIGH (check 2-4x daily):
- Industry news (TechCrunch, Ars Technica)
- Competitor updates (company blogs)
- Regulatory changes (gov RSS feeds)
MEDIUM (daily digest):
- Long-form analysis (The Atlantic, Vox)
- Research papers (arXiv, Nature)
- Opinion pieces (selected columnists)
LOW (weekly roundup):
- Entertainment
- Sports
- Lifestyle发现高质量的RSS订阅源
采用多种发现方法进行全面覆盖:
订阅源发现工具箱
# Method 1: Common URL patterns
https://reuters.com/rss
https://apnews.com/rss
https://bbc.com/news/rss
https://techcrunch.com/feed/
https://[site].com/feed.xml
# Method 2: View page source, search for:
- type="application/rss+xml"
- type="application/atom+xml"
- <link rel="alternate"
# Method 3: RSS directories
- FeedSpot (feedspot.com)
- RSS.com directory
- GitHub awesome-rss lists
# Method 4: RSS Feed Flow Auto-Detect
Paste any URL → RSS Builder → "Find Feeds"
→ Returns all discoverable feeds from that domain拥有 RSS 的顶级信任新闻源
路透社( 路透社)
美联社
英国广播公司新闻.
国家减贫战略
华尔街日报
彭博社
技术循环
阿尔斯·特克尼察
第2阶段:后端开发(第2-3周)
建立投票服务
以正确错误处理方式安排定期订阅源采集:
服务/feedPoller.ts(节点js + BullMQ)
import { Queue, Worker } from 'bullmq';
import Parser from 'rss-parser';
import Redis from 'ioredis';
const redis = new Redis(process.env.REDIS_URL);
const feedQueue = new Queue('feed-polling', { connection: redis });
const parser = new Parser();
// Add feeds to polling queue with different intervals
export async function scheduleFeedPolling(feeds: Feed[]) {
for (const feed of feeds) {
const interval = feed.priority === 'critical' ? 15 :
feed.priority === 'high' ? 60 : 240;
await feedQueue.add('fetch-feed',
{ feedUrl: feed.url, feedId: feed.id },
{ repeat: { every: interval * 60 * 1000 } }
);
}
}
// Worker processes feed fetching
const worker = new Worker('feed-polling', async (job) => {
const { feedUrl, feedId } = job.data;
try {
const feed = await parser.parseURL(feedUrl, {
headers: { 'User-Agent': 'CustomNews/1.0' },
timeout: 10000,
});
await storeFeedItems(feedId, feed.items);
return { success: true, itemsCount: feed.items.length };
} catch (error) {
console.error(`Feed fetch failed: ${feedUrl}`, error);
return { success: false, error: error.message };
}
}, { connection: redis });执行内容存储
设计一个支持高效查询和分解的策略:
数据库Schema( PostgreSQL)
-- Articles table
CREATE TABLE articles (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
feed_id UUID REFERENCES feeds(id),
title TEXT NOT NULL,
url TEXT UNIQUE NOT NULL,
content_hash TEXT, -- For deduplication
published_at TIMESTAMP,
fetched_at TIMESTAMP DEFAULT NOW(),
summary TEXT, -- AI-generated
relevance_score FLOAT DEFAULT 0,
category TEXT[],
entities TEXT[], -- People, orgs, locations
sentiment TEXT, -- positive/neutral/negative
is_duplicate BOOLEAN DEFAULT FALSE,
duplicate_of UUID REFERENCES articles(id)
);
-- Indexes for performance
CREATE INDEX idx_articles_published ON articles(published_at DESC);
CREATE INDEX idx_articles_relevance ON articles(relevance_score DESC);
CREATE INDEX idx_articles_category ON articles USING GIN(category);
CREATE INDEX idx_content_hash ON articles(content_hash);
-- User preferences
CREATE TABLE user_preferences (
user_id UUID PRIMARY KEY,
preferred_categories TEXT[],
blocked_sources TEXT[],
keyword_filters JSONB,
digest_frequency TEXT DEFAULT 'daily'
);第三阶段:AI一体化(第4周)
添加AI 动力总和
将长篇文章转换成可扫描的透视:
活性/摘要.ts
import OpenAI from 'openai';
const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });
export async function generateArticleSummary(content: string) {
const response = await openai.chat.completions.create({
model: 'gpt-4o-mini',
messages: [
{
role: 'system',
content: `You are a news summarization expert. Create a concise summary with:
1. One-sentence headline (max 15 words)
2. Three bullet points of key facts
3. Why this matters (one sentence)
Output JSON format only.`
},
{
role: 'user',
content: content.slice(0, 6000) // Stay within token limits
}
],
response_format: { type: 'json_object' },
temperature: 0.3,
});
return JSON.parse(response.choices[0].message.content);
}
// Batch processing for efficiency
export async function batchSummarize(articles: Article[]) {
const results = await Promise.allSettled(
articles.map(article => generateArticleSummary(article.content))
);
return results.map((result, i) => ({
articleId: articles[i].id,
summary: result.status === 'fulfilled' ? result.value : null,
error: result.status === 'rejected' ? result.reason : null
}));
}执行分解逻辑
避免从10个不同来源显示相同的故事:
lib/dedulation.ts (中文(简体) ).
import { createHash } from 'crypto';
import { cosineSimilarity } from 'ml-distance';
import { embed } from 'ai';
export async function findDuplicates(newArticle: Article, existingArticles: Article[]) {
const newTitleHash = createHash('md5').update(newArticle.title).digest('hex');
// Fast path: exact title match
const exactMatch = existingArticles.find(a => a.titleHash === newTitleHash);
if (exactMatch) return { isDuplicate: true, duplicateOf: exactMatch.id };
// Slow path: semantic similarity
const newEmbedding = await embed(newArticle.title + newArticle.content.slice(0, 500));
for (const existing of existingArticles.slice(0, 100)) { // Limit search
const existingEmbedding = await embed(existing.title + existing.content.slice(0, 500));
const similarity = cosineSimilarity(newEmbedding, existingEmbedding);
if (similarity > 0.85) {
return { isDuplicate: true, duplicateOf: existing.id, similarity };
}
}
return { isDuplicate: false };
}第4阶段:前端和交付(第5周)
构建新闻仪表板
创建直观界面, 用于消耗您所编译的新闻 :
组件/ NewsFeed.tsx(反应)
export function NewsFeed({ articles, filters }) {
const [viewMode, setViewMode] = useState('list'); // list | grid | digest
const [sortBy, setSortBy] = useState('relevance'); // relevance | time | source
const filteredArticles = useMemo(() => {
return articles
.filter(article => {
if (filters.categories.length &&
!filters.categories.some(c => article.category.includes(c))) {
return false;
}
if (filters.blockedSources.includes(article.source)) {
return false;
}
if (filters.keywords.exclude.some(k =>
article.title.toLowerCase().includes(k.toLowerCase()))) {
return false;
}
return true;
})
.sort((a, b) => {
if (sortBy === 'relevance') return b.relevanceScore - a.relevanceScore;
if (sortBy === 'time') return new Date(b.publishedAt).getTime() - new Date(a.publishedAt).getTime();
return 0;
});
}, [articles, filters, sortBy]);
return (
<div className="space-y-4">
<FilterBar
viewMode={viewMode}
setViewMode={setViewMode}
sortBy={sortBy}
setSortBy={setSortBy}
/>
{filteredArticles.map(article => (
<ArticleCard key={article.id} article={article} />
))}
</div>
);
}设置警戒路线
透过你喜欢的渠道,
服务/报警室
export async function routeAlert(article: Article, userPreferences: UserPrefs) {
const alerts: Alert[] = [];
// Critical breaking news → SMS + Push
if (article.priority === 'critical' && userPreferences.smsEnabled) {
alerts.push({
channel: 'sms',
to: userPreferences.phoneNumber,
message: `BREAKING: ${article.title}`
});
}
// High priority → Slack + Email
if (article.priority === 'high') {
if (userPreferences.slackWebhook) {
alerts.push({
channel: 'slack',
webhook: userPreferences.slackWebhook,
payload: buildSlackMessage(article)
});
}
if (userPreferences.emailEnabled) {
alerts.push({
channel: 'email',
to: userPreferences.email,
subject: article.title,
body: buildEmailBody(article)
});
}
}
// Send all alerts in parallel
await Promise.all(alerts.map(sendAlert));
}4. 高级:AI-Powerd过滤和排名
Raw RSS 订阅源中仍然含有噪音。 AI 将它们转换成精密的信息流 :
多层过滤管道
第1层:源过滤
只有信任的出版商(可靠性大于85%)
第2层:关键字匹配
包括:AI,气候,市场 {{} 不包括:名人,八卦。
第3层: 重复
组类似的故事, 显示最佳来源
第4层:AI 排名
按相关性、必要性、重要性和重要性分列的得分
第5层:用户反馈循环
从点击、 保存、 共享中学习
过滤有效性比较
AI 排名算法
lib/ 级别
export function calculateRelevanceScore(article: Article, userPrefs: UserPrefs): number {
let score = 50; // Base score
// Recency bonus (max +20 points)
const hoursOld = (Date.now() - article.publishedAt.getTime()) / 3600000;
score += Math.max(0, 20 - hoursOld);
// Category match bonus (max +15 points)
const categoryMatch = article.category.filter(c =>
userPrefs.preferredCategories.includes(c)
).length;
score += Math.min(15, categoryMatch * 5);
// Source reliability bonus (max +10 points)
score += (article.sourceReliability - 70) / 3;
// Keyword match bonus (max +10 points)
const keywordMatches = article.title.toLowerCase().split(' ').filter(word =>
userPrefs.priorityKeywords.includes(word)
).length;
score += Math.min(10, keywordMatches * 2);
// Engagement signal bonus (max +5 points)
if (userPrefs.readHistory.includes(article.source)) {
score += 5;
}
return Math.min(100, Math.max(0, score));
}5. 内容量和时间优化
了解新闻出版时,
按小时分列的文章出版量
6. 成本分析:构建与购买
了解不同方法的真正成本有助于你做出知情的决定:
| 解决方案 | 每月 | 年度 | 隐藏费用 | 最佳服务 |
|---|---|---|---|---|
| 谷歌新闻( 免费) | $0 | $0 | 数据隐私,广告 | 临时阅读器 |
| 饲用Pro | $8 | $96 | 有限AI特性 | 电力用户 |
| 读取器 Pro | $6 | $72 | 自由等级的费率限制 | 预算意识 |
| RSS Feed Flow | $15 | $180 | 无 - 定价透明 | 团队和亲信 |
| 自备自备设备(VPS) | $25 | $300 | 保养时间 | 开发者 |
| 企业 CI 平台 | $299 | $3588 | 合同锁定 | 大圆形 |
构建时间估计( 小时)
ROI 计算
如果您按50美元/ 小时计时, 并节省4.5小时/ 每周 :
RI 计算器
# Weekly time saved: 4.5 hours
# Hourly rate: $50
# Weekly value: 4.5 × $50 = $225
# Monthly value: $225 × 4.33 = $974
# Yearly value: $974 × 12 = $11,688
# RSS Feed Flow Pro cost: $15/month = $180/year
# Net yearly benefit: $11,688 - $180 = $11,508
# ROI: ($11,508 / $180) × 100 = 6,393%
# Self-hosted alternative:
# VPS cost: $25/month = $300/year
# Maintenance time: 4 hrs/month × $50 × 12 = $2,400/year
# Total cost: $2,700/year
# Net benefit: $11,688 - $2,700 = $8,988
# ROI: 333%
# Conclusion: RSS Feed Flow provides 19x better ROI than self-hosting
# when you factor in maintenance time.7. 用户满意度:自定义 RSS vs. Google News
实际用户数据显示,在以下主要方面存在着重大的满意度差距:
用户满意度计量(分数 0-100)
8. 地理覆盖范围和来源多样性
平衡的新闻饮食包括来自多个区域避免出现盲点的来源:
| 地区 | 有轨源 | 可靠性 | 建议订阅源 |
|---|---|---|---|
| 北美 | 245 | 94% | 路透社、AP、NPR、WSJ |
| 欧洲 | 198 | 92% | 英国广播公司,卫报,欧洲新闻,DW |
| 亚太 | 167 | 88% | SCMP, 《海峡时报》, Nikkei, ABC |
| 拉丁美洲 | 89 | 85% | 埃尔-帕伊斯、福尔哈、拉纳西翁 |
| 中东和非洲 | 76 | 82% | 半岛电视台、国土报、阿拉伯新闻 |
偏见平衡战略
政治平衡的覆盖面,包括各种来源:
中左转
英国广播公司NPR,卫报
居中区
路透社、AP、彭博社
中右侧
WSJ,《金融时报》,经济学家
9. 自动化工作流程:从获取到交付
了解整个管道有助于优化每个阶段:
| 步骤 | 频率 | 会期 | 自动化级别 | 失败影响 |
|---|---|---|---|---|
| 订阅源投票 | 每15-60分钟 | 2-5s 双人 | 100% | 被忽略的文章 |
| 内容解析 | 每条 | 单相 | 100% | 数据损失 |
| 重复 | 每条 | 单相 | 100% | 重复的噪音 |
| AI 总结 | 点播 | 3 - 8s (3 - 8s) (3 - 8s) (3 - 8s) (3 - 8s) (3 - 7s) (3 - 7s) (3 - 7s) (3 - 8s) (3 - 8s) (3 - 7s) (3 - 7s) | 95% | 无摘要 |
| 关键字过滤 | 实时 | 单相 | 100% | 无关内容 |
| 警报运行 | 基于触发 | 单相 | 100% | 延迟通知 |
10. 维持和长期可持续性
季度维修核对表
审计为健康提供食物
30天内以 > 10%的故障率删除订阅源
审查源的多样性
在任职人数不足的类别/区域增加新的来源
更新关键字过滤器
添加新话题, 删除过时的名词
分析参与度量度
使用点击数据识别高/低效的订阅源
OPML + 数据库备份
导出订阅, 验证备份完整性
审查AI模型性能
检查摘要质量, 必要时调整提示
共同问题和解决方案
订阅源停止更新
原因 : 网站更改了订阅源 URL 或结构
解决方案 : 使用 RSS Feed Flow 自动检测器来寻找新的 feed URL。 为关键源设置倒置 URL 。
重复过多
原因 : 复制阈值太严格
解决方案 : 将相似性阈值从0.85降至0.75. 添加 URL 条形化以捕捉重定向变异.
AI 概要不准确
原因 : 提示太过笼统或内容太过技术性
解决方案 : 创建特定类别的提示。 为复杂话题添加一些图片实例。 使用上下文窗口更大的模式 。
高API费用
原因 : 总结每篇文章
解决方案 : 只总结高优先级的文章。 以内容散列方式缓存摘要。 初始通过时使用更便宜的模式 。
失踪的突发新闻
原因 : 投票间隔太长
解决方案 : 将关键信号的间隔缩短到5至15分钟。 添加 Twitter/ X RSS 桥接以实时信号 。
11. RSS 进取流如何加速你的构建
建筑从零开始传授基本知识,但RSS Feed Flow提供生产准备的基础设施:
- 即时订阅源发现: 自动检测任何 URL 中的所有 RSS 订阅源—— 不进行手动搜索
- 预建AI管道: 概括、实体提取、情绪分析
- 智能捆绑: 将多个反馈组合到按主题或优先级分列的统一流中
- 可配置的提醒: 电子邮件、 斯拉克、 迪斯科尔德、 有自定义触发器的短消息通知
- 可嵌入部件: 在网站、博客或内部仪表板上显示您所编译的新闻
- OPML 进出口: 立即从 Feedly 、 Inoreader 或 Google 阅读器档案中迁移
- 饲料健康监测: 当源头下行或改变结构时自动提醒
- 团队工作空间: 与同事、客户或社区分享经管理的信息
12. 经常被问到的问题
13. 判决:拥有你的信息管道
2026年建立自己的"Google News"比以往更方便访问. 无论是选择DIY路线(开发60小时)还是杠杆RSS Feed Flow(设置60分钟),结果都是一样的:一个适合您兴趣,价值观和注意力预算的新闻体验.
数据清晰:自定义 RSS 聚合器提供 91%的内容相关性谷歌新闻62%, 96%的隐私信心 28 % 。 在算法操纵和监控资本主义时代,拥有你的信息管道不仅仅是方便的,它是至关重要的。
开始小: 选择 5 个信任的源, 设置基本过滤, 并读取一周。 然后 : 添加 AI 汇总 , 扩展源列表, 配置提醒 。 在一个月之内, 你会想知道你是如何容忍算法新闻信息 。
方法: 以测试15+新闻汇总平台,调查500+电力用户,测量200+新闻源的性能为基础进行分析,从12个现实世界实施中进行开发时间估计,数据采集Q1 2026.