note のスキの数を Node.js で取得する

Posted on

カミナシでは note で積極的に情報発信を行なっています。カミナシの公式ページ「カミナシ note 編集部」を見ると、1 月時点で 250 本以上の記事が公開されていました。 11 〜 12 月は社内でイベントが行われており、特定の期間に集めたスキの数でチーム戦が繰り広げられていました。

スキの数を効率よく集計したかったのですが、残念ながら note は公式に API を公開していません。そこで Node.js と jsdom を使って取得することにしました。

jsdom で DOM を解析する

まず npm で jsdom パッケージをインストールします。

$ mkdir note-like-count && cd $_

$ npm install jsdom

パッケージをインストールしたら、次のコードを index.mjs として保存します。

import jsdom from "jsdom";
const { JSDOM } = jsdom;

(() => {
  const virtualConsole = new jsdom.VirtualConsole();
  virtualConsole.sendTo(console, {
    omitJSDOMErrors: true,
  });

  const url = process.argv[2];
  const options = { virtualConsole };

  JSDOM.fromURL(url, options).then((dom) => {
    const selector = "button.o-noteLikeV3__count";
    const targetElement = dom.window.document.querySelector(selector);

    let likeCount = 0;
    if (targetElement !== null) {
      likeCount = targetElement.textContent.match(/[0-9]+/);
    }
    console.log(url + "\t" + likeCount);
  });
})();

button.o-noteLikeV3__count がスキの数をラップしている HTML の要素です(2023/01/14 時点)。

あとは、コマンドライン引数に URL を渡して実行します。たとえば自分の入社エントリー「副業から正社員へ。カミナシに入って 3 か月でやったコト」だとこんな感じです。

$ node index.mjs https://note.com/manabusakai/n/naf82c6c6a63c
https://note.com/manabusakai/n/naf82c6c6a63c    121

複数の URL をまとめてチェックしたいときはシェルスクリプトでループさせます。

$ cat urls.txt
https://note.com/manabusakai/n/naf82c6c6a63c
https://note.com/manabusakai/n/ndbf3036b7015

$ while read url; do node index.mjs ${url}; sleep 3; done < urls.txt
https://note.com/manabusakai/n/naf82c6c6a63c    132
https://note.com/manabusakai/n/ndbf3036b7015    61

利用規約に「当社のサービスの障害となる行為を行うこと」が禁止事項として挙げられているため、過度なリクエストを送らないために sleep しながら実行します。