RSSフィードからJSONファイルを出力する
Zenn の RSS フィードから記事一覧を表示したい
そんな人の手助けになればと思います。
Zenn には記事一覧を取得できる API がありませんが、RSS フィードは存在します。
RSS フィードはユーザーごとにあるので、これをなんとか JSON ファイルに変換すれば、自分のサイトに Zenn の記事一覧を表示させることができるかもしてないと、考え色々調べてみました。
RSS フィードを JSON に変換するには、rss-parser というライブラリを使うのが良さそうです。
実装前の注意点
この機能には弱点があります。
記事の最後に書いていますので、そちらを参照ください。
rss-parser とは?
公式にはこう説明されています。
RSS や XML を JavaScript オブジェクトに変換するライブラリ
A small library for turning RSS XML feeds into JavaScript objects.
https://github.com/rbren/rss-parser
機能はライブラリの名前の通りですね。
どんな機能を実装するか
- rss-parser を使って RSS の情報を JSON に変換 👉
rss-parser.mjs
ファイルの拡張子が.mjs
であることに気をつけてください。.js
だと機能しないのでご注意を! - Node.js の
writeFileSync
メソッドを使って JSON ファイルに取得・変換した情報を書き込む 👉data.json
rss-parser をインストールする
まずはライブラリのインストールから始めます。
npm install --save rss-parser
フォルダとファイルを用意する
rss-parser.mjs
と feed.json
を用意します。
私は、👇 のような構成にしました。
project/
|
+ - node_modules/
|
+ - src/
|
+ - rss/
| |
| + - data.json
| |
| + - rss-parser.mjs
|
+ - App.js
rss-parser.mjs
を書いていく
ここは、ほぼ公式の説明の通りです。
プラスで以下記事を参考に、RSS の情報を取得して JSON に変換したデータを JSON ファイルに書き込む処理を実装しました。
めちゃくちゃ参考になりました。
import { writeFileSync } from "fs";
import Parser from "rss-parser";
const parser = new Parser();
(async () => {
let jsonFeed = {};
const feed = await parser.parseURL("https://zenn.dev/<your_zenn_id>/feed");
const items = feed.items.map((data) => {
return data;
});
jsonFeed = items;
writeFileSync("src/rss/data.json", JSON.stringify(jsonFeed));
})();
package.json
に追加する
コードを実行するコマンドをコードだけでは JSON ファイルに書き込むことができないのでpackage.json
のscript
にコマンド追加します。
"update-rss": "node ./src/rss/rss-parser.mjs"
コマンドを実行する
準備は整ったので、あとはコマンドを実行するのみです。
早速 👇 のコマンドを実行してみましょう。
npm run update-rss
すると…
空だった、data.json
に JSON 化されたフィードの情報が出力されています。
あとは、JSON データをimport
してデータを表示させるだけ!
JSON ファイルのデータを表示させる
おまけです。
data.json
に出力されたデータを React で表示させます。
import React from "react";
import data from "./rss/data.json";
export default function App() {
return (
<div>
{data.map((i) => (
<a key={i.link} href={i.link}>
<h3>{i.title}<h3>
<div>{i.creator}</div>
</a>
))}
</div>
);
}
この機能の弱点
この機能の一番の弱点は、記事を公開・更新するたびにupdate-rss
コマンドを実行してビルドしなければならないという点です。記事の更新頻度が少ない人はいいですが、多い人は大変ですよね。
もっと良い方法はないものか。
Thanks and Source
Discussion
大変参考になりました。以下、ファイルパスで誤植と思われる部分がいくつかあったのでコメントさせていただきます。
(1) ディレクトリ構成は
rss-parser.js
ではなく、rss-parser.mjs
ではないですか?(2)
rss-parser.mjs
ファイルのコードでwriteFileSync("src/rss/rss.json", JSON.stringify(jsonFeed));
の第一引数はsrc/rss/data.json
ではないですか?(3)
"update-rss": "node ./src/rss/data.mjs"
の部分も、./src/rss/rss-paser.mjs
ではないですか?コメントありがとうございます🙇♂️
ご指摘の箇所目を通しましたが、おっしゃるとおりでした😅
修正しております、ありがとうございました🙏