Greasy Fork is available in English.

Hide youtube google ad

hide youtube google ad,auto click "skip ad"

  1. // ==UserScript==
  2. // @name Hide youtube google ad
  3. // @name:zh-CN 隐藏youtube google广告
  4. // @namespace vince.youtube
  5. // @version 2.5.0
  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. const element = document.querySelector(selector);
  75. if (element) {
  76. const style = window.getComputedStyle(element);
  77. if (style.display !== 'none' && style.visibility !== 'hidden') {
  78. return element;
  79. }
  80. }
  81. return found;
  82. }, null);
  83.  
  84. const video = document.querySelector('video');
  85. const isInAd = Array.from(document.querySelectorAll('.video-ads, .ytp-ad-player-overlay, [class*="ad-showing"], .html5-video-player.ad-showing'))
  86. .some(element => {
  87. const style = window.getComputedStyle(element);
  88. return style.display !== 'none' && style.visibility !== 'hidden';
  89. });
  90.  
  91. if(video) {
  92. if(isInAd) {
  93. // 广告状态处理
  94. video.playbackRate = 16;
  95. video.muted = true; // 广告时静音
  96. if(video.paused) {
  97. video.play();
  98. }
  99. } else {
  100. // 非广告状态处理
  101. if(video.playbackRate !== 1) {
  102. video.playbackRate = 1;
  103. }
  104. if(video.muted) {// 非广告时恢复声音
  105. video.muted = false;
  106. }
  107. // 检测黑屏状态
  108. if(!video.paused && video.readyState === 4 && video.currentTime === 0) {
  109. video.play();
  110. }
  111. }
  112. }
  113.  
  114. if(skipbtn && isInAd){
  115. try {
  116. skipbtn.removeAttribute('disabled');
  117. const simulateClick = new MouseEvent('click', {
  118. bubbles: true,
  119. cancelable: true,
  120. buttons: 1
  121. });
  122. skipbtn.dispatchEvent(simulateClick);
  123. } catch(e) {
  124. log("Skip error: " + e);
  125. }
  126. }
  127.  
  128. // 更频繁地检查以防止黑屏
  129. setTimeout(() => {
  130. window.requestAnimationFrame(skipAd);
  131. }, 200);
  132. };
  133. closeAd();
  134. skipAd();
  135.  
  136. })();