PC限定でyoutubeで登録しているチャンネルを自動で一括削除するスクリプト

スクリプト

var i = 0;
var els = document.getElementById("grid-container").getElementsByClassName("ytd-expanded-shelf-contents-renderer");
var myVar = setInterval(myTimer, 3000);

function myTimer() {
  if (i < els.length) {
    els[i].querySelector("yt-touch-feedback-shape").click();
    document.querySelector("yt-formatted-string").click();
    setTimeout(function() {
      document.querySelector('[aria-label="登録解除"]').click();
    }, 3000);
  } else {
    console.log("購読を解除するチャンネルがありません");
    clearInterval(myVar);
  }
  i++;
  console.log(i + "件購読解除しました");
}

解説

 本文に書くと貼り付ける際に支障が出るので、こちらにてスクリプトの動きを解説する。

2行目でチャンネル登録一覧部分の要素を取得する。

7行目で「登録済み」ボタン横の三角ボタンをクリックする。

8行目でメニューの「登録解除」をクリックする。(なぜか、これがなくてもモーダルは出せている)

9行目で出てきたモーダルの「登録解除」ボタンをクリックする。

13行目はスクリプトが実行完了した後に無限ループを回避するためにインターバルをクリアする。

実行手順

 ブラウザは『Chrome』か『FireFox』を使用することを前提としています。(とはいえ、javascriptが実行できるブラウザなら他でもできるはず)

  1. 登録しているチャンネルを全解除したいアカウントでyoutubeにログインする
  2. 登録チャンネル一覧画面に遷移する
  3. 画面を右クリックして「調査」を押す
  4. 「コンソール」を開く
  5. スクリプトを貼り付けてエンターを押す

実行手順詳細

登録チャンネル一覧画面に遷移する

 以下の画面に遷移する。

画面を右クリックして「調査」を押す

「コンソール」を開く

 なんかいっぱい文字が出てくるけど気にしない。

上記の「スクリプト」を貼り付けてエンターを押す

 「コンソール」の下に「>>」と出ている場所があるので、そこにスクリプトを貼り付ける。

 上記の状態でエンターを押すと、スクリプトが実行されて自動でチャンネル登録が解除される。

注意

・スクリプトは画面に表示されているチャンネルだけ登録解除するので、画面に表示されている分の解除が終わったら、画面を更新して再度スクリプトを実行してやる必要がある。
・スクリプトが実行できるのは日本語表示のyoutubeだけ。他の言語にしたかったらスクリプトの'[aria-label=”登録解除”]’の部分を該当言語に変更する。
・ブラウザは『chrome』と『firefox』でしか試してないけど、他でも多分使えるはず。
・youtubeの画面仕様が変わると使えなくなる。(2023年6月1日時点は大丈夫

動作確認報告をいただけると嬉しいです

 動いたら「動いた!」とコメントいただけると、安心します。

 一方で、動かない場合はその旨を報告いただけると、メンテナンスするかもしれません。

2023年6月4日動作確認

 手元の『Chrome』の113.0.5672.126と、『FireFox』の113.0.2ではスクリプトは問題なく動作。

 いただいたコメントにて、.click()ができてない可能性があったが、手元の画面では要素はちゃんとクリックできている模様。

 指摘いただいた、document.querySelector(‘[aria-label=”登録解除”]’).click();でモーダルの「登録解除」を押すシーンはクリックする対象の要素は画面に存在し、問題なく動作している。

 els[i].querySelector(“yt-touch-feedback-shape”).click();でマイクアイコンをクリックしている可能性を考えてみたが、マイクアイコンはvar els = document.getElementById(“grid-container”).getElementsByClassName(“ytd-expanded-shelf-contents-renderer”);で範囲から外れるので、その可能性はなかった。

 各要素のx_pathは以下の通り。

# マイクアイコン
/html/body/ytd-app/div[1]/div/ytd-masthead/div[4]/div[2]/div/ytd-button-renderer/yt-button-shape/button/yt-touch-feedback-shape
# 「登録済み」のボタン
/html/body/ytd-app/div[1]/ytd-page-manager/ytd-browse/ytd-two-column-browse-results-renderer/div[1]/ytd-section-list-renderer/div[2]/ytd-item-section-renderer/div[3]/ytd-shelf-renderer/div[1]/div[2]/ytd-expanded-shelf-contents-renderer/div/ytd-channel-renderer[2]/div/div[2]/div[1]/div[2]/ytd-subscribe-button-renderer/yt-smartimation/yt-button-shape/button/yt-touch-feedback-shape

Youtubeプレミアムの契約ありアカウントでログインして試しています。

 いただいたコメントは上記のようにあったが、筆者はyoutubeプレミアムに加入していない。

 もしかしたらプレミアムではhttps://www.youtube.com/feed/channelsの画面表示が違うんだろうか?

 

 一方で、スクリプトを実行すると「一番上に表示されるチャンネル」の登録が解除されないことに気づいた。。

 なんでだろう。

 登録解除されないのは1件だけのようなので、クリティカルな問題ではないとして、気が向いたらそのうち調べるかもしれない。

おまけ:登録解除したくないyoutubeチャンネル紹介

 面白いんで是非見てみてください!

面白いyoutubeチャンネル
「面白いyoutubeチャンネル」の記事一覧です。

 あと、おすすめがあれば教えてください!

仙人みならい

1990年生まれ。嫌なことするくらいなら欲しがらないスタイル。いちおうrailsエンジニア。ゲーム好き夫で本好き夫。ギターも少し弾ける。格闘技はムエタイと柔術が少しできる。

仙人みならいをフォローする
プログラミング家遊び
在宅通信

コメント

  1. Chrome バージョン: 116.0.5845.141で問題なく作動しました。感激しました、ありがとうございます

    • 動作確認のご報告ありがとうございます!まだ使えるようで安心しました。

  2. 事情を話せば長くなるので割愛しますが、1000チャンネル以上登録しているチャンネルをどうしても解除したかったので、非常に助かりました。
    今無事に作動して順調に解除作業が進んでいます。
    有益な記事を本当にありがとうございました。

    • 動作確認のご報告ありがとうございます!安心しました。
      お役に立てたようで嬉しいです!!

  3. ようつべ様

    ご確認ありがとうございます!

    >”チャンネル名 のチャンネル登録を解除”という形式になっているようです。
    こちらの画面ではこれが「登録解除」になっているようでした。
    なお、こちらはyoutubeプレミアムには加入していませんので、もしかしたらプランの差で画面に差分があるのかもしれませんね。。

    一応、こちらが調査した結果と、スクリプトの動作解説を記事に加筆しました。
    画面に差分がある場合は、操作する要素を変更すればスクリプトは動くと思うので、参考にしていただければ幸いです!

  4. 早速ありがとうございます。

    >『yt-touch-feedback-shape』か『[aria-label=”登録解除”]』の要素が存在しない場合に出るエラーのようです。

    yt-touch-feedback-shape
    ⇒こちらは存在しました※
    ※開発者ツール(検証からアクセスするところ)の要素タブで確認しました

    aria-label=”登録解除”
    ⇒こちらが存在しませんでした。
    ”チャンネル名 のチャンネル登録を解除”という形式になっているようです。
    例 Android Developers のチャンネル登録を解除

    大変厚かましいのですが、正規表現などを使い、
    動作するようスクリプトを修正いただけたりしますでしょうか。

    >1、スクリプトを実行しているページが『https://www.youtube.com/feed/channels』でない。
    >2、ページ『https://www.youtube.com/feed/channels』が完全に読み込まれる前にスクリプトを実行している。
    アクセス先を確認し時間をおいて試しましたが同じエラーでした。
    >3、スクリプトが正しくコピーできていない。(例えば『メモ帳』等のエディタにいったん貼り付けたりすると何かの文字が置換されてしまう可能性があります。)
    直接貼り付けしているので問題ないかと思います。

    なお、ご参考までに動作環境は、Chrome 113.0.5672.94(Official Build) (64 ビット)です。
    Youtubeプレミアムの契約ありアカウントでログインして試しています。

  5. ご報告ありがとうございます!

    2023/06/03時点で、手元の『Chrome』の113.0.5672.126と、『FireFox』の113.0.2ではスクリプトは問題なく動作していました。

    Uncaught TypeError: Cannot read properties of null (reading ‘click’)

    画面に『yt-touch-feedback-shape』か『[aria-label=”登録解除”]』の要素が存在しない場合に出るエラーのようです。

    なのでおそらく、以下のような原因が考えられますが、心当たりはありますでしょうか??

    1、スクリプトを実行しているページが『https://www.youtube.com/feed/channels』でない。
    2、ページ『https://www.youtube.com/feed/channels』が完全に読み込まれる前にスクリプトを実行している。
    3、スクリプトが正しくコピーできていない。(例えば『メモ帳』等のエディタにいったん貼り付けたりすると何かの文字が置換されてしまう可能性があります。)

  6. コンソール上で試してみたところ、以下のエラーコードが出てきてしまい動作しませんでした。
    上手く動かす方法など分かりますでしょうか。

    VM5683:7 Uncaught TypeError: Cannot read properties of null (reading ‘click’)
    at myTimer (:7:52)
    myTimer @ VM5683:7
    setInterval(非同期)
    (匿名) @ VM5683:3
    desktop_polymer.js:2604 [Violation] ‘setInterval’ handler took 54ms
    VM5683:7 Uncaught TypeError: Cannot read properties of null (reading ‘click’)
    at myTimer (:7:52)
    myTimer @ VM5683:7
    setInterval(非同期)
    (匿名) @ VM5683:3
    [Violation] ‘setInterval’ handler took 55ms
    VM5683:7 Uncaught TypeError: Cannot read properties of null (reading ‘click’)
    at myTimer (:7:52)
    myTimer @ VM5683:7
    setInterval(非同期)
    (匿名) @ VM5683:3
    channels:1 The resource https://i.ytimg.com/generate_204 was preloaded using link preload but not used within a few seconds from the window’s load event. Please make sure it has an appropriate `as` value and it is preloaded intentionally.