RSS から Notion に登録(2) : Notion 解説(45)

はじめに

昨日は 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 フィードがあることをすっかり忘れていました。これで大体対応できますかね。


www.notion.so