Featured image of post 重新撿起 RSS:RSSHub + FreshRSS 建立我的資訊流

重新撿起 RSS:RSSHub + FreshRSS 建立我的資訊流

RSS 閲讀體驗極佳,但現在訂閲源越來越少,網絡也越來越閉塞。想要重新撿起 RSS,就需要一些折騰了。

不知從什麼時候開始,我的生活就慢慢的被推薦演算法淹沒,推薦影片、猜你喜歡……,幾乎每天,我都或多或少的被他們所影響。我曾半開玩笑:「網速越快,其傳遞的資訊就越少」,甚至有些一語成讖。這並不是網際網絡能傳遞的資訊變少了,而是越來越快的網速、越來越準的推薦演算法養廢了我們,奪走了我們從網上獲取資訊的能力與主動權。

RSS 已是資訊獲取手段中的老古董了,但它的體驗真的一點都不老古董:相反,用它來獲取資訊,體驗極佳——不光無廣告,還能讓那些分散在一個一個網頁上的資訊自動跑到你面前,豈不美哉?我沒有經歷過那個時代,但聽聞當年的大家,人人都拿着 Google Reader(Google 打造的 RSS 閲讀器)讀他們想讀的內容,倒也真想回到那個年代體驗一番。

可惜 Google Reader 這一產品早就關停了,曾經大多數網站都提供的 RSS 訂閲源也悉數消失,想要重新拾起 RSS,就需要一點折騰了。

RSSHub:萬物皆可 RSS

這是 DIYDogDIYGod 大佬發起的專案,就和它的標語一樣,萬物皆可 RSS,這個專案能透過爬取網頁內容的方式生成 RSS 資訊流,從而透過 RSS 訂閲本不支援 RSS 的網站。

由於是爬取,難免會受到目標網頁反爬取策略的影響,而有的目標網頁(比如大陸的政府網站)會遮蔽他國 IP 的訪問,亦或者遮蔽掉風險 IP。這些因素就比較考驗機房了,但只要不是被特別「照顧」的 IP,一般問題不大。出於這些原因,我在分別在洛杉磯和上海部署了 RSSHub。

Docker 部署 RSSHub 非常簡單,首先拉取已經寫好的docker-compose.yml

1
2
$ mkdir rsshub && cd rsshub
$ wget https://raw.githubusercontent.com/DIYgod/RSSHub/master/docker-compose.yml

然後檢查有無需要修改的配置:

1
$ vim docker-compose.yml

我最終修改完成後,配置如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
version: "3"

services:
  rsshub:
    image: diygod/rsshub:chromium-bundled
    restart: always
    ports:
      - "1200:1200"
    environment:
      NODE_ENV: production
      CACHE_TYPE: redis
      REDIS_URL: "redis://redis:6379/"
    depends_on:
      - redis

  redis:
    image: redis:alpine
    restart: always
    volumes:
      - redis-data:/data

volumes:
  redis-data:

為什麼要新建一個 Redis 映象?主要是懶得配置容器互聯,而 RSSHub 用 Redis 佔不了多少資源,遂直接寫進一個docker-compose.yml裏,省去容器互聯的麻煩。

啓動編排:

1
$ docker compose up		# 老的寫法是 docker-compose up

隨後使用 Nginx 反代localhost:1200至域名,部署 SSL 證書,RSSHub 就全部搭建完成了。

反爬嚴格網站的部分解決

前面已經提到由於 RSSHub 的工作原理是爬取,其勢必會受到不同網站反爬策略的影響。以 B 站為例,如果僅僅部署 RSSHub 而不採取任何措施,當你訂閲時,大機率會出現「521 - 風控校驗失敗」的提示。

這時,先去查詢 RSSHub 的文件,看看相應的網站是否有 Cookie 可以被設定為容器的環境變數,對於大部分需求,只要環境變數配置正確,就可以有效緩解反爬問題。

還是以 B 站為例,查閲 RSSHub 文件,可以發現有一些額外的環境變數需要配置。1

大量的網站需要額外配置 複製 Cookie 欄位

按照文件,開啓對應的網頁,按下 F12 開啓開發者工具,轉到「網絡」面板,重新整理網頁,就可以找到 dynamic*new 請求,複製整個 Cookie(或者 SESSDATA=xxx;欄位),修改docker-compose.yml檔案,將BILIBILI_COOKIE*你的B站UID: "SESSDATA=xxx"新增到environment部分,即可完成配置。

配置好的docker-compose.yml看起來像下面這樣:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
version: "3"

services:
  rsshub:
    # two ways to enable puppeteer:
    # * comment out marked lines, then use this image instead: diygod/rsshub:chromium-bundled
    # * (consumes more disk space and memory) leave everything unchanged
    image: diygod/rsshub:chromium-bundled
    restart: always
    ports:
      - "1200:1200"
    environment:
      NODE_ENV: production
      CACHE_TYPE: redis
      REDIS_URL: "redis://redis:6379/"
      BILIBILI_COOKIE_你的B站UID: "SESSDATA=xxx"
    depends_on:
      - redis

  redis:
    image: redis:alpine
    restart: always
    volumes:
      - redis-data:/data

volumes:
  redis-data:

修改檔案並儲存,重啓編排:

1
2
$ docker compose up -d --force-recreate
# docker-compose up -d --force-recreate

配置完成後,即可正常訂閲 B 站 Up 主投稿等相關路由。

RSS 閲讀器推薦

RSSHub 可以解決掉大多數訂閲源的問題,接下來推薦幾個 RSS 閲讀器,解決的是最後一步如何呈現到裝置上的問題。

Windows

Fluent Reader

我目前在用的 RSS 閲讀器,開源小巧,遵循 Fluent Design,如果需要 Windows 上的免費 RSS 閲讀器,那麼大機率就是它了。需要注意的是,這是開源軟件,但在應用商店裏需要付費才能下載,不想付費則可以直接在 GitHub 上下載其安裝包安裝,當然,如果喜歡,鼓勵大家支援這個專案。

ThunderBird

這個不是 RSS 閲讀器,但也提供了 RSS 功能,比較適合打造郵件 RSS All in one。

ThunderBird 是由 Mozilla 基金會開發的一款開源郵件和新聞聚合客户端,已經有快 20 年的歷史。

MacOS 和 iOS

NetNewsWire

開源,Swift UI 原生編寫,幾乎完美的 RSS 閲讀器,説實話我很驚訝這位作者維護這個專案的時間跨度。

NetNewsWire 是由 Brent Simmon 出於愛好和支援 RSS 發展開發的 RSS 閲讀器,遺憾的是,由於是 Swift UI 編寫,只支援 Mac OS 和 iOS。

Reeder

這個就是收費 App 了,但功能做的很不錯。作為「骨灰級」應用,Reeder 一度被人稱為 iOS 與 macOS 上最好用的 RSS 閲讀器。不光設計精緻,還支援如桌面小元件等各種 Mac OS 和 iOS 上原生的功能,如果你的預算充足,可以考慮。

Fluent Reader

又是之前提到的 Fluent Reader 也提供了 Mac 版本,實測在 Mac OS 上體驗也還不錯,在 iOS 上雖然看起來是原生 UI,但實際上是 React 寫的跨平台版本,而且還需要收費,如果想要支援這個專案,可以考慮購買。

連結:

Linux

NewsFlash

NewsFlash 也是很現代化的 RSS 閲讀器

NewsFlash is a program designed to complement an already existing web-based RSS reader account.

It combines all the advantages of web based services like syncing across all your devices with everything you expect from a modern desktop program: Desktop notifications, fast search and filtering, tagging, handy keyboard shortcuts and having access to all your articles for as long as you like.

這是一個很現代化的 RSS 閲讀器,一般用 flatpak 安裝,也有人為其製作了 Snap 封裝的版本,不過幾乎不怎麼更新維護。它的介面很好看,對線上服務2支援的很全,而且是原生執行,非常推薦。

Fluent Reader

又雙叒是 Fluent Reader,跨平台這麼容易嗎。

有人給它製做了 Snap 封裝的 App,Ubuntu 可以直接去應用商店下載使用。官方倉庫裏提供了 AppImage 給其它分支使用。

安卓

Fluent Reader

又雙叒叕是 Fluent Reader,在安卓上,Fluent Reader 依然是貼合 iOS 的 UI,用起來有點牛頭人的感覺,若不在意這一點,體驗倒還不錯。

FeedMe

評論區網友的推薦,FeedMe 支援的服務繁多,功能齊全,介面也較為現代化,一樣支援 FreshRSS 等線上 API。

如果有其他好用的 RSS 閲讀器歡迎在評論區留言。

總感覺還缺點什麼?

理論上來説,解決了訂閲源的問題,還解決了呈現在裝置上的問題,我們已經還原出 Google Reader 的體驗了,但我在實際使用中,總是覺得缺少了一些特性,體驗並不完整。

這個特性就是「同步」。我所希望的,是我在 A 裝置上閲讀,閲讀進度可以同步到 B 裝置上,在 A 裝置上收藏的文章,開啓 B 裝置,能原封不動的呈現在我眼前。

同時,還有一個體驗上的要求:我希望我在拉取 Feed 時更加快速,不需要等待 RSSHub 抓取網頁。

於是,一個自託管的 RSS 聚合服務就很有必要了。

以 FreshRSS 完善體驗

FreshRSS 是一個免費,自託管的 RSS 聚合器,相似的專案還有 Tiny Tiny RSS(TTRSS),選擇 FreshRSS 是因為它提供兩種 API,和各個 RSS 客户端配合的更好。

Github倉庫:https://github.com/FreshRSS/FreshRSS

部署

部署 FreshRSS 的過程也很輕鬆。

建立目錄:

1
2
$ mkdir freshrss
$ cd freshrss

建立docker-compose.yml

1
$ vim docker-compose.yml		# 或者任意編輯器編輯

docker-compose.yml如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
version: "3"

services:
  freshrss:
    image: freshrss/freshrss:latest
    container_name: freshrss
    restart: unless-stopped
    ports:
      - "9999:80" # 將9999更改成需要的埠
    volumes:
      - ./data:/var/www/FreshRSS/data
      - ./extensions:/var/www/FreshRSS/extensions
    environment:
      PUID: 0
      PGID: 0
      CRON_MIN: "1,31"
      TZ: "Asia/Shanghai"

最後執行:

1
$ docker compose up		# 老的寫法是 docker-compose up

隨後反代埠,部署 SSL 證書。初始設定時,數據庫選現有的數據庫型別,如果沒有部署數據庫,直接選 SQLite 即可。至此,FreshRSS 部署完成。

如果之前有訂閲源,將其以 OPML 格式匯出,然後匯入 FreshRSS 就可以獲得幾乎無縫的體驗。

![FreshRSS](截圖2023-07-18 15.17.39.png)

如果有現成的 PHP 環境而不想用 Docker 部署,還可以像安裝 Wordpress 一樣安裝好 FreshRSS。

設定 FreshRSS

RSSHub 充當的是提供訂閲源的中心,而 FreshRSS 充當的是一個閲讀訂閲源的「Hub」,幫助我們集中管理訂閲源,同步各裝置間的閲讀進度。現在訂閲源已經集中管理起來,同步個裝置間的閲讀進度就需要 FreshRSS 提供的 API 了。

FreshRSS 提供 GReader 和 Fever 兩種 API,具體的啓用方法如下:

  1. 登入 FreshRSS 進入「設定」->「認證」開啓「允許API 訪問」
  2. 進入「賬户」在頁面底部設定一個 API 金鑰
  3. 編輯./freshrss/data/config.php中的base_url,改為你的域名根目錄地址,比如我的就需要改成https://rss.l3zc.com/
  4. 轉到https://example.com/api/檢視檢測是否透過

修改FreshRSS的配置示例1 FreshRSS config.php 檔案

FreshRSS API 測試全部透過

設定各裝置上的客户端

NetNewsWire

部署完成後,在手機上和電腦上支援的應用裏使用設定好的用戶名稱和 API 金鑰登陸,就可以享受到全程絲滑的 RSS 體驗了,下面以 NetNewsWire 為例:

NetNewsWire整合FreshRSS

開啓NetNewsWire新增賬號的選項卡,NetNewsWire貼心的整合了FreshRSS,可以很方便的新增賬號:

登陸資訊

NetNewsWire 要求 Greader 的 API,直接在 /api 上覆制就可以了。

NetNewsWire效果

FluentReader

在設定中選擇 Google Reader API:

FluentReader設定

然後填入相關資訊:

  • API端點直接從/api網頁上覆制 Google Reader API 的 API 端點即可
  • 用戶名稱填寫安裝 FreshRSS 時設定的用戶名稱
  • 密碼是前文設定的 API 秘鑰

即可設定完成。

其他的客户端設定大同小異,無外乎上面兩大類,可以蔘考上面的方法進行設定。

RSS 訂閲什麼呢

我們已經裝好了 RSSHub,這極大的方便了我們的訂閲以及豐富了我們的訂閲源。RSSHub 的官方文件中維護着一份詳細的支援列表,支援的專案不可謂不繁多:媒體、部落格……甚至大學通知,Twitter 更新都能覆蓋。

以訂閲「湖南省政府採購網」的「採購公告」為例,首先需要在 RSSHub 的文件中找到「湖南省政府採購網」以獲取其訂閲的「路由」:

湖南省政府採購網的RSSHub文件

查詢文件可知我們所需要的路由是/gov/hunan/notice/:type,其中:type是一個必選引數,我們需要獲取的是「採購公告」所以:type應該是cg,最終需要的路由就是/gov/hunan/notice/cg。將這個路由附加在我們部署(反代)RSSHub 的網址後,即可得到完整的訂閲地址,例如:部署rsshub的網址是https://rsshub.app,則最終的訂閲地址為:https://rsshub.app/gov/hunan/notice/cg,將其加入 FreshRSS 的訂閲即可。

需要注意的是,FreshRSS 似乎不支援自動轉換訂閲連結裏的非 ASCII 字元,如果你的訂閲連結裏含有這些字元,如https://rsshub.app/sspai/tag/派早報,則建議在瀏覽器內先訪問一下,再將轉換後的連結貼上進 FreshRSS 以轉換連結中的非 ASCII 字元。

對於原本就有 RSS 的網站,推薦使用 RSSHub Radar,這是一款瀏覽器外掛,可以實現 RSS 訂閲源的自動嗅探,而不必在網站上四處尋找。推薦它是因為,它不光可以嗅探 RSS 連結,如果目標網站可以用 RSSHub 訂閲,這個外掛可以自動匹配支援的 RSSHub 路由。

最後……

經過了這一番折騰,基本體驗到了當時人人都用着 Google Reader 的樂趣。即便如此,屬於 Google Reader 的時代終究還是過去了,那個人人都可以從網上收穫純粹的知識與快樂的時代,也已然一去不復返。這些年來網速越來越快,但給我的上網體驗卻越來越差。大多數人都開始上網的時候,內容農場,推薦演算法……只要有利可圖,網際網絡精神,那個曾經作為網際網絡基石的精神,就全被這些追逐利益的資本和官商勾結的政府拋在腦後。我甚至可以説:至少在中國,那個曾經「網際網絡」的理想已死。

RSS 的沒落只是大環境的縮影,「技術」固然需要進步,但沒有與之相匹配的「人文」,這種進步就會成為一場災難。以我們現在的狀態來看,賽博朋克真的離我們不遠——技術進步,不但不能消除不平等,反而會加劇壓迫與控制。

即使大環境再怎麼黑暗,我們依然能看到一線生機,依然會有人去發揚幾乎被大環境拋在腦後但彌足珍貴的網際網絡精神,散發光和熱,透過自己的方式捍衞網際網絡的開放與自由。

感謝所有這些開源專案的貢獻者,也向所有熱愛分享的同路人致敬。

蔘考

以及這篇文章裏所有提到的連結。


  1. 近期 RSSHub 經歷了一次大重構,相應地,新增的路由所需的環境變數配置可以在路由對應文件處找到,而不需要翻閲「部分 RSS 模組配置」這一部分。 ↩︎

  2. 無論是自託管還是非自託管。 ↩︎