最近刷推, 多次刷到关于 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年了,一直在持续更新, 甚至今年进行了一次重构, 不得不佩服大佬们的行动力。
项目支持私有部署,建议会折腾的自己可以部署一个。使用 docker-compsoe
很简单的就完成部署了,配置文件官方的文档中都有了 docker-compose.yml。
对外提供访问的话,最好套一层 Nginx, 再用 acme.sh
来个证书自动化就完美了, 我的配置我贴在在文尾。
除此之外,官方还提供了 Radar 功能,结合浏览器插件就可以发现你正在访问的站点 RSSHub 是否已经支持订阅了,如果支持了可以一键转换成订阅的地址, 很方便。 不仅如此,还支持移动端哦。
当然,如果你要订阅 Github Trending, 或者 Twitter 时间线等,你需要配置一下对应的 Token, 详见配置。
Reeder 5
RSS 的源有了,接下来就是客户端的选择了。我选择了 Reeder 5, 一个 macOS/iOS/iPadOS 上的 RSS 阅读器。 虽然收费,但是几周的体验下来,感觉还是很不错的。
Reeder 5 支持多种 RSS 源,包括 Feedly, Inoreader 等等,当然也支持自定义 RSS 源。
目前我主要用的就是订阅一些博客、公众号、推特等, 它的排版简洁,字体也还不错,而且支持 iCloud 同步,很方便。
初此之外还有一个功能,稍后再读,我也很喜欢,有时候看到一些文章,当时没时间细看,可以浏览器中直接选择 在 Reeder 中稍后再读
,有时间在打开APP慢慢看,很方便(以前都是发送到微信聊天里面…)。
WeWe RSS
平常不少信息都来自微信公众号订阅,然而在微信里阅读的时候干扰比较多,而且公众号不支持 RSS 订阅。 WeWe RSS 很好的解决了这个问题。
需要注意的是,WeWeRSS 核心也是爬虫,爬取微信读书的API,核心部分的代码并没有开源(开源估计很快就能被封了),微信读书相关的接口通过 weread.111965.xyz
服务来转发的。虽然作者也说了只是做转发,但建议使用的时候用小号登录。
上面是部署好的页面,可以通过粘贴公众号的文章来订阅公众号,同时支持 RSS 订阅和导出 OPML 。感谢作者的奉献,希望这个项目能长久维护下去。
配置就不多说了,官方文档写的还可以,我的配置也贴在文末。
总结
目前这套组合体验下来,感觉不错,一些我想关注的信息,都可以通过 RSSHub 聚合到 Reeder 5 中,然后在合适的时间看,不用担心错过了。
然而,与此同时,信息量也变大了,自己的接受量却很有限,需要做一定的取舍,保留那些适合自己的就好了,不然反而会变成信息焦虑。
之外还有一点,目前微信公众号的文章,还没有很好的爬取方式(虽然看到有付费方案),目前只能通过公众号的订阅号来看。
最后,很期待 DIYgod 大佬的 follow 项目,希望能早日体验到。
相关配置
最后的最后,分享一下我的配置,供参考。
为了顺利的访问 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
wewerss:
image: cooderl/wewe-rss-sqlite:latest
container_name: wewerss
restart: always
environment:
- DATABASE_TYPE=sqlite
- AUTH_CODE=changeyourpassword
ports:
- '4001:4000'
volumes:
- ./wewerss-data:/app/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;
}
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name werss.example.com;
access_log /var/log/nginx/access_werss.log main;
error_log /var/log/nginx/error_werss.log;
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;
location / {
proxy_pass http://127.0.0.1:4001;
}
}
- 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"