RSSフィードをNode.jsで作成する

2021/05/29

Node.js

RSSの仕様

RSS Version2.0 に則り XMLで記述する。

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>title</title>
    <link>url</link>
    <description>description</description>
    <lastBuildDate>lastBuildDate</lastBuildDate>

    <item>
      <title>title</title>
      <link>url</link>
      <guid>url</guid>
      <pubDate>date</pubDate>
    </item>
    ...
  </channel>
</rss>

node-xml2jsを使う

使い方は こっち itemまでのRSS Objectを生成し、ファイル等でitemにpushしていく。 当サイトではall.jsonが存在するのでそちらを使ってRSSに追加していく。

const xml2js = require('xml2js');
const fs = require('fs');
const URL = "https://sushi.karaage.tokyo/";
const builder = new xml2js.Builder();

const rss = {
  rss:{
    $:{
      "version" : "2.0",
      "xmlns:atom": "http://www.w3.org/2005/Atom"
    },
    channel:{
      title: "Sushi karaage",
      link: URL,
      description: "sushi karaageのブログです",
      lastBuildDate: new Date().toUTCString(),
      item: []
    }
  }
};

const json = JSON.parse(fs.readFileSync("./src/assets/data/all.json",'utf8'));
json.forEach(item => {
  const path = item.path.split("-");
  const pathName = "./src/assets/md-article/" + path.join("/") + ".md"
  const file = fs.readFileSync(pathName,'utf8');
  const { birthtime } = fs.statSync(pathName);
  rss.rss.channel.item.push({
    title: file.split('\n')[0].replace("#",""),
    link: URL + "article/" + item.path,
    guid: URL + "article/" + item.path,
    pubDate: new Date(birthtime).toUTCString(),
  })
});


const xml = builder.buildObject(rss);
console.log(xml);
fs.writeFileSync(`./docs/rss.xml`,xml,(err)=>{
  if(err) console.log(err);
});