前言

Google Reader 在 2013 年的下线似乎标志着 RSS 黄金时代的结束。在那之后,虽然陆续出现过很多替代品,但 RSS 的地位已经被无限刷新的信息流、算法推荐等新技术逐渐取代了(来自少数派文章)。

虽然 RSS 服务对用户要求较高,逐渐被各种各样的平台替代,但其信息来源灵活,对有一定动手能力的用户的来说利大于弊。因此本文记录自建 RSS 源获取、管理工具的流程,免得后续忘记需要重新翻找文档。

RSSHub

首先是 RSS 订阅获取,这里推荐著名的 RSSHubGitHub 地址如下:

RSSHub

详细的说明可以在项目文档找到,下面是服务器部署的方式:

 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
28
29
30
31
32
33
34
35
36
37
version: "3.9"
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
    restart: always
    ports:
      - 1200:1200
    environment:
      NODE_ENV: production
      CACHE_TYPE: redis
      REDIS_URL: redis://redis:6379/
      PUPPETEER_WS_ENDPOINT: ws://browserless:3000 # marked
      # ACCESS_KEY: password # 访问限制密钥
    depends_on:
      - redis
      - browserless # marked
  browserless:
    # marked
    image: browserless/chrome # marked
    restart: always # marked
    ulimits:
      # marked
      core:
        # marked
        hard: 0 # marked
        soft: 0 # marked
  redis:
    image: redis:alpine
    restart: always
    volumes:
      - redis-data:/data
volumes:
  redis-data: null
networks: {}

个人建议在配置中写入访问限制设置,以免别人盗用你的地址,将 ACCESS_KEY 后替换为自己的密码即可。

配置好后访问密钥 key 可直接访问所有路由,例如:https://rsshub.app/qdaily/column/59?key=ILoveRSSHub

也可以通过 md5 生成访问码访问,官方的文档说明如下:访问控制配置

之前可以部署到 Vercel 平台,但是新版本部署出现问题,只能部署以前的分支,不过目前开发者在重写项目,可以等项目重构后再部署到 Vercel 等。

RSSHub Radar

除了项目支持的链接外,你也可以通过 RSSHub Radar 工具来显示当前页面的订阅,如下图:

<strong>e46843b9ef968d8f84d07990c11fe4f2</strong>

工具的地址如下:

其他 RSS 源推荐

推荐两个其他的 RSS 订阅获取地址:

RSS 订阅管理

获取到订阅源后就需要管理订阅,目前如 FeedlyInoreader 等等都是非常不错服务商,比如 Inoreader 可以非常详细地自定义筛选订阅规则,如去重等,就是不免费,所以可以尝试自建管理工具,这里推荐两个开源的项目:FreshRSSMiniflux

FreshRSS

FreshRSS 是一个轻量、自托管的 Feed 聚合器,支持插件系统,部分应用如 Reeder

就支持直接添加 FreshRSS 账户,项目地址如下:

FreshRSS

FreshRSS

部署如下

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

services:
  freshrss:
    image: freshrss/freshrss:latest
    container_name: freshrss
    hostname: freshrss-app
    restart: always
    ports:
      - '8010:80'
    volumes:
      - ./data:/var/www/FreshRSS/data
      - ./extensions:/var/www/FreshRSS/extensions
    environment:
      CRON_MIN: '*/20' # 刷新频率
      TZ: Asia/Shanghai

后续如果需要在 APP 使用,需要在首先在 账户管理页面的 API 管理中设置一个 API 密码,随后在账户设置-管理-认证中打开允许 API 访问 开关。

Minuflux

Miniflux 相比 FreshRSS 更加轻量,使用 Postgresql 数据库,同时也支持图片代理,项目地址如下:

miniflux

miniflux

部署如下:

 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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
version: '3.4'
services:
  miniflux:
    image: ${MINIFLUX_IMAGE:-miniflux/miniflux:latest}
    container_name: miniflux
    depends_on:
      - db
    environment:
      - DATABASE_URL=postgres://miniflux:secret@db/miniflux?sslmode=disable
      - RUN_MIGRATIONS=1
      - FETCH_YOUTUBE_WATCH_TIME=1
      - CREATE_ADMIN=1
      - ADMIN_USERNAME=admin  #登录用户名
      - ADMIN_PASSWORD=adminpassword  #登录密码
      - BASE_URL=https://rss.example.com  #阅读器的域名
      - POLLING_FREQUENCY=10  #每个 feed 的刷新间隔
      - POLLING_PARSING_ERROR_LIMIT=0 #拉取出错后不会停止拉去,还是会按计划继续拉
      - BATCH_SIZE=100  #每次拉取的 feed 数量
      - POLLING_SCHEDULER=entry_frequency #拉取类型,根据上周的平均更新周期来拉取
      - SCHEDULER_ENTRY_FREQUENCY_MAX_INTERVAL=30 #接上条,但也不会大于 30 分钟,建议和 POLLING_FREQUENCY 参数一起来看
      - MEDIA_PROXY_MODE=all #图片代理功能,Miniflux 先把源端的图片缓存到服务器上来,后续就不用客户端去源服务器拉了
      - MEDIA_PROXY_PRIVATE_KEY=password # 使用客户端缓存过文章,然后某个时间重启了 docker 实例,那么会导致图片无法显示的情况,这是因为每次重启会随机生成 PROXY_PRIVATE_KEY,所以可以增加参数 PROXY_PRIVATE_KEY 固化 key ,便于解决更新、重启等场景下的图片显示问题。 
      - DATABASE_MAX_CONNS=50 #增加数据库连接数,对于多图片的 feed 非常有效,可以大幅提升加载和访问速度
      - DATABASE_MIN_CONNS=5  # 同上 
      - WORKER_POOL_SIZE=10  #默认,或适当加大
    restart: unless-stopped
    ports:
      - "6800:8080"
  db:
    image: postgres:15
    container_name: postgres
    environment:
      - POSTGRES_USER=miniflux
      - POSTGRES_PASSWORD=secret
    volumes:
      - ./miniflux-db:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD", "pg_isready", "-U", "miniflux"]
      interval: 10s
      start_period: 30s
    restart: unless-stopped

在客户端使用同样需要打开 API开关并设置密码,推荐使用 Google Reader APIFever API 后续可能会不支持。

前端项目

这里推荐两个前端项目优化 web 阅读体验。

第一个项目只需要在 Minuflux 中添加自定义 CSS,访问 style.mini.css 复制代码。

ReactFlux 是一个防 Reeder 的前端项目,可以自己部署页面到 Cloudflare Pages 或者 Vercel,也可以使用官方提供的示例页面,推荐使用 API Token 登录。

客户端

iOS 端推荐使用 Reeder,体验良好,缺点是收费且不支持中文,免费的话可以使用 NetNewsWire

防盗链设置

个别订阅源会设置图片防盗链,导致在网页或者客户端加载不出图片,比如少数派。

Q: 为什么 RSSHub 里的图片 / 视频加载不出来?

A: RSSHub 里的图片 / 视频地址都是源站地址,部分有防盗链,所以 RSSHub 给图片加了 referrerpolicy="no-referrer" 属性来防止跨域问题,但部分 RSS 服务会自作主张去掉这个属性,如 Feedly、Inoreader,在它们的网页端图片会触发跨域加载不出来。同时,视频目前没有类似的属性,因此大部分阅读器都无法通过防盗链检查。

这是 RSSHub 文档的描述:为什么 RSSHub 里的图片 / 视频加载不出来?

同样提供了解决方法可以通过一些油猴脚本解决网页观看问题,脚本1 脚本2,或者使用代理解决:多媒体处理,不过我用不明白,好在在另一篇文章中得到灵感,可以直接用 Surge 修改 Header 中的 referer,方便快捷。

这是我自用的 Surge 模块,可以跳过少数派的防盗链,你可以参考适应自己的需求,如果是网页端,可以使用上面提到的文章的方法。

参考文献