明确需求

编写路由代码

  1. 打开对应的路径 ~/lib/routes
  2. 新建文件夹
  3. 新建脚本

以dilidili番剧更新举例

其实需要更改的内容不多,将URL和CSS选择器改一改可能就可以适用于大部分网页。

// 调用axios获取页面源码
const axios = require('@/utils/axios');
// 调用cheerio分析抓取到的html,利用类似jQuery的方法解析
const cheerio = require('cheerio');

async function load(link, ctx) {
    // 定义cache 存储通过link获取到的缓存内容
    const cache = await ctx.cache.get(link);
    // 如果缓存已经存在,则直接返回,否则对其进行解析
    if (cache) {
        return cache;
    }
    const response = await axios.get(link);
    const $ = cheerio.load(response.data);
    // 获取相关内容
    let introduce = $('#intro2 > p:nth-child(3)').text();
    // 将'简介'字段与内容分离,为了更优美的阅读界面
    introduce = introduce.replace('简介', '简介<br>');
    const image = `<img src="${$('.player_img > img').attr('src')}" referrerpolicy="no-referrer" />`;
    const detailResult = `${introduce}<br>${image}`;

    // 定义description,并指定内容
    const description = detailResult;
    await ctx.cache.set(link, description);
    return {
        description,
    };
}

// 通过module.exports暴露给router
module.exports = async (ctx) => {
    const id = ctx.params.id;

    // 使用get方法请求主页面,然后获取其返回的response
    const response = await axios({
        method: 'get',
        url: `http://www.dilidili.name/anime/${id}`,
    });
    // 获取页面的html
    const data = response.data;
    // 将页面html交于cheerio处理成类似jQuery的节点
    const $ = cheerio.load(data);
    // 获取番剧名称
    const animeName = $('body > div.container.clear > div.clear > div:nth-child(2) > div.detail.con24.clear > dl > dd > h1').text();

    // @param {*} list 用于存储通过 " h4 > a "获取到的节点
    const beforeFilterList = $('div.swiper-container.xfswiper1 > div > div > ul > li > a').get(); // 获取到剧集列表
    const list = [];
    beforeFilterList.forEach((element) => {
        if (
            $(element)
                .attr('href')
                .indexOf('http://') !== -1
        ) {
            list.push(element);
        }
    });
    // 使用promise处理多个节点
    const process = await Promise.all(
        // 在list变量上使用map方法,对其拥有的每一个元素均进行"匿名函数"的操作
        list.map(async (item) => {
            // item为回调的参数
            // 定义itemUrl
            const itemUrl = $(item).attr('href');
            // 定义导出到rss的单体对象,包含title,link,guid三个参数
            const single = {
                title: $(item).text(),
                link: itemUrl,
                guid: itemUrl,
            };
            // 调用load方法,获取到的是string对象{description}
            const other = await load(itemUrl, ctx);
            return Promise.resolve(Object.assign({}, single, other));
        })
    );
    ctx.state.data = {
        title: `${animeName} - 嘀哩嘀哩`,
        link: `http://www.dilidili.name/anime/${id}`,
        description: `${animeName}更新提醒`,
        item: process,
    };
};
  1. 打开处于~/lib下的router.js,编写新的路由地址
// dilidili
router.get('/dilidili/fanju/:id', require('./routes/dilidili/fanju'));

具体参数详细查看RSSHub官网

  1. 启动本地调试

npm start

此前需要安装相关依赖包 npm i

如果遇到puppeteer报错,请去查询如何跳过执行脚本安装

  1. 查看本地调试的结果 打开127.0.0.1:1200/your_router_folder/your_router 此处为127.0.0.1:1200/dilidili/fanju/一个番剧的id

  2. 查看结果 看看有没有报错,输出的格式是不是你希望的那样。 如果有,调整就好了。


提交代码

1. 提交前需要编写说明文档「以dilidili举例」

  1. 打开~/docs/anime.md
  2. 添加你自己写的路由
## 嘀哩嘀哩 - dilidili

### 嘀哩嘀哩番剧更新

<Route author="SunShinenny" path="/dilidili/fanju/:id" example="/dilidili/fanju/onepunchman2" :paramsDesc="['番剧id']">

请打开对应番剧的纵览页(非具体某集),从 url 中最后一位查看番剧 id.(一般为英文)
除去'海贼'此类具有特殊页面的超长番剧,绝大多数页面都可以解析.
最适合用来追新番

</Route> 

具体格式详见官网

2. 运行格式化代码

npm run format

git中会显示很多文件被修改,不要担心,照常提交即可。

3. 提交到自己的仓库

4. 准备合并到原仓库

教程请查询 GitHub 提交 Pull Request

5. 等待合并,如有问题,根据作者需求进行改动


真心祝愿开源的世界更为广阔 感谢阅读。