Guest User

Metabot with dislikes

a guest
Mar 22nd, 2018
211
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // ==UserScript==
  2. // @name         MetaBot for YouTube
  3. // @namespace    yt-metabot-user-js
  4. // @description  More information about users and videos on YouTube.
  5. // @version      180226
  6. // @homepageURL  https://vk.com/public159378864
  7. // @supportURL   https://github.com/asrdri/yt-metabot-user-js/issues
  8. // @updateURL    https://github.com/asrdri/yt-metabot-user-js/raw/master/yt-metabot.meta.js
  9. // @downloadURL  https://github.com/asrdri/yt-metabot-user-js/raw/master/yt-metabot.user.js
  10. // @icon         https://github.com/asrdri/yt-metabot-user-js/raw/master/logo.png
  11. // @include      https://*youtube.com/*
  12. // @include      https://*dislikemeter.com/?v*
  13. // @exclude      https://*youtube.com/*/about
  14. // @require      https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js
  15. // @require      https://github.com/dwachss/bililiteRange/raw/master/bililiteRange.js
  16. // @grant        none
  17. // @run-at       document-start
  18. // ==/UserScript==
  19.  
  20. //-- ПЕРЕМЕННЫЕ ДЛЯ ДИЗЛАЙКОВ --
  21. const minDislikeClickTime = 2000;  //Время между кликами по дизлайкам выбирается случайным образом между этих 2 значений, мс
  22. const maxDislikeClickTime = 4000;  //Время между кликами по дизлайкам выбирается случайным образом между этих 2 значений, мс
  23. var orderedClicksArray = [];       //Массив для временного хранения ссылок на дизлайки(удаляются из массива после клика)
  24. var bClickTaskSet = 0;             //Индикатор, показывающий запущена ли задача выставления дизлайков, мини оптимизация
  25. //КОНЕЦ ПЕРЕМЕННЫХ ДЛЯ ДИЗЛАЙКОВ
  26.  
  27. const checkb = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAPCAMAAADXs89aAAAA+VBMVEUAAAD///+qqqp/f39mZmZubm5vb29sbGxtbW1tbW1tbW1ubm5ubm5tbW1ubm5tbW1ubm5ubm5ubm5tbW1tbW1ubm5ubm5tbW1ubm5ubm5tbW1ubm5ubm5vb29wcHBxcXFzc3N0dHR1dXV3d3d4eHh6enp7e3t8fHyAgICCgoKFhYWMjIyOjo6Pj4+QkJCSkpKUlJSWlpaZmZmampqdnZ2hoaGqqqqwsLC0tLS1tbW2tra5ubm+vr7ExMTKysrLy8vQ0NDR0dHS0tLU1NTV1dXW1tbe3t7i4uLj4+Pk5OTl5eXn5+fo6Ojq6urs7Ozu7u7w8PD9/f3////SCMufAAAAHHRSTlMAAAMEBSUnKCpbXV9htre6u87Q0dPp6uvs7u/8pkhKVQAAAMdJREFUeNpN0NdWwlAUANEbgvTeQhnQIE1B1ChYQcEC0gL+/8ewzPWwmMf9OMowDKWUP5YqU0pGTaXTHMqdOcM7G7LBIw4Vnc3b89i9BytwYH+uv7oAOqsbyJjCMb4d/urOgYhwqr55wmvdhIRwufXT0zzrgCVM1X2tA5xva1ARLvE4aQCMXoCCcJLaZNpvX71/3QJx4ShUBx+Lz4fp7hrCwmYWL3v5u7XTPmEVtLRfuk7+5OhJIKP9NO2psDIjCatSiId9/7oHY28awgWqV+8AAAAASUVORK5CYII=';
  28. const mred = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAMAAAAMCGV4AAAAqFBMVEUAAAD/AAD/MwD+AAD4AAD+AAD+DAD+AAD+AgD+BwD9AAD+AAD+AQD+AgD+AAD9AAD+AQD+AgD+AAD+AAD+AgD+AgD+AgD9AQD/AAD/AgD/DAz/DQ3/EBD/ISH/IiL/IyP/Jib/OTn/PT3/QUH/Q0P/S0v/Tk7/T0//U1P/VFT/Wlr/Z2f/i4v/j4//srL/trb/yMj/zMz/19f/3t7/4uL/9fX/+Pj////schBBAAAAGHRSTlMABAUmJycqXF5ht7e5u8/Q0NTq6+3u7/0SYvJQAAAAgklEQVQIHQXBC1KDMBQAwM0jJWCt9z+mjoNAmo+7CVHyvrSz3ZPE+iyPF8d9HW/Z+pV9vBj3Fj894pmpqKyfKUpBx8C+RoaGBjl2GMNssMUChgFyNNB10OIEwwBnbuDoN+hxXxAl4K/GPCrKo6AeczHe6eFK39P52yWkNW+5nb1O/gHoZT3jykIiwQAAAABJRU5ErkJggg==';
  29. const mgreen = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAMAAAAMCGV4AAAAyVBMVEUAAABVqlU/vz8zmTMpniktoy0snywqnSosnywrnysqoSosoCwrnyssoCwroCsrnyssnywsoCwrnysroCsrnysroCssnywsnywrnysroCssnywsoCwuoS44pTg5pjk6pjo8pzw9qD1LrktOr05UslRYtFhctVxgt2Bnu2dqvGptvW1vvm9ywHJ1wXV4wniRzZGs2qzE5MTJ5snS69LU69TW7NbY7djb79vn9Ofq9urw+PDz+fP1+vX5/Pn6/fr7/fv8/fz8/vz///9DdKfSAAAAG3RSTlMAAwQFJScoKltdX2G2t7q7ztDR0+nq6+zu7/wFCQO8AAAAm0lEQVR42jXK1xKCQBBE0WEVRZCsGNqAOeecdf7/o1yg9jx0za0aknKW20DdMQWliiEyQSHNGpRIl8+hqvam5QuyVHYOvEWJXGS6R/6tYVMD8W4AxCf+roCIgD3f+r0zf5YAmlTH8M7XC78XkKrkAKMH83uORJlMuePna4aUQSIAMJlm6WlEhQhKJU+S7iPjyUyIkh01q2VDk/cfpzAWsSatwJQAAAAASUVORK5CYII=';
  30. const morange = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAMAAAAMCGV4AAAA8FBMVEUAAAD/qgD/fwD/ZgD+fAD+fAD+fAD+fwD+fwD+fwD/fAD/fwD+fgD+fgD+fgD+fgD+fQD+fgD+fgD+fQD+fQD+fQD+fQD+fgD+fQD+fgD+fQD+fgD+fQD+fgD/fgD/fwH/fwL/gAT/gAX/ggf/gwr/hAz/hQ7/jBz/jh//jiH/lCv/lzL/mTX/mTb/mjf/oEP/oUX/o0j/pk7/pk//qVX/qVb/q1j/r2D/tGv/vHr/vn7/xIv/yJL/zZ3/1Kr/17D/2bP/2bX/27f/4ML/48j/5s7/6dT/6tb/7Nn/8+j/9+//9/D/+fT//vz//v3///+PfT9BAAAAHnRSTlMAAwQFJScpWlxeYGC1trm6u87Q0dPp6urr7O7u/P7y0GwDAAAAp0lEQVR42h2JVQLCUAwEQ6FAcSkOi7u7u2vufxteMz+T2ZDC7glmcumAoZHgNJFv9dslRHXJFDp3Zn7OkFSD3UT9xe/Dg38DRDTyAiv+NFG88h5wUwhojMdA4cInwE8ZCJUd8wRIEITymXmpnKW09IK/c8txCkhv+Sj2kSHuTntiF2lRy8PbyFLYRqQnAax5AyDmIIUeAaqzmvqqtNDc/kQ27nPZ1P0HrvQbttZfcNAAAAAASUVORK5CYII=';
  31. const imgdm = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAYAAADE6YVjAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAYdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuM4zml1AAAAQiSURBVEhLrZZ/TJR1HMe/GpRZ/+RWMtvKttZkudKadqnMbBTBbG2mC1GkX8YdDbrMwIkCMbPcoIRMOjR1sFR0pQjz8FC4O9HMSQlzyUaaTA84b3hw9zx3wOG9+3y/99wTBw8Crc/22n3v+32e9/s+n+/n+T7H7hVoZDFBO8sM2tgJ4sZdKxsINLLgwBnmkS3sfJ+ZfSWdZPOVyycXwV/ZTBI1kUE/7AxjQYaQLAzeOmaV69kC5fbxg4SXk8FtLdGx6D/DQFkFvGZWgCPsPkVKO0j8A2JQS2g8BhsYPHWCA1TmKEUyMpQM/pNBGNqrkJGZFSmy/4ayB5Mq0Vj46oXRkHSKJSryoSADU/gi+54ZaD86Xb2JMsTBHbOo7lPVOc7Rohh4LFHqdz7mc9SBIhtqhjZcYtHCQGlTtYs+z5iDfOMz6s23qqdhjm4pumoeUOc4rybqcKLkMfU7H8cnvSTGSjbwnGIrhQkZZIYv5NjKZ2BeXBwqtj+Opr2PYHXyfKxb87y6HqYkdzZeSdChbtejMBNLaVy6ZbZY462t7E1NyIQetJECx76diYTlC7Fw2WJs0Mfijjk6Yp0TaJyCbzY/hSWvvSzgYz7H10gzbNIrOo0mbowU+D+gjRdGvXXsaV4uv9ZFY+FvuB99lofgqZ+OIVtkMwyHjh1h0neS6XgmE342Lv4Ui2R9MVak7yXKYTDmYGtu+ijytuhR9vWbcNVGczMysbMuLcHh8BoPUWtuL0iFfvMvyMqvERyqbkaXs2cUNx3dOHT8HEw7kjDQyOZykwYtYU7AGgVfcyKka99BcjahoLgKhtxjqonF1gZZlkchSRIcjk5k5JQiJSP3SW6SN1L8Lv1y36UESK4/IPfehHT9B/ha38MXhZsmZMJxu904XH0O8WtKPmRBK4ulcgRVAyqL/GcOZI+LPrMxaHtYlIuvbct7d8ImXq8XLVfa8ca6UnP4WTFzES4mt6RC7uuC77fFqniYyZhwHJ2deGv97sshEzt7jgQHBq0PQnZfg3w5WZxZww04X+anRZjUnr6iKR7G6XTio02VkjDhQaLZQ9Yp8F9YQHui3f+1pkV4W78HKVmVWJ1VgZWGcnTcuq1pwMvV/lcH3vm4vE2xoIMSbCpls1tLPAzPru3nJ3C+Yi4uVD6L42Vx+LHqrBDt7u7GJwWH8f5nJnfqp/sda437HCvSyy7SxusUi1DwVycJFRIBLZOR9DdEw5BdDHevBy6XC9tKq7HeaHxBkbt3UMcto6xatISHwxujqDAZrVc70NPTg+8P1CM+decSRWb84KcnZcRfyVWE+tbkwvwo959m/fRiOrtxo+H35tbrolyZWw/6k9J2xSgSkwtRxiY2i/4svMjPIn5U/L2fTeNrr68tWbTKUH41bcO+O/EpO/Xihohg7B/pB5kCVYYVDwAAAABJRU5ErkJggg==';
  32. const imgdma = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAMAAADzN3VRAAABsFBMVEUAAAD//wD/qgD/vwD/zAD+xwD/vwD+xADwuAD+wAD+wgD0tgD1uwD+wAD0uQBZtl3+wgCtvC3yuQCstyv+wQD+wgD+wgD+wgDztwD+wgDxtwDytwD+wQD+wQDyuAD+wQD+wQDytwD+wQD+wgDzuAD1ugD+wQDzuABft1n+wQD+wgBatlz+wQDytwD5vQD+wgD+wgD9wAD+wQD+wQDxtwD+wgDyuAD7vwD+wQAoOD8wPT02QTs8RTk/RzhARzhCSThESjdHTDZZWDFat11eWy9nvWpyaCl1aih4wXR5tkl5ulh6t0l7uEl7xX1/cCaBu1CGt0CKukCOeiGReyCSfCCV0ZeWujqbx2qc1J6ihhumiRqrjBivjxeykRa3lBW4lBXBmhLCmxLEnBHbqwrksQjnswfutwXxwAbyuADyugT0uQD0ugD03ZP03pj06cT068/10Fj10V311nb11nf179318OP18ef18uv2uwD2yTv2zEf2zUn20mH3yDX4vQD4vQL5vQD6vgD6wAn6wQz7vwD7vwH7wAT8wAD8wAH9wAD9wQD9wQL+wQD+wgD/wgD////cSs4bAAAAOXRSTlMAAgMEBRcYGiQpLjE1QUlKTFRUWGNtdn6AgoeMlpmgqbKzt77AxtHY3uDn6Orw8vf4+fn6+/v8/v4dJMtLAAABQUlEQVR42nXP9VMCQRjG8VewEwO7ExQVu7DFBAMVUMSOs7tbwTye+5fdHXC4c/Dzyzu739nZXQqI1Bbq61pqyrLjSCEizwg/z25pvCxoDAh6aMxU/Ya0Bsg9C/nqwAkWFJ6EHP8dBvx11ZzISx6wsgb45h8BuLaBbdenUBHOnmsEhsaB9bYNAN1uwN2DKyGFSAtguX1utW8AzHTX0mLnDDxCEVEhmIXejsFNMF6byWTzQhSq1aRHKDtCNNUGl1t2C+NwTFgsI5OpJPuMvZ+TJCsfOqpEgPg+FiwMlQDc2+3ewbCyZID5ujk8378bVZaYVuDz9PLkVYRFWagY4vHFtQjAIck4iWLrX86OfAhRKP3j/hvchJWTpFk+zKyE5cLvzz2MKqspZOESyv8rpNYUGDAlL1VEv1RRyTq+5XSaeUj6AXAh19PAE4muAAAAAElFTkSuQmCC';
  33. const imgdmd = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAZCAMAAACM5megAAAAllBMVEUAAAB/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAx6H3iAAAAMXRSTlMABAgMFBgcICQoLDA8QERITFBUWGBkaGx4fICDj5OXo6evs7e7v8PH09ff4+fr8/f7vr5GKgAAAN5JREFUeAGFy/FagjAARfEbIoSCWqLJXJoZltEm9/1fru2DPidM+v19DhyjRXEorbftFH654tV7hBtJZsw+yFoKa0dDPcMl2Dqh8U1rA9dLTYvnAFagaNUpXIsLPaoQQBShEdX0kQByHQOWpFcFILGldaZfCkCXQBDHU96xf4DkHhPFAUqRGQoOu6yBFQcc86cxgNGJ983QSmVFPx3gakmvHVwHeugxXI+afVvcymr2ZOhYsyf8v1HokjR+NK3qk0aJriONBI05jVd0fdkfrZzGEl1zIYoJWuFGiBX+/AIRxGBfReXU6wAAAABJRU5ErkJggg==';
  34. const botTargetDay = Date.parse('1 June 2017');
  35. const regexdate = /joinedDateText(.*?)"},{"text":"(.*?)"}]},/;
  36. const regexdatemob = /joined_date_text(.*?)"}, {"text": "(.*?)"}]/;
  37. const regexid = /"video_id":"(.*?)"/;
  38. const regexlinew = /"logged_in","value":"(.*?)"/;
  39. const regexliold = /"logged_in":"(.*?)"/;
  40. const regexlang = /"host_language":"(.*?)"/;
  41. const regexlangmob = /\\"host_language\\": \\"(.*?)\\"/;
  42. const mainDBurl = 'https://raw.githubusercontent.com/YTObserver/YT-ACC-DB/master/mainDB';
  43. if(window.location.hostname == "dislikemeter.com" || window.location.hostname == "www.dislikemeter.com") {
  44.   var videoid = getURLParameter('v', location.search);
  45.   if(videoid) {
  46.     waitForKeyElements('input#form_vid', function dmIDins(jNode) {
  47.       var pNode = jNode.get(0);
  48.       pNode.value = videoid;
  49.     });
  50.     return;
  51.   }
  52. } else if(window.location.pathname == '/channel/UCwBID52XA-aajCKYuwsQxWA/about') {
  53.   var msgu = getURLParameter('msgu', location.search);
  54.   var msgc = getURLParameter('msgc', location.search);
  55.   var msgn = getURLParameter('msgn', location.search);
  56.   if(msgu !== null & msgc !== null & msgn !== null) {
  57.     if(document.querySelector("meta[http-equiv='origin-trial']")) {
  58.       $.fn.sendkeys = function(x) {
  59.         x = x.replace(/([^{])\n/g, '$1{enter}');
  60.         return this.each(function() {
  61.           bililiteRange(this).bounds('selection').sendkeys(x).select();
  62.           this.focus();
  63.         });
  64.       };
  65.       waitForKeyElements('div#labelAndInputContainer', function insertMsgNew(jNode) {
  66.         $(jNode).find('input#input').sendkeys('MetaBot_report_v2: https://www.youtube.com/watch?v=' + msgu + '&lc=' + msgc + ' - ' + msgn);
  67.       });
  68.       waitForKeyElements('ytd-button-renderer.style-scope.ytd-channel-about-metadata-renderer.style-default', function sendMsgNew(jNode) {
  69.         if($(jNode).find('g.style-scope.yt-icon').children().length == 2) {
  70.           jNode.click();
  71.         }
  72.       });
  73.     } else {
  74.       waitForKeyElements('iframe#js-prefetch', function dmIDins(jNode) {
  75.         document.querySelector('button.channel-msg-button').click();
  76.         document.querySelector('textarea.compose-message').value = 'MetaBot_report_v1: https://www.youtube.com/watch?v=' + msgu + '&lc=' + msgc + ' - ' + msgn;
  77.       });
  78.       waitForKeyElements('button.channel-msg-button', function(jNode) {
  79.         $(jNode).css({
  80.           "border-color": "#77fa77",
  81.           "background": "linear-gradient(to right bottom, rgba(0,0,0,0), rgba(100,250,100,0.4))",
  82.           "border-width": "5px",
  83.           "border-style": "solid"
  84.         });
  85.         $(jNode).find('span.yt-uix-button-content').html('Подождите загрузки формы');
  86.         $(jNode).attr('data-tooltip-text', 'Подождите загрузки формы (~5 секунд)');
  87.       });
  88.     }
  89.   }
  90. } else {
  91.   var arrayDB = [];
  92.   var requestDB = new XMLHttpRequest();
  93.   requestDB.onreadystatechange = function() {
  94.     if(requestDB.readyState === 4) {
  95.       if(requestDB.status === 404) {
  96.         console.log("[MetaBot for Youtube] XMLHttpRequest succeed: mainDB not found.");
  97.       }
  98.       if(requestDB.status === 200) {
  99.         var responseDB = requestDB.responseText;
  100.         if(responseDB !== "") {
  101.           console.log("[MetaBot for Youtube] XMLHttpRequest succeed: mainDB loaded.");
  102.           arrayDB = responseDB.match(/[^\r\n=]+/g);
  103.         } else {
  104.           console.log("[MetaBot for Youtube] XMLHttpRequest failed.");
  105.         }
  106.       }
  107.     }
  108.   };
  109.   requestDB.open("GET", mainDBurl, true);
  110.   requestDB.send(null);
  111.   if(document.querySelector("meta[http-equiv='origin-trial']")) {
  112.     console.log('[MetaBot for Youtube] YouTube New design detected.');
  113.     spinnercheckNew();
  114.     waitForKeyElements('div#main.style-scope.ytd-comment-renderer', parseitemNew);
  115.     waitForKeyElements('div#flex', insertdmNew);
  116.   } else if(document.querySelector("meta[http-equiv='Content-Type']")) {
  117.     console.log('[MetaBot for Youtube] YouTube Mobile mode detected.');
  118.     waitForKeyElements('div.vpb', parseitemMob);
  119.   } else {
  120.     console.log('[MetaBot for Youtube] YouTube Classic design detected.');
  121.     waitForKeyElements('.comment-renderer-header', parseitem);
  122.     waitForKeyElements('div#watch7-views-info', insertdm);
  123.   }
  124. }
  125.  
  126. function spinnercheckNew() {
  127.   waitForKeyElements('paper-spinner-lite.ytd-item-section-renderer[aria-hidden="true"]', function(jNode) {
  128.     if (getURLParameter('v', location.search) === null) {
  129.       return;
  130.     }
  131.     console.log('[MetaBot for Youtube] Comment sorting spinner found.');
  132.     var mutationObserver = new MutationObserver(function(mutations) {
  133.       mutations.forEach(function(mutation) {
  134.         if($(jNode).find("#spinnerContainer").hasClass("cooldown")) {
  135.           setTimeout(recheckallNew, 2000);
  136.         } else {
  137.           $('div#main.style-scope.ytd-comment-renderer').each(function() {
  138.             var cNode = $(this).find("#published-time-text")[0];
  139.             deleteitemNew(this, $(cNode).find("a")[0].href);
  140.           });
  141.         }
  142.       });
  143.     });
  144.     mutationObserver.observe($(jNode).get(0), {
  145.       attributes: true,
  146.       attributeFilter: ['active'],
  147.       characterData: false,
  148.       childList: false,
  149.       subtree: true,
  150.       attributeOldValue: false,
  151.       characterDataOldValue: false
  152.     });
  153.   }, false);
  154.   waitForKeyElements('paper-spinner#spinner.yt-next-continuation[aria-hidden="true"]', function(jNode) {
  155.     if (getURLParameter('v', location.search) === null) {
  156.       return;
  157.     }
  158.     console.log('[MetaBot for Youtube] Comment loading spinner found.');
  159.     var mutationObserver = new MutationObserver(function(mutations) {
  160.       mutations.forEach(function(mutation) {
  161.         if($(jNode).find("#spinnerContainer").hasClass("cooldown")) {
  162.           setTimeout(recheckallNew, 2000);
  163.         } else {
  164.           setTimeout(recheckallNew, 2000);
  165.         }
  166.       });
  167.     });
  168.     mutationObserver.observe($(jNode).get(0), {
  169.       attributes: true,
  170.       attributeFilter: ['active'],
  171.       characterData: false,
  172.       childList: false,
  173.       subtree: true,
  174.       attributeOldValue: false,
  175.       characterDataOldValue: false
  176.     });
  177.   }, false);
  178.   waitForKeyElements('paper-spinner#spinner.yt-next-continuation[active]', function(jNode) {
  179.     if (getURLParameter('v', location.search) === null) {
  180.       return;
  181.     }
  182.     console.log('[MetaBot for Youtube] Comment replies loading spinner found.');
  183.     var mutationObserver = new MutationObserver(function(mutations) {
  184.       if (mutations[0].removedNodes) {
  185.         mutationObserver.disconnect();
  186.         setTimeout(recheckallNew, 2000);
  187.       }
  188.     });
  189.     mutationObserver.observe($(jNode).get(0).parentNode, {
  190.       attributes: true,
  191.       characterData: false,
  192.       childList: false,
  193.       subtree: false,
  194.       attributeOldValue: false,
  195.       characterDataOldValue: false
  196.     });
  197.   }, false);
  198. }
  199.  
  200. function recheckallNew(){
  201.   $('div#main.style-scope.ytd-comment-renderer').each(function() {
  202.     recheckNew(this);
  203.   });
  204. }
  205.  
  206. function insertdm(jNode) {
  207.   var videoid = getURLParameter('v', location.search);
  208.   var pNode = $(jNode).get(0);
  209.   var newspan = document.createElement('span');
  210.   newspan.innerHTML = '<a id="dmAdd" title="Добавить видео на анализатор Дизлайкметр" href="https://dislikemeter.com/?v=' + videoid + '"><img src="' + imgdma + '" /></a><span style="padding:0em 1em 0em 0em"></span><a style="padding:0px 0px 0px 1px" id="dmGo" title="Открыть статистику видео на анализаторе Дизлайкметр" href="https://dislikemeter.com/video/' + videoid + '" ><img src="' + imgdm + '" /></a>';
  211.   newspan.id = 'dmPanel';
  212.   $(pNode).css('text-align', 'right');
  213.   pNode.insertBefore(newspan, pNode.firstChild);
  214.   $(pNode).find("#dmPanel")[0].addEventListener("click", function dmClick() {
  215.     this.removeEventListener("click", dmClick);
  216.     var newspan = document.createElement('span');
  217.     newspan.innerHTML = '<a target="_blank" title="Помочь проекту Дизлайкметр" href="https://dislikemeter.com/?donate"><img src="' + imgdmd + '" /></a><span style="padding:0em 1em 0em 0em"></span>';
  218.     $(pNode).find("#dmPanel")[0].insertBefore(newspan, $(pNode).find("#dmPanel")[0].firstChild);
  219.   }, false);
  220.   $(pNode).find("#dmPanel")[0].addEventListener("mouseover", function dmOver() {
  221.     this.removeEventListener("mouseover", dmOver);
  222.     $(this).find("#dmAdd")[0].target = "_blank";
  223.     $(this).find("#dmGo")[0].target = "_blank";
  224.   }, false);
  225. }
  226.  
  227. function insertdmNew(jNode) {
  228.   this.addEventListener('yt-navigate-finish', function insertdmNewR() {
  229.     this.removeEventListener('yt-navigate-finish', insertdmNewR);
  230.     insertdmNew(jNode);
  231.   });
  232.   var videoid = getURLParameter('v', location.search);
  233.   if(typeof videoid === 'undefined') {
  234.     return;
  235.   }
  236.   if(!videoid) {
  237.     return;
  238.   }
  239.   var pNode = $(jNode).get(0);
  240.   if(typeof pNode === 'undefined') {
  241.     return;
  242.   }
  243.   var shareRu = $('button#button[aria-label="Поделиться"]')[0];
  244.   if($(shareRu).length > 0) {
  245.     if($(shareRu).parent().parent().find('yt-formatted-string#text').length > 0) {
  246.       $(shareRu).parent().parent().find('yt-formatted-string#text').html('');
  247.     }
  248.   }
  249.   pNode.innerHTML = '';
  250.   var newspan = document.createElement('span');
  251.   newspan.innerHTML = '<yt-icon-button style="padding:0em 0em 0em 0em" class="style-scope ytd-toggle-button-renderer style-default-active" onclick="window.open(\'https://dislikemeter.com/?v=' + videoid + '\', \'_blank\');" title="Добавить видео на анализатор Дизлайкметр"><a style="padding:0px 0px 0px 1px"><img src="' + imgdma + '" /></a></yt-icon-button><span style="padding:0em 0.5em 0em 0em"></span><yt-icon-button style="padding:0em 0em 0em 0em" class="style-scope ytd-toggle-button-renderer style-default-active" onclick="window.open(\'https://dislikemeter.com/video/' + videoid + '\', \'_blank\');" title="Открыть статистику видео на анализаторе Дизлайкметр"><a style="padding:0px 0px 0px 1px"><img src="' + imgdm + '" /></a></yt-icon-button><span style="padding:0em 1em 0em 0em"></span>';
  252.   newspan.id = 'dmPanel';
  253.   $(pNode).css('text-align', 'right');
  254.   pNode.insertBefore(newspan, pNode.firstChild);
  255.   $(pNode).find("#dmPanel")[0].addEventListener("click", function dmClick() {
  256.     this.removeEventListener("click", dmClick);
  257.     var newspan = document.createElement('span');
  258.     newspan.innerHTML = '<yt-icon-button style="padding:0em 0em 0em 0em" class="style-scope ytd-toggle-button-renderer style-default-active" onclick="window.open(\'https://dislikemeter.com/?donate\', \'_blank\');" title="Помочь проекту Дизлайкметр"><a style="padding:0px 0px 0px 1px"><img src="' + imgdmd + '" /></a></yt-icon-button><span style="padding:0em 0.5em 0em 0em"></span>';
  259.     $(pNode).find("#dmPanel")[0].insertBefore(newspan, $(pNode).find("#dmPanel")[0].firstChild);
  260.   }, false);
  261.   $(pNode).find("#dmPanel")[0].addEventListener("mouseover", function dmOver() {
  262.     this.removeEventListener("mouseover", dmOver);
  263.   }, false);
  264. }
  265.  
  266. function parseitem(jNode) {
  267.   var pNode = $(jNode).parent().parent().get(0);
  268.   $(pNode).hover(function blockShow() {
  269.     $(pNode).find("#t30sp").show();
  270.   }, function blockHide() {
  271.     $(pNode).find("#t30sp").hide();
  272.   });
  273.   pNode = jNode.get(0);
  274.   var userID = $(jNode).find("a")[0].href.split('/').pop();
  275.   var foundID = arrayDB.indexOf(userID);
  276.   var comURL = $(jNode).find("span")[0];
  277.   var t30span = document.createElement('span');
  278.   t30span.innerHTML = ' \u2022 <span id="about" style="cursor: pointer" title="Открыть страницу с датой регистрации">?</span> \u2022 <span id="top30" style="cursor: pointer" title="Найти другие комментарии автора с помощью агрегатора ТОП30"><font color="#7777fa">top</font><font color="#fa7777">30</font></span>';
  279.   t30span.id = 't30sp';
  280.   t30span.style = "display:none";
  281.   if(foundID > -1) {
  282.     console.log("[MetaBot for Youtube] user found in mainDB: " + userID);
  283.     markred(pNode, arrayDB[foundID + 1]);
  284.     $(comURL).after(t30span);
  285.   } else {
  286.     var newspan = document.createElement('span');
  287.     newspan.innerHTML = '<img id="checkbtn" src="' + checkb + '" title="Проверить дату регистрации" style="cursor: help" />';
  288.     newspan.id = 'checksp';
  289.     pNode.insertBefore(newspan, pNode.firstChild);
  290.     t30span.innerHTML += ' \u2022 <span id="sendlinkoff" title="Пожалуйста, проверьте другие комментарии пользователя кнопкой top30">Сообщить</span><span id="sendlink" style="cursor: pointer; display: none" title="Помогите пополнить список известных ботов - отправьте нам ссылку на подозрительный комментарий">Сообщить</span>';
  291.     $(comURL).after(t30span);
  292.     $(jNode).find("img")[0].addEventListener("click", function checkcomment() {
  293.       checkdate(pNode);
  294.     }, false);
  295.     $(jNode).find("#sendlink")[0].addEventListener("click", function displayinfo() {
  296.       sendinfo($(jNode).find("#sendlink"), $(comURL).find("a")[0].href, $(jNode).parent().parent().find("img")[0].alt, regexliold);
  297.       $(jNode).find("#sendlink").css("text-decoration", "line-through");
  298.     }, false);
  299.   }
  300.   $(jNode).find("#about")[0].addEventListener("click", function openaboutNew() {
  301.     window.open($(jNode).find("a")[0].href + '/about');
  302.   }, false);
  303.   $(jNode).find("#top30")[0].addEventListener("click", function openaboutNew() {
  304.     window.open('https://www.t30p.ru/search.aspx?s=' + $(jNode).find("a")[0].href.split('/').pop());
  305.     $(jNode).find("#sendlinkoff").hide();
  306.     $(jNode).find("#sendlink").show();
  307.   }, false);
  308. }
  309.  
  310. function parseitemMob(jNode) {
  311.   var userID = $(jNode).find("a")[0].href.split('/').pop();
  312.   var foundID = arrayDB.indexOf(userID);
  313.   if(foundID > -1) {
  314.     console.log("[MetaBot for Youtube] user found in mainDB: " + userID);
  315.     markredMob(jNode, arrayDB[foundID + 1]);
  316.   } else {
  317.     $(jNode)[0].addEventListener("touchstart", function () {
  318.       $(this).data('moved', '0');
  319.     }, false);
  320.     $(jNode)[0].addEventListener("touchmove", function () {
  321.       $(this).data('moved', '1');
  322.     }, false);
  323.     $(jNode)[0].addEventListener("touchend", function ttend() {
  324.       if($(this).data('moved') == 0){
  325.         if(['en', 'en-US', 'en-GB', 'ru', 'uk'].indexOf(currentlangmob()) < 0) {
  326.           alert('Функция поддерживается только на языках:\n \u2714 English\n \u2714 Русский\n \u2714 Українська\nВы можете сменить язык интерфейса в меню настроек YouTube.');
  327.           return;
  328.         }
  329.         this.removeEventListener("touchend", ttend);
  330.         checkdateMob(this);
  331.       }
  332.     }, false);
  333.   }
  334. }
  335.  
  336. function parseitemNew(jNode) {
  337.   var pNode = $(jNode).find("#header-author.ytd-comment-renderer")[0];
  338.   $(jNode).hover(function blockShow() {
  339.     $(pNode).find("#t30sp").show();
  340.   }, function blockHide() {
  341.     $(pNode).find("#t30sp").hide();
  342.   });
  343.   var userID = $(jNode).find("a")[0].href.split('/').pop();
  344.   var foundID = arrayDB.indexOf(userID);
  345.   var comURL = $(jNode).find("#published-time-text")[0];
  346.   var t30span = document.createElement('span');
  347.   t30span.innerHTML = ' \u2022 <span id="about" style="cursor: pointer" title="Открыть страницу с датой регистрации">?</span> \u2022 <span id="top30" style="cursor: pointer" title="Найти другие комментарии автора с помощью агрегатора ТОП30"><font color="#7777fa">top</font><font color="#fa7777">30</font></span>';
  348.   t30span.id = 't30sp';
  349.   t30span.style = "display:none";
  350.   var newspan = document.createElement('span');
  351.   newspan.id = 'checksp';
  352.   if(foundID > -1) {
  353.     console.log("[MetaBot for Youtube] user found in mainDB: " + userID);
  354.     markredNew($(pNode).parent(), arrayDB[foundID + 1]);
  355.     $(comURL).append(t30span);
  356.     $(newspan).attr('data-chan', $(jNode).find("a#author-text")[0].href);
  357.     pNode.insertBefore(newspan, pNode.firstChild);
  358.   } else {
  359.     newspan.innerHTML = '<img id="checkbtn" src="' + checkb + '" title="Проверить дату регистрации" style="cursor: help" />';
  360.     $(newspan).attr('data-chan', $(jNode).find("a#author-text")[0].href);
  361.     pNode.insertBefore(newspan, pNode.firstChild);
  362.     t30span.innerHTML += ' \u2022 <span id="sendlinkoff" title="Пожалуйста, проверьте другие комментарии пользователя кнопкой top30">СООБЩИТЬ</span><span id="sendlink" style="cursor: pointer; display: none" title="Помогите пополнить список известных ботов - отправьте нам ссылку на подозрительный комментарий">СООБЩИТЬ</span>';
  363.     $(comURL).append(t30span);
  364.     $(jNode).find("#checkbtn")[0].addEventListener("click", function checkcommentNew() {
  365.       checkdateNew($(pNode).parent());
  366.     }, false);
  367.     $(jNode).find("#sendlink")[0].addEventListener("click", function displayinfoNew() {
  368.       sendinfo($(comURL).find("#sendlink")[0], $(comURL).find("a")[0].href, $(jNode).parent().find("img#img")[0].alt, regexlinew);
  369.       $(jNode).find("#sendlink").css("text-decoration", "line-through");
  370.     }, false);
  371.   }
  372.   $(jNode).find("#about")[0].addEventListener("click", function openaboutNew() {
  373.     window.open($(jNode).find("a")[0].href + '/about');
  374.   }, false);
  375.   $(jNode).find("#top30")[0].addEventListener("click", function openaboutNew() {
  376.     window.open('https://www.t30p.ru/search.aspx?s=' + $(jNode).find("a")[0].href.split('/').pop());
  377.     $(jNode).find("#sendlinkoff").hide();
  378.     $(jNode).find("#sendlink").show();
  379.   }, false);
  380.   this.addEventListener('yt-navigate-start', function wipeitemNewS() {
  381.     this.removeEventListener('yt-navigate-start', wipeitemNewS);
  382.     deleteitemNew(jNode, $(comURL).find("a")[0].href);
  383.   });
  384.   this.addEventListener('yt-navigate-finish', function wipeitemNewF() {
  385.     this.removeEventListener('yt-navigate-finish', wipeitemNewF);
  386.     deleteitemNew(jNode, $(comURL).find("a")[0].href);
  387.   });
  388. }
  389.  
  390. function recheckNew(jNode) {
  391.   var checkre = $(jNode).find("#checksp").get(0);
  392.   if(typeof checkre !== 'undefined') {
  393.     if($(checkre).attr('data-chan') !== $(jNode).find("a#author-text")[0].href) {
  394.       $(jNode).find("#checksp").remove();
  395.       $(jNode).find("#t30sp").remove();
  396.       $(jNode).find("#botmark").remove();
  397.       var cNode = $(jNode).parent().parent().find("#content-text");
  398.       $(cNode).parent().removeAttr('style');
  399.       $(cNode).removeAttr('style');
  400.       parseitemNew(jNode);
  401.     }
  402.   }
  403. }
  404.  
  405. function deleteitemNew(jNode, url) {
  406.   if(url.length > 74) {
  407.     $(jNode).parent().parent().remove();
  408.   } else {
  409.     $(jNode).parent().parent().parent().remove();
  410.   }
  411. }
  412.  
  413. function sendinfo(jNode, link, username, regexpid) {
  414.   if(regexpid.exec(document.body.innerHTML)[1] == "1") {
  415.     window.open('https://www.youtube.com/channel/UCwBID52XA-aajCKYuwsQxWA/about?msgu=' + getURLParameter('v', link) + '&msgc=' + getURLParameter('lc', link) + '&msgn=' + username);
  416.   } else {
  417.     alert("Для отправки сообщений необходимо войти в аккаунт Google.");
  418.   }
  419. }
  420.  
  421. function checkdate(jNode) {
  422.   if(['en', 'en-US', 'en-GB', 'ru', 'uk'].indexOf(currentlang()) < 0) {
  423.     alert('Функция поддерживается только на языках:\n \u2714 English\n \u2714 Русский\n \u2714 Українська\nВы можете сменить язык интерфейса в меню настроек YouTube.');
  424.     return;
  425.   }
  426.   $(jNode).find("img")[0].remove();
  427.   var channelURL = $(jNode).find("a")[0].href + '/about';
  428.   var request = new XMLHttpRequest();
  429.   request.onreadystatechange = function() {
  430.     if(request.readyState === 4) {
  431.       if(request.status === 200) {
  432.         var response = request.responseText;
  433.         if(response !== "") {
  434.           console.log("[MetaBot for Youtube] XMLHttpRequest succeed.");
  435.           window.tempHTML = document.createElement('html');
  436.           tempHTML.innerHTML = response;
  437.           window.aboutSTAT = tempHTML.getElementsByClassName('about-stat');
  438.           var testday = Dparse(aboutSTAT[aboutSTAT.length - 1].innerHTML);
  439.           if(Date.parse(testday) > botTargetDay) {
  440.             $(jNode).find("a")[0].innerHTML = $(jNode).find("a")[0].innerHTML + ' <img src="' + morange + '" title="Дата регистрации позже 1 июня 2017" /> ' + testday;
  441.             cNode = jNode.nextSibling;
  442.             $(cNode).css({
  443.               "background": "rgba(250,200,0,0.3)",
  444.               "border-left": "3px solid rgba(250,200,0,0.3)",
  445.               "padding-left": "3px"
  446.             });
  447.           } else {
  448.             $(jNode).find("a")[0].innerHTML = $(jNode).find("a")[0].innerHTML + ' <img src="' + mgreen + '" title="Дата регистрации раньше 1 июня 2017" /> ' + testday;
  449.             cNode = jNode.nextSibling;
  450.             $(cNode).css({
  451.               "background": "rgba(100,250,100,0.3)",
  452.               "border-left": "3px solid rgba(100,250,100,0.3)",
  453.               "padding-left": "3px"
  454.             });
  455.           }
  456.           delete window.aboutSTAT;
  457.           delete window.tempHTML;
  458.         } else {
  459.           console.log("[MetaBot for Youtube] XMLHttpRequest failed.");
  460.         }
  461.       }
  462.     }
  463.   };
  464.   request.open("GET", channelURL, true);
  465.   request.send(null);
  466. }
  467.  
  468. function checkdateMob(jNode) {
  469.   var channelURL = $(jNode).find("a")[0].href + '/about?ajax=1';
  470.   var request = new XMLHttpRequest();
  471.   request.onreadystatechange = function() {
  472.     if(request.readyState === 4) {
  473.       if(request.status === 200) {
  474.         var response = request.responseText;
  475.         if(response !== "") {
  476.           console.log("[MetaBot for Youtube] XMLHttpRequest succeed.");
  477.           var matches = regexdatemob.exec(response);
  478.           var testday = Dparse(decodeURIComponent(JSON.parse('"' + matches[2] + '"')));
  479.           if(Date.parse(testday) > botTargetDay) {
  480.             $(jNode).find("a")[0].innerHTML = $(jNode).find("a")[0].innerHTML + ' <img src="' + morange + '" title="Дата регистрации позже 1 июня 2017" /> ' + testday;
  481.             cNode = $(jNode).find("div.tpb")[0];
  482.             $(cNode).css({
  483.               "background": "rgba(250,200,0,0.3)",
  484.               "border-left": "3px solid rgba(250,200,0,0.3)",
  485.               "padding-left": "3px"
  486.             });
  487.           } else {
  488.             $(jNode).find("a")[0].innerHTML = $(jNode).find("a")[0].innerHTML + ' <img src="' + mgreen + '" title="Дата регистрации раньше 1 июня 2017" /> ' + testday;
  489.             cNode = $(jNode).find("div.tpb")[0];
  490.             $(cNode).css({
  491.               "background": "rgba(100,250,100,0.3)",
  492.               "border-left": "3px solid rgba(100,250,100,0.3)",
  493.               "padding-left": "3px"
  494.             });
  495.           }
  496.         } else {
  497.           console.log("[MetaBot for Youtube] XMLHttpRequest failed.");
  498.         }
  499.       }
  500.     }
  501.   };
  502.   request.open("GET", channelURL, true);
  503.   request.send(null);
  504. }
  505.  
  506. function checkdateNew(jNode) {
  507.   if(['en', 'en-US', 'en-GB', 'ru', 'uk'].indexOf(currentlang()) < 0) {
  508.     alert('Функция поддерживается только на языках:\n \u2714 English\n \u2714 Русский\n \u2714 Українська\nВы можете сменить язык интерфейса в меню настроек YouTube.');
  509.     return;
  510.   }
  511.   var idspan = document.createElement('span');
  512.   idspan.id = 'checked';
  513.   idspan.innerHTML = 'checked';
  514.   $(jNode).find("#checkbtn")[0].remove();
  515.   var userID = $(jNode).find("a")[0].href.split('/').pop();
  516.   var foundID = arrayDB.indexOf(userID);
  517.   if(foundID > -1) {
  518.     console.log("[MetaBot for Youtube] user found in mainDB: " + userID);
  519.     markredNew(jNode, arrayDB[foundID + 1]);
  520.   } else {
  521.     var channelURL = $(jNode).find("a")[0].href + '/about';
  522.     var request = new XMLHttpRequest();
  523.     request.onreadystatechange = function() {
  524.       if(request.readyState === 4) {
  525.         if(request.status === 200) {
  526.           var response = request.responseText;
  527.           if(response !== "") {
  528.             console.log("[MetaBot for Youtube] XMLHttpRequest succeed.");
  529.             var matches = regexdate.exec(response);
  530.             var testday = Dparse(matches[2]);
  531.             var aNode = $(jNode).find("#author-text")[0];
  532.             var cNode = $(jNode).parent().find("#content-text")[0];
  533.             var newspan = document.createElement('span');
  534.             newspan.id = 'botmark';
  535.             var checkBadge = $(aNode).parent().find('span#author-comment-badge')[0];
  536.             if(Date.parse(testday) > botTargetDay) {
  537.               newspan.innerHTML = '<img src="' + morange + '" title="Дата регистрации позже 1 июня 2017" /> ' + testday;
  538.               $(aNode).append(newspan);
  539.               if($(checkBadge).length > 0) {
  540.                 $(checkBadge).attr('hidden', '');
  541.                 $(aNode).removeAttr('hidden');
  542.               }
  543.               $(cNode).parent().css({
  544.                 "background": "rgba(250,200,0,0.3)",
  545.                 "border-left": "3px solid rgba(250,200,0,0.3)",
  546.                 "padding-left": "3px"
  547.               });
  548.             } else {
  549.               newspan.innerHTML = '<img src="' + mgreen + '" title="Дата регистрации раньше 1 июня 2017" /> ' + testday;
  550.               $(aNode).append(newspan);
  551.               if($(checkBadge).length > 0) {
  552.                 $(checkBadge).attr('hidden', '');
  553.                 $(aNode).removeAttr('hidden');
  554.               }
  555.               $(cNode).parent().css({
  556.                 "background": "rgba(100,250,100,0.3)",
  557.                 "border-left": "3px solid rgba(100,250,100,0.3)",
  558.                 "padding-left": "3px"
  559.               });
  560.             }
  561.             aNode = $(jNode).find("#checksp");
  562.             aNode.attr('data-chan', $(jNode).find("a#author-text")[0].href);
  563.             aNode.hide();
  564.           } else {
  565.             console.log("[MetaBot for Youtube] XMLHttpRequest failed.");
  566.           }
  567.         }
  568.       }
  569.     };
  570.     request.open("GET", channelURL, true);
  571.     request.send(null);
  572.   }
  573. }
  574.  
  575. function markred(jNode, day) {
  576.   $(jNode).find("a")[0].innerHTML = $(jNode).find("a")[0].innerHTML + ' <img src="' + mred + '" title="Пользователь найден в списке ЕРКЮ" /> ' + day;
  577.   cNode = jNode.nextSibling;
  578.   $(cNode).css({
  579.     "background": "rgba(250,100,100,0.3)",
  580.     "border-left": "3px solid rgba(250,100,100,0.3)",
  581.     "padding-left": "3px"
  582.   });
  583.   //вносим бота в массив для проставления дизлайков(старый классический дизайн ютуба)
  584.   requestDislike(jNode, false);
  585. }
  586.  
  587. function markredMob(jNode, day) {
  588.   $(jNode).find("a")[0].innerHTML = $(jNode).find("a")[0].innerHTML + ' <img src="' + mred + '" title="Пользователь найден в списке ЕРКЮ" /> ' + day;
  589.   cNode = $(jNode).find("div.tpb")[0];
  590.   $(cNode).css({
  591.     "background": "rgba(250,100,100,0.3)",
  592.     "border-left": "3px solid rgba(250,100,100,0.3)",
  593.     "padding-left": "3px"
  594.   });
  595. }
  596.  
  597. function markredNew(jNode, day) {
  598.   var aNode = $(jNode).find("#author-text")[0];
  599.   var cNode = $(jNode).parent().find("#content-text")[0];
  600.   var newspanN = document.createElement('span');
  601.   newspanN.id = 'botmark';
  602.   newspanN.innerHTML = '<img src="' + mred + '" title="Пользователь найден в списке ЕРКЮ" /> ' + day;
  603.   $(aNode).append(newspanN);
  604.   var checkBadge = $(aNode).parent().find('span#author-comment-badge')[0];
  605.   if($(checkBadge).length > 0) {
  606.     $(checkBadge).attr('hidden', '');
  607.     $(aNode).removeAttr('hidden');
  608.   }
  609.   $(cNode).parent().css({
  610.     "background": "rgba(250,100,100,0.3)",
  611.     "border-left": "3px solid rgba(250,100,100,0.3)",
  612.     "padding-left": "3px"
  613.   });
  614.   //вносим бота в массив для проставления дизлайков(новый дизайн ютуба)
  615.   requestDislike(jNode, true);
  616. }
  617.  
  618. function Dparse(day) {
  619.   day = day.replace(/Joined |Дата регистрации: |Ви приєдналися /i, '');
  620.   day = day.replace(/ янв. | января | січ. /i, ' Jan, ');
  621.   day = day.replace(/ февр. | февраля | лют. /i, ' Feb, ');
  622.   day = day.replace(/ мар. | марта | бер. /i, ' Mar, ');
  623.   day = day.replace(/ апр. | апреля | квіт. /i, ' Apr, ');
  624.   day = day.replace(/ мая. | мая | трав. /i, ' May, ');
  625.   day = day.replace(/ июн. | июня | черв./i, ' Jun, ');
  626.   day = day.replace(/ июл. | июля | лип. /i, ' Jul, ');
  627.   day = day.replace(/ авг. | августа | серп. /i, ' Aug, ');
  628.   day = day.replace(/ сент. | сентября | вер. /i, ' Sep, ');
  629.   day = day.replace(/ окт. | октября | жовт. /i, ' Oct, ');
  630.   day = day.replace(/ нояб. | ноября | лист. /i, ' Nov, ');
  631.   day = day.replace(/ дек. | декабря | груд. /i, ' Dec, ');
  632.   day = day.replace(/ г.| р./i, '');
  633.   return day;
  634. }
  635.  
  636. function currentlang() {
  637.   return regexlang.exec(document.body.innerHTML)[1];
  638. }
  639.  
  640. function currentlangmob() {
  641.   return regexlangmob.exec(document.body.innerHTML)[1];
  642. }
  643.  
  644. function getURLParameter(name, link) {
  645.   return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(link) || [null, ''])[1].replace(/\+/g, '%20')) || null;
  646. }
  647.  
  648. function waitForKeyElements(selectorTxt, actionFunction, bWaitOnce, iframeSelector) {
  649.   var targetNodes, btargetsFound;
  650.   if(typeof iframeSelector == "undefined") targetNodes = $(selectorTxt);
  651.   else targetNodes = $(iframeSelector).contents().find(selectorTxt);
  652.   if(targetNodes && targetNodes.length > 0) {
  653.     btargetsFound = true;
  654.     targetNodes.each(function() {
  655.       var jThis = $(this);
  656.       var alreadyFound = jThis.data('alreadyFound') || false;
  657.       if(!alreadyFound) {
  658.         var cancelFound = actionFunction(jThis);
  659.         if(cancelFound) btargetsFound = false;
  660.         else jThis.data('alreadyFound', true);
  661.       }
  662.     });
  663.   } else {
  664.     btargetsFound = false;
  665.   }
  666.   var controlObj = waitForKeyElements.controlObj || {};
  667.   var controlKey = selectorTxt.replace(/[^\w]/g, "_");
  668.   var timeControl = controlObj[controlKey];
  669.   if(btargetsFound && bWaitOnce && timeControl) {
  670.     clearInterval(timeControl);
  671.     delete controlObj[controlKey];
  672.   } else {
  673.     if(!timeControl) {
  674.       timeControl = setInterval(function() {
  675.         waitForKeyElements(selectorTxt, actionFunction, bWaitOnce, iframeSelector);
  676.       }, 300);
  677.       controlObj[controlKey] = timeControl;
  678.     }
  679.   }
  680.   waitForKeyElements.controlObj = controlObj;
  681. }
  682.  
  683. //функция заносит найденные записи ботов в массив для последующего проставления дизлайков
  684. //by h010c
  685. function requestDislike(jNode, isNew) {
  686.   var botDislike;
  687.   if (isNew) {
  688.     botDislike = $(jNode).parent().find("#dislike-button:not(.style-default-active)")[0];   //Дизлайк на новом дизайне ютуба
  689.   } else {
  690.     botDislike = $(jNode).parent().find("button.sprite-dislike[aria-checked='false']")[0];  //Дизлайк на старом дизайне ютуба
  691.   }
  692.   //вносим дизлайк в массив
  693.   if (botDislike) orderedClicksArray.push(botDislike);
  694.  
  695.   //запускаем задачу проставления дизлайков, если она еще не запущена
  696.   if (bClickTaskSet == 0) {
  697.     bClickTaskSet = 1;
  698.     scheduledDislike();
  699.   }
  700. }
  701.  
  702. //функция кликает по дизлайкам через случайные промежутки времени
  703. //by h010c
  704. function scheduledDislike() {
  705.   if (orderedClicksArray.length) {
  706.     //извлекаем первый элемент массива, удаляем пустую первую ячейку, кликаем
  707.     var element = orderedClicksArray.shift();
  708.     if (element.getAttribute("aria-checked") == "false" || !(element.classList.contains("style-default-active"))) {
  709.       $(element).css({"background": "rgba(250,100,100,0.3)"});
  710.       element.click();
  711.     }
  712.  
  713.     //перезапускаем функцию через случайный промежуток времени
  714.     setTimeout(scheduledDislike, minDislikeClickTime + Math.random() * (maxDislikeClickTime - minDislikeClickTime));
  715.   } else {
  716.     bClickTaskSet = 0;
  717.   }
  718. }
Add Comment
Please, Sign In to add comment