メインコンテンツへスキップ
見出し画像

「スキ営業」「フォロー営業」を通知から消します ── Chromeブラウザ拡張機能

    ───通知なんてなくていい

    スキしてくれた、と思ったら消えてる。
    フォローされた、と思ったらいなくなってる。

    通知だけ届けて去っていく──「スキ営業」「フォロー営業」です。

    自分のプロフィールに誘導して有料記事を買わせたいだけ。
    しかもWEB上にはこれをbotで自動化するサービスまである。

    ───そんな通知はあなたの心を乱すだけ。

    • noteの通知パネルから「スキ逃げ」「フォロー逃げ」パターンを検出し、該当する通知を自動で非表示にします。

    • 通知そのものに振り回されたくないときは、無条件でスキ通知・フォロー通知を非表示にもできます。

    デフォルトでは、スキ逃げ/フォロー逃げが確定した営業アカウントの通知は、通知パネルに表示される前にこっそり消えます。複数人が同時にスキした通知(「〇〇さん他n名があなたの記事にスキしました」)でも、営業アカウント分だけ差し引いて人数・名前を書き換えるので、違和感なく残りの通知だけが目に入ります。

    Chrome ウェブストアには出していないので、パッケージ化されていない拡張機能として手動で読み込みます。専門知識がなくても大丈夫です。以下の手順どおりに進めてください。

    動作環境

    • Google Chrome(Manifest V3 対応版。Chrome 88 以降)

    • Microsoft Edge / Brave / Vivaldi など Chromium 系ブラウザでも同じ手順で動きます

      • Edge の場合は chrome://extensions の代わりに edge://extensions を開いてください

    画像

    通知の非表示をOFFにすると

    設定の「通知の非表示」チェックを外すと、隠れていた通知がその場ですぐに元通り表示されます。この状態では、フォロー数などから営業アカウントらしさが強いと判定されたアカウントのアイコンに、通知パネル内でだけ色付きのリングが付きます(記事ページやタイムラインなど、パネルの外には広げていません)。

    画像




    📎 この記事の原文は ayame.quest に掲載しています。


    用語

    • スキ逃げ : 通知に「スキしました」が残っているが、該当記事のスキ一覧にそのアカウントが存在しない状態

    • フォロー逃げ : 通知に「フォローしました」が残っているが、フォロワー一覧にそのアカウントが存在しない状態

    • 通知の非表示 : スキ逃げ/フォロー逃げが確定したアカウントからの通知を、通知パネルから丸ごと消す(またはそのアカウント分だけ差し引いて表示する)機能。デフォルトON

    • 黄丸 : スキ逃げ or フォロー逃げが検出され、かつ「フォロー営業パターン」ゲート条件(後述)を満たしたアカウント。通知の非表示をOFFにした場合のみ見える

    • 赤丸 : 黄丸のうち、営業アカウントらしさがさらに強いアカウント(条件は後述)

    • 📟 BURN : ユーザーが「要監視」登録したアカウントが黄丸 or 赤丸を発動した状態。事前にマークした怪しいアカウントの答え合わせ


    インストール

    ここからzipファイルをダウンロードして任意のフォルダに展開

    manifest.json が直下にあるフォルダをChrome に読み込みます。

    note-bainin-scouter-main/
    ├── manifest.json   ← これがあるフォルダを選ぶ
    ├── background.js
    ├── common.js
    ├── content_script.js
    ├── offscreen.html
    ├── offscreen.js
    ├── popup.html
    ├── popup.js
    └── icons/
    
    1. アドレスバーに chrome://extensions と入力して開く
      (メニューからは「拡張機能」→「拡張機能を管理」)

    2. 右上の デベロッパー モード のトグルを ON にする

    3. 左上に出てくる 「パッケージ化されていない拡張機能を読み込む」 をクリック

    4. 手順1で用意した manifest.json があるフォルダ を選択して「フォルダーの選択」

    5. 一覧に「スキ営業」「フォロー営業」スカウターが追加される

    6. ブラウザで note.com を再読込すれば完了


    使い方

    • note.comの通知ベルをクリックしてパネルを開くと、自動的にパースと照合が始まります。

    • 初回はまだ「確定」していないので、通知はいつも通り全部見えます。しばらく使っていると、スキ逃げ/フォロー逃げが確定したアカウントの通知が、次第にパネルから消えていきます。複数人同時の通知(「〇〇さん他n名が…」)は、営業アカウント分だけ差し引いた人数・名前に書き換わります。全員が営業アカウントだった通知はカードごと消えます。


    • 拡張機能アイコンのpopupから設定できます。

      • 通知の非表示(デフォルトON。OFFにすると即座に元表示へ戻ります)

      • スキ/フォローそれぞれの判定期間(1時間・1日・1週間・1か月)

      • APIコール間隔(後述のレート制限の基準値)

      • 検出済みアカウント数(黄丸/赤丸/BURN)・最終スキャン日時

      • 「🔄 今すぐ再スキャン」: 開いている通知パネルの即時再パース+保留中の照合+判定済みアカウントの赤丸条件の再評価をまとめて実行(30秒のクールダウンあり)

      • 要監視リストの編集(1行1urlname)

      • キャッシュクリア(判定結果・未確定通知・自分のurlnameキャッシュを削除。設定と要監視リストは保持)


    画像
    画像

    通知の非表示をOFFにすると

    設定の「通知の非表示」チェックを外すと、隠れていた通知がその場ですぐに元通り表示されます。この状態では、フォロー数などから営業アカウントらしさが強いと判定されたアカウントのアイコンに、通知パネル内でだけ色付きのリングが付きます(記事ページやタイムラインなど、パネルの外には広げていません)。


    画像
    • 🟡 黄色いリング: 黄丸

    • 🔴 赤いリング: 赤丸

    • 🟠 脈動するオレンジのリング: BURN

    プロフィールページ(https://note.com/{urlname})を開くと、フォローボタンの近くに「📟 スカウターに登録する」ボタンが挿入されます。押すと要監視リストに追加され、以後そのアカウントが黄丸/赤丸を出すとBURN表示に昇格します。このボタンは通知の非表示がONのときは表示されません。

    検出したあと煮るなり焼くなりブロックするなり通報するなり、そこはあなたのマイワールド( ᐛ )


    動作がおかしいとき

    「赤丸のはずなのにマーカーが付かない」「非表示になるはずの通知が消えない」など、判定と表示が合っていないように見えたら、まず以下の順番で試してください。

    1. chrome://extensions で拡張機能をリロードする

    2. note.comのタブを完全リロードする(Ctrl+Shift+R、またはCtrl+F5。通常リロードはブラウザキャッシュが残ることがあるため、キャッシュを無視する方を使う。MacはCmd+Shift+R)

    3. popupの「📋 判定ログを見る」で、該当アカウントの level・reasons・判定日時を確認する

    4. それでもおかしければ、popupの「キャッシュクリア」→「🔄 今すぐ再スキャン」の順に実行する

    5. 再スキャン中(数秒〜長いと1分程度かかることがあります)は、設定や要監視リストを変更しないで完了を待つ

    5番目が地味に重要です。スキャンはnote.comへの負荷軽減のため意図的に間隔を空けながら複数リクエストを行うため、体感より時間がかかります。スキャンが終わる前に設定を変更すると、反映が1テンポ遅れることがあります。

    上記を試しても直らない場合は、note.com側のDOM構造が変わって検出・非表示処理が壊れている可能性があります(下記「既知の制限」参照)。DevToolsのコンソールに [「スキ営業」「フォロー営業」スカウター] から始まる警告が出ていないか確認してください。


    検出の仕組み

    通知パネルを開く
      └─ content_script が li 要素をパースし、スキ/フォロー通知だけ抽出
           (コメント通知・バッジ通知は対象外)
      └─ 判定期間内のものだけを background(service worker) に送信
           └─ background がロックを取得し、note.comへの照合を実行
                 └─ 確定した judgments を content_script に返す
      └─ content_script が「通知の非表示」設定がONなら、確定したアカウントの
         通知だけをパネルDOM上で非表示/文言書き換え(OFFならマーカーのみ表示)
    

    初回にスキ逃げ/フォロー逃げが「確定」するまでは(noteのAPI照合が終わるまでは)通知は普通に見えます。非表示・マーカー付与のどちらも、確定後に反映される後追いの処理です。

    既知の制限

    • note.com側のDOM構造・クラス名に依存しているため、サイト側の実装変更で検出・非表示処理が壊れる可能性があります(その場合はconsole.warnにログを出してスキップする設計にしています)。

    • スキ逃げ/フォロー逃げ/赤丸条件はいずれもヒューリスティックです。誤検知(擬陽性)・見逃し(偽陰性)は原理的に避けられません。「通知の非表示」も同じ判定結果を使うため、この誤検知・見逃しをそのまま引き継ぎます。

    1. 黄丸判定

    • スキ逃げ: GET /api/v3/notes/{noteId}/likes?page=N(公式API、認証不要)を最大5ページまで参照し、通知にあったurlnameがスキ一覧に見つからなければ検出。

    • フォロー逃げ: GET /{自分のurlname}/followers?page=N を最大5ページまでスクレイピングし、同様に見つからなければ検出。

    • スキ逃げ/フォロー逃げを検出しただけでは黄丸になりません。プロフィールページ(https://note.com/{urlname})を取得してフォロー数・フォロワー数を確認し、フォロー数が一定数(既定値: 500)以上、かつ フォロー数÷フォロワー数の比率が一定値(既定値: 1倍)以上という「黄丸ゲート条件」を満たした場合のみ黄丸が確定します。

      • これは、細々と活動している小規模アカウント(フォロー数もフォロワー数も少ない)が、誤操作等によるスキ逃げ/フォロー逃げだけで黄丸になってしまうのを防ぐためのものです。

      • ゲート条件を満たさなかったアカウントは、以後同じ通知を再照合しないよう内部的に記録だけ残しますが、マーカーは一切表示されません。

      • 閾値はpopupの「黄丸ゲート条件(フォロー営業パターン)」欄から変更できます。変更後は「🔄 今すぐ再スキャン」を押さなくても、キャッシュ済みのフォロー数/フォロワー数を使って再フェッチなしで黄丸への昇格・除外がすぐ反映されます。

    • 要監視リストに登録済みのアカウントは、この黄丸ゲートを無視します。スキ逃げ/フォロー逃げが検出されれば、ゲート条件を満たさなくても即座にBURN(📟)になります(後述「3. BURN」参照)。

    • 操作ミスでスキやフォローを押したあとにすぐ取り消したケース も検出されます(操作ミスであることが判別できないため)

    • 自分のurlnameは、スキ通知のリンク先URL(note.com/{自分}/n/{noteId})から自動検出してキャッシュします。

    2. 赤丸への昇格

    黄丸(またはBURN)が立ったアカウントに対してのみ、メンバーシップ加入ページ・マガジン一覧ページ・コンテンツバーの固定ページを追加取得し、以下のいずれかを満たせば赤丸に昇格します(有料記事の有無は、黄丸ゲート判定の際に取得済みのプロフィールページの情報をそのまま使います)。取得は各アカウントにつき一度だけ行い、結果はキャッシュされます(「🔄 今すぐ再スキャン」を押すまで再取得しません)。

    1. アカウントトップの記事一覧(最新18件)に有料記事が1件以上ある(単品有料・メンバーシップ限定のどちらも対象)

    2. メンバーシップ加入ページ(https://note.com/{urlname}/membership/join)に価格表示(「額500円」のような文字列)が含まれる(=有料プランが実際に設定されている。ページ自体が404を返さないだけでは加入プラン未設定でも200になるケースがあり誤判定するため、本文の価格表示まで確認します)

    3. マガジン一覧ページ(https://note.com/{urlname}/magazines)に価格1円以上のマガジンが含まれる(=有料マガジンを保有している)

    4. プロフィール上部の「コンテンツバー」に「仕事依頼」タブがあり、そのリンク先note記事が単品有料である

    5. 同じく「プロフィール」タブがあり、そのリンク先note記事が単品有料である

    (フォロー数÷フォロワー数比率の条件は、黄丸を確定させるための「ゲート条件」に役割が変わったため、赤丸への昇格条件からは除外されています。黄丸になった時点でこの条件は必ず真になるためです。)閾値はpopupの「黄丸ゲート条件(フォロー営業パターン)」欄から変更できます。変更後は「🔄 今すぐ再スキャン」を押すと、判定済みのアカウントにも新しい閾値がすぐ反映されます。

    条件1は、プロフィールページのHTMLに埋め込まれたRSCペイロード内の priceInfo.isFree を直接読んで判定します(以前はレンダリング後のTailwindクラス名をDOMで走査していましたが、クラス名がHTMLに現れないアカウントで有料導線を丸ごと見逃していたため変更しました)。判定ログには「有料記事: n件 / 一覧18件」と、固定記事自体が有料だった場合はその旨も表示します。

    条件4・5の「仕事依頼」「プロフィール」タブは、コンテンツバーをカスタマイズしているアカウントにのみ存在するカスタムナビ項目です。プロフィールページのHTMLに埋め込まれたリンク先(linkUrl)を読み取り、そのリンク先note記事ページ自体を取得して、埋め込みJSON中のクォート済み価格文字列("¥1,234")の有無で単品有料かどうかを判定します。タブが無いアカウントでは追加のフェッチ自体を行いません(該当条件はスコアに加算されないだけで、赤丸判定には影響しません)。メンバーシップ限定記事(¥表記を持たない)は条件1・条件4・5のいずれの方式でも取りこぼす既知の限界があります。

    判定ログには、上記5条件のうち何個に該当したかを「赤丸条件スコア: n/5」として表示します。なお、黄丸ゲート条件を満たさなかったアカウントについては、メンバーシップ・マガジン・コンテンツバー固定ページのフェッチ自体を省略しています(無駄なリクエストを行わないDoS対策方針に合わせたものです)。

    3. BURN

    要監視リストに入っているアカウントが黄丸・赤丸いずれかを発動すると、表示レベルが強制的に burn になります(優先度: BURN > 赤丸 > 黄丸)。


    DoS対策(安全設計)

    このツール最大の設計目標は「note.comのサーバーに迷惑をかけないこと」です。多段階でレート制限をかけています。

    • 呼び出し間隔 : いいね一覧・フォロワー一覧の取得は各コール間に apiIntervalMs(既定500ms、popupで変更可)のsleep。プロフィール取得・メンバーシップ加入ページ確認・マガジン一覧確認・コンテンツバー固定ページ確認(黄丸ゲート判定・赤丸判定)は各コール間に固定2000msのsleep

    • ページネーション上限 : いいね一覧・フォロワー一覧とも最大5ページで打ち切り(それ以上埋もれていたら営業目的の可能性は低いと判断)

    • セッション上限 : 1回のトリガーにつき、処理する通知は最大50件、新規に取得する記事のいいね一覧は最大20記事、黄丸ゲート/赤丸判定は最大10アカウント。各アカウントにつきプロフィールで最大1リクエストが初回チェック時の1回だけ発生し、黄丸ゲート条件を満たした場合のみさらにメンバーシップ・マガジンで最大2リクエスト、コンテンツバーに「仕事依頼」「プロフィール」タブがある場合のみそれぞれ最大1リクエストが追加される(タブが無ければ発生しない。全条件該当時で計最大5リクエスト。ゲート不合格アカウントはプロフィール1リクエストのみで打ち切り)。結果はキャッシュされ、以降は強制再スキャンしない限り再取得しない。超過分は次回トリガー時に持ち越し、まとめて発火しない

    • レスポンスキャッシュ : いいね一覧・フォロワー一覧はTTL 30分でキャッシュし、同じ記事・同じページへの再フェッチを避ける

    • 429対応 : 429 (Too Many Requests) が返った場合は指数バックオフで最大3回までリトライし、それでもダメなら諦めて次回トリガーに回す

    • 排他ロック : background(service worker)側で同期的なロックを持ち、複数タブで同時に通知パネルを開いても照合処理が二重に走らない(awaitをまたいだ競合が起きないよう、ロックの取得自体は非同期処理の前に同期的に行っている)

    • 手動再スキャンのクールダウン : 「今すぐ再スキャン」ボタンはメモリ上のロック+chrome.storage.localへの永続化の二重チェックで30秒間の連打を防止(popupを閉じて開き直しても回避不可)

    • fetch対象の限定 : 対象は「自分の投稿へのいいね一覧」「自分のフォロワー一覧」「スキ逃げ/フォロー逃げが検出された相手のプロフィールページ・(黄丸ゲート条件を満たした場合のみ)メンバーシップ加入ページ・マガジン一覧ページ・(コンテンツバーに該当タブがある場合のみ)仕事依頼/プロフィールの固定noteページ」のみ。メンバーシップ・マガジン・固定noteページは本文への正規表現検索のみ(DOM解析はプロフィールページのみ)。無関係なページを巡回することはない

    • 代行操作なし : ブロック・通報・フォロー解除などをツールが自動で行うことは一切なく、検出のみに徹している

    見積もりとして、最悪ケース(新規記事20件×5ページ + プロフィール10件 + メンバーシップ確認10件 + マガジン確認10件 + 仕事依頼/プロフィール固定ページ確認最大20件、=全アカウントが黄丸ゲート条件を満たし、かつコンテンツバーの両タブを持つ場合)でも1セッションはおよそ100〜160リクエスト・約1〜2分に収まるよう設計されています。実際には黄丸ゲート条件を満たさないアカウントはプロフィール取得のみで打ち切られ、コンテンツバーのタブが無いアカウントでは固定ページ確認自体が発生しないため、多くの場合これより少なくなります。


    データ保存

    すべて chrome.storage.local に保存され、外部送信は一切行いません。

    • settings: 通知の非表示ON/OFF、判定期間(スキ/フォロー別)、APIコール間隔

    • myUrlname: 自動検出した自分のurlname

    • watchlist: 要監視リスト(urlnameの配列)

    • judgments: urlnameごとの判定結果(レベル・理由・検出日時など)。30日で自動失効

    • pendingChecks: まだ確定していない通知(判定期間を過ぎると「本物のスキ/フォロー」と判断して自動的に消える)

    • responseCache: いいね一覧・フォロワー一覧のキャッシュ(TTL 30分)

    • lastScanAt / lastForceRescanAt: 最終スキャン日時・最終手動再スキャン日時


    アーキテクチャ

    manifest.json          Manifest V3 定義
    common.js               全コンテキスト共有の定数・ユーティリティ
    content_script.js       通知パネルのDOM監視・パース・マーカー描画・監視ボタン挿入
    background.js           service worker。照合ロジック・レート制限・排他ロック
    offscreen.js/html       service workerにはDOMParserが無いため、
                             フォロワー一覧・プロフィールページのHTML解析だけをここで代行する
    popup.html/js           設定UI
    styles.css               マーカー・ボタンのスタイル
    


    ユーザーサポート

    え?( ᐛ )


    ライセンス

    このツールはオープンソース(Apache License 2.0)で公開しています。誰でも無料で使えて、改変や再配布もOKです。ただし、著作権表示とライセンス文の記載はそのまま残してね。

    Copyright 2026 feral scholar Ayanonymous | TruResearch™


     
     
    feral scholar | TruResearch™ 本店🕊️ https://www.ayame.quest/tru_research/ ここにあるのは「答え」じゃなくて「地図」。 なぜそうなっている?を解きほぐす、ひとりリサーチメディア。

    あなたへのおすすめ