[往日之影]1 浅谈RSS

优雅,实在是太优雅了

Steven-Zhl 头像
[往日之影]1 浅谈RSS

今天是周六,休息日就不聊正经的了,正好想开个新坑,讲讲互联网的一些往事,这个系列暂时就叫“往日之影”吧。(确实是借鉴的赛博朋克2077)

这是往日之影系列的第一篇,聊一聊RSS,一个曾经辉煌但有些落寞的技术。

引子

  • 好的,先问你个问题:十分熟悉互联网的你,说起获取信息的途径,你想到的是什么?
  • 嗯,反正应该没有人说电视…依托于蓬勃发展的互联网,各种信息平台应运而生:头条、微博、公众号、B站、知乎、小红书、以及贴吧、抖快,你的选择十分丰富。但…有时候选择太多了也不见得是个好事。
  • 刚刚提的这些平台难免会有以下的问题:平台繁多而自己时间有限、推荐算法带来的“信息茧房”、以及一些信息呈现方式你可能并不喜欢(例如我个人不喜欢短视频,以及每次看公众号看得正爽的时候突然插个贴片广告)
  • 我想,在这方面,人们追求的是更加自由、更加纯粹、更加简洁的信息获取方式。换句话说,就是

    优雅

优雅

其实我觉得很多新技术最初都是在追求优雅。

  • 那么接下来我将向你介绍:各种公众号的原初形态、二十多年前的优雅设计、互联网精神的绝对体现——RSS。

什么是RSS

  • 根据维基百科[1]的介绍,RSS(Really Simple Syndication)是一种消息来源格式规范,用以聚合多个网站更新的内容并自动通知网站订阅者。使用 RSS 后,网站订阅者便无需再手动查看网站是否有新的内容,同时 RSS 可将多个网站更新的内容进行整合,以摘要的形式呈现,有助于订阅者快速获取重要信息,并选择性地点阅查看。
  • 也就是说,RSS天生就是干“信息聚合”这个事的。兼听则明,偏听则暗,通过RSS,你可以订阅多个网站的内容,避免陷入单个平台的“信息茧房”。在此过程中,你的信息源将完全由你自己掌控,订阅内容通常也干净、精简、内容至上,颇有十多年前看报纸的感觉。它也充分体现了大家公认的互联网精神:开放、自由、去中心化。
  • 其实RSS出现的直接原因,只是因为它出现的时候互联网还是早期,没有一个比较完善的信息平台/门户网站提供信息服务。这时候在互联网上进行内容产出的大多数是个人。在作为信息获取者的用户看来,此时的信息太过琐碎,东一块西一块的,于是RSS应运而生。

RSS的发展

RSS标准有两条技术路线:基于RDF和基于XML。以下是使用版本号区分的的发展示意图:

graph TD rdf1[RSS 0.90,1999年,RDF] --> rdf2[RSS 1.0,2000年,RDF] rdf1 --> xml1[RSS 0.91,1999年,XML] --> xml2[RSS 0.92,2000年,XML] --> xml3[RSS 2.0,2002年,XML]
  • RSS 0.90:1993年3月,美国网景公司发布了第一版RSS标准:RDF Site Summary,基于RDF技术发布网站的摘要信息,并率先应用到自家门户网站My.Netscape.Com中。
  • RSS 0.91:同年7月,网景公司发布了第二版RSS标准:Rich Site Summary,最大的特点是将RSS的格式从RDF转换为XML。正是因为XML的简单易用,这版标准得以广泛采用。
  • RSS 1.0:2000年发布,是基于RDF的第一个官方版本,但是由于RDF技术本身的复杂性,导致RSS 1.0并没有得到广泛的应用。
  • RSS 0.92:同样于2000年发布,是基于0.91的改进版,它添加了一些新的元素,如包括<category><cloud>等,增加了对站点内容的描述。
  • RSS 2.0:由Dave Winer和UserLand公司于2002年发布,是一个非官方版本,基于0.92版本进行扩展,引入了更多的元素和特性,使得格式更加灵活。RSS 2.0因为简单易用,已经成为事实上的标准。

    不禁让我想起了TCP/IP取代OSI成为事实标准的故事。不过这个毕竟是写在计算机网络课本里的,不是野史,很多人应该都知道,就不多说了。

    • 此外,在2005年IETF发布了一个新的标准:Atom,它可以被视为RSS 2.0的改进版,和RSS 2.0的兼容度很高。虽然它们是不同的标准,但在实际使用中,许多RSS阅读器和发布工具都可以同时支持Atom和RSS 2.0格式的订阅源。

RSS技术闲聊

  • 当前RSS技术主要都是基于RSS 2.0的,所以这里主要讲讲RSS 2.0的技术细节。

一个幽灵,互联网技术的幽灵在虚拟世界徘徊。(指XML)

RSS 2.0的XML格式

  • 这么一篇简短的、出于科普性质的文章是没办法完全讲清楚RSS 2.0的,所以这里只是十分简略地介绍一下XML格式,以及一些常用的元素。

At the top level, a RSS document is a <rss> element, with a mandatory attribute called version, that specifies the version of RSS that the document conforms to. If it conforms to this specification, the version attribute must be 2.0.

Subordinate to the <rss> element is a single <channel> element, which contains information about the channel (metadata) and its contents.

  • 根据上述官网的说法[2],首先顶层必须是一个<rss>元素,且必须有一个version属性,当前就是2.0。在<rss>元素下,必须有一个<channel>元素,它包含了关于当前Channel的一些元数据和内容。
  • 随后在本页面的Required channel elements一节,介绍了一些必须的<channel>的子元素,包括<title><link><description>。这三种元素的作用从元素名就能直接理解,就不多说了。
  • Optional channel elements一节,介绍了一些可选的<channel>的子元素,如<language><copyright><pubDate><category><generator><docs>等,种类很多,详细内容请自己访问规范页面自己学习吧
  • 最后,我放一篇RSS 2.0的官方示例[3],可以参考一下:
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
  <channel>
    <title>NASA Space Station News</title>
    <link>http://www.nasa.gov/</link>
    <description>A RSS news feed containing the latest NASA press releases on the International
      Space Station.</description>
    <language>en-us</language>
    <pubDate>Tue, 10 Jun 2003 04:00:00 GMT</pubDate>
    <lastBuildDate>Fri, 21 Jul 2023 09:04 EDT</lastBuildDate>
    <docs>https://www.rssboard.org/rss-specification</docs>
    <generator>Blosxom 2.1.2</generator>
    <managingEditor>neil.armstrong@example.com (Neil Armstrong)</managingEditor>
    <webMaster>sally.ride@example.com (Sally Ride)</webMaster>
    <atom:link href="https://www.rssboard.org/files/sample-rss-2.xml" rel="self"
      type="application/rss+xml" />
    <item>
      <title>Louisiana Students to Hear from NASA Astronauts Aboard Space Station</title>
      <link>
        http://www.nasa.gov/press-release/louisiana-students-to-hear-from-nasa-astronauts-aboard-space-station</link>
      <description>As part of the state's first Earth-to-space call, students from Louisiana will
        have an opportunity soon to hear from NASA astronauts aboard the International Space
        Station.</description>
      <pubDate>Fri, 21 Jul 2023 09:04 EDT</pubDate>
      <guid>
        http://www.nasa.gov/press-release/louisiana-students-to-hear-from-nasa-astronauts-aboard-space-station</guid>
    </item>
    <item>
      <description>NASA has selected KBR Wyle Services, LLC, of Fulton, Maryland, to provide mission
        and flight crew operations support for the International Space Station and future human
        space exploration.</description>
      <link>http://www.nasa.gov/press-release/nasa-awards-integrated-mission-operations-contract-iii</link>
      <pubDate>Thu, 20 Jul 2023 15:05 EDT</pubDate>
      <guid>http://www.nasa.gov/press-release/nasa-awards-integrated-mission-operations-contract-iii</guid>
    </item>
    <item>
      <title>NASA Expands Options for Spacewalking, Moonwalking Suits</title>
      <link>
        http://www.nasa.gov/press-release/nasa-expands-options-for-spacewalking-moonwalking-suits-services</link>
      <description>NASA has awarded Axiom Space and Collins Aerospace task orders under existing
        contracts to advance spacewalking capabilities in low Earth orbit, as well as moonwalking
        services for Artemis missions.</description>
      <enclosure
        url="http://www.nasa.gov/sites/default/files/styles/1x1_cardfeed/public/thumbnails/image/iss068e027836orig.jpg?itok=ucNUaaGx"
        length="1032272" type="image/jpeg" />
      <pubDate>Mon, 10 Jul 2023 14:14 EDT</pubDate>
      <guid>
        http://www.nasa.gov/press-release/nasa-expands-options-for-spacewalking-moonwalking-suits-services</guid>
    </item>
    <item>
      <title>NASA to Provide Coverage as Dragon Departs Station</title>
      <link>
        http://www.nasa.gov/press-release/nasa-to-provide-coverage-as-dragon-departs-station-with-science</link>
      <description>NASA is set to receive scientific research samples and hardware as a SpaceX
        Dragon cargo resupply spacecraft departs the International Space Station on Thursday, June
        29.</description>
      <pubDate>Tue, 20 May 2003 08:56:02 GMT</pubDate>
      <guid>
        http://www.nasa.gov/press-release/nasa-to-provide-coverage-as-dragon-departs-station-with-science</guid>
    </item>
    <item>
      <title>NASA Plans Coverage of Roscosmos Spacewalk Outside Space Station</title>
      <link>http://liftoff.msfc.nasa.gov/news/2003/news-laundry.asp</link>
      <description>Compared to earlier spacecraft, the International Space Station has many
        luxuries, but laundry facilities are not one of them. Instead, astronauts have other
        options.</description>
      <enclosure
        url="http://www.nasa.gov/sites/default/files/styles/1x1_cardfeed/public/thumbnails/image/spacex_dragon_june_29.jpg?itok=nIYlBLme"
        length="269866" type="image/jpeg" />
      <pubDate>Mon, 26 Jun 2023 12:45 EDT</pubDate>
      <guid>http://liftoff.msfc.nasa.gov/2003/05/20.html#item570</guid>
    </item>
  </channel>
</rss>
  • 订阅后效果如下:

feedly订阅效果

什么是“Feed”

  • Feed指“订阅源”,可以说是RSS中的核心功能。Feed的本质就是一个XML文件,它包含了一些元数据和内容(详见上文RSS 2.0的XML格式),用于描述一个网站的更新内容。
    • 但它毕竟只是个文件,需要有人定期更新才能保证信息的及时性。在一些提供RSS服务的网站(如阮一峰大佬的个人博客),Feed的更新是由网站的管理员来完成的。但鉴于现在大多数网站已不提供RSS服务了,现在这个工作由一些第三方服务商或其他工具来完成,如Feedity、FeedBurner,以及RSSHub项目等。
  • 无论是RSS 2.0还是Atom,都是Feed的一种实现。Feed的格式有很多种,但是最常用的就是RSS 2.0和Atom,它们都是XML格式的。

RSS的分发原理

其实这很简单….

  • 一般来说,如果某网站提供了RSS服务,那么它应当会提供一个URL,用于获取Feed的XML文件。当用户在RSS阅读器输入该链接订阅后,阅读器会定期或动态地向该链接请求Feed文件,解析其中的内容并展示给用户。
  • 而在大多数网站已不再提供RSS服务的当下,提供订阅链接的工作就交给了一些第三方服务商或工具,如上文提到的这三个项目。

2023年,当下该如何使用RSS

我想大多数人其实对原理并不太感兴趣吧,如何使用RSS才是重点吧。以下两部分是作为一个用户,最常用的两种工具。

服务商:Feedly & Inoreader

我只用过Feedly和Inoreader,抱歉只能聊这俩了。

  • Feedly和Inoreader都是目前主流的RSS平台——为什么是平台呢,因为它们不仅仅提供了RSS阅读功能(不仅是一个RSS信息阅读器),还提供了不少附加功能,比如最重要的自动刷新RSS订阅内容,Feed的搜索、推荐、分享,以及借助这些平台实现的跨设备同步订阅。
  • 二者的界面都做的不错,不分高下,反正比我这个小网站做的好多了。

RSS平台移动端界面对比

  • 此外这两者都提供了付费内购,可以解锁更多功能,如更多的订阅量…不过我觉得免费版的订阅数(Feedly 100个,Inoreader 150个)已经够用了。
  • 个人认为非要争个高下的话,Inoreader更胜一筹,因为它的本地化比Feedly更好,不仅界面汉化程度更高,而且有免翻域名(https://www.innoreader.com/),对国内用户更友好。

阅读器:Fluent Reader & ReadYou

如果你不想将你的订阅暴露到Feedly或Inoreader这样的平台,那么你可以选择使用纯粹的RSS阅读器,它们的原理很简单,就是从RSS订阅源拉取包含订阅信息的XML,然后渲染。

  • 如果是纯粹的RSS阅读器的话,选择就非常多了…下面是我常用的两个,也是比较有名的选择。

Fluent Reader

https://github.com/yang991178/fluent-reader

  • Fluent Reader是一个使用React开发、Electron封装的跨平台的开源RSS阅读器,软件名中的Fluent是指它的界面设计风格为微软的Fluent Design,这也是我选择它的原因之一。
  • 正是因为Electron的跨平台特性,Fluent Reader提供了Windows、MacOS、Linux三端的发行版,并且由于编程语言是TypeScript而非JavaScript,软件的性能也不错,使用起来很流畅。

Fluent Reader主页效果

  • 此外,它有很多细节设计的也不错,比如可以给每个订阅源自定义名称、图标、抓取频率。当然,给订阅源分组的功能自然也是有的。

Fluent Reader订阅源细节项

  • 还有一点值得吹的是,它提供了一个自定义规则功能,能够根据预设的规则(其实是正则表达式)对订阅源进行过滤。什么意思呢?咱们举个例子:
    • 比如下图的“差评”,他们写的科技类文章不错,我很喜欢看,所以订阅了。但是他们有一个栏目叫“今日最佳”,我并不喜欢看,所以我希望这个栏目不要出现,这时就可以用自定义规则过滤掉。
    • 如下图,正则表达式为^今日最佳,意思是匹配标题以“今日最佳”开头的文章。对于这样的文章进行什么操作呢?干脆标为已读并直接隐藏吧,按照这样的思路配置后,就是下图的效果了。
    • 此外,能看到在这一页作者还提供了测试条件的功能,在设定好规则之后,你可以直接复制一个想屏蔽的文章标题拿来测试,方便你修改出错的地方。

Fluent Reader自定义规则

ReadYou

https://github.com/Ashinch/ReadYou

  • ReadYou是一个使用Kotlin开发的Android端开源RSS阅读器。可以这么说,它的功能并不是最大特点,最大特点(我认为)是Material You,以及Monet取色。如果你是用的是原生安卓,这个软件的界面将会和你的系统UI完全一致,这种体验是其他软件无法比拟的。

ReadYou主页效果

  • 这个软件完全契合系统Material Design的设计语言,界面就是谷歌那种感觉:简洁,优雅。进行阅读的时候体验也不错,可以自定义字体、字号、行间距、夜间模式等,对于一个简单的阅读器来说,够用了。

ReadYou阅读效果

工具:RSSHub

RSSHubRSSHub
  • 如果只有RSS阅读器或者RSS平台,但没有Feed订阅源的话也是没用的,正是“巧妇难为无米之炊”。
  • 事实上,这个问题也困扰了众多RSS用户多年,直到一个神奇的开源项目的出现——RSSHub
  • 其实它的工作原理类似于爬虫——官方文档的FAQ[4]中问题RSSHub是如何工作的?的回答如下:

Q: RSSHub 是如何工作的?

A: 请求路由时,RSSHub 会按照给定规则请求源站数据,然后以 RSS 格式输出;如果在设定缓存时间内重新请求路由,则会直接返回缓存内容,不请求源站;再加一点点魔法。

如何实际操作

以Inoreader为例,其他RSS阅读器或平台类似。

  1. 下载并登录账号,进入主界面
  2. 在“订阅源”一栏点击“新增”(手机端点击“订阅源”旁边的加号)
  3. 先尝试在订阅源搜索(如“量子位”),如果有的话直接点击关注即可。 搜索订阅源
  4. 如果这里没有信息源的话,那就要用到RSSHub了。请自行访问RSSHub的官方文档,搜索自己想订阅的信息源类型(例如想订阅的类型是知乎用户的专栏文章,那么搜索“知乎专栏”,就能看到相关的搜索结果,点开后自行按照介绍内容,撰写订阅链接,然后贴在上图的输入框中。)
  5. 如果RSSHub也没有…骚年,你懂JavaScript吗?欢迎你给RSSHub添砖加瓦啊!
  6. 此外,RSSHub的主服务器域名rsshub.app也是被墙的…这点我也很无奈,不过你可以自己搭建一个RSSHub,或者使用其他人搭建的RSSHub,具体嘛,详见官方文档。

参考资料

  1. RSS | 维基百科
  2. RSS 2.0 Specification (Current)
  3. (官方示例) rssboard.org/files/sample-rss-2.xml
  4. 常见问题 | RSSHub

延伸阅读

好了,今天就瞎扯聊到这里,祝你今天过得愉快。