早些时候提出RSSHub规则化架构设计,最近抽空简单实现了这块功能,目前也已经合并到RSSHub主线,本人几十个Feed43也已经成功迁移到RSSHub,非常舒适
考虑到使用上可能有一些门槛,写一篇使用教程
- RSSHub transform路由怎么用
- 如何利用RSSHub将任意网页做成RSS
官方文档:https://docs.rsshub.app/other.html#zhuan-huan
由于这个功能支持任意页面,当请求恶意页面时可能会有SSRF的风险
所以仅支持自建,并将ALLOW_USER_SUPPLY_UNSAFE_DOMAIN
环境变量设置为true
部署文档 https://docs.rsshub.app/install/
推荐自建是配置访问控制,避免自建服务被滥用/攻击
https://docs.rsshub.app/install/#pei-zhi-fang-wen-kong-zhi-pei-zhi
制作方法
目前是支持将任意的HTML和JSON转换为RSS,下面通过几个例子介绍制作过程
对于有前端基础/了解CSS选择器
的可以直接看官方文档,结合文档例子应该很容易举一反三
对于了解或使用过Feed43,可以理解为将Feed43的用于匹配的正则Pattern
转化为更加语法话的CSS选择器
和JSON Path
CSS选择器可以参考 https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_selectors
HTML
路由格式为/rsshub/transform/html/:url/:routeParams
url
就是需要爬的地址,其中routeParams
可用参数有很多,大多数情况下填2-3个参数就可以用了
键 | 含义 | 接受的值 | 默认值 |
---|---|---|---|
title |
指定 RSS 的标题 | string |
从当前网页中取 <title> |
item |
通过 CSS 选择器查找 HTML 元素作为 item 元素 |
string |
html |
itemTitle |
在 item 中通过 CSS 选择器查找 HTML 元素作为 title 元素 |
string |
item 元素 |
itemTitleAttr |
获取 title 元素属性作为标题 |
string |
元素 text |
itemLink |
在 item 中通过 CSS 选择器查找 HTML 元素作为 link 元素 |
string |
item 元素 |
itemLinkAttr |
获取 link 元素属性作为链接 |
string |
href |
itemDesc |
在 item 中通过 CSS 选择器查找 HTML 元素作为 descrption 元素 |
string |
item 元素 |
itemDescAttr |
获取 descrption 元素属性作为描述 |
string |
元素 html |
以本站https://blog.xlab.app/
为例,写一个标题
key | value |
---|---|
title | 明天的乌云 |
打开浏览器的开发工具,找到想要定位的文章
可以看到文章在article
标签中,那么构造item
参数
key | value |
---|---|
title | 明天的乌云 |
item | article |
对于文章标题,可以看到在a
标签中,属性是class="post-title-link"
构造itemTitle
参数
key | value |
---|---|
title | 明天的乌云 |
item | article |
itemTitle | a[class="post-title-link"] |
itemTitleAttr
不填的话会自动取元素中的文本,这里例子就不用填
对于文章连接,可以看到也是在这个元素中,其中需要的链接在href
属性中
构造itemLink
和itemLinkAttr
参数
key | value |
---|---|
title | 明天的乌云 |
item | article |
itemTitle | a[class="post-title-link"] |
itemLink | a[class="post-title-link"] |
itemLinkAttr | href |
现在提取文章内容,在div
元素中,有itemprop="articleBody"
属性,其中的p
标签是内容
构造itemDesc
key | value |
---|---|
title | 明天的乌云 |
item | article |
itemTitle | a[class="post-title-link"] |
itemLink | a[class="post-title-link"] |
itemLinkAttr | href |
itemDesc | div[itemprop="articleBody"] p |
itemDescAttr
也不用填,默认取其中的html
将表格经过URL编码转换,得到routeParams
1 | title%3D%25E6%2598%258E%25E5%25A4%25A9%25E7%259A%2584%25E4%25B9%258C%25E4%25BA%2591%26item%3Darticle%26itemTitle%3Da%255Bclass%253D%2522post-title-link%2522%255D%26itemLink%3Da%255Bclass%253D%2522post-title-link%2522%255D%26itemLinkAttr%3Dhref%26itemDesc%3Ddiv%255Bitemprop%253D%2522articleBody%2522%255D%2Bp |
别急,下面有编码工具
最后,拼接URL编码的链接得到完整路由
1 | /rsshub/transform/html/https%3A%2F%2Fblog.xlab.app%2F/title%3D%25E6%2598%258E%25E5%25A4%25A9%25E7%259A%2584%25E4%25B9%258C%25E4%25BA%2591%26item%3Darticle%26itemTitle%3Da%255Bclass%253D%2522post-title-link%2522%255D%26itemLink%3Da%255Bclass%253D%2522post-title-link%2522%255D%26itemLinkAttr%3Dhref%26itemDesc%3Ddiv%255Bitemprop%253D%2522articleBody%2522%255D%2Bp |
RSS就做好了
简化
虽然看起来表里这么多参数,其实有些是可以不填的,有些可以写的更加简单一些
key | value |
---|---|
title | 明天的乌云 |
item | article |
itemTitle | a[class="post-title-link"] |
itemLink | a[class="post-title-link"] |
itemLinkAttr | href |
itemDesc | div[itemprop="articleBody"] p |
title
可以不填,会自动处理
itemTitle
不用定位这么精细,可以取更上一层的元素,比如h2
itemLink
和itemLinkAttr
可以不填,会自动取第一个a
链接
itemDesc
也可以不填,自动取整个html
最终routeParams
参数可以简化为
key | value |
---|---|
item | article |
itemTitle | h2 |
得到简单能用的路由
1 | /rsshub/transform/html/https%3A%2F%2Fblog.xlab.app%2F/item%3Darticle%26itemTitle%3Dh2 |
简单,不好看,但能用
由于这个规则足够简单,可以适应于更多的网站,比如使用相同框架的站点Hexo/Hugo/WordPress等,规则是可以通用的
可以期待未来RSSHub可以不用手动编写参数,仅提供链接就能制作RSS
JSON
JSON的其实和HTML差不多,相信看完HTML的例子,再去看官方文档和例子,应该也能看懂了
小工具
填写下面的表单,构建RSSHub订阅地址
RSSHub地址:
目标地址:
访问密钥:
编码结果:
url:
routeParams:
最终路由: