隐藏youtube google广告

隐藏youtube显示的google广告,自动点击"skip ad"

当前为 2025-05-03 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Hide youtube google ad
  3. // @name:zh-CN 隐藏youtube google广告
  4. // @namespace vince.youtube
  5. // @version 2.4.9
  6. // @description hide youtube google ad,auto click "skip ad"
  7. // @description:zh-CN 隐藏youtube显示的google广告,自动点击"skip ad"
  8. // @author vince ding
  9. // @match https://*.youtube.com/*
  10. // @grant GM_xmlhttpRequest
  11. // @grant GM_info
  12. // @grant GM_getValue
  13. // @grant unsafeWindow
  14. // @run-at document-start
  15. // @connect googlevideo.com
  16. // ==/UserScript==
  17.  
  18. (function() {
  19. 'use strict';
  20. var closeAd=function (){
  21. //var css = '.video-ads,.video-ads .ad-container .adDisplay,#player-ads,.ytp-ad-module,.ytp-ad-image-overlay,#panels"{ display: none!important; }',
  22. var css = `
  23. .video-ads,
  24. .ytp-ad-overlay-container,
  25. .ytp-ad-overlay-image,
  26. .ytp-ad-skip-button-container,
  27. .ytp-ad-preview-container,
  28. .ytp-ad-message-container,
  29. #masthead-ad,
  30. #player-ads,
  31. ytd-display-ad-renderer,
  32. ytd-companion-slot-renderer,
  33. .ytd-video-masthead-ad-v3-renderer,
  34. .style-scope.ytd-in-feed-ad-layout-renderer,
  35. .ytd-banner-promo-renderer,
  36. #related ytd-promoted-sparkles-web-renderer,
  37. .ytd-promoted-sparkles-text-search-renderer,
  38. .ytd-display-ad-renderer,
  39. .ytd-statement-banner-renderer,
  40. #related ytd-compact-promoted-video-renderer {
  41. display: none!important;
  42. }`;
  43. var head = document.head || document.getElementsByTagName('head')[0];
  44. var style = document.createElement('style');
  45.  
  46. style.type = 'text/css';
  47. if (style.styleSheet){
  48. style.styleSheet.cssText = css;
  49. } else {
  50. style.appendChild(document.createTextNode(css));
  51. }
  52.  
  53. head.appendChild(style);
  54. };
  55. var skipInt;
  56. var log=function(msg){
  57. unsafeWindow.console.log (msg);
  58. };
  59.  
  60.  
  61. var skipAd = function(){
  62. const skipSelectors = [
  63. 'button.ytp-ad-skip-button',
  64. 'button.ytp-ad-skip-button-modern',
  65. '.ytp-ad-skip-button-container button',
  66. '.ytp-ad-skip-button-slot button',
  67. 'button[class*="skip"]',
  68. 'button[class*="Skip"]',
  69. '.videoAdUiSkipButton',
  70. '[data-skip-button]'
  71. ];
  72.  
  73. const skipbtn = skipSelectors.reduce((found, selector) =>
  74. found || document.querySelector(selector), null);
  75.  
  76. const video = document.querySelector('video');
  77. const isInAd = document.querySelector('.video-ads') ||
  78. document.querySelector('.ytp-ad-player-overlay') ||
  79. document.querySelector('[class*="ad-showing"]') ||
  80. document.querySelector('.html5-video-player.ad-showing');
  81.  
  82. if(video) {
  83. if(isInAd && skipbtn) {
  84. // 广告状态处理
  85. video.playbackRate = 16;
  86. video.muted = true; // 广告时静音
  87. if(video.paused) {
  88. video.play();
  89. }
  90. } else {
  91. // 非广告状态处理
  92. if(video.playbackRate !== 1) {
  93. video.playbackRate = 1;
  94. }
  95. if(video.muted) { // 非广告时恢复声音
  96. video.muted = false;
  97. }
  98. // 检测黑屏状态
  99. if(!video.paused && video.readyState === 4 && video.currentTime === 0) {
  100. video.play();
  101. }
  102. }
  103. }
  104.  
  105. if(skipbtn && isInAd){
  106. try {
  107. skipbtn.removeAttribute('disabled');
  108. const simulateClick = new MouseEvent('click', {
  109. view: window,
  110. bubbles: true,
  111. cancelable: true
  112. });
  113. skipbtn.dispatchEvent(simulateClick);
  114. } catch(e) {
  115. log("Skip error: " + e);
  116. }
  117. }
  118.  
  119. // 更频繁地检查以防止黑屏
  120. setTimeout(() => {
  121. window.requestAnimationFrame(skipAd);
  122. }, 500);
  123. };
  124. closeAd();
  125. skipAd();
  126.  
  127. })();