前言
本文分为两篇文章。本篇讲原理,下一篇讲详细搭建步骤。
适用人群:编程基础 >= 初级。
背景
早年,我使用rss的方式是:feedly、inoreader。但是收费,且可订阅的源有限,像即刻、知乎feed没法订阅。
后来发现了rsshub,万物皆可rss,打开了新世界的大门。
然而好景不长,没过多久,rss阅读器、rsshub纷纷被蔷:
虽然科学上网可以解决问题,但是多一个步骤就会严重影响体验。
在查阅资料后,终于摸索出一套「完美」的解决方案。
预期
在手机、pc上,不科学上网,就能拉取和阅读我想要的rss源,且免费或廉价。
解决方案
概述
由 阅读器 + rss服务 + rss生成器 + rss探测器 组成:
fluent reader(免费跨端阅读器)+
freshrss(用于管理订阅源及暴露fever api供阅读器使用)+
rsshub(用于生成订阅源)+
rsshub radar(用于嗅探订阅源,以及一键录入到freshrss)
为了避免蔷,rss服务、rss生成器需要独立部署。
下面分别介绍一下各part。
fluent reader -- 阅读器
一款开源的跨端(移动+桌面)rss阅读器,不收集个人数据。
它提供了服务模式,即把订阅源交给外部服务管理,自身作为一个阅读器及外部服务的代理。
我选择了「fever api」服务模式,只要对应的服务实现了fever api,就可以使用,比如freshrss、tiny tiny rss。
进入软件后,会通过服务提供的fever api拉取订阅源。当点击开始阅读文章时,也会通过fever api发送请求,在外部服务端将文章标注为已读,这样不管在桌面还是手机,都可以获取到相同的阅读状态。
freshrss -- rss管理服务
一款开源的rss源管理软件,支持多用户、分类、打标签,以及丰富的订阅配置,比如数据清理配置。
最重要的是提供了fever api、google reader compatible api,让支持这些api的阅读器可以方便代理。
rsshub -- rss集散地
一个开源易扩展的rss生成器,简单来说:让万物皆可rss。
对于读者来说,它是一个rss集散地。
对于开发者来说,它本质上是一个爬虫路由及解析服务。开发者可以通过got、cheerio等库,来抓取网页数据,交由rsshub生成rss源。
从一个爬虫例子可见一斑:
const got = require('@/utils/got');
module.exports = async (ctx) => {
const response = await got({
method: 'get',
url: `https://app.blockmeta.com/w1/news/list?num=30&cat_id=4481&page=1`,
headers: {
from: 'web',
Referer: `https://www.8btc.com/flash`,
},
});
const newsflashes = response.data.list;
let newsflashesList = [];
for (let i = 0; i < newsflashes.length; i++) {
newsflashesList = newsflashesList.concat(newsflashes[i]);
}
const out = newsflashesList.map((item) => {
const pubDate = item.post_date_format;
const link = item.source.link;
const title = item.title;
const description = item.content;
const single = {
title,
link,
pubDate,
description,
};
return single;
});
ctx.state.data = {
title: `快讯 - 巴比特`,
link: `https://www.8btc.com/flash`,
item: out,
};
};
rsshub radar -- rss探测器
一款用于探测rss源的chrome插件。
比如你访问某个知乎用户的主页,rsshub radar会自动探测页面里的rss源,并且可以一键添加进freshrss:
connect them together!✨
不必再被限制:
其整体使用方式如下:
结语
本篇介绍了一种rss解决方案及其运行原理,旨在达成目标:在手机、pc上,不科学上网,就能拉取和阅读想要的rss源,且免费或廉价。
下篇文章将介绍:如何一步一步构建属于你自己的解决方案。