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 しながら実行します。