RSShub自制路由

平时主要使用RSS看资讯信息,日常使用RSSHub Radar浏览器插件查询网站RSS链接,很多网站都无法发现RSS链接,一度认为这个插件很鸡肋。最近研究了下,这个插件确实很鸡肋,核心是RSSHub这个开源项目,通过搭建自定义路由,将网站信息转换成RSS信息流。然后使用RSS 阅读器进行订阅阅读。

原理

  1. 网站内容都是html信息,通过对网站html内容解析,按照RSS规范生成RSS文件。即可使用RSS 阅读器订阅阅读。
  2. RSSHub项目地址,使用RSSHub只用关注网站html内容的解析,制作路由就是按照规范对内容进行解析。
  3. 参考项目中他人编写的路由,借助大模型,不懂JS也可以很简单完成网站路由制作。
  4. 使用RSS阅读网站内容和书源工具阅读小说思想上一致的,都是对网站内容进行解析,只留下重要的内容信息展示。区别是一个对源网站数据的处理在服务端进行,一个在客户端进行。

制作路由

  1. 开发路由官方文档,参考官方文档下载配置好开发环境。
  2. 打开想制作的网站F12,查看网站html结构,找到需要解析的元素。
  3. 参考下述代码,最重要是handler函数,其他都是配置信息。handler中解析html标签,获取需要的信息。主要就是标题,链接,描述,发布时间。如果想在RSS阅读器中直接阅读完整的内容,可以将文章内容放在描述(description)中。
  4. 开发过程中不懂的就问大模型,云厂商都提供了免费服务,能力都差不多。完成相应开发后,将代码部署到服务器上,配置好端口转发就可以通过域名订阅。
  5. 如果使用官方提供的RSSHub服务,需要提交PR到RSSHub项目,等待审核通过后才能使用。
  6. 可以阅读路由中他人制作的路由,发现感兴趣的网站,查看Route结构,使用官方服务,直接订阅使用。
 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
42
43
44
45
46
47
48
import { Route } from '@/types';
import { parseDate } from '@/utils/parse-date';
import got from '@/utils/got';
import { load } from 'cheerio';

export const route: Route = {
    path: '/',
    categories: ['blog'],
    example: '/imhcg',
    radar: [
        {
            source: ['https://infos.imhcg.cn/'],
        },
    ],
    name: 'Engineering blogs',
    maintainers: ['xiaoshame'],
    handler,
    url: 'https://infos.imhcg.cn/',
};

async function handler() {
    const url = 'https://infos.imhcg.cn/';
    const response = await got({ method: 'get', url });
    const $ = load(response.data);

    const list = $('li')
        .map((i, e) => {
            const element = $(e);
            const title = element.find('a.title').text();
            const link = element.find('a.title').attr('href');
            const description = element.find('p.text').text().trim();
            const dateraw = element.find('p.time').text();

            return {
                title,
                description,
                link,
                pubDate: parseDate(dateraw, 'YYYY 年 MM 月 DD 日'),
            };
        })
        .get();

    return {
        title: 'Engineering blogs',
        link: url,
        item: list,
    };
}