惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

G
Google Developers Blog
博客园 - 三生石上(FineUI控件)
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
MongoDB | Blog
MongoDB | Blog
小众软件
小众软件
Y
Y Combinator Blog
博客园 - 聂微东
Google DeepMind News
Google DeepMind News
D
Docker
罗磊的独立博客
Microsoft Security Blog
Microsoft Security Blog
D
DataBreaches.Net
B
Blog
Vercel News
Vercel News
Recent Announcements
Recent Announcements
GbyAI
GbyAI
阮一峰的网络日志
阮一峰的网络日志
T
The Blog of Author Tim Ferriss
H
Hackread – Cybersecurity News, Data Breaches, AI and More
P
Proofpoint News Feed
酷 壳 – CoolShell
酷 壳 – CoolShell
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Microsoft Azure Blog
Microsoft Azure Blog
宝玉的分享
宝玉的分享

碎言

不懂就别瞎掰掰:【程序员的常识】写的什么玩意? PrimaryOralMathPack 小学生口算题生成器 AI 辅助编程下的程序设计与代码编写 使用 Next.js 和 Tailwind CSS 构建可编辑和删除的 ToDo 待办事项应用 探索编程新境界:MarsCode 助你一臂之力 使用 Next.js 和 Tailwind CSS 搭建静态图片展示站点并部署到 Vercel AI 辅助编程:免费工具的优缺点及官网一览 GitHub push更新总是失败,写个python脚本解决 把博客从GitHub迁移到到了vercel ComfyUI 和 Flux.1 安装与使用教程 Flux.1 入门必知:硬件、环境、模型 Git项目的子文件夹中的内容无法同步到远程仓库的解决方法 blender流体Fluid使用中没有流体、流体穿模等一些问题的解决方法 博客聚合网站:积薪,竟然关闭了! blender日常使用中的一些技巧 虽然只有我自己在用,但还是更新了碎言博客的源代码, 与其在迷茫中困惑,不如在努力中前进 差点忘了我还有一个博客... 秧歌、博客和AI 终于熬到了新手上路 好久没有更新博客了。。。 老妈大腿骨骨折,最近一直在医院护理 Hello, September! Ubuntu开机自动启动Docker容器运行WordPress Docker 简单快速安装部署WordPress Docker下安装MySQL 加碘盐能防核辐射的话,还怕什么核战争? shields.io 一个简洁、一致、清晰的徽章 Ubuntu下使用root登录ssh的设置 GitHub Actions 构建、部署 Next.js项目
使用JavaScript编写自己的私人RSS订阅程序
J.sky · 2023-07-24 · via 碎言

今天闲来无事,想编写一个私人的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写一个方法,然后生成静态文件,这样就可以在博客里添加一个友联文章集了。