見出し画像

[note tips] noteのフォロワーは1,000人までしか確認できない

「noteで、自分のフォロワーが20人×50ページの1,000人までしか見れないのですが、全員見る方法はありますか?」

回答:「ありません」(2025/06/07現在)


【結論】noteのフォロー、フォワーは1,000人までしか表示されない


[ブラウザ・アプリ]

PC・スマホのブラウザでは1ページ20人で50ページまでの1,000人まで。
スマホアプリはページがありませんが、どれだけスクロースしても上限の1,000人までしかフォロー(フォロイー)・フォロワーは表示されません。


[Chrome拡張機能]

「note フォローチェッカー」というChrome拡張機能がありますが、これも50ページまでのようです。
※あまり安易に拡張機能をインストールしたくないため、実機での確認はしていません。


[プログラミング]

noteの非公式APIを使って取得を試みましたが、結局、1,000人までしか取得できませんでした。

フォロワー取得の非公式API

https://note.com/api/v2/creators/{note ID}/followers?page=1&per=20

フォロー(フォロイー)取得の非公式API

https://note.com/api/v2/creators/{note ID}/followings?page=1&per=20

{note ID}:自分のnote ID。「https://note.com/〇〇」の〇〇の部分
page=1:「1」が1ページ目を指し、2ページ目の場合は「2」に変更

「page=51」など51ページ以降は取得できませんでした。


ということで、誰からフォローされているか、
私はわかりません。

最近フォローいただいた方は、表示されている1,000人に含まれるためわかりますが、古くからフォローされている方が把握できないです💦


フォロワー一覧のExcel保存方法


1,000人までという制限がありますが、フォロワーを自動的に取得し、Googleスプレッドシートに保存(その後、Excelに変換は手動)するプログラムを作りました。


【2025/06/09追記】

作ってみて、いろいろ試していくうちに価値を感じるようになりました。

「皆さんはこの人いいな、ベンチマークしたいな」


という人はいませんか?


実は自分だけではなく、他の人のフォロワーさんも取得できます。

つまり、人気のnoterさんのフォロー・フォロワーの分析ができるのです。


「この人はどんな人をフォローしているのだろう?」
⇒ この人がフォローしているなら、きっと有益な情報を提供していたり、面白い記事が読めるかもしれない✨


「この人はどんな人にフォローされているのだろう?」
⇒ どのような内容の記事を公開して交流すると、どんな読者層の支持・フォローされるか、わかるかもしれない💡
また、フォロワーさんの記事を読んで、スキやフォローをするとその人と交流できるかもしれない💖


ということで、

なんとかフォロワー一覧を取得できないかなと思って調べたり、プログラミングしたりで2時間も使ってしまいました(失敗したぁ)😭

と書いていましたが、2時間の価値はありました。

ただし、下記はその通りなので、これは改善したいと思います。

プログラミングをする前に、
「1,000人以上取得できるか?」、言い換えると、
「https://note.com/api/v2/creators/{note ID}/followers?page=51&per=20」を試し、取得できないことを確認すればプログラミング不要でした。

普段、「プログラムする前にきちんと設計しよう」という立場なのに自分ができていませんでした。反省です。自戒のためにメモ。

下記は、GoogleのApps Scriptを使ったソースです。

/**
 * noteのフォロワー情報を取得し、Googleスプレッドシートに保存するメイン関数。
 * このAPIは非公式なため、将来的に動作しなくなる可能性あり。
 * サーバーに過度な負荷をかけないよう待機時間を設定。
 */
function getAndSaveNoteFollowers() {
  const allFollowers = [];
  // ここにフォロワーを取得したいNoteユーザーのIDを設定してください
  // 例: 'murata_ssj'
  const USER_ID_TO_FETCH = 'murata_ssj'; 
  
  // サーバー負荷軽減のための待機時間(秒)
  const WAIT_TIME_SECONDS = 5.0; 
  const MAX_PAGES = 100; // 取得する最大ページ数、noteの仕様上、実質最大50ページ

  Logger.log(`ユーザーID: '${USER_ID_TO_FETCH}' のフォロワー取得を開始します。`);

  for (let i = 1; i <= MAX_PAGES; i++) {
    // noteの非公式v2フォロワーAPIエンドポイント
    const url = `https://note.com/api/v2/creators/${USER_ID_TO_FETCH}/followers?page=${i}&per=20`;

    Logger.log(`ページ ${i} を取得中: ${url}`);

    let response;
    try {
      // UrlFetchApp.fetch を使用してHTTP GETリクエストを実行
      // muteHttpExceptions: true でHTTPエラーでも例外を投げずレスポンスを返させる
      response = UrlFetchApp.fetch(url, { muteHttpExceptions: true });
    } catch (e) {
      Logger.log(`URLフェッチ中にエラーが発生しました(ページ ${i}): ${e.message}`);
      break; 
    }

    const statusCode = response.getResponseCode(); 
    if (statusCode !== 200) {
      Logger.log(`エラー: ステータスコード ${statusCode} (ページ ${i}、URL: ${url})`);
      Logger.log(`エラーレスポンス本文: ${response.getContentText()}`);
      break; 
    }

    Logger.log(`ページ ${i} を正常に取得しました (ステータス: ${statusCode})`);

    let dataJson;
    try {
      dataJson = JSON.parse(response.getContentText());
    } catch (e) {
      Logger.log(`ページ ${i} のJSONパース中にエラーが発生しました: ${e.message}`);
      break; 
    }

    // フォロワーデータは `data.follows` または `data.users` に格納される。
    const currentFollowers = dataJson.data && dataJson.data.follows ? dataJson.data.follows : [];

    if (currentFollowers.length === 0) {
      Logger.log('これ以上フォロワーが見つかりませんでした。');
      break; 
    }

    allFollowers.push(...currentFollowers); // 取得したフォロワーを全体リストに追加

    // サーバー負荷軽減のための待機(ミリ秒単位に変換)
    Utilities.sleep(WAIT_TIME_SECONDS * 1000);
  }

  Logger.log(`フォロワーの取得が完了しました。合計: ${allFollowers.length} 件`);

  // --- 取得したフォロワーデータをスプレッドシートに保存 ---
  if (allFollowers.length > 0) {
    saveFollowersToSpreadsheet(allFollowers, USER_ID_TO_FETCH);
  } else {
    Logger.log("スプレッドシートに保存するフォロワー情報がありませんでした。");
  }
}

/**
 * 取得したフォロワーオブジェクトのリストをGoogleスプレッドシートに保存する補助関数。
 * @param {Array<Object>} followersList フォロワーオブジェクトのリスト
 * @param {string} userIdToFetch データを取得したユーザーのID (ファイル名に利用)
 */
function saveFollowersToSpreadsheet(followersList, userIdToFetch) {
  // スプレッドシートのファイル名を動的に生成
  const spreadsheetName = `Note_${userIdToFetch}_フォロワーリスト_${new Date().toLocaleDateString('ja-JP').replace(/\//g, '-')}`;
  const spreadsheet = SpreadsheetApp.create(spreadsheetName); 
  const sheet = spreadsheet.getActiveSheet(); 

  // ヘッダー行を定義
  const headers = ['ユーザー名', 'URL名', 'プロフィールURL', 'フォロワー数', 'フォロー数', 'プロフィール文'];
  sheet.appendRow(headers); 

  // データをスプレッドシートの行形式に整形
  const dataToAppend = followersList.map(follower => {
    const userName = follower.name || '';
    const urlName = follower.urlname || '';
    const profileUrl = `https://note.com/${urlName}`; 
    const followerCount = follower.followerCount || 0;
    const followingCount = follower.followingCount || 0;
    // 改行文字をスペースに置換
    const profileText = (follower.profile || '').replace(/\n/g, ' '); 
    
    return [userName, urlName, profileUrl, followerCount, followingCount, profileText];
  });

  // 整形したデータをシートに一括書き込み
  if (dataToAppend.length > 0) {
    sheet.getRange(sheet.getLastRow() + 1, 1, dataToAppend.length, headers.length)
         .setValues(dataToAppend);
  }

  Logger.log(`フォロワーデータをスプレッドシート '${spreadsheet.getName()}' に保存しました。`);
  Logger.log(`スプレッドシートのURL: ${spreadsheet.getUrl()}`);
}


いいなと思ったら応援しよう!

村田 裕樹 最後までお読みいただきありがとうございました! サポートもうれしいですが「スキ」をしていただけると大変励みになります!!