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. 無論是自託管還是非自託管。 ↩︎