YouTubeで特定のチャンネルをブロック/非表示/排除する方法(ログインなし)

コンピュータ関連
スポンサーリンク
スポンサーリンク

YouTubeのフィードから特定のチャンネルをブロックして排除したい

YouTubeを使っていて、
このチャンネルは見たくないのになぜかおすすめに出てくる…
って事ありません?

「出てきにくくなる」じゃなくてもう
出したくないし、サムネすら見たくない。
特に昨今のAIで嘘八百をただ読み上げてるだけの動画とかイライラしてしまう。

そんな動画を排除する方法についてまとめます。備忘録です。

YouTube上で特定のチャンネルをブロックする機能はあるの?

結論から言うと、現時点(2025年7月)では
視聴者が特定のチャンネルを完全に非表示にする機能はなさそうです。

以前は「ユーザーをブロック」することで、そのチャンネルを非表示にする方法が提供されていたようです。が、現在そういったものは見当たりません。
また、「興味なし」とすることで一時的にフィードに出にくくすることは可能ですが、完全な除外ではなく、一定期間が経つと再度表示される可能性があります。
子供の保護者向け管理機能はあるそうですが、これもまた使い方として限定的かなと。

というかそもそもログインして使ってないので設定もなにもないんですけどね自分には。

というわけで、ログインなしで非表示にする場合は、
本記事のような ブラウザ拡張機能を利用した回避策 が現実的なアプローチになります。

スポンサーリンク

方法1:uBlock Originを使う

ブラウザはFirefoxを使っています。
最近では随分とシェアも減ったようですが、なんとなく使い続けています。

  • オープンソースであり、ユーザーのプライバシーに重点を置いている
  • uBlock OriginがManifest V2ベースで動作する最後の主要ブラウザ

そして uBlock Origin は、軽量で高性能な広告ブロッカー/コンテンツフィルター拡張機能です。
JavaScriptやDOM構造を解析し、不要なコンテンツの非表示・削除を行うことができます。広告だけでなく、ユーザー定義のフィルターによりWebページの任意の要素を非表示にすることが可能です。

[公式アドオンページ]からインストールできます。

マイフィルター(カスタムフィルター)の使い方と記述例

uBlock Originでは、「マイフィルター」機能を使って任意の要素を非表示にできます。

  1. uBlock Originの「設定」画面やアイコンからダッシュボードを開き、「マイフィルター」タブを選択
  2. 以下のようなフィルターを追加
  3. 「変更を適用」をクリック

フィルター記述例:


www.youtube.com##ytd-rich-item-renderer:has(ytd-channel-name:has-text(/感動大国日本|世界が称賛JAPAN|世界が○○るニッポン/i))

簡単な解説:

  • ## は、特定の要素を非表示にするセレクター構文
  • ytd-rich-item-renderer はYouTubeのおすすめ・ホーム画面などで使われる要素
  • :has-text() は、特定のテキストを含む要素を指定(チャンネル名に含まれる文字列、iは大文字小文字を区別しない)
  • ytd-channel-name にあるテキストに特定の文字がある時、そのカードの領域ytd-rich-item-rendererを非表示にする

ちなみに、問題ない動画の説明文などに反応されると困るので、チャンネル名で判断しています。部分一致(〜を含む)で指定します。
指定する文字列はあまり汎用なものだと消す必要のないチャンネルまで消してしまう可能性があります。気をつけて。

注意点と限界

  • uBlock Originは「要素の非表示」であり、YouTubeのレコメンドアルゴリズム自体を変更するわけではありません。
  • YouTubeのUIやDOM構造が変更されると、フィルターが無効化される可能性があります。
  • フィルターはユーザー個別に調整する必要があります。排除リストが長くなると動作が重くなるかも。

その他にも、
動画ページの関連動画リストや、その他の場所においては機能しません。
それらも記述しようとすると、場所毎に排除リストを重複して書く必要が出てきます。
冗長だよね…

スポンサーリンク

方法2:Tampermonkeyを使う(チャンネル名で排除)

Tampermonkeyとはブラウザの拡張機能の一つで、ユーザーがJavaScriptコードを記述して、ウェブページの動作をカスタマイズできるツールです。
これにより、ウェブサイトの表示を自分好みに変更したり、機能を追加したり、既存の機能を変更したりできます。

[公式アドオンページ]からインストールできます。

さて、こちらはもう少し複雑なことが出来ます。

アドオンをインストールしたら「新規スクリプトを追加」から追加。


// ==UserScript==
// @name         YouTube 特定チャンネル非表示(安定動作版)
// @namespace    http://tampermonkey.net/
// @version      1.2
// @description  特定の文字列を含むチャンネルの動画を非表示
// @author       Me
// @match        *://www.youtube.com/*
// @grant        none
// @run-at       document-idle
// ==/UserScript==

(function () {
    'use strict';

    // ✅ ブロック対象のチャンネル名(部分一致)
    const blockedChannelNames = [
        "感動大国日本","世界が称賛JAPAN","世界が○○るニッポン"
    ];

    const blockedRegex = new RegExp(blockedChannelNames.join("|"), "i");

    // ✅ 対象となる動画カードの要素リスト
    const videoSelectors = [
        'ytd-rich-item-renderer', //ホーム/おすすめのカードに登場
        'ytd-video-renderer', //メインの動画リスト(検索結果)に使用
        'ytd-grid-video-renderer', //サブスクリプションやチャンネルページのグリッド表示
        'ytd-compact-video-renderer', //サイドバーや関連動画リスト
        'ytd-reel-item-renderer', //Shorts(リール)用カード
        'yt-lockup-view-model' //サイド関連動画
    ];

    // ✅ 対象カードからチャンネル名を取得
    function getChannelNameFromCard(card) {
        // チャンネル名の要素(複数形式あり)
        const selectors = [
            'ytd-channel-name a',      // 通常
            '#channel-name a',         // shorts 等
            '.ytd-channel-name',       // 一部検索結果
            '.yt-simple-endpoint',      // fallback
            'yt-content-metadata-view-model' //サイド関連
        ];
        for (const sel of selectors) {
            const el = card.querySelector(sel);
            if (el && el.textContent) {
                return el.textContent.trim();
            }
        }
        return null;
    }

    // ✅ ブロック処理
    function hideBlockedVideos() {
        videoSelectors.forEach(selector => {
            document.querySelectorAll(selector).forEach(card => {
                if (card.dataset.ytChecked) return;
                card.dataset.ytChecked = "true";

                const channelName = getChannelNameFromCard(card);
                if (channelName && blockedRegex.test(channelName)) {
                    card.style.display = 'none';
                    console.log("🚫 非表示: ", channelName);
                }
            });
        });
    }

    // ✅ 初回 + SPA 対応
    const observer = new MutationObserver(() => {
        setTimeout(hideBlockedVideos, 200);
    });

    observer.observe(document.body, {
        childList: true,
        subtree: true
    });

    // ✅ 初回読み込み後にも実行
    setTimeout(hideBlockedVideos, 1000);
})();

コピペしたら保存して、
「ブロック対象のチャンネル名」の部分に、ブロック(非表示)したいチャンネル名を追加していけばokです。
スクリプトを有効化するのも忘れずに。

これでyoutubeを開いたときに、いらんフィードを非表示にしてくれます。

コンソールを開けば
非表示: チャンネル名
と出るので機能してることがわかります。
コンソール

スッキリ。

注意点

  • こちらも「要素の非表示」であり、YouTubeのレコメンドアルゴリズム自体を変更するわけではありません。
  • YouTubeのUIやDOM構造が変更されると、フィルターが無効化される可能性があります。
  • タグ要素は環境によって変わることもあるようです。対象とする要素はユーザー個別に調整する必要があるかもしれません。
スポンサーリンク

方法3:チャンネルIDで排除(Tampermonkey)

一つ上の方法2と同じですが、こちらはチャンネルIDを使います。
「チャンネル名」では汎用的な語句を使われた場合に誤判定が増えそうなので。

アドオンをインストールしたら「新規スクリプトを追加」から追加。


// ==UserScript==
// @name         YouTube: Hide cards by handle (lightweight)
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  Hide YouTube cards whose channel href (/@handle or /channel/UC...) matches blocked list (SPA-aware)
// @match        *://www.youtube.com/*
// @grant        none
// @run-at       document-idle
// ==/UserScript==

(function () {
    'use strict';

    // ブロック対象(ハンドル形式や /channel/... をここに入れる)
    // 入力しやすさのため先頭スラッシュはあってもなくても OK にしています。***このIDはサンプルです***
    const blockedChannelIds = [
        "@emojapa","@NurikaJapa","@%E4%B8%96%E7%95%8C%E3%81%8C%E3%","@nihonuma","@syousan-japan",
        // "/channel/UCxxxxxxxxxxxxxxxxx" // 必要なら混在可能
    ];

    // 正規化された blocked set (先頭にスラッシュ、末尾スラッシュ削除)
    const blockedSet = new Set(blockedChannelIds.map(x => {
        const s = String(x).trim();
        const noQuery = s.split(/[?#]/)[0].replace(/\/+$/,'');
        return noQuery.startsWith('/') ? noQuery : '/' + noQuery;
    }));

    // 対象カードセレクタ群(必要なら拡張)
    const videoSelectors = [
        'ytd-rich-item-renderer',
        'ytd-video-renderer',
        'ytd-grid-video-renderer',
        'ytd-compact-video-renderer',
        'ytd-reel-item-renderer',
        'yt-lockup-view-model',
        'ytd-watch-next-secondary-results-renderer',
    ];

    // チャンネルリンク候補セレクタ(優先順)
    const channelLinkCandidates = [
        'ytd-channel-name a',
        '#channel-name a',
        'a.yt-core-attributed-string__link[href^="/@"]',
        'yt-content-metadata-view-model a[href^="/@"]',
        '.yt-content-metadata-view-model-wiz__metadata-row a[href^="/@"]',
        'a.yt-simple-endpoint[href^="/channel/"]',
        'a[href^="/c/"]',
        'a[href^="/user/"]',
        'a[href^="/@"]', // 汎用フォールバック
        'a.yt-simple-endpoint' // 最終フォールバック(href を見て判定)
    ];

    // href を正規化してパスだけ返す (例: "/@napalz07", "/channel/UC..." )
    function getHrefPathFromElement(el) {
        if (!el) return null;
        // まず getAttribute('href') を優先(/@... のまま取れることが多い)
        let href = el.getAttribute && el.getAttribute('href');
        if (href) {
            href = String(href).split(/[?#]/)[0].replace(/\/+$/,'');
            // 一部 href が absolute になっている場合に備える
            if (!href.startsWith('/')) {
                try {
                    const u = new URL(href, location.origin);
                    return u.pathname.replace(/\/+$/,'');
                } catch(e) {
                    // fallthrough
                }
            }
            return href.startsWith('/') ? href : '/' + href;
        }
        // fallback: el.href (absolute)
        if (el.href) {
            try {
                const u = new URL(el.href);
                return u.pathname.replace(/\/+$/,'');
            } catch(e){}
        }
        return null;
    }

    // カードから (hrefPath, channelName) を抽出する
    function getChannelInfoFromCard(card) {
        for (const sel of channelLinkCandidates) {
            try {
                const el = card.querySelector(sel);
                if (!el) continue;
                const path = getHrefPathFromElement(el);
                if (path) {
                    // 可能なら見た目のチャンネル名も取る
                    const name = (el.textContent || el.innerText || '').trim() || null;
                    return { path, name };
                }
            } catch (err) {
                // セレクタが無効になることは稀だが安全策
                continue;
            }
        }
        return { path: null, name: null };
    }

    // ブロック判定・非表示
    function hideBlockedVideos() {
        videoSelectors.forEach(selector => {
            document.querySelectorAll(selector).forEach(card => {
                if (card.dataset.ytChecked) return;
                card.dataset.ytChecked = "true";

                const { path, name } = getChannelInfoFromCard(card);
                if (!path) return;

                // 正規化(先頭スラッシュあり、末尾削除)
                const norm = path.split(/[?#]/)[0].replace(/\/+$/,'');
                const normWithSlash = norm.startsWith('/') ? norm : '/' + norm;

                if (blockedSet.has(normWithSlash)) {
                    card.style.display = 'none';
                    console.log("🚫 非表示:", normWithSlash, name);
                }
            });
        });
    }

    // SPA 対応:変化が来たら少し遅延して実行(軽量化のため throttle 風)
    let timeoutId = null;
    const observer = new MutationObserver(() => {
        if (timeoutId) clearTimeout(timeoutId);
        timeoutId = setTimeout(() => {
            hideBlockedVideos();
            timeoutId = null;
        }, 200);
    });
    observer.observe(document.body, { childList: true, subtree: true });

    // 初回処理
    setTimeout(hideBlockedVideos, 800);
})();

blockedChannelIds の部分に、ブロック(非表示)したいチャンネルIDを追加していけばok。
チャンネルIDは消したいカード(サムネ)の下に表示されているチャンネル名を右クリックしてリンクをコピー、その@マーク以下を入力します。
日本語で設定されている場合にはURLエンコードされた文字列(例:@%E6%97%A5%E6%9C%AC%E3%81…みたいな)を入力します。

自分は現在この方法を使っています。

注意点

  • チャンネルIDは任意に変更できるものらしいのでその点は注意。
  • こちらも「要素の非表示」であり、YouTubeのレコメンドアルゴリズム自体を変更するわけではありません。
  • YouTubeのUIやDOM構造が変更されると、フィルターが無効化される可能性があります。
スポンサーリンク

まとめ

これで無事に、見たくないチャンネルの動画フィード、不快なサムネを非表示にできました。

最初はuBlock Originで設定したのですが、痒いところに手が届かないと言いますか、あともうちょいが届かない。
例としては3つほど”架空のチャンネル名”をあげていますが実際はもっと多いです。というか多すぎです。似たような動画ばっかりどうなってんだ。

そんな長ったらしいチャンネル名群を、複数行に書くのは精神衛生上よろしくありません。

そこで実は今回初めて Tampermonkey を使ってみました。
コードも実はChatGPTに手伝ってもらっています。AI動画を排除するためにAIを使うっていうね。ま、そういうもんだよね。うん。

とりあえずスッキリしたので良しとします。
以上。

コメント

タイトルとURLをコピーしました