0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Nodeでnoteのブックマークレット作成

Last updated at Posted at 2025-11-29

はじめに

別に狙ったわけではなく、Nodeでnoteです。ややこしいわ。

noteの数値を観測したいから、自分で作るか

とあるnoteアカウントでほぼ毎日投稿しているのですが、アクセス解析とかフォロー数の増減とか、そういうのが 微妙に使いづらい です。「今」のフォロー数とか、「今」の記事のアクセス数・スキ(いいね)数は見られる。それもいいけど、時系列に数の増え方を見たいなーと思って、ちょっと調べました。

調べた結果、noteは巷で非公式APIと呼ばれているものがあり、逆に公式はない。ほしい人は、非公式APIを使っているようです。もちろん、仕様はオープンになっていないし、急な仕様変更もある。不正アクセスとして、使っているアカウントがバンされるかもしれない。

ちなみにそれは、noteを使っているときの通信を開発者ツールで見て探すらしいです。めんどくさいなぁ。

ログインもめんどくさい

というわけで、それをやってみようかなーと思った最初の壁が、ログインです。

まぁちゃんと作ればできるかもしれないけど、ちゃんとやるほど仕様変更対応がめんどくさい。せっかく作ったのに...ってなる。

ダメ人間丸出しか。

めんどくさい x めんどくさい = ブックマークレット

対策として、ブラウザでログイン(クッキーで)した上で、ブックマークレットでAPIアクセスすれば、クリックを数回やればすむと気付きました。

そしてブックマークレットの開発は、Node.jsでやりたいよなぁということで、「Nodeでnoteのブックマークレット作成」です。

ほぼ、環境設定の記事です。

作成

環境構築 ステップ1

最初のこういうの↓はいいとして

mkdir bookmarklet-ts
cd bookmarklet-ts
npm init -y
npm install --save-dev typescript
npx tsc --init

tsconfig.jsonはこうしました。↓

tsconfig.json
{
  "compilerOptions": {
    "rootDir": "./src",
    "outDir": "./dist",

    "target": "ES2017",
    "module": "none",

    "strict": true,
    "skipLibCheck": true,
    "removeComments": true,

    "moduleDetection": "legacy"
  },
  "include": ["src/**/*"]
}

package.jsonscriptsはこう。↓

package.json(抜粋)
"scripts": {
  "build": "npx tsc"
}

で初めのソースとして、

src/main.ts
(() => {
  const msg = "ブックマークレットからこんにちは!";
  alert(msg);
})();

これで、npm run buildを実行すると、dist/main.jsができる。この時コメントも削除されます。

環境構築 ステップ2

つぎに、dist/main.jsを読みこんで、ブックマークレットに入れられる形に加工します。

scriptsフォルダを作って、scripts/build-bookmarklet.jsを作成。↓

scripts/build-bookmarklet.js
const fs = require("fs");
const path = require("path");

const jsPath = path.join(__dirname, "..", "dist", "main.js");
const jsCode = fs.readFileSync(jsPath, "utf8");

// 余計な改行をつぶして1行に
const oneLine = jsCode.replace(/\s+/g, " ");

// IIFE で包んで bookmarklet 用にする
const wrapped = "javascript:(()=>{" + oneLine + "})();";

// URL エンコードしておくと安全な場合が多い
const encoded = "javascript:" + encodeURIComponent("(function(){" +
  oneLine +
  "})();"
);

// そのまま版と、エンコード版を両方出力
console.log("=== bookmarklet (raw) ===");
console.log(wrapped);
console.log("");
console.log("=== bookmarklet (encoded) ===");
console.log(encoded);

このスクリプトが実行されるように、package.jsonscriptsに仕込みます。

package.json(抜粋)
"scripts": {
  "build": "npx tsc",
  "bookmarklet": "node scripts/build-bookmarklet.js",
  "build:all": "npm run build && npm run bookmarklet"
}

これで、npm run build:allを実行することで、ブックマークレットへコピペできる1行のJavaScriptがコンソール画面に表示されます。
ブックマークから実行することで、ブラウザのコンソールに出力されると。

肝心のnoteのAPI呼び出し

API自体は調べればいろいろ出てくるので、ここでは詳しく書きません。
"notemag"という公式のnote編集部さんの記事一覧を取得するTypeScriptがこちら。

src/main.ts
async function main() {
    const userId = "notemag";
    const page = 1;
    
    const url =
        `https://note.com/api/v2/creators/${userId}` +
        `/contents?kind=note&page=${page}`;
    
    // コメントを書いても大丈夫
    fetch(url)
        .then((res) => res.json())
        .then((data) => {
            console.log("note api:", data);
            alert("OK: console を見てください");
        })
        .catch((err) => {
            console.error(err);
            alert("API error");
        })
    ;
}

main().catch((e) => {
    console.error(e);
});

こういうの↓が出てきて、ブックマークレットとして動かして、無事動きました。

javascript:(()=>{"use strict"; async function main() { const userId = "notemag"; const page = 1; const url = `https://note.com/api/v2/creators/${userId}` + `/contents?kind=note&page=${page}`; fetch(url) .then((res) => res.json()) .then((data) => { console.log("note api:", data); alert("OK: console を見てください"); }) .catch((err) => { console.error(err); alert("API error"); }); } main().catch((e) => { console.error(e); }); })();

無事ゲット↓
image.png

Next

ここからいろいろなAPIを呼び出して、欲しいデータを取得して加工とかですね!でもなんか関心が薄れてきて気力が尽きたところで私はおしまい😑 次の人にバトンをつなぎます🏃‍➡️

httpサーバーを自分で立て、そこにブックマークレットからPOSTし、サーバーでDBへ登録すれば、記録とかBI化まで見えますね。でもモチベ切れです。

おわりに

noteのAPI非対応というのはどういうポリシーなんでしょうね。自動化の時代にそぐわない気がする。置いてかれる気がする。
今はAPIは、エンジニアだけが使うものではなくAIも使うのだから、AIの向こう側にいる一般ユーザーもAPIを使うと言っても過言ではないと私は思います。

ところでこういう軽いコーディングは、AIでコーディングをするとすごく早い。関数の引数とか調べなくていいですよね。楽。
もう少ししたら、今回の内容とか、「それだったらブックマークレット使うといいよ!作りましょうか?」とかまでいくのかなぁ。いくんでしょうねぇ。

ではよきブログライフを!

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?