Reklam Engelleyici | codermert

Reklam Engelleyici

当前为 2023-12-07 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Reklam Engelleyici | codermert
  3. // @namespace http://tampermonkey.net/
  4. // @version 6.0
  5. // @description Reklam Engelleyici
  6. // @author codermert
  7. // @match https://www.youtube.com/*
  8. // @icon https://telegra.ph/file/085f9bd5981df003fc043.png
  9. // @grant none
  10. // @license MIT
  11. // @require https://code.jquery.com/jquery-2.2.4.min.js
  12. // @run-at document-end
  13. // @compatible chrome
  14. // @compatible firefox
  15. // @compatible opera
  16. // @compatible safari
  17. // @compatible UC browser
  18. // ==/UserScript==
  19. (function() {
  20. `use strict`;
  21.  
  22. // Arayüz reklamı seçici
  23. const cssSelectorArr = [
  24. `#masthead-ad`, // Ana sayfa üst banner reklamı.
  25. `ytd-rich-item-renderer.style-scope.ytd-rich-grid-row #content:has(.ytd-display-ad-renderer)`, // Ana sayfa video düzeni reklamı.
  26. `.video-ads.ytp-ad-module`, // Oynatıcı alt banner reklamı.
  27. `tp-yt-paper-dialog:has(yt-mealbar-promo-renderer)`, // Oynatma sayfası üye promosyon reklamı.
  28. `ytd-engagement-panel-section-list-renderer[target-id="engagement-panel-ads"]`, // Oynatma sayfası sağ üstte önerilen reklam.
  29. `#related #player-ads`, // Oynatma sayfası yorumlar sağ tarafındaki tanıtım reklamı.
  30. `#related ytd-ad-slot-renderer`, // Oynatma sayfası yorumlar sağ tarafındaki video düzeni reklamı.
  31. `ytd-ad-slot-renderer`, // Arama sayfası reklamı.
  32. `yt-mealbar-promo-renderer`, // Oynatma sayfası üye öneri reklamı.
  33. `ad-slot-renderer`, // M Oynatma sayfası üçüncü taraf öneri reklamı.
  34. `ytm-companion-ad-renderer`, // M Atlanabilir video reklam bağlantı yeri
  35. ];
  36.  
  37. window.dev = false; // Geliştirme modu
  38.  
  39. /**
  40. * Standart tarihi biçimlendirme
  41. * @param {Date} time Zaman
  42. * @param {String} format Biçim
  43. * @return {String}
  44. */
  45. function moment(time, format = `YYYY-MM-DD HH:mm:ss`) {
  46. // Yıl, ay, gün, saat, dakika, saniye al
  47. let y = time.getFullYear()
  48. let m = (time.getMonth() + 1).toString().padStart(2, `0`)
  49. let d = time.getDate().toString().padStart(2, `0`)
  50. let h = time.getHours().toString().padStart(2, `0`)
  51. let min = time.getMinutes().toString().padStart(2, `0`)
  52. let s = time.getSeconds().toString().padStart(2, `0`)
  53. if (format === `YYYY-MM-DD`) {
  54. return `${y}-${m}-${d}`
  55. } else {
  56. return `${y}-${m}-${d} ${h}:${min}:${s}`
  57. }
  58. }
  59.  
  60. /**
  61. * Bilgiyi çıktıla
  62. * @param {String} msg Mesaj
  63. * @return {undefined}
  64. */
  65. function log(msg) {
  66. if (!window.dev) {
  67. return false;
  68. }
  69. console.log(`${moment(new Date())} ${msg}`)
  70. }
  71.  
  72. /**
  73. * Çalışma bayrağını ayarla
  74. * @param {String} name
  75. * @return {undefined}
  76. */
  77. function setRunFlag(name) {
  78. let style = document.createElement(`style`);
  79. style.id = name;
  80. (document.querySelector(`head`) || document.querySelector(`body`)).appendChild(style); // HTML'ye düğüm ekleyin.
  81. }
  82.  
  83. /**
  84. * Çalışma bayrağını al
  85. * @param {String} name
  86. * @return {undefined|Element}
  87. */
  88. function getRunFlag(name) {
  89. return document.getElementById(name);
  90. }
  91.  
  92. /**
  93. * Çalışma bayrağı ayarlanmış mı diye kontrol et
  94. * @param {String} name
  95. * @return {Boolean}
  96. */
  97. function checkRunFlag(name) {
  98. if (getRunFlag(name)) {
  99. return true;
  100. } else {
  101. setRunFlag(name)
  102. return false;
  103. }
  104. }
  105.  
  106. /**
  107. * Reklamı kaldırmak için kullanılan css stilini oluşturun ve HTML düğümüne ekleyin
  108. * @param {String} styles Stil metni
  109. * @return {undefined}
  110. */
  111. function generateRemoveADHTMLElement(styles) {
  112. // Zaten ayarlandıysa çık
  113. if (checkRunFlag(`RemoveADHTMLElement`)) {
  114. log(`Sayfa reklamları kaldırma düğümü zaten oluşturuldu`);
  115. return false
  116. }
  117.  
  118. // Reklamı kaldırma stilini ayarla.
  119. let style = document.createElement(`style`); // style öğesi oluştur.
  120. (document.querySelector(`head`) || document.querySelector(`body`)).appendChild(style); // HTML'ye düğümü ekle.
  121. style.appendChild(document.createTextNode(styles)); // Stil düğümünü element düğümüne ekle.
  122. log(`Sayfa reklamları kaldırma düğümü başarıyla oluşturuldu`)
  123. }
  124.  
  125. /**
  126. * Reklam kaldırma css metnini oluşturun
  127. * @param {Array} cssSelectorArr Ayarlanacak css seçici dizisi
  128. * @return {String}
  129. */
  130. function generateRemoveADCssText(cssSelectorArr) {
  131. cssSelectorArr.forEach((selector, index) => {
  132. cssSelectorArr[index] = `${selector}{display:none!important}`; // Dolaşıp stil ayarla.
  133. });
  134. return cssSelectorArr.join(` `); // Birleştir ve dizeye dönüştür.
  135. }
  136.  
  137. /**
  138. * Dokunma olayı
  139. * @return {undefined}
  140. */
  141. function nativeTouch() {
  142. const minNum = 375;
  143. const maxNum = 750;
  144. const randomNum = (Math.floor(Math.random() * (maxNum - minNum + 1)) + minNum) / 1000;
  145.  
  146. let element = this;
  147. // Dokunma nesnesi oluştur
  148. let touch = new Touch({
  149. identifier: Date.now(),
  150. target: element,
  151. clientX: 12 + randomNum,
  152. clientY: 34 + randomNum,
  153. radiusX: 56 + randomNum,
  154. radiusY: 78 + randomNum,
  155. rotationAngle: 0,
  156. force: 1
  157. });
  158.  
  159. // Dokunma Olayı oluştur
  160. let touchStartEvent = new TouchEvent("touchstart", {
  161. bubbles: true,
  162. cancelable: true,
  163. view: window,
  164. touches: [touch],
  165. targetTouches: [touch],
  166. changedTouches: [touch]
  167. });
  168.  
  169. // touchstart olayını hedef öğeye gönder
  170. element.dispatchEvent(touchStartEvent);
  171.  
  172. // Dokunma Olayı oluştur
  173. let touchEndEvent = new TouchEvent("touchend", {
  174. bubbles: true,
  175. cancelable: true,
  176. view: window,
  177. touches: [],
  178. targetTouches: [],
  179. changedTouches: [touch]
  180. });
  181.  
  182. // touchend olayını hedef öğeye gönder
  183. element.dispatchEvent(touchEndEvent);
  184. }
  185.  
  186. /**
  187. * Reklamları atla
  188. * @return {undefined}
  189. */
  190. function skipAd(mutationsList, observer) {
  191. let video = document.querySelector(`.ad-showing video`) || document.querySelector(`video`); // Video öğesini al
  192. let skipButton = document.querySelector(`.ytp-ad-skip-button`) || document.querySelector(`.ytp-ad-skip-button-modern`);
  193. let shortAdMsg = document.querySelector(`.video-ads.ytp-ad-module .ytp-ad-player-overlay`);
  194.  
  195. if (skipButton) {
  196. // Atlanabilir düğmeye sahip reklam.
  197. log(`Toplam Süre:`);
  198. log(`${video.duration}`)
  199. log(`Geçen Süre:`);
  200. log(`${video.currentTime}`)
  201. // Reklamı atla.
  202. skipButton.click(); // Bilgisayar
  203. nativeTouch.call(skipButton); // Telefon
  204. log(`Düğme reklamı atladı~~~~~~~~~~~~~`);
  205. } else if (shortAdMsg) {
  206. // Atlanabilir düğmeye sahip kısa reklam.
  207. log(`Toplam Süre:`);
  208. log(`${video.duration}`)
  209. log(`Geçen Süre:`);
  210. log(`${video.currentTime}`)
  211. video.currentTime = video.duration;
  212. log(`Zorla reklamı sonlandırdı~~~~~~~~~~~~~`);
  213. } else {
  214. log(`######Reklam Yok######`);
  215. }
  216. }
  217.  
  218. /**
  219. * Oynatıcıdaki reklamları kaldır
  220. * @return {undefined}
  221. */
  222. function removePlayerAD() {
  223. // Zaten çalışıyorsa çık
  224. if (checkRunFlag(`removePlayerAD`)) {
  225. log(`Oynatıcıdaki reklam kaldırma özelliği zaten çalışıyor`);
  226. return false
  227. }
  228. let observer; // Gözlemci
  229. let timerID; // Zamanlayıcı
  230.  
  231. // Gözlemi başlat
  232. function startObserve() {
  233. // Reklam düğümünü gözlemle
  234. const targetNode = document.querySelector(`.video-ads.ytp-ad-module`);
  235. if (!targetNode) {
  236. log(`İzlenecek hedef düğüm bulunuyor`);
  237. return false;
  238. }
  239. // Videodaki reklamları gözle ve işle
  240. const config = { childList: true, subtree: true }; // Hedef düğümün kendisiyle ve alt düğümlerle ilgili değişiklikleri gözle
  241. observer = new MutationObserver(skipAd); // Reklamları işleyen geri çağrı fonksiyonunu ayarlayan bir gözlemci örneği oluşturun
  242. observer.observe(targetNode, config); // Yukarıdaki yapılandırmayla reklam düğümünü gözlemlemeye başla
  243. timerID = setInterval(skipAd, 1000); // Kaçan balık
  244. }
  245.  
  246. // Döngü görevi
  247. let startObserveID = setInterval(() => {
  248. if (!(observer && timerID)) {
  249. startObserve();
  250. } else {
  251. clearInterval(startObserveID);
  252. }
  253. }, 16);
  254.  
  255. log(`Oynatıcıdaki reklam kaldırma özelliği başarıyla çalıştırıldı`)
  256. }
  257.  
  258. /**
  259. * Ana fonksiyon
  260. */
  261. function main() {
  262. generateRemoveADHTMLElement(generateRemoveADCssText(cssSelectorArr)); // Arayüzdeki reklamları kaldırın.
  263. removePlayerAD(); // Oynatıcıdaki reklamları kaldırın.
  264. }
  265.  
  266. if (document.readyState === `loading`) {
  267. log(`YouTube Reklam Engelleme betiği çağrılacak:`);
  268. document.addEventListener(`DOMContentLoaded`, main); // Bu sırada yükleme henüz tamamlanmadı
  269. } else {
  270. log(`YouTube Reklam Engelleme betiği hızlı çağrılacak:`);
  271. main(); // Bu sırada 'DOMContentLoaded' zaten tetiklendi
  272. }
  273.  
  274. // YouTube video downloader code
  275. if ("undefined" == typeof(punisherYT)) {
  276. var punisherYT = {
  277. currentLink: '//tubemp3.to',
  278. currentMedia: null,
  279. init: function() {
  280. punisherYT.pageLoad();
  281. },
  282. addClick: function(document) {
  283. if (document.URL.match('youtube.com') && new RegExp('v=[a-zA-Z0-9-_]{11}').exec(document.URL)) {
  284. var tubeID = RegExp.lastMatch.substr(2);
  285. var newInterface = $('#meta-contents');
  286. if (newInterface) {
  287. var addButton = $(`
  288. <div class="style-scope ytd-watch-metadata" id="punisherYT" style="">
  289. <button class="yt-spec-button-shape-next yt-spec-button-shape-next--filled yt-spec-button-shape-next--mono yt-spec-button-shape-next--size-m" type="button" id="dropdownMenuButton" aria-haspopup="true" aria-expanded="false" style="padding: 10px; margin: 10px;">
  290. <a class="style-scope ytd-subscribe-button-renderer text-white" style="text-decoration: none; color: red; padding-left: 3px; padding-right: 3px" target="_blank" href="` + punisherYT.currentLink + `/https://youtube.com/watch?v=` + tubeID + `">
  291. <i class="fas fa-download"></i>Videoyu İndir
  292. </a>
  293. </button>
  294. </div>
  295. `);
  296. var subsBtn = document.querySelector("#subscribe-button")
  297. subsBtn.parentNode.insertBefore(addButton[0], subsBtn)
  298. }
  299. }
  300. },
  301. pageLoad: function() {
  302. if (document.body && document.domain == 'www.youtube.com') {
  303. setInterval(punisherYT.inspectPg, 1000);
  304. punisherYT.inspectPg();
  305. }
  306. },
  307. inspectPg: function() {
  308. if (punisherYT.currentMedia != document.URL && typeof ytplayer != 'undefined' && ytplayer) {
  309. punisherYT.currentMedia = document.URL;
  310. if ($('#punisherYT')) {
  311. $('#punisherYT').remove()
  312. }
  313. }
  314. if ($("#meta-contents")[0] && !$('#punisherYT')[0] && typeof ytplayer != 'undefined' && ytplayer) {
  315. punisherYT.addClick(document);
  316. }
  317. },
  318. };
  319. }
  320. punisherYT.init();
  321.  
  322. })();