【日替わり】Amazonタイムセール

note メンバーシップ掲示板で検索/保存するための過去投稿のスクロール/展開の自動実行スクリプト

当サイトには広告を含みますが、広告でなく単なる紹介等の場合もあります。

当サイトでは、広告掲載ポリシーに沿って広告を掲載しています。
※広告でなく、単に商品やサービスを自主的に紹介しているだけという場合もあります。

その中でも "オススメ" として紹介している商品やサービスは、個人的にそう思えたものだけです。

共感、興味をもっていただけるものがあればご利用ください。

noteのメンバーシップに参加(購読)しているのですが、掲示板の検索や保存ができなくて困っていました。

本記事では、その解決策の1例をまとめておきます。

参考にされる場合には、トラブル防止のため調べたりしながらお試しください。

本記事の内容は、個人的な調査結果や経験、推測、感想に基づいています。
正確かどうか、最新かどうかについては適切な情報をご確認ください。

目次

noteのメンバーシップ掲示板でできないこと

noteのメンバーシップ内の掲示板で、情報を探すために特定のキーワードで検索したくなったり、過去投稿を読み返しやすいようHTML保存したくなったりする訳ですが、noteの標準機能ではそのようなことができません。

検索についてはnoteのサポートにも問い合わせてみたのですが、本記事の作成時点では不可ということでした。

超不便。有料コンテンツを提供するプラットフォームだというのに(個人の感想です)。

でも、なんとか解決したいですね。

noteメンバーシップ掲示板のスクロール/展開の自動実行スクリプト

ということで、チャッピー(ChatGPT)に相談してスクリプトを作ってもらいました。

本記事では私が使用したスクリプトを共有しますが、あくまで自己責任でご参考ください。実行環境、実行方法、実行結果などなど、ご自身の責任のもとでご判断願います。

note の禁止事項等

本記事で紹介するスクリプトは、noteのメンバーシップ掲示板でスクロールと展開を自動実行するものです。

noteの利用規約にはスクレイピングなどを禁止する直接的な記載は見当たりませんが、「サービスの障害となる行為」は禁止されています。

note総則規約

13. 禁止事項

(7) 当社のサービスの障害となる行為を行うこと

出典:note ご利用規約 – ご利用規約

掲示板の単一ページ内で読み込みを繰り返し実行したところでサービス障害を引き起こすほどの負荷は発生しないと思いますが、環境次第なので断言はできません。ということで、noteに迷惑がかからないよう適度に遅延パラメタを調整するなどして自己責任でご参考ください。

また、禁止事項に記載が無ければ何をしても良いという意味でもありません。

程度が難しいのですが、とりあえずアウトかセーフかのラインではなく、人間よりちょっと素早く操作しているかなぁくらいのスピード感での自動化を想定しています。

ちなみに、今回のスクリプトは、スクレイピングというよりはRPAみたいに操作の自動化を行うものです。

環境

Windows 11 PC 上の Chrome ブラウザで note の掲示板を開いて動作を確認しました。

チャッピーに作ってもらったスクリプトは JavaScript で、それをChromeの開発者ツールで実行します。試していませんがブックマークレットでも実行可能なはずです。

また、他のブラウザでも動作すると思いますが、試していません。

掲示板のデータ量に応じ、それなりにメモリを消費するかもしれません。スマホでは厳しいかも。

動作

このスクリプトは、メンバーシップ掲示板をブラウザで表示した状態で実行するとページの中にあるもっとみる以前の返信を表示のクリックや、画面最下部までのスクロールを繰り返し実行します。

もっとみる
以前の返信を表示
スクロール

その結果、もっとみる以前の返信を表示で折り畳まれたコンテンツが展開されたり、過去の投稿分のコンテンツが表示されたりします。

ステータス表示機能もついており、スクリプトの実行終了時には✅完全展開完了と表示されます。これ以上スクロールできないと判断されたら終了です。

BASE_DELAY変数で1つ1つの操作の際の遅延時間を ms単位で設定します。

スクリプト

スクリプトの内容は以下のとおりです。チャッピーが作ってくれたものをそのまま掲載しています。BASE_DELAY変数はちょっと大きめの値にしてあります(人間よりちょっと素早く操作しているかなぁくらい)。

スクリプトの細かい解説など、不明点がありましたらご質問いただくと良いかと思います(あなたのチャッピーなどに)。

(async () => {

  /***** 設定 *****/
  const BASE_DELAY = 1000;     // 全体速度調整はここだけ
  const STABLE_LIMIT = 5;     // 安定判定回数
  /****************/

  const sleep = (ms) => new Promise(r => setTimeout(r, ms));

  // ===== ステータス表示 =====
  const status = document.createElement("div");
  status.style.cssText = `
    position: fixed;
    bottom: 12px;
    right: 12px;
    padding: 6px 10px;
    background: rgba(0,0,0,0.7);
    color: white;
    font-size: 12px;
    border-radius: 6px;
    z-index: 99999;
  `;
  document.body.appendChild(status);

  const setStatus = (t) => status.textContent = t;

  // ===== 展開可能ボタン判定 =====
  const hasExpandableButtons = () =>
    [...document.querySelectorAll("button")]
      .some(b =>
        (b.textContent.includes("もっとみる") &&
         b.getAttribute("aria-expanded") === "false") ||
        b.textContent.includes("以前の返信を表示")
      );

  let lastHeight = 0;
  let stableCount = 0;

  setStatus("準備中…");

  while (stableCount < STABLE_LIMIT) {

    // ---- もっとみる ----
    setStatus("📡 通信中:もっとみる");
    const moreButtons = [...document.querySelectorAll("button")]
      .filter(b =>
        b.textContent.includes("もっとみる") &&
        b.getAttribute("aria-expanded") === "false"
      );

    for (const btn of moreButtons) {
      btn.click();
      await sleep(BASE_DELAY);
    }

    // ---- 以前の返信を表示 ----
    setStatus("📡 通信中:返信表示");
    const replyButtons = [...document.querySelectorAll("button")]
      .filter(b => b.textContent.includes("以前の返信を表示"));

    for (const btn of replyButtons) {
      btn.click();
      await sleep(BASE_DELAY);
    }

    // ---- スクロール ----
    setStatus("📡 通信中:スクロール");
    window.scrollTo(0, document.body.scrollHeight);
    await sleep(BASE_DELAY * 10);

    // ---- 終了判定 ----
    const newHeight = document.body.scrollHeight;
    const expandableLeft = hasExpandableButtons();

    if (newHeight === lastHeight && !expandableLeft) {
      stableCount++;
    } else {
      stableCount = 0;
      lastHeight = newHeight;
    }

    setStatus(
      expandableLeft
        ? "🔁 再展開チェック中"
        : "😴 待機中"
    );

    await sleep(BASE_DELAY * 2.5);
  }

  setStatus("✅ 完全展開完了");
})();

実行方法

ブラウザでメンバーシップ掲示板を表示させた状態で、開発者ツールを開き(F12キー)、Console画面で前述のスクリプトを実行できます(コピー&ペーストしてEnterキー)。

ペースト時に “Don’t paste code into the DevTools Console that you don’t understand or haven’t reviewed yourself…” みたいな警告が出てペーストできない場合には、警告内容をよく確認した上でallow pastingを実行してからやり直すとペーストできます。この警告は、よく分からないコードを貼りつけてはいけないという内容です。

実行を中断したい場合はブラウザの画面ごと閉じるなどすればOKです。ネットワーク切断やいったんPCをスリープ/シャットダウンさせる等でも良いかと思います。

検索や保存

✅完全展開完了と表示されたら、スクリプトの実行が完了しています。

ブラウザの検索機能による検索や、ページ丸ごとの保存ができます。

実行に関する補足

上記のスクリプトの実行に関する補足事項です。

  • スクリプトの実行中、掲示板を表示しているブラウザのウィンドウのフォーカスは維持しなくてもOK(つまり、他のウィンドウを操作してもOK)。
  • 掲示板を表示しているタブを非表示にしてはいけない(つまり、そのタブを表示させたままの状態を維持しないといけない)。
  • PCのスペックや環境によっては負荷によりブラウザの応答が停止したりするかも。復帰しなければ強制終了の上、遅延時間を大きくしたり、スペックの良いPCに切り替えたりして、実行し直しをするか、あるいは諦める。
  • 掲示板のスクロールを進めるうちにページが重たくなり、最後までスクロールせずにスクリプトが終了する場合あり。再度実行すれば続きのスクロールや展開が可能。

チャッピーへのお願いの仕方

今回、チャッピーにスクリプトを作ってもらう際には、対象のページのもっとみる以前の返信を表示の部分を選択してから右クリックメニューで検証でDOM要素を確認してから、以下のように指示をしています。

Webブラウザ上に表示させた掲示板ページで、スクロールと展開を自動実行するツールを作ってください。展開は、DOM上の以下の要素をクリックする操作です。一度クリックしても、また繰り返し表示される場合があります。

<button class="mt-2 cursor-pointer text-sm text-text-secondary underline hover:text-text-primary" aria-expanded="false" aria-controls=":r2k:">もっとみる</button>

<button type="button" class="justify-self-start text-sm text-text-secondary underline hover:text-text-primary">以前の返信を表示</button>

遅延処理などは、その後に追加してもらっています。

まとめ

noteのメンバーシップ掲示板で過去投稿の全スクロール/全展開を自動実行するスクリプトについてでした。

記事作成、サイト管理
プロフ画像 (暫定版v2)

happynap
(はっぴぃなっぷ)

3人家族で暮らし
ITっぽい仕事をしつつ
ポイ活、投資を趣味的に
スキマ時間に、ゆるく全力でブログ
のんびり昼寝したい

目次