【问题标题】:How to unsubscribe from all the Youtube channels at once?如何一次取消订阅所有 Youtube 频道?
【发布时间】:2018-07-30 04:09:16
【问题描述】:

过去10年我订阅了300多个Youtube频道,现在我要清理我的Youtube,一个一个取消订阅需要一些时间,有没有办法一次性取消所有频道?

【问题讨论】:

  • 我不敢相信这个问题没有结束

标签: javascript automation youtube


【解决方案1】:

第 1 步:转到 https://www.youtube.com/feed/channels 并滚动到页面底部以将所有项目填充到屏幕上。

第 2 步:右键单击页面上的任意位置并单击“检查元素”(或仅单击“检查”),然后单击“控制台”,然后复制粘贴以下脚本,然后单击 return.

第 3 步:

var i = 0;

var myVar = setInterval(myTimer, 3000);

function myTimer () {

    var els = document.getElementById("grid-container").getElementsByClassName("ytd-expanded-shelf-contents-renderer");

    if (i < els.length) {

        els[i].querySelector("[aria-label^='Unsubscribe from']").click();

        setTimeout(function () {

            var unSubBtn = document.getElementById("confirm-button").click();

        }, 2000);

        setTimeout(function () {

            els[i].parentNode.removeChild(els[i]);

        }, 2000);

    }

    i++;

    console.log(i + " unsubscribed by YOGIE");

    console.log(els.length + " remaining");

}

第 4 步:坐下来观看魔术!

享受!!

注意: 如果脚本在某处停止,请刷新页面并再次执行所有四个步骤。

【讨论】:

  • 为了更快地运行它,将第二行更改为此 var myVar = setInterval(myTimer, 1000);
  • 从 3000 到 1000 和从 2000 到 500 会像 Jay 说的那样快速工作
【解决方案2】:

最有效的价值观:

(复制上面的所有内容,包括最后一个)

var i = 0;

var myVar = setInterval(myTimer, 200);

function myTimer () {

    var els = document.getElementById("grid-container").getElementsByClassName("ytd-expanded-shelf-contents-renderer");

    if (i < els.length) {

        els[i].querySelector('[aria-label="Unsubscribe from this channel."]').click();

        setTimeout(function () {

            var unSubBtn = document.getElementById("confirm-button").click();

        }, 500);

        setTimeout(function () {

            els[i].parentNode.removeChild(els[i]);

        }, 1000);
    }

    i++;

    console.log(i + " unsubscribed by YOGIE");
    console.log(els.length + " remaining");
}

【讨论】:

    【解决方案3】:

    这是对最佳答案的一点补充: 您还可以使用 jscompress[dot]com 压缩脚本,然后在脚本的开头添加 javascript:,并将其添加到您的书签中——您可以从那里运行它——以防万一'不习惯使用控制台或类似的东西。

    【讨论】:

      【解决方案4】:

      更新MordorSlave 答案。刚刚做了。

      转到https://www.youtube.com/feed/channels 并在控制台中复制/粘贴以下内容:

      var i = 0;
      
      var myVar = setInterval(myTimer, 200);
      
      function myTimer() {
      
        var els = document.getElementById("contents").getElementsByClassName("ytd-subscribe-button-renderer");
      
        if (i < els.length) {
      
          els[i].querySelector('.ytd-subscribe-button-renderer').click();
      
          setTimeout(function() {
      
            var unSubBtn = document.getElementById("confirm-button").click();
      
          }, 500);
      
          setTimeout(function() {
      
            els[i].parentNode.removeChild(els[i]);
      
          }, 1000);
        }
      
        i++;
      
        console.log(i + " unsubscribed");
        console.log(els.length + " remaining");
      }
      

      【讨论】:

        【解决方案5】:

        更新其他人提供的答案(因为最新的更新对我不起作用):

        var i = 0;
        var count = document.querySelectorAll("ytd-channel-renderer:not(.ytd-item-section-renderer)").length;
        
        myTimer();
        
        function myTimer () {	
            if (count == 0) return;
        
            el = document.querySelector('.ytd-subscribe-button-renderer');
            el.click();
        
            setTimeout(function () {
                var unSubBtn = document.getElementById("confirm-button").click();
                i++;
                count--;
        
                console.log(i + " unsubscribed");
                console.log(count + " remaining");
        
                setTimeout(function () {
                    el = document.querySelector("ytd-channel-renderer");
                    el.parentNode.removeChild(el);
        
                    myTimer();
                }, 250);
            }, 250);
        }

        对我来说,这成功了。

        【讨论】:

        • 对我来说也是如此。而且这个sn-p不需要手动列到页尾。
        【解决方案6】:

        嗯,希望我在推出自己的产品之前先用谷歌搜索一下。我在 asyncawait 上玩得很开心。屏幕在尝试取消订阅内容时会出现一些难看的闪烁,但这做得很好。

        此脚本一次捕获所有频道的一个先决条件是“耗尽”页面中的滚动条,即继续滚动直到到达频道列表的末尾。正如其他人所说,前往YouTube Channels,打开开发者控制台并粘贴下面的脚本。

        我已经在相关部分发表了评论,以防这最终成为某人的学习经历;)

        /** 
         * Youtube bulk unsubsribe fn.
         * Wrapping this in an IIFE for browser compatibility.
         */
        (async function iife() {
          // This is the time delay after which the "unsubscribe" button is "clicked"; Tweak to your liking!
          var UNSUBSCRIBE_DELAY_TIME = 2000
        
        /**
         * Delay runner. Wraps `setTimeout` so it can be `await`ed on. 
         * @param {Function} fn 
         * @param {number} delay 
         */
          var runAfterDelay = (fn, delay) => new Promise((resolve, reject) => {
            setTimeout(() => {
              fn()
              resolve()
            }, delay)
          })
        
        
        
          // Get the channel list; this can be considered a row in the page.
          var channels = Array.from(document.getElementsByTagName(`ytd-channel-renderer`))
          console.log(`${channels.length} channels found.`)
        
          var ctr = 0
          for (const channel of channels) {
            // Get the subsribe button and trigger a "click"
            channel.querySelector(`[aria-label^='Unsubscribe from']`).click()
            await runAfterDelay(() => {
              // Get the dialog container...
              document.getElementsByTagName(`yt-confirm-dialog-renderer`)[0]
                // and find the confirm button...
                .querySelector(`#confirm-button`)
                // and "trigger" the click!
                .click()
              console.log(`Unsubsribed ${ctr + 1}/${channels.length}`)
              ctr++
            }, UNSUBSCRIBE_DELAY_TIME)
          }
        })()
        

        【讨论】:

          【解决方案7】:

          Youtube 频道退订者(2020 年 4 月工作)

          • 访问链接:https://www.youtube.com/feed/channels
          • F12
          • 在控制台中插入以下代码
          function youtubeUnsubscriber() {
              var count = document.querySelectorAll("ytd-channel-renderer:not(.ytd-item-section-renderer)").length;
              var randomDelay = 500;
          
              if(count == 0) return false;
          
              function unsubscribeVisible(randomDelay) {
          
                  if (count == 0) {
                      window.scrollTo(0,document.body.scrollHeight);
                      setTimeout(function() {
                          youtubeUnsubscriber();
                      }, 10000)
                  }
          
                  unsubscribeButton = document.querySelector('.ytd-subscribe-button-renderer');
                  unsubscribeButton.click();
          
                  setTimeout(function () {
                      document.getElementById("confirm-button").click()
                      count--;
                      console.log("Remaining: ", count);
          
                      setTimeout(function () {
                          unsubscribedElement = document.querySelector("ytd-channel-renderer");
                          unsubscribedElement.parentNode.removeChild(unsubscribedElement);
                          unsubscribeVisible(randomDelay)
                      }, randomDelay);
                  }, randomDelay);
              }
          
              unsubscribeVisible(randomDelay);
          }
          
          youtubeUnsubscriber();
          

          参考文献

          【讨论】:

            【解决方案8】:

            https://gist.github.com/itsazzad/c1d86c5db86258ca129554a7b9ed92a7

            明智地使用 DELAY 常量;考虑你的网速。

            // Go to the following link in your YouTube: https://www.youtube.com/feed/channels
            // Scroll the page all the way down until you reach the very last subscribed channel in your list
            const DELAY = 100;
            const delay = ms => new Promise(res => setTimeout(res, ms));
            const list = document.querySelectorAll("#grid-container > ytd-channel-renderer");
            for (const sub of list) {
              await delay(DELAY);
              sub.querySelector("#subscribe-button > ytd-subscribe-button-renderer > paper-button").click();
              await delay(DELAY);
              document.querySelector("#confirm-button > a").addEventListener('click', async event => {
                await delay(DELAY);
                console.log(sub.querySelector("#text").innerText);
                await delay(DELAY);
              });
              await delay(DELAY);
              document.querySelector("#confirm-button > a").click()
              await delay(DELAY);
            }
            

            【讨论】:

              【解决方案9】:

              如果有人正在寻找可行的解决方案,以下脚本对我有用:

              转到https://www.youtube.com/subscription_manager 并运行

              $$('.yt-uix-button-subscribed-branded').forEach(function(el) { el.click(); $$('.overlay-confirmation-unsubscribe-button').forEach(function(el) { el.click(); }); console.log('Bye YouTube'); });
              

              参考:https://www.reddit.com/r/youtube/comments/ad3jv5/mass_unsubscribe_script/

              【讨论】:

                【解决方案10】:
                1. 转到https://www.youtube.com/feed/channels
                2. 一直向下滚动,直到看到最后一个订阅的频道。
                3. 打开javascript控制台,粘贴以下代码并回车
                let btns = document.querySelectorAll('paper-button > yt-formatted-string');
                
                for (let i = 0; i < btns.length; i += 1) {
                    if (btns[i].innerText.toLowerCase() === 'subscribed') {
                        btns[i].click();
                        document.getElementById('confirm-button').click();
                    }
                }
                

                注意:对我来说,这种方法适用于 Firefox。 Chrome 发出警告,页面变得无响应。于 2020 年 10 月 20 日为一个拥有 956 个订阅频道的帐户工作。

                【讨论】:

                  【解决方案11】:

                  我的解决方案,我认为是最新的,但事情总是在变化......

                  var unsubBtns = document.querySelectorAll(' div:nth-child(2) > div:nth-child(2) > div:nth-child(2) > ytd-subscribe-button-renderer:nth-child(1) > paper-button:nth-child(1)');
                  
                  var i = 0; 
                  
                  var interV = setInterval(function(){
                     unsubBtns[i].click();
                     i++;
                     document.querySelector('yt-formatted-string.style-blue-text').click()
                  }, 1000);
                  

                  【讨论】:

                    【解决方案12】:

                    扩展 Jani 的答案,这个有一个 DOM 进度计数器。绝对没有 jQuery。

                    (function() {
                        var i = 0;
                        var ytdElem = document.querySelector("ytd-page-manager ytd-browse.ytd-page-manager");
                        ytdElem.innerHTML = '<div style="font: 11pt arial; background: yellow; color: white" id="ytdjsds"></div>' + ytdElem.innerHTML;
                        var element = document.getElementById("ytdjsds");
                        var count = document.querySelectorAll("ytd-channel-renderer:not(.ytd-item-section-renderer)").length;
                        if (count == 0) {
                            element.innerHTML = "No subscriptions were found on your account.";
                            return;
                        }
                        element.innerHTML = `Deleting subscription 1 of ${count}`;
                        function myTimer() {
                            if (count == 0) {
                                element.innerHTML = `Successfully deleted subscriptions`;
                                return;
                            }
                            element.innerHTML = `Deleting subscription ${i + 1} of ${count}`;
                            el = document.querySelector('.ytd-subscribe-button-renderer');
                            el.click();
                            document.getElementById("confirm-button").style.display = "none";
                            setTimeout(function() {
                                var unSubBtn = document.getElementById("confirm-button").click();
                                i++;
                                setTimeout(function() {
                                    el = document.querySelector("ytd-channel-renderer");
                                    el.parentNode.removeChild(el);
                                    myTimer();
                                }, 250);
                            }, 250);
                        }
                        myTimer();
                    })();
                    

                    【讨论】:

                      【解决方案13】:

                      截至 2021 年 10 月

                      从此页面https://www.youtube.com/feed/channels

                      var list = $$('yt-formatted-string.ytd-subscribe-button-renderer')
                      function foo($$) {
                        if (list.length === 0) return
                        var el = list.pop()
                        el.click()
                        setTimeout(_=>{
                          var cancel = $$('yt-formatted-string.yt-button-renderer')[1]
                          cancel.click()
                          console.log('done')
                          setTimeout(_=>{foo($$)},100)
                        }, 100)
                      }
                      foo($$)
                      

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 2016-03-14
                        • 2015-10-14
                        • 1970-01-01
                        • 2012-12-02
                        • 1970-01-01
                        • 2015-03-27
                        相关资源
                        最近更新 更多