最近刷推, 多次刷到关于 DIYgod 大佬最新 follow 项目的体验分享, 然而目前还在邀请测试的阶段,没法参与。但大佬的另外一个项目 RSSHub 却帮我解决了一个困扰很久的问题。

一直以来,我主要的信息来源是推特和公众号。虽然也收藏了一些其他资讯站点和个人博客,但由于太分散(太懒)了,基本不会点开去看。而 RSSHub 项目就帮我解决了这个问题。这篇博客主要分享一下关于 RSSHub + Reeder 5 使用。

关于 RSS

RSS, 1999年网景公司推出, 当时全称 Rich Site Summary, 最新发展到 2.0, 其全称也可叫做 Really Simple Syndication, 这是一种消息来源的格式规范,聚合站点的更新内容,输出XML格式,方便客户端订阅。

最早接触 RSS 还是当初搭建博客的时候,配置项里面有个 RSS 配置,当时也就随手配置了一下,没想到用它来聚合消息。 而且随着自媒体/短视频的发展,身边几乎没有朋友用这种方式订阅信息了。直至前几天,看到 RSSHub,我决定试一试,这两周体验下来感觉还不错。

自建 RSShub

RSSHub 是一个可以将任何内容都可以抓取然后转换成 RSS 订阅的网站。

项目的 slogan 万物皆可RSS, 它不仅可以订阅各种博客、论坛、新媒体,甚至社交媒体、推特等都不在话下,很强,详见食用指南

该项目已经持续发展6年了,一直在持续更新, 甚至今年进行了一次重构, 不得不佩服大佬们的行动力。

alt text

项目支持私有部署,建议会折腾的自己可以部署一个。使用 docker-compsoe 很简单的就完成部署了,配置文件官方的文档中都有了 docker-compose.yml

对外提供访问的话,最好套一层 Nginx, 再用 acme.sh 来个证书自动化就完美了, 我的配置我贴在在文尾

除此之外,官方还提供了 Radar 功能,结合浏览器插件就可以发现你正在访问的站点 RSSHub 是否已经支持订阅了,如果支持了可以一键转换成订阅的地址, 很方便。 不仅如此,还支持移动端哦。

alt text

当然,如果你要订阅 Github Trending, 或者 Twitter 时间线等,你需要配置一下对应的 Token, 详见配置

Reeder 5

RSS 的源有了,接下来就是客户端的选择了。我选择了 Reeder 5, 一个 macOS/iOS/iPadOS 上的 RSS 阅读器。 虽然收费,但是几周的体验下来,感觉还是很不错的。

Reeder 5 支持多种 RSS 源,包括 Feedly, Inoreader 等等,当然也支持自定义 RSS 源。

目前我主要用的就是订阅一些博客、公众号、推特等, 它的排版简洁,字体也还不错,而且支持 iCloud 同步,很方便。

alt text

初此之外还有一个功能,稍后再读,我也很喜欢,有时候看到一些文章,当时没时间细看,可以浏览器中直接选择 在 Reeder 中稍后再读,有时间在打开APP慢慢看,很方便(以前都是发送到微信聊天里面…)。

alt text

alt text

总结

目前这套组合体验下来,感觉不错,一些我想关注的信息,都可以通过 RSSHub 聚合到 Reeder 5 中,然后在合适的时间看,不用担心错过了。

然而,与此同时,信息量也变大了,自己的接受量却很有限,需要做一定的取舍,保留那些适合自己的就好了,不然反而会变成信息焦虑。

之外还有一点,目前微信公众号的文章,还没有很好的爬取方式(虽然看到有付费方案),目前只能通过公众号的订阅号来看。

最后,很期待 DIYgod 大佬的 follow 项目,希望能早日体验到。

One more thing

最后的最后,分享一下我的配置,供参考。

为了顺利的访问 twitter, github, 找一台海外的服务器部署比较好。

  • docker-compose.yml

加了个 acme.sh 申请证书,nginx 代理 rsshub。

version: '3.5'
services:
  acme:
    image: neilpang/acme.sh
    restart: always
    container_name: acme.sh
    command: ["daemon"]
    environment:
      # 我是Cloudflare DNS, 其他参考 https://github.com/acmesh-official/acme.sh/wiki/dnsapi
      - CF_Zone_ID=xxxx  
      - CF_Token=xxx
    volumes:
      - ./acme.sh:/acme.sh
      - ./certs:/ssl

  nginx:
    image: nginx
    network_mode: host
    container_name: nginx
    restart: always
    volumes:
      - ./certs:/etc/nginx/ssl
      - ./web-rsshub.conf:/etc/nginx/conf.d/rsshub.conf

  rsshub:
    image: diygod/rsshub
    restart: always
    container_name: rsshub
    ports:
      - '1200:1200'
    environment:
      NODE_ENV: production
      CACHE_TYPE: redis
      REDIS_URL: 'redis://redis:6379/'
      PUPPETEER_WS_ENDPOINT: 'ws://browserless:3000'  # marked
      GITHUB_ACCESS_TOKEN: 'xxxx'
      TWITTER_USERNAME: 'xxx'
      TWITTER_PASSWORD: 'xxx'
      TWITTER_AUTHENTICATION_SECRET: 'xxxx'
    depends_on:
      - redis
      - browserless  # marked
  
  browserless:  # marked
    image: browserless/chrome  # marked
    container_name: rsshub-browserless
    restart: always  # marked
    ulimits:  # marked
      core:  # marked
        hard: 0  # marked
        soft: 0  # marked
  
  redis:
    image: redis:alpine
    container_name: rsshub-redis
    restart: always
    volumes:
        - ./redis-data:/data
  • web-rsshub.conf

反向代理 rsshub 配置

server {
    listen                       443 ssl;
    server_name                  rsshub.example.com;
    server_tokens                off;
    http2 on;

    ssl_certificate              /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key          /etc/nginx/ssl/key.pem;

    ssl_prefer_server_ciphers    on;
    ssl_ciphers                  EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;

    ssl_protocols                TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_session_cache            shared:SSL:50m;
    ssl_session_timeout          1d;
    ssl_session_tickets          on;

    ssl_trusted_certificate      /etc/nginx/ssl/ca.pem;
    ssl_stapling                 on;
    ssl_stapling_verify          on;

    access_log  /var/log/nginx/access_rsshub.log  main;
    error_log   /var/log/nginx/error_rsshub.log;

    resolver 8.8.8.8 ipv6=off valid=30s;

    location / {
        proxy_pass http://127.0.0.1:1200;
    }
}
  • apply-cert.sh

写个脚本申请证书,然后更新证书

#!/bin/bash

echo "start install cert ..."

docker exec acme.sh --issue \
  -d "example.com" \
  -d "*.example.com" \
  --dns dns_cf \
  --keylength ec-256 \
  --server letsencrypt \
  --dnssleep 300 \
  --force

if [ $? -ne 0 ]; then
  echo "apply cert failed"
  exit 1
fi

docker exec acme.sh --install-cert \
  -d "example.com" \
  -d "example.com" \
  --dns dns_cf \
  --keylength ec-256 \
  --server letsencrypt \
  --key-file       /ssl/key.pem \
  --fullchain-file /ssl/fullchain.pem \
  --ca-file /ssl/ca.pem \
  --reloadcmd  "echo 'done'"

if [ $? -ne 0 ]; then
  echo "install cert failed"
  exit 1
fi

docker restart  nginx

if [ $? -ne 0 ]; then
  echo "reload nginx failed"
  exit 1
fi

echo "update cert success"