はじめに
昨日は note の RSS を Notion に登録する記事を書きました。
その後、早速 qiita や Zenn も取り入れたいと連絡がありましたが、RSS の方言でそのままでは対応できませんでした。サイトごとに XML タグを変更できるような仕組みを取り入れようと思います。
getRSS の修正
とりあえず、Zenn の方の RSS フィードはこちら。 https://zenn.dev/topics/notion/feed 形式を見ると Note と同じなので、RSS になっています。
一方、Qiita の RSS フィードはこちら。 https://qiita.com/tags/notion/feed こちらは ATOM でのフィードになっていますね。atom のフィードなので、atom で読み込まないといけません。ということで、getRSS を root の name で分離することにしました。また、タイトルと URL しか必要でないので、簡略化のために配列で返すようにしました。
// RSS から情報を取得する function getRSS(url, checkDate) { const checkDateStr = Utilities.formatDate(checkDate, "JST", "yyyy-MM-dd") const xml = UrlFetchApp.fetch(url).getContentText() const root = XmlService.parse(xml).getRootElement() const name = root.getName() switch (name) { case "rss": return root.getChildren("channel")[0].getChildren("item").filter(item => { const dateStr = item.getChildText("pubDate") if (dateStr) { const date = Utilities.formatDate(new Date(dateStr), "JST", "yyyy-MM-dd") return date == checkDateStr } else { return false } }).map(item => [item.getChildText("title"), item.getChildText("link")]) case "feed": const atom = XmlService.getNamespace('http://www.w3.org/2005/Atom'); return root.getChildren("entry", atom).filter(item => { const dateStr = item.getChildText("published", atom) if (dateStr) { const date = Utilities.formatDate(new Date(dateStr), "JST", "yyyy-MM-dd") return date == checkDateStr } else { return false } }).map(item => [item.getChildText("title", atom), item.getChildText("url", atom)]) } }
registerNotion の修正
先ほど item は配列にしてしまったので、title と link の読み込み部は以下のように変更しました。
function registerNotion(constant, item, line, date) { const title = item[0] const link = item[1]
おわりに
ATOM フィードがあることをすっかり忘れていました。これで大体対応できますかね。