RSSHub
介绍
RSSHub 是一个开源、简单易用、易于扩展的 RSS 生成器,可以给任何奇奇怪怪的内容生成 RSS 订阅源。
原理:请求路由时,RSSHub 会按照给定规则请求源站数据,然后以 RSS 格式输出;如果在设定缓存时间内重新请求路由,则会直接返回缓存内容,不请求源站;再加一点点魔法。
环境
本地运行
安装依赖:yarn 或者 npm install。或者 pnpm install。
本地运行:yarn dev 或者 npm run dev。或者 pnpm start。
本地服务地址:http://localhost:1200
Docker
从头构建容器
RSSHub 提供现成的 Docker 容器,可以直接使用。
下面的代码,是从代码从头构建 Docker 容器。
使用场景:对代码做了修改,需要重新构建容器。
docker build -t maxiee-rsshub:v1 .
Docker Compose 部署
首先创建 volume 持久化 Redis 缓存:
docker volume create redis-data
docker-compose.yml:
version: '3'
services:
rsshub:
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'
depends_on:
- redis
- browserless
browserless:
# See issue 6680
image: browserless/chrome:1.43-chrome-stable
restart: always
ulimits:
core:
hard: 0
soft: 0
redis:
image: redis:alpine
restart: always
volumes:
- redis-data:/data
volumes:
redis-data:
启动:docker-compose up -d
停止:docker-compose down
传入变量:
代理 PROXY_URI:{protocol}://{host}:{port}
如果是手动运行,通过环境变量 PROXY_URI 设置代理。
启用代理的正则:PROXY_URL_REGEX
: 启用代理的 URL 正则表达式,默认全部开启 .*
添加路由
如何自己添加新路由。参见文档:docs\joinus\quick-start.md。
在 /lib/router.js 中添加路由。
在 /lib/routes/ 中添加对应的抓取脚本。
获取数据有两种方式:① got 网路库 ② puppeteer
数据解析的方式:① HTML 用 cheerio 解析,JSON 直接解析
通用配置型路由:通用工具,通过 cheerio(**CSS 选择器、jQuery 函数**)读取 json 数据来简便的生成 RSS。
V2 路由
V2 路由是一种新的路由标准,不需要手动,会被自动载入,无需更新 router.js。具体文档参见 docs\joinus\script-standard.md。
缓存
所有路由都有缓存。有的站点,生成 RSS 不仅需要访问首页,还要进入每个文章页面获取内容。每次访问首页都这么请求,请求量太大。因此把不常变的数据放入缓存里,减小重复网络开销。具体方法为 tryGet。
代理实现
代理的处理位于 lib\utils\request-wrapper.js。
定义了几个变量:
let tunnel;
let HttpsProxyAgent;
let SocksProxyAgent;
let agent = null; // 传入网路库
如果有设置代理,注入到 options,传入底层网络库。
PROXY_URL_REGEX
这个变量控制哪些域名走代理,哪些不走。是一个 JavaScript 正则。
RSS 源
特殊类型
- 博客源:能被博客软件订阅
- BT/磁力源:能被 BT 软件订阅
- 媒体元:能被支持 Media RSS 的工具订阅识别