DEV.to是学习和分享有关软件开发知识的好地方。该网站拥有一个积极的开发人员和技术作家社区,为初学者以及经验丰富的程序员提供了广泛的资源。 Dev.to提供的一件事是称为阅读列表的“稍后阅读”功能。此功能使用户可以保存他们发现有趣但没有时间阅读的任何文章。可以随时访问已添加到阅读列表中的文章,使用户更方便地赶上阅读。
在本教程中,我们将为您保存到dev.to读取列表的文章创建RSS feed。为此,我们将生成一个令牌以访问DEV.to API。然后,我们将编写一个node.js脚本,该脚本加载文章数据,创建RSS feed并将其保存到指定的文件中。
注意:所有代码都可以在this repository on GitHub上找到,包括设置说明以及如何运行脚本以创建您的个人RSS feed。
创建访问令牌
要访问dev.to api并加载文章,我们需要创建一个访问令牌。为此,我们在dev.to中打开extensions section,然后滚动到页面底部的“开发社区API密钥”。我们在描述字段中输入一个项目名称,例如“读取列表RSS feed”,然后单击“生成API密钥”按钮。完成。
警告:API键就像密码一样,这意味着,保持安全性并且不与他人共享。
创建RSS feed
我们使用javascript编写名为index.js
的node.js文件来加载文章,创建RSS feed并将其写入文件。为了使事情变得更容易,我们使用Feed软件包来创建RSS feed。
注意:下面的代码已在Node.js版本19.8.1。
import fs from 'fs';
import { Feed } from 'feed';
在开始之前,我们需要配置几件事,以便可以正确创建我们的提要:
// Your DEV.to API key
const API_KEY = '';
// The title of the RSS feed, e.g. 'My DEV.to Reading List'
const FEED_TITLE = 'My DEV.to Reading List';
// The description of the RSS feed, e.g. 'A feed for all articles that I saved to my DEV.to Reading List'
const FEED_DESCRIPTION = 'A feed for all articles that I saved to my DEV.to Reading List';
// The RSS feed's ID, e.g. 'https://dev.to/<YOUR_DEV_TO_USERNAME>/
const FEED_ID = ''
// The RSS feed's author information, i.e. your name, email and website
const FEED_AUTHOR = {
name: '',
email: '',
link: ''
};
// The RSS feed's format. Possible values: 'rss2', 'atom1' or 'json1'
const FEED_TYPE = 'rss2';
// The file to which the RSS feed should be written to, e.g. 'feed.xml' or 'feed.json'
const FEED_OUTPUT_FILE = {
rss2: 'feed.xml',
atom1: 'atom.xml',
json1: 'feed.json'
};
// DO NOT EDIT THESE VALUES!
const API_URL_READING_LIST = 'https://dev.to/api/readinglist';
const FEED_FAVICON = 'https://dev-to.s3.us-east-2.amazonaws.com/favicon.ico';
const FEED_OUTPUT_PATH = 'build';
现在,我们拥有所需的所有信息,我们需要做三件事来创建我们的RSS feed:
- 从dev.to.to 加载文章
- 在内存中创建RSS feed
- 将RSS feed写成文件
从Dev.to加载文章
首先,我们从阅读列表中加载文章。为此,我们使用本机fetch
方法并解析JSON响应:
const fetchReadingList = () => fetch(
API_URL_READING_LIST, {
headers: {
accept: 'application/vnd.forem.api-v1+json',
'api-key': API_KEY,
'content-type': 'application/json',
}
}
).then(
response => {
if (response.ok) {
return response.json();
}
throw new Error(`Not able to download reading list articles: ${response.statusText} [${response.status}]`);
}
);
在内存中创建RSS feed
第二,通过从API收到的数据,我们在内存中创建了一个新的Feed
对象,该对象包含有关RSS feed的所有信息:
const createRSSFeed = data => {
const feed = new Feed({
title: FEED_TITLE,
description: FEED_DESCRIPTION,
id: FEED_ID,
link: FEED_ID,
favicon: FEED_FAVICON,
author: FEED_AUTHOR
});
data.forEach(item => {
const feedItem = {
title: item.article.title,
id: item.article.url,
link: item.article.url,
description: item.article.description,
date: new Date(item.article.published_at)
};
if (item.article.cover_image) {
feedItem.image = item.article.cover_image;
} else if (item.article.social_image) {
feedItem.image = item.article.social_image;
}
feed.addItem(feedItem);
});
return feed[FEED_TYPE]();
};
将RSS提要写为文件
最后,我们将将我们的Feed
对象写入磁盘。我们可以在三种供稿类型之间进行选择:RSS 2.0,Atom 1.0和JSON Feed 1.0。可以在配置中设置提要类型(请参见上文):
const writeRSSFeed = feed => {
const outputPath = `${FEED_OUTPUT_PATH}/${FEED_OUTPUT_FILE[FEED_TYPE]}`;
try {
if (fs.existsSync(FEED_OUTPUT_PATH) === false) {
fs.mkdirSync(FEED_OUTPUT_PATH);
}
fs.writeFileSync(outputPath, feed);
} catch (e) {
throw new Error(`Was not able to write feed to "${outputPath}":\r\n${e}`);
};
}
执行脚本
现在我们已经拥有所有功能,我们可以调用这些功能来实际创建RSS feed文件:
fetchReadingList().then(
data => {
if (!data || data.length === 0) {
console.warn('No articles available -> Exiting');
process.exit(0);
}
const rssFeed = createRSSFeed(data);
writeRSSFeed(rssFeed);
}
).catch(
e => {
console.error(e);
process.exit(1);
}
);
我们保存node.js文件并从终端调用:
$> node index.js
就是这样,我们的RSS提要已经准备就绪,并且Feed的文件在build
文件夹中可用。我们现在需要做的就是将生成的文件复制到可通过Web访问的位置,然后将URL添加到我们喜欢的RSS Feed读取器中。
我们可以自动运行node.js脚本并通过使用小型bash脚本将输出复制到文件夹(也可以在GitHub repo for this article中使用):
#!/usr/bin/env bash
node index.js
cp ./build/* <PATH_TO_WEB_SERVER_FOLDER>/
奖金:自动更新
如果提要会自动更新,假设每60分钟一次,那不是很好吗?好没问题。我们在Cron,Anacron,Cronie或您使用的任何用于调度任务的配置中添加了一个条目 - 并执行run.sh
bash脚本。
# Example for Cron; script runs every 60 minutes
0 * * * * /PATH/TO/run.sh
最后一句话
rss feed是使人们保持最新的新内容和更新的好方法。我希望有了本教程,您可以为您的开发人员创建自己的提要。但不仅如此:您可以使用本教程中的方法访问任何API并根据其提供的数据创建RSS feed。
您是否使用本教程来生成自己的RSS feed?太好了,在comments中让我知道。如果您有任何问题或想改进,请前往GitHub repository's issue tracker。