使用JavaScript编写自己的私人RSS订阅程序

作者:J.sky · 发表于:
2023-07-23T17:52:16.000000Z
· 更新于:
2023-08-13T22:54:57.645618Z
· Tag: JavaScript

今天闲来无事,想编写一个私人的rss订阅,用来订阅自己喜欢的博客,终端运行后可以采集列表中博客的RSS文章,只关注最近一星期的数据,然后选中文章,通过浏览器打开博文地址浏览。好吧想法有了,那么就开干!

程序构思

一个私人的rss订阅,用来订阅我喜欢的博客,使用JavaScript来编写,在node环境下运行,我会创建一个数组,里边存放着我喜欢的博客的rss连接地址,当我运行这个脚本的时候,程序就会通过rss采集这些博客的最新文章,然后整理保存,通过终端输出,我可以通过鼠标点击终端的文章名称,弹出一个浏览器窗口来查看博文。

目前来说,我需要两个主要的依赖,一个书rss的数据采集一个是在终端可以打开指定的连接,根据搜索以及ChatGPT的提示,我找到两个库:

const Parser = require('rss-parser');
const opn = require('opn');

其中一个是rss的解析库rss-parser,另一个就是用来在终端打开链接的库。

脚本的代码很简答,node环境下运行即可,代码如下:

const Parser = require('rss-parser');
const opn = require('opn');

const rssFeeds = [
    'https://suiyan.cc/rss',
    'https://hutusi.com/feed.xml',
    'http://www.ruanyifeng.com/blog/atom.xml',
    // 添加更多博客的 RSS 连接地址
];

async function fetchAndDisplayLatestArticles() {
    const parser = new Parser();
    const articles = [];

    try {
        for (const feed of rssFeeds) {
            const feedData = await parser.parseURL(feed);
            console.log(`正在解析${feed}的订阅数据。。。。。。`)
            const oneWeekAgo = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000); // 一周前的日期

            // 筛选出发布日期在一周内的文章
            const recentArticles = feedData.items.filter(
                (article) => new Date(article.pubDate) > oneWeekAgo
            );
            console.log(`${feed}的数据解析完毕!`)
            articles.push(...recentArticles);
        }

        // 按照发布日期倒序排序文章
        articles.sort((a, b) => new Date(b.pubDate) - new Date(a.pubDate));

        console.log('最近一周的文章列表:');
        articles.forEach((article, index) => {
            // console.log(article)
            console.log(`${index + 1}. ${article.title}.${article.pubDate}`);
        });

        const selectedArticleIndex = await askForSelection(articles.length);

        if (selectedArticleIndex !== -1) {
            const selectedArticleLink = articles[selectedArticleIndex].link;
            opn(selectedArticleLink);
        }
    } catch (error) {
        console.error('发生错误:', error);
    }
}

function askForSelection(maxIndex) {
    const readline = require('readline').createInterface({
        input: process.stdin,
        output: process.stdout,
    });

    return new Promise((resolve) => {
        readline.question(
            `请输入要查看的文章序号 (1-${maxIndex}),输入 0 退出:`,
            (answer) => {
                readline.close();
                const selected = parseInt(answer);

                if (!isNaN(selected) && selected >= 0 && selected <= maxIndex) {
                    resolve(selected - 1);
                } else {
                    resolve(-1);
                }
            }
        );
    });
}

fetchAndDisplayLatestArticles();

运行这个脚本:

"D:\Program Files\nodejs\node.exe" D:\code\node_test\myrss\main.js
正在解析https://suiyan.cc/rss的订阅数据。。。。。。
https://suiyan.cc/rss的数据解析完毕!
正在解析https://hutusi.com/feed.xml的订阅数据。。。。。。
https://hutusi.com/feed.xml的数据解析完毕!
正在解析http://www.ruanyifeng.com/blog/atom.xml的订阅数据。。。。。。
http://www.ruanyifeng.com/blog/atom.xml的数据解析完毕!
最近一周的文章列表:
1. 如何使用CSS为博客标题设置彩虹颜色?.2023-07-22 15:27:22
2. 最终还是决定使用传统的网线来解决千兆速率问题。.2023-07-21 17:08:56
3. 科技爱好者周刊(第 263 期):开源软件如何赚钱?.2023-07-21T00:01:19.000Z
4. 1300M USB双频2.4+5G无线网卡的一些常识和使用技巧.2023-07-20 23:03:50
5. Python Gui新框架:NiceGui之初体验.2023-07-19 09:37:40
6. pycharm 正在关闭项目(closing project)无法关闭退出程序的解决方法!.2023-07-18 16:52:53
7. 速度与优雅:博客性能优化之旅.2023-07-18 15:08:06
8. 久了,博客主题就会一直做减法.2023-07-17 10:38:01
请输入要查看的文章序号 (1-8),输入 0 退出:

终端里输入序号就可以打开相关的博文了,如果把结果保存成为一个HTML文件,并做适当的美化,效果还是不错的,我在琢磨是不是要用python写一个方法,然后生成静态文件,这样就可以在博客里添加一个友联文章集了。