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