为您的开发人员创建RSS feed。
#教程 #node #rss

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:

  1. 从dev.to.to
  2. 加载文章
  3. 在内存中创建RSS feed
  4. 将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